From 82da8a484df068ef0840c5b891dc8056162c381c Mon Sep 17 00:00:00 2001 From: korenkonder Date: Mon, 13 Jun 2022 02:18:05 +0300 Subject: [PATCH] Temp commit. Need to store all sh... Changes --- src/CLOUD/classes.c | 58 +- src/CLOUD/classes.h | 22 +- src/CLOUD/classes/data_test.c | 6 +- src/CLOUD/classes/data_test/auth_3d_test.c | 671 --- src/CLOUD/classes/data_test/auth_3d_test.cpp | 491 ++ .../{auth_3d_test.h => auth_3d_test.hpp} | 2 +- .../{glitter_test.c => glitter_test.cpp} | 20 +- .../{glitter_test.h => glitter_test.hpp} | 2 +- .../{stage_test.c => stage_test.cpp} | 16 +- .../{stage_test.h => stage_test.hpp} | 2 +- src/CLOUD/classes/data_view/auth_3d.h | 2 +- src/CLOUD/classes/data_view/draw_task.h | 2 +- src/CLOUD/classes/data_view/glitter.h | 2 +- src/CLOUD/classes/data_view/object.h | 2 +- src/CLOUD/classes/data_view/texture.h | 2 +- src/CLOUD/classes/glitter_editor.c | 143 +- src/CLOUD/classes/glitter_editor.h | 2 +- src/CLOUD/classes/graphics/background_color.c | 15 +- src/CLOUD/classes/graphics/background_color.h | 2 +- src/CLOUD/classes/graphics/glitter.h | 2 +- src/CLOUD/classes/graphics/post_process.c | 57 +- src/CLOUD/classes/graphics/post_process.h | 2 +- src/CLOUD/classes/graphics/render_settings.h | 2 +- src/CLOUD/classes/imgui_helper.c | 22 +- src/CLOUD/classes/imgui_helper.h | 14 +- src/CLOUD/classes/information/frame_speed.h | 2 +- src/CLOUD/classes/information/task.c | 28 +- src/CLOUD/classes/information/task.h | 2 +- src/CLOUD/input.cpp | 2 +- src/CLOUD/main.c | 38 +- src/CLOUD/main.h | 2 +- src/CLOUD/pv_game.cpp | 1937 +++++++ src/CLOUD/pv_game.hpp | 351 ++ src/CLOUD/render.c | 104 +- src/CLOUD/render.h | 3 +- src/CLOUD/unedat.c | 51 +- src/CLOUD/unedat.h | 8 +- src/CLOUD/x_pv_game.cpp | 795 ++- src/CLOUD/x_pv_game.hpp | 65 +- src/CRE/Glitter/curve.cpp | 257 + src/CRE/Glitter/effect_group.cpp | 4 +- src/CRE/Glitter/effect_inst.cpp | 39 +- src/CRE/Glitter/file_reader.cpp | 308 +- src/CRE/Glitter/glitter.hpp | 12 +- src/CRE/Glitter/render_scene.cpp | 41 +- src/CRE/auth_3d.cpp | 487 +- src/CRE/auth_3d.hpp | 62 +- src/CRE/camera.h | 6 +- src/CRE/data.cpp | 89 +- src/CRE/data.hpp | 13 +- src/CRE/draw_object.c | 144 +- src/CRE/draw_object.h | 7 +- src/CRE/draw_pass.c | 249 +- src/CRE/draw_pass.h | 6 +- src/CRE/draw_primitive.h | 7 +- src/CRE/draw_task.c | 12 +- src/CRE/draw_task.h | 6 +- src/CRE/file_handler.cpp | 76 +- src/CRE/file_handler.hpp | 25 +- src/CRE/frame_rate_control.hpp | 2 +- src/CRE/gl_state.h | 2 +- src/CRE/item_table.cpp | 7 +- src/CRE/item_table.hpp | 2 +- src/CRE/light_param.cpp | 2 +- src/CRE/light_param.hpp | 5 +- src/CRE/light_param/{face.c => face.cpp} | 12 +- src/CRE/light_param/{face.h => face.hpp} | 7 +- src/CRE/light_param/{fog.c => fog.cpp} | 34 +- src/CRE/light_param/{fog.h => fog.hpp} | 7 +- src/CRE/light_param/{light.c => light.cpp} | 194 +- src/CRE/light_param/{light.h => light.hpp} | 12 +- src/CRE/light_param/wind.hpp | 6 +- src/CRE/lock.h | 2 +- src/CRE/object.cpp | 24 +- src/CRE/object.hpp | 6 +- src/CRE/post_process.cpp | 150 +- src/CRE/post_process.hpp | 16 +- src/CRE/post_process/{aa.c => aa.cpp} | 93 +- src/CRE/post_process/aa.h | 24 - src/CRE/post_process/aa.hpp | 25 + src/CRE/post_process/blur.c | 337 -- src/CRE/post_process/blur.cpp | 325 ++ src/CRE/post_process/blur.h | 42 - src/CRE/post_process/blur.hpp | 42 + src/CRE/post_process/dof.cpp | 381 +- src/CRE/post_process/dof.hpp | 5 +- src/CRE/post_process/exposure.c | 207 - src/CRE/post_process/exposure.cpp | 235 + src/CRE/post_process/exposure.h | 26 - src/CRE/post_process/exposure.hpp | 35 + src/CRE/post_process/tone_map.c | 436 -- src/CRE/post_process/tone_map.cpp | 429 ++ src/CRE/post_process/tone_map.h | 101 - src/CRE/post_process/tone_map.hpp | 103 + src/CRE/pv_db.cpp | 2033 +++++++ src/CRE/pv_db.hpp | 518 ++ src/CRE/{pv_param_task.cpp => pv_param.cpp} | 111 +- src/CRE/pv_param.hpp | 204 + src/CRE/pv_param_task.hpp | 202 - src/CRE/random.hpp | 2 +- src/CRE/render_context.cpp | 64 +- src/CRE/render_context.hpp | 21 +- src/CRE/render_texture.c | 19 +- src/CRE/render_texture.h | 2 +- src/CRE/rob.cpp | 1007 ++-- src/CRE/rob.hpp | 47 +- src/CRE/shader.c | 1807 +++--- src/CRE/shader.h | 457 +- src/CRE/shader_ft.c | 56 +- src/CRE/shader_ft.h | 2 +- src/CRE/{shader_glsl.c => shader_glsl.cpp} | 308 +- src/CRE/shader_glsl.h | 287 - src/CRE/shader_glsl.hpp | 77 + src/CRE/shared.h | 6 +- src/CRE/stage.cpp | 16 +- src/CRE/stage.hpp | 6 +- src/CRE/stage_modern.cpp | 10 +- src/CRE/stage_modern.hpp | 4 +- src/CRE/static_var.h | 8 +- src/CRE/task.cpp | 756 +-- src/CRE/task.hpp | 140 +- src/CRE/texture.cpp | 2 +- src/CRE/texture.hpp | 4 +- src/CRE/time.h | 2 +- src/CRE/timer.h | 2 +- src/DivaGL/DivaGL.vcxproj | 26 +- src/DivaGL/{bone_data.c => bone_data.cpp} | 836 ++- src/DivaGL/{bone_data.h => bone_data.hpp} | 3150 ++++++----- src/DivaGL/{dllmain.c => dllmain.cpp} | 8 +- src/DivaGL/{gl.c => gl.cpp} | 2 +- src/DivaGL/{gl.h => gl.hpp} | 6 +- src/DivaGL/{inject.c => inject.cpp} | 46 +- src/DivaGL/{inject.h => inject.hpp} | 2 +- src/DivaGL/{print.c => print.cpp} | 2 +- src/DivaGL/{print.h => print.hpp} | 2 +- .../{shader_table.c => shader_table.cpp} | 81 +- .../{shader_table.h => shader_table.hpp} | 3 +- src/{KKdLib/string.c => DivaGL/string.cpp} | 4 +- src/{KKdLib/string.h => DivaGL/string.hpp} | 4 +- src/{KKdLib/vector.c => DivaGL/vector.cpp} | 2 +- src/{KKdLib/vector.h => DivaGL/vector.hpp} | 2 +- src/KKdLib/a3da.cpp | 2648 ++++----- src/KKdLib/a3da.hpp | 8 +- src/KKdLib/{aes.c => aes.cpp} | 2 +- src/KKdLib/{aes.h => aes.hpp} | 2 +- src/KKdLib/{aet.c => aet.cpp} | 2 +- src/KKdLib/{aet.h => aet.hpp} | 6 +- src/KKdLib/database/{aet.c => aet.cpp} | 2 +- src/KKdLib/database/{sprite.h => aet.hpp} | 2 +- src/KKdLib/database/auth_3d.cpp | 215 +- src/KKdLib/database/auth_3d.hpp | 4 +- src/KKdLib/database/bone.cpp | 900 ++- src/KKdLib/database/bone.hpp | 4 +- src/KKdLib/database/item_table.cpp | 895 ++- src/KKdLib/database/item_table.hpp | 7 +- src/KKdLib/database/motion.cpp | 219 +- src/KKdLib/database/motion.hpp | 2 +- src/KKdLib/database/object.cpp | 387 +- src/KKdLib/database/object.hpp | 2 +- src/KKdLib/database/{sprite.c => sprite.cpp} | 2 +- .../database/{string_array.h => sprite.hpp} | 2 +- src/KKdLib/database/stage.cpp | 353 +- src/KKdLib/database/stage.hpp | 3 +- .../{string_array.c => string_array.cpp} | 2 +- .../database/{aet.h => string_array.hpp} | 2 +- src/KKdLib/database/texture.cpp | 211 +- src/KKdLib/database/texture.hpp | 2 +- src/KKdLib/{dds.c => dds.cpp} | 177 +- src/KKdLib/dds.h | 26 - src/KKdLib/dds.hpp | 26 + src/KKdLib/{default.c => default.cpp} | 2 +- src/KKdLib/{default.h => default.hpp} | 2 +- src/KKdLib/deflate.c | 153 - src/KKdLib/deflate.cpp | 155 + src/KKdLib/deflate.h | 19 - src/KKdLib/deflate.hpp | 21 + src/KKdLib/divafile.c | 154 - src/KKdLib/divafile.cpp | 148 + src/KKdLib/divafile.h | 17 - src/KKdLib/divafile.hpp | 19 + src/KKdLib/dsc.cpp | 7 +- src/KKdLib/dsc.hpp | 2 +- src/KKdLib/{enbaya.c => enbaya.cpp} | 2 +- src/KKdLib/{enbaya.h => enbaya.hpp} | 6 +- src/KKdLib/f2/enrs.cpp | 99 +- src/KKdLib/f2/enrs.hpp | 8 +- src/KKdLib/f2/{header.c => header.cpp} | 28 +- src/KKdLib/f2/{header.h => header.hpp} | 10 +- src/KKdLib/f2/pof.cpp | 85 +- src/KKdLib/f2/pof.hpp | 16 +- src/KKdLib/f2/struct.cpp | 148 +- src/KKdLib/f2/struct.hpp | 9 +- src/KKdLib/farc.cpp | 226 +- src/KKdLib/farc.hpp | 4 +- src/KKdLib/{half_t.c => half_t.cpp} | 7 +- src/KKdLib/{half_t.h => half_t.hpp} | 6 +- src/KKdLib/hash.cpp | 12 - src/KKdLib/hash.hpp | 6 +- src/KKdLib/{image.c => image.cpp} | 2 +- src/KKdLib/{image.h => image.hpp} | 4 +- src/KKdLib/interpolation.h | 4 +- src/KKdLib/io/json.cpp | 206 +- src/KKdLib/io/json.hpp | 8 +- src/KKdLib/io/msgpack.cpp | 242 +- src/KKdLib/io/msgpack.hpp | 8 +- src/KKdLib/io/{path.c => path.cpp} | 4 +- src/KKdLib/io/{path.h => path.hpp} | 2 +- src/KKdLib/io/stream.c | 744 --- src/KKdLib/io/stream.cpp | 1107 ++++ src/KKdLib/io/stream.h | 167 - src/KKdLib/io/stream.hpp | 171 + src/KKdLib/key_val.cpp | 942 +++- src/KKdLib/key_val.hpp | 157 +- src/KKdLib/{kf.c => kf.cpp} | 2 +- src/KKdLib/{kf.h => kf.hpp} | 2 +- src/KKdLib/light_param/face.cpp | 84 +- src/KKdLib/light_param/face.hpp | 4 +- src/KKdLib/light_param/fog.cpp | 92 +- src/KKdLib/light_param/fog.hpp | 4 +- src/KKdLib/light_param/glow.cpp | 112 +- src/KKdLib/light_param/glow.hpp | 4 +- src/KKdLib/light_param/ibl.cpp | 31 +- src/KKdLib/light_param/ibl.hpp | 8 +- src/KKdLib/light_param/light.cpp | 128 +- src/KKdLib/light_param/light.hpp | 4 +- src/KKdLib/light_param/wind.cpp | 84 +- src/KKdLib/light_param/wind.hpp | 4 +- src/KKdLib/{mat.c => mat.cpp} | 9 +- src/KKdLib/{mat.h => mat.hpp} | 11 +- src/KKdLib/mot.cpp | 647 ++- src/KKdLib/mot.hpp | 7 +- src/KKdLib/msgpack.cpp | 84 +- src/KKdLib/msgpack.hpp | 15 +- src/KKdLib/obj.cpp | 4929 ++++++++--------- src/KKdLib/obj.hpp | 34 +- src/KKdLib/pv_db.hpp | 2 +- src/KKdLib/pv_exp.cpp | 93 +- src/KKdLib/pv_exp.hpp | 2 +- src/KKdLib/pvpp.cpp | 253 +- src/KKdLib/pvpp.hpp | 4 +- src/KKdLib/pvsr.cpp | 307 +- src/KKdLib/pvsr.hpp | 2 +- src/KKdLib/{quat.c => quat.cpp} | 2 +- src/KKdLib/{quat.h => quat.hpp} | 4 +- src/KKdLib/quat_trans.h | 6 +- src/KKdLib/sort.cpp | 30 +- src/KKdLib/sort.hpp | 5 +- src/KKdLib/sound/{diva.c => diva.cpp} | 62 +- src/KKdLib/sound/{diva.h => diva.hpp} | 2 +- src/KKdLib/sound/{vag.c => vag.cpp} | 112 +- src/KKdLib/sound/{vag.h => vag.hpp} | 2 +- src/KKdLib/sound/{wav.c => wav.cpp} | 125 +- src/KKdLib/sound/{wav.h => wav.hpp} | 2 +- src/KKdLib/{str_utils.c => str_utils.cpp} | 62 +- src/KKdLib/{str_utils.h => str_utils.hpp} | 18 +- src/KKdLib/txp.cpp | 107 +- src/KKdLib/txp.hpp | 8 +- src/KKdLib/{types.h => types.hpp} | 0 src/KKdLib/{vec.c => vec.cpp} | 17 +- src/KKdLib/{vec.h => vec.hpp} | 18 +- src/MMPlusDec/MMPlusDec.cpp | 80 +- 261 files changed, 23706 insertions(+), 17661 deletions(-) delete mode 100644 src/CLOUD/classes/data_test/auth_3d_test.c create mode 100644 src/CLOUD/classes/data_test/auth_3d_test.cpp rename src/CLOUD/classes/data_test/{auth_3d_test.h => auth_3d_test.hpp} (92%) rename src/CLOUD/classes/data_test/{glitter_test.c => glitter_test.cpp} (95%) rename src/CLOUD/classes/data_test/{glitter_test.h => glitter_test.hpp} (90%) rename src/CLOUD/classes/data_test/{stage_test.c => stage_test.cpp} (97%) rename src/CLOUD/classes/data_test/{stage_test.h => stage_test.hpp} (92%) create mode 100644 src/CLOUD/pv_game.cpp create mode 100644 src/CLOUD/pv_game.hpp rename src/CRE/light_param/{face.c => face.cpp} (81%) rename src/CRE/light_param/{face.h => face.hpp} (87%) rename src/CRE/light_param/{fog.c => fog.cpp} (69%) rename src/CRE/light_param/{fog.h => fog.hpp} (90%) rename src/CRE/light_param/{light.c => light.cpp} (68%) rename src/CRE/light_param/{light.h => light.hpp} (96%) rename src/CRE/post_process/{aa.c => aa.cpp} (80%) delete mode 100644 src/CRE/post_process/aa.h create mode 100644 src/CRE/post_process/aa.hpp delete mode 100644 src/CRE/post_process/blur.c create mode 100644 src/CRE/post_process/blur.cpp delete mode 100644 src/CRE/post_process/blur.h create mode 100644 src/CRE/post_process/blur.hpp delete mode 100644 src/CRE/post_process/exposure.c create mode 100644 src/CRE/post_process/exposure.cpp delete mode 100644 src/CRE/post_process/exposure.h create mode 100644 src/CRE/post_process/exposure.hpp delete mode 100644 src/CRE/post_process/tone_map.c create mode 100644 src/CRE/post_process/tone_map.cpp delete mode 100644 src/CRE/post_process/tone_map.h create mode 100644 src/CRE/post_process/tone_map.hpp create mode 100644 src/CRE/pv_db.cpp create mode 100644 src/CRE/pv_db.hpp rename src/CRE/{pv_param_task.cpp => pv_param.cpp} (83%) create mode 100644 src/CRE/pv_param.hpp delete mode 100644 src/CRE/pv_param_task.hpp rename src/CRE/{shader_glsl.c => shader_glsl.cpp} (50%) delete mode 100644 src/CRE/shader_glsl.h create mode 100644 src/CRE/shader_glsl.hpp rename src/DivaGL/{bone_data.c => bone_data.cpp} (88%) rename src/DivaGL/{bone_data.h => bone_data.hpp} (54%) rename src/DivaGL/{dllmain.c => dllmain.cpp} (89%) rename src/DivaGL/{gl.c => gl.cpp} (99%) rename src/DivaGL/{gl.h => gl.hpp} (94%) rename src/DivaGL/{inject.c => inject.cpp} (74%) rename src/DivaGL/{inject.h => inject.hpp} (93%) rename src/DivaGL/{print.c => print.cpp} (94%) rename src/DivaGL/{print.h => print.hpp} (83%) rename src/DivaGL/{shader_table.c => shader_table.cpp} (79%) rename src/DivaGL/{shader_table.h => shader_table.hpp} (99%) rename src/{KKdLib/string.c => DivaGL/string.cpp} (99%) rename src/{KKdLib/string.h => DivaGL/string.hpp} (97%) rename src/{KKdLib/vector.c => DivaGL/vector.cpp} (97%) rename src/{KKdLib/vector.h => DivaGL/vector.hpp} (99%) rename src/KKdLib/{aes.c => aes.cpp} (99%) rename src/KKdLib/{aes.h => aes.hpp} (99%) rename src/KKdLib/{aet.c => aet.cpp} (75%) rename src/KKdLib/{aet.h => aet.hpp} (99%) rename src/KKdLib/database/{aet.c => aet.cpp} (75%) rename src/KKdLib/database/{sprite.h => aet.hpp} (73%) rename src/KKdLib/database/{sprite.c => sprite.cpp} (72%) rename src/KKdLib/database/{string_array.h => sprite.hpp} (73%) rename src/KKdLib/database/{string_array.c => string_array.cpp} (67%) rename src/KKdLib/database/{aet.h => string_array.hpp} (73%) rename src/KKdLib/{dds.c => dds.cpp} (77%) delete mode 100644 src/KKdLib/dds.h create mode 100644 src/KKdLib/dds.hpp rename src/KKdLib/{default.c => default.cpp} (99%) rename src/KKdLib/{default.h => default.hpp} (99%) delete mode 100644 src/KKdLib/deflate.c create mode 100644 src/KKdLib/deflate.cpp delete mode 100644 src/KKdLib/deflate.h create mode 100644 src/KKdLib/deflate.hpp delete mode 100644 src/KKdLib/divafile.c create mode 100644 src/KKdLib/divafile.cpp delete mode 100644 src/KKdLib/divafile.h create mode 100644 src/KKdLib/divafile.hpp rename src/KKdLib/{enbaya.c => enbaya.cpp} (99%) rename src/KKdLib/{enbaya.h => enbaya.hpp} (98%) rename src/KKdLib/f2/{header.c => header.cpp} (62%) rename src/KKdLib/f2/{header.h => header.hpp} (79%) rename src/KKdLib/{half_t.c => half_t.cpp} (95%) rename src/KKdLib/{half_t.h => half_t.hpp} (90%) rename src/KKdLib/{image.c => image.cpp} (99%) rename src/KKdLib/{image.h => image.hpp} (95%) rename src/KKdLib/io/{path.c => path.cpp} (99%) rename src/KKdLib/io/{path.h => path.hpp} (97%) delete mode 100644 src/KKdLib/io/stream.c create mode 100644 src/KKdLib/io/stream.cpp delete mode 100644 src/KKdLib/io/stream.h create mode 100644 src/KKdLib/io/stream.hpp rename src/KKdLib/{kf.c => kf.cpp} (99%) rename src/KKdLib/{kf.h => kf.hpp} (96%) rename src/KKdLib/{mat.c => mat.cpp} (99%) rename src/KKdLib/{mat.h => mat.hpp} (98%) rename src/KKdLib/{quat.c => quat.cpp} (99%) rename src/KKdLib/{quat.h => quat.hpp} (93%) rename src/KKdLib/sound/{diva.c => diva.cpp} (83%) rename src/KKdLib/sound/{diva.h => diva.hpp} (95%) rename src/KKdLib/sound/{vag.c => vag.cpp} (90%) rename src/KKdLib/sound/{vag.h => vag.hpp} (96%) rename src/KKdLib/sound/{wav.c => wav.cpp} (67%) rename src/KKdLib/sound/{wav.h => wav.hpp} (96%) rename src/KKdLib/{str_utils.c => str_utils.cpp} (92%) rename src/KKdLib/{str_utils.h => str_utils.hpp} (90%) rename src/KKdLib/{types.h => types.hpp} (100%) rename src/KKdLib/{vec.c => vec.cpp} (82%) rename src/KKdLib/{vec.h => vec.hpp} (99%) diff --git a/src/CLOUD/classes.c b/src/CLOUD/classes.c index 5136bce1..7b93de86 100644 --- a/src/CLOUD/classes.c +++ b/src/CLOUD/classes.c @@ -9,37 +9,39 @@ bool data_test_shared_lock; extern bool input_locked; -static void TaskWindow_do_disp(TaskWindow* t); +namespace app { + static void TaskWindow_do_disp(TaskWindow* t); -TaskWindow::TaskWindow() : show_window(), window_focus() { + TaskWindow::TaskWindow() : show_window(), window_focus() { -} + } -TaskWindow::~TaskWindow() { + TaskWindow::~TaskWindow() { -} + } -void TaskWindow::Window() { - if (!show_window) - return; -} + void TaskWindow::Window() { + if (!show_window) + return; + } -void TaskWork_Window() { - task_work->disp = true; - for (int32_t i = 0; i < 3; i++) - for (Task*& j : task_work->tasks) { - Task* tsk = j; - TaskWindow* tsk_w = dynamic_cast(tsk); - if (tsk_w && tsk_w->priority == i) - TaskWindow_do_disp(tsk_w); - } - task_work->disp = false; -} + void TaskWork_Window() { + task_work->disp = true; + for (int32_t i = 0; i < 3; i++) + for (Task*& j : task_work->tasks) { + Task* tsk = j; + TaskWindow* tsk_w = dynamic_cast(tsk); + if (tsk_w && tsk_w->priority == i) + TaskWindow_do_disp(tsk_w); + } + task_work->disp = false; + } -static void TaskWindow_do_disp(TaskWindow* t) { - if ((t->field_1C == 1 || t->field_1C == 2) - && t->field_18 != TASK_INIT && t->field_18 != TASK_DEST) - t->Window(); + static void TaskWindow_do_disp(TaskWindow* t) { + if ((t->field_1C == 1 || t->field_1C == 2) + && t->field_18 != Task::Enum::Init && t->field_18 != Task::Enum::Dest) + t->Window(); + } } void classes_process_init(classes_data* classes, const size_t classes_count, render_context* rctx) { @@ -202,11 +204,11 @@ void classes_process_input(classes_data* classes, const size_t classes_count) { classes_process_input(c->sub_classes, c->sub_classes_count); } - if (task_work) + if (app::task_work) for (int32_t i = 0; i < 3; i++) - for (Task*& j : task_work->tasks) { - Task* tsk = j; - TaskWindow* tsk_w = dynamic_cast(tsk); + for (app::Task*& j : app::task_work->tasks) { + app::Task* tsk = j; + app::TaskWindow* tsk_w = dynamic_cast(tsk); if (tsk_w && tsk_w->priority == i) input_locked |= tsk_w->window_focus; } diff --git a/src/CLOUD/classes.h b/src/CLOUD/classes.h index c8986cdb..9889dd4c 100644 --- a/src/CLOUD/classes.h +++ b/src/CLOUD/classes.h @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "../CRE/lock.h" #include "../CRE/render_context.hpp" #include "../CRE/task.hpp" @@ -13,17 +13,19 @@ #define CLASS_DATA_NO_DATA (0) #define CLASSES_DATA_NO_FUNC (0) -class TaskWindow : public Task { -public: - bool show_window; - bool window_focus; +namespace app { + class TaskWindow : public Task { + public: + bool show_window; + bool window_focus; - TaskWindow(); - ~TaskWindow(); - virtual void Window() = 0; -}; + TaskWindow(); + ~TaskWindow(); + virtual void Window() = 0; + }; -extern void TaskWork_Window(); + extern void TaskWork_Window(); +} enum class_flags { CLASS_INIT = 0x01, diff --git a/src/CLOUD/classes/data_test.c b/src/CLOUD/classes/data_test.c index 3962d1e8..e3087809 100644 --- a/src/CLOUD/classes/data_test.c +++ b/src/CLOUD/classes/data_test.c @@ -4,9 +4,9 @@ */ #include "data_test.h" -#include "data_test/auth_3d_test.h" -#include "data_test/glitter_test.h" -#include "data_test/stage_test.h" +#include "data_test/auth_3d_test.hpp" +#include "data_test/glitter_test.hpp" +#include "data_test/stage_test.hpp" classes_data data_test_classes[] = { { diff --git a/src/CLOUD/classes/data_test/auth_3d_test.c b/src/CLOUD/classes/data_test/auth_3d_test.c deleted file mode 100644 index 54bc3ea4..00000000 --- a/src/CLOUD/classes/data_test/auth_3d_test.c +++ /dev/null @@ -1,671 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "auth_3d_test.h" -#include "../../../KKdLib/io/path.h" -#include "../../../KKdLib/hash.hpp" -#include "../../../KKdLib/sort.hpp" -#include "../../../KKdLib/str_utils.h" -#include "../../../KKdLib/vector.h" -#include "../../../CRE/data.hpp" -#include "../../../CRE/render_context.hpp" -#include "../../../CRE/stage.hpp" -#include "../../input.hpp" -#include "../imgui_helper.h" - -struct data_test_auth_3d_test_uid { - const char* name; - uint32_t uid; -}; - -vector_old(data_test_auth_3d_test_uid) - -struct data_test_auth_3d_test_category { - const char* name; - int32_t index; - vector_old_data_test_auth_3d_test_uid uid; -}; - -vector_old(data_test_auth_3d_test_category) - -struct data_test_auth_3d_test { - int32_t auth_3d_category_index; - int32_t auth_3d_category_index_prev; - int32_t auth_3d_index; - int32_t stage_index; - - int32_t auth_3d_id; - int32_t auth_3d_uid; - bool auth_3d_load; - bool auth_3d_load_wait; - bool auth_3d_uid_load; - bool stage_load; - - vec2 a3d_stage_window_pos; - - render_context* rctx; - - bool enable; - bool repeat; - bool left_right_reverse; - float_t frame; - bool frame_changed; - float_t last_frame; - bool paused; - float_t trans_x; - float_t trans_z; - float_t rot_y; - vector_old_uint32_t obj_set_id; - - vector_old_ptr_char stage; - vector_old_data_test_auth_3d_test_category category; -}; - -vector_old_func(data_test_auth_3d_test_category) -vector_old_func(data_test_auth_3d_test_uid) - -extern int32_t width; -extern int32_t height; -extern float_t frame_speed; - -static const char* data_test_auth_3d_test_window_title = "Auth 3D Test##Data Test"; - -static void data_test_auth_3d_test_category_free(data_test_auth_3d_test_category* cat); -static void data_test_auth_3d_test_load_auth_file(data_test_auth_3d_test* auth_3d_test); -static int data_test_auth_3d_test_uid_quicksort_compare_func(void const* src1, void const* src2); - -bool data_test_auth_3d_test_init(class_data* data, render_context* rctx) { - data->data = force_malloc_s(data_test_auth_3d_test, 1); - - data_test_auth_3d_test* auth_3d_test = (data_test_auth_3d_test*)data->data; - if (auth_3d_test) { - auth_3d_database* auth_3d_db = &rctx->data->data_ft.auth_3d_db; - std::vector& auth_3d_db_cat = auth_3d_db->category; - auth_3d_database_uid* uids = auth_3d_db->uid.data(); - - auth_3d_test->category = vector_old_empty(data_test_auth_3d_test_category); - vector_old_data_test_auth_3d_test_category_reserve(&auth_3d_test->category, auth_3d_db_cat.size()); - for (auth_3d_database_category& i : auth_3d_db_cat) { - data_test_auth_3d_test_category* cat - = vector_old_data_test_auth_3d_test_category_reserve_back(&auth_3d_test->category); - cat->name = i.name.c_str(); - cat->index = -1; - cat->uid = vector_old_empty(data_test_auth_3d_test_uid); - - vector_old_data_test_auth_3d_test_uid_reserve(&cat->uid, i.uid.size()); - for (int32_t& j : i.uid) { - if (!uids[j].enabled) - continue; - - data_test_auth_3d_test_uid uid; - uid.name = uids[j].name.c_str(); - uid.uid = uids[j].org_uid; - vector_old_data_test_auth_3d_test_uid_push_back(&cat->uid, &uid); - } - - if (vector_old_length(cat->uid)) { - quicksort_custom(cat->uid.begin, vector_old_length(cat->uid), - sizeof(data_test_auth_3d_test_uid), - data_test_auth_3d_test_uid_quicksort_compare_func); - cat->index = 0; - } - } - - auth_3d_test->rctx = rctx; - - auth_3d_test->auth_3d_category_index = -1; - auth_3d_test->auth_3d_category_index_prev = -1; - auth_3d_test->auth_3d_index = -1; - auth_3d_test->stage_index = 0; - - auth_3d_test->auth_3d_id = -1; - auth_3d_test->auth_3d_uid = -1; - auth_3d_test->auth_3d_load = false; - auth_3d_test->auth_3d_load_wait = false; - auth_3d_test->auth_3d_uid_load = false; - - if (vector_old_length(auth_3d_test->category) > 0) { - data_test_auth_3d_test_category* cat = &auth_3d_test->category.begin[0]; - - if (vector_old_length(cat->uid)) { - auth_3d_test->auth_3d_load = true; - auth_3d_test->auth_3d_load_wait = true; - auth_3d_test->auth_3d_uid_load = true; - auth_3d_test->auth_3d_uid = cat->uid.begin[0].uid; - } - - auth_3d_test->auth_3d_category_index = 0; - auth_3d_test->auth_3d_category_index_prev = 0; - auth_3d_test->auth_3d_index = cat->index; - } - - stage_database* aft_stage_data = &rctx->data->data_ft.stage_data; - - auth_3d_test->stage = vector_old_ptr_empty(char); - vector_old_ptr_char_reserve(&auth_3d_test->stage, aft_stage_data->stage_data.size()); - for (stage_data& i : aft_stage_data->stage_data) - *vector_old_ptr_char_reserve_back(&auth_3d_test->stage) = (char*)i.name.c_str(); - - auth_3d_test->a3d_stage_window_pos = { 200.0f, 100.0f }; - - auth_3d_test->enable = true; - auth_3d_test->repeat = true; - auth_3d_test->left_right_reverse = false; - auth_3d_test->frame = 0.0f; - auth_3d_test->frame_changed = false; - auth_3d_test->last_frame = 0.0f; - auth_3d_test->paused = false; - auth_3d_test->trans_x = 0.0f; - auth_3d_test->trans_z = 0.0f; - auth_3d_test->rot_y = 0.0f; - auth_3d_test->obj_set_id = vector_old_empty(uint32_t); - } - return true; -} - -void data_test_auth_3d_test_ctrl(class_data* data) { - data_test_auth_3d_test* auth_3d_test = (data_test_auth_3d_test*)data->data; - if (!auth_3d_test) - return; - - if (auth_3d_test->auth_3d_uid_load && auth_3d_test->auth_3d_id != -1) { - render_context* rctx = auth_3d_test->rctx; - - data_struct* aft_data = rctx->data; - stage_database* aft_stage_data = &aft_data->data_ft.stage_data; - auth_3d_database* aft_auth_3d_db = &aft_data->data_ft.auth_3d_db; - auth_3d_database_uid* uids = aft_auth_3d_db->uid.data(); - const char* uid_name = uids[auth_3d_test->auth_3d_uid].name.c_str(); - - uint32_t name_hash; - const char* s = 0; - if (s = strchr(uid_name, '_')) - name_hash = hash_murmurhash(uid_name, s - uid_name); - else - name_hash = hash_utf8_murmurhash(uid_name); - - for (stage_data& i : aft_stage_data->stage_data) { - if (name_hash != i.name_hash) - continue; - - int32_t stage_index = (int32_t)(&i - aft_stage_data->stage_data.data()); - if (stage_index != auth_3d_test->stage_index) - auth_3d_test->stage_load = true; - auth_3d_test->stage_index = stage_index; - break; - } - auth_3d_data_unload_id(auth_3d_test->auth_3d_id, auth_3d_test->rctx); - auth_3d_test->auth_3d_id = -1; - } - - if (auth_3d_test->auth_3d_load) { - render_context* rctx = auth_3d_test->rctx; - if (auth_3d_test->auth_3d_category_index_prev != auth_3d_test->auth_3d_category_index) { - data_test_auth_3d_test_category* cat_prev - = &auth_3d_test->category.begin[auth_3d_test->auth_3d_category_index_prev]; - auth_3d_data_unload_category(cat_prev->name); - } - - for (uint32_t* i = auth_3d_test->obj_set_id.begin; i != auth_3d_test->obj_set_id.end; i++) - object_storage_unload_set(*i); - vector_old_uint32_t_clear(&auth_3d_test->obj_set_id, 0); - - data_test_auth_3d_test_category* cat - = &auth_3d_test->category.begin[auth_3d_test->auth_3d_category_index]; - { - data_struct* aft_data = rctx->data; - object_database* obj_db = &aft_data->data_ft.obj_db; - - const char* name_str = cat->name; - size_t name_len = utf8_length(cat->name); - - if (!memcmp(name_str, "ITMPV", 5)) { - uint32_t set_id = obj_db->get_object_set_id(name_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); - } - } - - if (!memcmp(name_str, "EFFCHRPV", 8)) { - uint32_t set_id = obj_db->get_object_set_id(name_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); - } - } - - std::string obj; - for (size_t i = 0; i < name_len && name_len - i >= 8; i++) - if (!memcmp(&name_str[i], "STGPV", 5)) { - 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)) { - obj = std::string(&name_str[i], 10); - break; - } - - 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); - } - - 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); - } - } - - auth_3d_data_load_category(cat->name); - auth_3d_test->auth_3d_category_index_prev = auth_3d_test->auth_3d_category_index; - auth_3d_test->auth_3d_load = false; - auth_3d_test->auth_3d_load_wait = true; - } - - if (auth_3d_test->auth_3d_load_wait) { - bool wait = false; - for (uint32_t* i = auth_3d_test->obj_set_id.begin; i != auth_3d_test->obj_set_id.end; i++) - wait |= object_storage_load_obj_set_check_not_read(*i); - if (wait) - return; - auth_3d_test->auth_3d_load_wait = false; - } - - if (auth_3d_test->auth_3d_uid_load) { - data_test_auth_3d_test_load_auth_file(auth_3d_test); - auth_3d_test->auth_3d_uid_load = false; - } - - if (auth_3d_test->stage_load) { - task_stage_set_stage_index(auth_3d_test->stage_index); - auth_3d_test->stage_load = false; - } -} - -bool data_test_auth_3d_test_hide(class_data* data) { - data_test_auth_3d_test* auth_3d_test = (data_test_auth_3d_test*)data->data; - if (!auth_3d_test) - return true; - - task_stage_unload(); - - for (uint32_t* i = auth_3d_test->obj_set_id.begin; - i != auth_3d_test->obj_set_id.end; i++) - object_storage_unload_set(*i); - vector_old_uint32_t_free(&auth_3d_test->obj_set_id, 0); - - auth_3d_data_unload_id(auth_3d_test->auth_3d_id, auth_3d_test->rctx); - - auth_3d_test->auth_3d_category_index = -1; - auth_3d_test->auth_3d_category_index_prev = -1; - auth_3d_test->auth_3d_index = -1; - auth_3d_test->auth_3d_uid = -1; - - enum_and(data->flags, ~CLASS_HIDE); - enum_or(data->flags, CLASS_HIDDEN); - return true; -} - -void data_test_auth_3d_test_imgui(class_data* data) { - ImGuiIO& io = ImGui::GetIO(); - ImGuiStyle& style = ImGui::GetStyle(); - ImFont* font = ImGui::GetFont(); - - float_t w = min((float_t)width, 280.0f); - float_t h = min((float_t)height, 316.0f); - - ImGui::SetNextWindowPos({ 0, 0 }, ImGuiCond_Appearing); - ImGui::SetNextWindowSize({ w, h }, ImGuiCond_Always); - - ImGuiWindowFlags window_flags = 0; - window_flags |= ImGuiWindowFlags_NoResize; - - data->imgui_focus = false; - bool open = data->flags & CLASS_HIDDEN ? false : true; - bool collapsed = !ImGui::Begin(data_test_auth_3d_test_window_title, &open, window_flags); - if (!open) { - enum_or(data->flags, CLASS_HIDE); - ImGui::End(); - return; - } - else if (collapsed) { - ImGui::End(); - return; - } - - data_test_auth_3d_test* auth_3d_test = (data_test_auth_3d_test*)data->data; - if (!auth_3d_test) { - ImGui::End(); - return; - } - - auth_3d* auth = auth_3d_data_get_auth_3d(auth_3d_test->auth_3d_id); - if (auth) - auth_3d_test->last_frame = auth->play_control.size; - - if (auth_3d_data_check_id_not_empty(&auth_3d_test->auth_3d_id)) { - auth_3d_test->enable = auth_3d_data_get_enable(&auth_3d_test->auth_3d_id); - auth_3d_test->repeat = auth_3d_data_get_repeat(&auth_3d_test->auth_3d_id); - auth_3d_test->left_right_reverse = auth_3d_data_get_left_right_reverse(&auth_3d_test->auth_3d_id); - auth_3d_test->frame = auth_3d_data_get_frame(&auth_3d_test->auth_3d_id); - auth_3d_test->frame_changed = false; - auth_3d_test->paused = auth_3d_data_get_paused(&auth_3d_test->auth_3d_id); - } - - vector_old_data_test_auth_3d_test_category* auth_3d_db_cat = &auth_3d_test->category; - - render_context* rctx = auth_3d_test->rctx; - data_struct* aft_data = rctx->data; - auth_3d_database* aft_auth_3d_db = &aft_data->data_ft.auth_3d_db; - auth_3d_database_uid* uids = aft_auth_3d_db->uid.data(); - - int32_t auth_3d_category_index = auth_3d_test->auth_3d_category_index; - - imguiGetContentRegionAvailSetNextItemWidth(); - if (ImGui::BeginCombo("##Auth 3D Category Index", auth_3d_category_index > -1 - ? auth_3d_db_cat->begin[auth_3d_category_index].name : "", 0)) { - for (data_test_auth_3d_test_category* i = auth_3d_db_cat->begin; i != auth_3d_db_cat->end; i++) { - int32_t auth_3d_category_idx = (int32_t)(i - auth_3d_db_cat->begin); - - ImGui::PushID(i); - if (ImGui::Selectable(i->name, auth_3d_category_index == auth_3d_category_idx) - || imguiItemKeyPressed(GLFW_KEY_ENTER, true) - || (ImGui::IsItemFocused() && auth_3d_category_index != auth_3d_category_idx)) { - auth_3d_test->auth_3d_category_index = -1; - auth_3d_category_index = auth_3d_category_idx; - } - ImGui::PopID(); - - if (auth_3d_category_index == auth_3d_category_idx) - ImGui::SetItemDefaultFocus(); - } - - data->imgui_focus |= true; - ImGui::EndCombo(); - } - - if (auth_3d_category_index != auth_3d_test->auth_3d_category_index) { - data_test_auth_3d_test_category* cat = &auth_3d_db_cat->begin[auth_3d_category_index]; - - if (vector_old_length(cat->uid) > 0) { - auth_3d_test->auth_3d_load = true; - auth_3d_test->auth_3d_uid_load = true; - auth_3d_test->auth_3d_uid = cat->uid.begin[cat->index].uid; - } - else { - auth_3d_test->auth_3d_load = false; - auth_3d_test->auth_3d_uid_load = false; - auth_3d_test->auth_3d_uid = -1; - } - auth_3d_test->auth_3d_category_index = auth_3d_category_index; - auth_3d_test->auth_3d_index = cat->index; - } - - int32_t auth_3d_index = auth_3d_test->auth_3d_index; - - ImGui::Text(" ID "); - - imguiGetContentRegionAvailSetNextItemWidth(); - bool auth_3d_category_found = false; - for (data_test_auth_3d_test_category* i = auth_3d_db_cat->begin; i != auth_3d_db_cat->end; i++) { - if (auth_3d_category_index != i - auth_3d_db_cat->begin) - continue; - - if (ImGui::BeginCombo("##Auth 3D Index", auth_3d_index > -1 - ? i->uid.begin[auth_3d_index].name : "", 0)) { - for (data_test_auth_3d_test_uid* j = i->uid.begin; j != i->uid.end; j++) { - int32_t auth_3d_idx = (int32_t)(j - i->uid.begin); - - ImGui::PushID(j); - if (ImGui::Selectable(j->name, auth_3d_index == auth_3d_idx) - || imguiItemKeyPressed(GLFW_KEY_ENTER, true) - || (ImGui::IsItemFocused() && auth_3d_index != auth_3d_idx)) { - auth_3d_test->auth_3d_index = -1; - auth_3d_index = auth_3d_idx; - } - ImGui::PopID(); - - if (auth_3d_index == auth_3d_idx) - ImGui::SetItemDefaultFocus(); - } - - data->imgui_focus |= true; - ImGui::EndCombo(); - } - - if (auth_3d_index != auth_3d_test->auth_3d_index) { - i->index = auth_3d_index; - auth_3d_test->auth_3d_uid_load = true; - auth_3d_test->auth_3d_uid = i->uid.begin[auth_3d_index].uid; - auth_3d_test->auth_3d_index = auth_3d_index; - } - auth_3d_category_found = true; - break; - } - - if (!auth_3d_category_found && ImGui::BeginCombo("##Auth 3D Index", "", 0)) { - data->imgui_focus |= true; - ImGui::EndCombo(); - } - - float_t frame = auth_3d_test->frame; - ImGui::Text("frame[ 0,%4.0f)", auth_3d_test->last_frame); - - imguiGetContentRegionAvailSetNextItemWidth(); - igSliderFloatButton("##frame slider", &frame, 1.0f, - 0.0f, auth_3d_test->last_frame, "%5.0f", 0); - if (ImGui::IsItemActivated()) - auth_3d_test->paused = true; - - if (ImGui::Button("|<<", { 32.0, 0.0f })) - frame = 0.0f; - ImGui::SameLine(); - if (ImGui::Button(auth_3d_test->paused ? " > " : "||", { 32.0, 0.0f })) - auth_3d_test->paused = auth_3d_test->paused ? false : true; - ImGui::SameLine(); - if (ImGui::Button(">>|", { 32.0, 0.0f })) - frame = auth_3d_test->last_frame; - ImGui::SameLine(); - if (ImGui::Checkbox("repeat", &auth_3d_test->repeat) && auth_3d_test->repeat && auth_3d_test->paused) - auth_3d_test->paused = false; - - if (ImGui::Checkbox("Left Right Reverse", &auth_3d_test->left_right_reverse)) - frame = 0.0f; - - if (frame != auth_3d_test->frame) { - auth_3d_test->frame_changed = true; - auth_3d_test->frame = frame; - } - - imguiColumnSliderFloat("transX", &auth_3d_test->trans_x, 0.1f, -5.0f, 5.0f, "%.2f", 0, true); - imguiColumnSliderFloat("transZ", &auth_3d_test->trans_z, 0.1f, -5.0f, 5.0f, "%.2f", 0, true); - imguiColumnSliderFloat("rotY", &auth_3d_test->rot_y, 1.0f, -360.0f, 360.0f, "%.0f", 0, true); - - if (ImGui::Button("cam reset", { 72.0f, 0.0f }) - && auth_3d_test->rctx && auth_3d_test->rctx->camera) { - camera* cam = auth_3d_test->rctx->camera; - camera_set_fov(cam, 32.2673416137695); - camera_set_roll(cam, 0.0); - vec3 view_point = { 0.0f, 1.0f, 6.0f }; - camera_set_view_point(cam, &view_point); - vec3 interest = { 0.0f, 1.0f, 0.0f }; - camera_set_interest(cam, &interest); - } - - ImGui::Separator(); - - imguiColumnSliderFloat("Frame Speed", &frame_speed, 0.01f, 0.0f, 3.0f, "%.2f", 0, true); - - data->imgui_focus |= ImGui::IsWindowFocused(); - ImGui::End(); - - float_t x = w; - float_t y = 0.0f; - - w = min((float_t)width, auth_3d_test->a3d_stage_window_pos.x); - h = min((float_t)height, auth_3d_test->a3d_stage_window_pos.y); - - ImGui::SetNextWindowPos({ x, y }, ImGuiCond_Appearing); - ImGui::SetNextWindowSize({ w, h }, ImGuiCond_Always); - - window_flags = 0; - window_flags |= ImGuiWindowFlags_NoResize; - window_flags |= ImGuiWindowFlags_NoCollapse; - - if (ImGui::Begin("A3D STAGE", 0, window_flags)) { - stage* stg = task_stage_get_current_stage(); - - if (stg){ - ImGui::Checkbox("stage", &stg->stage_display); - ImGui::Checkbox("stg auth display", &stg->effect_display); - } - else { - bool stage = true; - ImGui::Checkbox("stage", &stage); - bool effects = true; - ImGui::Checkbox("stg auth display", &effects); - } - - int32_t stage_index = auth_3d_test->stage_index; - - imguiGetContentRegionAvailSetNextItemWidth(); - if (ImGui::BeginCombo("##Stage Index", stage_index > -1 - ? auth_3d_test->stage.begin[stage_index] : "", 0)) { - for (char** i = auth_3d_test->stage.begin; i != auth_3d_test->stage.end; i++) { - int32_t stage_idx = (int32_t)(i - auth_3d_test->stage.begin); - - ImGui::PushID(i); - if (ImGui::Selectable(*i, stage_index == stage_idx) - || imguiItemKeyPressed(GLFW_KEY_ENTER, true) - || (ImGui::IsItemFocused() && stage_index != stage_idx)) { - auth_3d_test->stage_index = -1; - stage_index = stage_idx; - } - ImGui::PopID(); - - if (stage_index == stage_idx) - ImGui::SetItemDefaultFocus(); - } - - data->imgui_focus |= ImGui::IsWindowFocused(); - ImGui::EndCombo(); - } - - if (stage_index != auth_3d_test->stage_index) { - auth_3d_test->stage_load = true; - auth_3d_test->stage_index = stage_index; - } - - data->imgui_focus |= ImGui::IsWindowFocused(); - } - - if (auth_3d_data_check_id_not_empty(&auth_3d_test->auth_3d_id)) { - auth_3d_data_set_enable(&auth_3d_test->auth_3d_id, auth_3d_test->enable); - auth_3d_data_set_repeat(&auth_3d_test->auth_3d_id, auth_3d_test->repeat); - auth_3d_data_set_left_right_reverse(&auth_3d_test->auth_3d_id, auth_3d_test->left_right_reverse); - if (auth_3d_test->frame_changed) { - auth_3d_data_set_req_frame(&auth_3d_test->auth_3d_id, auth_3d_test->frame); - auth_3d_test->frame_changed = false; - } - auth_3d_data_set_paused(&auth_3d_test->auth_3d_id, auth_3d_test->paused); - auth_3d_data_set_frame_rate(&auth_3d_test->auth_3d_id, 0); - - mat4 mat; - mat4_translate(auth_3d_test->trans_x, 0.0f, auth_3d_test->trans_z, &mat); - mat4_rotate_y_mult(&mat, auth_3d_test->rot_y * DEG_TO_RAD_FLOAT, &mat); - auth_3d_data_set_mat(&auth_3d_test->auth_3d_id, &mat); - } - ImGui::End(); -} - -bool data_test_auth_3d_test_show(class_data* data) { - data_test_auth_3d_test* auth_3d_test = (data_test_auth_3d_test*)data->data; - if (!auth_3d_test) - return false; - - auth_3d_test->enable = true; - auth_3d_test->repeat = true; - auth_3d_test->left_right_reverse = false; - auth_3d_test->frame = 0.0f; - auth_3d_test->frame_changed = false; - auth_3d_test->last_frame = 0.0f; - auth_3d_test->paused = false; - auth_3d_test->trans_x = 0.0f; - auth_3d_test->trans_z = 0.0f; - auth_3d_test->rot_y = 0.0f; - - task_stage_load("A3D_STAGE"); - task_stage_set_stage_index(auth_3d_test->stage_index); - return true; -} - -bool data_test_auth_3d_test_dispose(class_data* data) { - data_test_auth_3d_test* auth_3d_test = (data_test_auth_3d_test*)data->data; - if (auth_3d_test) { - memset(auth_3d_test->stage.begin, 0, sizeof(char*) * vector_old_length(auth_3d_test->stage)); - - for (uint32_t* i = auth_3d_test->obj_set_id.begin; - i != auth_3d_test->obj_set_id.end; i++) - object_storage_unload_set(*i); - vector_old_uint32_t_free(&auth_3d_test->obj_set_id, 0); - - auth_3d_data_unload_id(auth_3d_test->auth_3d_id, auth_3d_test->rctx); - - vector_old_data_test_auth_3d_test_category_free(&auth_3d_test->category, - data_test_auth_3d_test_category_free); - vector_old_ptr_char_free(&auth_3d_test->stage, 0); - } - free(data->data); - return true; -} - -static void data_test_auth_3d_test_category_free(data_test_auth_3d_test_category* cat) { - vector_old_data_test_auth_3d_test_uid_free(&cat->uid, 0); -} - -static void data_test_auth_3d_test_load_auth_file(data_test_auth_3d_test* auth_3d_test) { - render_context* rctx = auth_3d_test->rctx; - data_struct* aft_data = rctx->data; - auth_3d_database* aft_auth_3d_db = &aft_data->data_ft.auth_3d_db; - object_database* aft_obj_db = &aft_data->data_ft.obj_db; - texture_database* aft_tex_db = &aft_data->data_ft.tex_db; - auth_3d_database_uid* uids = aft_auth_3d_db->uid.data(); - const char* uid_name = uids[auth_3d_test->auth_3d_uid].name.c_str(); - - auth_3d_test->auth_3d_id = auth_3d_data_load_uid(auth_3d_test->auth_3d_uid, aft_auth_3d_db); - if (auth_3d_test->auth_3d_id == -1) - return; - - auth_3d_data_read_file(&auth_3d_test->auth_3d_id, aft_auth_3d_db); - auth_3d_data_set_enable(&auth_3d_test->auth_3d_id, true); - auth_3d_data_set_paused(&auth_3d_test->auth_3d_id, false); - auth_3d_data_set_repeat(&auth_3d_test->auth_3d_id, auth_3d_test->repeat); - auth_3d_data_set_left_right_reverse(&auth_3d_test->auth_3d_id, auth_3d_test->left_right_reverse); - auth_3d_data_set_camera_root_update(&auth_3d_test->auth_3d_id, true); - auth_3d_data_set_req_frame(&auth_3d_test->auth_3d_id, 0.0f); - auth_3d_data_set_max_frame(&auth_3d_test->auth_3d_id, -1.0f); - auth_3d_data_set_visibility(&auth_3d_test->auth_3d_id, true); - - auth_3d_test->enable = true; - auth_3d_test->frame = 0.0f; - auth_3d_test->frame_changed = false; - auth_3d_test->last_frame = auth_3d_data_get_play_control_size(&auth_3d_test->auth_3d_id); - auth_3d_test->paused = false; - auth_3d_test->trans_x = 0.0f; - auth_3d_test->trans_z = 0.0f; - auth_3d_test->rot_y = 0.0f; -} - -static int data_test_auth_3d_test_uid_quicksort_compare_func(void const* src1, void const* src2) { - const char* str1 = ((data_test_auth_3d_test_uid*)src1)->name; - const char* str2 = ((data_test_auth_3d_test_uid*)src2)->name; - return str_utils_compare(str1, str2); -} diff --git a/src/CLOUD/classes/data_test/auth_3d_test.cpp b/src/CLOUD/classes/data_test/auth_3d_test.cpp new file mode 100644 index 00000000..e82e0316 --- /dev/null +++ b/src/CLOUD/classes/data_test/auth_3d_test.cpp @@ -0,0 +1,491 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "auth_3d_test.hpp" +#include "../../../KKdLib/io/path.hpp" +#include "../../../KKdLib/hash.hpp" +#include "../../../KKdLib/sort.hpp" +#include "../../../KKdLib/str_utils.hpp" +#include "../../../CRE/data.hpp" +#include "../../../CRE/render_context.hpp" +#include "../../../CRE/stage.hpp" +#include "../../input.hpp" +#include "../data_test.h" +#include "../imgui_helper.h" + +struct data_test_auth_3d_test_uid { + const char* name; + int32_t uid; + + data_test_auth_3d_test_uid(const char* name, int32_t uid); +}; + +struct data_test_auth_3d_test_category { + const char* name; + int32_t index; + std::vector uid; + + data_test_auth_3d_test_category(); + ~data_test_auth_3d_test_category(); +}; + +class Auth3dTestWindow : public app::TaskWindow { +public: + int32_t auth_3d_category_index; + int32_t auth_3d_category_index_prev; + int32_t auth_3d_index; + + int32_t auth_3d_uid; + bool auth_3d_load; + bool auth_3d_uid_load; + + bool enable; + float_t frame; + bool frame_changed; + float_t last_frame; + bool paused; + + std::vector stage; + std::vector category; + + Auth3dTestWindow(); + virtual ~Auth3dTestWindow() override; + + virtual void Window() override; +}; + +extern int32_t width; +extern int32_t height; +extern float_t frame_speed; +extern render_context* rctx_ptr; +extern vec4u8 clear_color; + +static const char* data_test_auth_3d_test_window_title = "Auth 3D Test##Data Test"; + +static Auth3dTestWindow* auth_3d_test_window; + +static bool auth_3d_load(); +static bool auth_3d_unload(); +static int data_test_auth_3d_test_uid_quicksort_compare_func(void const* src1, void const* src2); + +bool data_test_auth_3d_test_init(class_data* data, render_context* rctx) { + return true; +} + +void data_test_auth_3d_test_ctrl(class_data* data) { + if (app::TaskWork::HasTaskCtrl(&auth_3d_test_task)) { + if (auth_3d_test_window->auth_3d_load) { + std::vector& auth_3d_db_cat = auth_3d_test_window->category; + int32_t auth_3d_category_index = auth_3d_test_window->auth_3d_category_index; + auth_3d_test_task.load_category = auth_3d_db_cat[auth_3d_category_index].name; + auth_3d_test_window->auth_3d_load = false; + } + + if (auth_3d_test_window->auth_3d_uid_load) { + auth_3d_test_task.auth_3d_uid = auth_3d_test_window->auth_3d_uid; + auth_3d_test_window->auth_3d_uid_load = false; + } + } +} + +bool data_test_auth_3d_test_hide(class_data* data) { + auth_3d_test_task.SetDest(); + + enum_and(data->flags, ~CLASS_HIDE); + enum_or(data->flags, CLASS_HIDDEN); + return true; +} + +void data_test_auth_3d_test_imgui(class_data* data) { + ImGuiIO& io = ImGui::GetIO(); + ImGuiStyle& style = ImGui::GetStyle(); + ImFont* font = ImGui::GetFont(); + + float_t w = min((float_t)width, 280.0f); + float_t h = min((float_t)height, 324.0f); + + ImGui::SetNextWindowPos({ 0, 0 }, ImGuiCond_Appearing); + ImGui::SetNextWindowSize({ w, h }, ImGuiCond_Always); + + ImGuiWindowFlags window_flags = 0; + window_flags |= ImGuiWindowFlags_NoResize; + + data->imgui_focus = false; + bool open = data->flags & CLASS_HIDDEN ? false : true; + bool collapsed = !ImGui::Begin(data_test_auth_3d_test_window_title, &open, window_flags); + if (!open) { + enum_or(data->flags, CLASS_HIDE); + ImGui::End(); + return; + } + else if (collapsed) { + ImGui::End(); + return; + } + + if (!auth_3d_test_window) { + ImGui::End(); + return; + } + + auth_3d* auth = auth_3d_data_get_auth_3d(auth_3d_test_task.auth_3d_id); + if (auth) + auth_3d_test_window->last_frame = auth->play_control.size; + + if (auth_3d_data_check_id_not_empty(&auth_3d_test_task.auth_3d_id)) { + auth_3d_test_window->enable = auth_3d_data_get_enable(&auth_3d_test_task.auth_3d_id); + auth_3d_test_window->frame = auth_3d_data_get_frame(&auth_3d_test_task.auth_3d_id); + auth_3d_test_window->frame_changed = false; + } + + std::vector& auth_3d_db_cat = auth_3d_test_window->category; + + data_struct* aft_data = rctx_ptr->data; + auth_3d_database* aft_auth_3d_db = &aft_data->data_ft.auth_3d_db; + auth_3d_database_uid* uids = aft_auth_3d_db->uid.data(); + + int32_t auth_3d_category_index = auth_3d_test_window->auth_3d_category_index; + + imguiGetContentRegionAvailSetNextItemWidth(); + if (ImGui::BeginCombo("##Auth 3D Category Index", auth_3d_category_index > -1 + ? auth_3d_db_cat[auth_3d_category_index].name : "", 0)) { + for (data_test_auth_3d_test_category& i : auth_3d_db_cat) { + int32_t auth_3d_category_idx = (int32_t)(&i - auth_3d_db_cat.data()); + + ImGui::PushID(&i); + if (ImGui::Selectable(i.name, auth_3d_category_index == auth_3d_category_idx) + || imguiItemKeyPressed(GLFW_KEY_ENTER, true) + || (ImGui::IsItemFocused() && auth_3d_category_index != auth_3d_category_idx)) { + auth_3d_category_index = auth_3d_category_idx; + } + ImGui::PopID(); + + if (auth_3d_category_index == auth_3d_category_idx) + ImGui::SetItemDefaultFocus(); + } + + data->imgui_focus |= true; + ImGui::EndCombo(); + } + + if (auth_3d_category_index != auth_3d_test_window->auth_3d_category_index) { + data_test_auth_3d_test_category* cat = &auth_3d_db_cat[auth_3d_category_index]; + + if (cat->uid.size() > 0) { + auth_3d_test_window->auth_3d_load = true; + auth_3d_test_window->auth_3d_uid_load = true; + auth_3d_test_window->auth_3d_uid = cat->uid[cat->index].uid; + } + else { + auth_3d_test_window->auth_3d_load = false; + auth_3d_test_window->auth_3d_uid_load = false; + auth_3d_test_window->auth_3d_uid = -1; + } + auth_3d_test_window->auth_3d_category_index = auth_3d_category_index; + auth_3d_test_window->auth_3d_index = cat->index; + } + + int32_t auth_3d_index = auth_3d_test_window->auth_3d_index; + + ImGui::Text(" ID "); + + ImGui::SameLine(); + + ImGui::Checkbox("OBJ Link", &auth_3d_test_task.window.obj_link); + + imguiGetContentRegionAvailSetNextItemWidth(); + bool auth_3d_category_found = false; + for (data_test_auth_3d_test_category& i : auth_3d_db_cat) { + if (auth_3d_category_index != &i - auth_3d_db_cat.data()) + continue; + + if (ImGui::BeginCombo("##Auth 3D Index", auth_3d_index > -1 + ? i.uid[auth_3d_index].name : "", 0)) { + for (data_test_auth_3d_test_uid& j : i.uid) { + int32_t auth_3d_idx = (int32_t)(&j - i.uid.data()); + + ImGui::PushID(&j); + if (ImGui::Selectable(j.name, auth_3d_index == auth_3d_idx) + || imguiItemKeyPressed(GLFW_KEY_ENTER, true) + || (ImGui::IsItemFocused() && auth_3d_index != auth_3d_idx)) { + auth_3d_test_window->auth_3d_index = -1; + auth_3d_index = auth_3d_idx; + } + ImGui::PopID(); + + if (auth_3d_index == auth_3d_idx) + ImGui::SetItemDefaultFocus(); + } + + data->imgui_focus |= true; + ImGui::EndCombo(); + } + + if (auth_3d_index != auth_3d_test_window->auth_3d_index) { + i.index = auth_3d_index; + auth_3d_test_window->auth_3d_uid_load = true; + auth_3d_test_window->auth_3d_uid = i.uid[auth_3d_index].uid; + auth_3d_test_window->auth_3d_index = auth_3d_index; + } + auth_3d_category_found = true; + break; + } + + if (!auth_3d_category_found && ImGui::BeginCombo("##Auth 3D Index", "", 0)) { + data->imgui_focus |= true; + ImGui::EndCombo(); + } + + float_t frame = auth_3d_test_window->frame; + ImGui::Text("frame[ 0,%4.0f)", auth_3d_test_window->last_frame); + + imguiGetContentRegionAvailSetNextItemWidth(); + igSliderFloatButton("##frame slider", &frame, 1.0f, + 0.0f, auth_3d_test_window->last_frame, "%5.0f", 0); + if (ImGui::IsItemActivated()) + auth_3d_test_window->paused = true; + + if (ImGui::Button("|<<", { 32.0, 0.0f })) + frame = 0.0f; + ImGui::SameLine(); + if (ImGui::Button( auth_3d_test_window->paused ? " > " : "||", { 32.0, 0.0f })) + auth_3d_test_window->paused = auth_3d_test_window->paused ? false : true; + ImGui::SameLine(); + if (ImGui::Button(">>|", { 32.0, 0.0f })) + frame = auth_3d_test_window->last_frame; + ImGui::SameLine(); + if (ImGui::Checkbox("repeat", &auth_3d_test_task.repeat) + && auth_3d_test_task.repeat && auth_3d_test_window->paused) + auth_3d_test_window->paused = false; + + if (ImGui::Checkbox("Left Right Reverse", &auth_3d_test_task.left_right_reverse)) + frame = 0.0f; + + if (frame != auth_3d_test_window->frame) { + auth_3d_test_window->frame_changed = true; + auth_3d_test_window->frame = frame; + } + + imguiColumnSliderFloat("transX", &auth_3d_test_task.trans_value.x, 0.1f, -5.0f, 5.0f, "%.2f", 0, true); + imguiColumnSliderFloat("transZ", &auth_3d_test_task.trans_value.z, 0.1f, -5.0f, 5.0f, "%.2f", 0, true); + imguiColumnSliderFloat("rotY", &auth_3d_test_task.rot_y_value, 1.0f, -360.0f, 360.0f, "%.0f", 0, true); + + if (ImGui::Button("cam reset", { 72.0f, 0.0f }) && rctx_ptr && rctx_ptr->camera) { + camera* cam = rctx_ptr->camera; + camera_set_fov(cam, 32.2673416137695); + camera_set_roll(cam, 0.0); + vec3 view_point = { 0.0f, 1.0f, 6.0f }; + camera_set_view_point(cam, &view_point); + vec3 interest = { 0.0f, 1.0f, 0.0f }; + camera_set_interest(cam, &interest); + } + + ImGui::Separator(); + + imguiColumnSliderFloat("Frame Speed", &frame_speed, 0.01f, 0.0f, 3.0f, "%.2f", 0, true); + + data->imgui_focus |= ImGui::IsWindowFocused(); + ImGui::End(); + + float_t x = w; + float_t y = 0.0f; + + w = min((float_t)width, 200.0f); + h = min((float_t)height, 124.0f); + + ImGui::SetNextWindowPos({ x, y }, ImGuiCond_Appearing); + ImGui::SetNextWindowSize({ w, h }, ImGuiCond_Always); + + window_flags = 0; + window_flags |= ImGuiWindowFlags_NoResize; + window_flags |= ImGuiWindowFlags_NoCollapse; + + if (ImGui::Begin("A3D STAGE", 0, window_flags)) { + stage* stg = task_stage_get_current_stage(); + + if (stg) { + ImGui::Checkbox("stage", &stg->stage_display); + ImGui::Checkbox("stg auth display", &stg->effect_display); + } + else { + bool stage = true; + ImGui::Checkbox("stage", &stage); + bool effects = true; + ImGui::Checkbox("stg auth display", &effects); + } + + int32_t stage_index = auth_3d_test_task.stage_index; + + imguiGetContentRegionAvailSetNextItemWidth(); + if (ImGui::BeginCombo("##Stage Index", stage_index > -1 + ? auth_3d_test_window->stage[stage_index] : "", 0)) { + for (const char*& i : auth_3d_test_window->stage) { + int32_t stage_idx = (int32_t)(&i - auth_3d_test_window->stage.data()); + + ImGui::PushID(i); + if (ImGui::Selectable(i, stage_index == stage_idx) + || imguiItemKeyPressed(GLFW_KEY_ENTER, true) + || (ImGui::IsItemFocused() && stage_index != stage_idx)) + stage_index = stage_idx; + ImGui::PopID(); + + if (stage_index == stage_idx) + ImGui::SetItemDefaultFocus(); + } + + data->imgui_focus |= ImGui::IsWindowFocused(); + ImGui::EndCombo(); + } + + if (stage_index != auth_3d_test_task.stage_index) + auth_3d_test_task.load_stage_index = stage_index; + + data->imgui_focus |= ImGui::IsWindowFocused(); + } + + ImGui::Checkbox("Stage Link Change", &auth_3d_test_task.window.stage_link_change); + + if (auth_3d_data_check_id_not_empty(&auth_3d_test_task.auth_3d_id)) { + auth_3d_data_set_enable(&auth_3d_test_task.auth_3d_id, auth_3d_test_window->enable); + auth_3d_data_set_repeat(&auth_3d_test_task.auth_3d_id, auth_3d_test_task.repeat); + auth_3d_data_set_left_right_reverse(&auth_3d_test_task.auth_3d_id, auth_3d_test_task.left_right_reverse); + if (auth_3d_test_window->frame_changed) { + auth_3d_data_set_req_frame(&auth_3d_test_task.auth_3d_id, auth_3d_test_window->frame); + auth_3d_test_window->frame_changed = false; + } + auth_3d_data_set_paused(&auth_3d_test_task.auth_3d_id, auth_3d_test_window->paused); + auth_3d_data_set_frame_rate(&auth_3d_test_task.auth_3d_id, 0); + } + ImGui::End(); +} + +bool data_test_auth_3d_test_show(class_data* data) { + auth_3d_load(); + + if (!auth_3d_test_window) + auth_3d_test_window = new Auth3dTestWindow; + else { + auth_3d_test_window->auth_3d_category_index = -1; + auth_3d_test_window->auth_3d_category_index_prev = -1; + auth_3d_test_window->auth_3d_index = -1; + auth_3d_test_window->auth_3d_uid = -1; + } + + auth_3d_test_window->enable = true; + auth_3d_test_window->frame = 0.0f; + auth_3d_test_window->frame_changed = false; + auth_3d_test_window->last_frame = 0.0f; + auth_3d_test_window->paused = false; + return true; +} + +bool data_test_auth_3d_test_dispose(class_data* data) { + delete auth_3d_test_window; + + data->flags = (class_flags)(CLASS_HIDDEN | CLASS_DISPOSED); + data->imgui_focus = false; + return true; +} + +static bool auth_3d_load() { + app::TaskWork::AppendTask(&auth_3d_test_task, "AUTH3DTEST"); + return true; +} + +static bool auth_3d_unload() { + auth_3d_test_task.SetDest(); + + classes_data* c = &data_test_classes[DATA_TEST_AUTH_3D_TEST]; + enum_or(c->data.flags, CLASS_HIDE); + return true; +} + +static int data_test_auth_3d_test_uid_quicksort_compare_func(void const* src1, void const* src2) { + const char* str1 = ((data_test_auth_3d_test_uid*)src1)->name; + const char* str2 = ((data_test_auth_3d_test_uid*)src2)->name; + return str_utils_compare(str1, str2); +} + +data_test_auth_3d_test_uid::data_test_auth_3d_test_uid( + const char* name, int32_t uid) : name(name), uid(uid) { + +} + +data_test_auth_3d_test_category::data_test_auth_3d_test_category() : name(), index() { + +} + +data_test_auth_3d_test_category::~data_test_auth_3d_test_category() { + +} + +Auth3dTestWindow::Auth3dTestWindow() { + data_struct* aft_data = rctx_ptr->data; + auth_3d_database* aft_auth_3d_db = &aft_data->data_ft.auth_3d_db; + object_database* aft_obj_db = &aft_data->data_ft.obj_db; + stage_database* aft_stage_data = &rctx_ptr->data->data_ft.stage_data; + + std::vector& auth_3d_db_cat = aft_auth_3d_db->category; + auth_3d_database_uid* uids = aft_auth_3d_db->uid.data(); + + category.resize(auth_3d_db_cat.size()); + for (auth_3d_database_category& i : auth_3d_db_cat) { + data_test_auth_3d_test_category* cat = &category[&i - auth_3d_db_cat.data()]; + cat->name = i.name.c_str(); + cat->index = -1; + + cat->uid.reserve(i.uid.size()); + for (int32_t& j : i.uid) + if (uids[j].enabled) + cat->uid.push_back({ uids[j].name.c_str(), uids[j].org_uid }); + + if (cat->uid.size()) { + quicksort_custom(cat->uid.data(), cat->uid.size(), + sizeof(data_test_auth_3d_test_uid), + data_test_auth_3d_test_uid_quicksort_compare_func); + cat->index = 0; + } + } + + auth_3d_category_index = -1; + auth_3d_category_index_prev = -1; + auth_3d_index = -1; + + auth_3d_uid = -1; + auth_3d_load = false; + auth_3d_uid_load = false; + + if (category.size() > 0) { + data_test_auth_3d_test_category* cat = &category.front(); + + if (cat->uid.size()) { + auth_3d_load = true; + auth_3d_uid_load = true; + auth_3d_uid = cat->uid.front().uid; + } + + auth_3d_category_index = 0; + auth_3d_category_index_prev = 0; + auth_3d_index = cat->index; + } + + + stage.reserve(aft_stage_data->stage_data.size()); + for (stage_data& i : aft_stage_data->stage_data) + stage.push_back(i.name.c_str()); + + enable = true; + frame = 0.0f; + frame_changed = false; + last_frame = 0.0f; + paused = false; +} + +Auth3dTestWindow::~Auth3dTestWindow() { +} + +void Auth3dTestWindow::Window() { + +} diff --git a/src/CLOUD/classes/data_test/auth_3d_test.h b/src/CLOUD/classes/data_test/auth_3d_test.hpp similarity index 92% rename from src/CLOUD/classes/data_test/auth_3d_test.h rename to src/CLOUD/classes/data_test/auth_3d_test.hpp index 3d1d3118..f9bb733b 100644 --- a/src/CLOUD/classes/data_test/auth_3d_test.h +++ b/src/CLOUD/classes/data_test/auth_3d_test.hpp @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool data_test_auth_3d_test_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/data_test/glitter_test.c b/src/CLOUD/classes/data_test/glitter_test.cpp similarity index 95% rename from src/CLOUD/classes/data_test/glitter_test.c rename to src/CLOUD/classes/data_test/glitter_test.cpp index 4df75c08..922840ba 100644 --- a/src/CLOUD/classes/data_test/glitter_test.c +++ b/src/CLOUD/classes/data_test/glitter_test.cpp @@ -3,9 +3,9 @@ GitHub/GitLab: korenkonder */ -#include "glitter_test.h" -#include "../../../KKdLib/io/path.h" -#include "../../../KKdLib/str_utils.h" +#include "glitter_test.hpp" +#include "../../../KKdLib/io/path.hpp" +#include "../../../KKdLib/str_utils.hpp" #include "../../../CRE/Glitter/glitter.hpp" #include "../../../CRE/data.hpp" #include "../../../CRE/render_context.hpp" @@ -13,9 +13,9 @@ #include "../../input.hpp" #include "../data_test.h" #include "../imgui_helper.h" -#include "stage_test.h" +#include "stage_test.hpp" -class TaskDataTestGlitterParticle : public TaskWindow { +class TaskDataTestGlitterParticle : public app::TaskWindow { public: uint64_t hash; Glitter::SceneCounter scene_counter; @@ -54,13 +54,13 @@ TaskDataTestGlitterParticle task_data_test_glitter_particle; extern int32_t width; extern int32_t height; extern render_context* rctx_ptr; -extern vec3 clear_color; +extern vec4u8 clear_color; extern bool input_reset; extern bool input_locked; extern bool draw_grid_3d; bool task_data_test_glitter_particle_load() { - TaskWork::AppendTask(&task_data_test_glitter_particle, "DATA_TEST_PARTICLE"); + app::TaskWork::AppendTask(&task_data_test_glitter_particle, "DATA_TEST_PARTICLE"); dtm_stg_load(0); //dtw_stg_load(1); return true; @@ -90,11 +90,11 @@ bool TaskDataTestGlitterParticle::Init() { QueryPerformanceCounter(&time); Glitter::glt_particle_manager.counter = (uint32_t)(time.LowPart * 0x0CAD3078ULL); - data_list[DATA_AFT].get_directory_files("rom/particle/", &files); + data_list[DATA_AFT].get_directory_files("rom/particle/", files); for (std::vector::iterator i = files.begin(); i != files.end();) if (str_utils_check_ends_with(i->name.c_str(), ".farc")) { char* temp = str_utils_get_without_extension(i->name.c_str()); - i->name = temp ? temp : 0; + i->name = temp ? std::string(temp) : std::string(); free(temp); i++; } @@ -106,7 +106,7 @@ bool TaskDataTestGlitterParticle::Init() { Glitter::glt_particle_manager.draw_all_mesh = false; dtm_stg_load(0); - clear_color = { (float_t)(96.0 / 255.0), (float_t)(96.0 / 255.0), (float_t)(96.0 / 255.0) }; + clear_color = { 0x60, 0x60, 0x60, 0xFF }; camera* cam = rctx_ptr->camera; camera_reset(cam); diff --git a/src/CLOUD/classes/data_test/glitter_test.h b/src/CLOUD/classes/data_test/glitter_test.hpp similarity index 90% rename from src/CLOUD/classes/data_test/glitter_test.h rename to src/CLOUD/classes/data_test/glitter_test.hpp index 78669b12..4f636a65 100644 --- a/src/CLOUD/classes/data_test/glitter_test.h +++ b/src/CLOUD/classes/data_test/glitter_test.hpp @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool data_test_glitter_test_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/data_test/stage_test.c b/src/CLOUD/classes/data_test/stage_test.cpp similarity index 97% rename from src/CLOUD/classes/data_test/stage_test.c rename to src/CLOUD/classes/data_test/stage_test.cpp index e218e6b5..5bd262b2 100644 --- a/src/CLOUD/classes/data_test/stage_test.c +++ b/src/CLOUD/classes/data_test/stage_test.cpp @@ -3,10 +3,10 @@ GitHub/GitLab: korenkonder */ -#include "stage_test.h" -#include "../../../KKdLib/io/path.h" +#include "stage_test.hpp" +#include "../../../KKdLib/io/path.hpp" #include "../../../KKdLib/sort.hpp" -#include "../../../KKdLib/str_utils.h" +#include "../../../KKdLib/str_utils.hpp" #include "../../../CRE/data.hpp" #include "../../../CRE/render_context.hpp" #include "../../../CRE/stage.hpp" @@ -22,7 +22,7 @@ struct data_test_stage_test_stage_pv { ~data_test_stage_test_stage_pv(); }; -class DtwStg : public TaskWindow { +class DtwStg : public app::TaskWindow { public: int32_t pv_id; int32_t pv_index; @@ -39,13 +39,14 @@ public: DtwStg(); virtual ~DtwStg() override; + virtual void Window() override; }; extern int32_t width; extern int32_t height; extern render_context* rctx_ptr; -extern vec3 clear_color; +extern vec4u8 clear_color; static const char* data_test_stage_test_window_title = "Stage Test##Data Test"; @@ -325,7 +326,7 @@ static int data_test_stage_test_stage_pv_quicksort_compare_func(void const* src1 } static bool stage_test_load() { - clear_color = { (float_t)(96.0 / 255.0), (float_t)(96.0 / 255.0), (float_t)(96.0 / 255.0) }; + clear_color = { 96, 96, 96, 255 }; camera* cam = rctx_ptr->camera; camera_reset(cam); @@ -333,7 +334,7 @@ static bool stage_test_load() { camera_set_view_point(cam, &view_point); vec3 interest = { 0.0f, 1.0f, 0.0f }; camera_set_interest(cam, &interest); - TaskWork::AppendTask(&dtm_stg, "DATA_TEST_STAGE"); + app::TaskWork::AppendTask(&dtm_stg, "DATA_TEST_STAGE"); if (!dtw_stg) dtw_stg = new DtwStg(); @@ -349,6 +350,7 @@ static bool stage_test_unload() { enum_or(c->data.flags, CLASS_HIDE); return true; } + data_test_stage_test_stage_pv::data_test_stage_test_stage_pv(int32_t pv_id) { this->pv_id = pv_id; } diff --git a/src/CLOUD/classes/data_test/stage_test.h b/src/CLOUD/classes/data_test/stage_test.hpp similarity index 92% rename from src/CLOUD/classes/data_test/stage_test.h rename to src/CLOUD/classes/data_test/stage_test.hpp index 806481f5..89687c32 100644 --- a/src/CLOUD/classes/data_test/stage_test.h +++ b/src/CLOUD/classes/data_test/stage_test.hpp @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool data_test_stage_test_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/data_view/auth_3d.h b/src/CLOUD/classes/data_view/auth_3d.h index 7b77c441..6b846c6a 100644 --- a/src/CLOUD/classes/data_view/auth_3d.h +++ b/src/CLOUD/classes/data_view/auth_3d.h @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool data_view_auth_3d_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/data_view/draw_task.h b/src/CLOUD/classes/data_view/draw_task.h index 985a1a0b..4cfaf6c5 100644 --- a/src/CLOUD/classes/data_view/draw_task.h +++ b/src/CLOUD/classes/data_view/draw_task.h @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool data_view_draw_task_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/data_view/glitter.h b/src/CLOUD/classes/data_view/glitter.h index d318e38e..38497f01 100644 --- a/src/CLOUD/classes/data_view/glitter.h +++ b/src/CLOUD/classes/data_view/glitter.h @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool data_view_glitter_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/data_view/object.h b/src/CLOUD/classes/data_view/object.h index bf78b857..5b309ac4 100644 --- a/src/CLOUD/classes/data_view/object.h +++ b/src/CLOUD/classes/data_view/object.h @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool data_view_object_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/data_view/texture.h b/src/CLOUD/classes/data_view/texture.h index 036b497c..1824d575 100644 --- a/src/CLOUD/classes/data_view/texture.h +++ b/src/CLOUD/classes/data_view/texture.h @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool data_view_texture_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/glitter_editor.c b/src/CLOUD/classes/glitter_editor.c index d673034e..d7510e1d 100644 --- a/src/CLOUD/classes/glitter_editor.c +++ b/src/CLOUD/classes/glitter_editor.c @@ -7,20 +7,20 @@ #if defined(CLOUD_DEV) #include "glitter_editor.h" -#include "../../KKdLib/io/path.h" -#include "../../KKdLib/io/stream.h" -#include "../../KKdLib/dds.h" +#include "../../KKdLib/io/path.hpp" +#include "../../KKdLib/io/stream.hpp" +#include "../../KKdLib/dds.hpp" #include "../../KKdLib/interpolation.h" -#include "../../KKdLib/str_utils.h" +#include "../../KKdLib/str_utils.hpp" #include "../../KKdLib/txp.hpp" -#include "../../KKdLib/vec.h" +#include "../../KKdLib/vec.hpp" #include "../../CRE/Glitter/glitter.hpp" #include "../../CRE/camera.h" #include "../../CRE/data.hpp" #include "../../CRE/draw_task.h" #include "../../CRE/gl_state.h" #include "../../CRE/render_context.hpp" -#include "../../CRE/shader_glsl.h" +#include "../../CRE/shader_glsl.hpp" #include "../../CRE/stage.hpp" #include "../../CRE/static_var.h" #include "../input.hpp" @@ -322,11 +322,11 @@ bool glitter_editor_init(class_data* data, render_context* rctx) { GlitterFileReader* fr = 0; if (files_x.begin) { stream s; - io_open(&s, L"name_VRFL.glitter.txt", L"rb"); + s.open(L"name_VRFL.glitter.txt", L"rb"); size_t length = s.length; uint8_t* data = force_malloc(length); - io_read(&s, data, length); - io_free(&s); + s.read(data, length); + s.close(); char* buf; char** lines; @@ -470,11 +470,11 @@ bool glitter_editor_init(class_data* data, render_context* rctx) { } stream s; - io_open(&s, L"name_F2.glitter.txt", L"rb"); + s.open(L"name_F2.glitter.txt", L"rb"); size_t length = s.length; uint8_t* data = force_malloc(length); - io_read(&s, data, length); - io_free(&s); + s.read(data, length); + s.close(); char* buf; char** lines; @@ -1725,16 +1725,15 @@ static void glitter_editor_save_file(glitter_editor_struct* glt_edt, const char* if (glt_type != Glitter::FT) { char* list_temp = str_utils_add(temp, ".glitter.txt"); stream s; - io_open(&s, list_temp, "wb"); + s.open(list_temp, "wb"); if (s.io.stream) { Glitter::EffectGroup* eg = glt_edt->effect_group; for (Glitter::Effect*& i : eg->effects) if (i) { - io_write_string(&s, &i->name); - io_write_char(&s, '\n'); + s.write_string(i->name); + s.write_char('\n'); } } - io_free(&s); free(list_temp); } f.write(temp, mode, false); @@ -1759,11 +1758,11 @@ static bool glitter_editor_list_open_window(Glitter::EffectGroup* eg) { ofn.lpstrTitle = L"File to Open"; if (GetOpenFileNameW(&ofn)) { stream s; - io_open(&s, file, L"rb"); + s.open(file, L"rb"); size_t length = s.length; uint8_t* data = force_malloc_s(uint8_t, length); - io_read(&s, data, length); - io_free(&s); + s.read(data, length); + s.close(); char* buf; char** lines; @@ -1841,7 +1840,6 @@ static bool glitter_editor_resource_import(glitter_editor_struct* glt_edt) { if (GetOpenFileNameW(&ofn)) { wchar_t* f = str_utils_get_without_extension(file); wchar_t* p = str_utils_split_right_get_left(file, L'.'); - dds* d = dds_init(); uint64_t hash_ft = hash_utf16_fnv1a64m(f); uint64_t hash_f2 = hash_utf16_murmurhash(f); @@ -1855,44 +1853,45 @@ static bool glitter_editor_resource_import(glitter_editor_struct* glt_edt) { for (int32_t i = 0; i < rc; i++) if (rh[i] == hash_ft || rh[i] == hash_f2) goto DDSEnd; + { + dds d; + d.read(p); + if (d.width == 0 || d.height == 0 || d.mipmaps_count == 0 || d.data.size() < 1) + goto DDSEnd; - dds_read(d, p); - if (d->width == 0 || d->height == 0 || d->mipmaps_count == 0 || vector_old_length(d->data) < 1) - goto DDSEnd; + eg->resources_tex.textures.push_back({}); + tex = &eg->resources_tex.textures.back(); + tex->array_size = d.has_cube_map ? 6 : 1; + tex->has_cube_map = d.has_cube_map; + tex->mipmaps_count = d.mipmaps_count; - eg->resources_tex.textures.push_back({}); - tex = &eg->resources_tex.textures.back(); - tex->array_size = d->has_cube_map ? 6 : 1; - tex->has_cube_map = d->has_cube_map; - tex->mipmaps_count = d->mipmaps_count; + tex->mipmaps.reserve((tex->has_cube_map ? 6LL : 1LL) * tex->mipmaps_count); + index = 0; + do + for (uint32_t i = 0; i < tex->mipmaps_count; i++) { + txp_mipmap tex_mip; + memset(&tex_mip, 0, sizeof(txp_mipmap)); + tex_mip.width = max(d.width >> i, 1); + tex_mip.height = max(d.height >> i, 1); + tex_mip.format = d.format; - tex->mipmaps.reserve((tex->has_cube_map ? 6LL : 1LL) * tex->mipmaps_count); - index = 0; - do - for (uint32_t i = 0; i < tex->mipmaps_count; i++) { - txp_mipmap tex_mip; - memset(&tex_mip, 0, sizeof(txp_mipmap)); - tex_mip.width = max(d->width >> i, 1); - tex_mip.height = max(d->height >> i, 1); - tex_mip.format = d->format; + uint32_t size = txp::get_size(tex_mip.format, tex_mip.width, tex_mip.height); + tex_mip.size = size; + tex_mip.data.resize(size); + memcpy(tex_mip.data.data(), d.data[index], size); + tex->mipmaps.push_back(tex_mip); + index++; + } + while (index / tex->mipmaps_count < tex->array_size); - uint32_t size = txp::get_size(tex_mip.format, tex_mip.width, tex_mip.height); - tex_mip.size = size; - tex_mip.data.resize(size); - memcpy(tex_mip.data.data(), d->data.begin[index], size); - tex->mipmaps.push_back(tex_mip); - index++; - } - while (index / tex->mipmaps_count < tex->array_size); - - eg->resources_count++; - if (eg->type == Glitter::FT) - eg->resource_hashes.push_back(hash_ft); - else - eg->resource_hashes.push_back(hash_f2); - ret = true; + eg->resources_count++; + if (eg->type == Glitter::FT) + eg->resource_hashes.push_back(hash_ft); + else + eg->resource_hashes.push_back(hash_f2); + ret = true; + } DDSEnd: - dds_dispose(d); free(f); free(p); } @@ -1921,7 +1920,6 @@ static bool glitter_editor_resource_export(glitter_editor_struct* glt_edt) { ofn.Flags = OFN_NONETWORKBUTTON; if (GetSaveFileNameW(&ofn)) { wchar_t* p = str_utils_split_right_get_left(file, L'.'); - dds* d = dds_init(); Glitter::EffectGroup* eg = glt_edt->effect_group; txp& tex = eg->resources_tex.textures[sel_rsrc]; @@ -1930,27 +1928,25 @@ static bool glitter_editor_resource_export(glitter_editor_struct* glt_edt) { uint32_t width = tex.mipmaps[0].width; uint32_t height = tex.mipmaps[0].height; - d->format = format; - d->width = width; - d->height = height; - d->mipmaps_count = tex.mipmaps_count; - d->has_cube_map = tex.has_cube_map; - d->data = vector_old_ptr_empty(void); - - vector_old_ptr_void_reserve(&d->data, (tex.has_cube_map ? 6LL : 1LL) * tex.mipmaps_count); + dds d; + d.format = format; + d.width = width; + d.height = height; + d.mipmaps_count = tex.mipmaps_count; + d.has_cube_map = tex.has_cube_map; + d.data.reserve((tex.has_cube_map ? 6LL : 1LL) * tex.mipmaps_count); uint32_t index = 0; do for (uint32_t i = 0; i < tex.mipmaps_count; i++) { uint32_t size = txp::get_size(format, max(width >> i, 1), max(height >> i, 1)); void* data = force_malloc(size); memcpy(data, tex.mipmaps[index].data.data(), size); - vector_old_ptr_void_push_back(&d->data, &data); + d.data.push_back(data); index++; } while (index / tex.mipmaps_count < tex.array_size); - dds_write(d, p); + d.write(p); ret = true; - dds_dispose(d); free(p); } CoUninitialize(); @@ -4054,7 +4050,7 @@ static void glitter_editor_property_particle(glitter_editor_struct* glt_edt, cla } imguiStartPropertyColumn("Object"); - if (ImGui::BeginCombo("##Object", obj ? string_data(&obj->name) : "None", 0)) { + if (ImGui::BeginCombo("##Object", obj ? obj->name : "None", 0)) { if (set_id != -1 && handler && handler->set_id == set_id && handler->obj_set) { obj_set* set = handler->obj_set; ssize_t obj_index = -1; @@ -4074,7 +4070,7 @@ static void glitter_editor_property_particle(glitter_editor_struct* glt_edt, cla for (uint32_t i = 0; i < set->obj_num; i++) { ImGui::PushID(i); ::obj* obj = &set->obj_data[i]; - if (ImGui::Selectable(string_data(&obj->name), obj->id == obj_id) + if (ImGui::Selectable(obj->name, obj->id == obj_id) || imguiItemKeyPressed(GLFW_KEY_ENTER, true) || (ImGui::IsItemFocused() && obj->id != obj_id)) obj_index = i; @@ -6529,8 +6525,7 @@ static void glitter_editor_gl_load(glitter_editor_struct* glt_edt) { " result = color;\n" "}\n"; - shader_glsl_param param; - memset(¶m, 0, sizeof(shader_glsl_param)); + shader_glsl_param param = {}; param.name = "Glitter Editor Wireframe"; glt_edt->gl_data.wireframe.shader.load(glitter_editor_wireframe_vert, glitter_editor_wireframe_frag, 0, ¶m); @@ -6716,7 +6711,7 @@ static void glitter_editor_gl_draw_wireframe_draw(glitter_editor_struct* glt_edt gl_state_bind_vertex_array(glt_edt->vao); glt_edt->gl_data.wireframe.shader.use(); - shader_glsl_set_vec4_value(&glt_edt->gl_data.wireframe.shader, "color", 1.0f, 1.0f, 0.0f, 1.0f); + glt_edt->gl_data.wireframe.shader.set("color", 1.0f, 1.0f, 0.0f, 1.0f); for (Glitter::F2RenderGroup*& i : eff->render_scene.groups) { if (!i) continue; @@ -6727,7 +6722,7 @@ static void glitter_editor_gl_draw_wireframe_draw(glitter_editor_struct* glt_edt else if (rg->disp < 1) continue; - shader_glsl_set_mat4(&glt_edt->gl_data.wireframe.shader, "model", false, rg->mat_draw); + glt_edt->gl_data.wireframe.shader.set("model", false, rg->mat_draw); switch (rg->type) { case Glitter::PARTICLE_QUAD: { @@ -6778,7 +6773,7 @@ static void glitter_editor_gl_draw_wireframe_draw(glitter_editor_struct* glt_edt gl_state_bind_vertex_array(glt_edt->vao); glt_edt->gl_data.wireframe.shader.use(); - shader_glsl_set_vec4_value(&glt_edt->gl_data.wireframe.shader, "color", 1.0f, 1.0f, 0.0f, 1.0f); + glt_edt->gl_data.wireframe.shader.set("color", 1.0f, 1.0f, 0.0f, 1.0f); for (Glitter::XRenderGroup*& i : eff->render_scene.groups) { if (!i) continue; @@ -6789,7 +6784,7 @@ static void glitter_editor_gl_draw_wireframe_draw(glitter_editor_struct* glt_edt else if (rg->disp < 1) continue; - shader_glsl_set_mat4(&glt_edt->gl_data.wireframe.shader, "model", false, rg->mat_draw); + glt_edt->gl_data.wireframe.shader.set("model", false, rg->mat_draw); switch (rg->type) { case Glitter::PARTICLE_QUAD: { @@ -6865,7 +6860,7 @@ static void glitter_editor_gl_draw_wireframe_draw_mesh(glitter_editor_struct* gl object_data, rctx->camera, &mat))) continue; - shader_glsl_set_mat4(&glt_edt->gl_data.wireframe.shader, "model", false, mat); + glt_edt->gl_data.wireframe.shader.set("model", false, mat); int32_t ttc = 0; texture_transform_struct* tt = object_data->texture_transform_array; diff --git a/src/CLOUD/classes/glitter_editor.h b/src/CLOUD/classes/glitter_editor.h index e46fa4ac..313d4e8a 100644 --- a/src/CLOUD/classes/glitter_editor.h +++ b/src/CLOUD/classes/glitter_editor.h @@ -6,7 +6,7 @@ #pragma once #if defined(CLOUD_DEV) -#include "../../KKdLib/default.h" +#include "../../KKdLib/default.hpp" #include "../classes.h" extern bool glitter_editor_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/graphics/background_color.c b/src/CLOUD/classes/graphics/background_color.c index 914a2f65..39109a99 100644 --- a/src/CLOUD/classes/graphics/background_color.c +++ b/src/CLOUD/classes/graphics/background_color.c @@ -4,12 +4,12 @@ */ #include "background_color.h" -#include "../../../KKdLib/vec.h" +#include "../../../KKdLib/vec.hpp" #include "../imgui_helper.h" extern int32_t width; extern int32_t height; -extern vec3 clear_color; +extern vec4u8 clear_color; extern bool set_clear_color; static const char* graphics_background_color_window_title = "Background Color##Graphics"; @@ -52,11 +52,18 @@ void graphics_background_color_imgui(class_data* data) { color_edit_flags |= ImGuiColorEditFlags_NoDragDrop; imguiGetContentRegionAvailSetNextItemWidth(); - ImGui::ColorEdit3("##Background Color", (float_t*)&clear_color, color_edit_flags); + vec4 _clear_color; + vec4u8_to_vec4(clear_color, _clear_color); + vec4_mult_scalar(_clear_color, (float_t)(1.0 / 255.0), _clear_color); + if (ImGui::ColorEdit4("##Background Color", (float_t*)&_clear_color, color_edit_flags)) { + vec4_clamp_scalar(_clear_color, 0.0f, 1.0f, _clear_color); + vec4_mult_scalar(_clear_color, 255.0f, _clear_color); + vec4_to_vec4u8(_clear_color, clear_color); + } ImGui::Checkbox("Set Clear Color", &set_clear_color); if (imguiButton("Reset Color")) { - clear_color = { (float_t)(96.0 / 255.0), (float_t)(96.0 / 255.0), (float_t)(96.0 / 255.0) }; + clear_color = { 0x60, 0x60, 0x60, 0xFF }; set_clear_color = true; } diff --git a/src/CLOUD/classes/graphics/background_color.h b/src/CLOUD/classes/graphics/background_color.h index 063dd451..2bbf369f 100644 --- a/src/CLOUD/classes/graphics/background_color.h +++ b/src/CLOUD/classes/graphics/background_color.h @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool graphics_background_color_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/graphics/glitter.h b/src/CLOUD/classes/graphics/glitter.h index 64c39101..eca04685 100644 --- a/src/CLOUD/classes/graphics/glitter.h +++ b/src/CLOUD/classes/graphics/glitter.h @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool graphics_glitter_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/graphics/post_process.c b/src/CLOUD/classes/graphics/post_process.c index 9491ab84..14d3ee80 100644 --- a/src/CLOUD/classes/graphics/post_process.c +++ b/src/CLOUD/classes/graphics/post_process.c @@ -69,27 +69,24 @@ void graphics_post_process_imgui(class_data* data) { imguiSetColumnSpace(1.0f / 4.0f); if (ImGui::TreeNode("Tone Trans")) { - vec3 tone_trans_start; - post_process_tone_map_get_tone_trans_start(tone_map, &tone_trans_start); + vec3 tone_trans_start = tone_map->get_tone_trans_start(); imguiColumnSliderVec3("Start", &tone_trans_start, 0.01f, 0.0f, 1.0f, "%.2f", 0, true); - post_process_tone_map_set_tone_trans_start(tone_map, &tone_trans_start); + tone_map->set_tone_trans_start(tone_trans_start); - vec3 tone_trans_end; - post_process_tone_map_get_tone_trans_end(tone_map, &tone_trans_end); + vec3 tone_trans_end = tone_map->get_tone_trans_end(); imguiColumnSliderVec3("End", &tone_trans_end, 0.01f, 0.0f, 1.0f, "%.2f", 0, true); - post_process_tone_map_set_tone_trans_end(tone_map, &tone_trans_end); + tone_map->set_tone_trans_end(tone_trans_end); ImGui::TreePop(); } if (ImGui::TreeNode("Scene Fade")) { - float_t scene_fade_alpha = post_process_tone_map_get_scene_fade_alpha(tone_map); + float_t scene_fade_alpha = tone_map->get_scene_fade_alpha(); imguiColumnSliderFloat("Alpha", &scene_fade_alpha, 0.01f, 0.0f, 1.0f, "%.2f", 0, true); - post_process_tone_map_set_scene_fade_alpha(tone_map, scene_fade_alpha); + tone_map->set_scene_fade_alpha(scene_fade_alpha); - vec3 scene_fade_color; - post_process_tone_map_get_scene_fade_color(tone_map, &scene_fade_color); + vec3 scene_fade_color = tone_map->get_scene_fade_color(); imguiColumnSliderVec3("Color", &scene_fade_color, 0.01f, 0.0f, 1.0f, "%.2f", 0, true); - post_process_tone_map_set_scene_fade_color(tone_map, &scene_fade_color); + tone_map->set_scene_fade_color(scene_fade_color); const char* scene_fade_blend_func_labels[] = { "0: OVER", @@ -97,10 +94,10 @@ void graphics_post_process_imgui(class_data* data) { "2: PLUS", }; - int32_t scene_fade_blend_func = post_process_tone_map_get_scene_fade_blend_func(tone_map); + int32_t scene_fade_blend_func = tone_map->get_scene_fade_blend_func(); imguiColumnComboBox("Blend Func", scene_fade_blend_func_labels, 3, &scene_fade_blend_func, 0, false, &data->imgui_focus); - post_process_tone_map_set_scene_fade_blend_func(tone_map, scene_fade_blend_func); + tone_map->set_scene_fade_blend_func(scene_fade_blend_func); ImGui::TreePop(); } @@ -111,48 +108,46 @@ void graphics_post_process_imgui(class_data* data) { "RGB LINEAR2", }; - int32_t _tone_map_method = post_process_tone_map_get_tone_map_method(tone_map); + int32_t _tone_map_method = tone_map->get_tone_map_method(); imguiColumnComboBox("Tone Map", tone_map_method_labels, 3, &_tone_map_method, 0, false, &data->imgui_focus); - post_process_tone_map_set_tone_map_method(tone_map, (tone_map_method)_tone_map_method); + tone_map->set_tone_map_method((tone_map_method)_tone_map_method); - float_t exposure = post_process_tone_map_get_exposure(tone_map); + float_t exposure = tone_map->get_exposure(); imguiColumnSliderFloat("Exposure", &exposure, 0.02f, 0.0f, 4.0f, "%.2f", 0, true); exposure = roundf(exposure / 0.02f) * 0.02f; - post_process_tone_map_set_exposure(tone_map, exposure); + tone_map->set_exposure(exposure); - bool auto_exposure = post_process_tone_map_get_auto_exposure(tone_map); + bool auto_exposure = tone_map->get_auto_exposure(); imguiCheckbox("Auto Exposure", &auto_exposure); - post_process_tone_map_set_auto_exposure(tone_map, auto_exposure); + tone_map->set_auto_exposure(auto_exposure); - float_t gamma = post_process_tone_map_get_gamma(tone_map); + float_t gamma = tone_map->get_gamma(); imguiColumnSliderFloat("Gamma", &gamma, 0.01f, 0.2f, 2.2f, "%.2f", 0, true); - post_process_tone_map_set_gamma(tone_map, gamma); + tone_map->set_gamma(gamma); - int32_t saturate1 = post_process_tone_map_get_saturate_power(tone_map); + int32_t saturate1 = tone_map->get_saturate_power(); imguiColumnSliderInt("Saturate 1", &saturate1, 1, 6, "%d", 0, true); - post_process_tone_map_set_saturate_power(tone_map, saturate1); + tone_map->set_saturate_power(saturate1); - float_t saturate2 = post_process_tone_map_get_saturate_coeff(tone_map); + float_t saturate2 = tone_map->get_saturate_coeff(); imguiColumnSliderFloat("Saturate 2", &saturate2, 0.01f, 0.0f, 1.0f, "%.2f", 0, true); - post_process_tone_map_set_saturate_coeff(tone_map, saturate2); + tone_map->set_saturate_coeff(saturate2); ImGui::TreePop(); } if (ImGui::TreeNodeEx("Glare", ImGuiTreeNodeFlags_DefaultOpen)) { - vec3 radius; - post_process_blur_get_radius(blur, &radius); + vec3 radius = blur->get_radius(); imguiColumnSliderFloat("Radius R", &radius.x, 0.1f, 1.0f, 3.0f, "%.2f", 0, true); imguiColumnSliderFloat("Radius G", &radius.y, 0.1f, 1.0f, 3.0f, "%.2f", 0, true); imguiColumnSliderFloat("Radius B", &radius.z, 0.1f, 1.0f, 3.0f, "%.2f", 0, true); - post_process_blur_set_radius(blur, &radius); + blur->set_radius(radius); - vec3 intensity; - post_process_blur_get_intensity(blur, &intensity); + vec3 intensity = blur->get_intensity(); imguiColumnSliderFloat("Inten R", &intensity.x, 0.05f, 0.0f, 2.0f, "%.2f", 0, true); imguiColumnSliderFloat("Inten G", &intensity.y, 0.05f, 0.0f, 2.0f, "%.2f", 0, true); imguiColumnSliderFloat("Inten B", &intensity.z, 0.05f, 0.0f, 2.0f, "%.2f", 0, true); - post_process_blur_set_intensity(blur, &intensity); + blur->set_intensity(intensity); ImGui::TreePop(); } imguiSetDefaultColumnSpace(); diff --git a/src/CLOUD/classes/graphics/post_process.h b/src/CLOUD/classes/graphics/post_process.h index 689860ec..8cef71ec 100644 --- a/src/CLOUD/classes/graphics/post_process.h +++ b/src/CLOUD/classes/graphics/post_process.h @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool graphics_post_process_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/graphics/render_settings.h b/src/CLOUD/classes/graphics/render_settings.h index 135d35f1..04c68694 100644 --- a/src/CLOUD/classes/graphics/render_settings.h +++ b/src/CLOUD/classes/graphics/render_settings.h @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool graphics_render_settings_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/imgui_helper.c b/src/CLOUD/classes/imgui_helper.c index 1dd1a2c0..87d64abc 100644 --- a/src/CLOUD/classes/imgui_helper.c +++ b/src/CLOUD/classes/imgui_helper.c @@ -4,7 +4,7 @@ */ #include "imgui_helper.h" -#include "../../KKdLib/str_utils.h" +#include "../../KKdLib/str_utils.hpp" #include "../../CRE/data.hpp" const float_t imgui_alpha_disabled_scale = 0.5f; @@ -463,7 +463,7 @@ bool imguiComboBox(const char* label, const char** items, const size_t size, return prev_selected_idx != *selected_idx; } -bool imguiComboBoxString(const char* label, string* items, const size_t size, +bool imguiComboBoxString(const char* label, std::string* items, const size_t size, int32_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus) { int32_t prev_selected_idx = *selected_idx; @@ -478,11 +478,11 @@ bool imguiComboBoxString(const char* label, string* items, const size_t size, return false; } - if (ImGui::BeginCombo(label, *selected_idx != -1 ? string_data(&items[*selected_idx]) : 0, flags)) { + if (ImGui::BeginCombo(label, *selected_idx != -1 ? items[*selected_idx].c_str() : 0, flags)) { if (include_last) for (size_t n = 0; n <= size; n++) { ImGui::PushID((int32_t)n); - if (ImGui::Selectable(string_data(&items[n]), *selected_idx == n) + if (ImGui::Selectable(items[n].c_str(), *selected_idx == n) || imguiItemKeyPressed(GLFW_KEY_ENTER, true) || (ImGui::IsItemFocused() && *selected_idx != n)) *selected_idx = (int32_t)n; @@ -494,7 +494,7 @@ bool imguiComboBoxString(const char* label, string* items, const size_t size, else for (size_t n = 0; n < size; n++) { ImGui::PushID((int32_t)n); - if (ImGui::Selectable(string_data(&items[n]), *selected_idx == n) + if (ImGui::Selectable(items[n].c_str(), *selected_idx == n) || imguiItemKeyPressed(GLFW_KEY_ENTER, true) || (ImGui::IsItemFocused() && *selected_idx != n)) *selected_idx = (int32_t)n; @@ -511,7 +511,7 @@ bool imguiComboBoxString(const char* label, string* items, const size_t size, return prev_selected_idx != *selected_idx; } -bool imguiComboBoxString(const char* label, string* items, const size_t size, +bool imguiComboBoxString(const char* label, std::string* items, const size_t size, size_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus) { size_t prev_selected_idx = *selected_idx; @@ -526,11 +526,11 @@ bool imguiComboBoxString(const char* label, string* items, const size_t size, return false; } - if (ImGui::BeginCombo(label, *selected_idx != -1 ? string_data(&items[*selected_idx]) : 0, flags)) { + if (ImGui::BeginCombo(label, *selected_idx != -1 ? items[*selected_idx].c_str() : 0, flags)) { if (include_last) for (size_t n = 0; n <= size; n++) { ImGui::PushID((void*)n); - if (ImGui::Selectable(string_data(&items[n]), *selected_idx == n) + if (ImGui::Selectable(items[n].c_str(), *selected_idx == n) || imguiItemKeyPressed(GLFW_KEY_ENTER, true) || (ImGui::IsItemFocused() && *selected_idx != n)) *selected_idx = n; @@ -542,7 +542,7 @@ bool imguiComboBoxString(const char* label, string* items, const size_t size, else for (size_t n = 0; n < size; n++) { ImGui::PushID((void*)n); - if (ImGui::Selectable(string_data(&items[n]), *selected_idx == n) + if (ImGui::Selectable(items[n].c_str(), *selected_idx == n) || imguiItemKeyPressed(GLFW_KEY_ENTER, true) || (ImGui::IsItemFocused() && *selected_idx != n)) *selected_idx = n; @@ -695,7 +695,7 @@ bool imguiColumnComboBox(const char* label, const char** items, const size_t siz return res; } -bool imguiColumnComboBoxString(const char* label, string* items, const size_t size, +bool imguiColumnComboBoxString(const char* label, std::string* items, const size_t size, int32_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus) { imguiStartPropertyColumn(label); bool res = imguiComboBoxString("", items, size, selected_idx, flags, include_last, focus); @@ -703,7 +703,7 @@ bool imguiColumnComboBoxString(const char* label, string* items, const size_t si return res; } -bool imguiColumnComboBoxString(const char* label, string* items, const size_t size, +bool imguiColumnComboBoxString(const char* label, std::string* items, const size_t size, size_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus) { imguiStartPropertyColumn(label); bool res = imguiComboBoxString("", items, size, selected_idx, flags, include_last, focus); diff --git a/src/CLOUD/classes/imgui_helper.h b/src/CLOUD/classes/imgui_helper.h index 9f86a5ae..1f8ab612 100644 --- a/src/CLOUD/classes/imgui_helper.h +++ b/src/CLOUD/classes/imgui_helper.h @@ -5,9 +5,9 @@ #pragma once -#include "../../KKdLib/default.h" -#include "../../KKdLib/string.h" -#include "../../KKdLib/vec.h" +#include +#include "../../KKdLib/default.hpp" +#include "../../KKdLib/vec.hpp" #define CIMGUI_DEFINE_ENUMS_AND_STRUCTS #include #include @@ -54,9 +54,9 @@ extern bool imguiComboBox(const char* label, const char** items, const size_t si int32_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus); extern bool imguiComboBox(const char* label, const char** items, const size_t size, size_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus); -extern bool imguiComboBoxString(const char* label, string* items, const size_t size, +extern bool imguiComboBoxString(const char* label, std::string* items, const size_t size, int32_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus); -extern bool imguiComboBoxString(const char* label, string* items, const size_t size, +extern bool imguiComboBoxString(const char* label, std::string* items, const size_t size, size_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus); extern bool imguiComboBoxConfigFile(const char* label, void* items, const size_t size, int32_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus); @@ -68,9 +68,9 @@ extern bool imguiColumnComboBox(const char* label, const char** items, const siz int32_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus); extern bool imguiColumnComboBox(const char* label, const char** items, const size_t size, size_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus); -extern bool imguiColumnComboBoxString(const char* label, string* items, const size_t size, +extern bool imguiColumnComboBoxString(const char* label, std::string* items, const size_t size, int32_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus); -extern bool imguiColumnComboBoxString(const char* label, string* items, const size_t size, +extern bool imguiColumnComboBoxString(const char* label, std::string* items, const size_t size, size_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus); extern bool imguiColumnComboBoxConfigFile(const char* label, void* items, const size_t size, int32_t* selected_idx, ImGuiComboFlags flags, bool include_last, bool* focus); diff --git a/src/CLOUD/classes/information/frame_speed.h b/src/CLOUD/classes/information/frame_speed.h index 02f40b65..51b98c76 100644 --- a/src/CLOUD/classes/information/frame_speed.h +++ b/src/CLOUD/classes/information/frame_speed.h @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool information_frame_speed_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/classes/information/task.c b/src/CLOUD/classes/information/task.c index 252ebd35..1b40c4ba 100644 --- a/src/CLOUD/classes/information/task.c +++ b/src/CLOUD/classes/information/task.c @@ -5,7 +5,7 @@ #include "task.h" #include "../../../KKdLib/sort.hpp" -#include "../../../KKdLib/str_utils.h" +#include "../../../KKdLib/str_utils.hpp" #include "../../../CRE/task.hpp" #include "../imgui_helper.h" @@ -58,9 +58,9 @@ void information_task_imgui(class_data* data) { return; } - std::vector vec; + std::vector vec; for (int32_t i = 0; ; i++) { - Task* t = TaskWork::GetTaskByIndex(i); + app::Task* t = app::TaskWork::GetTaskByIndex(i); if (!t) break; @@ -69,13 +69,13 @@ void information_task_imgui(class_data* data) { switch (task_sort) { case 2: - quicksort_custom(vec.data(), vec.size(), sizeof(Task*), task_sort_by_name); + quicksort_custom(vec.data(), vec.size(), sizeof(app::Task*), task_sort_by_name); break; case 3: - quicksort_custom(vec.data(), vec.size(), sizeof(Task*), task_sort_by_calc); + quicksort_custom(vec.data(), vec.size(), sizeof(app::Task*), task_sort_by_calc); break; case 4: - quicksort_custom(vec.data(), vec.size(), sizeof(Task*), task_sort_by_disp); + quicksort_custom(vec.data(), vec.size(), sizeof(app::Task*), task_sort_by_disp); break; } @@ -84,13 +84,13 @@ void information_task_imgui(class_data* data) { ImGui::BeginListBox("#Tasks", size); char buf[0x100]; if (show_priority) - for (Task*& i : vec) { + for (app::Task*& i : vec) { sprintf_s(buf, sizeof(buf), "%1d %-30s % 7d(% 7d) % 7d(% 7d)", i->priority, i->GetName(), i->GetCalcTime(), i->GetCalcTimeMax(), i->GetDispTime(), i->GetDispTimeMax()); ImGui::Selectable(buf); } else - for (Task*& i : vec) { + for (app::Task*& i : vec) { sprintf_s(buf, sizeof(buf), "%-32s % 7d(% 7d) % 7d(% 7d)", i->GetName(), i->GetCalcTime(), i->GetCalcTimeMax(), i->GetDispTime(), i->GetDispTimeMax()); ImGui::Selectable(buf); @@ -149,19 +149,19 @@ bool information_task_dispose(class_data* data) { } static int32_t task_sort_by_calc(void const* src1, void const* src2) { - Task* t1 = *(Task**)src1; - Task* t2 = *(Task**)src2; + app::Task* t1 = *(app::Task**)src1; + app::Task* t2 = *(app::Task**)src2; return t2->calc_time - t1->calc_time; } static int32_t task_sort_by_disp(void const* src1, void const* src2) { - Task* t1 = *(Task**)src1; - Task* t2 = *(Task**)src2; + app::Task* t1 = *(app::Task**)src1; + app::Task* t2 = *(app::Task**)src2; return t2->disp_time - t1->disp_time; } static int32_t task_sort_by_name(void const* src1, void const* src2) { - Task* t1 = *(Task**)src1; - Task* t2 = *(Task**)src2; + app::Task* t1 = *(app::Task**)src1; + app::Task* t2 = *(app::Task**)src2; return str_utils_compare(t1->name, t2->name); } diff --git a/src/CLOUD/classes/information/task.h b/src/CLOUD/classes/information/task.h index 1ff97aac..3063ddf4 100644 --- a/src/CLOUD/classes/information/task.h +++ b/src/CLOUD/classes/information/task.h @@ -5,7 +5,7 @@ #pragma once -#include "../../../KKdLib/default.h" +#include "../../../KKdLib/default.hpp" #include "../../classes.h" extern bool information_task_init(class_data* data, render_context* rctx); diff --git a/src/CLOUD/input.cpp b/src/CLOUD/input.cpp index c6b933a1..6d4d0a22 100644 --- a/src/CLOUD/input.cpp +++ b/src/CLOUD/input.cpp @@ -7,7 +7,7 @@ #include "input.hpp" #include -#include "../KKdLib/vec.h" +#include "../KKdLib/vec.hpp" #include "../CRE/timer.h" #define CIMGUI_DEFINE_ENUMS_AND_STRUCTS #include diff --git a/src/CLOUD/main.c b/src/CLOUD/main.c index 13af634b..c3400919 100644 --- a/src/CLOUD/main.c +++ b/src/CLOUD/main.c @@ -37,12 +37,10 @@ static void decrypt_edat() { stream f0; stream f1; - io_open(&f0, "misc\\shader_ps3.edat", "rb"); - io_open(&f1, "misc\\shader_ps3.dat", "wb"); + f0.open("misc\\shader_ps3.edat", "rb"); + f1.open("misc\\shader_ps3.dat", "wb"); if (f0.io.stream && f1.io.stream) - DecryptEDAT(&f0, &f1, 8, "misc\\EP0177-NPEB02013_00-PJDF2MOMJTNSDAYO.rap", klic); - io_free(&f0); - io_free(&f1); + DecryptEDAT(f0, f1, 8, "misc\\EP0177-NPEB02013_00-PJDF2MOMJTNSDAYO.rap", klic); } struct dof_data { @@ -133,12 +131,12 @@ static void a3da_to_dft_dsc(int32_t pv_id) { sprintf_s(buf, sizeof(buf), "DOF\\script\\pv_%03d_hard.dsc", pv_id); stream s_src_dsc; - io_open(&s_src_dsc, buf, "rb"); + s_src_dsc.open(buf, "rb"); - size_t src_dsc_length = io_get_length(&s_src_dsc); + size_t src_dsc_length = s_src_dsc.get_length(); void* src_dsc_data = force_malloc(src_dsc_length); - io_read(&s_src_dsc, src_dsc_data, src_dsc_length); - io_free(&s_src_dsc); + s_src_dsc.read(src_dsc_data, src_dsc_length); + s_src_dsc.close(); dsc d_src = dsc(); d_src.parse(src_dsc_data, src_dsc_length, DSC_FT); @@ -268,14 +266,14 @@ static void a3da_to_dft_dsc(int32_t pv_id) { sprintf_s(buf, sizeof(buf), "DOF\\pv_script\\pv_%03d_dof.dsc", pv_id); stream s_dsc; - io_open(&s_dsc, buf, "wb"); - io_write(&s_dsc, dsc_data, dsc_length); - io_free(&s_dsc); + s_dsc.open(buf, "wb"); + s_dsc.write(dsc_data, dsc_length); + s_dsc.close(); free(dsc_data); stream s_dft; - io_open(&s_dft); + s_dft.open(); uint32_t off; enrs e; enrs_entry ee; @@ -293,15 +291,15 @@ static void a3da_to_dft_dsc(int32_t pv_id) { off = (uint32_t)(dft_data.dof.size() * 24ULL); off = align_val(off, 0x10); - io_write_uint32_t(&s_dft, (int32_t)dft_data.dof.size()); - io_write_offset_f2_pof_add(&s_dft, 0x10, 0x40, &pof); - io_align_write(&s_dft, 0x10); - io_write(&s_dft, dft_data.dof.data(), sizeof(dof_data) * dft_data.dof.size()); + s_dft.write_uint32_t((int32_t)dft_data.dof.size()); + io_write_offset_f2_pof_add(s_dft, 0x10, 0x40, &pof); + s_dft.align_write(0x10); + s_dft.write(dft_data.dof.data(), sizeof(dof_data) * dft_data.dof.size()); f2_struct st; - io_align_write(&s_dft, 0x10); - io_copy(&s_dft, &st.data); - io_free(&s_dft); + s_dft.align_write(0x10); + s_dft.copy(st.data); + s_dft.close(); st.enrs = e; st.pof = pof; diff --git a/src/CLOUD/main.h b/src/CLOUD/main.h index 766c1110..3adde270 100644 --- a/src/CLOUD/main.h +++ b/src/CLOUD/main.h @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "input.hpp" #include "render.h" #include "sound.h" diff --git a/src/CLOUD/pv_game.cpp b/src/CLOUD/pv_game.cpp new file mode 100644 index 00000000..27b0a9af --- /dev/null +++ b/src/CLOUD/pv_game.cpp @@ -0,0 +1,1937 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder + + Some code is from LearnOpenGL +*/ + +#if defined(CLOUD_DEV) +#include +#include "pv_game.hpp" +#include "../CRE/Glitter/glitter.hpp" +#include "../CRE/light_param/light.hpp" +#include "../CRE/light_param.hpp" +#include "../CRE/data.hpp" +#include "../CRE/object.hpp" +#include "../CRE/pv_param.hpp" +#include "../KKdLib/farc.hpp" +#include "../KKdLib/sort.hpp" +#include "input.hpp" +#include "classes/imgui_helper.h" + +enum dsc_ft_func { + DSC_FT_END, + DSC_FT_TIME, + DSC_FT_MIKU_MOVE, + DSC_FT_MIKU_ROT, + DSC_FT_MIKU_DISP, + DSC_FT_MIKU_SHADOW, + DSC_FT_TARGET, + DSC_FT_SET_MOTION, + DSC_FT_SET_PLAYDATA, + DSC_FT_EFFECT, + DSC_FT_FADEIN_FIELD, + DSC_FT_EFFECT_OFF, + DSC_FT_SET_CAMERA, + DSC_FT_DATA_CAMERA, + DSC_FT_CHANGE_FIELD, + DSC_FT_HIDE_FIELD, + DSC_FT_MOVE_FIELD, + DSC_FT_FADEOUT_FIELD, + DSC_FT_EYE_ANIM, + DSC_FT_MOUTH_ANIM, + DSC_FT_HAND_ANIM, + DSC_FT_LOOK_ANIM, + DSC_FT_EXPRESSION, + DSC_FT_LOOK_CAMERA, + DSC_FT_LYRIC, + DSC_FT_MUSIC_PLAY, + DSC_FT_MODE_SELECT, + DSC_FT_EDIT_MOTION, + DSC_FT_BAR_TIME_SET, + DSC_FT_SHADOWHEIGHT, + DSC_FT_EDIT_FACE, + DSC_FT_MOVE_CAMERA, + DSC_FT_PV_END, + DSC_FT_SHADOWPOS, + DSC_FT_EDIT_LYRIC, + DSC_FT_EDIT_TARGET, + DSC_FT_EDIT_MOUTH, + DSC_FT_SET_CHARA, + DSC_FT_EDIT_MOVE, + DSC_FT_EDIT_SHADOW, + DSC_FT_EDIT_EYELID, + DSC_FT_EDIT_EYE, + DSC_FT_EDIT_ITEM, + DSC_FT_EDIT_EFFECT, + DSC_FT_EDIT_DISP, + DSC_FT_EDIT_HAND_ANIM, + DSC_FT_AIM, + DSC_FT_HAND_ITEM, + DSC_FT_EDIT_BLUSH, + DSC_FT_NEAR_CLIP, + DSC_FT_CLOTH_WET, + DSC_FT_LIGHT_ROT, + DSC_FT_SCENE_FADE, + DSC_FT_TONE_TRANS, + DSC_FT_SATURATE, + DSC_FT_FADE_MODE, + DSC_FT_AUTO_BLINK, + DSC_FT_PARTS_DISP, + DSC_FT_TARGET_FLYING_TIME, + DSC_FT_CHARA_SIZE, + DSC_FT_CHARA_HEIGHT_ADJUST, + DSC_FT_ITEM_ANIM, + DSC_FT_CHARA_POS_ADJUST, + DSC_FT_SCENE_ROT, + DSC_FT_EDIT_MOT_SMOOTH_LEN, + DSC_FT_PV_BRANCH_MODE, + DSC_FT_DATA_CAMERA_START, + DSC_FT_MOVIE_PLAY, + DSC_FT_MOVIE_DISP, + DSC_FT_WIND, + DSC_FT_OSAGE_STEP, + DSC_FT_OSAGE_MV_CCL, + DSC_FT_CHARA_COLOR, + DSC_FT_SE_EFFECT, + DSC_FT_EDIT_MOVE_XYZ, + DSC_FT_EDIT_EYELID_ANIM, + DSC_FT_EDIT_INSTRUMENT_ITEM, + DSC_FT_EDIT_MOTION_LOOP, + DSC_FT_EDIT_EXPRESSION, + DSC_FT_EDIT_EYE_ANIM, + DSC_FT_EDIT_MOUTH_ANIM, + DSC_FT_EDIT_CAMERA, + DSC_FT_EDIT_MODE_SELECT, + DSC_FT_PV_END_FADEOUT, + DSC_FT_TARGET_FLAG, + DSC_FT_ITEM_ANIM_ATTACH, + DSC_FT_SHADOW_RANGE, + DSC_FT_HAND_SCALE, + DSC_FT_LIGHT_POS, + DSC_FT_FACE_TYPE, + DSC_FT_SHADOW_CAST, + DSC_FT_EDIT_MOTION_F, + DSC_FT_FOG, + DSC_FT_BLOOM, + DSC_FT_COLOR_COLLE, + DSC_FT_DOF, + DSC_FT_CHARA_ALPHA, + DSC_FT_AOTO_CAP, + DSC_FT_MAN_CAP, + DSC_FT_TOON, + DSC_FT_SHIMMER, + DSC_FT_ITEM_ALPHA, + DSC_FT_MOVIE_CUT_CHG, + DSC_FT_CHARA_LIGHT, + DSC_FT_STAGE_LIGHT, + DSC_FT_AGEAGE_CTRL, + DSC_FT_MAX, +}; + +pv_game pv_game_data; + +extern render_context* rctx_ptr; + +static float_t dsc_time_to_frame(int64_t time); +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 pv_game_change_field(pv_game* pvgm, int32_t field, int64_t dsc_time, int64_t curr_time); +static bool pv_game_dsc_process(pv_game* pvgm, int64_t curr_time); +static void pv_game_reset_field(pv_game* pvgm); + +static dsc_data* sub_1401216D0(pv_game* a1, dsc_ft_func func_name, + int32_t* time, int32_t* pv_branch_mode, dsc_data* start, dsc_data* end); +static void sub_140121A80(pv_game* a1, int32_t chara_id); +static void sub_140122770(pv_game* a1, int32_t chara_id); + +pv_game::pv_game() : state(), frame(), frame_float(), time(), rob_chara_ids(), +dsc_time(), dsc_data_ptr(), dsc_data_ptr_end(), play(), success(), chara_id(), +pv_end(), playdata(), scene_rot_y(), branch_mode(), pause(), step_frame() { + pv_id = -1; + light_auth_3d_id = -1; + camera_auth_3d_id = -1; + target_anim_fps = 60.0f; + anim_frame_speed = 1.0f; + scene_rot_mat = mat4u_identity; +} + +pv_game::~pv_game() { + +} + +bool pv_game::Init() { + task_stage_load("PV_GAME_STAGE"); + return true; +} + +bool pv_game::Ctrl() { + switch (state) { + case 0: + return false; + case 1: { + bool wait_load = false; + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) + if (rob_chara_ids[i] != -1) + wait_load |= !task_rob_manager_check_chara_loaded(rob_chara_ids[i]); + + if (!wait_load) + state = 2; + } break; + case 2: { + data_struct* aft_data = &data_list[DATA_AFT]; + + light_param_storage_data_set_pv_id(pv_id); + + for (std::string& i : category_load) + auth_3d_data_load_category(i.c_str()); + + state = 3; + } break; + case 3: { + bool wait_load = task_stage_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)) + wait_load = true; + + for (std::string& i : category_load) + if (!auth_3d_data_check_category_loaded(i.c_str())) + wait_load = true; + + if (!wait_load) + state = 6; + } break; + case 6: { + data_struct* aft_data = &data_list[DATA_AFT]; + auth_3d_database* auth_3d_db = &aft_data->data_ft.auth_3d_db; + + 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 }; + } + } + } + + light_auth_3d_id = -1; + { + data_struct* aft_data = &data_list[DATA_AFT]; + auth_3d_database* auth_3d_db = &aft_data->data_ft.auth_3d_db; + + char buf[0x200]; + sprintf_s(buf, sizeof(buf), "STGPV%03d_EFF_LT_000", pv_id); + uint32_t light_auth_3d_uid = auth_3d_db->get_uid(buf); + if (light_auth_3d_uid != -1) { + light_auth_3d_id = auth_3d_data_load_uid(light_auth_3d_uid, auth_3d_db); + auth_3d_data_read_file(&light_auth_3d_id, auth_3d_db); + auth_3d_data_set_enable(&light_auth_3d_id, false); + auth_3d_data_set_visibility(&light_auth_3d_id, false); + break; + } + } + + camera_auth_3d_id = -1; + { + char buf[0x200]; + sprintf_s(buf, sizeof(buf), "CAMPV%03d_BASE", pv_id); + uint32_t camera_auth_3d_uid = auth_3d_db->get_uid(buf); + camera_auth_3d_id = auth_3d_data_load_uid(camera_auth_3d_uid, auth_3d_db); + auth_3d_data_read_file_modern(&camera_auth_3d_id); + auth_3d_data_set_enable(&camera_auth_3d_id, false); + auth_3d_data_set_visibility(&camera_auth_3d_id, false); + } + + state = 7; + } break; + case 7: { + bool wait_load = false; + + for (auto i : pv_auth_3d_ids) + if (!auth_3d_data_check_id_loaded(&i.second)) + wait_load = true; + + if (!auth_3d_data_check_id_loaded(&light_auth_3d_id)) + wait_load = true; + + if (!auth_3d_data_check_id_loaded(&camera_auth_3d_id)) + wait_load = true; + + if (!wait_load) + state = 8; + } break; + case 8: { + app::TaskWork::AppendTask(&pv_param_task::post_process_task, "PV POST PROCESS TASK"); + + state = 9; + } break; + case 9: { + { + data_struct* aft_data = &data_list[DATA_AFT]; + + dsc dsc_mouth; + dsc dsc_scene; + dsc dsc_system; + dsc dsc_easy; + + char path_buf[0x200]; + char file_buf[0x200]; + + farc dsc_common_farc; + sprintf_s(path_buf, sizeof(path_buf), "root+/pv_script/pv%03d/", pv_id); + sprintf_s(file_buf, sizeof(file_buf), "pv_%03d_common.farc", pv_id); + aft_data->load_file(&dsc_common_farc, path_buf, file_buf, farc::load_file); + + sprintf_s(file_buf, sizeof(file_buf), "pv_%03d_mouth.dsc", pv_id); + farc_file* dsc_mouth_ff = dsc_common_farc.read_file(file_buf); + if (dsc_mouth_ff) + dsc_mouth.parse(dsc_mouth_ff->data, dsc_mouth_ff->size, DSC_X); + + sprintf_s(file_buf, sizeof(file_buf), "pv_%03d_scene.dsc", pv_id); + farc_file* dsc_scene_ff = dsc_common_farc.read_file(file_buf); + if (dsc_scene_ff) + dsc_scene.parse(dsc_scene_ff->data, dsc_scene_ff->size, DSC_X); + + sprintf_s(file_buf, sizeof(file_buf), "pv_%03d_system.dsc", pv_id); + farc_file* dsc_system_ff = dsc_common_farc.read_file(file_buf); + if (dsc_system_ff) + dsc_system.parse(dsc_system_ff->data, dsc_system_ff->size, DSC_X); + + sprintf_s(file_buf, sizeof(file_buf), "pv_%03d_easy.dsc", pv_id); + dsc_easy.type = DSC_X; + aft_data->load_file(&dsc_easy, path_buf, file_buf, dsc::load_file); + + dsc_m.merge(4, &dsc_mouth, &dsc_scene, &dsc_system, &dsc_easy); + + struct miku_state { + bool disp; + int32_t disp_time; + int32_t set_motion_time; + uint32_t set_motion_data_offset; + } state[6]; + + for (miku_state& i : state) { + i.disp = true; + i.disp_time = -1; + i.set_motion_time = -1; + i.set_motion_data_offset = 0; + } + } + + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) { + playdata[i].reset(); + if (rob_chara_ids[i] == -1) + continue; + + rob_chara* rob_chr = rob_chara_array_get(rob_chara_ids[i]); + if (rob_chr) { + playdata[i].rob_chr = rob_chr; + rob_chr->frame_speed = 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); + sub_140121A80(this, i); + } + + dsc_data_ptr = dsc_m.data.data(); + dsc_data_ptr_end = dsc_data_ptr + dsc_m.data.size(); + + state = 10; + + pv_game_change_field(this, 1, -1, -1); + + Glitter::glt_particle_manager.SetPause(false); + extern float_t frame_speed; + frame_speed = 1.0f; + + pause = false; + step_frame = false; + + frame_float = -1.0f; + this->frame = -1; + this->time = (int64_t)round(-(100000.0 / 60.0) * 10000.0); + while (dsc_data_ptr != dsc_data_ptr_end + && pv_game_dsc_process(this, this->time)) + dsc_data_ptr++; + + auth_3d_data_set_enable(&light_auth_3d_id, true); + auth_3d_data_set_camera_root_update(&light_auth_3d_id, false); + auth_3d_data_set_paused(&light_auth_3d_id, false); + auth_3d_data_set_repeat(&camera_auth_3d_id, false); + auth_3d_data_set_visibility(&light_auth_3d_id, true); + + auth_3d_data_set_enable(&camera_auth_3d_id, true); + auth_3d_data_set_camera_root_update(&light_auth_3d_id, true); + auth_3d_data_set_paused(&camera_auth_3d_id, false); + auth_3d_data_set_repeat(&camera_auth_3d_id, false); + auth_3d_data_set_visibility(&camera_auth_3d_id, true); + + pause = true; + } break; + case 10: { + if (step_frame) + if (pause) + pause = false; + else { + pause = true; + step_frame = false; + } + + Glitter::glt_particle_manager.SetPause(pause); + extern float_t frame_speed; + frame_speed = pause ? 0.0f : 1.0f; + + float_t delta_frame = get_delta_frame(); + frame_float += delta_frame; + frame = (int32_t)frame_float; + time = (int64_t)round(frame_float * (100000.0 / 60.0) * 10000.0); + + while (dsc_data_ptr != dsc_data_ptr_end + && pv_game_dsc_process(this, time)) + dsc_data_ptr++; + + if (!play || pv_end) + state = 11; + } break; + case 11: { + Glitter::glt_particle_manager.FreeScenes(); + SetDest(); + } break; + } + return false; +} + +void pv_game::Disp() { + if (state != 10) + return; + +} + +bool pv_game::Dest() { + Unload(); + task_stage_unload(); + + light_param_storage_data_reset(); + rctx_ptr->post_process.tone_map->set_saturate_coeff(1.0f); + rctx_ptr->post_process.tone_map->set_scene_fade(vec4_null); + rctx_ptr->post_process.tone_map->set_scene_fade_blend_func(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; + return true; +} + +void pv_game::Window() { + if (state != 10) + return; + + if (Input::IsKeyTapped(GLFW_KEY_K, GLFW_MOD_CONTROL)) + state = 11; + else if (Input::IsKeyTapped(GLFW_KEY_K)) + pause ^= true; + + if (Input::IsKeyTapped(GLFW_KEY_L)) { + pause = true; + step_frame = true; + } + + if (!pause) + return; + + ImGuiIO& io = ImGui::GetIO(); + ImGuiStyle& style = ImGui::GetStyle(); + ImFont* font = ImGui::GetFont(); + + float_t w = 240.0f; + float_t h = 86.0f; + + extern int32_t width; + ImGui::SetNextWindowPos({ width - w, 0 }, ImGuiCond_Always); + ImGui::SetNextWindowSize({ w, h }, ImGuiCond_Always); + + ImGuiWindowFlags window_flags = 0; + window_flags |= ImGuiWindowFlags_NoResize; + + bool collapsed = !ImGui::Begin("X PV GAME", 0, window_flags); + if (collapsed) { + ImGui::End(); + return; + } + + w = imguiGetContentRegionAvailWidth(); + if (ImGui::BeginTable("buttons", 2)) { + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, w * 0.5f); + + ImGui::TableNextColumn(); + w = imguiGetContentRegionAvailWidth(); + if (imguiButton(pause || (!pause && step_frame) ? "Play (K)" : "Pause (K)", { w, 0.0f })) + pause ^= true; + + ImGui::TableNextColumn(); + w = imguiGetContentRegionAvailWidth(); + if (imguiButton("Step Frame (L)", { w, 0.0f })) { + pause = true; + step_frame = true; + } + + ImGui::TableNextColumn(); + w = imguiGetContentRegionAvailWidth(); + if (imguiButton("Stop (Ctrl+K)", { w, 0.0f })) + state = 11; + + ImGui::TableNextColumn(); + w = imguiGetContentRegionAvailWidth(); + char buf[0x100]; + sprintf_s(buf, sizeof(buf), "%d", frame); + ImGui::PushStyleColor(ImGuiCol_Button, { 0.0f, 0.0f, 0.0f, 0.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, { 0.0f, 0.0f, 0.0f, 0.0f }); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, { 0.0f, 0.0f, 0.0f, 0.0f }); + imguiButtonEx(buf, { w, 0.0f }, ImGuiButtonFlags_DontClosePopups + | ImGuiButtonFlags_NoNavFocus | ImGuiButtonFlags_NoHoveredOnFocus); + ImGui::PopStyleColor(3); + ImGui::EndTable(); + } + + extern bool input_locked; + input_locked |= ImGui::IsWindowFocused(); + ImGui::End(); +} + +void pv_game::Load(int32_t pv_id, chara_index charas[6], int32_t modules[6]) { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + object_database* aft_obj_db = &aft_data->data_ft.obj_db; + + this->pv_id = pv_id; + + char buf[0x200]; + sprintf_s(buf, sizeof(buf), "PV%03d", pv_id); + uint32_t mot_set = aft_mot_db->get_motion_set_id(buf); + motion_set_load_motion(mot_set, 0, aft_mot_db); + motion_set_load_mothead(mot_set, 0, aft_mot_db); + + sprintf_s(buf, sizeof(buf), "EFFSTGPV%03d", pv_id); + stage_category = buf; + category_load.push_back(stage_category); + + + sprintf_s(buf, sizeof(buf), "CAMPV%03d", pv_id); + camera_category = buf; + category_load.push_back(camera_category); + + play = true; + success = true; + chara_id = 0; + target_anim_fps = get_target_anim_fps(); + anim_frame_speed = get_anim_frame_speed(); + pv_end = false; + for (pv_play_data& i : playdata) + i.reset(); + scene_rot_y = 0.0f; + scene_rot_mat = mat4u_identity; + branch_mode = 0; + + pause = false; + step_frame = false; + + for (int32_t& i : rob_chara_ids) + i = -1; + + for (uint32_t& i : objset_load) + object_storage_load_set(aft_data, aft_obj_db, i); + + state = 1; + this->frame = 0; + frame_float = 0.0; + time = 0; + + dsc_m.type = DSC_NONE; + dsc_m.signature = 0; + dsc_m.id = 0; + dsc_m.data.clear(); + dsc_m.data.shrink_to_fit(); + dsc_m.data_buffer.clear(); + dsc_m.data_buffer.shrink_to_fit(); + dsc_data_ptr = 0; + dsc_data_ptr_end = 0; + + dsc_time = 0; + dsc_data_ptr = 0; + dsc_data_ptr_end = 0; + + Glitter::glt_particle_manager.draw_all = false; +} + +void pv_game::Unload() { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + char buf[0x200]; + sprintf_s(buf, sizeof(buf), "PV%03d", pv_id); + uint32_t mot_set = aft_mot_db->get_motion_set_id(buf); + motion_set_unload_motion(mot_set); + motion_set_unload_mothead(mot_set); + + pv_id = -1; + + state = 0; + frame = 0; + frame_float = 0.0; + time = 0; + + for (int32_t& i : rob_chara_ids) + if (i != -1) { + rob_chara_array_free_chara_id(i); + i = -1; + } + + for (auto& i : pv_auth_3d_ids) + auth_3d_data_unload_id(i.second, rctx_ptr); + + auth_3d_data_unload_id(light_auth_3d_id, rctx_ptr); + auth_3d_data_unload_id(camera_auth_3d_id, rctx_ptr); + + pv_auth_3d_ids.clear(); + light_auth_3d_id = -1; + camera_auth_3d_id = -1; + + for (std::string& i : category_load) + auth_3d_data_unload_category(i.c_str()); + + category_load.clear(); + category_load.shrink_to_fit(); + + pv_category.clear(); + pv_category.shrink_to_fit(); + stage_category.clear(); + stage_category.shrink_to_fit(); + camera_category.clear(); + camera_category.shrink_to_fit(); + + for (uint32_t& i : objset_load) + object_storage_unload_set(i); + + objset_load.clear(); + objset_load.shrink_to_fit(); + + dsc_m.type = DSC_NONE; + dsc_m.signature = 0; + dsc_m.id = 0; + dsc_m.data.clear(); + dsc_m.data.shrink_to_fit(); + dsc_m.data_buffer.clear(); + dsc_m.data_buffer.shrink_to_fit(); + dsc_data_ptr = 0; + dsc_data_ptr_end = 0; + + dsc_time = 0; + dsc_data_ptr = 0; + dsc_data_ptr_end = 0; + + play = true; + success = true; + chara_id = 0; + target_anim_fps = get_target_anim_fps(); + anim_frame_speed = get_anim_frame_speed(); + pv_end = false; + for (pv_play_data& i : playdata) + i.reset(); + scene_rot_y = 0.0f; + scene_rot_mat = mat4u_identity; + branch_mode = 0; + + Glitter::glt_particle_manager.draw_all = true; + pv_param_task::post_process_task.SetDest(); +} + +struc_104::struc_104() : rob_chr(), current_time(), +duration(), start_pos(), end_pos(), start_rot(), end_rot() { + mot_smooth_len = 12.0f; +} + +struc_104::~struc_104() { + +} + +void struc_104::reset() { + rob_chr = 0; + current_time = 0.0f; + duration = 0.0f; + start_pos = vec3_null; + end_pos = vec3_null; + start_rot = 0.0f; + end_rot = 0.0f; + mot_smooth_len = 12.0f; + set_motion.clear(); + set_item.clear(); +} + +pv_play_data::pv_play_data() : rob_chr(), disp() { + +} + +pv_play_data::~pv_play_data() { + +} + +void pv_play_data::reset() { + motion.clear(); + rob_chr = 0; + set_motion.clear(); + disp = true; + field_38.reset(); +} + +pv_disp2d::pv_disp2d() : pv_id(), title_start_2d_field(), title_end_2d_field(), +title_start_2d_low_field(), title_end_2d_low_field(), title_start_3d_field(), title_end_3d_field(), +target_shadow_type(), pv_spr_set_id(), pv_aet_set_id(), pv_main_aet_id() { + +} + +pv_disp2d::~pv_disp2d() { + +} + +static float_t dsc_time_to_frame(int64_t time) { + return (float_t)time / 1000000000.0f * 60.0f; +} + +static int32_t expression_id_to_mottbl_index(int32_t expression_id) { + static const int32_t expression_id_to_mottbl_index_table[] = { + 11, 15, 57, 19, 23, 25, 29, 33, + 37, 41, 45, 49, 53, 65, 7, 69, + 73, 77, 81, 85, 89, 7, 61, 6, + 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 93, 95, 97, 99, 101, 103, + 105, 107, 109, 111, 113, 115, 117, 119, + 121, 123, 125, 127, 13, 21, 31, 39, + 43, 47, 51, 55, 67, 71, 79, 83, + 129, 59, 17, 91, 27, 87, 35, 75, + 9, 63, 236, 238, 240, 242, + }; + + if (expression_id >= 0 && expression_id + < sizeof(expression_id_to_mottbl_index_table) / sizeof(int32_t)) + return expression_id_to_mottbl_index_table[expression_id]; + return 6; +} + +static int32_t hand_anim_id_to_mottbl_index(int32_t hand_anim_id) { + static const int32_t hand_anim_id_to_mottbl_index_table[] = { + 195, 196, 194, 197, 201, 198, 199, 202, + 203, 192, 200, 204, 204, 204, 193, + }; + + if (hand_anim_id >= 0 && hand_anim_id + < sizeof(hand_anim_id_to_mottbl_index_table) / sizeof(int32_t)) + return hand_anim_id_to_mottbl_index_table[hand_anim_id]; + return 192; +} + +static int32_t look_anim_id_to_mottbl_index(int32_t look_anim_id) { + static const int32_t look_anim_id_to_mottbl_index_table[] = { + 168, 170, 174, 172, 178, 176, 182, 180, + 166, 165, 224, 169, 171, 175, 173, 179, + 177, 183, 181, 167, + }; + + if (look_anim_id >= 0 && look_anim_id + < sizeof(look_anim_id_to_mottbl_index_table) / sizeof(int32_t)) + return look_anim_id_to_mottbl_index_table[look_anim_id]; + return 165; +} + +static int32_t mouth_anim_id_to_mottbl_index(int32_t mouth_anim_id) { + static const int32_t mouth_anim_id_to_mottbl_index_table[] = { + 134, 140, 142, 146, 144, 148, 150, 152, + 132, 131, 136, 138, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 151, + 135, 143, 147, 145, 133, 137, 139, 141, + 149, 153, 244, 245, 246, 247, 248, 249, + 250, 251, 252, + }; + + if (mouth_anim_id >= 0 && mouth_anim_id + < sizeof(mouth_anim_id_to_mottbl_index_table) / sizeof(int32_t)) + return mouth_anim_id_to_mottbl_index_table[mouth_anim_id]; + return 131; +} + +static void sub_140122B60(pv_game* a1, int32_t chara_id, int32_t motion_index, int64_t disp_time) { + if (chara_id < 0 || chara_id > ROB_CHARA_COUNT || motion_index < 0) + return; + + pv_play_data* playdata = &a1->playdata[chara_id]; + int64_t dsc_time = a1->dsc_time; + for (dsc_set_motion& i : playdata->field_38.set_motion) { + int64_t time = (int64_t)i.time * 10000; + if (time > dsc_time && i.motion_index == motion_index + && (!a1->branch_mode || a1->branch_mode == i.pv_branch_mode)) { + rob_chara_bone_data* rob_bone_data = playdata->rob_chr->bone_data; + rob_bone_data->motion_loaded.front()->mot_play_data.frame_data.field_14 = + roundf(dsc_time_to_frame(time - disp_time)) - 1.0f; + break; + } + } +} + +static void pv_game_change_field(pv_game* pvgm, int32_t field, int64_t dsc_time, int64_t curr_time) { + light_param_storage_data_set_pv_cut(field); +} + +static bool pv_game_dsc_process(pv_game* a1, int64_t curr_time) { + dsc_ft_func func = (dsc_ft_func)a1->dsc_data_ptr->func; + uint32_t* data = a1->dsc_m.get_func_data(a1->dsc_data_ptr); + if (a1->branch_mode) { + bool v19; + if (a1->success) + v19 = a1->branch_mode == 2; + else + v19 = a1->branch_mode == 1; + if (!v19) { + if (func < 0 || func > DSC_FT_AGEAGE_CTRL) { + a1->play = false; + return false; + } + else if ((data[0] < 0 || data[0] > 1) + && func != DSC_FT_PV_END && func != DSC_FT_PV_BRANCH_MODE) + return true; + } + } + + + + switch (func) { + case DSC_FT_END: { + a1->play = false; + a1->state = 11; + return false; + } break; + case DSC_FT_TIME: { + a1->dsc_time = (int64_t)(int32_t)data[0] * 10000; + if (a1->dsc_time > curr_time) + return false; + } break; + case DSC_FT_MIKU_MOVE: { + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + vec3 trans; + trans.x = (float_t)(int32_t)data[1] * 0.001f; + trans.y = (float_t)(int32_t)data[2] * 0.001f; + trans.z = (float_t)(int32_t)data[3] * 0.001f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + mat4 scene_rot_mat = a1->scene_rot_mat; + mat4_mult_vec3_trans(&scene_rot_mat, &trans, &trans); + rob_chr->data.miku_rot.position = trans; + rob_chr->set_osage_reset(); + } break; + case DSC_FT_MIKU_ROT: { + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + float_t rot_y = (float_t)(int32_t)data[0] * 0.001f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + int16_t rot_y_int16 = (int32_t)((rot_y + a1->scene_rot_y) * 32768.0f * (float_t)(1.0 / 180.0)); + rob_chr->data.miku_rot.rot_y_int16 = rot_y_int16; + rob_chr->set_osage_reset(); + } break; + case DSC_FT_MIKU_DISP: { + data_struct* aft_data = &data_list[DATA_AFT]; + bone_database* aft_bone_data = &aft_data->data_ft.bone_data; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + int32_t disp = (int32_t)data[1]; + + playdata->disp = disp == 1; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + if (disp == 1) { + rob_chr->set_visibility(true); + /*if (rob_chara::check_for_ageageagain_module(chara_index, module_index)) { + sub_1405430F0(chara_id, 1); + sub_1405430F0(chara_id, 2); + }*/ + + //pv_game::set_data_itmpv_visibility(a1->pv_game, a1->chara_id, true); + for (pv_play_data_set_motion& i : playdata->set_motion) { + bool v45 = rob_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->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) + sub_140122B60(a1, a1->chara_id, i.motion_index, i.dsc_time); + } + playdata->set_motion.clear(); + } + else { + rob_chr->set_visibility(false); + //pv_game::set_data_itmpv_visibility(a1->pv_game, a1->chara_id, false); + } + } break; + case DSC_FT_MIKU_SHADOW: { + a1->chara_id = data[0]; + } break; + case DSC_FT_TARGET: { + + } break; + case DSC_FT_SET_MOTION: { + data_struct* aft_data = &data_list[DATA_AFT]; + bone_database* aft_bone_data = &aft_data->data_ft.bone_data; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + int32_t motion_index = (int32_t)data[1]; + int32_t duration_int = (int32_t)data[2]; + int32_t frame_speed_int = (int32_t)data[3]; + + float_t duration; + if (duration_int != -1) { + duration = (float_t)duration_int * 0.001f * 60.0f; + if (duration < 0.0f) + duration = 0.0f; + } + else + duration = 0.0f; + + float_t frame_speed; + if (frame_speed_int != -1) { + frame_speed = (float_t)frame_speed_int * 0.001f; + if (frame_speed < 0.0f) + frame_speed = 0.0f; + } + else + frame_speed = 1.0f; + + float_t frame = 0.0f; + float_t dsc_frame = 0.0f; + + bool v11 = false; + pv_play_data_motion* v56 = 0; + for (pv_play_data_motion& i : playdata->motion) + if (i.motion_index == motion_index) { + v56 = &i; + break; + } + + if (v56 && v56->enable && (motion_index == v56->motion_index || !v56->motion_index)) { + if (a1->dsc_time != v56->time) { + frame = dsc_time_to_frame(curr_time - v56->time); + dsc_frame = roundf(dsc_time_to_frame(a1->dsc_time - v56->time)); + if (frame < dsc_frame) + frame = dsc_frame; + v11 = curr_time > v56->time; + } + else + frame = 0.0f; + } + + int32_t motion_id = -1; + int32_t chara_id = 0; + /*pv_db_pv_difficulty* v64 = 0i64; + pv_db_pv* v65 = a1->pv_game->data.pv; + pv_db_pv_difficulty* v66 = v65->difficulty[sub_14013C8C0()->difficulty].begin; + pv_db_pv* v67 = a1->pv_game->data.pv; + if (v66 == v67->difficulty[sub_14013C8C0()->difficulty].end) + return 1; + do { + if (v66->edition == sub_14013C8C0()->edition) + v64 = v66; + ++v66; + pv_db_pv* v68 = a1->pv_game->data.pv; + } while (v66 != v68->difficulty[sub_14013C8C0()->difficulty].end); + if (!v64) + return 1; + + int32_t motion_id = vector_pv_db_pv_motion_get_element_by_index_or_null(&v64->motion[a1->chara_id], v52)->id; + if (pv_game_data_get()->data.pv) { + pv_db_pv_motion* v76 = vector_pv_db_pv_motion_get_element_by_index_or_null(&v64->motion[a1->chara_id], v52); + motion_id = sub_1404EFA20(pv_game_data_get()->data.pv, rob_chr->chara_id, rob_chr->chara_index, v76); + }*/ + + if (motion_index) { + if (motion_id == -1) + motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(0); + } + else if (motion_id == -1) { + motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(5); + if (motion_id == -1) + motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(0); + } + + duration /= a1->anim_frame_speed; + if (v11) + duration = 0.0f; + + pv_play_data_set_motion v519; + v519.frame_speed = frame_speed * a1->anim_frame_speed; + v519.motion_id = motion_id; + v519.frame = frame; + v519.duration = duration; + v519.field_10 = v11; + v519.blend_type = MOTION_BLEND_CROSS; + v519.disable_eye_motion = true; + v519.motion_index = motion_index; + v519.dsc_time = v56 ? v56->time : a1->dsc_time; + v519.dsc_frame = dsc_frame; + + //a1->field_2C560[a1->chara_id] = true; + //a1->field_2C568[a1->chara_id] = v519; + if (playdata->disp) { + bool v84 = rob_chr->set_motion_id(motion_id, frame, duration, + v11, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); + rob_chr->set_motion_reset_data(motion_id, dsc_frame); + rob_chr->set_motion_skin_param(motion_id, dsc_frame); + rob_chr->bone_data->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) + sub_140122B60(a1, a1->chara_id, motion_index, v56 ? v56->time : 0); + } + else { + playdata->set_motion.clear(); + playdata->set_motion.push_back(v519); + rob_chr->data.motion.step_data.step = v519.frame_speed; + } + } break; + case DSC_FT_SET_PLAYDATA: { + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + int32_t motion_index = (int32_t)data[1]; + if (motion_index < 0) { + playdata->motion.clear(); + break; + } + + pv_play_data_motion* v92 = 0; + for (pv_play_data_motion& i : playdata->motion) + if (i.motion_index == motion_index) { + v92 = &i; + break; + } + + if (v92) { + v92->enable = true; + v92->motion_index = motion_index; + v92->time = a1->dsc_time; + } + else { + pv_play_data_motion v531; + v531.enable = true; + v531.motion_index = motion_index; + v531.time = a1->dsc_time; + playdata->motion.push_back(v531); + } + } break; + case DSC_FT_EFFECT: { + + } break; + case DSC_FT_FADEIN_FIELD: { + + } break; + case DSC_FT_EFFECT_OFF: { + + } break; + case DSC_FT_SET_CAMERA: { + + } break; + case DSC_FT_DATA_CAMERA: { + + } break; + case DSC_FT_CHANGE_FIELD: { + int32_t field = (int32_t)data[0]; + if (field > 0) + pv_game_change_field(a1, field, a1->dsc_time, curr_time); + else + pv_game_reset_field(a1); + } break; + case DSC_FT_HIDE_FIELD: { + + } break; + case DSC_FT_MOVE_FIELD: { + + } break; + case DSC_FT_FADEOUT_FIELD: { + + } break; + case DSC_FT_EYE_ANIM: { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + int32_t v115 = (int32_t)data[1]; + int32_t duration_int = (int32_t)data[2]; + + float_t duration; + if (duration_int != -1) + duration = (float_t)duration_int * 0.001f * 60.0f; + else + duration = 6.0f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + duration /= a1->anim_frame_speed; + + float_t offset = 0.0f; + //if (a1->pv_game->data.pv->is_old_pv) + // offset = 1.0f; + + rob_chr->set_eyelid_mottbl_motion_from_face(v115, duration, -1.0f, offset, aft_mot_db); + } break; + case DSC_FT_MOUTH_ANIM: { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + int32_t mouth_anim_id = (int32_t)data[2]; + int32_t duration_int = (int32_t)data[3]; + int32_t value_int = (int32_t)data[4]; + + float_t duration; + if (duration_int != -1) { + duration = (float_t)duration_int * 0.001f * 60.0f; + if (duration < 0.0f) + duration = 0.0f; + } + else + duration = 6.0f; + + float_t value; + if (value_int != -1) { + value = (float_t)value_int * 0.001f; + if (value < 0.0f || value > 1.0f) + value = 1.0f; + } + else + value = 1.0f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + switch (mouth_anim_id) { + case 4: mouth_anim_id = 34; break; + case 5: mouth_anim_id = 35; break; + case 6: mouth_anim_id = 36; break; + case 7: mouth_anim_id = 37; break; + case 8: mouth_anim_id = 38; break; + case 9: mouth_anim_id = 39; break; + case 10: mouth_anim_id = 4; break; + case 11: mouth_anim_id = 5; break; + case 12: mouth_anim_id = 6; break; + case 13: mouth_anim_id = 7; break; + case 14: mouth_anim_id = 8; break; + case 15: mouth_anim_id = 9; break; + case 16: mouth_anim_id = 10; break; + case 17: mouth_anim_id = 11; break; + case 18: mouth_anim_id = 12; break; + case 19: mouth_anim_id = 13; break; + case 20: mouth_anim_id = 14; break; + case 21: mouth_anim_id = 15; break; + case 22: mouth_anim_id = 16; break; + case 23: mouth_anim_id = 17; break; + case 24: mouth_anim_id = 18; break; + case 25: mouth_anim_id = 19; break; + case 26: mouth_anim_id = 20; break; + case 27: mouth_anim_id = 21; break; + case 28: mouth_anim_id = 22; break; + case 29: mouth_anim_id = 40; break; + case 30: mouth_anim_id = 41; break; + case 31: mouth_anim_id = 42; break; + default: printf(""); break; + } + + int32_t mottbl_index = mouth_anim_id_to_mottbl_index(mouth_anim_id); + duration /= a1->anim_frame_speed; + + //if (a1->pv_game->data.field_2D090 && mottbl_index != 144) + // value = 0.0f; + + float_t offset = 0.0f; + //if (a1->pv_game->data.pv->is_old_pv) + // offset = 1.0f; + + rob_chr->set_mouth_mottbl_motion(0, mottbl_index, value, + 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); + } break; + case DSC_FT_HAND_ANIM: { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + int32_t hand_index = (int32_t)data[1]; + int32_t hand_anim_id = (int32_t)data[2]; + int32_t duration_int = (int32_t)data[3]; + int32_t value_int = (int32_t)data[4]; + + float_t duration; + if (duration_int != -1) { + duration = (float_t)duration_int * 0.001f * 60.0f; + if (duration < 0.0f) + duration = 0.0f; + } + else + duration = 0.0f; + + float_t value; + if (value_int != -1) { + value = (float_t)value_int * 0.001f; + if (value < 0.0f || value > 1.0f) + value = 1.0f; + } + else + value = 1.0f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + int32_t mottbl_index = hand_anim_id_to_mottbl_index(hand_anim_id); + duration /= a1->anim_frame_speed; + + float_t offset = 0.0f; + //if (a1->pv_game->data.pv->is_old_pv) + // offset = 1.0f; + + switch (hand_index) { + case 0: + rob_chr->set_hand_l_mottbl_motion(0, mottbl_index, value, + 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); + break; + case 1: + rob_chr->set_hand_r_mottbl_motion(0, mottbl_index, value, + 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); + break; + } + } break; + case DSC_FT_LOOK_ANIM: { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + int32_t look_anim_id = (int32_t)data[1]; + int32_t duration_int = (int32_t)data[2]; + int32_t value_int = (int32_t)data[3]; + + float_t duration; + if (duration_int != -1) { + duration = (float_t)duration_int * 0.001f * 60.0f; + if (duration < 0.0f) + duration = 0.0f; + } + else + duration = 6.0f; + + float_t value; + if (value_int != -1) { + value = (float_t)value_int * 0.001f; + if (value < 0.0f || value > 1.0f) + value = 1.0f; + } + else + value = 1.0f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + int32_t mottbl_index = look_anim_id_to_mottbl_index(look_anim_id); + duration /= a1->anim_frame_speed; + + float_t offset = 0.0f; + //if (a1->pv_game->data.pv->is_old_pv) + // offset = 1.0f; + + rob_chr->set_eyes_mottbl_motion(0, mottbl_index, value, + mottbl_index == 224 ? 1 : 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); + return 1; + } break; + case DSC_FT_EXPRESSION: { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + int32_t expression_id = (int32_t)data[1]; + int32_t duration_int = (int32_t)data[2]; + int32_t value_int = (int32_t)data[3]; + + float_t duration; + if (duration_int != -1) { + duration = (float_t)duration_int * 0.001f * 60.0f; + if (duration < 0.0f) + duration = 0.0f; + } + else + duration = 0.0f; + + float_t value; + if (value_int != -1) { + value = (float_t)value_int * 0.001f; + if (value < 0.0f || value > 1.0f) + value = 1.0f; + } + else + value = 1.0f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + int32_t mottbl_index = expression_id_to_mottbl_index(expression_id); + duration /= a1->anim_frame_speed; + + bool v168 = true; + //if (a1->has_perf_id && (a1->pv_game->data.pv->edit - 1) <= 1) + // v168 = false; + + float_t offset = 0.0f; + //if (a1->pv_game->data.pv->is_old_pv) + // offset = 1.0f; + + rob_chr->set_face_mottbl_motion(0, mottbl_index, value, mottbl_index >= 214 + && mottbl_index <= 223 ? 1 : 0, duration, 0.0f, 1.0f, -1, offset, v168, aft_mot_db); + } break; + case DSC_FT_LOOK_CAMERA: { + + } break; + case DSC_FT_LYRIC: { + + } break; + case DSC_FT_MUSIC_PLAY: { + + } break; + case DSC_FT_MODE_SELECT: { + + } break; + case DSC_FT_EDIT_MOTION: { + + } break; + case DSC_FT_BAR_TIME_SET: { + int32_t bpm = (int32_t)data[0]; + } break; + case DSC_FT_SHADOWHEIGHT: { + a1->chara_id = data[0]; + } break; + case DSC_FT_EDIT_FACE: + case DSC_FT_EDIT_EXPRESSION: { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + int32_t expression_id = (int32_t)data[0]; + + float_t duration = 0.0f; + if (func == DSC_FT_EDIT_EXPRESSION) + duration = (float_t)(int32_t)data[1] * 0.001f * 60.0f; + + int32_t v234 = -1; + //if (!a1->has_perf_id) + // v234 = data[1]; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + int32_t mottbl_index = expression_id_to_mottbl_index(expression_id); + duration /= a1->anim_frame_speed; + + bool v237 = true; + //if (a1->has_perf_id) + // v237 = (a1->pv_game->data.pv->edit - 1) > 1; + + float_t offset = 0.0f; + //if (a1->pv_game->data.pv->is_old_pv) + // offset = 1.0f; + + rob_chr->set_face_mottbl_motion(0, mottbl_index, 1.0f, mottbl_index >= 214 + && mottbl_index <= 223 ? 1 : 0, duration, 0.0f, 1.0f, -1, offset, v237, aft_mot_db); + + /*if (!a1->has_perf_id) { + int32_t mottbl_index = mouth_anim_id_to_mottbl_index(v234); + + float_t value = 1.0f; + //if (a1->pv_game->data.field_2D090 && mottbl_index != 144) + // value = 0.0f; + + rob_chr->set_mouth_mottbl_motion(0, mottbl_index, value, 0, + a1->target_anim_fps * 0.1f, 0.0f, 1.0f, -1, offset, aft_mot_db); + }*/ + } break; + case DSC_FT_MOVE_CAMERA: { + + } break; + case DSC_FT_PV_END: { + a1->pv_end = true; + } break; + case DSC_FT_SHADOWPOS: { + a1->chara_id = (int32_t)data[0]; + } break; + case DSC_FT_EDIT_LYRIC: { + + } break; + case DSC_FT_EDIT_TARGET: { + + } break; + case DSC_FT_EDIT_MOUTH: { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + int32_t mouth_anim_id = (int32_t)data[1]; + float_t duration = 0.1f; + //if (func == DSC_EDIT_MOUTH_ANIM) + // duration = (float_t)(int32_t)data[2] * 0.001f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + int32_t mottbl_index = mouth_anim_id_to_mottbl_index(mouth_anim_id); + duration *= a1->target_anim_fps; + + float_t value = 1.0f; + //if (a1->pv_game->data.field_2D090 && mottbl_index != 144) + // value = 0.0f; + + float_t offset = 0.0f; + //if (a1->pv_game->data.pv->is_old_pv) + // offset = 1.0f; + + rob_chr->set_mouth_mottbl_motion(0, mottbl_index, value, + 0, duration, 0.0f, 1.0f, -1, offset, aft_mot_db); + } break; + case DSC_FT_SET_CHARA: { + a1->chara_id = (int32_t)data[0]; + } break; + case DSC_FT_EDIT_MOVE: { + + } break; + case DSC_FT_EDIT_SHADOW: { + + } break; + case DSC_FT_EDIT_EYELID: { + + } break; + case DSC_FT_EDIT_EYE: { + + } break; + case DSC_FT_EDIT_ITEM: { + + } break; + case DSC_FT_EDIT_EFFECT: { + + } break; + case DSC_FT_EDIT_DISP: { + + } break; + case DSC_FT_EDIT_HAND_ANIM: { + + } break; + case DSC_FT_AIM: { + a1->chara_id = (int32_t)data[0]; + } break; + case DSC_FT_HAND_ITEM: { + + } break; + case DSC_FT_EDIT_BLUSH: { + + } break; + case DSC_FT_NEAR_CLIP: { + + } break; + case DSC_FT_CLOTH_WET: { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + float_t value = (float_t)(int32_t)data[1] * 0.001f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + rob_chr->item_equip->wet = clamp(value, 0.0f, 1.0f); + } break; + case DSC_FT_LIGHT_ROT: { + + } break; + case DSC_FT_SCENE_FADE: { + + } break; + case DSC_FT_TONE_TRANS: { + vec3 start; + vec3 end; + start.x = (float_t)(int32_t)data[0] * 0.001f; + start.y = (float_t)(int32_t)data[1] * 0.001f; + start.z = (float_t)(int32_t)data[2] * 0.001f; + end.x = (float_t)(int32_t)data[3] * 0.001f; + end.y = (float_t)(int32_t)data[4] * 0.001f; + end.z = (float_t)(int32_t)data[5] * 0.001f; + rctx_ptr->post_process.tone_map->set_tone_trans(start, end); + } break; + case DSC_FT_SATURATE: { + float_t value = (float_t)(int32_t)data[0] * 0.001f; + rctx_ptr->post_process.tone_map->set_saturate_coeff(value); + } break; + case DSC_FT_FADE_MODE: { + int32_t value = data[0]; + rctx_ptr->post_process.tone_map->set_scene_fade_blend_func(value); + } break; + case DSC_FT_AUTO_BLINK: { + + } break; + case DSC_FT_PARTS_DISP: { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + item_id id = (item_id)data[1]; + int32_t disp = (int32_t)data[2]; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + rob_chr->set_parts_disp(id, disp == 1); + } break; + case DSC_FT_TARGET_FLYING_TIME: { + + } break; + case DSC_FT_CHARA_SIZE: { + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + int32_t chara_size = (int32_t)data[1]; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + return 1; + + int32_t chara_size_index; + if (chara_size == 0) + chara_size_index = chara_init_data_get_chara_size_index(rob_chr->chara_index); + else if (chara_size == 1) { + chara_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; + + //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) + chara_size_index = rob_chr->pv_data.chara_size_index; + else { + rob_chr->set_chara_size((float_t)chara_size / 1000.0f/*a1->field_2C54C*/); + break; + } + + if (chara_size_index < 0 || chara_size_index > 4) + break; + + rob_chr->set_chara_size(chara_size_table_get_value(chara_size_index)); + rob_chr->set_chara_pos_adjust_y(chara_pos_adjust_y_table_get_value(chara_size_index)); + } break; + case DSC_FT_CHARA_HEIGHT_ADJUST: { + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + int32_t height_adjust = (int32_t)data[1]; + + rob_chara* rob_chr = playdata->rob_chr; + if (rob_chr) + rob_chr->set_chara_height_adjust(height_adjust != 0); + } break; + case DSC_FT_ITEM_ANIM: { + + } break; + case DSC_FT_CHARA_POS_ADJUST: { + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + vec3 pos; + pos.x = (float_t)(int32_t)data[2] * 0.001f; + pos.y = (float_t)(int32_t)data[3] * 0.001f; + pos.z = (float_t)(int32_t)data[4] * 0.001f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + mat4 scene_rot_mat = a1->scene_rot_mat; + mat4_mult_vec3_trans(&scene_rot_mat, &pos, &pos); + rob_chr->set_chara_pos_adjust(&pos); + + /*if (rob_chara_check_for_ageageagain_module(rob_chr->chara_index, rob_chr->module_index)) { + sub_1405430F0(rob_chr->chara_id, 1); + sub_1405430F0(rob_chr->chara_id, 2); + }*/ + } break; + case DSC_FT_SCENE_ROT: { + float_t scene_rot_y = (float_t)(int32_t)data[0] * 0.001f; + a1->scene_rot_y = scene_rot_y; + + mat4 scene_rot_mat = a1->scene_rot_mat; + mat4_rotate_y(scene_rot_y * DEG_TO_RAD_FLOAT, &scene_rot_mat); + a1->scene_rot_mat = scene_rot_mat; + } break; + case DSC_FT_EDIT_MOT_SMOOTH_LEN: { + + } break; + case DSC_FT_PV_BRANCH_MODE: { + int32_t branch_mode = (int32_t)data[0]; + if (branch_mode >= 0 && branch_mode <= 2) + a1->branch_mode = branch_mode; + } break; + case DSC_FT_DATA_CAMERA_START: { + + } break; + case DSC_FT_MOVIE_PLAY: { + + } break; + case DSC_FT_MOVIE_DISP: { + + } break; + case DSC_FT_WIND: { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + float_t wind_strength_kami = (float_t)(int32_t)data[1] * 0.001f; + float_t wind_strength_outer = (float_t)(int32_t)data[2] * 0.001f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + rob_chr->item_equip->wind_strength = wind_strength_outer; + } break; + case DSC_FT_OSAGE_STEP: { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + float_t osage_step_kami = (float_t)(int32_t)data[1] * 0.001f; + float_t osage_step_outer = (float_t)(int32_t)data[2] * 0.001f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + rob_chr->set_osage_step(osage_step_outer); + } break; + case DSC_FT_OSAGE_MV_CCL: { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + a1->chara_id = (int32_t)data[0]; + pv_play_data* playdata = &a1->playdata[a1->chara_id]; + + float_t osage_mv_ccl_kami = (float_t)(int32_t)data[1] * 0.001f; + float_t osage_mv_ccl_outer = (float_t)(int32_t)data[2] * 0.001f; + + rob_chara* rob_chr = playdata->rob_chr; + if (!rob_chr) + break; + + rob_chr->set_osage_move_cancel(1, osage_mv_ccl_kami); + rob_chr->set_osage_move_cancel(2, osage_mv_ccl_outer); + } break; + case DSC_FT_CHARA_COLOR: { + + } break; + case DSC_FT_SE_EFFECT: { + + } break; + case DSC_FT_EDIT_MOVE_XYZ: { + + } break; + case DSC_FT_EDIT_EYELID_ANIM: { + + } break; + case DSC_FT_EDIT_INSTRUMENT_ITEM: { + + } break; + case DSC_FT_EDIT_MOTION_LOOP: { + + } break; + case DSC_FT_EDIT_EYE_ANIM: { + + } break; + case DSC_FT_EDIT_MOUTH_ANIM: { + + } break; + case DSC_FT_EDIT_CAMERA: { + + } break; + case DSC_FT_EDIT_MODE_SELECT: { + + } break; + case DSC_FT_PV_END_FADEOUT: { + + } break; + case DSC_FT_TARGET_FLAG: { + + } break; + case DSC_FT_ITEM_ANIM_ATTACH: { + + } break; + case DSC_FT_SHADOW_RANGE: { + + } break; + case DSC_FT_HAND_SCALE: { + + } break; + case DSC_FT_LIGHT_POS: { + + } break; + case DSC_FT_FACE_TYPE: { + + } break; + case DSC_FT_SHADOW_CAST: { + + } break; + case DSC_FT_EDIT_MOTION_F: { + + } break; + case DSC_FT_FOG: { + + } break; + case DSC_FT_BLOOM: { + + } break; + case DSC_FT_COLOR_COLLE: { + + } break; + case DSC_FT_DOF: { + + } break; + case DSC_FT_CHARA_ALPHA: { + a1->chara_id = (int32_t)data[0]; + + float_t alpha = (float_t)(int32_t)data[1] * 0.001f; + float_t duration = (float_t)(int32_t)data[2]; + int32_t type = (int32_t)data[3]; + + if (a1->chara_id >= 0 && a1->chara_id < ROB_CHARA_COUNT) { + pv_param::chara_alpha& chara_alpha + = pv_param_task::post_process_task.chara_alpha.data.data[a1->chara_id]; + chara_alpha.type = type; + chara_alpha.frame = 0.0f; + chara_alpha.alpha = alpha; + chara_alpha.duration = duration; + } + } break; + case DSC_FT_AOTO_CAP: { + + } break; + case DSC_FT_MAN_CAP: { + + } break; + case DSC_FT_TOON: { + + } break; + case DSC_FT_SHIMMER: { + + } break; + case DSC_FT_ITEM_ALPHA: { + a1->chara_id = (int32_t)data[0]; + + float_t alpha = (float_t)(int32_t)data[1] * 0.001f; + float_t duration = (float_t)(int32_t)data[2]; + int32_t type = (int32_t)data[3]; + + if (a1->chara_id >= 0 && a1->chara_id < ROB_CHARA_COUNT) { + pv_param::chara_alpha& chara_item_alpha + = pv_param_task::post_process_task.chara_item_alpha.data.data[a1->chara_id]; + chara_item_alpha.type = type; + chara_item_alpha.frame = 0.0f; + chara_item_alpha.alpha = alpha; + chara_item_alpha.duration = duration; + } + } break; + case DSC_FT_MOVIE_CUT_CHG: { + + } break; + case DSC_FT_CHARA_LIGHT: { + + } break; + case DSC_FT_STAGE_LIGHT: { + + } break; + case DSC_FT_AGEAGE_CTRL: { + + } break; + } + return true; +} + +static void pv_game_reset_field(pv_game* pvgm) { + task_stage_info v14; + task_stage_set_stage(&v14); + Glitter::glt_particle_manager.FreeScenes(); +} + +static dsc_data* sub_1401216D0(pv_game* a1, dsc_ft_func func_name, + int32_t* time, int32_t* pv_branch_mode, dsc_data* start, dsc_data* end) { + int32_t _time = -1; + for (dsc_data* i = start; i != end; i++) + if (i->func == DSC_FT_END) + break; + else if (i->func == DSC_FT_TIME) { + uint32_t* data = a1->dsc_m.get_func_data(i); + _time = (int32_t)data[0]; + } + else if (i->func == DSC_FT_PV_END) + break; + else if (i->func == DSC_FT_PV_BRANCH_MODE) { + if (pv_branch_mode) { + uint32_t* data = a1->dsc_m.get_func_data(i); + *pv_branch_mode = (int32_t)data[0]; + } + } + else if (i->func == func_name) { + if (time) + *time = _time; + return i; + } + return 0; +} + +static void sub_140121A80(pv_game* a1, int32_t chara_id) { + if (chara_id < 0 || chara_id >= ROB_CHARA_COUNT) + return; + + int32_t pv_branch_mode = 0; + int32_t time = -1; + int32_t prev_time = -1; + a1->playdata[chara_id].field_38.set_item.clear(); + + dsc_data* i = a1->dsc_m.data.data(); + dsc_data* i_end = a1->dsc_m.data.data() + a1->dsc_m.data.size(); + while(true) { + i = sub_1401216D0(a1, DSC_FT_ITEM_ANIM, &time, &pv_branch_mode, i, i_end); + if (!i) + break; + + if (time < 0) { + time = prev_time; + if (prev_time < 0) + break; + } + + uint32_t* data = a1->dsc_m.get_func_data(i); + if (chara_id == data[0] && data[2] == 2) { + dsc_set_item v14; + v14.item_index = data[1]; + v14.time = time; + v14.pv_branch_mode = pv_branch_mode; + a1->playdata[chara_id].field_38.set_item.push_back(v14); + } + prev_time = time; + i++; + } +} + +static void sub_140122770(pv_game* a1, int32_t chara_id) { + if (chara_id < 0 || chara_id >= ROB_CHARA_COUNT) + return; + + int32_t pv_branch_mode = 0; + int32_t time = -1; + int32_t prev_time = -1; + a1->playdata[chara_id].field_38.set_motion.clear(); + + dsc_data* i = a1->dsc_m.data.data(); + dsc_data* i_end = a1->dsc_m.data.data() + a1->dsc_m.data.size(); + while (true) { + i = sub_1401216D0(a1, DSC_FT_SET_MOTION, &time, &pv_branch_mode, i, i_end); + if (!i) + break; + + if (time < 0) { + time = prev_time; + if (prev_time < 0) + break; + } + + uint32_t* data = a1->dsc_m.get_func_data(i); + if (chara_id == data[0]) { + dsc_set_motion v14; + v14.motion_index = data[1]; + v14.time = time; + v14.pv_branch_mode = pv_branch_mode; + a1->playdata[chara_id].field_38.set_motion.push_back(v14); + } + prev_time = time; + i++; + } +} +#endif diff --git a/src/CLOUD/pv_game.hpp b/src/CLOUD/pv_game.hpp new file mode 100644 index 00000000..4f0bd699 --- /dev/null +++ b/src/CLOUD/pv_game.hpp @@ -0,0 +1,351 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#if defined(CLOUD_DEV) +#pragma once + +#include +#include +#include +#include +#include +#include +#include "../KKdLib/dsc.hpp" +#include "../CRE/auth_3d.hpp" +#include "../CRE/pv_db.hpp" +#include "../CRE/rob.hpp" +#include "../CRE/stage.hpp" +#include "../CRE/task.hpp" +#include "classes.h" + +struct pv_play_data_set_motion { + float_t frame_speed; + int32_t motion_id; + float_t frame; + float_t duration; + bool field_10; + MotionBlendType blend_type; + bool disable_eye_motion; + int32_t motion_index; + int64_t dsc_time; + float_t dsc_frame; +}; + +struct pv_play_data_motion { + bool enable; + int32_t motion_index; + int64_t time; +}; + +struct dsc_set_item { + int32_t time; + int32_t item_index; + int32_t pv_branch_mode; +}; + +struct dsc_set_motion { + int32_t time; + int32_t motion_index; + int32_t pv_branch_mode; +}; + +struct struc_104 { + rob_chara* rob_chr; + float_t current_time; + float_t duration; + vec3 start_pos; + vec3 end_pos; + float_t start_rot; + float_t end_rot; + float_t mot_smooth_len; + std::vector set_motion; + std::vector set_item; + + struc_104(); + ~struc_104(); + + void reset(); +}; + +struct pv_play_data { + std::vector motion; + rob_chara* rob_chr; + std::list set_motion; + bool disp; + struc_104 field_38; + + pv_play_data(); + ~pv_play_data(); + + void reset(); +}; + +struct pv_disp2d { + int32_t pv_id; + int32_t title_start_2d_field; + int32_t title_end_2d_field; + int32_t title_start_2d_low_field; + int32_t title_end_2d_low_field; + int32_t title_start_3d_field; + int32_t title_end_3d_field; + bool target_shadow_type; + int32_t pv_spr_set_id; + int32_t pv_aet_set_id; + int32_t pv_main_aet_id; + std::string title_2d_layer; + + pv_disp2d(); + virtual ~pv_disp2d(); +}; + +struct pv_game_data { + //struc_490 field_0; + //struc_155 field_2C838; + int field_2CE98; + char field_2CE9C[128]; + int field_2CF1C; + char field_2CF20; + int field_2CF24; + float_t field_2CF28; + float_t field_2CF2C; + int field_2CF30; + int field_2CF34; + int field_2CF38; + int32_t life_gauge; + int32_t score_final; + int32_t challenge_time_total_bonus; + int32_t combo; + int32_t challenge_time_combo_count; + int32_t max_combo; + int32_t total_hit_count[5]; + int32_t hit_count[5]; + int32_t current_reference_score; + int32_t target_count; + int field_2CF84; + int field_2CF88; + float_t field_2CF8C; + int32_t score_slide_chain_bonus; + int32_t slide_chain_length; + int field_2CF98; + int field_2CF9C; + __int16 field_2CFA0; + int field_2CFA4; + pv_db_pv* pv; + int field_2CFB0; + int field_2CFB4; + int32_t reference_score; + int field_2CFBC; + int field_2CFC0; + int field_2CFC4; + std::vector field_2CFC8; + int field_2CFE0; + int field_2CFE4; + size_t notes_passed; + int field_2CFF0; + float_t score_percentage; + float_t score_percentage_clear; + float_t score_percentage_border; + int32_t life_gauge_safety_time; + int32_t life_gauge_border; + int field_2D008; + char field_2D00C; + bool no_fail; + char field_2D00E; + bool field_2D00F; + int64_t challenge_time_start; + int64_t challenge_time_end; + uint64_t max_time; + float_t max_time_float; + float_t current_time_float; + uint64_t current_time; + float_t current_time_float_dup; + float_t field_2D03C; + int32_t score_hold_multi; + uint32_t score_hold; + int32_t score_slide; + uint8_t field_2D04C; + uint8_t chance_time_endede; + pv_disp2d* pv_disp2d; + int32_t life_gauge_final; + bool hit_border; + char field_2D05D; + char field_2D05E; + char field_2D05F; + char field_2D060; + char field_2D061; + char field_2D062; + char field_2D063; + bool field_2D064; + char field_2D065; + char field_2D066[2]; + char field_2D068; + char field_2D069; + char field_2D06A[2]; + int field_2D06C; + uint32_t field_2D070; + int field_2D074; + int field_2D078; + int field_2D07C; + int field_2D080; + int field_2D084; + int32_t life_gauge_bonus; + int32_t life_gauge_total_bonus; + char field_2D090; + char field_2D091; + char field_2D092; + char field_2D093; + uint8_t field_2D094; + char field_2D095; + char field_2D096; + bool success; + int field_2D098; + int field_2D09C; + char field_2D0A0; + bool pv_end_fadeout; + float_t rival_percentage; + int field_2D0A8; + int field_2D0AC; + int field_2D0B0[3]; + bool field_2D0BC; + char field_2D0BD; + char field_2D0BE; + char field_2D0BF; + int field_2D0C0; + int field_2D0C4; + //struc_154 chrcam_chrmot[6]; + std::vector motion_set_ids; + std::vector motion_set_face_ids; + std::vector obj_set_itmpv; + std::vector obj_set_handitem; + std::vector chreff_auth_3d_obj_set_ids; + std::vector field_2D770; + std::vector stgpvhrc_obj_set_ids; + std::vector ex_song_ex_auth_obj_set_ids; + std::vector stage_indices; + std::vector stage_infos; + char field_2D7E8; + int field_2D7EC; + std::vector field_2D7F0; + int field_2D808; + int field_2D80C; + std::vector field_2D810; + std::vector field_2D828; + std::vector field_2D840; + int field_2D858; + float_t field_2D85C; + float_t field_2D860; + float_t field_2D864; + float_t field_2D868; + char field_2D86C; + int camera_auth_3d_uid; + int field_2D874; + bool field_2D878; + int field_2D87C; + size_t current_field; + //std::vector field_data; + char field_2D8A0; + int field_2D8A4; + __int64 field_2D8A8; + int field_2D8B0; + int field_2D8B4; + __int64 field_2D8B8; + __int64 field_2D8C0; + int field_2D8C8; + int field_2D8CC; + int field_2D8D0; + int field_2D8D4; + int field_2D8D8; + int field_2D8DC; + int field_2D8E0; + int field_2D8E4; + int field_2D8E8; + int field_2D8EC; + int field_2D8F0; + int field_2D8F4; + int field_2D8F8; + int field_2D8FC; + int field_2D900; + int field_2D904; + std::string campv_string; + std::vector campv_auth_3d_uids; + std::map campv; + int data_camera_id; + int field_2D954; + std::string itmpv_string; + std::vector itmpv_auth_3d_uids; + //std::map itmpv[6]; + std::vector field_2D9F0; + //struc_78 field_2DA08[3]; + std::vector loaded_auth_3d_uids; + char field_2DAC8; + int field_2DACC; + std::vector auth_3d_categories; + std::map auth_3d; + //std::vector chreff_auth_3d; + //std::vector chreff_auth_3d_obj; + char field_2DB28; + vec2 field_2DB2C; + int field_2DB34; + time_struct field_2DB38; + std::vector field_2DB48; + //std::vector field_2DB60; +}; + +class pv_game : public app::TaskWindow { +public: + int32_t pv_id; + + std::vector objset_load; + + int32_t state; + int32_t frame; + double_t frame_float; + int64_t time; + int32_t rob_chara_ids[ROB_CHARA_COUNT]; + + std::string pv_category; + std::string stage_category; + std::string camera_category; + + std::vector category_load; + + std::map pv_auth_3d_ids; + int32_t light_auth_3d_id; + int32_t camera_auth_3d_id; + + dsc dsc_m; + dsc_data* dsc_data_ptr; + dsc_data* dsc_data_ptr_end; + + bool play; + bool success; + int32_t chara_id; + float_t target_anim_fps; + float_t anim_frame_speed; + int64_t dsc_time; + bool pv_end; + pv_play_data playdata[ROB_CHARA_COUNT]; + float_t scene_rot_y; + mat4u scene_rot_mat; + int32_t branch_mode; + + bool pause; + bool step_frame; + + pv_game(); + virtual ~pv_game() override; + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + virtual void Disp() override; + virtual void Window() override; + + void Load(int32_t pv_id, chara_index charas[6], int32_t modules[6]); + void Unload(); +}; + +extern pv_game pv_game_data; + +#endif diff --git a/src/CLOUD/render.c b/src/CLOUD/render.c index abf308ef..d0db9579 100644 --- a/src/CLOUD/render.c +++ b/src/CLOUD/render.c @@ -23,22 +23,24 @@ #include "../CRE/light_param.hpp" #include "../CRE/lock.h" #include "../CRE/object.hpp" +#include "../CRE/pv_db.hpp" #include "../CRE/rob.hpp" #include "../CRE/shader.h" #include "../CRE/shader_ft.h" -#include "../CRE/shader_glsl.h" +#include "../CRE/shader_glsl.hpp" #include "../CRE/stage.hpp" #include "../CRE/static_var.h" #include "../CRE/task.hpp" #include "../CRE/texture.hpp" #include "../CRE/timer.h" #include "../CRE/post_process.hpp" -#include "../KKdLib/io/path.h" +#include "../KKdLib/io/path.hpp" #include "../KKdLib/database/item_table.hpp" #include "../KKdLib/sort.hpp" -#include "../KKdLib/str_utils.h" +#include "../KKdLib/str_utils.hpp" #include "classes/imgui_helper.h" #include "input.hpp" +#include "pv_game.hpp" #include "x_pv_game.hpp" #include @@ -103,7 +105,7 @@ int32_t width; int32_t height; static const double_t aspect = 16.0 / 9.0; -vec3 clear_color; +vec4u8 clear_color; bool set_clear_color; bool light_chara_ambient; @@ -407,7 +409,7 @@ static render_context* render_load() { object_storage_init(aft_obj_db); item_table_array_init(); - task_work_init(); + app::task_work_init(); rob_init(); auth_3d_data_init(); light_param_storage_data_init(); @@ -557,16 +559,15 @@ static render_context* render_load() { " gl_FragDepth = texelFetch(g_depth, ivec2(gl_FragCoord.xy), 0).r;\n" "}\n"; - shader_glsl_param param; - memset(¶m, 0, sizeof(shader_glsl_param)); + shader_glsl_param param = {}; param.name = "Cube Line"; cube_line_shader.load(cube_line_vert_shader, cube_line_frag_shader, 0, ¶m); - memset(¶m, 0, sizeof(shader_glsl_param)); + param = {}; param.name = "Cube Line Point"; cube_line_point_shader.load(cube_line_point_vert_shader, cube_line_point_frag_shader, 0, ¶m); - memset(¶m, 0, sizeof(shader_glsl_param)); + param = {}; param.name = "Grid"; grid_shader.load(grid_vert_shader, grid_frag_shader, 0, ¶m); @@ -577,9 +578,11 @@ static render_context* render_load() { render_resize_fb(rctx, true); + task_pv_db_append_task(); task_auth_3d_append_task(); - TaskWork::AppendTask(&Glitter::glt_particle_manager, "GLITTER_TASK", 2); - TaskWork::AppendTask(&x_pv_game_data, "X_PV_GAME", 0); + app::TaskWork::AppendTask(&Glitter::glt_particle_manager, "GLITTER_TASK", 2); + //app::TaskWork::AppendTask(&pv_game_data, "PV_GAME", 0); + app::TaskWork::AppendTask(&x_pv_game_data, "X_PV_GAME", 0); task_rob_manager_append_task(); aft_data->load_file(aft_data, "rom/", "chritm_prop.farc", item_table_array_load_file); @@ -603,7 +606,7 @@ static render_context* render_load() { for (int32_t i = 0; i < 30; i++) { timer_start_of_cycle(&render_timer); lock_lock(&render_lock); - TaskWork::Ctrl(); + app::TaskWork::Ctrl(); file_handler_storage_ctrl(); lock_unlock(&render_lock); timer_end_of_cycle(&render_timer); @@ -732,28 +735,45 @@ static render_context* render_load() { ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplOpenGL3_Init("#version 430"); - clear_color = { (float_t)(96.0 / 255.0), (float_t)(96.0 / 255.0), (float_t)(96.0 / 255.0) }; + clear_color = { 0x60, 0x60, 0x60, 0xFF }; set_clear_color = true; - chara_index charas[6]; - charas[5] = CHARA_MIKU; - charas[1] = CHARA_RIN; - charas[2] = CHARA_LEN; - charas[3] = CHARA_LUKA; - charas[4] = CHARA_KAITO; - charas[0] = CHARA_MEIKO; + /*chara_index charas[6]; + charas[0] = CHARA_MIKU; + charas[1] = CHARA_MIKU;//CHARA_RIN; + charas[2] = CHARA_MIKU;//CHARA_LEN; + charas[3] = CHARA_MIKU;//CHARA_LUKA; + charas[4] = CHARA_MIKU;//CHARA_KAITO; + charas[5] = CHARA_MIKU;//CHARA_MEIKO; int32_t modules[6]; - modules[5] = 168; + modules[0] = 0;//168; modules[1] = 0;//46; modules[2] = 0;//39; - modules[3] = 41; - modules[4] = 40; - modules[0] = 0;//31; - x_pv_game_data.Load(822, 22, charas, modules); + modules[3] = 0;//41; + modules[4] = 0;//40; + modules[5] = 0;//31; + pv_game_data.Load(739, charas, modules);*/ - shader_env_vert_set_ptr(&shaders_ft, 3, &vec4_identity); - shader_env_vert_set_ptr(&shaders_ft, 4, &vec4_null); + chara_index charas[6]; + charas[0] = CHARA_MIKU; + charas[1] = CHARA_MIKU;//CHARA_RIN; + charas[2] = CHARA_MIKU;//CHARA_LEN; + charas[3] = CHARA_MIKU;//CHARA_LUKA; + charas[4] = CHARA_MIKU;//CHARA_KAITO; + charas[5] = CHARA_MIKU;//CHARA_MEIKO; + + int32_t modules[6]; + modules[0] = 0;//168; + modules[1] = 0;//46; + modules[2] = 0;//39; + modules[3] = 0;//41; + modules[4] = 0;//40; + modules[5] = 0;//31; + x_pv_game_data.Load(826, 26, charas, modules); + + shaders_ft.env_vert_set(3, vec4_identity); + shaders_ft.env_vert_set(4, vec4_null); classes_process_init(classes, classes_count, rctx); return rctx; } @@ -781,7 +801,7 @@ static void render_ctrl(render_context* rctx) { global_context_menu = true; lock_lock(&imgui_context_lock); ImGui::SetCurrentContext(imgui_context); - TaskWork_Window(); + app::TaskWork_Window(); classes_process_imgui(classes, classes_count); lock_unlock(&imgui_context_lock); @@ -862,8 +882,8 @@ static void render_ctrl(render_context* rctx) { glBufferSubData(GL_UNIFORM_BUFFER, 0, COMMON_DATA_SIZE, &common_data); gl_state_bind_uniform_buffer(0); - shader_glsl_set_mat4(&cube_line_shader, "vp", false, cam->view_projection); - shader_glsl_set_mat4(&cube_line_point_shader, "vp", false, cam->view_projection); + cube_line_shader.set("vp", false, cam->view_projection); + cube_line_point_shader.set("vp", false, cam->view_projection); } static void cube_line_draw(shader_glsl* shader, camera* cam, vec3* trans, float_t line_size, vec4* color) { @@ -895,7 +915,7 @@ static void cube_line_draw(shader_glsl* shader, camera* cam, vec3* trans, float_ vec3_add(trans[1], norm[0], vert_trans[2]); vec3_add(trans[1], norm[1], vert_trans[3]); - shader_glsl_set_vec4(shader, "color", *color); + shader->set("color", *color); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vert_trans), vert_trans); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -943,10 +963,10 @@ static void render_draw(render_context* rctx) { gl_state_set_depth_mask(GL_FALSE); if (set_clear_color) { - vec4 color; - *(vec3*)&color = clear_color; - color.w = 1.0f; - glClearBufferfv(GL_COLOR, 0, (GLfloat*)&color); + vec4 _clear_color; + vec4u8_to_vec4(clear_color, _clear_color); + vec4_mult_scalar(_clear_color, (float_t)(1.0 / 255.0), _clear_color); + glClearBufferfv(GL_COLOR, 0, (GLfloat*)&_clear_color); } camera_update(cam); @@ -1040,10 +1060,10 @@ static void render_draw(render_context* rctx) { gl_state_bind_vertex_array(cube_line_point_vao); cube_line_point_shader.use(); - shader_glsl_set_vec3_array(&cube_line_point_shader, "trans", 4, trans); - shader_glsl_set_float(&cube_line_point_shader, "dark_border_end", + cube_line_point_shader.set("trans", 4, trans); + cube_line_point_shader.set("dark_border_end", ((CUBE_LINE_POINT_SIZE - (CUBE_LINE_SIZE * 1.125f)) / (2.0f * CUBE_LINE_POINT_SIZE))); - shader_glsl_set_float(&cube_line_point_shader, "dark_border_start", + cube_line_point_shader.set("dark_border_start", (1.0f - ((CUBE_LINE_POINT_SIZE - (CUBE_LINE_SIZE * 1.125f)) / (2.0f * CUBE_LINE_POINT_SIZE)))); glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, (GLsizei)cube_line_points.size()); cube_line_points.clear(); @@ -1071,16 +1091,18 @@ static void render_dispose(render_context* rctx) { lock_free(&imgui_context_lock); task_rob_manager_free_task(); + //pv_game_data.SetDest(); x_pv_game_data.SetDest(); Glitter::glt_particle_manager.SetDest(); task_auth_3d_free_task(); + task_pv_db_free_task(); //rob_chara_array_free_chara_id(0); timer_reset(&render_timer); for (int32_t i = 0; i < 30; i++) { timer_start_of_cycle(&render_timer); lock_lock(&render_lock); - TaskWork::Ctrl(); + app::TaskWork::Ctrl(); file_handler_storage_ctrl(); lock_unlock(&render_lock); timer_end_of_cycle(&render_timer); @@ -1091,7 +1113,7 @@ static void render_dispose(render_context* rctx) { light_param_storage_data_free(); auth_3d_data_free(); rob_free(); - task_work_free(); + app::task_work_free(); item_table_array_free(); object_storage_free(); data_struct_free(); @@ -1252,7 +1274,7 @@ inline static void render_shaders_load() { } inline static void render_shaders_free() { - shader_free(&shaders_ft); + shaders_ft.unload(); } #if defined (DEBUG) && OPENGL_DEBUG diff --git a/src/CLOUD/render.h b/src/CLOUD/render.h index 6788b4e7..fb1c7bf4 100644 --- a/src/CLOUD/render.h +++ b/src/CLOUD/render.h @@ -6,8 +6,7 @@ #pragma once #include "shared.h" -#include "../KKdLib/vec.h" -#include "../KKdLib/vector.h" +#include "../KKdLib/vec.hpp" struct render_init_struct { vec2i res; diff --git a/src/CLOUD/unedat.c b/src/CLOUD/unedat.c index 3215b80e..351655ac 100644 --- a/src/CLOUD/unedat.c +++ b/src/CLOUD/unedat.c @@ -1,6 +1,6 @@ #include "unedat.h" #define AES128 -#include "../KKdLib/aes.h" +#include "../KKdLib/aes.hpp" #include "lz.h" #include @@ -150,7 +150,7 @@ void get_block_key(int block, NPD_HEADER* npd, uint8_t* dest_key) { // Also, set 'in file' to the beginning of the encrypted data, which may be offset // if inside another file, but normally just reset to beginning of file // returns number of bytes written, -1 for error -int decrypt_block(stream* in, uint8_t* out, EDAT_HEADER* edat, NPD_HEADER* npd, +int decrypt_block(stream& in, uint8_t* out, EDAT_HEADER* edat, NPD_HEADER* npd, uint8_t* crypt_key, uint32_t block_num, uint32_t total_blocks, int64_t size_left) { // Get metadata info and setup buffers. const int64_t metadata_section_size = edat->flags & (EDAT_COMPRESSED_FLAG | EDAT_FLAG_0x20) ? 0x20 : 0x10; @@ -165,17 +165,17 @@ int decrypt_block(stream* in, uint8_t* out, EDAT_HEADER* edat, NPD_HEADER* npd, uint8_t empty_iv[0x10]; memset(empty_iv, 0, 0x10); - size_t file_offset = io_get_position(in); + size_t file_offset = in.get_position(); // Decrypt the metadata. if (edat->flags & EDAT_COMPRESSED_FLAG) { metadata_sec_offset = metadata_offset + block_num * metadata_section_size; - io_set_position(in, file_offset + metadata_sec_offset, SEEK_SET); + in.set_position(file_offset + metadata_sec_offset, SEEK_SET); uint8_t metadata[0x20]; memset(metadata, 0, 0x20); - io_read(in, metadata, 0x20); + in.read(metadata, 0x20); // If the data is compressed, decrypt the metadata. // NOTE: For NPD version 1 the metadata is not encrypted. @@ -212,11 +212,11 @@ int decrypt_block(stream* in, uint8_t* out, EDAT_HEADER* edat, NPD_HEADER* npd, // If FLAG 0x20, the metadata precedes each data block. metadata_sec_offset = metadata_offset + block_num * (metadata_section_size + edat->block_size); - io_set_position(in, file_offset + metadata_sec_offset, SEEK_SET); + in.set_position(file_offset + metadata_sec_offset, SEEK_SET); uint8_t metadata[0x20]; memset(metadata, 0, 0x20); - io_read(in, metadata, 0x20); + in.read(metadata, 0x20); offset = metadata_sec_offset + 0x20; length = edat->block_size; @@ -226,7 +226,7 @@ int decrypt_block(stream* in, uint8_t* out, EDAT_HEADER* edat, NPD_HEADER* npd, } else { metadata_sec_offset = metadata_offset + (uint64_t)block_num * metadata_section_size; - io_set_position(in, file_offset + metadata_sec_offset, SEEK_SET); + in.set_position(file_offset + metadata_sec_offset, SEEK_SET); offset = metadata_offset + (uint64_t)block_num * edat->block_size + total_blocks * metadata_section_size; length = edat->block_size; @@ -243,8 +243,8 @@ int decrypt_block(stream* in, uint8_t* out, EDAT_HEADER* edat, NPD_HEADER* npd, uint8_t* enc_data = force_malloc_s(uint8_t, length); uint8_t* dec_data = force_malloc_s(uint8_t, length); - io_set_position(in, file_offset + offset, 0); - io_read(in, enc_data, length); + in.set_position(file_offset + offset, 0); + in.read(enc_data, length); // Generate a key for the current block. uint8_t b_key[16]; @@ -289,31 +289,31 @@ int decrypt_block(stream* in, uint8_t* out, EDAT_HEADER* edat, NPD_HEADER* npd, // EDAT/SDAT decryption. // reset file to beginning of data before calling -int decrypt_data(stream* in, stream* out, EDAT_HEADER* edat, NPD_HEADER* npd, unsigned char* crypt_key) { +int decrypt_data(stream& in, stream& out, EDAT_HEADER* edat, NPD_HEADER* npd, unsigned char* crypt_key) { const int total_blocks = (int)((edat->file_size + edat->block_size - 1) / edat->block_size); int64_t size_left = edat->file_size; uint8_t* data = force_malloc_s(uint8_t, edat->block_size); for (int i = 0; i < total_blocks; i++) { - io_set_position(in, 0, 0); + in.set_position(0, 0); memset(data, 0, edat->block_size); int res = decrypt_block(in, data, edat, npd, crypt_key, i, total_blocks, size_left); if (res == -1) return 1; size_left -= res; - io_write(out, data, res); + out.write(data, res); } free(data); return 0; } -void read_npd_edat_header(stream* input, NPD_HEADER* NPD, EDAT_HEADER* EDAT) { +void read_npd_edat_header(stream& input, NPD_HEADER* NPD, EDAT_HEADER* EDAT) { char npd_header[0x80]; char edat_header[0x10]; - io_read(input, npd_header, sizeof(npd_header)); - io_read(input, edat_header, sizeof(edat_header)); + input.read(npd_header, sizeof(npd_header)); + input.read(edat_header, sizeof(edat_header)); memcpy(&NPD->magic, npd_header, 0x04); NPD->version = load_reverse_endianness_int32_t(&npd_header[0x04]); @@ -331,7 +331,7 @@ void read_npd_edat_header(stream* input, NPD_HEADER* NPD, EDAT_HEADER* EDAT) { EDAT->file_size = load_reverse_endianness_int64_t(&edat_header[0x08]); } -bool extract_all_data(stream* input, stream* output, uint8_t* devKlic, uint8_t* rifKey) { +bool extract_all_data(stream& input, stream& output, uint8_t* devKlic, uint8_t* rifKey) { // Setup NPD and EDAT/SDAT structs. NPD_HEADER NPD; EDAT_HEADER EDAT; @@ -358,26 +358,26 @@ bool extract_all_data(stream* input, stream* output, uint8_t* devKlic, uint8_t* else if (NPD.license == 0x1) // Type 1: Use network activation. memcpy(key, rifKey, 0x10); - io_set_position(input, 0, 0); + input.set_position(0, 0); if (decrypt_data(input, output, &EDAT, &NPD, key)) return 1; return 0; } -void GetEdatRifKeyFromRapFile(stream* rap_file, uint8_t* rifKey) { +void GetEdatRifKeyFromRapFile(stream& rap_file, uint8_t* rifKey) { uint8_t rapKey[0x10]; - io_read(rap_file, rapKey, 0x10); + rap_file.read(rapKey, 0x10); rap_to_rif(rapKey, rifKey); } // Decrypts full file -void DecryptEDAT(stream* input, stream* output, int mode, const char* rap_file_name, uint8_t* custom_klic) { - if (!input || !output || !rap_file_name) +void DecryptEDAT(stream& input, stream& output, int mode, const char* rap_file_name, uint8_t* custom_klic) { + if (!rap_file_name) return; // Prepare the files. - io_set_position(input, 0, 0); + input.set_position(0, 0); // Set keys (RIF and DEVKLIC). uint8_t rifKey[16]; @@ -417,10 +417,9 @@ void DecryptEDAT(stream* input, stream* output, int mode, const char* rap_file_n // Read the RAP file, if provided. if (*rap_file_name) { stream rap; - io_open(&rap, rap_file_name, "rb"); + rap.open(rap_file_name, "rb"); if (rap.io.stream) - GetEdatRifKeyFromRapFile(&rap, rifKey); - io_free(&rap); + GetEdatRifKeyFromRapFile(rap, rifKey); } extract_all_data(input, output, devklic, rifKey); diff --git a/src/CLOUD/unedat.h b/src/CLOUD/unedat.h index 722272c0..9bc1a0ce 100644 --- a/src/CLOUD/unedat.h +++ b/src/CLOUD/unedat.h @@ -1,7 +1,7 @@ #pragma once -#include "../KKdLib/default.h" -#include "../KKdLib/io/stream.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/io/stream.hpp" #define SDAT_FLAG 0x01000000 #define EDAT_COMPRESSED_FLAG 0x00000001 @@ -106,5 +106,5 @@ typedef struct EDAT_HEADER { // Decrypts full file, or null/empty file extern void rap_to_rif(uint8_t* rap, uint8_t* rif); -extern void DecryptEDAT(stream* input, stream* output, int mode, const char* rap_file_name, uint8_t* custom_klic); -extern void GetEdatRifKeyFromRapFile(stream* rap_file, uint8_t* rifKey); +extern void DecryptEDAT(stream& input, stream& output, int mode, const char* rap_file_name, uint8_t* custom_klic); +extern void GetEdatRifKeyFromRapFile(stream& rap_file, uint8_t* rifKey); diff --git a/src/CLOUD/x_pv_game.cpp b/src/CLOUD/x_pv_game.cpp index 73ff505c..9cd6785a 100644 --- a/src/CLOUD/x_pv_game.cpp +++ b/src/CLOUD/x_pv_game.cpp @@ -9,11 +9,11 @@ #include #include "x_pv_game.hpp" #include "../CRE/Glitter/glitter.hpp" -#include "../CRE/light_param/light.h" +#include "../CRE/light_param/light.hpp" #include "../CRE/light_param.hpp" #include "../CRE/data.hpp" #include "../CRE/object.hpp" -#include "../CRE/pv_param_task.hpp" +#include "../CRE/pv_param.hpp" #include "../CRE/stage_modern.hpp" #include "../KKdLib/farc.hpp" #include "../KKdLib/sort.hpp" @@ -197,7 +197,7 @@ 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_map_auth_3d_to_mot(x_pv_game* xpvgm, bool add_keys); 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); @@ -210,42 +210,130 @@ static dsc_data* sub_1401216D0(x_pv_game* a1, dsc_x_func func_name, static void sub_140121A80(x_pv_game* a1, int32_t chara_id); static void sub_140122770(x_pv_game* a1, int32_t chara_id); +x_pv_game_a3da_to_mot_keys::x_pv_game_a3da_to_mot_keys() { + +} + +x_pv_game_a3da_to_mot_keys::~x_pv_game_a3da_to_mot_keys() { + +} + x_pv_game_a3da_to_mot::x_pv_game_a3da_to_mot(int32_t auth_3d_id) { this->auth_3d_id = auth_3d_id; - gblctr = -2; - n_hara = -2; - n_hara_y = -2; - j_hara_wj = -2; - n_kosi = -2; - j_mune_wj = -2; - n_mune_kl = -2; - j_mune_b_wj = -2; - j_kubi_wj = -2; - n_kao = -2; - j_kao_wj = -2; - j_eye_r_wj = -2; - j_eye_l_wj = -2; - n_waki_l = -2; - j_waki_l_wj = -2; - n_kata_l = -2; - j_kata_l_wj = -2; - j_ude_l_wj = -2; - j_te_l_wj = -2; - n_waki_r = -2; - j_waki_r_wj = -2; - n_kata_r = -2; - j_kata_r_wj = -2; - j_ude_r_wj = -2; - j_te_r_wj = -2; - j_kosi_wj = -2; - n_momo_l = -2; - j_momo_l_wj = -2; - j_sune_l_wj = -2; - j_asi_l_wj = -2; - n_momo_r = -2; - j_momo_r_wj = -2; - j_sune_r_wj = -2; - j_asi_r_wj = -2; + gblctr = -1; + n_hara = -1; + n_hara_y = -1; + j_hara_wj = -1; + n_kosi = -1; + j_mune_wj = -1; + n_mune_kl = -1; + j_mune_b_wj = -1; + j_kubi_wj = -1; + n_kao = -1; + j_kao_wj = -1; + j_kao_normal_wj = -1; + j_kao_close_wj = -1; + j_kao_smile_wj = -1; + j_kao_close_half_wj = -1; + j_kao_smile_half_wj = -1; + j_kuti_l_wj = -1; + j_kuti_u_wj = -1; + j_kuti_d_wj = -1; + j_kuti_r_wj = -1; + j_eye_r_wj = -1; + j_eye_l_wj = -1; + n_waki_l = -1; + j_waki_l_wj = -1; + n_kata_l = -1; + j_kata_l_wj = -1; + j_ude_l_wj = -1; + j_te_l_wj = -1; + j_te_sizen2_l_wj = -1; + j_te_close_l_wj = -1; + j_te_reset_l_wj = -1; + n_waki_r = -1; + j_waki_r_wj = -1; + n_kata_r = -1; + j_kata_r_wj = -1; + j_ude_r_wj = -1; + j_te_r_wj = -1; + j_te_sizen2_r_wj = -1; + j_te_close_r_wj = -1; + j_te_reset_r_wj = -1; + j_te_one_r_wj = -1; + j_kosi_wj = -1; + n_momo_l = -1; + j_momo_l_wj = -1; + j_sune_l_wj = -1; + j_asi_l_wj = -1; + n_momo_r = -1; + j_momo_r_wj = -1; + j_sune_r_wj = -1; + j_asi_r_wj = -1; +} + +x_pv_game_a3da_to_mot::~x_pv_game_a3da_to_mot() { + +} +static int32_t get_bone_index(auth_3d_object_hrc* oh, const char* name) { + uint32_t name_hash = hash_utf8_murmurhash(name); + for (auth_3d_object_node& i : oh->node) + if (hash_string_murmurhash(&i.name) == name_hash) + return (int32_t)(&i - oh->node.data()); + return -1; +} + +void x_pv_game_a3da_to_mot::get_bone_indices(auth_3d_object_hrc* oh) { + gblctr = get_bone_index(oh, "gblctr"); + n_hara = get_bone_index(oh, "n_hara"); + n_hara_y = get_bone_index(oh, "n_hara_y"); + j_hara_wj = get_bone_index(oh, "j_hara_wj"); + n_kosi = get_bone_index(oh, "n_kosi"); + j_mune_wj = get_bone_index(oh, "j_mune_wj"); + n_mune_kl = get_bone_index(oh, "n_mune_kl"); + j_mune_b_wj = get_bone_index(oh, "j_mune_b_wj"); + j_kubi_wj = get_bone_index(oh, "j_kubi_wj"); + n_kao = get_bone_index(oh, "n_kao"); + j_kao_wj = get_bone_index(oh, "j_kao_wj"); + j_kao_normal_wj = get_bone_index(oh, "j_kao_normal_wj"); + j_kao_close_wj = get_bone_index(oh, "j_kao_close_wj"); + j_kao_smile_wj = get_bone_index(oh, "j_kao_smile_wj"); + j_kao_close_half_wj = get_bone_index(oh, "j_kao_close_half_wj"); + j_kao_smile_half_wj = get_bone_index(oh, "j_kao_smile_half_wj"); + j_kuti_l_wj = get_bone_index(oh, "j_kuti_l_wj"); + j_kuti_u_wj = get_bone_index(oh, "j_kuti_u_wj"); + j_kuti_d_wj = get_bone_index(oh, "j_kuti_d_wj"); + j_kuti_r_wj = get_bone_index(oh, "j_kuti_r_wj"); + j_eye_r_wj = get_bone_index(oh, "j_eye_r_wj"); + j_eye_l_wj = get_bone_index(oh, "j_eye_l_wj"); + n_waki_l = get_bone_index(oh, "n_waki_l"); + j_waki_l_wj = get_bone_index(oh, "j_waki_l_wj"); + n_kata_l = get_bone_index(oh, "n_kata_l"); + j_kata_l_wj = get_bone_index(oh, "j_kata_l_wj"); + j_ude_l_wj = get_bone_index(oh, "j_ude_l_wj"); + j_te_l_wj = get_bone_index(oh, "j_te_l_wj"); + j_te_sizen2_l_wj = get_bone_index(oh, "j_te_sizen2_l_wj"); + j_te_close_l_wj = get_bone_index(oh, "j_te_close_l_wj"); + j_te_reset_l_wj = get_bone_index(oh, "j_te_reset_l_wj"); + n_waki_r = get_bone_index(oh, "n_waki_r"); + j_waki_r_wj = get_bone_index(oh, "j_waki_r_wj"); + n_kata_r = get_bone_index(oh, "n_kata_r"); + j_kata_r_wj = get_bone_index(oh, "j_kata_r_wj"); + j_ude_r_wj = get_bone_index(oh, "j_ude_r_wj"); + j_te_r_wj = get_bone_index(oh, "j_te_r_wj"); + j_te_sizen2_r_wj = get_bone_index(oh, "j_te_sizen2_r_wj"); + j_te_close_r_wj = get_bone_index(oh, "j_te_close_r_wj"); + j_te_reset_r_wj = get_bone_index(oh, "j_te_reset_r_wj"); + j_te_one_r_wj = get_bone_index(oh, "j_te_one_r_wj"); + j_kosi_wj = get_bone_index(oh, "j_kosi_wj"); + n_momo_l = get_bone_index(oh, "n_momo_l"); + j_momo_l_wj = get_bone_index(oh, "j_momo_l_wj"); + j_sune_l_wj = get_bone_index(oh, "j_sune_l_wj"); + j_asi_l_wj = get_bone_index(oh, "j_asi_l_wj"); + n_momo_r = get_bone_index(oh, "n_momo_r"); + j_momo_r_wj = get_bone_index(oh, "j_momo_r_wj"); + j_sune_r_wj = get_bone_index(oh, "j_sune_r_wj"); + j_asi_r_wj = get_bone_index(oh, "j_asi_r_wj"); } x_pv_game::x_pv_game() : pp(), sr(), state(), frame(), frame_float(), time(), @@ -293,6 +381,7 @@ bool x_pv_game::Ctrl() { } break; case 2: { data_struct* x_data = &data_list[DATA_X]; + data_struct* xhd_data = &data_list[DATA_XHD]; light_param_storage_data_set_pv_id(pv_id); task_stage_modern_set_data(x_data, &obj_db, &tex_db, &stage_data); @@ -301,6 +390,9 @@ bool x_pv_game::Ctrl() { for (std::pair& i : category_load) auth_3d_data_load_category(x_data, i.first.c_str(), i.second); + for (std::pair& i : effchrpv_category_load) + auth_3d_data_load_category(xhd_data, i.first.c_str(), i.second); + auth_3d_data_load_category(light_category.c_str()); for (pvpp_chara& i : pp->chara) @@ -340,6 +432,10 @@ bool x_pv_game::Ctrl() { if (!auth_3d_data_check_category_loaded(i.second)) wait_load = true; + for (std::pair& i : effchrpv_category_load) + if (!auth_3d_data_check_category_loaded(i.second)) + wait_load = true; + if (!auth_3d_data_check_category_loaded(light_category.c_str())) wait_load = true; @@ -486,7 +582,7 @@ bool x_pv_game::Ctrl() { state = 8; } break; case 8: { - TaskWork::AppendTask(&pv_param_task::post_process_task, "PV POST PROCESS TASK"); + app::TaskWork::AppendTask(&pv_param_task::post_process_task, "PV POST PROCESS TASK"); state = 9; } break; @@ -675,9 +771,8 @@ bool x_pv_game::Ctrl() { size_t size = 0; dsc_m.unparse(&data, &size); stream s; - io_open(&s, file_buf, "wb"); - io_write(&s, data, size); - io_free(&s); + s.open(file_buf, "wb"); + s.write(data, size); free(data);*/ } @@ -723,9 +818,9 @@ bool x_pv_game::Ctrl() { stage_effect.stage_effect = -1; stage_effect.next_stage_effect = -1; - frame_float = 0.0; - this->frame = 0; - this->time = 0; + frame_float = -1.0f; + this->frame = -1; + this->time = (int64_t)round(-(100000.0 / 60.0) * 10000.0); while (dsc_data_ptr != dsc_data_ptr_end && x_pv_game_dsc_process(this, this->time)) dsc_data_ptr++; @@ -783,6 +878,11 @@ bool x_pv_game::Ctrl() { break; } } + for (auto& i : effchrpv_auth_3d_rob_mot_ids) { + x_pv_game_a3da_to_mot& a2m = i.second; + auth_3d* auth = auth_3d_data_get_auth_3d(a2m.auth_3d_id); + a2m.get_bone_indices(&auth->object_hrc[0]); + } for (auto& i : effchrpv_auth_3d_mot_ids) { int32_t& id = i.second; @@ -790,15 +890,15 @@ bool x_pv_game::Ctrl() { auth_3d_data_set_camera_root_update(&id, false); auth_3d_data_set_enable(&id, true); auth_3d_data_set_paused(&id, false); - auth_3d_data_set_visibility(&id, false); - auth_3d_data_set_req_frame(&id, -1.0f); + auth_3d_data_set_visibility(&id, true); + auth_3d_data_set_req_frame(&id, -2.0f); auth_3d_data_set_frame_rate(&id, &diva_pv_frame_rate); } } if (pv_id == 826) { extern int32_t global_ctrl_frames; - global_ctrl_frames = 5110; + global_ctrl_frames = 5111; } else if (pv_id == 822) { extern int32_t global_ctrl_frames; @@ -820,7 +920,8 @@ bool x_pv_game::Ctrl() { extern float_t frame_speed; frame_speed = pause ? 0.0f : 1.0f; - frame_float += get_delta_frame(); + float_t delta_frame = get_delta_frame(); + frame_float += delta_frame; frame = (int32_t)frame_float; time = (int64_t)round(frame_float * (100000.0 / 60.0) * 10000.0); @@ -841,7 +942,7 @@ bool x_pv_game::Ctrl() { x_pv_game_stage_effect_ctrl(this); if (pv_id == 826) - x_pv_game_map_auth_3d_to_mot(this); + x_pv_game_map_auth_3d_to_mot(this, delta_frame != 0.0f && frame > 0); if (!play || pv_end) state = 11; @@ -865,9 +966,9 @@ bool x_pv_game::Dest() { 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_null); - post_process_tone_map_set_scene_fade_blend_func(rctx_ptr->post_process.tone_map, 0); + rctx_ptr->post_process.tone_map->set_saturate_coeff(1.0f); + rctx_ptr->post_process.tone_map->set_scene_fade(vec4_null); + rctx_ptr->post_process.tone_map->set_scene_fade_blend_func(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; @@ -1083,7 +1184,7 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id, chara_index charas[6], int std::string category = "A3D_" + name; uint32_t category_hash = hash_string_murmurhash(&category); - category_load.push_back({ category, category_hash }); + effchrpv_category_load.push_back({ category, category_hash }); effchrpv_auth_3d_mot_names.insert({ name, { category_hash, category } }); } } @@ -1102,7 +1203,7 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id, chara_index charas[6], int target_anim_fps = get_target_anim_fps(); anim_frame_speed = get_anim_frame_speed(); pv_end = false; - for (pv_play_data& i : playdata) + for (x_pv_play_data& i : playdata) i.reset(); scene_rot_y = 0.0f; scene_rot_mat = mat4u_identity; @@ -1146,32 +1247,30 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id, chara_index charas[6], int objset_load.push_back(stgpv_objset); objset_load.push_back(stgpvhrc_objset); - if (pv_id != 826) { - int32_t chara_index = 0; - for (pvpp_chara& i : pp->chara) { - if (!i.chara_effect_init) { - chara_index++; - continue; + chara_index = 0; + for (pvpp_chara& i : pp->chara) { + if (!i.chara_effect_init) { + chara_index++; + continue; + } + + const char* src_name = chara_index_get_auth_3d_name((::chara_index)i.chara_effect.base_chara); + const char* dst_name = chara_index_get_auth_3d_name(charas[chara_index++]); + + for (pvpp_chara_effect_a3da& j : i.chara_effect.effect_a3da) { + std::string name = j.has_object_set ? j.object_set.name : j.a3da.name; + if (name.find(src_name) == std::string::npos) { + size_t pos = name.find(dst_name); + if (pos != std::string::npos) + name.replace(pos, utf8_length(dst_name), src_name, utf8_length(src_name)); } - const char* src_name = chara_index_get_auth_3d_name((::chara_index)i.chara_effect.base_chara); - const char* dst_name = chara_index_get_auth_3d_name(charas[chara_index++]); + objset_load.push_back(hash_string_murmurhash(&name)); - for (pvpp_chara_effect_a3da& j : i.chara_effect.effect_a3da) { - std::string name = j.has_object_set ? j.object_set.name : j.a3da.name; - if (name.find(src_name) == std::string::npos) { - size_t pos = name.find(dst_name); - if (pos != std::string::npos) - name.replace(pos, utf8_length(dst_name), src_name, utf8_length(src_name)); - } - - objset_load.push_back(hash_string_murmurhash(&name)); - - std::string nam = j.has_object_set ? j.object_set.name : j.a3da.name; - nam.replace(utf8_length(buf), utf8_length(dst_name), dst_name, utf8_length(dst_name)); - if (nam != name) - objset_load.push_back(hash_string_murmurhash(&nam)); - } + std::string nam = j.has_object_set ? j.object_set.name : j.a3da.name; + nam.replace(utf8_length(buf), utf8_length(dst_name), dst_name, utf8_length(dst_name)); + if (nam != name) + objset_load.push_back(hash_string_murmurhash(&nam)); } } @@ -1219,7 +1318,221 @@ void x_pv_game::Load(int32_t pv_id, int32_t stage_id, chara_index charas[6], int Glitter::glt_particle_manager.draw_all = false; } +bool mot_write_motion(void* data, const char* path, const char* file, uint32_t hash) { + x_pv_game* xpvgm = (x_pv_game*)data; + + data_struct* aft_data = &data_list[DATA_AFT]; + bone_database* aft_bone_data = &aft_data->data_ft.bone_data; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + char buf[0x200]; + sprintf_s(buf, sizeof(buf), "PV%03d", xpvgm->pv_id); + motion_set_info* set_info = aft_mot_db->get_motion_set_by_name(buf); + if (!set_info) + return true; + + std::string mot_file = "mot_" + set_info->name + ".bin"; + + mot_set* mot_set = new ::mot_set; + { + farc f; + farc::load_file(&f, path, file, hash); + + farc_file* ff = f.read_file(mot_file.c_str()); + if (!ff) { + delete mot_set; + return true; + } + + mot_set->unpack_file(ff->data, ff->size, false); + } + + if (!mot_set->ready) { + delete mot_set; + return true; + } + + for (auto& i : xpvgm->effchrpv_auth_3d_rob_mot_ids) { + char buf[0x100]; + sprintf_s(buf, sizeof(buf), "PV826_OST_P%d_00", i.first + 1); + + int32_t motion_id = aft_mot_db->get_motion_id(buf); + + size_t motion_index = -1; + for (motion_info& j : set_info->motion) + if (j.id == motion_id) { + motion_index = &j - set_info->motion.data(); + break; + } + + mot_data* mot_data = &mot_set->vec[motion_index]; + + uint16_t key_set_count = mot_data->key_set_count - 1; + if (!key_set_count) + continue; + + const char* name = bone_database_skeleton_type_to_string(BONE_DATABASE_SKELETON_COMMON); + std::string* bone_names = aft_mot_db->bone_name.data(); + std::vector* bones = 0; + if (!aft_bone_data->get_skeleton_bones(name, &bones)) + continue; + + x_pv_game_a3da_to_mot& a2m = i.second; + const mot_bone_info* bone_info = mot_data->bone_info.data(); + for (size_t key_set_offset = 0, i = 0; key_set_offset < key_set_count; i++) { + motion_bone_index bone_index = (motion_bone_index)aft_bone_data->get_skeleton_bone_index( + name, bone_names[bone_info[i].index].c_str()); + if (bone_index == -1) { + i++; + bone_index = (motion_bone_index)aft_bone_data->get_skeleton_bone_index( + name, bone_names[bone_info[i].index].c_str()); + if (bone_index == -1) + break; + } + + bone_database_bone* bone = &(*bones)[bone_index]; + + auto elem = a2m.bone_keys.find(bone_index); + if (elem != a2m.bone_keys.end()) { + x_pv_game_a3da_to_mot_keys& keys = elem->second; + + mot_key_set_data& key_set_data_x = mot_data->key_set[key_set_offset]; + key_set_data_x.frames.clear(); + key_set_data_x.values.clear(); + key_set_data_x.type = mot_set::fit_keys_into_curve(keys.x, + key_set_data_x.frames, key_set_data_x.values); + key_set_data_x.keys_count = (uint16_t)key_set_data_x.frames.size(); + key_set_data_x.data_type = MOT_KEY_SET_DATA_F32; + + mot_key_set_data& key_set_data_y = mot_data->key_set[key_set_offset + 1]; + key_set_data_y.frames.clear(); + key_set_data_y.values.clear(); + key_set_data_y.type = mot_set::fit_keys_into_curve(keys.y, + key_set_data_y.frames, key_set_data_y.values); + key_set_data_y.keys_count = (uint16_t)key_set_data_y.frames.size(); + key_set_data_y.data_type = MOT_KEY_SET_DATA_F32; + + mot_key_set_data& key_set_data_z = mot_data->key_set[key_set_offset + 2]; + key_set_data_z.frames.clear(); + key_set_data_z.values.clear(); + key_set_data_z.type = mot_set::fit_keys_into_curve(keys.z, + key_set_data_z.frames, key_set_data_z.values); + key_set_data_z.keys_count = (uint16_t)key_set_data_z.frames.size(); + key_set_data_z.data_type = MOT_KEY_SET_DATA_F32; + } + + elem = a2m.sec_bone_keys.find(bone_index); + if (elem != a2m.sec_bone_keys.end()) { + x_pv_game_a3da_to_mot_keys& keys = elem->second; + + mot_key_set_data& key_set_data_x = mot_data->key_set[key_set_offset + 3]; + key_set_data_x.frames.clear(); + key_set_data_x.values.clear(); + key_set_data_x.type = mot_set::fit_keys_into_curve(keys.x, + key_set_data_x.frames, key_set_data_x.values); + key_set_data_x.keys_count = (uint16_t)key_set_data_x.frames.size(); + key_set_data_x.data_type = MOT_KEY_SET_DATA_F32; + + mot_key_set_data& key_set_data_y = mot_data->key_set[key_set_offset + 4]; + key_set_data_y.frames.clear(); + key_set_data_y.values.clear(); + key_set_data_y.type = mot_set::fit_keys_into_curve(keys.y, + key_set_data_y.frames, key_set_data_y.values); + key_set_data_y.keys_count = (uint16_t)key_set_data_y.frames.size(); + key_set_data_y.data_type = MOT_KEY_SET_DATA_F32; + + mot_key_set_data& key_set_data_z = mot_data->key_set[key_set_offset + 5]; + key_set_data_z.frames.clear(); + key_set_data_z.values.clear(); + key_set_data_z.type = mot_set::fit_keys_into_curve(keys.z, + key_set_data_z.frames, key_set_data_z.values); + key_set_data_z.keys_count = (uint16_t)key_set_data_z.frames.size(); + key_set_data_z.data_type = MOT_KEY_SET_DATA_F32; + } + + if (bone_index == MOTION_BONE_KL_AGO_WJ) { + mot_key_set_data& key_set_data_x = mot_data->key_set[key_set_offset]; + key_set_data_x.frames.clear(); + key_set_data_x.values.clear(); + key_set_data_x.values.push_back(0.0491406508f); + key_set_data_x.type = MOT_KEY_SET_STATIC; + key_set_data_x.keys_count = 1; + key_set_data_x.data_type = MOT_KEY_SET_DATA_F32; + + mot_key_set_data& key_set_data_y = mot_data->key_set[key_set_offset + 1]; + key_set_data_y.frames.clear(); + key_set_data_y.values.clear(); + key_set_data_y.type = MOT_KEY_SET_NONE; + key_set_data_y.keys_count = 0; + key_set_data_y.data_type = MOT_KEY_SET_DATA_F32; + + mot_key_set_data& key_set_data_z = mot_data->key_set[key_set_offset + 2]; + key_set_data_z.frames.clear(); + key_set_data_z.values.clear(); + key_set_data_z.type = MOT_KEY_SET_NONE; + key_set_data_z.keys_count = 0; + key_set_data_z.data_type = MOT_KEY_SET_DATA_F32; + } + else if (bone_index == MOTION_BONE_N_KUBI_WJ_EX) { + mot_key_set_data& key_set_data_x = mot_data->key_set[key_set_offset]; + key_set_data_x.frames.clear(); + key_set_data_x.values.clear(); + key_set_data_x.type = MOT_KEY_SET_NONE; + key_set_data_x.keys_count = 1; + key_set_data_x.data_type = MOT_KEY_SET_DATA_F32; + + mot_key_set_data& key_set_data_y = mot_data->key_set[key_set_offset + 1]; + key_set_data_y.frames.clear(); + key_set_data_y.values.clear(); + key_set_data_y.values.push_back(0.0331281610f); + key_set_data_y.type = MOT_KEY_SET_STATIC; + key_set_data_y.keys_count = 0; + key_set_data_y.data_type = MOT_KEY_SET_DATA_F32; + + mot_key_set_data& key_set_data_z = mot_data->key_set[key_set_offset + 2]; + key_set_data_z.frames.clear(); + key_set_data_z.values.clear(); + key_set_data_z.type = MOT_KEY_SET_NONE; + key_set_data_z.keys_count = 0; + key_set_data_z.data_type = MOT_KEY_SET_DATA_F32; + } + + if (bone->type >= BONE_DATABASE_BONE_POSITION_ROTATION) + key_set_offset += 6; + else + key_set_offset += 3; + } + } + + { + farc f; + + f.add_file(mot_file.c_str()); + farc_file* ff = &f.files.back(); + mot_set->pack_file(&ff->data, &ff->size); + + std::string mot_farc = "mot_" + set_info->name; + f.write(mot_farc.c_str(), FARC_COMPRESS_FArC, false); + } + + delete mot_set; + return true; +} + void x_pv_game::Unload() { + if (pv_id == 826) { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + char buf[0x200]; + sprintf_s(buf, sizeof(buf), "PV%03d", pv_id); + motion_set_info* set_info = aft_mot_db->get_motion_set_by_name(buf); + if (set_info) { + std::string farc_file = "mot_" + set_info->name + ".farc"; + aft_data->load_file(this, "rom/rob/", farc_file.c_str(), mot_write_motion); + } + } + data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; @@ -1308,10 +1621,15 @@ void x_pv_game::Unload() { for (std::pair& i : category_load) auth_3d_data_unload_category(i.second); + for (std::pair& i : effchrpv_category_load) + auth_3d_data_unload_category(i.second); + auth_3d_data_unload_category(light_category.c_str()); category_load.clear(); category_load.shrink_to_fit(); + effchrpv_category_load.clear(); + effchrpv_category_load.shrink_to_fit(); pv_category_hash = hash_murmurhash_empty; stage_category_hash = hash_murmurhash_empty; @@ -1368,7 +1686,7 @@ void x_pv_game::Unload() { target_anim_fps = get_target_anim_fps(); anim_frame_speed = get_anim_frame_speed(); pv_end = false; - for (pv_play_data& i : playdata) + for (x_pv_play_data& i : playdata) i.reset(); scene_rot_y = 0.0f; scene_rot_mat = mat4u_identity; @@ -1388,16 +1706,16 @@ x_pv_game_glitter::~x_pv_game_glitter() { Glitter::glt_particle_manager.UnloadEffectGroup(hash); } -struc_104::struc_104() : rob_chr(), current_time(), +x_struc_104::x_struc_104() : rob_chr(), current_time(), duration(), start_pos(), end_pos(), start_rot(), end_rot() { mot_smooth_len = 12.0f; } -struc_104::~struc_104() { +x_struc_104::~x_struc_104() { } -void struc_104::reset() { +void x_struc_104::reset() { rob_chr = 0; current_time = 0.0f; duration = 0.0f; @@ -1410,15 +1728,15 @@ void struc_104::reset() { set_item.clear(); } -pv_play_data::pv_play_data() : rob_chr(), disp() { +x_pv_play_data::x_pv_play_data() : rob_chr(), disp() { } -pv_play_data::~pv_play_data() { +x_pv_play_data::~x_pv_play_data() { } -void pv_play_data::reset() { +void x_pv_play_data::reset() { motion.clear(); rob_chr = 0; set_motion.clear(); @@ -1495,9 +1813,9 @@ static void sub_140122B60(x_pv_game* a1, int32_t chara_id, int32_t motion_index, if (chara_id < 0 || chara_id > ROB_CHARA_COUNT || motion_index < 0) return; - pv_play_data* playdata = &a1->playdata[chara_id]; + x_pv_play_data* playdata = &a1->playdata[chara_id]; int64_t dsc_time = a1->dsc_time; - for (dsc_set_motion& i : playdata->field_38.set_motion) { + for (x_dsc_set_motion& i : playdata->field_38.set_motion) { int64_t time = (int64_t)i.time * 10000; if (time > dsc_time && i.motion_index == motion_index && (!a1->branch_mode || a1->branch_mode == i.pv_branch_mode)) { @@ -1546,7 +1864,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { } break; case DSC_X_MIKU_MOVE: { a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; vec3 trans; trans.x = (float_t)(int32_t)data[1] * 0.001f; @@ -1564,7 +1882,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { } break; case DSC_X_MIKU_ROT: { a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; float_t rot_y = (float_t)(int32_t)data[0] * 0.001f; @@ -1582,7 +1900,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; int32_t disp = (int32_t)data[1]; @@ -1600,7 +1918,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { }*/ //pv_game::set_data_itmpv_visibility(a1->pv_game, a1->chara_id, true); - for (pv_play_data_set_motion& i : playdata->set_motion) { + for (x_pv_play_data_set_motion& i : playdata->set_motion) { 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); @@ -1630,7 +1948,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; rob_chara* rob_chr = playdata->rob_chr; if (!rob_chr) @@ -1662,8 +1980,8 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { float_t dsc_frame = 0.0f; bool v11 = false; - pv_play_data_motion* v56 = 0; - for (pv_play_data_motion& i : playdata->motion) + x_pv_play_data_motion* v56 = 0; + for (x_pv_play_data_motion& i : playdata->motion) if (i.motion_index == motion_index) { v56 = &i; break; @@ -1733,7 +2051,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { if (v11) duration = 0.0f; - pv_play_data_set_motion v519; + x_pv_play_data_set_motion v519; v519.frame_speed = frame_speed * a1->anim_frame_speed; v519.motion_id = motion_id; v519.frame = frame; @@ -1767,7 +2085,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { } break; case DSC_X_SET_PLAYDATA: { a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; int32_t motion_index = (int32_t)data[1]; if (motion_index < 0) { @@ -1775,20 +2093,20 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { break; } - pv_play_data_motion* v92 = 0; - for (pv_play_data_motion& i : playdata->motion) + x_pv_play_data_motion* motion = 0; + for (x_pv_play_data_motion& i : playdata->motion) if (i.motion_index == motion_index) { - v92 = &i; + motion = &i; break; } - if (v92) { - v92->enable = true; - v92->motion_index = motion_index; - v92->time = a1->dsc_time; + if (motion) { + motion->enable = true; + motion->motion_index = motion_index; + motion->time = a1->dsc_time; } else { - pv_play_data_motion v531; + x_pv_play_data_motion v531; v531.enable = true; v531.motion_index = motion_index; v531.time = a1->dsc_time; @@ -1831,7 +2149,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; int32_t v115 = (int32_t)data[1]; int32_t duration_int = (int32_t)data[2]; @@ -1859,7 +2177,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; int32_t mouth_anim_id = (int32_t)data[2]; int32_t duration_int = (int32_t)data[3]; @@ -1937,7 +2255,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; int32_t hand_index = (int32_t)data[1]; int32_t hand_anim_id = (int32_t)data[2]; @@ -1989,7 +2307,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; int32_t look_anim_id = (int32_t)data[1]; int32_t duration_int = (int32_t)data[2]; @@ -2033,7 +2351,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; int32_t expression_id = (int32_t)data[1]; int32_t duration_int = (int32_t)data[2]; @@ -2105,7 +2423,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; int32_t expression_id = (int32_t)data[0]; @@ -2167,7 +2485,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; int32_t mouth_anim_id = (int32_t)data[1]; float_t duration = 0.1f; @@ -2236,7 +2554,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; float_t value = (float_t)(int32_t)data[1] * 0.001f; @@ -2261,16 +2579,15 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { end.x = (float_t)(int32_t)data[3] * 0.001f; end.y = (float_t)(int32_t)data[4] * 0.001f; end.z = (float_t)(int32_t)data[5] * 0.001f; - post_process_tone_map_set_tone_trans_start(rctx_ptr->post_process.tone_map, &start); - post_process_tone_map_set_tone_trans_start(rctx_ptr->post_process.tone_map, &end); + rctx_ptr->post_process.tone_map->set_tone_trans(start, end); } break; case DSC_X_SATURATE: { float_t value = (float_t)(int32_t)data[0] * 0.001f; - post_process_tone_map_set_saturate_coeff(rctx_ptr->post_process.tone_map, value); + rctx_ptr->post_process.tone_map->set_saturate_coeff(value); } break; case DSC_X_FADE_MODE: { int32_t value = data[0]; - post_process_tone_map_set_scene_fade_blend_func(rctx_ptr->post_process.tone_map, value); + rctx_ptr->post_process.tone_map->set_scene_fade_blend_func(value); } break; case DSC_X_AUTO_BLINK: { @@ -2280,7 +2597,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; item_id id = (item_id)data[1]; int32_t disp = (int32_t)data[2]; @@ -2296,7 +2613,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { } break; case DSC_X_CHARA_SIZE: { a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; int32_t chara_size = (int32_t)data[1]; @@ -2334,7 +2651,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { } break; case DSC_X_CHARA_HEIGHT_ADJUST: { a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; int32_t height_adjust = (int32_t)data[1]; @@ -2347,7 +2664,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { } break; case DSC_X_CHARA_POS_ADJUST: { a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; vec3 pos; pos.x = (float_t)(int32_t)data[2] * 0.001f; @@ -2398,7 +2715,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; float_t wind_strength_kami = (float_t)(int32_t)data[1] * 0.001f; float_t wind_strength_outer = (float_t)(int32_t)data[2] * 0.001f; @@ -2414,7 +2731,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; float_t osage_step_kami = (float_t)(int32_t)data[1] * 0.001f; float_t osage_step_outer = (float_t)(int32_t)data[2] * 0.001f; @@ -2430,7 +2747,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; float_t osage_mv_ccl_kami = (float_t)(int32_t)data[1] * 0.001f; float_t osage_mv_ccl_outer = (float_t)(int32_t)data[2] * 0.001f; @@ -2529,7 +2846,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { int32_t type = (int32_t)data[3]; if (a1->chara_id >= 0 && a1->chara_id < ROB_CHARA_COUNT) { - pv_param_chara_alpha& chara_alpha + pv_param::chara_alpha& chara_alpha = pv_param_task::post_process_task.chara_alpha.data.data[a1->chara_id]; chara_alpha.type = type; chara_alpha.frame = 0.0f; @@ -2558,7 +2875,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { int32_t type = (int32_t)data[3]; if (a1->chara_id >= 0 && a1->chara_id < ROB_CHARA_COUNT) { - pv_param_chara_alpha& chara_item_alpha + pv_param::chara_alpha& chara_item_alpha = pv_param_task::post_process_task.chara_item_alpha.data.data[a1->chara_id]; chara_item_alpha.type = type; chara_item_alpha.frame = 0.0f; @@ -2723,7 +3040,7 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; a1->chara_id = (int32_t)data[0]; - pv_play_data* playdata = &a1->playdata[a1->chara_id]; + x_pv_play_data* playdata = &a1->playdata[a1->chara_id]; bool enable = data[1] ? true : false; int32_t chara_effect_id = (int32_t)data[2]; @@ -2872,16 +3189,32 @@ static bool x_pv_game_dsc_process(x_pv_game* a1, int64_t curr_time) { return true; } -static int32_t get_bone_index(auth_3d_object_hrc* oh, const char* name) { - uint32_t name_hash = hash_utf8_murmurhash(name); - for (auth_3d_object_node& i : oh->node) - if (hash_string_murmurhash(&i.name) == name_hash) - return (int32_t)(&i - oh->node.data()); - return -1; -} - static void set_bone_key_set_data(bone_data* bone_data, + std::map& bone_keys, + std::map& second_bone_keys, bool add_keys, motion_bone_index motion_bone_index, mot_key_set* key_set, vec3* data, int32_t count = 1) { + if (add_keys) { + auto elem = bone_keys.find(motion_bone_index); + if (elem == bone_keys.end()) + elem = bone_keys.insert({ motion_bone_index, {} }).first; + + x_pv_game_a3da_to_mot_keys& keys = elem->second; + keys.x.push_back(data[0].x); + keys.y.push_back(data[0].y); + keys.z.push_back(data[0].z); + + if (count == 2) { + auto elem = second_bone_keys.find(motion_bone_index); + if (elem == second_bone_keys.end()) + elem = second_bone_keys.insert({ motion_bone_index, {} }).first; + + x_pv_game_a3da_to_mot_keys& keys = elem->second; + keys.x.push_back(data[1].x); + keys.y.push_back(data[1].y); + keys.z.push_back(data[1].z); + } + } + bone_data += motion_bone_index; key_set += bone_data->key_set_offset; while (count > 0) { @@ -2897,82 +3230,13 @@ static void set_bone_key_set_data(bone_data* bone_data, } } -static void x_pv_game_map_auth_3d_to_mot(x_pv_game* xpvgm) { +static void x_pv_game_map_auth_3d_to_mot(x_pv_game* xpvgm, bool add_keys) { for (auto& i : xpvgm->effchrpv_auth_3d_rob_mot_ids) { rob_chara* rob_chr = rob_chara_array_get(xpvgm->rob_chara_ids[i.first]); x_pv_game_a3da_to_mot& a2m = i.second; auth_3d* auth = auth_3d_data_get_auth_3d(a2m.auth_3d_id); auth_3d_object_hrc* oh = &auth->object_hrc[0]; - if (a2m.gblctr == -2) - a2m.gblctr = get_bone_index(oh, "gblctr"); - if (a2m.n_hara == -2) - a2m.n_hara = get_bone_index(oh, "n_hara"); - if (a2m.n_hara_y == -2) - a2m.n_hara_y = get_bone_index(oh, "n_hara_y"); - if (a2m.j_hara_wj == -2) - a2m.j_hara_wj = get_bone_index(oh, "j_hara_wj"); - if (a2m.n_kosi == -2) - a2m.n_kosi = get_bone_index(oh, "n_kosi"); - if (a2m.j_mune_wj == -2) - a2m.j_mune_wj = get_bone_index(oh, "j_mune_wj"); - if (a2m.n_mune_kl == -2) - a2m.n_mune_kl = get_bone_index(oh, "n_mune_kl"); - if (a2m.j_mune_b_wj == -2) - a2m.j_mune_b_wj = get_bone_index(oh, "j_mune_b_wj"); - if (a2m.j_kubi_wj == -2) - a2m.j_kubi_wj = get_bone_index(oh, "j_kubi_wj"); - if (a2m.n_kao == -2) - a2m.n_kao = get_bone_index(oh, "n_kao"); - if (a2m.j_kao_wj == -2) - a2m.j_kao_wj = get_bone_index(oh, "j_kao_wj"); - if (a2m.j_eye_r_wj == -2) - a2m.j_eye_r_wj = get_bone_index(oh, "j_eye_r_wj"); - if (a2m.j_eye_l_wj == -2) - a2m.j_eye_l_wj = get_bone_index(oh, "j_eye_l_wj"); - if (a2m.n_waki_l == -2) - a2m.n_waki_l = get_bone_index(oh, "n_waki_l"); - if (a2m.j_waki_l_wj == -2) - a2m.j_waki_l_wj = get_bone_index(oh, "j_waki_l_wj"); - if (a2m.n_kata_l == -2) - a2m.n_kata_l = get_bone_index(oh, "n_kata_l"); - if (a2m.j_kata_l_wj == -2) - a2m.j_kata_l_wj = get_bone_index(oh, "j_kata_l_wj"); - if (a2m.j_ude_l_wj == -2) - a2m.j_ude_l_wj = get_bone_index(oh, "j_ude_l_wj"); - if (a2m.j_te_l_wj == -2) - a2m.j_te_l_wj = get_bone_index(oh, "j_te_l_wj"); - if (a2m.n_waki_r == -2) - a2m.n_waki_r = get_bone_index(oh, "n_waki_r"); - if (a2m.j_waki_r_wj == -2) - a2m.j_waki_r_wj = get_bone_index(oh, "j_waki_r_wj"); - if (a2m.n_kata_r == -2) - a2m.n_kata_r = get_bone_index(oh, "n_kata_r"); - if (a2m.j_kata_r_wj == -2) - a2m.j_kata_r_wj = get_bone_index(oh, "j_kata_r_wj"); - if (a2m.j_ude_r_wj == -2) - a2m.j_ude_r_wj = get_bone_index(oh, "j_ude_r_wj"); - if (a2m.j_te_r_wj == -2) - a2m.j_te_r_wj = get_bone_index(oh, "j_te_r_wj"); - if (a2m.j_kosi_wj == -2) - a2m.j_kosi_wj = get_bone_index(oh, "j_kosi_wj"); - if (a2m.n_momo_l == -2) - a2m.n_momo_l = get_bone_index(oh, "n_momo_l"); - if (a2m.j_momo_l_wj == -2) - a2m.j_momo_l_wj = get_bone_index(oh, "j_momo_l_wj"); - if (a2m.j_sune_l_wj == -2) - a2m.j_sune_l_wj = get_bone_index(oh, "j_sune_l_wj"); - if (a2m.j_asi_l_wj == -2) - a2m.j_asi_l_wj = get_bone_index(oh, "j_asi_l_wj"); - if (a2m.n_momo_r == -2) - a2m.n_momo_r = get_bone_index(oh, "n_momo_r"); - if (a2m.j_momo_r_wj == -2) - a2m.j_momo_r_wj = get_bone_index(oh, "j_momo_r_wj"); - if (a2m.j_sune_r_wj == -2) - a2m.j_sune_r_wj = get_bone_index(oh, "j_sune_r_wj"); - if (a2m.j_asi_r_wj == -2) - a2m.j_asi_r_wj = get_bone_index(oh, "j_asi_r_wj"); - rob_chr->set_visibility(oh->node[0].model_transform.visible); motion_blend_mot* mot = rob_chr->bone_data->motion_loaded.front(); @@ -2985,16 +3249,20 @@ static void x_pv_game_map_auth_3d_to_mot(x_pv_game* xpvgm) { data[0].y = oh->node[a2m.n_hara].model_transform.translation_value.y; data[0].z = oh->node[a2m.gblctr].model_transform.translation_value.z; data[1] = vec3_null; - set_bone_key_set_data(bone_data, MOTION_BONE_N_HARA_CP, key_set, data, 2); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_N_HARA_CP, key_set, data, 2); data[0] = oh->node[a2m.n_hara_y].model_transform.rotation_value; - set_bone_key_set_data(bone_data, MOTION_BONE_KG_HARA_Y, key_set, data); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_KG_HARA_Y, key_set, data); data[0] = oh->node[a2m.j_hara_wj].model_transform.rotation_value; - set_bone_key_set_data(bone_data, MOTION_BONE_KL_HARA_XZ, key_set, data); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_KL_HARA_XZ, key_set, data); data[0] = oh->node[a2m.n_kosi].model_transform.rotation_value; - set_bone_key_set_data(bone_data, MOTION_BONE_N_HARA, key_set, data); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_N_HARA, key_set, data); mat = oh->node[a2m.j_mune_wj].model_transform.mat; data[0] = { 0.0f, 0.945f, 0.0f }; @@ -3002,17 +3270,21 @@ static void x_pv_game_map_auth_3d_to_mot(x_pv_game* xpvgm) { mat4_get_translation(&mat, &data[0]); vec3_add(data[0], data[1], data[0]); data[1] = vec3_null; - set_bone_key_set_data(bone_data, MOTION_BONE_CL_MUNE, key_set, data, 2); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_CL_MUNE, key_set, data, 2); data[0] = oh->node[a2m.j_mune_b_wj].model_transform.rotation_value; - set_bone_key_set_data(bone_data, MOTION_BONE_KL_MUNE_B_WJ, key_set, data); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_KL_MUNE_B_WJ, key_set, data); data[0] = oh->node[a2m.j_kubi_wj].model_transform.rotation_value; - set_bone_key_set_data(bone_data, MOTION_BONE_KL_KUBI, key_set, data); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_KL_KUBI, key_set, data); data[0] = oh->node[a2m.n_kao].model_transform.rotation_value; data[0].z -= (float_t)M_PI; - set_bone_key_set_data(bone_data, MOTION_BONE_N_KAO, key_set, data); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_N_KAO, key_set, data); mat = oh->node[a2m.j_kao_wj].model_transform.mat; data[0] = { 0.0f, 0.40f, 0.0f }; @@ -3020,14 +3292,33 @@ static void x_pv_game_map_auth_3d_to_mot(x_pv_game* xpvgm) { mat4_get_translation(&mat, &data[0]); vec3_add(data[0], data[1], data[0]); data[1] = vec3_null; - data[1].z = (float_t)M_PI; - set_bone_key_set_data(bone_data, MOTION_BONE_CL_KAO, key_set, data, 2); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_CL_KAO, key_set, data, 2); + + data[0] = oh->node[a2m.j_eye_r_wj].model_transform.rotation_value; + data[0].x += (float_t)(M_PI / 2.0); + data[0].y = -data[0].z; + data[0].z = 0.0f; + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_KL_EYE_R, key_set, data); + + data[0] = oh->node[a2m.j_eye_l_wj].model_transform.rotation_value; + data[0].x += (float_t)(M_PI / 2.0); + data[0].y = -data[0].z; + data[0].z = 0.0f; + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_KL_EYE_L, key_set, data); data[0] = oh->node[a2m.n_waki_l].model_transform.rotation_value; - set_bone_key_set_data(bone_data, MOTION_BONE_N_WAKI_L, key_set, data); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_N_WAKI_L, key_set, data); - data[0] = oh->node[a2m.j_waki_l_wj].model_transform.rotation_value; - set_bone_key_set_data(bone_data, MOTION_BONE_KL_WAKI_L_WJ, key_set, data); + data[1] = oh->node[a2m.j_waki_l_wj].model_transform.rotation_value; + data[0].x = data[1].x; + data[0].y = data[1].z; + data[0].z = -data[1].y; + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_KL_WAKI_L_WJ, key_set, data); { vec3 pos_j_kata_l_wj; @@ -3058,21 +3349,31 @@ static void x_pv_game_map_auth_3d_to_mot(x_pv_game* xpvgm) { mat = oh->node[a2m.j_mune_b_wj].model_transform.mat; mat4_mult_vec3_inv_trans(&mat, &tl_up_kata_pos, &data[0]); - set_bone_key_set_data(bone_data, MOTION_BONE_TL_UP_KATA_L, key_set, data); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_TL_UP_KATA_L, key_set, data); } mat4_get_translation(&oh->node[a2m.j_te_l_wj].model_transform.mat, &data[0]); - mat4_get_rotation(&oh->node[a2m.j_kata_l_wj].model_transform.mat, &data[1]); - set_bone_key_set_data(bone_data, MOTION_BONE_C_KATA_L, key_set, data, 2); + data[1].x = -(float_t)(M_PI / 2.0); + data[1].y = -(float_t)(M_PI / 2.0); + data[1].z = -(float_t)(M_PI / 2.0); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_C_KATA_L, key_set, data, 2); data[0] = oh->node[a2m.j_te_l_wj].model_transform.rotation_value; - set_bone_key_set_data(bone_data, MOTION_BONE_KL_TE_L_WJ, key_set, data); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_KL_TE_L_WJ, key_set, data); data[0] = oh->node[a2m.n_waki_r].model_transform.rotation_value; - set_bone_key_set_data(bone_data, MOTION_BONE_N_WAKI_R, key_set, data); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_N_WAKI_R, key_set, data); - data[0] = oh->node[a2m.j_waki_r_wj].model_transform.rotation_value; - set_bone_key_set_data(bone_data, MOTION_BONE_KL_WAKI_R_WJ, key_set, data); + data[1] = oh->node[a2m.j_waki_l_wj].model_transform.rotation_value; + data[0].x = data[1].x; + data[0].y = data[1].z; + data[0].z = data[1].y; + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_KL_WAKI_R_WJ, key_set, data); { vec3 pos_j_kata_r_wj; @@ -3103,24 +3404,38 @@ static void x_pv_game_map_auth_3d_to_mot(x_pv_game* xpvgm) { mat = oh->node[a2m.j_mune_b_wj].model_transform.mat; mat4_mult_vec3_inv_trans(&mat, &tl_up_kata_pos, &data[0]); - set_bone_key_set_data(bone_data, MOTION_BONE_TL_UP_KATA_R, key_set, data); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_TL_UP_KATA_R, key_set, data); } mat4_get_translation(&oh->node[a2m.j_te_r_wj].model_transform.mat, &data[0]); - data[1] = vec3_null; - mat4_get_rotation(&oh->node[a2m.j_kata_r_wj].model_transform.mat, &data[1]); - set_bone_key_set_data(bone_data, MOTION_BONE_C_KATA_R, key_set, data, 2); + data[1].x = -(float_t)(M_PI / 2.0); + data[1].y = (float_t)(M_PI / 2.0); + data[1].z = (float_t)(M_PI / 2.0); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_C_KATA_R, key_set, data, 2); data[0] = oh->node[a2m.j_te_r_wj].model_transform.rotation_value; - set_bone_key_set_data(bone_data, MOTION_BONE_KL_TE_R_WJ, key_set, data); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_KL_TE_R_WJ, key_set, data); mat4_get_translation(&oh->node[a2m.j_asi_l_wj].model_transform.mat, &data[0]); data[1] = vec3_null; - set_bone_key_set_data(bone_data, MOTION_BONE_CL_MOMO_L, key_set, data, 2); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_CL_MOMO_L, key_set, data, 2); mat4_get_translation(&oh->node[a2m.j_asi_r_wj].model_transform.mat, &data[0]); data[1] = vec3_null; - set_bone_key_set_data(bone_data, MOTION_BONE_CL_MOMO_R, key_set, data, 2); + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_CL_MOMO_R, key_set, data, 2); + + data[0] = { 0.0491406508f, 0.0f, 0.0f }; + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_KL_AGO_WJ, key_set, data); + + data[0] = { 0.0f, 0.0331281610f, 0.0f }; + set_bone_key_set_data(bone_data, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + MOTION_BONE_N_KUBI_WJ_EX, key_set, data); } } @@ -3297,11 +3612,11 @@ static void sub_140121A80(x_pv_game* a1, int32_t chara_id) { uint32_t* data = a1->dsc_m.get_func_data(i); if (chara_id == data[0] && data[2] == 2) { - dsc_set_item v14; - v14.item_index = data[1]; - v14.time = time; - v14.pv_branch_mode = pv_branch_mode; - a1->playdata[chara_id].field_38.set_item.push_back(v14); + x_dsc_set_item item; + item.item_index = data[1]; + item.time = time; + item.pv_branch_mode = pv_branch_mode; + a1->playdata[chara_id].field_38.set_item.push_back(item); } prev_time = time; i++; @@ -3332,11 +3647,11 @@ static void sub_140122770(x_pv_game* a1, int32_t chara_id) { uint32_t* data = a1->dsc_m.get_func_data(i); if (chara_id == data[0]) { - dsc_set_motion v14; - v14.motion_index = data[1]; - v14.time = time; - v14.pv_branch_mode = pv_branch_mode; - a1->playdata[chara_id].field_38.set_motion.push_back(v14); + x_dsc_set_motion motion; + motion.motion_index = data[1]; + motion.time = time; + motion.pv_branch_mode = pv_branch_mode; + a1->playdata[chara_id].field_38.set_motion.push_back(motion); } prev_time = time; i++; diff --git a/src/CLOUD/x_pv_game.hpp b/src/CLOUD/x_pv_game.hpp index 533a071f..4e15c5b3 100644 --- a/src/CLOUD/x_pv_game.hpp +++ b/src/CLOUD/x_pv_game.hpp @@ -28,7 +28,7 @@ struct x_pv_game_glitter { ~x_pv_game_glitter(); }; -struct pv_play_data_set_motion { +struct x_pv_play_data_set_motion { float_t frame_speed; int32_t motion_id; float_t frame; @@ -41,25 +41,25 @@ struct pv_play_data_set_motion { float_t dsc_frame; }; -struct pv_play_data_motion { +struct x_pv_play_data_motion { bool enable; int32_t motion_index; int64_t time; }; -struct dsc_set_item { +struct x_dsc_set_item { int32_t time; int32_t item_index; int32_t pv_branch_mode; }; -struct dsc_set_motion { +struct x_dsc_set_motion { int32_t time; int32_t motion_index; int32_t pv_branch_mode; }; -struct struc_104 { +struct x_struc_104 { rob_chara* rob_chr; float_t current_time; float_t duration; @@ -68,24 +68,24 @@ struct struc_104 { float_t start_rot; float_t end_rot; float_t mot_smooth_len; - std::vector set_motion; - std::vector set_item; + std::vector set_motion; + std::vector set_item; - struc_104(); - ~struc_104(); + x_struc_104(); + ~x_struc_104(); void reset(); }; -struct pv_play_data { - std::vector motion; +struct x_pv_play_data { + std::vector motion; rob_chara* rob_chr; - std::list set_motion; + std::list set_motion; bool disp; - struc_104 field_38; + x_struc_104 field_38; - pv_play_data(); - ~pv_play_data(); + x_pv_play_data(); + ~x_pv_play_data(); void reset(); }; @@ -105,6 +105,15 @@ struct x_pv_game_stage_effect_init { int32_t bar; }; +struct x_pv_game_a3da_to_mot_keys { + std::vector x; + std::vector y; + std::vector z; + + x_pv_game_a3da_to_mot_keys(); + ~x_pv_game_a3da_to_mot_keys(); +}; + struct x_pv_game_a3da_to_mot { int32_t auth_3d_id; int32_t gblctr; @@ -118,6 +127,15 @@ struct x_pv_game_a3da_to_mot { int32_t j_kubi_wj; int32_t n_kao; int32_t j_kao_wj; + int32_t j_kao_normal_wj; + int32_t j_kao_close_wj; + int32_t j_kao_smile_wj; + int32_t j_kao_close_half_wj; + int32_t j_kao_smile_half_wj; + int32_t j_kuti_l_wj; + int32_t j_kuti_u_wj; + int32_t j_kuti_d_wj; + int32_t j_kuti_r_wj; int32_t j_eye_r_wj; int32_t j_eye_l_wj; int32_t n_waki_l; @@ -126,12 +144,19 @@ struct x_pv_game_a3da_to_mot { int32_t j_kata_l_wj; int32_t j_ude_l_wj; int32_t j_te_l_wj; + int32_t j_te_sizen2_l_wj; + int32_t j_te_close_l_wj; + int32_t j_te_reset_l_wj; int32_t n_waki_r; int32_t j_waki_r_wj; int32_t n_kata_r; int32_t j_kata_r_wj; int32_t j_ude_r_wj; int32_t j_te_r_wj; + int32_t j_te_sizen2_r_wj; + int32_t j_te_close_r_wj; + int32_t j_te_reset_r_wj; + int32_t j_te_one_r_wj; int32_t j_kosi_wj; int32_t n_momo_l; int32_t j_momo_l_wj; @@ -141,11 +166,16 @@ struct x_pv_game_a3da_to_mot { int32_t j_momo_r_wj; int32_t j_sune_r_wj; int32_t j_asi_r_wj; + std::map bone_keys; + std::map sec_bone_keys; x_pv_game_a3da_to_mot(int32_t auth_3d_id); + ~x_pv_game_a3da_to_mot(); + + void get_bone_indices(auth_3d_object_hrc* oh); }; -class x_pv_game : public TaskWindow { +class x_pv_game : public app::TaskWindow { public: int32_t pv_id; int32_t stage_id; @@ -184,6 +214,7 @@ public: uint32_t camera_category_hash; std::vector> category_load; + std::vector> effchrpv_category_load; std::set pv_auth_3d_names; std::set stage_auth_3d_names; @@ -219,7 +250,7 @@ public: float_t anim_frame_speed; int64_t dsc_time; bool pv_end; - pv_play_data playdata[ROB_CHARA_COUNT]; + x_pv_play_data playdata[ROB_CHARA_COUNT]; float_t scene_rot_y; mat4u scene_rot_mat; int32_t branch_mode; diff --git a/src/CRE/Glitter/curve.cpp b/src/CRE/Glitter/curve.cpp index b2b0e270..6b607960 100644 --- a/src/CRE/Glitter/curve.cpp +++ b/src/CRE/Glitter/curve.cpp @@ -7,6 +7,13 @@ #include "../../KKdLib/interpolation.h" namespace Glitter { +#if defined(CRE_DEV) + static float_t glitter_curve_add_key(bool has_error, + bool has_error_lerp, bool has_error_hermite, float_t* a, float_t* b, int32_t frame, + const uint8_t step, size_t i, float_t t1, float_t t2, float_t t2_old, + std::vector* keys_rev); +#endif + Curve::Key::Key() : type(), frame(), value(), tangent1(), tangent2(), random_range() { } @@ -198,6 +205,205 @@ namespace Glitter { } #if defined(CRE_DEV) + void Curve::FitKeysIntoCurve(GLT) { + size_t count = keys.size(); + keys_rev = {}; + if (~flags & CURVE_BAKED) { + keys_rev.insert(keys_rev.end(), keys.begin(), keys.end()); + return; + } + else if (count == 1) { + keys.data()[0].frame = start_time; + keys_rev.push_back(keys.data()[0]); + return; + } + + bool curve_baked_half = false; + if (type == Glitter::F2 || (type == Glitter::X && ~flags & CURVE_BAKED_FULL)) + curve_baked_half = true; + + const uint8_t step = curve_baked_half ? 2 : 1; + + end_time = start_time + (int32_t)((count - 1) * step); + float_t* arr_a = force_malloc_s(float_t, count); + float_t* arr_b = force_malloc_s(float_t, count); + Curve::Key* keys_data = keys.data(); + for (size_t i = 0; i < count; i++) { + keys_data[i].frame = start_time + (int32_t)(i * step); + arr_a[i] = keys_data[i].value; + arr_b[i] = keys_data[i].random_range; + } + + static const float_t curve_baked_reverse_bias[] = { + 0.00001f, + 0.0001f, + 0.001f, + }; + + static const float_t curve_baked_half_reverse_bias[] = { + 0.000001f, + 0.00001f, + 0.0001f, + }; + + const float_t* reverse_bias = curve_baked_half + ? curve_baked_half_reverse_bias : curve_baked_reverse_bias; + const size_t reverse_min_count = curve_baked_half ? 5 : 4; + + keys_rev.clear(); + float_t* a = arr_a; + float_t* b = arr_b; + size_t left_count = count; + int32_t frame = start_time; + int32_t prev_frame = start_time; + float_t t2_old = 0.0f; + while (left_count > 0) { + int32_t c = 0; + if (left_count < reverse_min_count) { + Curve::Key key; + if (left_count == 1) { + key.type = KEY_CONSTANT; + key.frame = frame; + key.value = a[0]; + key.tangent1 = t2_old; + key.tangent2 = 0.0f; + key.random_range = b[0]; + keys_rev.push_back(key); + t2_old = 0.0f; + } + else { + bool has_error = false; + bool has_error_lerp = false; + for (size_t j = 1; j < left_count; j++) { + float_t val = lerp(a[0], a[left_count - 1], (float_t)j / (float_t)left_count); + if (fabsf(val - a[0]) > reverse_bias[0]) { + has_error = true; + if (fabsf(val - a[j]) > reverse_bias[1]) { + has_error_lerp = true; + break; + } + } + } + + t2_old = glitter_curve_add_key(has_error, has_error_lerp, true, + a, b, frame, step, left_count, 0.0f, 0.0f, t2_old, &keys_rev); + } + break; + } + + float_t t1 = 0.0f; + float_t t2 = 0.0f; + float_t t1_prev = 0.0f; + float_t t2_prev = 0.0f; + bool has_prev_succeded = false; + bool constant = false; + bool prev_constant = false; + bool has_error = false; + bool has_error_lerp = false; + bool has_error_hermite = false; + bool has_prev_error = false; + bool has_prev_error_lerp = false; + bool has_prev_error_hermite = false; + + size_t i; + for (i = reverse_min_count - 1; i < left_count; i++) { + double_t tt1 = 0.0; + double_t tt2 = 0.0; + for (size_t j = 1; j < i - 1; j++) { + float_t _t1 = 0.0f; + float_t _t2 = 0.0f; + interpolate_chs_reverse_step_value(a, left_count, &_t1, &_t2, 0, i, j, step); + tt1 += _t1; + tt2 += _t2; + } + t1 = (float_t)(tt1 / (double_t)(i - 2)); + t2 = (float_t)(tt2 / (double_t)(i - 2)); + + constant = false; + has_error = false; + has_error_lerp = false; + has_error_hermite = false; + for (size_t j = 1; j < i; j++) { + float_t val = interpolate_chs_value(a[0], a[i], t1, t2, 0.0f, + (float_t)(i * step), (float_t)(j * step)); + float_t val_lerp = lerp(a[0], a[i], (float_t)j / (float_t)i); + if (fabsf(val - a[0]) > reverse_bias[0]) { + has_error = true; + constant = false; + if (fabsf(val_lerp - a[j]) > reverse_bias[1]) { + has_error_lerp = true; + if (fabsf(val - a[j]) > reverse_bias[2]) { + has_error_hermite = true; + break; + } + } + } + else + constant = true; + } + + if (!has_error_hermite) { + t1_prev = t1; + t2_prev = t2; + prev_constant = constant; + has_prev_succeded = true; + has_prev_error = has_error; + has_prev_error_lerp = has_error_lerp; + has_prev_error_hermite = has_error_hermite; + if (i < left_count) + continue; + } + + if (has_prev_succeded) { + if (prev_constant && ((i < left_count - 1 && a[i] == a[i + 1]) || (frame + i == end_time))) + c = (int32_t)i; + else + c = (int32_t)(i - 1); + t1 = t1_prev; + t2 = t2_prev; + has_error = has_prev_error; + has_error_lerp = has_prev_error_lerp; + has_error_hermite = has_prev_error_hermite; + } + else + c = (int32_t)i; + + if (has_error_hermite) + c = 1; + + t2_old = glitter_curve_add_key(has_error, has_error_lerp, has_error_hermite, + a, b, frame, step, c, t1, t2, t2_old, &keys_rev); + prev_constant = false; + has_prev_succeded = false; + break; + } + + if (has_prev_succeded) { + t2_old = glitter_curve_add_key(has_prev_error, has_prev_error_lerp, has_prev_error_hermite, + a, b, frame, step, i, t1_prev, t2_prev, t2_old, &keys_rev); + c = (int32_t)i; + } + prev_frame = frame; + frame += c * step; + a += c; + b += c; + left_count -= c; + } + + Curve::Key key; + key.type = KEY_CONSTANT; + key.frame = (int32_t)(start_time + (count - 1) * step); + key.value = arr_a[count - 1]; + key.tangent1 = t2_old; + key.tangent2 = 0.0f; + key.random_range = arr_b[count - 1]; + keys_rev.push_back(key); + free(arr_a); + free(arr_b); + + Recalculate(GLT_VAL); + } + void Curve::Recalculate(GLT) { keys.clear(); if (keys_rev.size() == 1) @@ -418,4 +624,55 @@ namespace Glitter { ? -key->random_range : 0.0f, key->random_range); return rand + key->value; } + +#if defined(CRE_DEV) + static float_t glitter_curve_add_key(bool has_error, + bool has_error_lerp, bool has_error_hermite, float_t* a, float_t* b, int32_t frame, + const uint8_t step, size_t i, float_t t1, float_t t2, float_t t2_old, + std::vector* keys_rev) { + Curve::Key key; + if (has_error && has_error_lerp && has_error_hermite) { + float_t _t2 = t2_old; + for (size_t j = 0; j < i; j++) { + key.type = KEY_CONSTANT; + key.frame = (int32_t)(frame + j * step); + key.value = a[j]; + key.tangent1 = _t2; + key.tangent2 = 0.0f; + key.random_range = b[j]; + keys_rev->push_back(key); + _t2 = 0.0f; + } + } + else if (has_error && has_error_lerp) { + key.type = KEY_HERMITE; + key.frame = frame; + key.value = a[0]; + key.tangent1 = t2_old; + key.tangent2 = t1; + key.random_range = b[0]; + keys_rev->push_back(key); + return t2; + } + else if (has_error || (i > 1 && b[0] != b[1])) { + key.type = KEY_LINEAR; + key.frame = frame; + key.value = a[0]; + key.tangent1 = 0.0f; + key.tangent2 = 0.0f; + key.random_range = b[0]; + keys_rev->push_back(key); + } + else { + key.type = KEY_CONSTANT; + key.frame = frame; + key.value = a[0]; + key.tangent1 = 0.0f; + key.tangent2 = 0.0f; + key.random_range = b[0]; + keys_rev->push_back(key); + } + return 0.0f; + } +#endif } diff --git a/src/CRE/Glitter/effect_group.cpp b/src/CRE/Glitter/effect_group.cpp index f76e003b..c644579a 100644 --- a/src/CRE/Glitter/effect_group.cpp +++ b/src/CRE/Glitter/effect_group.cpp @@ -126,11 +126,11 @@ namespace Glitter { #include "effect_group.hpp" #include "../../KKdLib/database/object.h" #include "../../KKdLib/database/texture.h" -#include "../../KKdLib/io/path.h" +#include "../../KKdLib/io/path.hpp" #include "../../KKdLib/obj.h" #include "../../KKdLib/farc.h" #include "../../KKdLib/obj.h" -#include "../../KKdLib/str_utils.h" +#include "../../KKdLib/str_utils.hpp" #include "../data.h" #include "../object.h" #include "effect.hpp" diff --git a/src/CRE/Glitter/effect_inst.cpp b/src/CRE/Glitter/effect_inst.cpp index 41c8de8b..9ff27b83 100644 --- a/src/CRE/Glitter/effect_inst.cpp +++ b/src/CRE/Glitter/effect_inst.cpp @@ -4,7 +4,7 @@ */ #include "glitter.hpp" -#include "../../KKdLib/str_utils.h" +#include "../../KKdLib/str_utils.hpp" #include "../auth_3d.hpp" #include "../rob.hpp" @@ -329,27 +329,20 @@ namespace Glitter { enum_or(flags, EFFECT_INST_HAS_EXT_ANIM_SCALE); int32_t bone_index = ext_anim->bone_index; - if (bone_index == -1) { - if (flags & EFFECT_INST_EXT_ANIM_TRANS_ONLY) { - ext_anim->mat = mat4_identity; - mat4_get_translation(&mat, &ext_anim->translation); - } - else - ext_anim->mat = mat; - } - else { + if (bone_index != -1) { mat4* bone_mat = rob_chr->get_bone_data_mat(bone_index); if (!bone_mat) return; mat4_mult(bone_mat, &mat, &mat); - if (flags & EFFECT_INST_EXT_ANIM_TRANS_ONLY) { - ext_anim->mat = mat4_identity; - mat4_get_translation(&mat, &ext_anim->translation); - } - else - ext_anim->mat = mat; } + + if (flags & EFFECT_INST_EXT_ANIM_TRANS_ONLY) { + ext_anim->mat = mat4_identity; + mat4_get_translation(&mat, &ext_anim->translation); + } + else + ext_anim->mat = mat; goto SetFlags; } @@ -395,8 +388,10 @@ namespace Glitter { if (chara_id >= 0 && chara_id < ROB_CHARA_COUNT) { rob_chara* rob_chr = rob_chara_array_get(chara_id); if (rob_chr) { + mat = rob_chr->data.adjust_data.mat; + vec3 scale; - mat4_get_scale(&rob_chr->data.adjust_data.mat, &scale); + mat4_get_scale(&mat, &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); @@ -872,10 +867,10 @@ namespace Glitter { if (!rob_chr) return; - mat4 temp = rob_chr->data.adjust_data.mat; + mat4 mat = rob_chr->data.adjust_data.mat; vec3 scale; - mat4_get_scale(&temp, &scale); + mat4_get_scale(&rob_chr->data.adjust_data.mat, &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); @@ -889,10 +884,10 @@ namespace Glitter { if (bone_index != -1) { mat4* bone_mat = rob_chr->get_bone_data_mat(bone_index); if (bone_mat) - SetExtAnim(&temp, bone_mat, 0, set_flags); + SetExtAnim(&mat, bone_mat, 0, set_flags); } else - SetExtAnim(&temp, 0, 0, set_flags); + SetExtAnim(&mat, 0, 0, set_flags); } else if (flags & EFFECT_INST_GET_EXT_ANIM_MAT) { mat4 m = mat4_identity; @@ -1024,7 +1019,7 @@ namespace Glitter { } } } - + void XEffectInst::SetExtAnim(mat4* a2, mat4* a3, vec3* trans, bool set_flags) { EffectInstFlag flags = this->flags; if (a2) { diff --git a/src/CRE/Glitter/file_reader.cpp b/src/CRE/Glitter/file_reader.cpp index fba1801b..b9d29225 100644 --- a/src/CRE/Glitter/file_reader.cpp +++ b/src/CRE/Glitter/file_reader.cpp @@ -4,20 +4,13 @@ */ #include "glitter.hpp" -#include "../../KKdLib/io/path.h" +#include "../../KKdLib/io/path.hpp" #include "../../KKdLib/interpolation.h" #include "../../KKdLib/farc.hpp" -#include "../../KKdLib/str_utils.h" +#include "../../KKdLib/str_utils.hpp" #include "../data.hpp" namespace Glitter { -#if defined(CRE_DEV) - static float_t glitter_curve_key_add_key(bool has_error, - bool has_error_lerp, bool has_error_hermite, float_t* a, float_t* b, int32_t frame, - const uint8_t step, size_t i, float_t t1, float_t t2, float_t t2_old, - std::vector* keys_rev); -#endif - FileReader::FileReader(GLT) : file_handler(), farc(), effect_group(), load_count(), type(), path(), file(), state(), init_scene(), obj_db() { emission = -1.0f; @@ -838,55 +831,56 @@ namespace Glitter { } if (c->flags & CURVE_KEY_RANDOM_RANGE && keys.size()) { + Curve::Key* keys_data = keys.data(); if (type == Glitter::X && c->flags & CURVE_BAKED) if (c->flags & CURVE_RANDOM_RANGE_NEGATE) for (size_t i = 0; i < count; i++) { - float_t max = keys.data()[i].value; - float_t min = keys.data()[i].random_range; + float_t max = keys_data[i].value; + float_t min = keys_data[i].random_range; if (*(uint32_t*)&min != *(uint32_t*)&max) { - keys.data()[i].value = (float_t)(((double_t)min + (double_t)max) * 0.5); - keys.data()[i].random_range = (float_t)((double_t)max + keys_data[i].value = (float_t)(((double_t)min + (double_t)max) * 0.5); + keys_data[i].random_range = (float_t)((double_t)max - ((double_t)min + (double_t)max) * 0.5); } else - keys.data()[i].random_range = 0.0f; + keys_data[i].random_range = 0.0f; } else for (size_t i = 0; i < count; i++) { - float_t max = keys.data()[i].value; - float_t min = keys.data()[i].random_range; + float_t max = keys_data[i].value; + float_t min = keys_data[i].random_range; if (*(uint32_t*)&min != *(uint32_t*)&max) { - keys.data()[i].value = min; - keys.data()[i].random_range = (float_t)((double_t)max - (double_t)min); + keys_data[i].value = min; + keys_data[i].random_range = (float_t)((double_t)max - (double_t)min); } else - keys.data()[i].random_range = 0.0f; + keys_data[i].random_range = 0.0f; } bool has_key_random_range = false; if (type == Glitter::F2) { - if (count > 1 && keys.data()[0].random_range != 0.0f - && keys.data()[1].random_range != 0.0f) + if (count > 1 && keys_data[0].random_range != 0.0f + && keys_data[1].random_range != 0.0f) has_key_random_range = true; - else if (count > 1 && keys.data()[0].random_range != 0.0f - && keys.data()[1].random_range == 0.0f) { - keys.data()[0].value += keys.data()[0].random_range * 10.0f; - keys.data()[0].random_range = 0.0f; + else if (count > 1 && keys_data[0].random_range != 0.0f + && keys_data[1].random_range == 0.0f) { + keys_data[0].value += keys_data[0].random_range * 10.0f; + keys_data[0].random_range = 0.0f; } - if (count > 1 && keys.data()[count - 2].random_range != 0.0f - && keys.data()[count - 1].random_range != 0.0f) + if (count > 1 && keys_data[count - 2].random_range != 0.0f + && keys_data[count - 1].random_range != 0.0f) has_key_random_range = true; - else if (count > 1 && keys.data()[count - 2].random_range == 0.0f - && keys.data()[count - 1].random_range != 0.0f) { - keys.data()[count - 1].value += keys.data()[count - 1].random_range * 10.0f; - keys.data()[count - 1].random_range = 0.0f; + else if (count > 1 && keys_data[count - 2].random_range == 0.0f + && keys_data[count - 1].random_range != 0.0f) { + keys_data[count - 1].value += keys_data[count - 1].random_range * 10.0f; + keys_data[count - 1].random_range = 0.0f; } } if (!has_key_random_range) for (size_t i = 0; i < count; i++) - if (keys.data()[i].random_range != 0.0f) { + if (keys_data[i].random_range != 0.0f) { has_key_random_range = true; break; } @@ -896,204 +890,7 @@ namespace Glitter { } #if defined(CRE_DEV) - c->keys_rev = vector_old_empty(Curve::Key); - if (~c->flags & CURVE_BAKED) { - c->keys_rev.insert(c->keys_rev.end(), keys.begin(), keys.end()); - return; - } - else if (count == 1) { - keys.data()[0].frame = c->start_time; - c->keys_rev.push_back(keys.data()[0]); - return; - } - - bool curve_baked_half = false; - if (type == Glitter::F2 || (type == Glitter::X && ~c->flags & CURVE_BAKED_FULL)) - curve_baked_half = true; - - const uint8_t step = curve_baked_half ? 2 : 1; - - int32_t start_time = c->start_time; - int32_t end_time = c->start_time + (int32_t)((count - 1) * step); - c->end_time = end_time; - float_t* arr_a = force_malloc_s(float_t, count); - float_t* arr_b = force_malloc_s(float_t, count); - for (size_t i = 0; i < count; i++) { - keys.data()[i].frame = start_time + (int32_t)(i * step); - arr_a[i] = keys.data()[i].value; - arr_b[i] = keys.data()[i].random_range; - } - - static const float_t curve_baked_reverse_bias[] = { - 0.00001f, - 0.0001f, - 0.001f, - }; - - static const float_t curve_baked_half_reverse_bias[] = { - 0.000001f, - 0.00001f, - 0.0001f, - }; - - const float_t* reverse_bias = curve_baked_half - ? curve_baked_half_reverse_bias : curve_baked_reverse_bias; - const size_t reverse_min_count = curve_baked_half ? 5 : 4; - - std::vector keys_rev = vector_old_empty(Curve::Key); - float_t* a = arr_a; - float_t* b = arr_b; - size_t left_count = count; - int32_t frame = start_time; - int32_t prev_frame = start_time; - float_t t2_old = 0.0f; - float_t* val_arr = force_malloc_s(float_t, count); - while (left_count > 0) { - int32_t c = 0; - if (left_count < reverse_min_count) { - Curve::Key key; - if (left_count == 1) { - key.type = KEY_CONSTANT; - key.frame = frame; - key.value = a[0]; - key.tangent1 = t2_old; - key.tangent2 = 0.0f; - key.random_range = b[0]; - keys_rev.push_back(key); - t2_old = 0.0f; - } - else { - bool has_error = false; - bool has_error_lerp = false; - for (size_t j = 1; j < left_count; j++) { - float_t val = lerp(a[0], a[left_count - 1], (float_t)j / (float_t)left_count); - if (fabsf(val - a[0]) > reverse_bias[0]) { - has_error = true; - if (fabsf(val - a[j]) > reverse_bias[1]) { - has_error_lerp = true; - break; - } - } - } - - t2_old = glitter_curve_key_add_key(has_error, has_error_lerp, true, - a, b, frame, step, left_count, 0.0f, 0.0f, t2_old, &keys_rev); - } - break; - } - - float_t t1 = 0.0f; - float_t t2 = 0.0f; - float_t t1_prev = 0.0f; - float_t t2_prev = 0.0f; - bool has_prev_succeded = false; - bool constant = false; - bool prev_constant = false; - bool has_error = false; - bool has_error_lerp = false; - bool has_error_hermite = false; - bool has_prev_error = false; - bool has_prev_error_lerp = false; - bool has_prev_error_hermite = false; - - size_t i; - for (i = reverse_min_count - 1; i < left_count; i++) { - double_t tt1 = 0.0; - double_t tt2 = 0.0; - for (size_t j = 1; j < i - 1; j++) { - float_t _t1 = 0.0f; - float_t _t2 = 0.0f; - interpolate_chs_reverse_step_value(a, left_count, &_t1, &_t2, 0, i, j, step); - tt1 += _t1; - tt2 += _t2; - } - t1 = (float_t)(tt1 / (double_t)(i - 2)); - t2 = (float_t)(tt2 / (double_t)(i - 2)); - - constant = false; - has_error = false; - has_error_lerp = false; - has_error_hermite = false; - for (size_t j = 1; j < i; j++) { - float_t val = interpolate_chs_value(a[0], a[i], t1, t2, 0.0f, - (float_t)(i * step), (float_t)(j * step)); - float_t val_lerp = lerp(a[0], a[i], (float_t)j / (float_t)i); - if (fabsf(val - a[0]) > reverse_bias[0]) { - has_error = true; - constant = false; - if (fabsf(val_lerp - a[j]) > reverse_bias[1]) { - has_error_lerp = true; - if (fabsf(val - a[j]) > reverse_bias[2]) { - has_error_hermite = true; - break; - } - } - } - else - constant = true; - } - - if (!has_error_hermite) { - t1_prev = t1; - t2_prev = t2; - prev_constant = constant; - has_prev_succeded = true; - has_prev_error = has_error; - has_prev_error_lerp = has_error_lerp; - has_prev_error_hermite = has_error_hermite; - if (i < left_count) - continue; - } - - if (has_prev_succeded) { - if (prev_constant && ((i < left_count - 1 && a[i] == a[i + 1]) || (frame + i == end_time))) - c = (int32_t)i; - else - c = (int32_t)(i - 1); - t1 = t1_prev; - t2 = t2_prev; - has_error = has_prev_error; - has_error_lerp = has_prev_error_lerp; - has_error_hermite = has_prev_error_hermite; - } - else - c = (int32_t)i; - - if (has_error_hermite) - c = 1; - - t2_old = glitter_curve_key_add_key(has_error, has_error_lerp, has_error_hermite, - a, b, frame, step, c, t1, t2, t2_old, &keys_rev); - prev_constant = false; - has_prev_succeded = false; - break; - } - - if (has_prev_succeded) { - t2_old = glitter_curve_key_add_key(has_prev_error, has_prev_error_lerp, has_prev_error_hermite, - a, b, frame, step, i, t1_prev, t2_prev, t2_old, &keys_rev); - c = (int32_t)i; - } - prev_frame = frame; - frame += c * step; - a += c; - b += c; - left_count -= c; - } - free(val_arr); - - key.type = KEY_CONSTANT; - key.frame = start_time + (count - 1) * step; - key.value = arr_a[count - 1]; - key.tangent1 = t2_old; - key.tangent2 = 0.0f; - key.random_range = arr_b[count - 1]; - keys_rev.push_back(key); - free(arr_a); - free(arr_b); - c->keys_rev = keys_rev; - - c->Recalculate(type); + c->FitKeysIntoCurve(type); #endif } @@ -2606,55 +2403,4 @@ namespace Glitter { ptcl->data.uv_index_count = 0; return true; } - -#if defined(CRE_DEV) - static float_t glitter_curve_key_add_key(bool has_error, - bool has_error_lerp, bool has_error_hermite, float_t* a, float_t* b, int32_t frame, - const uint8_t step, size_t i, float_t t1, float_t t2, float_t t2_old, - std::vector* keys_rev) { - Curve::Key key; - if (has_error && has_error_lerp && has_error_hermite) { - float_t _t2 = t2_old; - for (size_t j = 0; j < i; j++) { - key.type = KEY_CONSTANT; - key.frame = (int32_t)(frame + j * step); - key.value = a[j]; - key.tangent1 = _t2; - key.tangent2 = 0.0f; - key.random_range = b[j]; - keys_rev->push_back(key); - _t2 = 0.0f; - } - } - else if (has_error && has_error_lerp) { - key.type = KEY_HERMITE; - key.frame = frame; - key.value = a[0]; - key.tangent1 = t2_old; - key.tangent2 = t1; - key.random_range = b[0]; - keys_rev->push_back(key); - return t2; - } - else if (has_error || (i > 1 && b[0] != b[1])) { - key.type = KEY_LINEAR; - key.frame = frame; - key.value = a[0]; - key.tangent1 = 0.0f; - key.tangent2 = 0.0f; - key.random_range = b[0]; - keys_rev->push_back(key); - } - else { - key.type = KEY_CONSTANT; - key.frame = frame; - key.value = a[0]; - key.tangent1 = 0.0f; - key.tangent2 = 0.0f; - key.random_range = b[0]; - keys_rev->push_back(key); - } - return 0.0f; - } -#endif } diff --git a/src/CRE/Glitter/glitter.hpp b/src/CRE/Glitter/glitter.hpp index 06b552f0..ab00a396 100644 --- a/src/CRE/Glitter/glitter.hpp +++ b/src/CRE/Glitter/glitter.hpp @@ -9,15 +9,14 @@ #include #include #include "../../KKdLib/database/object.hpp" -#include "../../KKdLib/f2/header.h" +#include "../../KKdLib/f2/header.hpp" #include "../../KKdLib/f2/struct.hpp" -#include "../../KKdLib/default.h" +#include "../../KKdLib/default.hpp" #include "../../KKdLib/farc.hpp" #include "../../KKdLib/hash.hpp" -#include "../../KKdLib/mat.h" +#include "../../KKdLib/mat.hpp" #include "../../KKdLib/txp.hpp" -#include "../../KKdLib/vec.h" -#include "../../KKdLib/vector.h" +#include "../../KKdLib/vec.hpp" #include "../file_handler.hpp" #include "../frame_rate_control.hpp" #include "../static_var.h" @@ -502,6 +501,7 @@ namespace Glitter { float_t F2Randomize(GLT, float_t value, Random* random); float_t F2RandomizeKey(GLT, Curve::Key* key, Random* random); #if defined(CRE_DEV) || defined(CLOUD_DEV) + void FitKeysIntoCurve(GLT); void Recalculate(GLT); #endif bool XGetValue(float_t frame, @@ -1392,7 +1392,7 @@ namespace Glitter { #endif }; - class GltParticleManager : public Task { + class GltParticleManager : public app::Task { public: std::vector scenes; std::vector file_readers; diff --git a/src/CRE/Glitter/render_scene.cpp b/src/CRE/Glitter/render_scene.cpp index 88bf2e7a..1afeb46f 100644 --- a/src/CRE/Glitter/render_scene.cpp +++ b/src/CRE/Glitter/render_scene.cpp @@ -1009,15 +1009,15 @@ namespace Glitter { || rend_group->blend_mode == PARTICLE_BLEND_TYPICAL) emission = rend_group->emission; - 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, &((render_context*)GPM_VAL->rctx)->camera->view, - &((render_context*)GPM_VAL->rctx)->camera->projection); - shader_state_matrix_set_texture(&shaders_ft, 0, &mat4_identity); - shader_state_matrix_set_texture(&shaders_ft, 1, &mat4_identity); - shader_env_vert_set_ptr(&shaders_ft, 3, &vec4_identity); + shaders_ft.state_material_set_emission(false, emission, emission, emission, 1.0f); + shaders_ft.state_matrix_set_mvp(rend_group->mat_draw, + ((render_context*)GPM_VAL->rctx)->camera->view, + ((render_context*)GPM_VAL->rctx)->camera->projection); + shaders_ft.state_matrix_set_texture(0, mat4_identity); + shaders_ft.state_matrix_set_texture(1, mat4_identity); + shaders_ft.env_vert_set(3, vec4_identity); - shader_set(&shaders_ft, SHADER_FT_GLITTER_PT); + shaders_ft.set(SHADER_FT_GLITTER_PT); switch (rend_group->type) { case PARTICLE_QUAD: { static const GLsizei buffer_size = sizeof(Buffer); @@ -1038,8 +1038,7 @@ namespace Glitter { gl_state_bind_array_buffer(0); gl_state_bind_element_array_buffer(rend_group->ebo); - shader_draw_elements(&shaders_ft, - GL_TRIANGLES, (GLsizei)(6 * rend_group->disp), GL_UNSIGNED_INT, 0); + shaders_ft.draw_elements(GL_TRIANGLES, (GLsizei)(6 * rend_group->disp), GL_UNSIGNED_INT, 0); gl_state_bind_element_array_buffer(0); glDisableVertexAttribArray(0); @@ -1069,7 +1068,7 @@ namespace Glitter { const GLenum mode = rend_group->type == PARTICLE_LINE ? GL_LINE_STRIP : GL_TRIANGLE_STRIP; for (std::pair& i : rend_group->draw_list) - shader_draw_arrays(&shaders_ft, mode, i.first, i.second); + shaders_ft.draw_arrays(mode, i.first, i.second); glDisableVertexAttribArray(0); glDisableVertexAttribArray(3); @@ -2167,14 +2166,15 @@ namespace Glitter { if (rend_group->flags & PARTICLE_EMISSION || rend_group->blend_mode == PARTICLE_BLEND_TYPICAL) emission = rend_group->emission; - 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, &((render_context*)GPM_VAL->rctx)->camera->view, - &((render_context*)GPM_VAL->rctx)->camera->projection); - shader_state_matrix_set_texture(&shaders_ft, 0, &mat4_identity); - shader_state_matrix_set_texture(&shaders_ft, 1, &mat4_identity); + shaders_ft.state_material_set_emission(false, emission, emission, emission, 1.0f); + shaders_ft.state_matrix_set_mvp(rend_group->mat_draw, + ((render_context*)GPM_VAL->rctx)->camera->view, + ((render_context*)GPM_VAL->rctx)->camera->projection); + shaders_ft.state_matrix_set_texture(0, mat4_identity); + shaders_ft.state_matrix_set_texture(1, mat4_identity); + shaders_ft.env_vert_set(3, vec4_identity); - shader_set(&shaders_ft, SHADER_FT_GLITTER_PT); + shaders_ft.set(SHADER_FT_GLITTER_PT); switch (rend_group->type) { case PARTICLE_QUAD: { static const GLsizei buffer_size = sizeof(Buffer); @@ -2195,8 +2195,7 @@ namespace Glitter { gl_state_bind_array_buffer(0); gl_state_bind_element_array_buffer(rend_group->ebo); - shader_draw_elements(&shaders_ft, - GL_TRIANGLES, (GLsizei)(6 * rend_group->disp), GL_UNSIGNED_INT, 0); + shaders_ft.draw_elements(GL_TRIANGLES, (GLsizei)(6 * rend_group->disp), GL_UNSIGNED_INT, 0); gl_state_bind_element_array_buffer(0); glDisableVertexAttribArray(0); @@ -2225,7 +2224,7 @@ namespace Glitter { const GLenum mode = rend_group->type == PARTICLE_LINE ? GL_LINE_STRIP : GL_TRIANGLE_STRIP; for (std::pair& i : rend_group->draw_list) - shader_draw_arrays(&shaders_ft, mode, i.first, i.second); + shaders_ft.draw_arrays(mode, i.first, i.second); glDisableVertexAttribArray(0); glDisableVertexAttribArray(3); diff --git a/src/CRE/auth_3d.cpp b/src/CRE/auth_3d.cpp index 1a5d974e..6b7c0310 100644 --- a/src/CRE/auth_3d.cpp +++ b/src/CRE/auth_3d.cpp @@ -6,13 +6,14 @@ #include "auth_3d.hpp" #include "../KKdLib/hash.hpp" #include "../KKdLib/interpolation.h" -#include "../KKdLib/str_utils.h" +#include "../KKdLib/str_utils.hpp" #include "draw_task.h" #include "object.hpp" #include "rob.hpp" +#include "stage.hpp" namespace auth_3d_detail { - class TaskAuth3d : public Task { + class TaskAuth3d : public app::Task { public: TaskAuth3d(); virtual ~TaskAuth3d() override; @@ -173,7 +174,7 @@ static void auth_3d_farc_load(auth_3d_farc* a3da_farc, const char* mdata_dir); static void auth_3d_farc_load_modern(auth_3d_farc* a3da_farc, void* data); static void auth_3d_farc_read_file(auth_3d_farc* a3da_farc, const char* mdata_dir); static void auth_3d_farc_read_file_modern(auth_3d_farc* a3da_farc, void* data); -static bool auth_3d_farc_read_func(auth_3d_farc* a3da_farc, void* data, size_t size); +static bool auth_3d_farc_read_func(auth_3d_farc* a3da_farc, const void* data, size_t size); static void auth_3d_farc_unload(auth_3d_farc* a3da_farc); static void auth_3d_uid_file_load(auth_3d_uid_file* uid_file); @@ -185,11 +186,17 @@ static void auth_3d_uid_file_modern_unload(auth_3d_uid_file_modern* uid_file); static void auth_3d_uid_file_unload_file(auth_3d_uid_file* uid_file); static void auth_3d_uid_file_modern_unload_file(auth_3d_uid_file_modern* uid_file); +static void Auth3dTestTask__SetAuth3dId(Auth3dTestTask* tt); +static void Auth3dTestTask__SetStage(Auth3dTestTask* tt); + auth_3d_data_struct* auth_3d_data; auth_3d_detail::TaskAuth3d task_auth_3d; +Auth3dTestTask auth_3d_test_task; + static int16_t auth_3d_load_counter; extern render_context* rctx_ptr; +extern vec4u8 clear_color; auth_3d::auth_3d() : uid(), id(), mat(), enable(), camera_root_update(), visible(), repeat(), ended(), left_right_reverse(), once(), alpha(), chara_id(), shadow(), frame_rate(), frame(), @@ -1442,14 +1449,6 @@ void auth_3d_post_process::reset() { scene_fade_init = vec4u_null; } -auth_3d_data_struct::auth_3d_data_struct() { - -} - -auth_3d_data_struct::~auth_3d_data_struct() { - -} - auth_3d_farc::auth_3d_farc() : load_count(), name(), state(), farc(), data(), size() { } @@ -1476,14 +1475,144 @@ auth_3d_uid_file_modern::~auth_3d_uid_file_modern() { } +auth_3d_data_struct::auth_3d_data_struct() { + +} + +auth_3d_data_struct::~auth_3d_data_struct() { + +} + +Auth3dTestTask::Auth3dTestTask::Window::Window() { + stage_link_change = true; + obj_link = true; +} + +Auth3dTestTask::Auth3dTestTask() { + field_1C0 = 10; + field_1C4 = 10; + field_1C8 = 10; + field_1CC = 10; + field_1D0 = false; + field_1D4 = 0; + auth_3d_id = -1; + auth_3d_uid = -1; + repeat = true; + left_right_reverse = false; + field_1E3 = false; + field_1E4 = 0; + field_1E8 = false; + field_1E9 = false; + black_mask_listener = false; + field_1EB = true; + field_1EC = 1; + effcmn_obj_set = -1; + field_210 = 1; + field_328 = false; + field_329 = true; + field_32A = true; + stage_index = -1; + load_stage_index = 0; + trans_value = vec3_null; + rot_y_value = 0.0f; + field_388 = false; + field_38C = 0; + field_390 = false; + field_394 = 0; +} + +Auth3dTestTask:: ~Auth3dTestTask() { + +} + +bool Auth3dTestTask::Init() { + data_struct* data = rctx_ptr->data; + object_database* obj_db = &data->data_ft.obj_db; + + field_1D0 = false; + field_1D4 = 0; + auth_3d_id = -1; + auth_3d_uid = -1; + repeat = true; + left_right_reverse = false; + field_1E3 = false; + field_1E4 = 0; + field_1E8 = false; + field_1E9 = false; + black_mask_listener = false; + field_1EC = 1; + effcmn_obj_set = obj_db->get_object_set_id("EFFCMN"); + field_210 = 1; + field_328 = false; + field_329 = true; + field_32A = true; + stage_index = -1; + load_stage_index = 0; + trans_value = vec3_null; + rot_y_value = 0.0f; + field_390 = true; + field_394 = 0; + category = {}; + load_category = {}; + obj_sets = {}; + + rctx_ptr->draw_pass.shadow_ptr->self_shadow = true; + clear_color = { 0x99, 0x99, 0x99, 0x00 }; + task_stage_load("A3D_STAGE"); + object_storage_load_set(data, obj_db, effcmn_obj_set); + return true; +} + +bool Auth3dTestTask::Ctrl() { + Auth3dTestTask__SetStage(this); + Auth3dTestTask__SetAuth3dId(this); + + if (field_1EC == 1 && !object_storage_load_obj_set_check_not_read(effcmn_obj_set)) + field_1EC = 4; + + if (field_1D4 == 1 && auth_3d_data_check_id_loaded(&auth_3d_id)) + field_1D4 = 2; + + if (field_1D4 == 2) { + auth_3d_data_set_enable(&auth_3d_id, true); + auth_3d_data_set_paused(&auth_3d_id, false); + auth_3d_data_set_repeat(&auth_3d_id, repeat); + auth_3d_data_set_left_right_reverse(&auth_3d_id, left_right_reverse); + field_1D4 = 4; + } + + if (auth_3d_data_check_id_not_empty(&auth_3d_id)) { + mat4 mat; + mat4_translate(trans_value.x, trans_value.y, trans_value.z, &mat); + mat4_rotate_y_mult(&mat, rot_y_value * DEG_TO_RAD_FLOAT, &mat); + auth_3d_data_set_mat(&auth_3d_id, &mat); + } + return false; +} + +bool Auth3dTestTask::Dest() { + auth_3d_data_unload_id(auth_3d_id, rctx_ptr); + object_storage_unload_set(effcmn_obj_set); + task_stage_unload(); + clear_color = { 0x00, 0x00, 0x00, 0xFF }; + rctx_ptr->draw_pass.shadow_ptr->self_shadow = true; + if (category.size()) + auth_3d_data_unload_category(category.c_str()); + category = {}; + load_category = {}; + for (uint32_t& i : obj_sets) + object_storage_unload_set(i); + return true; +} + /* -void sub_140248480(string *auth_3d_data, list_int32_t *a2) +void __fastcall sub_140248480(string *a1, list_int32_t *a2) { - list_int32_t_node *uid_file; // rcx + list_int32_t_node *v4; // rcx list_int32_t_node *v5; // rbx char *v6; // rcx int32_t *i; // rbx - char *v8; // rax + const char *v8; // rax size_t v9; // r8 size_t v10; // rsi char *v11; // rdi @@ -1501,7 +1630,7 @@ void sub_140248480(string *auth_3d_data, list_int32_t *a2) pv_db_pv_difficulty *v23; // rcx string_union v24; // kr00_16 pv_item *__shifted(pv_item,8) v25; // rbx - char *v26; // rcx + const char *v26; // rcx object_info v27; // eax list_int32_t_node *v28; // rdi list_int32_t_node *v29; // rax @@ -1528,31 +1657,31 @@ void sub_140248480(string *auth_3d_data, list_int32_t *a2) string Dst; // [rsp+30h] [rbp-39h] BYREF string v51; // [rsp+30h] [rbp-39h] FORCED BYREF string Memory; // [rsp+50h] [rbp-19h] BYREF - vector_old_int32_t uids; // [rsp+70h] [rbp+7h] BYREF + vector_int32_t uids; // [rsp+70h] [rbp+7h] BYREF v49 = -2i64; - uid_file = a2->head->next; + v4 = a2->head->next; a2->head->next = a2->head; a2->head->prev = a2->head; a2->size = 0i64; - if ( uid_file != a2->head ) + if ( v4 != a2->head ) { do { - v5 = uid_file->next; - operator delete(uid_file); - uid_file = v5; + v5 = v4->next; + operator delete(v4); + v4 = v5; } while ( v5 != a2->head ); } uids.begin = 0i64; uids.end = 0i64; uids.capacity_end = 0i64; - if ( auth_3d_data->capacity < 0x10 ) - v6 = (char *)auth_3d_data; + if ( a1->capacity < 0x10 ) + v6 = (char *)a1; else - v6 = auth_3d_data->data.ptr; - sub_1401CBC70(v6, &uids); + v6 = a1->data.ptr; + auth_3d_data_get_category_uids(v6, &uids); for ( i = uids.begin; i != uids.end; ++i ) { v8 = auth_3d_data_get_uid_name(*i); @@ -1570,7 +1699,7 @@ void sub_140248480(string *auth_3d_data, list_int32_t *a2) { v9 = 0i64; } - string_append_char_str(&Dst, v8, v9); + string_assign_char_str(&Dst, v8, v9); v10 = Dst.length; if ( Dst.length ) { @@ -1623,9 +1752,9 @@ void sub_140248480(string *auth_3d_data, list_int32_t *a2) if ( Dst.capacity >= 0x10 ) operator delete(Dst.data.ptr); } - if ( !string_compare_ptr_char(auth_3d_data, "ITMPV", 0i64, 5ui64) ) + if ( !string::find(a1, "ITMPV", 0i64, 5ui64) ) { - sub_1400215A0(auth_3d_data, &Memory, 5i64, -1i64); + sub_1400215A0(a1, &Memory, 5i64, -1i64); v21 = sub_1400D29A0(&Memory, 0xAu); v22 = task_pv_db_get_pv(v21); if ( v22 ) @@ -1635,7 +1764,7 @@ void sub_140248480(string *auth_3d_data, list_int32_t *a2) { v51.data = 0ui64; v51.length = 0i64; - sub_14023FDE0((vector_old_pv_item *)&v51, &v23->pv_item); + sub_14023FDE0((vector_pv_item *)&v51, &v23->pv_item); v24 = v51.data; if ( v51.data.ptr != *(char **)&v51.data.data[8] ) { @@ -1644,7 +1773,10 @@ void sub_140248480(string *auth_3d_data, list_int32_t *a2) { if ( ADJ(v25)->index > 0 ) { - v26 = (char *)(ADJ(v25)->name.capacity < 0x10 ? v25 : ADJ(v25)->name.data.ptr); + if ( ADJ(v25)->name.capacity < 0x10 ) + v26 = (const char *)v25; + else + v26 = ADJ(v25)->name.data.ptr; v27 = obj_database_get_object_info(v26); if ( v27 != -1 ) { @@ -1685,9 +1817,12 @@ void sub_140248480(string *auth_3d_data, list_int32_t *a2) if ( Memory.capacity >= 0x10 ) operator delete(Memory.data.ptr); } - if ( !string_compare_ptr_char(auth_3d_data, "EFFCHRPV", 0i64, 8ui64) ) + if ( !string::find(a1, "EFFCHRPV", 0i64, 8ui64) ) { - v32 = (char *)(auth_3d_data->capacity < 0x10 ? auth_3d_data : auth_3d_data->data.ptr); + if ( a1->capacity < 0x10 ) + v32 = (char *)a1; + else + v32 = a1->data.ptr; a4 = obj_database_get_object_set(v32); if ( a4 != -1 ) { @@ -1706,11 +1841,11 @@ void sub_140248480(string *auth_3d_data, list_int32_t *a2) v51.capacity = 15i64; v51.length = 0i64; v51.data.data[0] = 0; - string_append_char_str(&v51, null_string, 0i64); - v36 = string_compare_ptr_char(auth_3d_data, "STGPV", 0i64, 5ui64); + string_assign_char_str(&v51, null_string, 0i64); + v36 = string::find(a1, "STGPV", 0i64, 5ui64); if ( v36 != -1 ) { - v37 = sub_1400215A0(auth_3d_data, &Memory, v36, 8i64); + v37 = sub_1400215A0(a1, &Memory, v36, 8i64); if ( &v51 != v37 ) { if ( v51.capacity >= 0x10 ) @@ -1736,10 +1871,10 @@ void sub_140248480(string *auth_3d_data, list_int32_t *a2) if ( Memory.capacity >= 0x10 ) operator delete(Memory.data.ptr); } - v38 = string_compare_ptr_char(auth_3d_data, "STGD2PV", 0i64, 7ui64); + v38 = string::find(a1, "STGD2PV", 0i64, 7ui64); if ( v38 != -1 ) { - v39 = sub_1400215A0(auth_3d_data, &Memory, v38, 10i64); + v39 = sub_1400215A0(a1, &Memory, v38, 10i64); if ( &v51 != v39 ) { if ( v51.capacity >= 0x10 ) @@ -1829,6 +1964,15 @@ bool auth_3d_data_check_category_loaded(uint32_t category_hash) { return auth_3d_data_struct_check_category_loaded(auth_3d_data, category_hash); } +bool auth_3d_data_check_id_loading(int32_t* id) { + if (*id >= 0 && ((*id & 0x7FFF) < AUTH_3D_DATA_COUNT)) { + auth_3d* auth = &auth_3d_data->data[*id & 0x7FFF]; + if (auth->id == *id) + return auth->state == 1; + } + return false; +} + bool auth_3d_data_check_id_loaded(int32_t* id) { if (*id >= 0 && ((*id & 0x7FFF) < AUTH_3D_DATA_COUNT)) { auth_3d* auth = &auth_3d_data->data[*id & 0x7FFF]; @@ -2045,6 +2189,16 @@ int32_t auth_3d_data_get_uid(int32_t* id) { return -1; } +const char* auth_3d_data_get_uid_name(int32_t uid, auth_3d_database* auth_3d_db) { + if (uid < 0 || uid > auth_3d_db->uid.size()) + return 0; + + auth_3d_database_uid* db_uid = &auth_3d_db->uid[uid]; + if (db_uid->enabled) + return db_uid->name.c_str(); + return 0; +} + void auth_3d_data_load_category(const char* category_name, const char* mdata_dir) { auth_3d_data_struct_load_category(auth_3d_data, category_name, mdata_dir); } @@ -2143,6 +2297,16 @@ void auth_3d_data_set_chara_id(int32_t* id, int32_t value) { } } +void auth_3d_data_set_draw_task_flags_alpha(int32_t* id, draw_task_flags draw_task_flags, float_t alpha) { + if (*id >= 0 && ((*id & 0x7FFF) < AUTH_3D_DATA_COUNT)) { + auth_3d* auth = &auth_3d_data->data[*id & 0x7FFF]; + if (auth->id == *id) { + auth->draw_task_flags = draw_task_flags; + auth->alpha = alpha; + } + } +} + void auth_3d_data_set_enable(int32_t* id, bool value) { if (*id >= 0 && ((*id & 0x7FFF) < AUTH_3D_DATA_COUNT)) { auth_3d* auth = &auth_3d_data->data[*id & 0x7FFF]; @@ -2269,7 +2433,7 @@ void auth_3d_data_free() { } void task_auth_3d_append_task() { - TaskWork::AppendTask(&task_auth_3d, "AUTH_3D"); + app::TaskWork::AppendTask(&task_auth_3d, "AUTH_3D"); } void task_auth_3d_free_task() { @@ -2731,30 +2895,30 @@ static void auth_3d_camera_auxiliary_restore_prev_value(auth_3d_camera_auxiliary post_process_tone_map* tm = rctx->post_process.tone_map; if (ca->flags & AUTH_3D_CAMERA_AUXILIARY_AUTO_EXPOSURE) - post_process_tone_map_set_auto_exposure(tm, true); + tm->set_auto_exposure(true); if (ca->flags & AUTH_3D_CAMERA_AUXILIARY_EXPOSURE) - post_process_tone_map_set_exposure(tm, 1.0); + tm->set_exposure(1.0); if (ca->flags & AUTH_3D_CAMERA_AUXILIARY_GAMMA) - post_process_tone_map_set_gamma(tm, 1.0); + tm->set_gamma(1.0); if (ca->flags & AUTH_3D_CAMERA_AUXILIARY_GAMMA_RATE) - post_process_tone_map_set_gamma_rate(tm, 1.0); + tm->set_gamma_rate(1.0); if (ca->flags & AUTH_3D_CAMERA_AUXILIARY_SATURATE) - post_process_tone_map_set_saturate_coeff(tm, 1.0); + tm->set_saturate_coeff(1.0); } static void auth_3d_camera_auxiliary_set(auth_3d_camera_auxiliary* ca, render_context* rctx) { post_process_tone_map* tm = rctx->post_process.tone_map; if (ca->flags & AUTH_3D_CAMERA_AUXILIARY_AUTO_EXPOSURE) - post_process_tone_map_set_auto_exposure(tm, ca->auto_exposure_value > 0.0); + tm->set_auto_exposure(ca->auto_exposure_value > 0.0f); if (ca->flags & AUTH_3D_CAMERA_AUXILIARY_EXPOSURE) - post_process_tone_map_set_exposure(tm, ca->exposure_value); + tm->set_exposure(ca->exposure_value); if (ca->flags & AUTH_3D_CAMERA_AUXILIARY_GAMMA) - post_process_tone_map_set_gamma(tm, ca->gamma_value); + tm->set_gamma(ca->gamma_value); if (ca->flags & AUTH_3D_CAMERA_AUXILIARY_GAMMA_RATE) - post_process_tone_map_set_gamma_rate(tm, ca->gamma_rate_value); + tm->set_gamma_rate(ca->gamma_rate_value); if (ca->flags & AUTH_3D_CAMERA_AUXILIARY_SATURATE) - post_process_tone_map_set_saturate_coeff(tm, ca->saturate_value); + tm->set_saturate_coeff(ca->saturate_value); } static void auth_3d_camera_root_ctrl(auth_3d_camera_root* cr, @@ -3317,8 +3481,8 @@ static void auth_3d_m_object_hrc_disp(auth_3d_m_object_hrc* moh, auth_3d* auth, } static void auth_3d_m_object_hrc_list_ctrl(auth_3d_m_object_hrc* moh, mat4* parent_mat) { - if (!moh->model_transform.visible) - return; + //if (!moh->model_transform.visible) + // return; auth_3d_object_node* node = moh->node.data(); size_t instance_count = moh->instance.size(); @@ -3330,8 +3494,8 @@ static void auth_3d_m_object_hrc_list_ctrl(auth_3d_m_object_hrc* moh, mat4* pare mat4 mat = moh->model_transform.mat; for (auth_3d_object_instance& i : moh->instance) { - if (!i.model_transform.visible) - continue; + //if (!i.model_transform.visible) + // continue; auth_3d_object_model_transform_mat_mult(&i.model_transform, &mat); int32_t* object_bone_indices = i.object_bone_indices.data(); @@ -3618,8 +3782,8 @@ static void auth_3d_object_disp(auth_3d_object* o, auth_3d* auth, render_context } static void auth_3d_object_list_ctrl(auth_3d_object* o, mat4* parent_mat) { - if (!o->model_transform.visible) - return; + //if (!o->model_transform.visible) + // return; auth_3d_model_transform_set_mat(&o->model_transform, parent_mat); @@ -3668,7 +3832,7 @@ static void auth_3d_object_hrc_load(auth_3d* auth, auth_3d_object_hrc* oh, i.bone_id = -1; uint64_t name_hash = hash_string_fnv1a64m(&i.name); for (uint32_t j = 0; j < skin->bones_count; j++) - if (hash_utf8_fnv1a64m(string_data(&skin->bones[j].name)) == name_hash) { + if (hash_utf8_fnv1a64m(skin->bones[j].name) == name_hash) { i.bone_id = skin->bones[j].id; break; } @@ -3742,8 +3906,8 @@ static void auth_3d_object_hrc_disp(auth_3d_object_hrc* oh, auth_3d* auth, rende } static void auth_3d_object_hrc_list_ctrl(auth_3d_object_hrc* oh, mat4* mat) { - if (oh->node.size() < 1 || !oh->node[0].model_transform.visible) - return; + //if (oh->node.size() < 1 || !oh->node[0].model_transform.visible) + // return; auth_3d_object_hrc_nodes_mat_mult(oh, mat); @@ -3802,7 +3966,7 @@ static void auth_3d_object_instance_load(auth_3d* auth, auth_3d_object_instance* mat4* mats = oi->mats.data(); for (uint32_t i = 0; i < skin->bones_count; i++) { - uint64_t name_hash = hash_utf8_fnv1a64m(string_data(&skin->bones[i].name)); + uint64_t name_hash = hash_utf8_fnv1a64m(skin->bones[i].name); for (auth_3d_object_node& j : moh->node) if (hash_string_fnv1a64m(&j.name) == name_hash) { int32_t bone_id = skin->bones[i].id; @@ -4151,23 +4315,23 @@ static void auth_3d_post_process_restore_prev_value(auth_3d_post_process* pp, re post_process_tone_map* tm = rctx->post_process.tone_map; if (pp->flags_init & AUTH_3D_POST_PROCESS_INTENSITY) - post_process_blur_set_intensity(blur, &pp->intensity_init); + blur->set_intensity(pp->intensity_init); if (pp->flags_init & AUTH_3D_POST_PROCESS_LENS_FLARE) - post_process_tone_map_set_lens_ghost(tm, pp->lens_flare_init); + tm->set_lens_flare(pp->lens_flare_init); if (pp->flags_init & AUTH_3D_POST_PROCESS_LENS_GHOST) - post_process_tone_map_set_lens_ghost(tm, pp->lens_ghost_init); + tm->set_lens_ghost(pp->lens_ghost_init); if (pp->flags_init & AUTH_3D_POST_PROCESS_LENS_SHAFT) - post_process_tone_map_set_lens_shaft(tm, pp->lens_shaft_init); + tm->set_lens_shaft(pp->lens_shaft_init); if (pp->flags_init & AUTH_3D_POST_PROCESS_RADIUS) - post_process_blur_set_radius(blur, &pp->radius_init); + blur->set_radius(pp->radius_init); if (pp->flags_init & AUTH_3D_POST_PROCESS_SCENE_FADE) { vec4 scene_fade_init = pp->scene_fade_init; - post_process_tone_map_set_scene_fade(tm, &scene_fade_init); + tm->set_scene_fade(scene_fade_init); } } @@ -4177,59 +4341,57 @@ static void auth_3d_post_process_set(auth_3d_post_process* pp, render_context* r if (pp->flags & AUTH_3D_POST_PROCESS_INTENSITY) { if (~pp->flags_init & AUTH_3D_POST_PROCESS_INTENSITY) { - post_process_blur_get_intensity(blur, &pp->intensity_init); + pp->intensity_init = blur->get_intensity(); enum_or(pp->flags_init, AUTH_3D_POST_PROCESS_INTENSITY); } - post_process_blur_set_intensity(blur, (vec3*)&pp->intensity.value); + blur->set_intensity(*(vec3*)&pp->intensity.value); } if (pp->flags & AUTH_3D_POST_PROCESS_LENS_FLARE) { if (~pp->flags_init & AUTH_3D_POST_PROCESS_LENS_FLARE) { - pp->lens_flare_init = post_process_tone_map_get_lens_flare(tm); + pp->lens_flare_init = tm->get_lens_flare(); enum_or(pp->flags_init, AUTH_3D_POST_PROCESS_LENS_FLARE); } - post_process_tone_map_set_lens_ghost(tm, pp->lens_flare_value); + tm->set_lens_flare(pp->lens_flare_value); } if (pp->flags & AUTH_3D_POST_PROCESS_LENS_GHOST) { if (~pp->flags_init & AUTH_3D_POST_PROCESS_LENS_GHOST) { - pp->lens_ghost_init = post_process_tone_map_get_lens_ghost(tm); + pp->lens_ghost_init = tm->get_lens_ghost(); enum_or(pp->flags_init, AUTH_3D_POST_PROCESS_LENS_GHOST); } - post_process_tone_map_set_lens_ghost(tm, pp->lens_ghost_value); + tm->set_lens_ghost(pp->lens_ghost_value); } if (pp->flags & AUTH_3D_POST_PROCESS_LENS_SHAFT) { if (~pp->flags_init & AUTH_3D_POST_PROCESS_LENS_SHAFT) { - pp->lens_shaft_init = post_process_tone_map_get_lens_shaft(tm); + pp->lens_shaft_init = tm->get_lens_shaft(); enum_or(pp->flags_init, AUTH_3D_POST_PROCESS_LENS_SHAFT); } - post_process_tone_map_set_lens_shaft(tm, pp->lens_shaft_value); + tm->set_lens_shaft(pp->lens_shaft_value); } if (pp->flags & AUTH_3D_POST_PROCESS_RADIUS) { if (~pp->flags_init & AUTH_3D_POST_PROCESS_RADIUS) { - post_process_blur_get_radius(blur, &pp->radius_init); + pp->radius_init = blur->get_radius(); enum_or(pp->flags_init, AUTH_3D_POST_PROCESS_RADIUS); } - post_process_blur_set_radius(blur, (vec3*)&pp->radius.value); + blur->set_radius(*(vec3*)&pp->radius.value); } if (pp->flags & AUTH_3D_POST_PROCESS_SCENE_FADE) { if (~pp->flags_init & AUTH_3D_POST_PROCESS_SCENE_FADE) { - vec4 scene_fade_init; - post_process_tone_map_get_scene_fade(tm, &scene_fade_init); - pp->scene_fade_init = scene_fade_init; + pp->scene_fade_init = tm->get_scene_fade(); enum_or(pp->flags_init, AUTH_3D_POST_PROCESS_SCENE_FADE); } vec4 scene_fade = pp->scene_fade.value; - post_process_tone_map_set_scene_fade(tm, &scene_fade); + tm->set_scene_fade(scene_fade); } } @@ -4396,7 +4558,7 @@ static void auth_3d_farc_read_file(auth_3d_farc* a3da_farc, const char* mdata_di 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_callback_data(0, - (void(*)(void*, void*, size_t))auth_3d_farc_read_func, a3da_farc); + (void(*)(void*, const void*, size_t))auth_3d_farc_read_func, a3da_farc); else a3da_farc->state = 2; } @@ -4413,19 +4575,20 @@ static void auth_3d_farc_read_file_modern(auth_3d_farc* a3da_farc, void* data) { if (a3da_farc->file_handler.read_file(data, a3da_farc->path.c_str(), a3da_farc->file.c_str())) a3da_farc->file_handler.set_callback_data(0, - (void(*)(void*, void*, size_t))auth_3d_farc_read_func, a3da_farc); + (void(*)(void*, const void*, size_t))auth_3d_farc_read_func, a3da_farc); else a3da_farc->state = 2; } -static bool auth_3d_farc_read_func(auth_3d_farc* a3da_farc, void* data, size_t size) { +static bool auth_3d_farc_read_func(auth_3d_farc* a3da_farc, const void* data, size_t size) { if (a3da_farc->state == 1) { a3da_farc->state = 2; a3da_farc->data = data; a3da_farc->size = size; } - a3da_farc->farc = new farc; + if (!a3da_farc->farc) + a3da_farc->farc = new farc; if (!a3da_farc->farc) return false; @@ -4532,3 +4695,163 @@ static void auth_3d_uid_file_modern_unload_file(auth_3d_uid_file_modern* uid_fil uid_file->state = 0; auth_3d_data->uid_files_modern.erase(uid_file->hash); } + +static void Auth3dTestTask__SetAuth3dId(Auth3dTestTask* tt) { + if (task_stage_check_not_loaded() || tt->auth_3d_uid == -1 + || !tt->load_category.size() || tt->auth_3d_uid == auth_3d_data_get_uid(&tt->auth_3d_id)) + return; + + if (tt->load_category.compare(tt->category)) { + if (tt->category.size()) { + auth_3d_data_unload_category(tt->category.c_str()); + for (uint32_t& i : tt->obj_sets) + object_storage_unload_set(i); + tt->obj_sets.clear(); + } + auth_3d_data_load_category(tt->load_category.c_str()); + tt->category = tt->load_category; + if (tt->window.obj_link) + tt->field_394 = 1; + } + + if (!auth_3d_data_check_category_loaded(tt->category.c_str())) + return; + + if (tt->field_394 == 1) { + data_struct* data = rctx_ptr->data; + object_database* obj_db = &data->data_ft.obj_db; + + const char* cat_str = tt->category.c_str(); + size_t cat_len = tt->category.size(); + + if (!memcmp(cat_str, "ITMPV", 5)) { + uint32_t set_id = obj_db->get_object_set_id(cat_str); + if (set_id != (uint32_t)-1) { + object_storage_load_set(data, obj_db, set_id); + tt->obj_sets.push_back(set_id); + } + } + + if (!memcmp(cat_str, "EFFCHRPV", 8)) { + uint32_t set_id = obj_db->get_object_set_id(cat_str); + if (set_id != (uint32_t)-1) { + object_storage_load_set(data, obj_db, set_id); + tt->obj_sets.push_back(set_id); + } + } + + size_t off; + std::string obj; + if ((off = tt->category.find("STGNS", 0)) != -1) + obj = std::string(&cat_str[off], 8); + + if ((off = tt->category.find("STGD2NS", 0)) != -1) + obj = std::string(&cat_str[off], 10); + + if ((off = tt->category.find("STGPV", 0)) != -1) + obj = std::string(&cat_str[off], 8); + + if ((off = tt->category.find("STGD2PV", 0)) != -1) + obj = std::string(&cat_str[off], 10); + + uint32_t set_id = obj_db->get_object_set_id(obj.c_str()); + if (set_id != (uint32_t)-1) { + object_storage_load_set(data, obj_db, set_id); + tt->obj_sets.push_back(set_id); + } + + 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(data, obj_db, hrc_set_id); + tt->obj_sets.push_back(hrc_set_id); + } + + for (uint32_t& i : tt->obj_sets) + object_storage_load_set(data, obj_db, i); + tt->field_394 = 2; + } + else if (tt->field_394 == 2) { + bool wait_load = false; + for (uint32_t& i : tt->obj_sets) + if (object_storage_load_obj_set_check_not_read(i)) + wait_load = true; + + if (!wait_load) + tt->field_394 = 0; + } + + if (!tt->field_394) { + data_struct* data = rctx_ptr->data; + auth_3d_database* auth_3d_db = &data->data_ft.auth_3d_db; + + auth_3d_data_unload_id(tt->auth_3d_id, rctx_ptr); + tt->auth_3d_id = auth_3d_data_load_uid(tt->auth_3d_uid, auth_3d_db); + if (auth_3d_data_check_id_not_empty(&tt->auth_3d_id)) { + auth_3d_data_set_enable(&tt->auth_3d_id, false); + auth_3d_data_read_file(&tt->auth_3d_id, auth_3d_db); + tt->field_1D4 = 1; + } + tt->auth_3d_uid = -1; + return; + } +} + +static void Auth3dTestTask__SetStage(Auth3dTestTask* tt) { + if (tt->window.stage_link_change) { + data_struct* data = rctx_ptr->data; + auth_3d_database* auth_3d_db = &data->data_ft.auth_3d_db; + stage_database* stage_data = &data->data_ft.stage_data; + + const char* name = auth_3d_data_get_uid_name(tt->auth_3d_uid, auth_3d_db); + size_t name_length = utf8_length(name); + if (name && name_length >= 3) { + size_t v5 = name_length - 2; + const char* v6 = name; + while (v5) { + const char* v7 = (const char*)memchr(v6, 'S', v5); + if (!v7) + break; + + if (memcmp(v7, "STG", min(v5, 3))) { + v5 += v6 - v7 - 1; + v6 = v7 + 1; + continue; + } + + size_t v16 = v7 - name; + if (v16 == -1 || v16 >= name_length || name_length == v16) + break; + + size_t v17 = name_length - v16; + for (const char* i = name + v16; v17; ) { + const char* v20 = (const char*)memchr(i, '_', v17); + if (!v20) + break; + + if (*v20 != '_') { + v17 += i - v20 - 1; + i = v20 + 1; + continue; + } + + size_t v24 = v20 - name; + if (v24 != -1) { + std::string v30 = std::string(name + v16, v24 - v16); + int32_t stage_index = stage_data->get_stage_index(v30.c_str()); + if (tt->stage_index != stage_index) + tt->load_stage_index = stage_index; + } + break; + } + break; + } + } + } + + if (tt->load_stage_index != -1 && tt->load_stage_index != tt->stage_index) { + task_stage_set_stage_index(tt->load_stage_index); + tt->stage_index = tt->load_stage_index; + tt->load_stage_index = -1; + } +} diff --git a/src/CRE/auth_3d.hpp b/src/CRE/auth_3d.hpp index 01737ae9..cda4ff2a 100644 --- a/src/CRE/auth_3d.hpp +++ b/src/CRE/auth_3d.hpp @@ -7,11 +7,11 @@ #include #include -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "../KKdLib/database/object.hpp" #include "../KKdLib/database/texture.hpp" #include "../KKdLib/a3da.hpp" -#include "../KKdLib/kf.h" +#include "../KKdLib/kf.hpp" #include "frame_rate_control.hpp" #include "render_context.hpp" #include "task.hpp" @@ -740,7 +740,7 @@ struct auth_3d_farc { std::string file; p_file_handler file_handler; farc* farc; - void* data; + const void* data; size_t size; auth_3d_farc(); @@ -787,12 +787,66 @@ struct auth_3d_data_struct { virtual ~auth_3d_data_struct(); }; +class Auth3dTestTask : public app::Task { +public: + int32_t field_1C0; + int32_t field_1C4; + int32_t field_1C8; + int32_t field_1CC; + bool field_1D0; + int32_t field_1D4; + int32_t auth_3d_id; + int32_t auth_3d_uid; + bool repeat; + bool left_right_reverse; + bool field_1E3; + int32_t field_1E4; + bool field_1E8; + bool field_1E9; + bool black_mask_listener; + bool field_1EB; + int32_t field_1EC; + uint32_t effcmn_obj_set; + int32_t field_210; + bool field_328; + bool field_329; + bool field_32A; + int32_t stage_index; + int32_t load_stage_index; + vec3 trans_value; + float_t rot_y_value; + std::vector> field_348; + bool field_388; + int32_t field_38C; + bool field_390; + int32_t field_394; + std::string category; + std::string load_category; + std::vector obj_sets; + + struct Window { + bool stage_link_change; + bool obj_link; + + Window(); + } window; + + Auth3dTestTask(); + virtual ~Auth3dTestTask(); + + virtual bool Init(); + virtual bool Ctrl(); + virtual bool Dest(); +}; + extern auth_3d_data_struct* auth_3d_data; +extern Auth3dTestTask auth_3d_test_task; extern void auth_3d_data_init(); extern bool auth_3d_data_check_id_not_empty(int32_t* id); extern bool auth_3d_data_check_category_loaded(const char* category_name); extern bool auth_3d_data_check_category_loaded(uint32_t category_hash); +extern bool auth_3d_data_check_id_loading(int32_t* id); extern bool auth_3d_data_check_id_loaded(int32_t* id); extern auth_3d* auth_3d_data_get_auth_3d(int32_t id); extern int32_t auth_3d_data_get_auth_3d_id(object_info obj_info, @@ -810,6 +864,7 @@ extern float_t auth_3d_data_get_play_control_begin(int32_t* id); extern float_t auth_3d_data_get_play_control_size(int32_t* id); extern bool auth_3d_data_get_repeat(int32_t* id); extern int32_t auth_3d_data_get_uid(int32_t* id); +extern const char* auth_3d_data_get_uid_name(int32_t uid, auth_3d_database* auth_3d_db); extern void auth_3d_data_load_auth_3d_db(auth_3d_database* auth_3d_db); extern void auth_3d_data_load_category(const char* category_name, const char* mdata_dir = 0); extern void auth_3d_data_load_category(void* data, const char* category_name, uint32_t category_hash); @@ -820,6 +875,7 @@ extern void auth_3d_data_read_file(int32_t* id, auth_3d_database* auth_3d_db); extern void auth_3d_data_read_file_modern(int32_t* id); extern void auth_3d_data_set_camera_root_update(int32_t* id, bool value); extern void auth_3d_data_set_chara_id(int32_t* id, int32_t value); +extern void auth_3d_data_set_draw_task_flags_alpha(int32_t* id, draw_task_flags draw_task_flags, float_t alpha); extern void auth_3d_data_set_enable(int32_t* id, bool value); extern void auth_3d_data_set_frame_rate(int32_t* id, FrameRateControl* value); extern void auth_3d_data_set_last_frame(int32_t* id, float_t value); diff --git a/src/CRE/camera.h b/src/CRE/camera.h index e16a48e6..2f2921f1 100644 --- a/src/CRE/camera.h +++ b/src/CRE/camera.h @@ -5,9 +5,9 @@ #pragma once -#include "../KKdLib/default.h" -#include "../KKdLib/mat.h" -#include "../KKdLib/vec.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/mat.hpp" +#include "../KKdLib/vec.hpp" struct camera { mat4 view; diff --git a/src/CRE/data.cpp b/src/CRE/data.cpp index 5333612d..fa45819b 100644 --- a/src/CRE/data.cpp +++ b/src/CRE/data.cpp @@ -4,17 +4,17 @@ */ #include "data.hpp" -#include "../KKdLib/io/path.h" -#include "../KKdLib/io/stream.h" +#include "../KKdLib/io/path.hpp" +#include "../KKdLib/io/stream.hpp" #include "../KKdLib/hash.hpp" -#include "../KKdLib/str_utils.h" +#include "../KKdLib/str_utils.hpp" data_struct* data_list; static char default_config[] = "#AFT\n\n\n"; static void data_free_inner(data_struct* ds); -static void data_load_inner(stream* s); +static void data_load_inner(stream& s); #if defined(CRE_DEV) static void data_load_glitter_list(data_struct* ds, const char* path); #endif @@ -27,28 +27,26 @@ void data_struct_init() { void data_struct_load(const char* path) { stream s; - io_open(&s, path, "rb"); + s.open(path, "rb"); if (s.io.stream) - data_load_inner(&s); + data_load_inner(s); else { - io_free(&s); - io_open(&s, default_config, 7); - data_load_inner(&s); + s.close(); + s.open(default_config, 7); + data_load_inner(s); } - io_free(&s); } void data_struct_load(const wchar_t* path) { stream s; - io_open(&s, path, L"rb"); + s.open(path, L"rb"); if (s.io.stream) - data_load_inner(&s); + data_load_inner(s); else { - io_free(&s); - io_open(&s, default_config, 7); - data_load_inner(&s); + s.close(); + s.open(default_config, 7); + data_load_inner(s); } - io_free(&s); } void data_struct_free() { @@ -98,6 +96,21 @@ void data_struct_free() { delete[] data_list; } +bool data_struct::check_file_exists(const char* path) { + const char* t = strrchr(path, '/'); + if (t) { + std::string dir = std::string(path, t - path + 1); + return check_file_exists(dir.c_str(), t + 1); + } + + t = strrchr(path, '\\'); + if (t) { + std::string dir = std::string(path, t - path + 1); + return check_file_exists(dir.c_str(), t + 1); + } + return false; +} + bool data_struct::check_file_exists(const char* dir, const char* file) { if (path_check_directory_exists(dir)) { const char* t = strrchr(file, '.'); @@ -259,9 +272,9 @@ bool data_struct::check_file_exists(const char* dir, uint32_t hash) { return false; } -void data_struct::get_directory_files(const char* dir, std::vector* data_files) { - data_files->clear(); - data_files->shrink_to_fit(); +void data_struct::get_directory_files(const char* dir, std::vector& data_files) { + data_files.clear(); + data_files.shrink_to_fit(); size_t dir_len = utf8_length(dir); if (dir_len >= 2 && !memcmp(dir, "./", 2)) { @@ -318,7 +331,7 @@ void data_struct::get_directory_files(const char* dir, std::vectorpush_back(f); + data_files.push_back(f); } } @@ -338,7 +351,7 @@ void data_struct::get_directory_files(const char* dir, std::vector= 2 && !memcmp(dir, "./", 2)) { dir += 2; @@ -403,7 +416,7 @@ bool data_struct::get_file(const char* dir, uint32_t hash, const char* ext, std: t = l.c_str(); if (hash_murmurhash(t, t_len) == hash) { - *file = l; + file = l; free(dir_temp); free(temp); return true; @@ -419,6 +432,22 @@ bool data_struct::get_file(const char* dir, uint32_t hash, const char* ext, std: return false; } +bool data_struct::load_file(void* data, const char* path, + bool (*load_func)(void* data, const char* path, const char* file, uint32_t hash)) { + const char* t = strrchr(path, '/'); + if (t) { + std::string dir = std::string(path, t - path + 1); + return load_file(data, dir.c_str(), t + 1, load_func); + } + + t = strrchr(path, '\\'); + if (t) { + std::string dir = std::string(path, t - path + 1); + return load_file(data, dir.c_str(), t + 1, load_func); + } + return false; +} + bool data_struct::load_file(void* data, const char* dir, const char* file, bool (*load_func)(void* data, const char* path, const char* file, uint32_t hash)) { if (path_check_directory_exists(dir)) { @@ -680,10 +709,10 @@ static void data_free_inner(data_struct* ds) { ds->ready = false; } -static void data_load_inner(stream* s) { - size_t length = s->length; +static void data_load_inner(stream& s) { + size_t length = s.length; void* data = force_malloc(length); - io_read(s, data, length); + s.read(data, length); char* buf; char** lines; @@ -815,7 +844,7 @@ static void data_load_inner(stream* s) { data_struct_path data_path; t -= t_len[count - j - 1] + 1; data_path.path = std::string(t, t_len[count - j - 1]); - data_path.data = vector_old_empty(data_struct_directory); + data_path.data = {}; ds->data_paths.push_back(data_path); } free(t_len); @@ -1050,11 +1079,11 @@ static void data_load_inner(stream* s) { #if defined(CRE_DEV) static void data_load_glitter_list(data_struct* ds, const char* path) { stream s; - io_open(&s, path, "rb"); + s.open(path, "rb"); size_t length = s.length; uint8_t* data = force_malloc_s(uint8_t, length); - io_read(&s, data, length); - io_free(&s); + s.read(data, length); + s.close(); char* buf; char** lines; diff --git a/src/CRE/data.hpp b/src/CRE/data.hpp index d5e6cf5b..99ba07d1 100644 --- a/src/CRE/data.hpp +++ b/src/CRE/data.hpp @@ -7,14 +7,14 @@ #include #include -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "../KKdLib/database/auth_3d.hpp" #include "../KKdLib/database/bone.hpp" #include "../KKdLib/database/motion.hpp" #include "../KKdLib/database/object.hpp" #include "../KKdLib/database/stage.hpp" #include "../KKdLib/database/texture.hpp" -#include "../KKdLib/vec.h" +#include "../KKdLib/vec.hpp" enum data_type { DATA_AFT = 0, @@ -110,12 +110,15 @@ struct data_struct { data_struct(); virtual ~data_struct(); + bool check_file_exists(const char* path); bool check_file_exists(const char* dir, const char* file); bool check_file_exists(const char* dir, uint32_t hash); - void get_directory_files(const char* dir, std::vector* data_files); - bool get_file(const char* dir, uint32_t hash, const char* ext, std::string* file); + void get_directory_files(const char* dir, std::vector& data_files); + bool get_file(const char* dir, uint32_t hash, const char* ext, std::string& file); + bool load_file(void* data, const char* path, + bool (*load_func)(void* data, const char* path, const char* file, uint32_t hash)); bool load_file(void* data, const char* dir, const char* file, - bool (*load_func)(void* data, const char* path, const char* file, uint32_t hash)); + bool (*load_func)(void* data, const char* path, const char* file, uint32_t hash)); bool load_file(void* data, const char* dir, uint32_t hash, const char* ext, bool (*load_func)(void* data, const char* path, const char* file, uint32_t hash)); }; diff --git a/src/CRE/draw_object.c b/src/CRE/draw_object.c index 4fc372e3..895a43eb 100644 --- a/src/CRE/draw_object.c +++ b/src/CRE/draw_object.c @@ -4,7 +4,7 @@ */ #include "draw_object.h" -#include "light_param/light.h" +#include "light_param/light.hpp" #include "shader_ft.h" #include "static_var.h" #include "texture.hpp" @@ -41,7 +41,7 @@ void draw_object_draw(render_context* rctx, draw_object* draw, mat4* model, mat4u* mats = draw->mats; if (draw->mat_count == 2) { mat4 mat = *mats; - shader_state_matrix_set_program(&shaders_ft, 7, &mat); + shaders_ft.state_matrix_set_program(7, mat); } for (int32_t i = 0; i < draw->mat_count; i++, mats++) { @@ -51,11 +51,11 @@ void draw_object_draw(render_context* rctx, draw_object* draw, mat4* model, } mat; mat4_transpose(mats, &mat.m); - shader_buffer_set_ptr_array(&shaders_ft, (size_t)i * 3, 3, mat.v); + shaders_ft.buffer_set((size_t)i * 3, 3, mat.v); } - shader_state_matrix_set_modelview(&shaders_ft, 0, &rctx->view_mat, true); - shader_state_matrix_set_program(&shaders_ft, 6, &mat4_identity); + shaders_ft.state_matrix_set_modelview(0, rctx->view_mat, true); + shaders_ft.state_matrix_set_program(6, mat4_identity); uniform_value[U_BONE_MAT] = 1; } else { @@ -79,8 +79,8 @@ void draw_object_draw(render_context* rctx, draw_object* draw, mat4* model, void draw_object_draw_default(render_context* rctx, draw_object* draw) { if (draw->set_blend_color) { vec4 blend_color = draw->blend_color; - shader_env_vert_set_ptr(&shaders_ft, 3, &blend_color); - shader_env_vert_set_ptr(&shaders_ft, 4, &vec4_null); + shaders_ft.env_vert_set(3, blend_color); + shaders_ft.env_vert_set(4, vec4_null); } if (!draw->draw_object_func) @@ -117,8 +117,8 @@ void draw_object_draw_default(render_context* rctx, draw_object* draw) { draw_object_vertex_attrib_reset_default(draw); if (draw->set_blend_color) { - shader_env_vert_set_ptr(&shaders_ft, 3, &vec4_identity); - shader_env_vert_set_ptr(&shaders_ft, 4, &vec4_null); + shaders_ft.env_vert_set(3, vec4_identity); + shaders_ft.env_vert_set(4, vec4_null); } rctx->draw_state.stats.object_draw_count++; @@ -154,12 +154,12 @@ void draw_object_draw_sss(render_context* rctx, draw_object* draw) { } if (aniso) { - shader_env_frag_set(&shaders_ft, 25, 0.0f, 0.0f, 0.0f, 0.5f); + shaders_ft.env_frag_set(25, 0.0f, 0.0f, 0.0f, 0.5f); uniform_value[U37] = 1; } else { vec4 sss_param = rctx->draw_pass.sss_data.param; - shader_env_frag_set(&shaders_ft, 25, sss_param.x, sss_param.y, sss_param.z, 0.5f); + shaders_ft.env_frag_set(25, sss_param.x, sss_param.y, sss_param.z, 0.5f); uniform_value[U37] = 0; } draw_object_draw_default(rctx, draw); @@ -231,11 +231,11 @@ void draw_object_draw_translucent(render_context* rctx, draw_object* draw) { std::vector* textures = draw->textures; if (rctx->draw_state.shader_index != -1) { vec4 emission = draw->emission; - shader_state_material_set_emission_ptr(&shaders_ft, false, &emission); + shaders_ft.state_material_set_emission(false, emission); draw_object_material_set_uniform(rctx, material, 0); if (material->material.attrib.m.alpha_texture) uniform_value[U_TEXTURE_COUNT] = 0; - shader_set(&shaders_ft, rctx->draw_state.shader_index); + shaders_ft.set(rctx->draw_state.shader_index); } draw_object_vertex_attrib_set_default(draw); @@ -311,8 +311,8 @@ void draw_object_draw_translucent(render_context* rctx, draw_object* draw) { } inline void draw_object_model_mat_load(render_context* rctx, mat4* mat) { - shader_state_matrix_set_modelview_separate(&shaders_ft, 0, mat, &rctx->view_mat, true); - shader_state_matrix_set_program(&shaders_ft, 6, mat); + shaders_ft.state_matrix_set_modelview(0, *mat, rctx->view_mat, true); + shaders_ft.state_matrix_set_program(6, *mat); } inline void model_mat_face_camera_position(mat4* view, mat4* src, mat4* dst) { @@ -372,12 +372,12 @@ void obj_sub_mesh_draw(render_context* rctx, obj_primitive_type primitive_type, if (primitive_type == OBJ_PRIMITIVE_TRIANGLE_STRIP && index_format == OBJ_INDEX_U16) { gl_state_enable_primitive_restart(); glPrimitiveRestartIndex(0xFFFF); - shader_draw_range_elements(&shaders_ft, GL_TRIANGLE_STRIP, + shaders_ft.draw_range_elements(GL_TRIANGLE_STRIP, start, end, count, GL_UNSIGNED_SHORT, (void*)indices); gl_state_disable_primitive_restart(); } else - shader_draw_elements(&shaders_ft, mesh_draw_mode[primitive_type], + shaders_ft.draw_elements(mesh_draw_mode[primitive_type], count, mesh_indices_type[index_format], (void*)indices); rctx->draw_state.stats.draw_count += count; @@ -610,14 +610,14 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* vec4 diffuse = material->material.color.diffuse; vec4 emission = draw->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); - shader_state_material_set_emission_ptr(&shaders_ft, false, &emission); + shaders_ft.state_material_set_ambient(false, ambient); + shaders_ft.state_material_set_diffuse(false, diffuse); + shaders_ft.state_material_set_emission(false, emission); float_t line_light; if (lighting_type == OBJ_MATERIAL_SHADER_LIGHTING_PHONG) { vec4 specular = material->material.color.specular; - shader_state_material_set_specular_ptr(&shaders_ft, false, &specular); + shaders_ft.state_material_set_specular(false, specular); float_t luma; vec3 luma_coeff = { 0.30f, 0.59f, 0.11f }; @@ -636,21 +636,21 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* line_light = 0.0; if (!use_shader) - shader_set(&shaders_ft, SHADER_FT_SIMPLE); + shaders_ft.set(SHADER_FT_SIMPLE); else if (rctx->draw_state.shader_index != -1) - shader_set(&shaders_ft, rctx->draw_state.shader_index); + shaders_ft.set(rctx->draw_state.shader_index); else if (material->material.shader.index != -1) { if (material->material.shader.index != SHADER_FT_BLINN) - shader_set(&shaders_ft, material->material.shader.index); + shaders_ft.set(material->material.shader.index); else if (lighting_type == OBJ_MATERIAL_SHADER_LIGHTING_LAMBERT) - shader_set(&shaders_ft, SHADER_FT_LAMBERT); + shaders_ft.set(SHADER_FT_LAMBERT); else if (lighting_type == OBJ_MATERIAL_SHADER_LIGHTING_PHONG) - shader_set(&shaders_ft, SHADER_FT_BLINN); + shaders_ft.set(SHADER_FT_BLINN); else - shader_set(&shaders_ft, SHADER_FT_CONSTANT); + shaders_ft.set(SHADER_FT_CONSTANT); } else - shader_set(&shaders_ft, SHADER_FT_CONSTANT); + shaders_ft.set(SHADER_FT_CONSTANT); if (lighting_type != OBJ_MATERIAL_SHADER_LIGHTING_CONSTANT) { float_t shininess; @@ -660,7 +660,7 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* 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); + shaders_ft.state_material_set_shininess(false, shininess, 0.0f, 0.0f, 1.0f); float_t fresnel = (float_t)material->material.shader_info.m.fresnel_type; if (fresnel > 9.0) @@ -669,12 +669,12 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* fresnel = rctx->draw_state.fresnel; fresnel = (fresnel - 1.0f) * (0.12f * 0.82f); - 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); + shaders_ft.local_vert_set(0, fresnel, 0.18f, line_light, 0.0f); + shaders_ft.local_frag_set(9, fresnel, 0.18f, line_light, 0.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); + shaders_ft.local_vert_set(1, shininess, 0.0f, 0.0f, 0.0f); + shaders_ft.local_frag_set(3, shininess, 0.0f, 0.0f, 0.0f); switch (material->material.shader.index) { case SHADER_FT_SKIN: { @@ -686,15 +686,15 @@ static void draw_object_material_set_default(render_context* rctx, draw_object* texture_color_coeff.w *= 0.015f; texture_specular_coeff.w *= 0.015f; - shader_local_frag_set_ptr(&shaders_ft, 5, &texture_color_coeff); - shader_local_frag_set_ptr(&shaders_ft, 6, &texture_color_offset); - shader_local_frag_set_ptr(&shaders_ft, 7, &texture_specular_coeff); - shader_local_frag_set_ptr(&shaders_ft, 8, &texture_specular_offset); + shaders_ft.local_frag_set(5, texture_color_coeff); + shaders_ft.local_frag_set(6, texture_color_offset); + shaders_ft.local_frag_set(7, texture_specular_coeff); + shaders_ft.local_frag_set(8, texture_specular_offset); } break; case SHADER_FT_HAIR: case SHADER_FT_CLOTH: case SHADER_FT_TIGHTS: - shader_local_frag_set(&shaders_ft, 5, 1.0f - draw->texture_color_coeff.w * 0.4f, + shaders_ft.local_frag_set(5, 1.0f - draw->texture_color_coeff.w * 0.4f, 0.0f, 0.0f, draw->texture_color_coeff.w * 0.02f); break; } @@ -718,7 +718,7 @@ static void draw_object_material_set_parameter(render_context* rctx, obj_materia vec4 specular = mat_data->material.color.specular; specular.w = rctx->draw_state.specular_alpha; - shader_state_material_set_specular_ptr(&shaders_ft, false, &specular); + shaders_ft.state_material_set_specular(false, specular); } else { bump_depth = mat_data->material.bump_depth; @@ -730,17 +730,17 @@ static void draw_object_material_set_parameter(render_context* rctx, obj_materia intensity = max(intensity, 1.0f); - shader_local_vert_set(&shaders_ft, 2, inv_bump_depth, bump_depth, 0.0f, 0.0f); - shader_local_frag_set(&shaders_ft, 0, inv_bump_depth, bump_depth, 0.0f, 0.0f); + shaders_ft.local_vert_set(2, inv_bump_depth, bump_depth, 0.0f, 0.0f); + shaders_ft.local_frag_set(0, inv_bump_depth, bump_depth, 0.0f, 0.0f); - shader_local_frag_set(&shaders_ft, 1, intensity, intensity, intensity * 25.5f, 1.0f); - shader_local_frag_set(&shaders_ft, 2, + shaders_ft.local_frag_set(1, intensity, intensity, intensity * 25.5f, 1.0f); + shaders_ft.local_frag_set(2, reflect_uv_scale, reflect_uv_scale, refract_uv_scale, refract_uv_scale); vec4 specular; - shader_env_vert_get_ptr(&shaders_ft, 17, &specular); + shaders_ft.env_vert_get(17, specular); vec3_mult(*(vec3*)&specular, *(vec3*)&mat_data->material.color.specular, *(vec3*)&specular); - shader_env_vert_set_ptr(&shaders_ft, 18, &specular); + shaders_ft.env_vert_set(18, specular); } static void draw_object_material_set_reflect(render_context* rctx, draw_object* draw) { @@ -808,11 +808,11 @@ static void draw_object_material_set_reflect(render_context* rctx, draw_object* } draw_object_material_set_uniform(rctx, material, true); - shader_set(&shaders_ft, rctx->draw_state.shader_index); - shader_state_material_set_ambient_ptr(&shaders_ft, false, &ambient); - shader_state_material_set_diffuse_ptr(&shaders_ft, false, &diffuse); - shader_state_material_set_emission_ptr(&shaders_ft, false, &emission); - shader_state_material_set_specular_ptr(&shaders_ft, false, &specular); + shaders_ft.set(rctx->draw_state.shader_index); + shaders_ft.state_material_set_ambient(false, ambient); + shaders_ft.state_material_set_diffuse(false, diffuse); + shaders_ft.state_material_set_emission(false, emission); + shaders_ft.state_material_set_specular(false, specular); draw_object_material_set_parameter(rctx, draw->material); } @@ -894,8 +894,8 @@ static void draw_object_vertex_attrib_reset_default(draw_object* draw) { uniform_value[U_INSTANCE] = 0; gl_state_bind_element_array_buffer(0); - shader_state_matrix_set_texture(&shaders_ft, 0, &mat4_identity); - shader_state_matrix_set_texture(&shaders_ft, 1, &mat4_identity); + shaders_ft.state_matrix_set_texture(0, mat4_identity); + shaders_ft.state_matrix_set_texture(1, mat4_identity); gl_state_active_texture(0); } @@ -919,8 +919,8 @@ static void draw_object_vertex_attrib_reset_default_compressed(draw_object* draw uniform_value[U_INSTANCE] = 0; gl_state_bind_element_array_buffer(0); - shader_state_matrix_set_texture(&shaders_ft, 0, &mat4_identity); - shader_state_matrix_set_texture(&shaders_ft, 1, &mat4_identity); + shaders_ft.state_matrix_set_texture(0, mat4_identity); + shaders_ft.state_matrix_set_texture(1, mat4_identity); gl_state_active_texture(0); } @@ -948,7 +948,7 @@ static void draw_object_vertex_attrib_reset_reflect(draw_object* draw) { } gl_state_bind_element_array_buffer(0); - shader_state_matrix_set_texture(&shaders_ft, 0, &mat4_identity); + shaders_ft.state_matrix_set_texture(0, mat4_identity); gl_state_active_texture(0); } @@ -971,7 +971,7 @@ inline static void draw_object_vertex_attrib_reset_reflect_compressed(draw_objec } gl_state_bind_element_array_buffer(0); - shader_state_matrix_set_texture(&shaders_ft, 0, &mat4_identity); + shaders_ft.state_matrix_set_texture(0, mat4_identity); gl_state_active_texture(0); } @@ -1043,12 +1043,12 @@ static void draw_object_vertex_attrib_set_default(draw_object* draw) { int32_t texture_id = material->material.texdata[i].tex_index; mat4 mat = material->material.texdata[i].tex_coord_mat; - shader_state_matrix_set_texture(&shaders_ft, texcoord_index, &mat); + shaders_ft.state_matrix_set_texture(texcoord_index, mat); 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; - shader_state_matrix_set_texture(&shaders_ft, texcoord_index, &mat); + mat4 mat = draw->texture_transform_array[k].mat; + shaders_ft.state_matrix_set_texture(texcoord_index, mat); texcoord_mat_set[texcoord_index] = true; break; } @@ -1175,7 +1175,7 @@ static void draw_object_vertex_attrib_set_default(draw_object* draw) { 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); + shaders_ft.env_vert_set(13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); } gl_state_bind_array_buffer(0); @@ -1245,12 +1245,12 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* int32_t tex_index = material->material.texdata[i].tex_index; mat4 mat = material->material.texdata[i].tex_coord_mat; - shader_state_matrix_set_texture(&shaders_ft, texcoord_index, &mat); + shaders_ft.state_matrix_set_texture(texcoord_index, mat); 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 == tex_index) { - mat = draw->texture_transform_array[k].mat; - shader_state_matrix_set_texture(&shaders_ft, texcoord_index, &mat); + mat4 mat = draw->texture_transform_array[k].mat; + shaders_ft.state_matrix_set_texture(texcoord_index, mat); texcoord_mat_set[texcoord_index] = true; break; } @@ -1357,7 +1357,7 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object* 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); + shaders_ft.env_vert_set(13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); } gl_state_bind_array_buffer(0); @@ -1416,12 +1416,12 @@ static void draw_object_vertex_attrib_set_reflect(draw_object* draw) { int32_t tex_index = material->material.texdata[0].tex_index; mat4 mat = material->material.texdata[0].tex_coord_mat; - shader_state_matrix_set_texture(&shaders_ft, 0, &mat); + shaders_ft.state_matrix_set_texture(0, mat); 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 == tex_index) { - mat = draw->texture_transform_array[j].mat; - shader_state_matrix_set_texture(&shaders_ft, 0, &mat); + mat4 mat = draw->texture_transform_array[j].mat; + shaders_ft.state_matrix_set_texture(0, mat); break; } } @@ -1541,7 +1541,7 @@ static void draw_object_vertex_attrib_set_reflect(draw_object* draw) { 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); + shaders_ft.env_vert_set(13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); } gl_state_bind_array_buffer(0); @@ -1589,12 +1589,12 @@ inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* int32_t tex_index = material->material.texdata[0].tex_index; mat4 mat = material->material.texdata[0].tex_coord_mat; - shader_state_matrix_set_texture(&shaders_ft, 0, &mat); + shaders_ft.state_matrix_set_texture(0, mat); 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 == tex_index) { - mat = draw->texture_transform_array[j].mat; - shader_state_matrix_set_texture(&shaders_ft, 0, &mat); + mat4 mat = draw->texture_transform_array[j].mat; + shaders_ft.state_matrix_set_texture(0, mat); break; } } @@ -1699,7 +1699,7 @@ inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* 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); + shaders_ft.env_vert_set(13, draw->morph_value, 1.0f - draw->morph_value, 0.0f, 0.0f); } gl_state_bind_array_buffer(0); diff --git a/src/CRE/draw_object.h b/src/CRE/draw_object.h index fa6c1e8d..716149d4 100644 --- a/src/CRE/draw_object.h +++ b/src/CRE/draw_object.h @@ -5,10 +5,9 @@ #pragma once -#include "../KKdLib/default.h" -#include "../KKdLib/mat.h" -#include "../KKdLib/vec.h" -#include "../KKdLib/vector.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/mat.hpp" +#include "../KKdLib/vec.hpp" #include "object.hpp" #include "render_context.hpp" diff --git a/src/CRE/draw_pass.c b/src/CRE/draw_pass.c index 793faf4f..3d3bde69 100644 --- a/src/CRE/draw_pass.c +++ b/src/CRE/draw_pass.c @@ -5,14 +5,14 @@ #include "draw_pass.h" #include "Glitter/glitter.hpp" -#include "light_param/fog.h" -#include "light_param/light.h" +#include "light_param/fog.hpp" +#include "light_param/light.hpp" #include "gl_state.h" #include "post_process.hpp" #include "rob.hpp" #include "render_texture.h" #include "shader_ft.h" -#include "shader_glsl.h" +#include "shader_glsl.hpp" #include "static_var.h" #include "texture.hpp" @@ -38,7 +38,7 @@ static void draw_pass_sss_contour(render_context* rctx, post_process* pp); static void draw_pass_sss_filter(render_context* rctx, sss_data* a1); static void draw_pass_reflect(render_context* rctx, draw_pass* a1); static void draw_pass_refract(render_context* rctx, draw_pass* a1); -static void draw_pass_preprocess(render_context* rctx, draw_pass* a1); +static void draw_pass_pre_process(render_context* rctx, draw_pass* a1); static void draw_pass_3d(render_context* rctx, draw_pass* a1); static int32_t draw_pass_3d_get_translucent_count(render_context* rctx); static void draw_pass_3d_shadow_reset(render_context* rctx); @@ -58,7 +58,7 @@ extern bool draw_grid_3d; extern shader_glsl grid_shader; extern GLuint grid_vbo; extern size_t grid_vertex_count; -extern vec3 clear_color; +extern vec4u8 clear_color; extern light_param_data_storage* light_param_data_storage_data; void draw_pass_main(render_context* rctx) { @@ -72,7 +72,7 @@ void draw_pass_main(render_context* rctx) { gl_state_active_bind_texture_cube_map(ibl_texture_index[i], light_param_data_storage_data->textures[i]); - shader_env_frag_set(&shaders_ft, 0, + shaders_ft.env_frag_set(0, 1.0f / (float_t)rctx->post_process.render_width, 1.0f / (float_t)rctx->post_process.render_height, (float_t)rctx->post_process.render_width, @@ -94,7 +94,7 @@ void draw_pass_main(render_context* rctx) { case DRAW_PASS_SHADOW: draw_pass_shadow(rctx, &rctx->draw_pass); break; - case DRAW_PASS_SSS: + case DRAW_PASS_SS_SSS: draw_pass_sss(rctx, &rctx->draw_pass); break; case DRAW_PASS_REFLECT: @@ -103,18 +103,18 @@ void draw_pass_main(render_context* rctx) { case DRAW_PASS_REFRACT: draw_pass_refract(rctx, &rctx->draw_pass); break; - case DRAW_PASS_PREPROCESS: - draw_pass_preprocess(rctx, &rctx->draw_pass); + case DRAW_PASS_PRE_PROCESS: + draw_pass_pre_process(rctx, &rctx->draw_pass); break; - case DRAW_PASS_TYPE_6: { + case DRAW_PASS_CLEAR: { render_texture_bind(&rctx->post_process.rend_texture, 0); - vec4 color; - *(vec3*)&color = clear_color; - color.w = 1.0f; - glClearBufferfv(GL_COLOR, 0, (GLfloat*)&color); + vec4 _clear_color; + vec4u8_to_vec4(clear_color, _clear_color); + vec4_mult_scalar(_clear_color, (float_t)(1.0 / 255.0), _clear_color); + glClearBufferfv(GL_COLOR, 0, (GLfloat*)&_clear_color); //sub_140501470(rctx, &rctx->draw_pass); } break; - case DRAW_PASS_TYPE_7: + case DRAW_PASS_PRE_SPRITE: //sub_140501600(rctx, &rctx->draw_pass); break; case DRAW_PASS_3D: @@ -153,7 +153,7 @@ static void draw_pass_shadow(render_context* rctx, draw_pass* a1) { rctx->draw_state.shader_index = -1; uniform_value[U0A] = 0; draw_pass_shadow_filter(&rctx->litproj->shadow_texture[0], - &rctx->litproj->shadow_texture[1], 0, 1.5f, 0.0099999998f, true); + &rctx->litproj->shadow_texture[1], 0, 1.5f, 0.01f, true); if (draw_pass_shadow_litproj(rctx, rctx->litproj)) { draw_pass_set_camera(rctx->camera); @@ -233,7 +233,7 @@ static void draw_pass_shadow(render_context* rctx, draw_pass* a1) { mat4 proj; mat4_ortho(-v16, v16, -v16, v16, shad->z_near, shad->z_far, &proj); mat4_mult(&proj, &temp, &proj); - shader_state_matrix_set_projection(&shaders_ft, &proj, false); + shaders_ft.state_matrix_set_projection(proj, false); mat4_look_at(view_point, interest, &rctx->view_mat); @@ -263,20 +263,20 @@ static void draw_pass_shadow(render_context* rctx, draw_pass* a1) { texture_params_get(v5, &tex_params[0], v7, &tex_params[1], v6, &tex_params[2]); render_texture_bind(&shad->field_8[6], 0); uniform_value[U_ESM_FILTER] = 0; - shader_set(&shaders_ft, SHADER_FT_ESMFILT); - shader_local_frag_set(&shaders_ft, 0, 1.0f / (float_t)tex_params[1].width, + shaders_ft.set(SHADER_FT_ESMFILT); + shaders_ft.local_frag_set(0, 1.0f / (float_t)tex_params[1].width, 1.0f / (float_t)tex_params[1].height, 0.0f, 0.0f); gl_state_active_bind_texture_2d(0, v7); - shader_state_matrix_set_mvp(&shaders_ft, &mat4_identity); + shaders_ft.state_matrix_set_mvp(mat4_identity); render_texture_draw_custom(&shaders_ft); render_texture_bind(&shad->field_8[5], 0); uniform_value[U_ESM_FILTER] = 1; - shader_set(&shaders_ft, SHADER_FT_ESMFILT); - shader_local_frag_set(&shaders_ft, 0, 0.75f / (float_t)tex_params[2].width, + shaders_ft.set(SHADER_FT_ESMFILT); + shaders_ft.local_frag_set(0, 0.75f / (float_t)tex_params[2].width, 0.75f / (float_t)tex_params[2].height, 0.0f, 0.0f); gl_state_active_bind_texture_2d(0, v6); - shader_state_matrix_set_mvp(&shaders_ft, &mat4_identity); + shaders_ft.state_matrix_set_mvp(mat4_identity); render_texture_draw_custom(&shaders_ft); texture_params_restore(&tex_params[0], &tex_params[1], &tex_params[2]); } @@ -291,18 +291,18 @@ static void draw_pass_shadow(render_context* rctx, draw_pass* a1) { texture_param tex_params[3]; texture_params_get(v11, &tex_params[0], v12, &tex_params[1], 0, 0); uniform_value[U_IMAGE_FILTER] = 5; - shader_set(&shaders_ft, SHADER_FT_IMGFILT); - shader_local_frag_set_ptr(&shaders_ft, 0, &vec4_identity); - shader_state_matrix_set_texture(&shaders_ft, 0, &mat4_identity); - shader_state_matrix_set_texture(&shaders_ft, 1, &mat4_identity); - shader_state_matrix_set_texture(&shaders_ft, 2, &mat4_identity); - shader_state_matrix_set_texture(&shaders_ft, 3, &mat4_identity); - shader_state_matrix_set_texture(&shaders_ft, 4, &mat4_identity); - shader_state_matrix_set_texture(&shaders_ft, 5, &mat4_identity); - shader_state_matrix_set_texture(&shaders_ft, 6, &mat4_identity); - shader_state_matrix_set_texture(&shaders_ft, 7, &mat4_identity); + shaders_ft.set(SHADER_FT_IMGFILT); + shaders_ft.local_frag_set(0, vec4_identity); + shaders_ft.state_matrix_set_texture(0, mat4_identity); + shaders_ft.state_matrix_set_texture(1, mat4_identity); + shaders_ft.state_matrix_set_texture(2, mat4_identity); + shaders_ft.state_matrix_set_texture(3, mat4_identity); + shaders_ft.state_matrix_set_texture(4, mat4_identity); + shaders_ft.state_matrix_set_texture(5, mat4_identity); + shaders_ft.state_matrix_set_texture(6, mat4_identity); + shaders_ft.state_matrix_set_texture(7, mat4_identity); gl_state_active_bind_texture_2d(0, v12); - shader_state_matrix_set_mvp(&shaders_ft, &mat4_identity); + shaders_ft.state_matrix_set_mvp(mat4_identity); render_texture_draw_custom(&shaders_ft); texture_params_restore(&tex_params[0], &tex_params[1], 0); } @@ -364,11 +364,11 @@ static void draw_pass_shadow_filter(render_texture* a1, render_texture* a2, render_texture_bind(a2, 0); uniform_value[U_LIGHT_PROJ] = enable_lit_proj ? 1 : 0; - shader_set(&shaders_ft, SHADER_FT_ESMGAUSS); - shader_local_frag_set(&shaders_ft, 0, 1.0f / (float_t)tex_params[0].width, 0.0f, 0.0f, 0.0f); - shader_local_frag_set_ptr(&shaders_ft, 1, &v15[0]); - shader_local_frag_set_ptr(&shaders_ft, 2, &v15[1]); - shader_local_frag_set(&shaders_ft, 3, far_texel_offset, far_texel_offset, 0.0f, 0.0f); + shaders_ft.set(SHADER_FT_ESMGAUSS); + shaders_ft.local_frag_set(0, 1.0f / (float_t)tex_params[0].width, 0.0f, 0.0f, 0.0f); + shaders_ft.local_frag_set(1, v15[0]); + shaders_ft.local_frag_set(2, v15[1]); + shaders_ft.local_frag_set(3, far_texel_offset, far_texel_offset, 0.0f, 0.0f); gl_state_active_bind_texture_2d(0, v11); glActiveTexture(GL_TEXTURE0); @@ -382,18 +382,18 @@ static void draw_pass_shadow_filter(render_texture* a1, render_texture* a2, glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); } gl_state_active_bind_texture_2d(0, v11); - shader_state_matrix_set_mvp(&shaders_ft, &mat4_identity); + shaders_ft.state_matrix_set_mvp(mat4_identity); render_texture_draw_custom(&shaders_ft); render_texture_bind(a1, 0); - shader_local_frag_set(&shaders_ft, 0, 0.0f, 1.0f / (float_t)tex_params[0].height, 0.0f, 0.0f); - shader_local_frag_set_ptr(&shaders_ft, 1, &v15[0]); - shader_local_frag_set_ptr(&shaders_ft, 2, &v15[1]); - shader_local_frag_set(&shaders_ft, 3, far_texel_offset, far_texel_offset, 0.0f, 0.0f); + shaders_ft.local_frag_set(0, 0.0f, 1.0f / (float_t)tex_params[0].height, 0.0f, 0.0f); + shaders_ft.local_frag_set(1, v15[0]); + shaders_ft.local_frag_set(2, v15[1]); + shaders_ft.local_frag_set(3, far_texel_offset, far_texel_offset, 0.0f, 0.0f); gl_state_active_bind_texture_2d(0, v9); - shader_state_matrix_set_mvp(&shaders_ft, &mat4_identity); + shaders_ft.state_matrix_set_mvp(mat4_identity); render_texture_draw_custom(&shaders_ft); - shader_unbind(); + shader::unbind(); texture_params_restore(&tex_params[0], &tex_params[1], 0); } @@ -438,7 +438,7 @@ static void draw_pass_sss(render_context* rctx, draw_pass* a1) { return; if (!sss->enable) { - shader_env_frag_set(&shaders_ft, 25, 0.0f, 0.0f, 0.0f, 0.0f); + shaders_ft.env_frag_set(25, 0.0f, 0.0f, 0.0f, 0.0f); return; } @@ -507,8 +507,8 @@ static void draw_pass_sss(render_context* rctx, draw_pass* a1) { static void draw_pass_sss_contour(render_context* rctx, post_process* pp) { render_texture_bind(&pp->sss_contour_texture, 0); - shader_state_matrix_set_modelview(&shaders_ft, 0, &mat4_identity, false); - shader_state_matrix_set_projection(&shaders_ft, &mat4_identity, true); + shaders_ft.state_matrix_set_modelview(0, mat4_identity, false); + shaders_ft.state_matrix_set_projection(mat4_identity, true); gl_state_enable_depth_test(); gl_state_set_depth_func(GL_ALWAYS); gl_state_set_depth_mask(GL_TRUE); @@ -524,7 +524,7 @@ static void draw_pass_sss_contour(render_context* rctx, post_process* pp) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); gl_state_active_texture(0); - shader_set(&shaders_ft, SHADER_FT_CONTOUR); + shaders_ft.set(SHADER_FT_CONTOUR); camera* cam = rctx->camera; float_t v3 = 1.0f / tanf((float_t)(cam->fov_rad * 0.5)); @@ -542,7 +542,7 @@ static void draw_pass_sss_contour(render_context* rctx, post_process* pp) { if (v9 < 0.0f) v9 = 0.0f; - shader_local_frag_set(&shaders_ft, 4, v9 * 0.004f + 0.0027f, 0.003f, v3 * 0.35f, 0.0008f); + shaders_ft.local_frag_set(4, v9 * 0.004f + 0.0027f, 0.003f, v3 * 0.35f, 0.0008f); render_texture_draw_params(&shaders_ft, pp->render_width, pp->render_height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } @@ -593,7 +593,7 @@ static void draw_pass_sss_filter_calc_coef(double_t a1, size_t a2, double_t a3, a7++; a8++; } - shader_local_frag_set_ptr_array(&shaders_ft, 4, a2 * a2, params); + shaders_ft.local_frag_set(4, a2 * a2, params); } static void draw_pass_sss_filter(render_context* rctx, sss_data* a1) { @@ -601,35 +601,35 @@ static void draw_pass_sss_filter(render_context* rctx, sss_data* a1) { vec3 interest = rctx->camera->interest; vec3 view_point = rctx->camera->view_point; - vec3 v46[2]; - v46[0] = vec3_null; - v46[1] = vec3_null; - float_t v14[2]; + vec3 chara_position[2]; + chara_position[0] = vec3_null; + chara_position[1] = vec3_null; + float_t chara_distance[2]; for (int32_t i = 0; i < 2; i++) { - v46[i] = interest; - v14[i] = 999999.0f; + chara_position[i] = interest; + chara_distance[i] = 999999.0f; rob_chara_bone_data* v16 = rob_chara_array[i].bone_data; if (rob_chara_pv_data_array[i].type != ROB_CHARA_TYPE_NONE && rob_chara_array[i].data.field_0 & 1) { - mat4* v17 = rob_chara_bone_data_get_mats_mat(v16, MOTION_BONE_N_HARA_CP); - if (v17) { - mat4_get_translation(v17, &v46[i]); - vec3_distance(view_point, v46[i], v14[i]); + mat4* mat = rob_chara_bone_data_get_mats_mat(v16, MOTION_BONE_N_HARA_CP); + if (mat) { + mat4_get_translation(mat, &chara_position[i]); + vec3_distance(view_point, chara_position[i], chara_distance[i]); } } } - vec3 v24; - if (v14[0] > v14[1]) { - v24 = v46[1]; - v46[0] = v46[1]; + vec3 closest_chara_position; + if (chara_distance[0] > chara_distance[1]) { + closest_chara_position = chara_position[1]; + chara_position[0] = chara_position[1]; } else - v24 = v46[0]; + closest_chara_position = chara_position[0]; float_t length; - vec3_distance(interest, v24, length); + vec3_distance(interest, closest_chara_position, length); if (length > 1.25f) - interest = v46[0]; + interest = chara_position[0]; float_t v29; vec3_distance(view_point, interest, v29); @@ -648,10 +648,10 @@ static void draw_pass_sss_filter(render_context* rctx, sss_data* a1) { v33 = (v36 * 8.0f) * 0.6f; } - shader_env_frag_set(&shaders_ft, 25, v33, 0.0f, 0.0f, 0.0f); + shaders_ft.env_frag_set(25, v33, 0.0f, 0.0f, 0.0f); - shader_state_matrix_set_projection(&shaders_ft, &mat4_identity, false); - shader_state_matrix_set_modelview(&shaders_ft, 0, &mat4_identity, true); + shaders_ft.state_matrix_set_projection(mat4_identity, false); + shaders_ft.state_matrix_set_modelview(0, mat4_identity, true); gl_state_active_texture(0); if (a1->npr_contour) { @@ -660,21 +660,21 @@ static void draw_pass_sss_filter(render_context* rctx, sss_data* a1) { post_process* pp = &rctx->post_process; gl_state_bind_texture_2d(pp->rend_texture.color_texture->tex); uniform_value[U_REDUCE] = 0; - shader_set(&shaders_ft, SHADER_FT_REDUCE); + shaders_ft.set(SHADER_FT_REDUCE); - shader_state_matrix_set_texture(&shaders_ft, 0, &mat4_identity); + shaders_ft.state_matrix_set_texture(0, mat4_identity); render_texture_draw_params(&shaders_ft, 640, 360, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f); } render_texture_bind(&a1->textures[2], 0); glViewport(0, 0, 320, 180); gl_state_bind_texture_2d(a1->textures[0].color_texture->tex); uniform_value[U_SSS_FILTER] = 0; - shader_set(&shaders_ft, SHADER_FT_SSS_FILT); + shaders_ft.set(SHADER_FT_SSS_FILT); render_texture_draw_params(&shaders_ft, 640, 360, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f); render_texture_bind(&a1->textures[1], 0); uniform_value[U_SSS_FILTER] = 3; - shader_set(&shaders_ft, SHADER_FT_SSS_FILT); - shader_local_frag_set(&shaders_ft, 1, 5.0f, 0.0f, 0.0f, 0.0f); + shaders_ft.set(SHADER_FT_SSS_FILT); + shaders_ft.local_frag_set(1, 5.0f, 0.0f, 0.0f, 0.0f); double_t a5[3]; double_t a6[3]; @@ -694,7 +694,7 @@ static void draw_pass_sss_filter(render_context* rctx, sss_data* a1) { a8[2] = 2.0; draw_pass_sss_filter_calc_coef(1.0, sss_count, v34, 3, a5, a6, a7, a8); - shader_local_frag_set(&shaders_ft, 1, (float_t)(sss_count - 1), 0.0f, 1.0f, 1.0f); + shaders_ft.local_frag_set(1, (float_t)(sss_count - 1), 0.0f, 1.0f, 1.0f); glViewport(0, 0, 320, 180); gl_state_bind_texture_2d(a1->textures[2].color_texture->tex); render_texture_draw_params(&shaders_ft, 320, 180, 1.0f, 1.0f, 0.96f, 1.0f, 0.0f); @@ -807,7 +807,7 @@ static void draw_pass_refract(render_context* rctx, draw_pass* a1) { } } -static void draw_pass_preprocess(render_context* rctx, draw_pass* a1) { +static void draw_pass_pre_process(render_context* rctx, draw_pass* a1) { } @@ -874,10 +874,13 @@ static void draw_pass_3d(render_context* rctx, draw_pass* a1) { if (a1->draw_pass_3d[DRAW_PASS_3D_TRANSPARENT]) draw_task_draw_objects_by_type(rctx, DRAW_OBJECT_TRANSPARENT, 0, 0, 1, -1); /*if (rctx->draw_pass.field_120) - draw_task_draw_objects_by_type(DRAW_OBJECT_TYPE_7, 0, 0, 1, -1);*/ + draw_task_draw_objects_by_type(rctx, DRAW_OBJECT_TYPE_7, 0, 0, 1, -1);*/ + + rctx->post_process.exposure->get_exposure_chara_data(&rctx->post_process, rctx->camera); + gl_state_bind_vertex_array(rctx->vao); //post_process_draw_lens_flare(a1->post_process); - //draw_stars(); + //draw_stars(&stars); draw_task_draw_objects_by_type_translucent(rctx, a1->draw_pass_3d[DRAW_PASS_3D_OPAQUE], @@ -950,7 +953,7 @@ static void draw_pass_3d(render_context* rctx, draw_pass* a1) { gl_state_active_bind_texture_2d(15, 0); /*if (a1->shadow) draw_pass_3d_shadow_reset();*/ - shader_unbind(); + shader::unbind(); } static int32_t draw_pass_3d_get_translucent_count(render_context* rctx) { @@ -970,8 +973,8 @@ static int32_t draw_pass_3d_get_translucent_count(render_context* rctx) { static void draw_pass_3d_shadow_reset(render_context* rctx) { gl_state_active_bind_texture_2d(6, 0); gl_state_active_bind_texture_2d(7, 0); - shader_state_matrix_set_texture(&shaders_ft, 6, &mat4_identity); - shader_state_matrix_set_texture(&shaders_ft, 7, &mat4_identity); + shaders_ft.state_matrix_set_texture(6, mat4_identity); + shaders_ft.state_matrix_set_texture(7, mat4_identity); rctx->draw_state.self_shadow = false; rctx->draw_state.light = false; } @@ -981,7 +984,7 @@ static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) { gl_state_active_bind_texture_2d(19, shad->field_8[3].color_texture->tex); gl_state_active_bind_texture_2d(20, shad->field_8[5].color_texture->tex); gl_state_active_texture(0); - shader_env_frag_set(&shaders_ft, 23, + shaders_ft.env_frag_set(23, ((shad->field_2D8 * shad->field_208) * 2.0f) * 1.442695f, 0.0f, 0.0f, 0.0f); rctx->draw_state.self_shadow = true; } @@ -1022,7 +1025,7 @@ static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) { mat4 view; mat4_look_at(view_point, interest, &view); mat4_mult(&view, &proj, &view); - shader_state_matrix_set_texture(&shaders_ft, 6ULL + i, &view); + shaders_ft.state_matrix_set_texture(6ULL + i, view); } for (int32_t i = 0, j = 0; i < 2; i++) { @@ -1047,8 +1050,8 @@ static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) { ambient.z = shad->ambient; } - shader_env_frag_set(&shaders_ft, 12, ambient.x, ambient.y, ambient.z, 1.0f); - shader_env_frag_set(&shaders_ft, 13, 1.0f - ambient.x, 1.0f - ambient.y, 1.0f - ambient.z, 0.0f); + shaders_ft.env_frag_set(12, ambient.x, ambient.y, ambient.z, 1.0f); + shaders_ft.env_frag_set(13, 1.0f - ambient.x, 1.0f - ambient.y, 1.0f - ambient.z, 0.0f); } else { rctx->draw_state.light = false; @@ -1057,8 +1060,8 @@ static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) { gl_state_active_bind_texture_2d(6 + i, shad->field_158[1 + i]->color_texture->tex); gl_state_active_texture(0); - shader_env_frag_set_ptr(&shaders_ft, 12, &vec4_identity); - shader_env_frag_set_ptr(&shaders_ft, 13, &vec4_null); + shaders_ft.env_frag_set(12, vec4_identity); + shaders_ft.env_frag_set(13, vec4_null); } } @@ -1071,7 +1074,7 @@ static void draw_pass_show_vector(render_context* rctx, draw_pass* a1) { glViewport(0, 0, rctx->post_process.render_width, rctx->post_process.render_height); draw_pass_set_camera(rctx->camera); - shader_env_vert_set(&shaders_ft, 20, a1->show_vector_length, a1->show_vector_z_offset, 0.0f, 0.0f); + shaders_ft.env_vert_set(20, a1->show_vector_length, a1->show_vector_z_offset, 0.0f, 0.0f); for (int32_t i = 1; i < 4; i++) { if (~a1->show_vector_flags & (1 << (i - 1))) continue; @@ -1124,7 +1127,7 @@ static void draw_pass_3d_grid(render_context* rctx) { gl_state_set_depth_mask(GL_TRUE); grid_shader.use(); - shader_glsl_set_mat4(&grid_shader, "vp", GL_FALSE, rctx->camera->view_projection); + grid_shader.set("vp", false, rctx->camera->view_projection); gl_state_bind_array_buffer(grid_vbo); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, @@ -1144,15 +1147,15 @@ static void draw_pass_3d_grid(render_context* rctx) { } static void draw_pass_set_camera(camera* cam) { - shader_state_matrix_set_modelview(&shaders_ft, 0, &cam->view, false); - shader_state_matrix_set_projection(&shaders_ft, &cam->projection, true); - shader_state_matrix_set_program(&shaders_ft, 5, &cam->view); + shaders_ft.state_matrix_set_modelview(0, cam->view, false); + shaders_ft.state_matrix_set_projection(cam->projection, true); + shaders_ft.state_matrix_set_program(5, cam->view); - shader_env_frag_set(&shaders_ft, 20, + shaders_ft.env_frag_set(20, (float_t)(0.5 / (cam->fov_rad * cam->aspect)), (float_t)(0.5 / cam->fov_rad), 0.0f, 0.0f); - shader_env_frag_set(&shaders_ft, 32, + shaders_ft.env_frag_set(32, (float_t)(cam->max_distance / (cam->max_distance - cam->min_distance)), (float_t)(-(cam->max_distance * cam->min_distance) / (cam->max_distance - cam->min_distance)), 0.0f, 0.0f); @@ -1196,8 +1199,8 @@ static void texture_params_get(GLuint tex_0, texture_param* tex_0_param, mat4 mat; mat4_ortho(0.0f, (float_t)tex_0_param->width, 0.0f, (float_t)tex_0_param->height, -1.0f, 1.0f, &mat); - shader_state_matrix_set_projection(&shaders_ft, &mat, false); - shader_state_matrix_set_modelview(&shaders_ft, 0, &mat4_identity, true); + shaders_ft.state_matrix_set_projection(mat, false); + shaders_ft.state_matrix_set_modelview(0, mat4_identity, true); glViewport(0, 0, tex_0_param->width, tex_0_param->height); } } @@ -1215,11 +1218,11 @@ static void blur_filter_apply(GLuint tex_0, GLuint tex_1, blur_filter_mode filte texture_param tex_params[2]; texture_params_get(tex_0, &tex_params[0], tex_1, &tex_params[1], 0, 0); uniform_value[U_IMAGE_FILTER] = filter == BLUR_FILTER_32 ? 1 : 0; - shader_set(&shaders_ft, SHADER_FT_IMGFILT); + shaders_ft.set(SHADER_FT_IMGFILT); float_t scale = filter == BLUR_FILTER_32 ? (float_t)(1.0 / 8.0) : (float_t)(1.0 / 4.0); - shader_local_frag_set(&shaders_ft, 0, scale, scale, scale, scale); - shader_local_frag_set(&shaders_ft, 1, 0.0f, 0.0f, 0.0f, 0.0f); + shaders_ft.local_frag_set(0, scale, scale, scale, scale); + shaders_ft.local_frag_set(1, 0.0f, 0.0f, 0.0f, 0.0f); float_t w = 1.0f / (float_t)tex_params[1].width; float_t h = 1.0f / (float_t)tex_params[1].height; switch (filter) { @@ -1229,10 +1232,10 @@ static void blur_filter_apply(GLuint tex_0, GLuint tex_1, blur_filter_mode filte mat4_translate( 0.0f * w, 1.0f * h, 0.0f, &m[1]); mat4_translate( 1.0f * w, -1.0f * h, 0.0f, &m[2]); mat4_translate( 0.0f * w, -1.0f * h, 0.0f, &m[3]); - shader_state_matrix_set_texture(&shaders_ft, 0, &m[0]); - shader_state_matrix_set_texture(&shaders_ft, 1, &m[1]); - shader_state_matrix_set_texture(&shaders_ft, 2, &m[2]); - shader_state_matrix_set_texture(&shaders_ft, 3, &m[3]); + shaders_ft.state_matrix_set_texture(0, m[0]); + shaders_ft.state_matrix_set_texture(1, m[1]); + shaders_ft.state_matrix_set_texture(2, m[2]); + shaders_ft.state_matrix_set_texture(3, m[3]); } break; case BLUR_FILTER_9: { mat4 m[4]; @@ -1240,10 +1243,10 @@ static void blur_filter_apply(GLuint tex_0, GLuint tex_1, blur_filter_mode filte mat4_translate( 0.5f * w, 0.5f * h, 0.0f, &m[1]); mat4_translate(-0.5f * w, -0.5f * h, 0.0f, &m[2]); mat4_translate( 0.5f * w, -0.5f * h, 0.0f, &m[3]); - shader_state_matrix_set_texture(&shaders_ft, 0, &m[0]); - shader_state_matrix_set_texture(&shaders_ft, 1, &m[1]); - shader_state_matrix_set_texture(&shaders_ft, 2, &m[2]); - shader_state_matrix_set_texture(&shaders_ft, 3, &m[3]); + shaders_ft.state_matrix_set_texture(0, m[0]); + shaders_ft.state_matrix_set_texture(1, m[1]); + shaders_ft.state_matrix_set_texture(2, m[2]); + shaders_ft.state_matrix_set_texture(3, m[3]); } break; case BLUR_FILTER_16: { mat4 m[4]; @@ -1251,10 +1254,10 @@ static void blur_filter_apply(GLuint tex_0, GLuint tex_1, blur_filter_mode filte mat4_translate(-1.5f * w, 0.5f * h, 0.0f, &m[1]); mat4_translate( 1.5f * w, -0.5f * h, 0.0f, &m[2]); mat4_translate(-0.5f * w, 1.5f * h, 0.0f, &m[3]); - shader_state_matrix_set_texture(&shaders_ft, 0, &m[0]); - shader_state_matrix_set_texture(&shaders_ft, 1, &m[1]); - shader_state_matrix_set_texture(&shaders_ft, 2, &m[2]); - shader_state_matrix_set_texture(&shaders_ft, 3, &m[3]); + shaders_ft.state_matrix_set_texture(0, m[0]); + shaders_ft.state_matrix_set_texture(1, m[1]); + shaders_ft.state_matrix_set_texture(2, m[2]); + shaders_ft.state_matrix_set_texture(3, m[3]); } break; case BLUR_FILTER_32: { mat4 m[8]; @@ -1266,18 +1269,18 @@ static void blur_filter_apply(GLuint tex_0, GLuint tex_1, blur_filter_mode filte mat4_translate( 1.5f * w, 1.5f * h, 0.0f, &m[5]); mat4_translate( 1.5f * w, 3.5f * h, 0.0f, &m[6]); mat4_translate(-3.5f * w, 3.5f * h, 0.0f, &m[7]); - shader_state_matrix_set_texture(&shaders_ft, 0, &m[0]); - shader_state_matrix_set_texture(&shaders_ft, 1, &m[1]); - shader_state_matrix_set_texture(&shaders_ft, 2, &m[2]); - shader_state_matrix_set_texture(&shaders_ft, 3, &m[3]); - shader_state_matrix_set_texture(&shaders_ft, 4, &m[4]); - shader_state_matrix_set_texture(&shaders_ft, 5, &m[5]); - shader_state_matrix_set_texture(&shaders_ft, 6, &m[6]); - shader_state_matrix_set_texture(&shaders_ft, 7, &m[7]); + shaders_ft.state_matrix_set_texture(0, m[0]); + shaders_ft.state_matrix_set_texture(1, m[1]); + shaders_ft.state_matrix_set_texture(2, m[2]); + shaders_ft.state_matrix_set_texture(3, m[3]); + shaders_ft.state_matrix_set_texture(4, m[4]); + shaders_ft.state_matrix_set_texture(5, m[5]); + shaders_ft.state_matrix_set_texture(6, m[6]); + shaders_ft.state_matrix_set_texture(7, m[7]); } break; } gl_state_active_bind_texture_2d(0, tex_1); - shader_state_matrix_set_mvp(&shaders_ft, &mat4_identity); + shaders_ft.state_matrix_set_mvp(mat4_identity); render_texture_draw_custom(&shaders_ft); texture_params_restore(&tex_params[0], &tex_params[1], 0); } diff --git a/src/CRE/draw_pass.h b/src/CRE/draw_pass.h index d05f694e..3d7a90fe 100644 --- a/src/CRE/draw_pass.h +++ b/src/CRE/draw_pass.h @@ -5,9 +5,9 @@ #pragma once -#include "../KKdLib/default.h" -#include "../KKdLib/mat.h" -#include "../KKdLib/vec.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/mat.hpp" +#include "../KKdLib/vec.hpp" #include "draw_task.h" extern void draw_pass_main(render_context* rctx); diff --git a/src/CRE/draw_primitive.h b/src/CRE/draw_primitive.h index 89873b4c..42dbca5d 100644 --- a/src/CRE/draw_primitive.h +++ b/src/CRE/draw_primitive.h @@ -5,8 +5,7 @@ #pragma once -#include "../KKdLib/default.h" -#include "../KKdLib/mat.h" -#include "../KKdLib/vec.h" -#include "../KKdLib/vector.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/mat.hpp" +#include "../KKdLib/vec.hpp" #include "gl_state.h" diff --git a/src/CRE/draw_task.c b/src/CRE/draw_task.c index 717a760a..b3ad8818 100644 --- a/src/CRE/draw_task.c +++ b/src/CRE/draw_task.c @@ -133,7 +133,7 @@ void draw_task_draw_objects_by_type(render_context* rctx, draw_object_type type, default: break; } - shader_env_frag_set(&shaders_ft, 21, 0.0f, 0.0f, 0.0f, min_alpha); + shaders_ft.env_frag_set(21, 0.0f, 0.0f, 0.0f, min_alpha); uniform_value[U_ALPHA_TEST] = alpha_test; std::vector& vec = rctx->object_data.draw_task_array[type]; @@ -218,7 +218,7 @@ void draw_task_draw_objects_by_type(render_context* rctx, draw_object_type type, } uniform_value_reset(); - shader_unbind(); + shader::unbind(); gl_state_set_blend_func(GL_ONE, GL_ZERO); } @@ -480,7 +480,7 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, 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 (~draw_task_flags & DRAW_TASK_NO_TRANSLUCENCY) { if (attrib.flag_28 || (attrib.punch_through || !(attrib.alpha_texture | attrib.alpha_material)) && !sub_mesh->attrib.m.transparent) { @@ -525,7 +525,7 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, draw_task_add(rctx, DRAW_OBJECT_SSS, task); if (material->material.attrib.m.punch_through) { - if (~draw_task_flags & DRAW_TASK_NO_TRANSLUCENCY) + if (!(draw_task_flags & DRAW_TASK_NO_TRANSLUCENCY)) draw_task_add(rctx, DRAW_OBJECT_TRANSPARENT, task); if (draw_task_flags & DRAW_TASK_CHARA_REFLECT) @@ -538,7 +538,7 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, draw_task_add(rctx, DRAW_OBJECT_REFRACT_TRANSPARENT, task); } else { - if (~draw_task_flags & DRAW_TASK_NO_TRANSLUCENCY) + if (!(draw_task_flags & DRAW_TASK_NO_TRANSLUCENCY)) draw_task_add(rctx, DRAW_OBJECT_OPAQUE, task); if (draw_task_flags & DRAW_TASK_20) @@ -558,7 +558,7 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object, draw_task_add(rctx, DRAW_OBJECT_RIPPLE, task); continue; } - else if (~draw_task_flags & DRAW_TASK_NO_TRANSLUCENCY) { + else if (!(draw_task_flags & DRAW_TASK_NO_TRANSLUCENCY)) { if (!attrib.translucent_priority) if (mesh->attrib.m.translucent_no_shadow || draw_task_flags & DRAW_TASK_TRANSLUCENT_NO_SHADOW) diff --git a/src/CRE/draw_task.h b/src/CRE/draw_task.h index 0d93e2e7..f616a66a 100644 --- a/src/CRE/draw_task.h +++ b/src/CRE/draw_task.h @@ -5,9 +5,9 @@ #pragma once -#include "../KKdLib/default.h" -#include "../KKdLib/mat.h" -#include "../KKdLib/vec.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/mat.hpp" +#include "../KKdLib/vec.hpp" #include "draw_object.h" #include "draw_primitive.h" diff --git a/src/CRE/file_handler.cpp b/src/CRE/file_handler.cpp index 55380148..2a3ff9d3 100644 --- a/src/CRE/file_handler.cpp +++ b/src/CRE/file_handler.cpp @@ -45,8 +45,8 @@ struct file_handler_storage { file_handler_storage* file_handler_storage_data; -static bool file_handler_load_file(void* data, const char* path, const char* file, uint32_t hash); -static bool file_handler_load_farc_file(void* data, const char* path, const char* file, uint32_t hash); +static bool file_handler_load_file(void* data, const char* dir, const char* file, uint32_t hash); +static bool file_handler_load_farc_file(void* data, const char* dir, const char* file, uint32_t hash); static void file_handler_storage_ctrl_list(); static void file_handler_storage_thread_ctrl(); @@ -64,8 +64,8 @@ void file_handler::call_callback(int32_t index) { return; std::unique_lock u_lock(mtx); - void* data = this->data; - void(*callback_func)(void*, void*, size_t) = this->callback[index].func; + const void* data = this->data; + void(*callback_func)(void*, const 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; @@ -88,13 +88,14 @@ void file_handler::set_farc_file(const char* farc_file, bool cache) { u_lock.unlock(); } -void file_handler::set_path(const char* path) { +void file_handler::set_dir(const char* dir) { std::unique_lock u_lock(mtx); - this->path = path; + this->dir = dir; u_lock.unlock(); } -void file_handler::set_callback_data(int32_t index, void(* func)(void*, void*, size_t), void* data) { +void file_handler::set_callback_data(int32_t index, + void(*func)(void*, const void*, size_t), void* data) { std::unique_lock u_lock(mtx); if (index < 2) { callback[index].func = func; @@ -219,8 +220,8 @@ void file_handler_storage_free() { delete file_handler_storage_data; } -static bool file_handler_load_file(void* data, const char* path, const char* file, uint32_t hash) { - std::string file_path = path; +static bool file_handler_load_file(void* data, const char* dir, const char* file, uint32_t hash) { + std::string file_path = dir; file_path += file; struct stat st; @@ -234,16 +235,15 @@ static bool file_handler_load_file(void* data, const char* path, const char* fil return false; stream s; - io_open(&s, file_path.c_str(), "rb"); - bool ret = s.io.stream && io_read(&s, fhndl->data, fhndl->size); - io_free(&s); + s.open(file_path.c_str(), "rb"); + bool ret = s.io.stream && s.read(fhndl->data, fhndl->size); if (!ret) free(fhndl->data); return ret; } -static bool file_handler_load_farc_file(void* data, const char* path, const char* file, uint32_t hash) { - std::string file_path = path; +static bool file_handler_load_farc_file(void* data, const char* dir, const char* file, uint32_t hash) { + std::string file_path = dir; file_path += file; file_handler* fhndl = (file_handler*)data; @@ -308,10 +308,10 @@ static void file_handler_storage_thread_ctrl() { if (i->not_ready) { if (i->farc_file.size()) i->not_ready = !((data_struct*)i->ds)->load_file(i, - i->path.c_str(), i->farc_file.c_str(), file_handler_load_farc_file); + i->dir.c_str(), i->farc_file.c_str(), file_handler_load_farc_file); else i->not_ready = !((data_struct*)i->ds)->load_file(i, - i->path.c_str(), i->file.c_str(), file_handler_load_file); + i->dir.c_str(), i->file.c_str(), file_handler_load_file); } i->reading = false; u_lock.unlock(); @@ -365,7 +365,7 @@ void p_file_handler::free_data() { ptr = 0; } -void* p_file_handler::get_data() { +const void* p_file_handler::get_data() { if (!ptr || ptr->not_ready) return 0; return ptr->data; @@ -377,9 +377,24 @@ ssize_t p_file_handler::get_size() { return ptr->size; } -bool p_file_handler::read_file(void* data, const char* path, +bool p_file_handler::read_file(void* data, const char* path) { + const char* t = strrchr(path, '/'); + if (t) { + std::string dir = std::string(path, t - path + 1); + return read_file(data, dir.c_str(), 0, t + 1, false); + } + + t = strrchr(path, '\\'); + if (t) { + std::string dir = std::string(path, t - path + 1); + return read_file(data, dir.c_str(), 0, t + 1, false); + } + return false; +} + +bool p_file_handler::read_file(void* data, const char* dir, const char* farc_file, const char* file, bool cache) { - if (!path || !file) + if (!dir || !file) return false; if (ptr) { @@ -388,7 +403,7 @@ bool p_file_handler::read_file(void* data, const char* path, free_data(); } - if (!((data_struct*)data)->check_file_exists(path, farc_file ? farc_file : file)) + if (!((data_struct*)data)->check_file_exists(dir, farc_file ? farc_file : file)) return false; ptr = new file_handler; @@ -401,7 +416,7 @@ bool p_file_handler::read_file(void* data, const char* path, ptr->count++; u_lock.unlock(); - ptr->set_path(path); + ptr->set_dir(dir); if (farc_file) ptr->set_farc_file(farc_file, cache); ptr->set_file(file); @@ -413,12 +428,12 @@ bool p_file_handler::read_file(void* data, const char* path, return true; } -bool p_file_handler::read_file(void* data, const char* path, const char* file) { - return read_file(data, path, 0, file, false); +bool p_file_handler::read_file(void* data, const char* dir, const char* file) { + return read_file(data, dir, 0, file, false); } -bool p_file_handler::read_file(void* data, const char* path, uint32_t hash, const char* ext) { - if (!path || !hash || hash == hash_murmurhash_empty) +bool p_file_handler::read_file(void* data, const char* dir, uint32_t hash, const char* ext) { + if (!dir || !hash || hash == hash_murmurhash_empty) return false; if (ptr) { @@ -428,7 +443,7 @@ bool p_file_handler::read_file(void* data, const char* path, uint32_t hash, cons } std::string file; - if (!((data_struct*)data)->get_file(path, hash, ext, &file)) + if (!((data_struct*)data)->get_file(dir, hash, ext, file)) return false; ptr = new file_handler; @@ -441,7 +456,7 @@ bool p_file_handler::read_file(void* data, const char* path, uint32_t hash, cons ptr->count++; u_lock.unlock(); - ptr->set_path(path); + ptr->set_dir(dir); ptr->set_file(file.c_str()); std::unique_lock u_lock1(ptr->mtx); @@ -463,10 +478,10 @@ void p_file_handler::read_now() { bool ret; if (ptr->farc_file.size()) ret = ((data_struct*)ptr->ds)->load_file( - ptr, ptr->path.c_str(), ptr->farc_file.c_str(), file_handler_load_farc_file); + ptr, ptr->dir.c_str(), ptr->farc_file.c_str(), file_handler_load_farc_file); else ret = ((data_struct*)ptr->ds)->load_file( - ptr, ptr->path.c_str(), ptr->file.c_str(), file_handler_load_file); + ptr, ptr->dir.c_str(), ptr->file.c_str(), file_handler_load_file); if (ret) ptr->not_ready = false; @@ -479,7 +494,8 @@ void p_file_handler::read_now() { } } -void p_file_handler::set_callback_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*, const void*, size_t), void* data) { if (ptr) ptr->set_callback_data(index, func, data); } diff --git a/src/CRE/file_handler.hpp b/src/CRE/file_handler.hpp index 1478b764..b6130283 100644 --- a/src/CRE/file_handler.hpp +++ b/src/CRE/file_handler.hpp @@ -10,11 +10,11 @@ #include #include #include -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "../KKdLib/farc.hpp" -struct file_handler_read_func_data { - void(*func)(void*, void*, size_t); +struct file_handler_callback_func { + void(*func)(void*, const void*, size_t); void* data; bool ready; }; @@ -24,11 +24,11 @@ struct file_handler { std::mutex mtx; bool not_ready; bool reading; - std::string path; + std::string dir; std::string farc_file; std::string file; bool cache; - file_handler_read_func_data callback[2]; + file_handler_callback_func callback[2]; ssize_t size; void* data; void* ds; @@ -40,8 +40,8 @@ struct file_handler { 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_callback_data(int32_t index, void(*func)(void*, void*, size_t), void* data); + void set_dir(const char* dir); + void set_callback_data(int32_t index, void(*func)(void*, const void*, size_t), void* data); }; struct p_file_handler { @@ -53,13 +53,14 @@ struct p_file_handler { void call_free_func_free_data(); bool check_not_ready(); void free_data(); - void* get_data(); + const void* get_data(); ssize_t get_size(); - bool read_file(void* data, const char* path, const char* farc_file, const char* file, bool cache); - 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); + bool read_file(void* data, const char* path); + bool read_file(void* data, const char* dir, const char* farc_file, const char* file, bool cache); + bool read_file(void* data, const char* dir, const char* file); + bool read_file(void* data, const char* dir, uint32_t hash, const char* ext); void read_now(); - void set_callback_data(int32_t index, void(* func)(void*, void*, size_t), void* data); + void set_callback_data(int32_t index, void(* func)(void*, const void*, size_t), void* data); }; extern void file_handler_storage_init(); diff --git a/src/CRE/frame_rate_control.hpp b/src/CRE/frame_rate_control.hpp index fba0dc23..12f6192d 100644 --- a/src/CRE/frame_rate_control.hpp +++ b/src/CRE/frame_rate_control.hpp @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" class FrameRateControl { public: diff --git a/src/CRE/gl_state.h b/src/CRE/gl_state.h index 4653d15e..063f12f9 100644 --- a/src/CRE/gl_state.h +++ b/src/CRE/gl_state.h @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include struct gl_state_struct { diff --git a/src/CRE/item_table.cpp b/src/CRE/item_table.cpp index 65e5c8af..6c22991b 100644 --- a/src/CRE/item_table.cpp +++ b/src/CRE/item_table.cpp @@ -3,8 +3,8 @@ GitHub/GitLab: korenkonder */ -#include "../KKdLib/io/path.h" -#include "../KKdLib/str_utils.h" +#include "../KKdLib/io/path.hpp" +#include "../KKdLib/str_utils.hpp" #include "data.hpp" #include "item_table.hpp" @@ -156,12 +156,11 @@ static bool item_table_array_read(data_struct* data, const char* path) { farc_file* ff = f.read_file(file); if (ff) { stream s; - io_open(&s, ff->data, ff->size); + s.open(ff->data, ff->size); itm_table itm; itm.read(ff->data, ff->size); if (itm.ready) item_table_load(data, &item_table_array[i], &itm); - io_free(&s); } } free(path_farc); diff --git a/src/CRE/item_table.hpp b/src/CRE/item_table.hpp index 05865225..590a3906 100644 --- a/src/CRE/item_table.hpp +++ b/src/CRE/item_table.hpp @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "../KKdLib/database/item_table.hpp" #include "file_handler.hpp" #include "object.hpp" diff --git a/src/CRE/light_param.cpp b/src/CRE/light_param.cpp index 3c5c584f..aa390fb6 100644 --- a/src/CRE/light_param.cpp +++ b/src/CRE/light_param.cpp @@ -5,7 +5,7 @@ #include "light_param.hpp" #include "../KKdLib/hash.hpp" -#include "../KKdLib/str_utils.h" +#include "../KKdLib/str_utils.hpp" #include "render_context.hpp" static void light_param_data_get_stage_name_string(std::string* str, int32_t stage_index); diff --git a/src/CRE/light_param.hpp b/src/CRE/light_param.hpp index c8438206..80b1b221 100644 --- a/src/CRE/light_param.hpp +++ b/src/CRE/light_param.hpp @@ -7,10 +7,9 @@ #include #include -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "../KKdLib/farc.hpp" -#include "../KKdLib/mat.h" -#include "../KKdLib/vector.h" +#include "../KKdLib/mat.hpp" #include "../KKdLib/light_param/face.hpp" #include "../KKdLib/light_param/fog.hpp" #include "../KKdLib/light_param/glow.hpp" diff --git a/src/CRE/light_param/face.c b/src/CRE/light_param/face.cpp similarity index 81% rename from src/CRE/light_param/face.c rename to src/CRE/light_param/face.cpp index 2cc326e4..258f323a 100644 --- a/src/CRE/light_param/face.c +++ b/src/CRE/light_param/face.cpp @@ -3,13 +3,13 @@ GitHub/GitLab: korenkonder */ -#include "face.h" +#include "face.hpp" -void face_init(face* face) { - face->offset = 1.0f; - face->scale = 0.35f; - face->position = vec3_null; - face->direction = vec3_null; +face::face() { + offset = 1.0f; + scale = 0.35f; + position = vec3_null; + direction = vec3_null; } inline float_t face_get_offset(face* face) { diff --git a/src/CRE/light_param/face.h b/src/CRE/light_param/face.hpp similarity index 87% rename from src/CRE/light_param/face.h rename to src/CRE/light_param/face.hpp index 0a26daff..f83cf321 100644 --- a/src/CRE/light_param/face.h +++ b/src/CRE/light_param/face.hpp @@ -5,9 +5,9 @@ #pragma once -#include "../../KKdLib/default.h" +#include "../../KKdLib/default.hpp" #include "../../KKdLib/light_param/face.hpp" -#include "../../KKdLib/vec.h" +#include "../../KKdLib/vec.hpp" #include "../static_var.h" struct face { @@ -15,9 +15,10 @@ struct face { float_t scale; vec3 position; vec3 direction; + + face(); }; -extern void face_init(face* face); extern float_t face_get_offset(face* face); extern void face_set_offset(face* face, float_t value); extern float_t face_get_scale(face* face); diff --git a/src/CRE/light_param/fog.c b/src/CRE/light_param/fog.cpp similarity index 69% rename from src/CRE/light_param/fog.c rename to src/CRE/light_param/fog.cpp index 71d2465d..11d27baf 100644 --- a/src/CRE/light_param/fog.c +++ b/src/CRE/light_param/fog.cpp @@ -3,16 +3,16 @@ GitHub/GitLab: korenkonder */ -#include "fog.h" +#include "fog.hpp" #include "../shader_ft.h" -void fog_init(fog* fog) { - fog->type = FOG_NONE; - fog->density = 0.0f; - fog->start = 20.0f; - fog->end = 1000.0f; - fog->index = 0; - fog->color = { 1.0f, 1.0f, 1.0f, 0.0f }; +fog::fog() { + type = FOG_NONE; + density = 0.0f; + start = 20.0f; + end = 1000.0f; + index = 0; + color = { 1.0f, 1.0f, 1.0f, 0.0f }; } inline fog_type fog_get_type(fog* fog) { @@ -72,7 +72,7 @@ void fog_data_set(fog* fog, fog_id id) { float_t start = fog_get_start(fog); float_t end = fog_get_end(fog); if (start >= end) - start = end - 0.0099999998f; + start = end - 0.01f; vec4 params; params.x = density; @@ -84,22 +84,22 @@ void fog_data_set(fog* fog, fog_id id) { case FOG_DEPTH: { vec4 color; fog_get_color(fog, &color); - shader_env_vert_set_ptr(&shaders_ft, 29, &color); - shader_env_frag_set_ptr(&shaders_ft, 4, &color); + shaders_ft.env_vert_set(29, color); + shaders_ft.env_frag_set(4, color); vec4_mult_scalar(color, (float_t)(1.0 / 8.0), color); - shader_state_fog_set_color_ptr(&shaders_ft, &color); - shader_state_fog_set_params_ptr(&shaders_ft, ¶ms); + shaders_ft.state_fog_set_color(color); + shaders_ft.state_fog_set_params(params); } break; case FOG_HEIGHT: { vec4 color; fog_get_color(fog, &color); - shader_env_vert_set_ptr(&shaders_ft, 30, &color); - shader_env_frag_set_ptr(&shaders_ft, 11, &color); - shader_env_vert_set_ptr(&shaders_ft, 14, ¶ms); + shaders_ft.env_vert_set(30, color); + shaders_ft.env_frag_set(11, color); + shaders_ft.env_vert_set(14, params); } break; case FOG_BUMP: { - shader_env_vert_set_ptr(&shaders_ft, 19, ¶ms); + shaders_ft.env_vert_set(19, params); } break; } } diff --git a/src/CRE/light_param/fog.h b/src/CRE/light_param/fog.hpp similarity index 90% rename from src/CRE/light_param/fog.h rename to src/CRE/light_param/fog.hpp index d3510c21..253e0511 100644 --- a/src/CRE/light_param/fog.h +++ b/src/CRE/light_param/fog.hpp @@ -5,9 +5,9 @@ #pragma once -#include "../../KKdLib/default.h" +#include "../../KKdLib/default.hpp" #include "../../KKdLib/light_param/fog.hpp" -#include "../../KKdLib/vec.h" +#include "../../KKdLib/vec.hpp" #include "../static_var.h" struct fog { @@ -17,9 +17,10 @@ struct fog { float_t end; int32_t index; vec4 color; + + fog(); }; -extern void fog_init(fog* fog); extern fog_type fog_get_type(fog* fog); extern void fog_set_type(fog* fog, fog_type value); extern float_t fog_get_density(fog* fog); diff --git a/src/CRE/light_param/light.c b/src/CRE/light_param/light.cpp similarity index 68% rename from src/CRE/light_param/light.c rename to src/CRE/light_param/light.cpp index d520ffa2..f1378900 100644 --- a/src/CRE/light_param/light.c +++ b/src/CRE/light_param/light.cpp @@ -3,8 +3,8 @@ GitHub/GitLab: korenkonder */ -#include "light.h" -#include "../../KKdLib/mat.h" +#include "light.hpp" +#include "../../KKdLib/mat.hpp" #include "../shader_ft.h" extern bool light_chara_ambient; @@ -12,43 +12,47 @@ extern vec4 npr_spec_color; static void light_get_direction_from_position(vec4* pos_dir, light_data* light, bool force); -void light_set_init(light_set* set) { - vec3 tv3; - vec4 tv4; - for (int32_t i = LIGHT_CHARA; i <= LIGHT_PROJECTION; i++) { - light_data* light = &set->lights[i]; - light_set_type(light, LIGHT_OFF); - tv4 = { 0.0f, 0.0, 0.0f, 1.0f }; - light_set_ambient(light, &tv4); - tv4 = { 1.0f, 1.0, 1.0f, 0.0f }; - light_set_diffuse(light, &tv4); - tv4 = { 1.0f, 1.0f, 1.0f, 0.0f }; - light_set_specular(light, &tv4); - tv3 = { 0.0f, 1.0f, 1.0f }; - light_set_position(light, &tv3); - tv3 = { 0.0f, 0.0f, -1.0f }; - light_set_spot_direction(light, &tv3); - light_set_spot_exponent(light, 0.0f); - light_set_spot_cutoff(light, 45.0f); - light_set_constant(light, 1.0f); - light_set_linear(light, 0.0f); - light_set_quadratic(light, 0.0f); - tv4 = { 0.0f, 0.0f, 0.0f, 0.0f }; - light_set_ibl_specular(light, &tv4); - tv4 = { 0.0f, 0.0f, 0.0f, 0.0f }; - light_set_ibl_back(light, &tv4); - tv4 = { 0.0f, 0.0f, 0.0f, 0.0f }; - light_set_ibl_direction(light, &tv4); - tv3 = { 0.0f, 0.0f, 0.0f }; - light_set_tone_curve(light, &tv3); - } - tv4 = { 0.2f, 0.2f, 0.2f, 1.0f }; - light_set_set_ambient_intensity(set, &tv4); - tv4 = { 1.0f, 1.0f, 1.0f, 1.0f }; - light_set_diffuse(&set->lights[LIGHT_CHARA], &tv4); - tv4 = { 1.0f, 1.0f, 1.0f, 1.0f }; - light_set_specular(&set->lights[LIGHT_CHARA], &tv4); - light_set_set_irradiance(set, &mat4_identity, &mat4_identity, &mat4_identity); +light_data::light_data() : type(), ambient(), diffuse(), specular(), position(), +spot_direction(), spot_exponent(), spot_cutoff(), constant(), linear(), quadratic(), +ibl_specular(), ibl_back(), ibl_direction(), tone_curve(),clip_plane() { + vec3 temp3; + vec4 temp4; + light_set_type(this, LIGHT_OFF); + temp4 = { 0.0f, 0.0, 0.0f, 1.0f }; + light_set_ambient(this, &temp4); + temp4 = { 1.0f, 1.0, 1.0f, 0.0f }; + light_set_diffuse(this, &temp4); + temp4 = { 1.0f, 1.0f, 1.0f, 0.0f }; + light_set_specular(this, &temp4); + temp3 = { 0.0f, 1.0f, 1.0f }; + light_set_position(this, &temp3); + temp3 = { 0.0f, 0.0f, -1.0f }; + light_set_spot_direction(this, &temp3); + light_set_spot_exponent(this, 0.0f); + light_set_spot_cutoff(this, 45.0f); + light_set_constant(this, 1.0f); + light_set_linear(this, 0.0f); + light_set_quadratic(this, 0.0f); + temp4 = { 0.0f, 0.0f, 0.0f, 0.0f }; + light_set_ibl_specular(this, &temp4); + temp4 = { 0.0f, 0.0f, 0.0f, 0.0f }; + light_set_ibl_back(this, &temp4); + temp4 = { 0.0f, 0.0f, 0.0f, 0.0f }; + light_set_ibl_direction(this, &temp4); + temp3 = { 0.0f, 0.0f, 0.0f }; + light_set_tone_curve(this, &temp3); +} + +light_set::light_set() : ambient_intensity(), +irradiance_r(), irradiance_g(), irradiance_b() { + vec4 temp; + temp = { 0.2f, 0.2f, 0.2f, 1.0f }; + light_set_set_ambient_intensity(this, &temp); + temp = { 1.0f, 1.0f, 1.0f, 1.0f }; + light_set_diffuse(&lights[LIGHT_CHARA], &temp); + temp = { 1.0f, 1.0f, 1.0f, 1.0f }; + light_set_specular(&lights[LIGHT_CHARA], &temp); + light_set_set_irradiance(this, &mat4_identity, &mat4_identity, &mat4_identity); } inline light_type light_get_type(light_data* light) { @@ -232,32 +236,32 @@ inline void light_set_set_irradiance(light_set* set, const mat4* r, const mat4* void light_set_data_set(light_set* set, face* face, light_set_id id) { vec4 ambient_intensity; light_set_get_ambient_intensity(set, &ambient_intensity); - shader_state_lightmodel_set_ambient_ptr(&shaders_ft, false, &ambient_intensity); + shaders_ft.state_lightmodel_set_ambient(false, ambient_intensity); for (int32_t i = LIGHT_CHARA; i <= LIGHT_PROJECTION; i++) { light_data* light = &set->lights[i]; if (light_chara_ambient || i != LIGHT_CHARA) { vec4 ambient = light->ambient; - shader_state_light_set_ambient_ptr(&shaders_ft, i, &ambient); + shaders_ft.state_light_set_ambient(i, ambient); } else - shader_state_light_set_ambient(&shaders_ft, i, 0.0f, 0.0f, 0.0f, 1.0f); + shaders_ft.state_light_set_ambient(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); + shaders_ft.state_light_set_diffuse(i, diffuse); + shaders_ft.state_light_set_specular(i, specular); 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); + shaders_ft.state_light_set_position(i, light_position); - shader_state_light_set_attenuation(&shaders_ft, i, + shaders_ft.state_light_set_attenuation(i, light->constant, light->linear, light->quadratic, light->spot_exponent); vec3 spot_direction = light->spot_direction; - shader_state_light_set_spot_direction(&shaders_ft, i, + shaders_ft.state_light_set_spot_direction(i, spot_direction.x, spot_direction.y, spot_direction.z, light->spot_cutoff); } @@ -279,26 +283,26 @@ void light_set_data_set(light_set* set, face* face, light_set_id id) { light_get_diffuse(&set->lights[LIGHT_CHARA], &diffuse); light_get_specular(&set->lights[LIGHT_CHARA], &specular); - shader_env_vert_set_ptr(&shaders_ft, 5, &position); - shader_env_frag_set_ptr(&shaders_ft, 5, &position); + shaders_ft.env_vert_set(5, position); + shaders_ft.env_frag_set(5, position); vec4_mult(diffuse, ibl_specular, temp); - shader_env_vert_set_ptr(&shaders_ft, 6, &temp); - shader_env_frag_set_ptr(&shaders_ft, 6, &temp); + shaders_ft.env_vert_set(6, temp); + shaders_ft.env_frag_set(6, temp); vec4_mult(specular, ibl_specular, temp); vec4_mult_scalar(temp, spec_coef, temp); - shader_env_vert_set_ptr(&shaders_ft, 7, &temp); - shader_env_frag_set_ptr(&shaders_ft, 7, &temp); + shaders_ft.env_vert_set(7, temp); + shaders_ft.env_frag_set(7, temp); vec4_mult_scalar(ibl_specular, luce_coef, temp); - shader_env_vert_set_ptr(&shaders_ft, 8, &temp); - shader_env_frag_set_ptr(&shaders_ft, 8, &temp); + shaders_ft.env_vert_set(8, temp); + shaders_ft.env_frag_set(8, temp); vec4_mult(specular, ibl_back, temp); vec4_mult_scalar(temp, spec_coef, temp); - shader_env_vert_set_ptr(&shaders_ft, 9, &temp); - shader_env_frag_set_ptr(&shaders_ft, 9, &temp); + shaders_ft.env_vert_set(9, temp); + shaders_ft.env_frag_set(9, temp); light_get_position_vec4(&set->lights[LIGHT_STAGE], &position); light_get_direction_from_position(&position, &set->lights[LIGHT_STAGE], false); @@ -306,30 +310,30 @@ void light_set_data_set(light_set* set, face* face, light_set_id id) { light_get_diffuse(&set->lights[LIGHT_STAGE], &diffuse); light_get_specular(&set->lights[LIGHT_STAGE], &specular); - shader_env_vert_set_ptr(&shaders_ft, 10, &position); - shader_env_frag_set_ptr(&shaders_ft, 14, &position); + shaders_ft.env_vert_set(10, position); + shaders_ft.env_frag_set(14, position); vec4_mult(diffuse, ibl_specular, temp); - shader_env_vert_set_ptr(&shaders_ft, 11, &temp); - shader_env_frag_set_ptr(&shaders_ft, 16, &temp); + shaders_ft.env_vert_set(11, temp); + shaders_ft.env_frag_set(16, temp); vec4_mult(specular, ibl_specular, temp); vec4_mult_scalar(temp, spec_coef, temp); - shader_env_vert_set_ptr(&shaders_ft, 12, &temp); - shader_env_frag_set_ptr(&shaders_ft, 17, &temp); + shaders_ft.env_vert_set(12, temp); + shaders_ft.env_frag_set(17, temp); mat4 irradiance_r; mat4 irradiance_g; mat4 irradiance_b; light_set_get_irradiance(set, &irradiance_r, &irradiance_g, &irradiance_b); - shader_state_matrix_set_program(&shaders_ft, 0, &irradiance_r); - shader_state_matrix_set_program(&shaders_ft, 1, &irradiance_g); - shader_state_matrix_set_program(&shaders_ft, 2, &irradiance_b); + shaders_ft.state_matrix_set_program(0, irradiance_r); + shaders_ft.state_matrix_set_program(1, irradiance_g); + shaders_ft.state_matrix_set_program(2, irradiance_b); float_t offset = face_get_offset(face); float_t v28 = (float_t)(1.0 - exp(offset * -0.44999999)) * 2.0f; offset = max(offset, 0.0f); - shader_env_vert_set(&shaders_ft, 0x11, v28 * 0.1f, offset * 0.06f, 1.0, 1.0); + shaders_ft.env_vert_set(0x11, v28 * 0.1f, offset * 0.06f, 1.0, 1.0); if (light_get_type(&set->lights[LIGHT_CHARA_COLOR]) == LIGHT_PARALLEL) { light_get_ambient(&set->lights[LIGHT_CHARA_COLOR], &ambient); @@ -337,14 +341,14 @@ void light_set_data_set(light_set* set, face* face, light_set_id id) { light_get_specular(&set->lights[LIGHT_CHARA_COLOR], &specular); if (specular.w > 1.0) specular.w = 1.0; - shader_env_frag_set_ptr(&shaders_ft, 33, &ambient); - shader_env_frag_set_ptr(&shaders_ft, 34, &diffuse); - shader_env_frag_set_ptr(&shaders_ft, 35, &specular); + shaders_ft.env_frag_set(33, ambient); + shaders_ft.env_frag_set(34, diffuse); + shaders_ft.env_frag_set(35, specular); } else { - shader_env_frag_set_ptr(&shaders_ft, 33, &vec4_null); - shader_env_frag_set_ptr(&shaders_ft, 34, &vec4_null); - shader_env_frag_set_ptr(&shaders_ft, 35, &vec4_null); + shaders_ft.env_frag_set(33, vec4_null); + shaders_ft.env_frag_set(34, vec4_null); + shaders_ft.env_frag_set(35, vec4_null); } if (light_get_type(&set->lights[LIGHT_TONE_CURVE]) == LIGHT_PARALLEL) { @@ -362,19 +366,19 @@ void light_set_data_set(light_set* set, face* face, light_set_id id) { else tone_curve.y = 0.0f; - shader_env_frag_set_ptr(&shaders_ft, 36, &position); - shader_env_frag_set_ptr(&shaders_ft, 37, &ambient); - shader_env_frag_set_ptr(&shaders_ft, 38, &diffuse); - shader_env_frag_set_ptr(&shaders_ft, 39, &specular); - shader_env_frag_set(&shaders_ft, 40, tone_curve.x, tone_curve.y, tone_curve.z, 0.0f); + shaders_ft.env_frag_set(36, position); + shaders_ft.env_frag_set(37, ambient); + shaders_ft.env_frag_set(38, diffuse); + shaders_ft.env_frag_set(39, specular); + shaders_ft.env_frag_set(40, tone_curve.x, tone_curve.y, tone_curve.z, 0.0f); } else { uniform_value[U_TONE_CURVE] = 0; - shader_env_frag_set(&shaders_ft, 36, 0.0f, 1.0f, 0.0f, 0.0f); - shader_env_frag_set(&shaders_ft, 37, 0.0f, 0.0f, 0.0f, 0.0f); - shader_env_frag_set(&shaders_ft, 38, 0.0f, 0.0f, 0.0f, 0.0f); - shader_env_frag_set(&shaders_ft, 39, 0.0f, 0.0f, 0.0f, 0.0f); - shader_env_frag_set(&shaders_ft, 40, 0.0f, 0.0f, 0.0f, 0.0f); + shaders_ft.env_frag_set(36, 0.0f, 1.0f, 0.0f, 0.0f); + shaders_ft.env_frag_set(37, 0.0f, 0.0f, 0.0f, 0.0f); + shaders_ft.env_frag_set(38, 0.0f, 0.0f, 0.0f, 0.0f); + shaders_ft.env_frag_set(39, 0.0f, 0.0f, 0.0f, 0.0f); + shaders_ft.env_frag_set(40, 0.0f, 0.0f, 0.0f, 0.0f); } light_get_position_vec4(&set->lights[LIGHT_CHARA], &position); @@ -387,8 +391,8 @@ void light_set_data_set(light_set* set, face* face, light_set_id id) { vec3_mult_scalar(*(vec3*)&position, 1.0f / length, *(vec3*)&position); } - shader_env_vert_set(&shaders_ft, 15, position.x, position.y, position.z, 1.0f); - shader_env_vert_set(&shaders_ft, 16, -position.x, -position.y, -position.z, 1.0f); + shaders_ft.env_vert_set(15, position.x, position.y, position.z, 1.0f); + shaders_ft.env_vert_set(16, -position.x, -position.y, -position.z, 1.0f); if (light_get_type(&set->lights[LIGHT_REFLECT]) == LIGHT_SPOT) { vec4 spot_direction; @@ -399,16 +403,16 @@ void light_set_data_set(light_set* set, face* face, light_set_id id) { vec3_dot(*(vec3*)&position, *(vec3*)&spot_direction, spot_direction.w); spot_direction.w = -spot_direction.w; - shader_env_vert_set_ptr(&shaders_ft, 28, &spot_direction); - shader_env_frag_set_ptr(&shaders_ft, 22, &spot_direction); + shaders_ft.env_vert_set(28, spot_direction); + shaders_ft.env_frag_set(22, spot_direction); } else if (light_get_type(&set->lights[LIGHT_REFLECT]) == LIGHT_POINT) { - shader_env_vert_set(&shaders_ft, 28, 0.0f, -1.0f, 0.0f, 9999.0f); - shader_env_frag_set(&shaders_ft, 22, 0.0f, -1.0f, 0.0f, 9999.0f); + shaders_ft.env_vert_set(28, 0.0f, -1.0f, 0.0f, 9999.0f); + shaders_ft.env_frag_set(22, 0.0f, -1.0f, 0.0f, 9999.0f); } else { - shader_env_vert_set(&shaders_ft, 28, 0.0f, -1.0f, 0.0f, 0.0f); - shader_env_frag_set(&shaders_ft, 22, 0.0f, -1.0f, 0.0f, 0.0f); + shaders_ft.env_vert_set(28, 0.0f, -1.0f, 0.0f, 0.0f); + shaders_ft.env_frag_set(22, 0.0f, -1.0f, 0.0f, 0.0f); } mat4 v63 = mat4_identity; @@ -446,10 +450,10 @@ void light_set_data_set(light_set* set, face* face, light_set_id id) { } mat4_transpose(&v63, &v63); - shader_env_frag_set_ptr(&shaders_ft, 26, &v63.row0); - shader_env_frag_set_ptr(&shaders_ft, 27, &v63.row1); - shader_env_frag_set_ptr(&shaders_ft, 28, &v63.row2); - shader_env_frag_set_ptr(&shaders_ft, 42, &npr_spec_color); + shaders_ft.env_frag_set(26, v63.row0); + shaders_ft.env_frag_set(27, v63.row1); + shaders_ft.env_frag_set(28, v63.row2); + shaders_ft.env_frag_set(42, npr_spec_color); } static void light_get_direction_from_position(vec4* pos_dir, light_data* light, bool force) { diff --git a/src/CRE/light_param/light.h b/src/CRE/light_param/light.hpp similarity index 96% rename from src/CRE/light_param/light.h rename to src/CRE/light_param/light.hpp index 6597025e..d6bd3064 100644 --- a/src/CRE/light_param/light.h +++ b/src/CRE/light_param/light.hpp @@ -5,11 +5,11 @@ #pragma once -#include "../../KKdLib/default.h" +#include "../../KKdLib/default.hpp" #include "../../KKdLib/light_param/light.hpp" -#include "../../KKdLib/vec.h" +#include "../../KKdLib/vec.hpp" #include "../static_var.h" -#include "face.h" +#include "face.hpp" struct light_data { light_type type; @@ -28,6 +28,8 @@ struct light_data { vec4u ibl_direction; vec3 tone_curve; bool clip_plane[4]; + + light_data(); }; struct light_set { @@ -36,9 +38,9 @@ struct light_set { mat4u irradiance_r; mat4u irradiance_g; mat4u irradiance_b; -}; -extern void light_set_init(light_set* set); + light_set(); +}; extern light_type light_get_type(light_data* light); extern void light_set_type(light_data* light, light_type value); extern void light_get_ambient(light_data* light, vec4* value); diff --git a/src/CRE/light_param/wind.hpp b/src/CRE/light_param/wind.hpp index 1828be18..63675a17 100644 --- a/src/CRE/light_param/wind.hpp +++ b/src/CRE/light_param/wind.hpp @@ -5,9 +5,9 @@ #pragma once -#include "../../KKdLib/default.h" +#include "../../KKdLib/default.hpp" #include "../../KKdLib/light_param/wind.hpp" -#include "../../KKdLib/vec.h" +#include "../../KKdLib/vec.hpp" #include "../static_var.h" #include "../task.hpp" @@ -46,7 +46,7 @@ struct wind { void reset(); }; -class TaskWind : public Task { +class TaskWind : public app::Task { public: wind* ptr; diff --git a/src/CRE/lock.h b/src/CRE/lock.h index 643e070e..e36dd723 100644 --- a/src/CRE/lock.h +++ b/src/CRE/lock.h @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" struct lock { CRITICAL_SECTION cs; diff --git a/src/CRE/object.cpp b/src/CRE/object.cpp index e051cd0c..28df8f19 100644 --- a/src/CRE/object.cpp +++ b/src/CRE/object.cpp @@ -11,7 +11,7 @@ #include "gl_state.h" #include "shader_ft.h" #include "../KKdLib/hash.hpp" -#include "../KKdLib/str_utils.h" +#include "../KKdLib/str_utils.hpp" struct material_change_handler { int32_t load_count; @@ -29,8 +29,8 @@ 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); static bool obj_set_handler_index_buffer_load(obj_set_handler* handler); static void obj_set_handler_index_buffer_free(obj_set_handler* handler); -static bool obj_set_handler_load_textures(obj_set_handler* handler, void* data, bool big_endian); -static bool obj_set_handler_load_textures_modern(obj_set_handler* handler, void* data, size_t size); +static bool obj_set_handler_load_textures(obj_set_handler* handler, const void* data, bool big_endian); +static bool obj_set_handler_load_textures_modern(obj_set_handler* handler, const void* data, size_t size); static bool obj_set_handler_vertex_buffer_load(obj_set_handler* handler); static void obj_set_handler_vertex_buffer_free(obj_set_handler* handler); static void obj_skin_block_constraint_attach_point_load( @@ -702,7 +702,7 @@ int32_t object_storage_load_set_hash(void* data, uint32_t hash) { return 1; std::string file; - if (!((data_struct*)data)->get_file("root+/objset/", hash, ".farc", &file)) + if (!((data_struct*)data)->get_file("root+/objset/", hash, ".farc", file)) return 1; obj_set_handler* handler = object_storage_get_obj_set_handler(hash); @@ -735,7 +735,7 @@ bool object_storage_load_obj_set_check_not_read(uint32_t set_id, if (!handler->modern) { if (!handler->obj_loaded && !handler->obj_file_handler.check_not_ready()) { - void* data = handler->obj_file_handler.get_data(); + const void* data = handler->obj_file_handler.get_data(); size_t size = handler->obj_file_handler.get_size(); if (!data || !size) return false; @@ -775,7 +775,7 @@ bool object_storage_load_obj_set_check_not_read(uint32_t set_id, } } else if (!handler->obj_loaded && !handler->farc_file_handler.check_not_ready()) { - void* data = handler->farc_file_handler.get_data(); + const void* data = handler->farc_file_handler.get_data(); size_t size = handler->farc_file_handler.get_size(); if (!data || !size) return false; @@ -1212,7 +1212,7 @@ static void obj_set_handler_get_shader_index_texture_index(obj_set_handler* hand obj_material* material = &material_data->material; if (*(int32_t*)&material->shader.name[4] != 0xDEADFF) { - material->shader.index = shader_get_index_by_name(&shaders_ft, material->shader.name); + material->shader.index = shaders_ft.get_index_by_name(material->shader.name); *(int32_t*)&material->shader.name[4] = 0xDEADFF; } @@ -1280,7 +1280,7 @@ static int32_t obj_set_tex_id_data_sort(void const* src1, void const* src2) { return p1->first - p2->first; } -static bool obj_set_handler_load_textures(obj_set_handler* handler, void* data, bool big_endian) { +static bool obj_set_handler_load_textures(obj_set_handler* handler, const void* data, bool big_endian) { obj_set* set = handler->obj_set; if (!set || !data) return true; @@ -1306,7 +1306,7 @@ static bool obj_set_handler_load_textures(obj_set_handler* handler, void* data, return false; } -static bool obj_set_handler_load_textures_modern(obj_set_handler* handler, void* data, size_t size) { +static bool obj_set_handler_load_textures_modern(obj_set_handler* handler, const void* data, size_t size) { obj_set* set = handler->obj_set; if (!set || !data || !size) return true; @@ -1385,19 +1385,19 @@ inline static void obj_skin_block_constraint_up_vector_load( up_vector->roll = up_vector_file->roll; up_vector->affected_axis = up_vector_file->affected_axis; up_vector->point_at = up_vector_file->point_at; - string_copy(&up_vector_file->name, &up_vector->name); + up_vector->name = str_utils_copy(up_vector_file->name); } inline static void obj_skin_block_node_load(obj_skin_block_node* node, obj_skin_block_node* node_file) { - string_copy(&node_file->parent_name, &node->parent_name); + node->parent_name = str_utils_copy(node_file->parent_name); node->position = node_file->position; node->rotation = node_file->rotation; node->scale = node_file->scale; } inline static void obj_skin_block_node_free(obj_skin_block_node* node) { - string_free(&node->parent_name); + free(node->parent_name); } inline static size_t obj_vertex_format_get_vertex_size(obj_vertex_format format) { diff --git a/src/CRE/object.hpp b/src/CRE/object.hpp index 28213696..e1f283ff 100644 --- a/src/CRE/object.hpp +++ b/src/CRE/object.hpp @@ -5,13 +5,13 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "../KKdLib/database/object.hpp" #include "../KKdLib/database/texture.hpp" -#include "../KKdLib/mat.h" +#include "../KKdLib/mat.hpp" #include "../KKdLib/obj.hpp" #include "../KKdLib/txp.hpp" -#include "../KKdLib/vec.h" +#include "../KKdLib/vec.hpp" #include "file_handler.hpp" #include "static_var.h" #include "texture.hpp" diff --git a/src/CRE/post_process.cpp b/src/CRE/post_process.cpp index b9799e54..744ae52f 100644 --- a/src/CRE/post_process.cpp +++ b/src/CRE/post_process.cpp @@ -19,6 +19,27 @@ lens_flare_count(), lens_flare_pos(), lens_shaft_scale(), lens_shaft_inv_scale() lens_flare_power(), field_A10(), lens_flare_appear_power(), render_width(), render_height(), view_point(), interest(), view_point_prev(), interest_prev(), reset_exposure(), sprite_width(), sprite_height(), screen_x_offset(), screen_y_offset(), screen_width(), screen_height(), mag_filter() { + static const char* query_vert_shader = + "#version 430 core\n" + "layout(location = 0) in vec4 a_position;\n" + "\n" + "uniform mat4 mat;\n" + "uniform float scale;\n" + "\n" + "void main() {\n" + " vec4 pos = a_position;\n" + " pos.xy *= scale;\n" + " gl_Position = mat * pos;\n" + "}\n"; + + static const char* query_frag_shader = + "#version 430 core\n" + "layout(location = 0) out vec4 result;\n" + "\n" + "void main() {\n" + " result = vec4(0.0); \n" + "}\n"; + static const char* alpha_layer_vert_shader = "#version 430 core\n" "out VertexData {\n" @@ -52,11 +73,11 @@ sprite_height(), screen_x_offset(), screen_y_offset(), screen_width(), screen_he " result = mix(cb, cl, g_opacity.x);\n" "}\n"; - aa = post_process_aa_init(); - blur = post_process_blur_init(); + aa = new post_process_aa(); + blur = new post_process_blur(); dof = new post_process_dof(); - exposure = post_process_exposure_init(); - tone_map = post_process_tone_map_init(); + exposure = new post_process_exposure(); + tone_map = new post_process_tone_map(); stage_index = -1; stage_index_prev = -1; @@ -70,8 +91,34 @@ sprite_height(), screen_x_offset(), screen_y_offset(), screen_width(), screen_he glSamplerParameteri(samplers[1], GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glSamplerParameteri(samplers[1], GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - shader_glsl_param param; - memset(¶m, 0, sizeof(shader_glsl_param)); + const float_t verts_quad[] = { + -1.0f, 1.0f, 0.15f, 0.85f, + -1.0f, -1.0f, 0.15f, 0.15f, + 1.0f, -1.0f, 0.85f, 0.15f, + 1.0f, 1.0f, 0.85f, 0.85f, + }; + + glGenVertexArrays(1, &query_vao); + glGenBuffers(1, &query_vbo); + glBindBuffer(GL_ARRAY_BUFFER, query_vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(verts_quad), verts_quad, GL_STATIC_DRAW); + + gl_state_bind_vertex_array(query_vao); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 16, (void*)0); // Pos + glVertexAttrib4f(3, 1.0f, 1.0f, 1.0f, 1.0f); // Color0 + glVertexAttrib4f(4, 1.0f, 1.0f, 1.0f, 1.0f); // Color1 + glEnableVertexAttribArray(8); + glVertexAttribPointer(8, 2, GL_FLOAT, GL_FALSE, 16, (void*)8); // TexCoord0 + gl_state_bind_vertex_array(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + shader_glsl_param param = {}; + param.name = "Exposure Chara"; + query_shader.load(query_vert_shader, + query_frag_shader, 0, ¶m); + + param = {}; param.name = "Alpha Layer"; alpha_layer_shader.load(alpha_layer_vert_shader, alpha_layer_frag_shader, 0, ¶m); @@ -79,16 +126,31 @@ sprite_height(), screen_x_offset(), screen_y_offset(), screen_width(), screen_he } post_process::~post_process() { - post_process_aa_dispose(aa); - post_process_blur_dispose(blur); + if (aa) { + delete aa; + aa = 0; + } + + if (blur) { + delete blur; + blur = 0; + } if (dof) { delete dof; dof = 0; } - post_process_exposure_dispose(exposure); - post_process_tone_map_dispose(tone_map); + if (exposure) { + delete exposure; + exposure = 0; + } + + if (tone_map) { + delete tone_map; + tone_map = 0; + } + ::render_texture_free(&rend_texture); ::render_texture_free(&buf_texture); ::render_texture_free(&sss_contour_texture); @@ -97,12 +159,24 @@ post_process::~post_process() { ::render_texture_free(&fbo_texture); ::render_texture_free(&alpha_layer_texture); ::render_texture_free(&screen_texture); - alpha_layer_shader.unload(); if (samplers[0]) { glDeleteSamplers(2, samplers); samplers[0] = 0; } + + if (query_vao) { + glDeleteVertexArrays(1, &query_vao); + query_vao = 0; + } + + if (query_vbo) { + glDeleteBuffers(1, &query_vbo); + query_vbo = 0; + } + + query_shader.unload(); + alpha_layer_shader.unload(); } void post_process::apply(camera* cam, texture* light_proj_tex, int32_t npr_param) { @@ -115,19 +189,17 @@ void post_process::apply(camera* cam, texture* light_proj_tex, int32_t npr_param dof->apply(&rend_texture, samplers, cam); - shader_state_matrix_set_mvp_separate(&shaders_ft, - &mat4_identity, &mat4_identity, &mat4_identity); + shaders_ft.state_matrix_set_mvp(mat4_identity, mat4_identity, mat4_identity); - post_process_get_blur(blur, &rend_texture); - post_process_get_exposure(exposure, cam, render_width, render_height, reset_exposure, + blur->get_blur(&rend_texture); + exposure->get_exposure(cam, render_width, render_height, reset_exposure, blur->tex[4].color_texture->tex, blur->tex[2].color_texture->tex); - post_process_apply_tone_map(tone_map, &rend_texture, light_proj_tex, 0, + tone_map->apply(&rend_texture, light_proj_tex, 0, &rend_texture, &buf_texture, &sss_contour_texture, blur->tex[0].color_texture->tex, exposure->exposure.color_texture->tex, npr_param); if (mlaa) - post_process_apply_mlaa(aa, &rend_texture, - &buf_texture, samplers, parent_bone_node); + aa->apply_mlaa(&rend_texture, &buf_texture, samplers, parent_bone_node); for (int32_t i = 0; i < 16; i++) { if (!render_textures_data[i]) @@ -144,7 +216,7 @@ void post_process::apply(camera* cam, texture* light_proj_tex, int32_t npr_param glViewport(0, 0, t->width, t->height); gl_state_active_bind_texture_2d(0, rend_texture.color_texture->tex); gl_state_bind_sampler(0, samplers[0]); - shader_set(&shaders_ft, SHADER_FT_REDUCE); + shaders_ft.set(SHADER_FT_REDUCE); render_texture_draw_params(&shaders_ft, render_width, render_height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } @@ -160,7 +232,7 @@ void post_process::apply(camera* cam, texture* light_proj_tex, int32_t npr_param gl_state_bind_sampler(0, samplers[0]); uniform_value[U01] = parent_bone_node ? 1 : 0; uniform_value[U_REDUCE] = 0; - shader_set(&shaders_ft, SHADER_FT_REDUCE); + shaders_ft.set(SHADER_FT_REDUCE); render_texture_draw_params(&shaders_ft, render_width, render_height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); uniform_value[U01] = 0; @@ -186,11 +258,11 @@ void post_process::apply(camera* cam, texture* light_proj_tex, int32_t npr_param break; } - shader_set(&shaders_ft, SHADER_FT_MAGNIFY); + shaders_ft.set(SHADER_FT_MAGNIFY); render_texture_draw_params(&shaders_ft, render_width, render_height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } - shader_unbind(); + shader::unbind(); for (int32_t i = 0; i < 8; i++) gl_state_bind_sampler(i, 0); @@ -234,6 +306,16 @@ void post_process::ctrl(camera* cam) { reset_exposure = true; } +void post_process::draw_query_samples(GLuint query, float_t scale, mat4& mat) { + glBeginQuery(GL_SAMPLES_PASSED, query); + gl_state_bind_vertex_array(query_vao); + query_shader.set("mat", false, mat); + query_shader.set("scale", scale); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + gl_state_bind_vertex_array(0); + glEndQuery(GL_SAMPLES_PASSED); +} + void post_process::init_fbo(int32_t render_width, int32_t render_height, int32_t sprite_width, int32_t sprite_height, int32_t screen_width, int32_t screen_height) { if (this->render_width == render_width && this->render_height == render_height @@ -241,11 +323,11 @@ void post_process::init_fbo(int32_t render_width, int32_t render_height, return; if (this->render_width != render_width || this->render_height != render_height) { - post_process_aa_init_fbo(aa, render_width, render_height); - post_process_blur_init_fbo(blur, render_width, render_height); + aa->init_fbo(render_width, render_height); + blur->init_fbo(render_width, render_height); dof->init_fbo(render_width, render_height); - post_process_exposure_init_fbo(exposure); - post_process_tone_map_init_fbo(tone_map); + exposure->init_fbo(); + tone_map->init_fbo(); render_texture_init(&rend_texture, render_width, render_height, 0, GL_RGBA16F, GL_DEPTH24_STENCIL8); render_texture_init(&buf_texture, render_width, @@ -350,13 +432,13 @@ void post_process::reset() { mlaa = true; mag_filter = POST_PROCESS_MAG_FILTER_BILINEAR; dof->initialize_data(0, 0); - vec3 radius = { 2.0f, 2.0f, 2.0f }; - vec3 intensity = { 1.0f, 1.0f, 1.0f }; - post_process_blur_initialize_data(blur, &radius, &intensity); - vec3 scene_fade_color = { 1.0f, 1.0f, 1.0f }; - vec3 tone_trans_start = { 0.0f, 0.0f, 0.0f }; - vec3 tone_trans_end = { 1.0f, 1.0f, 1.0f }; - post_process_tone_map_initialize_data(tone_map, 2.0f, true, 1.0f, 1, 1.0f, - &scene_fade_color, 0.0f, 0, &tone_trans_start, &tone_trans_end, TONE_MAP_YCC_EXPONENT); + const vec3 radius = { 2.0f, 2.0f, 2.0f }; + const vec3 intensity = { 1.0f, 1.0f, 1.0f }; + blur->initialize_data(radius, intensity); + const vec3 scene_fade_color = { 1.0f, 1.0f, 1.0f }; + const vec3 tone_trans_start = { 0.0f, 0.0f, 0.0f }; + const vec3 tone_trans_end = { 1.0f, 1.0f, 1.0f }; + tone_map->initialize_data(2.0f, true, 1.0f, 1, 1.0f, scene_fade_color, 0.0f, + 0, tone_trans_start, tone_trans_end, TONE_MAP_YCC_EXPONENT); reset_exposure = true; } diff --git a/src/CRE/post_process.hpp b/src/CRE/post_process.hpp index 9eb721f7..125cb360 100644 --- a/src/CRE/post_process.hpp +++ b/src/CRE/post_process.hpp @@ -5,13 +5,13 @@ #pragma once -#include "../KKdLib/default.h" -#include "../KKdLib/vec.h" -#include "post_process/aa.h" -#include "post_process/blur.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/vec.hpp" +#include "post_process/aa.hpp" +#include "post_process/blur.hpp" #include "post_process/dof.hpp" -#include "post_process/exposure.h" -#include "post_process/tone_map.h" +#include "post_process/exposure.hpp" +#include "post_process/tone_map.hpp" #include "camera.h" enum post_process_mag_filter_type { @@ -46,6 +46,9 @@ struct post_process { post_process_exposure* exposure; post_process_tone_map* tone_map; GLuint samplers[2]; + shader_glsl query_shader; + GLuint query_vao; + GLuint query_vbo; shader_glsl alpha_layer_shader; GLuint lens_flare_texture; GLuint lens_shaft_texture; @@ -79,6 +82,7 @@ struct post_process { void apply(camera* cam, texture* light_proj_tex, int32_t npr_param); void ctrl(camera* cam); + void draw_query_samples(GLuint query, float_t scale, mat4& mat); void init_fbo(int32_t render_width, int32_t render_height, int32_t sprite_width, int32_t sprite_height, int32_t screen_width, int32_t screen_height); int32_t movie_texture_set(texture* movie_texture); diff --git a/src/CRE/post_process/aa.c b/src/CRE/post_process/aa.cpp similarity index 80% rename from src/CRE/post_process/aa.c rename to src/CRE/post_process/aa.cpp index e45231d6..aea83c8b 100644 --- a/src/CRE/post_process/aa.c +++ b/src/CRE/post_process/aa.cpp @@ -3,52 +3,67 @@ GitHub/GitLab: korenkonder */ -#include "aa.h" +#include "aa.hpp" #include "../fbo.hpp" #include "../gl_state.h" #include "../post_process.hpp" #include "../shader_ft.h" -static void post_process_aa_free_fbo(post_process_aa* exp); -static void post_process_aa_generate_area_texture(post_process_aa* aa); static void post_process_aa_calculate_area_texture_data(uint8_t* a1, int32_t a2, int32_t a3); static void post_process_aa_calculate_area_texture_data_sub(float_t* a1, float_t* a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6); static float_t post_process_aa_calculate_area_texture_data_sub_sub(int32_t a1, int32_t a2); -post_process_aa* post_process_aa_init() { - post_process_aa* aa = force_malloc_s(post_process_aa, 1); - post_process_aa_generate_area_texture(aa); - return aa; + +post_process_aa::post_process_aa() : width(), height(), mlaa_area_texture() { + uint8_t pixels[35 * 35 * 2]; + for (int32_t i = 0; i < 5; i++) + for (int32_t j = 0; j < 5; j++) + post_process_aa_calculate_area_texture_data(pixels, j, i); + + glGenTextures(1, &mlaa_area_texture); + gl_state_bind_texture_2d(mlaa_area_texture); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, 35, 35, 0, GL_RG, GL_UNSIGNED_BYTE, pixels); + gl_state_bind_texture_2d(0); } -void post_process_apply_mlaa(post_process_aa* aa, render_texture* rt, +post_process_aa::~post_process_aa() { + if (!this) + return; + + render_texture_free(&mlaa_buffer[0]); + render_texture_free(&mlaa_buffer[1]); + glDeleteTextures(1, &mlaa_area_texture); +} + +void post_process_aa::apply_mlaa(render_texture* rt, render_texture* buf_rt, GLuint* samplers, int32_t a4) { - render_texture_bind(aa->mlaa_buffer, 0); + render_texture_bind(mlaa_buffer, 0); gl_state_active_bind_texture_2d(0, rt->color_texture->tex); gl_state_bind_sampler(0, samplers[1]); uniform_value[U_MLAA] = 0; - shader_set(&shaders_ft, SHADER_FT_MLAA); - render_texture_draw_params(&shaders_ft, aa->width, aa->height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + shaders_ft.set(SHADER_FT_MLAA); + render_texture_draw_params(&shaders_ft, width, height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - render_texture_bind(&aa->mlaa_buffer[1], 0); - gl_state_active_bind_texture_2d(0, aa->mlaa_buffer[0].color_texture->tex); - gl_state_active_bind_texture_2d(1, aa->mlaa_area_texture); + render_texture_bind(&mlaa_buffer[1], 0); + gl_state_active_bind_texture_2d(0, mlaa_buffer[0].color_texture->tex); + gl_state_active_bind_texture_2d(1, mlaa_area_texture); gl_state_bind_sampler(0, samplers[0]); gl_state_bind_sampler(1, samplers[1]); uniform_value[U20] = 2; uniform_value[U_MLAA] = 1; - shader_set(&shaders_ft, SHADER_FT_MLAA); - render_texture_draw_params(&shaders_ft, aa->width, aa->height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + shaders_ft.set(SHADER_FT_MLAA); + render_texture_draw_params(&shaders_ft, width, height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); render_texture_bind(buf_rt, 0); gl_state_active_bind_texture_2d(0, rt->color_texture->tex); - gl_state_active_bind_texture_2d(1, aa->mlaa_buffer[1].color_texture->tex); + gl_state_active_bind_texture_2d(1, mlaa_buffer[1].color_texture->tex); gl_state_bind_sampler(0, samplers[1]); uniform_value[U_MLAA] = 2; uniform_value[U01] = a4 ? 1 : 0; - shader_set(&shaders_ft, SHADER_FT_MLAA); - render_texture_draw_params(&shaders_ft, aa->width, aa->height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + shaders_ft.set(SHADER_FT_MLAA); + render_texture_draw_params(&shaders_ft, width, height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); uniform_value[U01] = 0; gl_state_active_bind_texture_2d(0, 0); gl_state_active_bind_texture_2d(1, 0); @@ -58,43 +73,15 @@ void post_process_apply_mlaa(post_process_aa* aa, render_texture* rt, 0, 0, rt->color_texture->width, rt->color_texture->height, GL_COLOR_BUFFER_BIT, GL_LINEAR); } -void post_process_aa_init_fbo(post_process_aa* aa, - int32_t width, int32_t height) { - if (!aa || (aa->width == width && aa->height == height)) +void post_process_aa::init_fbo(int32_t width, int32_t height) { + if (!this || (this->width == width && this->height == height)) return; - aa->width = width > 1 ? width : 1; - aa->height = height > 1 ? height : 1; + this->width = width > 1 ? width : 1; + this->height = height > 1 ? height : 1; - render_texture_init(&aa->mlaa_buffer[0], aa->width, aa->height, 0, GL_RGBA8, 0); - render_texture_init(&aa->mlaa_buffer[1], aa->width, aa->height, 0, GL_RGBA8, 0); -} - -void post_process_aa_dispose(post_process_aa* exp) { - if (!exp) - return; - - post_process_aa_free_fbo(exp); - free(exp); -} - -static void post_process_aa_free_fbo(post_process_aa* aa) { - render_texture_free(&aa->mlaa_buffer[0]); - render_texture_free(&aa->mlaa_buffer[1]); - glDeleteTextures(1, &aa->mlaa_area_texture); -} - -static void post_process_aa_generate_area_texture(post_process_aa* aa) { - uint8_t pixels[35 * 35 * 2]; - for (int32_t i = 0; i < 5; i++) - for (int32_t j = 0; j < 5; j++) - post_process_aa_calculate_area_texture_data(pixels, j, i); - - glGenTextures(1, &aa->mlaa_area_texture); - gl_state_bind_texture_2d(aa->mlaa_area_texture); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, 35, 35, 0, GL_RG, GL_UNSIGNED_BYTE, pixels); - gl_state_bind_texture_2d(0); + render_texture_init(&mlaa_buffer[0], this->width, this->height, 0, GL_RGBA8, 0); + render_texture_init(&mlaa_buffer[1], this->width, this->height, 0, GL_RGBA8, 0); } static void post_process_aa_calculate_area_texture_data(uint8_t* a1, int32_t a2, int32_t a3) { diff --git a/src/CRE/post_process/aa.h b/src/CRE/post_process/aa.h deleted file mode 100644 index ad36497e..00000000 --- a/src/CRE/post_process/aa.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "../../KKdLib/default.h" -#include "../../KKdLib/vec.h" -#include "../shared.h" -#include "../render_texture.h" - -struct post_process_aa { - int32_t width; - int32_t height; - render_texture mlaa_buffer[2]; - GLuint mlaa_area_texture; -}; - -extern post_process_aa* post_process_aa_init(); -extern void post_process_apply_mlaa(post_process_aa* aa, render_texture* rt, - render_texture* buf_rt, GLuint* samplers, int32_t a4); -extern void post_process_aa_init_fbo(post_process_aa* aa, int32_t width, int32_t height); -extern void post_process_aa_dispose(post_process_aa* aa); diff --git a/src/CRE/post_process/aa.hpp b/src/CRE/post_process/aa.hpp new file mode 100644 index 00000000..a677495d --- /dev/null +++ b/src/CRE/post_process/aa.hpp @@ -0,0 +1,25 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../../KKdLib/default.hpp" +#include "../../KKdLib/vec.hpp" +#include "../shared.h" +#include "../render_texture.h" + +struct post_process_aa { + int32_t width; + int32_t height; + render_texture mlaa_buffer[2]; + GLuint mlaa_area_texture; + + post_process_aa(); + virtual ~post_process_aa(); + + void apply_mlaa(render_texture* rt, + render_texture* buf_rt, GLuint* samplers, int32_t a4); + void init_fbo(int32_t width, int32_t height); +}; diff --git a/src/CRE/post_process/blur.c b/src/CRE/post_process/blur.c deleted file mode 100644 index 4adf3426..00000000 --- a/src/CRE/post_process/blur.c +++ /dev/null @@ -1,337 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "blur.h" -#include "../fbo.hpp" -#include "../gl_state.h" -#include "../post_process.hpp" -#include "../shader_ft.h" - -static void post_process_blur_free_fbo(post_process_blur* blur); -static void post_process_blur_radius_calculate(post_process_blur* blur); -static void post_process_blur_radius_calculate_gaussian_kernel(float_t* gaussian_kernel, - float_t radius, int32_t stride, int32_t offset); - -post_process_blur* post_process_blur_init() { - post_process_blur* blur = force_malloc_s(post_process_blur, 1); - return blur; -} - -void post_process_get_blur(post_process_blur* blur, render_texture* rt) { - if (!blur) - return; - - uniform_value[U01] = 0; - - int32_t i = 0; - if (blur->count_down > 0) { - uniform_value[U_REDUCE] = 1; - render_texture_shader_set(&shaders_ft, SHADER_FT_REDUCE); - for (; i < blur->count_down; i++) { - glViewport(0, 0, blur->width_down[i], blur->height_down[i]); - render_texture_bind(&blur->tex_down[i], 0); - gl_state_active_bind_texture_2d(0, i - ? blur->tex_down[i - 1].color_texture->tex - : rt->color_texture->tex); - render_texture_draw_params(&shaders_ft, - blur->width_down[i], blur->height_down[i], 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - } - i--; - } - - uniform_value[U_REDUCE] = 3; - render_texture_shader_set(&shaders_ft, SHADER_FT_REDUCE); - shader_local_frag_set(&shaders_ft, 2, 1.1f, 1.1f, 1.1f, 0.0f); - - glViewport(0, 0, 256, 144); - render_texture_bind(&blur->tex[0], 0); - gl_state_active_bind_texture_2d(0, blur->count_down > 0 - ? blur->tex_down[i].color_texture->tex - : rt->color_texture->tex); - render_texture_draw_params(&shaders_ft, blur->width, blur->height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - - uniform_value[U_GAUSS] = 1; - render_texture_shader_set(&shaders_ft, SHADER_FT_GAUSS); - - glViewport(0, 0, 256, 144); - render_texture_bind(&blur->tex[5], 0); - gl_state_active_bind_texture_2d(0, blur->tex[0].color_texture->tex); - render_texture_draw_params(&shaders_ft, 256, 144, - 1.0f, blur->data.intensity.x * 0.5f, blur->data.intensity.y * 0.5f, blur->data.intensity.z * 0.5f, 1.0f); - - uniform_value[U_REDUCE] = 1; - render_texture_shader_set(&shaders_ft, SHADER_FT_REDUCE); - - glViewport(0, 0, 128, 72); - render_texture_bind(&blur->tex[1], 0); - gl_state_active_bind_texture_2d(0, blur->tex[0].color_texture->tex); - render_texture_draw_params(&shaders_ft, 256, 144, 0.75f, 1.0f, 1.0f, 1.0f, 1.0f); - - uniform_value[U_REDUCE] = 1; - render_texture_shader_set(&shaders_ft, SHADER_FT_REDUCE); - - glViewport(0, 0, 64, 36); - render_texture_bind(&blur->tex[2], 0); - gl_state_active_bind_texture_2d(0, blur->tex[1].color_texture->tex); - render_texture_draw_params(&shaders_ft, 128, 72, 0.75f, 1.0f, 1.0f, 1.0f, 1.0f); - - uniform_value[U_REDUCE] = 1; - render_texture_shader_set(&shaders_ft, SHADER_FT_REDUCE); - - glViewport(0, 0, 32, 18); - render_texture_bind(&blur->tex[3], 0); - gl_state_active_bind_texture_2d(0, blur->tex[2].color_texture->tex); - render_texture_draw_params(&shaders_ft, 64, 36, 0.75f, 1.0f, 1.0f, 1.0f, 1.0f); - - uniform_value[U_EXPOSURE] = 0; - render_texture_shader_set(&shaders_ft, SHADER_FT_EXPOSURE); - - glViewport(0, 0, 8, 8); - render_texture_bind(&blur->tex[4], 0); - gl_state_active_bind_texture_2d(0, blur->tex[3].color_texture->tex); - render_texture_draw_params(&shaders_ft, 32, 18, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - - vec3 intensity = blur->data.intensity; - vec3* gauss = blur->data.gauss; - - vec3 v[POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE]; - for (int32_t i = 0; i < POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE; i++) - vec3_mult(gauss[i], intensity, v[i]); - - uniform_value[U_GAUSS] = 0; - render_texture_shader_set(&shaders_ft, SHADER_FT_GAUSS); - shader_local_frag_set(&shaders_ft, 1, 1.0f, 0.0f, 1.0f, 0.0f); - for (int32_t i = 0; i < POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE; i++) - shader_local_frag_set(&shaders_ft, 4ULL + i, v[i].x, v[i].y, v[i].z, 0.0f); - - glViewport(0, 0, 128, 72); - render_texture_bind(&blur->tex[0], 0); - gl_state_active_bind_texture_2d(0, blur->tex[1].color_texture->tex); - render_texture_draw_params(&shaders_ft, 128, 72, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - fbo::blit(blur->tex[0].fbos[0], blur->tex[1].fbos[0], - 0, 0, 128, 72, - 0, 0, 128, 72, GL_COLOR_BUFFER_BIT, GL_LINEAR); - - glViewport(0, 0, 64, 36); - render_texture_bind(&blur->tex[0], 0); - gl_state_active_bind_texture_2d(0, blur->tex[2].color_texture->tex); - render_texture_draw_params(&shaders_ft, 64, 36, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - fbo::blit(blur->tex[0].fbos[0], blur->tex[2].fbos[0], - 0, 0, 64, 36, - 0, 0, 64, 36, GL_COLOR_BUFFER_BIT, GL_LINEAR); - - glViewport(0, 0, 32, 18); - render_texture_bind(&blur->tex[0], 0); - gl_state_active_bind_texture_2d(0, blur->tex[3].color_texture->tex); - render_texture_draw_params(&shaders_ft, 32, 18, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - fbo::blit(blur->tex[0].fbos[0], blur->tex[3].fbos[0], - 0, 0, 32, 18, - 0, 0, 32, 18, GL_COLOR_BUFFER_BIT, GL_LINEAR); - - shader_local_frag_set(&shaders_ft, 1, 0.0f, 1.0f, 0.0f, 1.0f); - - glViewport(0, 0, 128, 72); - render_texture_bind(&blur->tex[0], 0); - gl_state_active_bind_texture_2d(0, blur->tex[1].color_texture->tex); - render_texture_draw_params(&shaders_ft, 128, 72, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - fbo::blit(blur->tex[0].fbos[0], blur->tex[1].fbos[0], - 0, 0, 128, 72, - 0, 0, 128, 72, GL_COLOR_BUFFER_BIT, GL_LINEAR); - - glViewport(0, 0, 64, 36); - render_texture_bind(&blur->tex[0], 0); - gl_state_active_bind_texture_2d(0, blur->tex[2].color_texture->tex); - render_texture_draw_params(&shaders_ft, 64, 36, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - fbo::blit(blur->tex[0].fbos[0], blur->tex[2].fbos[0], - 0, 0, 64, 36, - 0, 0, 64, 36, GL_COLOR_BUFFER_BIT, GL_LINEAR); - - glViewport(0, 0, 32, 18); - render_texture_bind(&blur->tex[0], 0); - gl_state_active_bind_texture_2d(0, blur->tex[3].color_texture->tex); - render_texture_draw_params(&shaders_ft, 32, 18, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - fbo::blit(blur->tex[0].fbos[0], blur->tex[3].fbos[0], - 0, 0, 32, 18, - 0, 0, 32, 18, GL_COLOR_BUFFER_BIT, GL_LINEAR); - - uniform_value[U_REDUCE] = 7; - render_texture_shader_set(&shaders_ft, SHADER_FT_REDUCE); - - glViewport(0, 0, 256, 144); - render_texture_bind(&blur->tex[0], 0); - gl_state_active_bind_texture_2d(0, blur->tex[5].color_texture->tex); - gl_state_active_bind_texture_2d(1, blur->tex[1].color_texture->tex); - gl_state_active_bind_texture_2d(2, blur->tex[2].color_texture->tex); - gl_state_active_bind_texture_2d(3, blur->tex[3].color_texture->tex); - render_texture_draw_params(&shaders_ft, 32, 18, 0.25f, 0.15f, 0.25f, 0.25f, 0.25f); - -} - -void post_process_blur_init_fbo(post_process_blur* blur, - int32_t width, int32_t height) { - if (!blur || (blur->width == width && blur->height == height)) - return; - - if (!blur->tex[0].color_texture) - render_texture_init(&blur->tex[0], 256, 144, 0, GL_RGBA16F, 0); - if (!blur->tex[1].color_texture) - render_texture_init(&blur->tex[1], 128, 72, 0, GL_RGBA16F, 0); - if (!blur->tex[2].color_texture) - render_texture_init(&blur->tex[2], 64, 36, 0, GL_RGBA16F, 0); - if (!blur->tex[3].color_texture) - render_texture_init(&blur->tex[3], 32, 18, 0, GL_RGBA16F, 0); - if (!blur->tex[4].color_texture) - render_texture_init(&blur->tex[4], 8, 8, 0, GL_R32F, 0); - if (!blur->tex[5].color_texture) - render_texture_init(&blur->tex[5], 256, 144, 0, GL_RGBA16F, 0); - - blur->width = width > 1 ? width : 1; - blur->height = height > 1 ? height : 1; - - int32_t i = 0; - width = blur->width; - height = blur->height; - while (width > 512 && height > 288) { - width /= 2; - height /= 2; - i++; - } - - render_texture* tex_down = blur->tex_down; - int32_t* width_down = blur->width_down; - int32_t* height_down = blur->height_down; - - if (!tex_down) - tex_down = force_malloc_s(render_texture, i); - else if (blur->count_down < i) { - render_texture* temp = force_malloc_s(render_texture, i); - memcpy(temp, tex_down, sizeof(render_texture) * blur->count_down); - free(tex_down); - tex_down = temp; - } - - if (!width_down) - width_down = force_malloc_s(int32_t, i); - else if (blur->count_down < i) { - int32_t* temp = force_malloc_s(int32_t, i); - memcpy(temp, width_down, sizeof(int32_t) * blur->count_down); - free(width_down); - width_down = temp; - } - - if (!height_down) - height_down = force_malloc_s(int32_t, i); - else if (blur->count_down < i) { - int32_t* temp = force_malloc_s(int32_t, i); - memcpy(temp, height_down, sizeof(int32_t) * blur->count_down); - free(height_down); - height_down = temp; - } - - blur->count_down = i; - - i = 0; - width = blur->width; - height = blur->height; - while (width > 512 && height > 288) { - width_down[i] = width /= 2; - height_down[i] = height /= 2; - i++; - } - - for (i = 0; i < blur->count_down; i++) - render_texture_init(&tex_down[i], width_down[i], height_down[i], 0, GL_RGBA16F, 0); - - gl_state_bind_framebuffer(0); - - blur->tex_down = tex_down; - blur->width_down = width_down; - blur->height_down = height_down; -} - -void post_process_blur_dispose(post_process_blur* blur) { - if (!blur) - return; - - post_process_blur_free_fbo(blur); - free(blur); -} - -static void post_process_blur_free_fbo(post_process_blur* blur) { - for (int32_t i = 0; i < blur->count_down; i++) - render_texture_free(&blur->tex_down[i]); - for (int32_t i = 0; i < 6; i++) - render_texture_free(&blur->tex[i]); - free(blur->tex_down); - free(blur->height_down); - free(blur->width_down); -} - -void post_process_blur_initialize_data(post_process_blur* blur, const vec3* radius, const vec3* intensity) { - blur->data.radius.x = clamp(radius->x, 0.0f, 3.0f); - blur->data.radius.y = clamp(radius->y, 0.0f, 3.0f); - blur->data.radius.z = clamp(radius->z, 0.0f, 3.0f); - blur->data.intensity.x = clamp(intensity->x, 0.0f, 2.0f); - blur->data.intensity.y = clamp(intensity->y, 0.0f, 2.0f); - blur->data.intensity.z = clamp(intensity->z, 0.0f, 2.0f); - post_process_blur_radius_calculate(blur); -} - -inline void post_process_blur_get_radius(post_process_blur* blur, vec3* value) { - *value = blur->data.radius; -} - -inline void post_process_blur_set_radius(post_process_blur* blur, const vec3* value) { - vec3 temp; - temp.x = clamp(value->x, 0.0f, 3.0f); - temp.y = clamp(value->y, 0.0f, 3.0f); - temp.z = clamp(value->z, 0.0f, 3.0f); - if (temp.x != blur->data.radius.x || temp.y - != blur->data.radius.y || temp.z != blur->data.radius.z) { - blur->data.radius = temp; - post_process_blur_radius_calculate(blur); - } -} - -inline void post_process_blur_get_intensity(post_process_blur* blur, vec3* value) { - *value = blur->data.intensity; -} - -inline void post_process_blur_set_intensity(post_process_blur* blur, const vec3* value) { - blur->data.intensity.x = clamp(value->x, 0.0f, 2.0f); - blur->data.intensity.y = clamp(value->y, 0.0f, 2.0f); - blur->data.intensity.z = clamp(value->z, 0.0f, 2.0f); -} - -static void post_process_blur_radius_calculate(post_process_blur* blur) { - float_t radius_scale = 0.8f; - vec3 radius = blur->data.radius; - post_process_blur_radius_calculate_gaussian_kernel((float_t*)blur->data.gauss, radius.x * radius_scale, 3, 0); - post_process_blur_radius_calculate_gaussian_kernel((float_t*)blur->data.gauss, radius.y * radius_scale, 3, 1); - post_process_blur_radius_calculate_gaussian_kernel((float_t*)blur->data.gauss, radius.z * radius_scale, 3, 2); -} - -static void post_process_blur_radius_calculate_gaussian_kernel(float_t* gaussian_kernel, - float_t radius, int32_t stride, int32_t offset) { - if (stride < 1) - stride = 1; - if (offset < 0) - offset = 0; - - gaussian_kernel[0 * stride + offset] = 1.0f; - for (int32_t i = 1; i < POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE; i++) - gaussian_kernel[i * stride + offset] = 0.0f; - double_t temp_gaussian_kernel[POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE]; - double_t s = radius; - s = -1.0 / (2.0 * s * s); - double_t sum = 0.5; - temp_gaussian_kernel[0] = 1.0; - for (size_t i = 1; i < POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE; i++) - sum += temp_gaussian_kernel[i] = exp(i * i * s); - - sum = 0.5 / sum; - for (size_t i = 0; i < POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE; i++) - gaussian_kernel[i * stride + offset] = (float_t)(temp_gaussian_kernel[i] * sum); -} diff --git a/src/CRE/post_process/blur.cpp b/src/CRE/post_process/blur.cpp new file mode 100644 index 00000000..4617954c --- /dev/null +++ b/src/CRE/post_process/blur.cpp @@ -0,0 +1,325 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "blur.hpp" +#include "../fbo.hpp" +#include "../gl_state.h" +#include "../post_process.hpp" +#include "../shader_ft.h" + +static void post_process_blur_radius_calculate(post_process_blur* blur); +static void post_process_blur_radius_calculate_gaussian_kernel(float_t* gaussian_kernel, + float_t radius, int32_t stride, int32_t offset); + +post_process_blur::post_process_blur() : data(), +width(), height(), width_down(), height_down(), tex_down(), count_down() { + +} + +post_process_blur:: ~post_process_blur() { + if (!this) + return; + + for (int32_t i = 0; i < count_down; i++) + render_texture_free(&tex_down[i]); + for (int32_t i = 0; i < 6; i++) + render_texture_free(&tex[i]); + free(tex_down); + free(height_down); + free(width_down); +} + +void post_process_blur::get_blur(render_texture* rt) { + uniform_value[U01] = 0; + + int32_t i = 0; + if (count_down > 0) { + uniform_value[U_REDUCE] = 1; + render_texture_shader_set(&shaders_ft, SHADER_FT_REDUCE); + for (; i < count_down; i++) { + glViewport(0, 0, width_down[i], height_down[i]); + render_texture_bind(&tex_down[i], 0); + gl_state_active_bind_texture_2d(0, i + ? tex_down[i - 1].color_texture->tex + : rt->color_texture->tex); + render_texture_draw_params(&shaders_ft, + width_down[i], height_down[i], 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + } + i--; + } + + uniform_value[U_REDUCE] = 3; + render_texture_shader_set(&shaders_ft, SHADER_FT_REDUCE); + shaders_ft.local_frag_set(2, 1.1f, 1.1f, 1.1f, 0.0f); + + glViewport(0, 0, 256, 144); + render_texture_bind(&tex[0], 0); + gl_state_active_bind_texture_2d(0, count_down > 0 + ? tex_down[i].color_texture->tex + : rt->color_texture->tex); + render_texture_draw_params(&shaders_ft, width, height, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + + uniform_value[U_GAUSS] = 1; + render_texture_shader_set(&shaders_ft, SHADER_FT_GAUSS); + + glViewport(0, 0, 256, 144); + render_texture_bind(&tex[5], 0); + gl_state_active_bind_texture_2d(0, tex[0].color_texture->tex); + render_texture_draw_params(&shaders_ft, 256, 144, + 1.0f, data.intensity.x * 0.5f, data.intensity.y * 0.5f, data.intensity.z * 0.5f, 1.0f); + + uniform_value[U_REDUCE] = 1; + render_texture_shader_set(&shaders_ft, SHADER_FT_REDUCE); + + glViewport(0, 0, 128, 72); + render_texture_bind(&tex[1], 0); + gl_state_active_bind_texture_2d(0, tex[0].color_texture->tex); + render_texture_draw_params(&shaders_ft, 256, 144, 0.75f, 1.0f, 1.0f, 1.0f, 1.0f); + + uniform_value[U_REDUCE] = 1; + render_texture_shader_set(&shaders_ft, SHADER_FT_REDUCE); + + glViewport(0, 0, 64, 36); + render_texture_bind(&tex[2], 0); + gl_state_active_bind_texture_2d(0, tex[1].color_texture->tex); + render_texture_draw_params(&shaders_ft, 128, 72, 0.75f, 1.0f, 1.0f, 1.0f, 1.0f); + + uniform_value[U_REDUCE] = 1; + render_texture_shader_set(&shaders_ft, SHADER_FT_REDUCE); + + glViewport(0, 0, 32, 18); + render_texture_bind(&tex[3], 0); + gl_state_active_bind_texture_2d(0, tex[2].color_texture->tex); + render_texture_draw_params(&shaders_ft, 64, 36, 0.75f, 1.0f, 1.0f, 1.0f, 1.0f); + + uniform_value[U_EXPOSURE] = 0; + render_texture_shader_set(&shaders_ft, SHADER_FT_EXPOSURE); + + glViewport(0, 0, 8, 8); + render_texture_bind(&tex[4], 0); + gl_state_active_bind_texture_2d(0, tex[3].color_texture->tex); + render_texture_draw_params(&shaders_ft, 32, 18, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + + vec3 intensity = data.intensity; + vec3* gauss = data.gauss; + + vec3 v[POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE]; + for (int32_t i = 0; i < POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE; i++) + vec3_mult(gauss[i], intensity, v[i]); + + uniform_value[U_GAUSS] = 0; + render_texture_shader_set(&shaders_ft, SHADER_FT_GAUSS); + shaders_ft.local_frag_set(1, 1.0f, 0.0f, 1.0f, 0.0f); + for (int32_t i = 0; i < POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE; i++) + shaders_ft.local_frag_set(4ULL + i, v[i].x, v[i].y, v[i].z, 0.0f); + + glViewport(0, 0, 128, 72); + render_texture_bind(&tex[0], 0); + gl_state_active_bind_texture_2d(0, tex[1].color_texture->tex); + render_texture_draw_params(&shaders_ft, 128, 72, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + fbo::blit(tex[0].fbos[0], tex[1].fbos[0], + 0, 0, 128, 72, + 0, 0, 128, 72, GL_COLOR_BUFFER_BIT, GL_LINEAR); + + glViewport(0, 0, 64, 36); + render_texture_bind(&tex[0], 0); + gl_state_active_bind_texture_2d(0, tex[2].color_texture->tex); + render_texture_draw_params(&shaders_ft, 64, 36, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + fbo::blit(tex[0].fbos[0], tex[2].fbos[0], + 0, 0, 64, 36, + 0, 0, 64, 36, GL_COLOR_BUFFER_BIT, GL_LINEAR); + + glViewport(0, 0, 32, 18); + render_texture_bind(&tex[0], 0); + gl_state_active_bind_texture_2d(0, tex[3].color_texture->tex); + render_texture_draw_params(&shaders_ft, 32, 18, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + fbo::blit(tex[0].fbos[0], tex[3].fbos[0], + 0, 0, 32, 18, + 0, 0, 32, 18, GL_COLOR_BUFFER_BIT, GL_LINEAR); + + shaders_ft.local_frag_set(1, 0.0f, 1.0f, 0.0f, 1.0f); + + glViewport(0, 0, 128, 72); + render_texture_bind(&tex[0], 0); + gl_state_active_bind_texture_2d(0, tex[1].color_texture->tex); + render_texture_draw_params(&shaders_ft, 128, 72, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + fbo::blit(tex[0].fbos[0], tex[1].fbos[0], + 0, 0, 128, 72, + 0, 0, 128, 72, GL_COLOR_BUFFER_BIT, GL_LINEAR); + + glViewport(0, 0, 64, 36); + render_texture_bind(&tex[0], 0); + gl_state_active_bind_texture_2d(0, tex[2].color_texture->tex); + render_texture_draw_params(&shaders_ft, 64, 36, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + fbo::blit(tex[0].fbos[0], tex[2].fbos[0], + 0, 0, 64, 36, + 0, 0, 64, 36, GL_COLOR_BUFFER_BIT, GL_LINEAR); + + glViewport(0, 0, 32, 18); + render_texture_bind(&tex[0], 0); + gl_state_active_bind_texture_2d(0, tex[3].color_texture->tex); + render_texture_draw_params(&shaders_ft, 32, 18, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + fbo::blit(tex[0].fbos[0], tex[3].fbos[0], + 0, 0, 32, 18, + 0, 0, 32, 18, GL_COLOR_BUFFER_BIT, GL_LINEAR); + + uniform_value[U_REDUCE] = 7; + render_texture_shader_set(&shaders_ft, SHADER_FT_REDUCE); + + glViewport(0, 0, 256, 144); + render_texture_bind(&tex[0], 0); + gl_state_active_bind_texture_2d(0, tex[5].color_texture->tex); + gl_state_active_bind_texture_2d(1, tex[1].color_texture->tex); + gl_state_active_bind_texture_2d(2, tex[2].color_texture->tex); + gl_state_active_bind_texture_2d(3, tex[3].color_texture->tex); + render_texture_draw_params(&shaders_ft, 32, 18, 0.25f, 0.15f, 0.25f, 0.25f, 0.25f); +} + +void post_process_blur::init_fbo(int32_t width, int32_t height) { + if (!this || (this->width == width && this->height == height)) + return; + + if (!tex[0].color_texture) + render_texture_init(&tex[0], 256, 144, 0, GL_RGBA16F, 0); + if (!tex[1].color_texture) + render_texture_init(&tex[1], 128, 72, 0, GL_RGBA16F, 0); + if (!tex[2].color_texture) + render_texture_init(&tex[2], 64, 36, 0, GL_RGBA16F, 0); + if (!tex[3].color_texture) + render_texture_init(&tex[3], 32, 18, 0, GL_RGBA16F, 0); + if (!tex[4].color_texture) + render_texture_init(&tex[4], 8, 8, 0, GL_R32F, 0); + if (!tex[5].color_texture) + render_texture_init(&tex[5], 256, 144, 0, GL_RGBA16F, 0); + + this->width = width > 1 ? width : 1; + this->height = height > 1 ? height : 1; + + int32_t i = 0; + width = this->width; + height = this->height; + while (width > 512 && height > 288) { + width /= 2; + height /= 2; + i++; + } + + render_texture* tex_down = this->tex_down; + int32_t* width_down = this->width_down; + int32_t* height_down = this->height_down; + + if (!tex_down) + tex_down = force_malloc_s(render_texture, i); + else if (count_down < i) { + render_texture* temp = force_malloc_s(render_texture, i); + memcpy(temp, tex_down, sizeof(render_texture) * count_down); + free(tex_down); + tex_down = temp; + } + + if (!width_down) + width_down = force_malloc_s(int32_t, i); + else if (count_down < i) { + int32_t* temp = force_malloc_s(int32_t, i); + memcpy(temp, width_down, sizeof(int32_t) * count_down); + free(width_down); + width_down = temp; + } + + if (!height_down) + height_down = force_malloc_s(int32_t, i); + else if (count_down < i) { + int32_t* temp = force_malloc_s(int32_t, i); + memcpy(temp, height_down, sizeof(int32_t) * count_down); + free(height_down); + height_down = temp; + } + + count_down = i; + + i = 0; + width = this->width; + height = this->height; + while (width > 512 && height > 288) { + width_down[i] = width /= 2; + height_down[i] = height /= 2; + i++; + } + + for (i = 0; i < count_down; i++) + render_texture_init(&tex_down[i], width_down[i], height_down[i], 0, GL_RGBA16F, 0); + + gl_state_bind_framebuffer(0); + + this->tex_down = tex_down; + this->width_down = width_down; + this->height_down = height_down; +} + +void post_process_blur::initialize_data(const vec3& radius, const vec3& intensity) { + data.radius.x = clamp(radius.x, 1.0f, 3.0f); + data.radius.y = clamp(radius.y, 1.0f, 3.0f); + data.radius.z = clamp(radius.z, 1.0f, 3.0f); + data.intensity.x = clamp(intensity.x, 0.0f, 2.0f); + data.intensity.y = clamp(intensity.y, 0.0f, 2.0f); + data.intensity.z = clamp(intensity.z, 0.0f, 2.0f); + post_process_blur_radius_calculate(this); +} + +vec3 post_process_blur::get_intensity() { + return data.intensity; +} + +void post_process_blur::set_intensity(const vec3& value) { + data.intensity.x = clamp(value.x, 0.0f, 2.0f); + data.intensity.y = clamp(value.y, 0.0f, 2.0f); + data.intensity.z = clamp(value.z, 0.0f, 2.0f); +} + +vec3 post_process_blur::get_radius() { + return data.radius; +} + +void post_process_blur::set_radius(const vec3& value) { + vec3 temp; + temp.x = clamp(value.x, 1.0f, 3.0f); + temp.y = clamp(value.y, 1.0f, 3.0f); + temp.z = clamp(value.z, 1.0f, 3.0f); + if (memcmp(&temp, &data.radius, sizeof(vec3))) { + data.radius = temp; + post_process_blur_radius_calculate(this); + } +} + +static void post_process_blur_radius_calculate(post_process_blur* blur) { + float_t radius_scale = 0.8f; + vec3 radius = blur->data.radius; + post_process_blur_radius_calculate_gaussian_kernel((float_t*)blur->data.gauss, radius.x * radius_scale, 3, 0); + post_process_blur_radius_calculate_gaussian_kernel((float_t*)blur->data.gauss, radius.y * radius_scale, 3, 1); + post_process_blur_radius_calculate_gaussian_kernel((float_t*)blur->data.gauss, radius.z * radius_scale, 3, 2); +} + +static void post_process_blur_radius_calculate_gaussian_kernel(float_t* gaussian_kernel, + float_t radius, int32_t stride, int32_t offset) { + if (stride < 1) + stride = 1; + if (offset < 0) + offset = 0; + + gaussian_kernel[0 * stride + offset] = 1.0f; + for (int32_t i = 1; i < POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE; i++) + gaussian_kernel[i * stride + offset] = 0.0f; + double_t temp_gaussian_kernel[POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE]; + double_t s = radius; + s = -1.0 / (2.0 * s * s); + double_t sum = 0.5; + temp_gaussian_kernel[0] = 1.0; + for (size_t i = 1; i < POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE; i++) + sum += temp_gaussian_kernel[i] = exp(i * i * s); + + sum = 0.5 / sum; + for (size_t i = 0; i < POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE; i++) + gaussian_kernel[i * stride + offset] = (float_t)(temp_gaussian_kernel[i] * sum); +} diff --git a/src/CRE/post_process/blur.h b/src/CRE/post_process/blur.h deleted file mode 100644 index c2145962..00000000 --- a/src/CRE/post_process/blur.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "../../KKdLib/default.h" -#include "../../KKdLib/vec.h" -#include "../shared.h" -#include "../render_texture.h" - -#define POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE 7 - -struct post_process_blur_data { - vec3 gauss[POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE]; - vec3 radius; - vec3 intensity; -}; - -struct post_process_blur { - post_process_blur_data data; - int32_t width; - int32_t height; - render_texture tex[6]; - int32_t* width_down; - int32_t* height_down; - render_texture* tex_down; - int32_t count_down; -}; - -extern post_process_blur* post_process_blur_init(); -extern void post_process_get_blur(post_process_blur* blur, render_texture* rt); -extern void post_process_blur_init_fbo(post_process_blur* blur, - int32_t width, int32_t height); -extern void post_process_blur_dispose(post_process_blur* blur); - -extern void post_process_blur_initialize_data(post_process_blur* blur, const vec3* radius, const vec3* intensity); -extern void post_process_blur_get_radius(post_process_blur* blur, vec3* value); -extern void post_process_blur_set_radius(post_process_blur* blur, const vec3* value); -extern void post_process_blur_get_intensity(post_process_blur* blur, vec3* value); -extern void post_process_blur_set_intensity(post_process_blur* blur, const vec3* value); diff --git a/src/CRE/post_process/blur.hpp b/src/CRE/post_process/blur.hpp new file mode 100644 index 00000000..84411343 --- /dev/null +++ b/src/CRE/post_process/blur.hpp @@ -0,0 +1,42 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../../KKdLib/default.hpp" +#include "../../KKdLib/vec.hpp" +#include "../shared.h" +#include "../render_texture.h" + +#define POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE 7 + +struct post_process_blur_data { + vec3 gauss[POST_PROCESS_BLUR_GAUSSIAN_KERNEL_SIZE]; + vec3 radius; + vec3 intensity; +}; + +struct post_process_blur { + post_process_blur_data data; + int32_t width; + int32_t height; + render_texture tex[6]; + int32_t* width_down; + int32_t* height_down; + render_texture* tex_down; + int32_t count_down; + + post_process_blur(); + virtual ~post_process_blur(); + + void get_blur(render_texture* rt); + void init_fbo(int32_t width, int32_t height); + void initialize_data(const vec3& radius, const vec3& intensity); + + vec3 get_intensity(); + void set_intensity(const vec3& value); + vec3 get_radius(); + void set_radius(const vec3& value); +}; diff --git a/src/CRE/post_process/dof.cpp b/src/CRE/post_process/dof.cpp index 3976ce0a..c6e81fe5 100644 --- a/src/CRE/post_process/dof.cpp +++ b/src/CRE/post_process/dof.cpp @@ -4,7 +4,7 @@ */ #include "dof.hpp" -#include "../../KKdLib/str_utils.h" +#include "../../KKdLib/str_utils.hpp" #include "../gl_state.h" #include "../rob.hpp" @@ -30,7 +30,7 @@ static const char* dof_vert_shader = static const char* dof_frag_shader_version = "#version 430 core\n"; -static const char* dof_frag_shader_step_2 = +static const char* dof_frag_shader_render_tiles_part_2 = "#version 430 core\n" "layout(binding = 0) uniform sampler2D g_tile; //r=min_depth_m, g=max_coc_pixel\n" "\n" @@ -150,7 +150,7 @@ static const char* dof_frag_shader_shared = "}\n" "\n"; -static const char* dof_frag_shader_step_1 = +static const char* dof_frag_shader_render_tiles_part_1 = "layout(binding = 0) uniform sampler2D g_depth;\n" "\n" "layout(location = 0) out vec4 result; //r=min_depth_m, g=max_coc_pixel\n" @@ -240,7 +240,7 @@ static const char* dof_frag_shader_step_1 = "}\n" "#endif\n"; -static const char* dof_frag_shader_step_3 = +static const char* dof_frag_shader_downsample = "layout(binding = 0) uniform sampler2D g_depth_point_sampler;\n" "layout(binding = 1) uniform sampler2D g_color_linear_sampler;\n" "layout(binding = 2) uniform sampler2D g_tile_sampler;\n" @@ -400,7 +400,7 @@ static const char* dof_frag_shader_step_3 = " result_presort = presort(coc_center_pixel, depth_center);\n" "}\n"; -static const char* dof_frag_shader_step_4 = +static const char* dof_frag_shader_apply_main_filter = "layout(binding = 0) uniform sampler2D g_presort; //r=coc[sample]," " g=background_weight(=depth_cmp*sample_alpha), b=foreground_weight(=depth_cmp*sample_alpha)\n" "layout(binding = 1) uniform sampler2D g_color;\n" @@ -465,7 +465,7 @@ static const char* dof_frag_shader_step_4 = " result_alpha = alpha;\n" "}\n"; -static const char* dof_frag_shader_step_5 = +static const char* dof_frag_shader_upsample = "layout(binding = 0) uniform sampler2D g_filtered_rgb_sampler;\n" "layout(binding = 1) uniform sampler2D g_filtered_a_sampler;\n" "layout(binding = 2) uniform sampler2D g_tile_sampler;\n" @@ -593,29 +593,36 @@ static const dof_pv dof_pv_default = { }, }; -static void post_process_apply_dof_f2(post_process_dof* dof, render_texture* rt, - GLuint* samplers, GLuint color_texture, GLuint depth_texture, - float_t min_distance, float_t max_distance, float_t fov, float_t focus, - float_t focus_range, float_t fuzzing_range, float_t ratio); -static void post_process_apply_dof_physical(post_process_dof* dof, render_texture* rt, - GLuint* samplers, GLuint color_texture, GLuint depth_texture, - float_t min_distance, float_t max_distance, float_t focus, - float_t focal_length, float_t fov, float_t f_number); -static void post_process_apply_dof_steps_1_2(post_process_dof* dof, - GLuint* samplers, GLuint depth_texture, bool f2); -static void post_process_apply_dof_step_3(post_process_dof* dof, - GLuint* samplers, GLuint color_texture, GLuint depth_texture, bool f2); -static void post_process_apply_dof_step_4(post_process_dof* dof, GLuint* samplers, bool f2); -static void post_process_apply_dof_step_5(post_process_dof* dof, render_texture* rt, - GLuint* samplers, GLuint color_texture, GLuint depth_texture, bool f2); +namespace renderer { + struct DOF3 { + static void apply_f2(post_process_dof* dof, render_texture* rt, + GLuint* samplers, GLuint color_texture, GLuint depth_texture, + float_t min_distance, float_t max_distance, float_t fov, float_t focus, + float_t focus_range, float_t fuzzing_range, float_t ratio); + static void apply_physical(post_process_dof* dof, render_texture* rt, + GLuint* samplers, GLuint color_texture, GLuint depth_texture, + float_t min_distance, float_t max_distance, float_t focus, + float_t focal_length, float_t fov, float_t f_number); + + static void render_tiles(post_process_dof* dof, + GLuint* samplers, GLuint depth_texture, bool f2); + static void downsample(post_process_dof* dof, + GLuint* samplers, GLuint color_texture, GLuint depth_texture, bool f2); + static void apply_main_filter(post_process_dof* dof, GLuint* samplers, bool f2); + static void upsample(post_process_dof* dof, render_texture* rt, + GLuint* samplers, GLuint color_texture, GLuint depth_texture, bool f2); + + static void update_data(post_process_dof* dof, float_t min_dist, + float_t max_dist, float_t fov, float_t dist, float_t focal_length, + float_t f_number, float_t focus_range, float_t fuzzing_range, float_t ratio); + }; +} + static void post_process_dof_calculate_texcoords(vec2* data, float_t size); static void post_process_dof_free_fbo(post_process_dof* dof); static void post_process_dof_load_shaders(post_process_dof* dof); static GLuint post_process_dof_program_link(GLuint vert_shad, GLuint frag_shad); static GLuint post_process_dof_shader_compile(GLenum type, const char* data); -static void post_process_dof_update_data(post_process_dof* dof, float_t min_dist, - float_t max_dist, float_t fov, float_t dist, float_t focal_length, - float_t f_number, float_t focus_range, float_t fuzzing_range, float_t ratio); static void sub_1405163C0(rob_chara* rob_chr, int32_t a2, mat4* mat); @@ -668,14 +675,14 @@ void post_process_dof::apply(render_texture* rt, GLuint* samplers, camera* cam) } focus = max(focus, (float_t)cam->min_distance); - post_process_apply_dof_physical(this, rt, samplers, + renderer::DOF3::apply_physical(this, rt, samplers, rt->color_texture->tex, rt->depth_texture->tex, (float_t)cam->min_distance, (float_t)cam->max_distance, focus, data.debug.focal_length, (float_t)cam->fov_rad, data.debug.f_number); } else { float_t fuzzing_range = max(data.debug.f2.fuzzing_range, 0.01f); - post_process_apply_dof_f2(this, rt, samplers, + renderer::DOF3::apply_f2(this, rt, samplers, rt->color_texture->tex, rt->depth_texture->tex, (float_t)cam->min_distance, (float_t)cam->max_distance, (float_t)cam->fov_rad, data.debug.f2.focus, data.debug.f2.focus_range, fuzzing_range, data.debug.f2.ratio); @@ -685,7 +692,7 @@ void post_process_dof::apply(render_texture* rt, GLuint* samplers, camera* cam) } else if (data.pv.enable && data.pv.f2.ratio > 0.0f) { float_t fuzzing_range = max(data.pv.f2.fuzzing_range, 0.01f); - post_process_apply_dof_f2(this, rt, samplers, + renderer::DOF3::apply_f2(this, rt, samplers, rt->color_texture->tex, rt->depth_texture->tex, (float_t)cam->min_distance, (float_t)cam->max_distance, (float_t)cam->fov_rad, data.pv.f2.focus, data.pv.f2.focus_range, fuzzing_range, data.pv.f2.ratio); @@ -781,134 +788,6 @@ void post_process_dof::set_dof_pv(dof_pv* pv) { data.pv = dof_pv_default; } -static void post_process_apply_dof_f2(post_process_dof* dof, render_texture* rt, - GLuint* samplers, GLuint color_texture, GLuint depth_texture, - float_t min_distance, float_t max_distance, float_t fov, float_t focus, - float_t focus_range, float_t fuzzing_range, float_t ratio) { - gl_state_disable_blend(); - gl_state_set_depth_mask(GL_FALSE); - gl_state_set_depth_func(GL_ALWAYS); - post_process_dof_update_data(dof, min_distance, max_distance, - fov, focus, 0.0f, 1.0f, focus_range, fuzzing_range, ratio); - - gl_state_bind_vertex_array(dof->vao); - post_process_apply_dof_steps_1_2(dof, samplers, depth_texture, true); - post_process_apply_dof_step_3(dof, samplers, color_texture, depth_texture, true); - post_process_apply_dof_step_4(dof, samplers, true); - post_process_apply_dof_step_5(dof, rt, samplers, color_texture, depth_texture, true); - - gl_state_use_program(0); - for (int32_t i = 0; i < 8; i++) { - gl_state_bind_sampler(i, 0); - gl_state_active_bind_texture_2d(i, 0); - } - gl_state_bind_vertex_array(0); -} - -static void post_process_apply_dof_physical(post_process_dof* dof, render_texture* rt, - GLuint* samplers, GLuint color_texture, GLuint depth_texture, - float_t min_distance, float_t max_distance, float_t focus, - float_t focal_length, float_t fov, float_t f_number) { - gl_state_disable_blend(); - gl_state_set_depth_mask(GL_FALSE); - gl_state_set_depth_func(GL_ALWAYS); - post_process_dof_update_data(dof, min_distance, max_distance, - fov, focus, focal_length, f_number, 0.0f, 0.1f, 0.0f); - - gl_state_bind_vertex_array(dof->vao); - post_process_apply_dof_steps_1_2(dof, samplers, depth_texture, false); - post_process_apply_dof_step_3(dof, samplers, color_texture, depth_texture, false); - post_process_apply_dof_step_4(dof, samplers, false); - post_process_apply_dof_step_5(dof, rt, samplers, color_texture, depth_texture, false); - - gl_state_use_program(0); - for (int32_t i = 0; i < 8; i++) { - gl_state_bind_sampler(i, 0); - gl_state_active_bind_texture_2d(i, 0); - } - gl_state_bind_vertex_array(0); -} - -static void post_process_apply_dof_steps_1_2(post_process_dof* dof, - GLuint* samplers, GLuint depth_texture, bool f2) { - gl_state_bind_framebuffer(dof->fbo[0].buffer); - glViewport(0, 0, dof->fbo[0].width, dof->fbo[0].height); - if (f2) - gl_state_use_program(dof->program[5]); - else - gl_state_use_program(dof->program[1]); - gl_state_bind_uniform_buffer_base(0, dof->ubo[0]); - gl_state_active_bind_texture_2d(0, depth_texture); - gl_state_bind_sampler(0, samplers[1]); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); - - gl_state_bind_framebuffer(dof->fbo[1].buffer); - glViewport(0, 0, dof->fbo[1].width, dof->fbo[1].height); - gl_state_use_program(dof->program[0]); - gl_state_active_bind_texture_2d(0, dof->textures[0]); - gl_state_bind_sampler(0, samplers[1]); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); -} - -static void post_process_apply_dof_step_3(post_process_dof* dof, - GLuint* samplers, GLuint color_texture, GLuint depth_texture, bool f2) { - gl_state_bind_framebuffer(dof->fbo[2].buffer); - glViewport(0, 0, dof->fbo[2].width, dof->fbo[2].height); - if (f2) - gl_state_use_program(dof->program[6]); - else - gl_state_use_program(dof->program[2]); - gl_state_bind_uniform_buffer_base(0, dof->ubo[0]); - gl_state_active_bind_texture_2d(0, depth_texture); - gl_state_bind_sampler(0, samplers[1]); - gl_state_active_bind_texture_2d(1, color_texture); - gl_state_bind_sampler(1, samplers[0]); - gl_state_active_bind_texture_2d(2, dof->textures[1]); - gl_state_bind_sampler(2, samplers[1]); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); -} - -static void post_process_apply_dof_step_4(post_process_dof* dof, GLuint* samplers, bool f2) { - gl_state_bind_framebuffer(dof->fbo[3].buffer); - glViewport(0, 0, dof->fbo[3].width, dof->fbo[3].height); - if (f2) - gl_state_use_program(dof->program[7]); - else - gl_state_use_program(dof->program[3]); - gl_state_bind_uniform_buffer_base(0, dof->ubo[0]); - gl_state_bind_uniform_buffer_base(1, dof->ubo[1]); - gl_state_active_bind_texture_2d(0, dof->textures[3]); - gl_state_bind_sampler(0, samplers[1]); - gl_state_active_bind_texture_2d(1, dof->textures[2]); - gl_state_bind_sampler(1, samplers[1]); - gl_state_active_bind_texture_2d(2, dof->textures[1]); - gl_state_bind_sampler(2, samplers[1]); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); -} - -static void post_process_apply_dof_step_5(post_process_dof* dof, render_texture* rt, - GLuint* samplers, GLuint color_texture, GLuint depth_texture, bool f2) { - render_texture_bind(rt, 0); - glViewport(0, 0, dof->width, dof->height); - if (f2) - gl_state_use_program(dof->program[8]); - else - gl_state_use_program(dof->program[4]); - gl_state_bind_uniform_buffer_base(0, dof->ubo[0]); - gl_state_bind_uniform_buffer_base(1, dof->ubo[1]); - gl_state_active_bind_texture_2d(0, dof->textures[4]); - gl_state_bind_sampler(0, samplers[1]); - gl_state_active_bind_texture_2d(1, dof->textures[5]); - gl_state_bind_sampler(1, samplers[1]); - gl_state_active_bind_texture_2d(2, dof->textures[1]); - gl_state_bind_sampler(2, samplers[1]); - gl_state_active_bind_texture_2d(3, color_texture); - gl_state_bind_sampler(3, samplers[1]); - gl_state_active_bind_texture_2d(4, depth_texture); - gl_state_bind_sampler(4, samplers[1]); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); -} - static void post_process_dof_calculate_texcoords(vec2* data, float_t size) { size_t i; size_t j; @@ -976,7 +855,7 @@ static void post_process_dof_free_fbo(post_process_dof* dof) { static void post_process_dof_load_shaders(post_process_dof* dof) { char* frag_shader_string[9]; - frag_shader_string[0] = str_utils_copy(dof_frag_shader_step_2); + frag_shader_string[0] = str_utils_copy(dof_frag_shader_render_tiles_part_2); for (int32_t i = 0; i < 2; i++) { char* t0; char* t1; @@ -985,25 +864,25 @@ static void post_process_dof_load_shaders(post_process_dof* dof) { t0 = str_utils_copy(dof_frag_shader_version); t1 = str_utils_add(t0, shared); - frag_shader_string[1 + i * 4] = str_utils_add(t1, dof_frag_shader_step_1); + frag_shader_string[1 + i * 4] = str_utils_add(t1, dof_frag_shader_render_tiles_part_1); free(t0); free(t1); t0 = str_utils_copy(dof_frag_shader_version); t1 = str_utils_add(t0, shared); - frag_shader_string[2 + i * 4] = str_utils_add(t1, dof_frag_shader_step_3); + frag_shader_string[2 + i * 4] = str_utils_add(t1, dof_frag_shader_downsample); free(t0); free(t1); t0 = str_utils_copy(dof_frag_shader_version); t1 = str_utils_add(t0, shared); - frag_shader_string[3 + i * 4] = str_utils_add(t1, dof_frag_shader_step_4); + frag_shader_string[3 + i * 4] = str_utils_add(t1, dof_frag_shader_apply_main_filter); free(t0); free(t1); t0 = str_utils_copy(dof_frag_shader_version); t1 = str_utils_add(t0, shared); - frag_shader_string[4 + i * 4] = str_utils_add(t1, dof_frag_shader_step_5); + frag_shader_string[4 + i * 4] = str_utils_add(t1, dof_frag_shader_upsample); free(t0); free(t1); free(shared); @@ -1063,34 +942,164 @@ static GLuint post_process_dof_program_link(GLuint vert_shad, GLuint frag_shad) return program; }; -static void post_process_dof_update_data(post_process_dof* dof, float_t min_dist, - float_t max_dist, float_t fov, float_t dist, float_t focal_length, - float_t f_number, float_t focus_range, float_t fuzzing_range, float_t ratio) { - float_t fl = focal_length; - if (dist <= focal_length) - fl = dist + 0.1f; - fl = fl / (dist - fl) * fl / f_number; - - post_process_dof_shader_data data; - data.g_depth_params.x = 1.0f / (min_dist * max_dist) * (min_dist - max_dist); - data.g_depth_params.y = 1.0f / min_dist; - data.g_depth_params.z = -((fl * dist * (min_dist - max_dist)) * (1.0f / (min_dist * max_dist))); - data.g_depth_params.w = (1.0f - 1.0f / min_dist * dist) * fl; - data.g_spread_scale.x = 720.0f / (tanf(fov * 0.5f) * (min_dist * 2.0f)); - data.g_spread_scale.y = data.g_spread_scale.x * (float_t)(1.0 / 3.0); - data.g_spread_scale.z = (float_t)(1.0 / 3.0); - data.g_spread_scale.w = 3.0f; - data.g_depth_params2.x = dist; - data.g_depth_params2.y = focus_range; - data.g_depth_params2.z = -4.5f / (fuzzing_range * fuzzing_range); - data.g_depth_params2.w = ratio * 8.0f; - - gl_state_bind_uniform_buffer(dof->ubo[0]); - glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(post_process_dof_shader_data), &data); -} - static void sub_1405163C0(rob_chara* rob_chr, int32_t a2, mat4* mat) { if (a2 >= 0 && a2 <= 26) *mat = rob_chr->data.field_1E68.field_78[a2]; } +namespace renderer { + void DOF3::apply_f2(post_process_dof* dof, render_texture* rt, + GLuint* samplers, GLuint color_texture, GLuint depth_texture, + float_t min_distance, float_t max_distance, float_t fov, float_t focus, + float_t focus_range, float_t fuzzing_range, float_t ratio) { + gl_state_disable_blend(); + gl_state_set_depth_mask(GL_FALSE); + gl_state_set_depth_func(GL_ALWAYS); + update_data(dof, min_distance, max_distance, + fov, focus, 0.0f, 1.0f, focus_range, fuzzing_range, ratio); + + gl_state_bind_vertex_array(dof->vao); + render_tiles(dof, samplers, depth_texture, true); + downsample(dof, samplers, color_texture, depth_texture, true); + apply_main_filter(dof, samplers, true); + upsample(dof, rt, samplers, color_texture, depth_texture, true); + + gl_state_use_program(0); + for (int32_t i = 0; i < 8; i++) { + gl_state_bind_sampler(i, 0); + gl_state_active_bind_texture_2d(i, 0); + } + gl_state_bind_vertex_array(0); + } + + void DOF3::apply_physical(post_process_dof* dof, render_texture* rt, + GLuint* samplers, GLuint color_texture, GLuint depth_texture, + float_t min_distance, float_t max_distance, float_t focus, + float_t focal_length, float_t fov, float_t f_number) { + gl_state_disable_blend(); + gl_state_set_depth_mask(GL_FALSE); + gl_state_set_depth_func(GL_ALWAYS); + update_data(dof, min_distance, max_distance, + fov, focus, focal_length, f_number, 0.0f, 0.1f, 0.0f); + + gl_state_bind_vertex_array(dof->vao); + render_tiles(dof, samplers, depth_texture, false); + downsample(dof, samplers, color_texture, depth_texture, false); + apply_main_filter(dof, samplers, false); + upsample(dof, rt, samplers, color_texture, depth_texture, false); + + gl_state_use_program(0); + for (int32_t i = 0; i < 8; i++) { + gl_state_bind_sampler(i, 0); + gl_state_active_bind_texture_2d(i, 0); + } + gl_state_bind_vertex_array(0); + } + + void DOF3::render_tiles(post_process_dof* dof, + GLuint* samplers, GLuint depth_texture, bool f2) { + gl_state_bind_framebuffer(dof->fbo[0].buffer); + glViewport(0, 0, dof->fbo[0].width, dof->fbo[0].height); + if (f2) + gl_state_use_program(dof->program[5]); + else + gl_state_use_program(dof->program[1]); + gl_state_bind_uniform_buffer_base(0, dof->ubo[0]); + gl_state_active_bind_texture_2d(0, depth_texture); + gl_state_bind_sampler(0, samplers[1]); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); + + gl_state_bind_framebuffer(dof->fbo[1].buffer); + glViewport(0, 0, dof->fbo[1].width, dof->fbo[1].height); + gl_state_use_program(dof->program[0]); + gl_state_active_bind_texture_2d(0, dof->textures[0]); + gl_state_bind_sampler(0, samplers[1]); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); + + } + + void DOF3::downsample(post_process_dof* dof, + GLuint* samplers, GLuint color_texture, GLuint depth_texture, bool f2) { + gl_state_bind_framebuffer(dof->fbo[2].buffer); + glViewport(0, 0, dof->fbo[2].width, dof->fbo[2].height); + if (f2) + gl_state_use_program(dof->program[6]); + else + gl_state_use_program(dof->program[2]); + gl_state_bind_uniform_buffer_base(0, dof->ubo[0]); + gl_state_active_bind_texture_2d(0, depth_texture); + gl_state_bind_sampler(0, samplers[1]); + gl_state_active_bind_texture_2d(1, color_texture); + gl_state_bind_sampler(1, samplers[0]); + gl_state_active_bind_texture_2d(2, dof->textures[1]); + gl_state_bind_sampler(2, samplers[1]); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); + } + + void DOF3::apply_main_filter(post_process_dof* dof, GLuint* samplers, bool f2) { + gl_state_bind_framebuffer(dof->fbo[3].buffer); + glViewport(0, 0, dof->fbo[3].width, dof->fbo[3].height); + if (f2) + gl_state_use_program(dof->program[7]); + else + gl_state_use_program(dof->program[3]); + gl_state_bind_uniform_buffer_base(0, dof->ubo[0]); + gl_state_bind_uniform_buffer_base(1, dof->ubo[1]); + gl_state_active_bind_texture_2d(0, dof->textures[3]); + gl_state_bind_sampler(0, samplers[1]); + gl_state_active_bind_texture_2d(1, dof->textures[2]); + gl_state_bind_sampler(1, samplers[1]); + gl_state_active_bind_texture_2d(2, dof->textures[1]); + gl_state_bind_sampler(2, samplers[1]); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); + } + + void DOF3::upsample(post_process_dof* dof, render_texture* rt, + GLuint* samplers, GLuint color_texture, GLuint depth_texture, bool f2) { + render_texture_bind(rt, 0); + glViewport(0, 0, dof->width, dof->height); + if (f2) + gl_state_use_program(dof->program[8]); + else + gl_state_use_program(dof->program[4]); + gl_state_bind_uniform_buffer_base(0, dof->ubo[0]); + gl_state_bind_uniform_buffer_base(1, dof->ubo[1]); + gl_state_active_bind_texture_2d(0, dof->textures[4]); + gl_state_bind_sampler(0, samplers[1]); + gl_state_active_bind_texture_2d(1, dof->textures[5]); + gl_state_bind_sampler(1, samplers[1]); + gl_state_active_bind_texture_2d(2, dof->textures[1]); + gl_state_bind_sampler(2, samplers[1]); + gl_state_active_bind_texture_2d(3, color_texture); + gl_state_bind_sampler(3, samplers[1]); + gl_state_active_bind_texture_2d(4, depth_texture); + gl_state_bind_sampler(4, samplers[1]); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); + } + + void DOF3::update_data(post_process_dof* dof, float_t min_dist, + float_t max_dist, float_t fov, float_t dist, float_t focal_length, + float_t f_number, float_t focus_range, float_t fuzzing_range, float_t ratio) { + float_t fl = focal_length; + if (dist <= focal_length) + fl = dist + 0.1f; + fl = fl / (dist - fl) * fl / f_number; + + post_process_dof_shader_data data; + data.g_depth_params.x = 1.0f / (min_dist * max_dist) * (min_dist - max_dist); + data.g_depth_params.y = 1.0f / min_dist; + data.g_depth_params.z = -((fl * dist * (min_dist - max_dist)) * (1.0f / (min_dist * max_dist))); + data.g_depth_params.w = (1.0f - 1.0f / min_dist * dist) * fl; + data.g_spread_scale.x = 720.0f / (tanf(fov * 0.5f) * (min_dist * 2.0f)); + data.g_spread_scale.y = data.g_spread_scale.x * (float_t)(1.0 / 3.0); + data.g_spread_scale.z = (float_t)(1.0 / 3.0); + data.g_spread_scale.w = 3.0f; + data.g_depth_params2.x = dist; + data.g_depth_params2.y = focus_range; + data.g_depth_params2.z = -4.5f / (fuzzing_range * fuzzing_range); + data.g_depth_params2.w = ratio * 8.0f; + + gl_state_bind_uniform_buffer(dof->ubo[0]); + glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(post_process_dof_shader_data), &data); + } +} diff --git a/src/CRE/post_process/dof.hpp b/src/CRE/post_process/dof.hpp index df758573..b450c456 100644 --- a/src/CRE/post_process/dof.hpp +++ b/src/CRE/post_process/dof.hpp @@ -5,8 +5,8 @@ #pragma once -#include "../../KKdLib/default.h" -#include "../../KKdLib/vec.h" +#include "../../KKdLib/default.hpp" +#include "../../KKdLib/vec.hpp" #include "../camera.h" #include "../fbo.hpp" #include "../render_texture.h" @@ -60,6 +60,7 @@ struct post_process_dof { void apply(render_texture* rt, GLuint* samplers, camera* cam); void init_fbo(int32_t width, int32_t height); void initialize_data(dof_debug* debug, dof_pv* pv); + void get_dof_debug(dof_debug* debug); void set_dof_debug(dof_debug* debug); void get_dof_pv(dof_pv* pv); diff --git a/src/CRE/post_process/exposure.c b/src/CRE/post_process/exposure.c deleted file mode 100644 index f62b1166..00000000 --- a/src/CRE/post_process/exposure.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "exposure.h" -#include "../fbo.hpp" -#include "../gl_state.h" -#include "../post_process.hpp" -#include "../rob.hpp" -#include "../shader_ft.h" - -struct struc_188 { - vec4u field_0[8]; - float_t field_80; - GLuint field_84[3]; - GLuint field_90[3]; -}; - -static void post_process_exposure_free_fbo(post_process_exposure* exp); -static void sub_1405163C0(rob_chara* rob_chr, int32_t a2, mat4* mat); - -post_process_exposure::post_process_exposure() : exposure_history_counter() { - -} - -post_process_exposure* post_process_exposure_init() { - post_process_exposure* exp = force_malloc_s(post_process_exposure, 1); - return exp; -} - -void post_process_get_exposure(post_process_exposure* exp, camera* cam, int32_t render_width, - int32_t render_height, bool reset_exposure, GLuint in_tex_0, GLuint in_tex_1) { - if (!exp) - return; - - struc_188 field_648[ROB_CHARA_COUNT]; - - for (struc_188& i : field_648) - i = {}; - - bool v2 = false; - float_t v18 = (float_t)render_height / (float_t)render_width; - float_t v20 = powf(tanf((float_t)(cam->fov_rad * 0.5f)) * 3.4f, 2.0f); - if (reset_exposure) - goto LABEL_30; - - for (struc_188& i : field_648) { - rob_chara* rob_chr = rob_chara_array_get((int32_t)(&i - field_648)); - if (!rob_chr || ~rob_chr->data.field_0 & 0x01) - continue; - - vec4 v34 = { 0.05f, 0.0f, -0.04f, 1.0f }; - vec4 v33 = { 1.0f, 0.0f, 0.0f, 0.0f }; - - mat4 v44; - sub_1405163C0(rob_chr, 4, &v44); - - mat4 v42 = cam->view; - mat4 v43 = cam->projection; - mat4_mult(&v44, &v42, &v42); - mat4_mult(&v42, &v43, &v43); - - vec4 v41; - mat4_mult_vec(&v42, &v34, &v41); - - vec4 v40; - mat4_mult_vec(&v43, &v34, &v40); - - float_t v11 = v41.z; - float_t v12 = 1.0f / v40.w; - float_t v13 = v40.x * v12; - float_t v14 = v40.y * v12; - if (v41.z >= 0.0f || fabsf(v13) >= 1.0f || fabsf(v14) >= 1.0f) - continue; - - float_t v31 = 0.5f - (fabsf(v14) - 1.0f) * 2.5f; - float_t v32 = 0.5f - (fabsf(v13) - 1.0f) * 2.5f; - float_t v16; - if (v32 <= v31) - v16 = v32; - else - v16 = v31; - v16 = min(v16, 1.0f); - - vec4 v39; - mat4_mult_vec(&v42, &v33, &v39); - - float_t v17 = (v39.z + 1.0f) * 0.5f; - v17 = clamp(v17, 0.0f, 0.8f); - float_t v21 = 0.25f / sqrtf(v20 * (v11 * v11)); - - float_t v22; - if (v21 >= 0.055f) { - v22 = 1.0f; - if (v21 > 0.5f) - v22 = 1.0f - (v21 - 0.5f) * (float_t)(10.0 / 3.0f); - } - else - v22 = (v21 - 0.035f) * 50.0f; - v22 = max(v22, 0.0f); - - float_t v23 = (v13 + 1.0f) * 0.5f; - float_t v24 = (v21 * -0.5f + v14 + 1.0f) * 0.5f; - float_t v25 = (v14 - v21 * 0.1f + 1.0f) * 0.5f; - - i.field_80 = v16 * 1.6f * v17 * v22; - i.field_0[0].x = v23; - i.field_0[0].y = (v21 * 0.1f + v14 + 1.0f) * 0.5f; - i.field_0[0].z = 0.0f; - i.field_0[0].w = 4.0f; - i.field_0[1].x = v23; - i.field_0[1].y = (v14 - v21 * 0.3f + 1.0f) * 0.5f; - i.field_0[1].z = 0.0f; - i.field_0[1].w = 4.0f; - i.field_0[2].x = (v21 * -0.5f * v18 + v13 + 1.0f) * 0.5f; - i.field_0[2].y = v24; - i.field_0[2].z = 0.0f; - i.field_0[2].w = 3.0f; - i.field_0[3].x = (v13 - v21 * 0.6f * v18 + 1.0f) * 0.5f; - i.field_0[3].y = v25; - i.field_0[3].z = 0.0f; - i.field_0[3].w = 2.0f; - i.field_0[4].x = (v21 * 0.6f * v18 + v13 + 1.0f) * 0.5f; - i.field_0[4].y = v25; - i.field_0[4].z = 0.0f; - i.field_0[4].w = 2.0f; - i.field_0[5].x = (v21 * 0.5f * v18 + v13 + 1.0f) * 0.5f; - i.field_0[5].y = v24; - i.field_0[5].z = 0.0f; - i.field_0[5].w = 3.0f; - i.field_0[6].x = v23; - i.field_0[6].y = (v14 - v21 * 0.8f + 1.0f) * 0.5f; - i.field_0[6].z = 0.0f; - i.field_0[6].w = 3.0f; - if (i.field_80 > 0.0f && false/*!i.field_90[pp->field_9F4]*/) - v2 = true; - } - - if (!v2 || reset_exposure) { - LABEL_30: - uniform_value[U_EXPOSURE] = 1; - render_texture_shader_set(&shaders_ft, SHADER_FT_EXPOSURE); - shader_local_frag_set(&shaders_ft, 1, - field_648[0].field_80, - field_648[1].field_80, - field_648[2].field_80, - field_648[3].field_80); - - int32_t index = 0; - for (struc_188& i : field_648) { - shader_local_frag_set_ptr_array(&shaders_ft, 4ULL + index * 8ULL, 8, (vec4*)field_648->field_0); - if (++index >= 4) - break; - } - - if (reset_exposure) - glViewport(0, 0, 32, 1); - else - glViewport(exp->exposure_history_counter, 0, 1, 1); - render_texture_bind(&exp->exposure_history, 0); - gl_state_active_bind_texture_2d(0, in_tex_0); - gl_state_active_bind_texture_2d(1, in_tex_1); - render_texture_draw_params(&shaders_ft, - reset_exposure ? 32 : 1, 1, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - exp->exposure_history_counter++; - exp->exposure_history_counter %= 32; - } - - uniform_value[U_EXPOSURE] = 2; - render_texture_shader_set(&shaders_ft, SHADER_FT_EXPOSURE); - - glViewport(0, 0, 1, 1); - render_texture_bind(&exp->exposure, 0); - gl_state_active_bind_texture_2d(0, exp->exposure_history.color_texture->tex); - render_texture_draw_params(&shaders_ft, 1, 1, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); -} - -void post_process_exposure_init_fbo(post_process_exposure* exp) { - if (!exp) - return; - - exp->exposure_history_counter = 0; - - if (!exp->exposure_history.color_texture) - render_texture_init(&exp->exposure_history, 32, 1, 0, GL_R32F, 0); - if (!exp->exposure.color_texture) - render_texture_init(&exp->exposure, 1, 1, 0, GL_R32F, 0); -} - -void post_process_exposure_dispose(post_process_exposure* exp) { - if (!exp) - return; - - post_process_exposure_free_fbo(exp); - free(exp); -} - -static void post_process_exposure_free_fbo(post_process_exposure* exp) { - render_texture_free(&exp->exposure_history); - render_texture_free(&exp->exposure); -} - -static void sub_1405163C0(rob_chara* rob_chr, int32_t a2, mat4* mat) { - if (a2 >= 0 && a2 <= 26) - *mat = rob_chr->data.field_1E68.field_78[a2]; -} diff --git a/src/CRE/post_process/exposure.cpp b/src/CRE/post_process/exposure.cpp new file mode 100644 index 00000000..c459e140 --- /dev/null +++ b/src/CRE/post_process/exposure.cpp @@ -0,0 +1,235 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "exposure.hpp" +#include "../fbo.hpp" +#include "../gl_state.h" +#include "../post_process.hpp" +#include "../rob.hpp" +#include "../shader_ft.h" + +static void sub_1405163C0(rob_chara* rob_chr, int32_t a2, mat4* mat); + +post_process_exposure::post_process_exposure() : exposure_history_counter(), +chara_data(), query_index() { + chara_data = new post_process_exposure_chara_data[ROB_CHARA_COUNT]; + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) { + chara_data[i].query_data[0] = -1; + chara_data[i].query_data[1] = -1; + chara_data[i].query_data[2] = -1; + } +} + +post_process_exposure::~post_process_exposure() { + if (!this) + return; + + render_texture_free(&exposure_history); + render_texture_free(&exposure); + + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) + glDeleteQueries(3, chara_data[i].query); + + delete chara_data; +} + +void post_process_exposure::get_exposure(camera* cam, int32_t render_width, + int32_t render_height, bool reset_exposure, GLuint in_tex_0, GLuint in_tex_1) { + bool v2 = false; + if (!reset_exposure) { + post_process_exposure_chara_data* v6 = chara_data; + float_t v18 = (float_t)render_height / (float_t)render_width; + float_t v20 = powf(tanf((float_t)(cam->fov_rad * 0.5f)) * 3.4f, 2.0f); + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++, v6++) { + rob_chara* rob_chr = rob_chara_array_get(i); + if (!rob_chr || ~rob_chr->data.field_0 & 1) + continue; + + vec4 v34 = { 0.05f, 0.0f, -0.04f, 1.0f }; + vec4 v33 = { 1.0f, 0.0f, 0.0f, 0.0f }; + + mat4 v44; + sub_1405163C0(rob_chr, 4, &v44); + + mat4 v42 = cam->view; + mat4 v43 = cam->projection; + mat4_mult(&v44, &v42, &v42); + mat4_mult(&v42, &v43, &v43); + + vec4 v41; + vec4 v40; + mat4_mult_vec(&v42, &v34, &v41); + mat4_mult_vec(&v43, &v34, &v40); + + float_t v12 = 1.0f / v40.w; + float_t v13 = v40.x * v12; + float_t v14 = v40.y * v12; + if (v41.z >= 0.0f || fabsf(v13) >= 1.0f || fabsf(v14) >= 1.0f) + continue; + + float_t v31 = 0.5f - (fabsf(v14) - 1.0f) * 2.5f; + float_t v32 = 0.5f - (fabsf(v13) - 1.0f) * 2.5f; + + float_t v16; + if (v32 <= v31) + v16 = v32; + else + v16 = v31; + + if (v16 > 1.0f) + v16 = 1.0f; + + vec4 v39; + mat4_mult_vec(&v42, &v33, &v39); + + float_t v17 = (v39.z + 1.0f) * 0.5f; + if (v17 > 0.8f) + v17 = 0.8f; + else if (v17 < 0.2f) + v17 = 0.0f; + + float_t v21 = 0.25f / sqrtf(powf(v20 * 3.4f, 2.0f) * (v41.z * v41.z)); + float_t v22; + if (v21 < 0.055f) { + v22 = (v21 - 0.035f) * 50.0f; + if (v22 < 0.0f) + v22 = 0.0f; + } + else if (v21 > 0.5f) { + v22 = 1.0f - (v21 - 0.5f) * 3.3333333f; + if (v22 < 0.0f) + v22 = 0.0f; + } + else + v22 = 1.0f; + + v6->field_0[0].x = (v13 + v21 * 0.0f * v18 + 1.0f) * 0.5f; + v6->field_0[0].y = (v14 + v21 * 0.1f + 1.0f) * 0.5f; + v6->field_0[0].z = 0.0f; + v6->field_0[0].w = 4.0f; + v6->field_0[1].x = (v13 + v21 * 0.0f * v18 + 1.0f) * 0.5f; + v6->field_0[1].y = (v14 - v21 * 0.3f + 1.0f) * 0.5f; + v6->field_0[1].z = 0.0f; + v6->field_0[1].w = 4.0f; + v6->field_0[2].x = (v13 + v21 * -0.5f * v18 + 1.0f) * 0.5f; + v6->field_0[2].y = (v14 + v21 * -0.5f + 1.0f) * 0.5f; + v6->field_0[2].z = 0.0f; + v6->field_0[2].w = 3.0f; + v6->field_0[3].x = (v13 - v21 * 0.6f * v18 + 1.0f) * 0.5f; + v6->field_0[3].y = (v14 - v21 * 0.1f + 1.0f) * 0.5f; + v6->field_0[3].z = 0.0f; + v6->field_0[3].w = 2.0f; + v6->field_0[4].x = (v13 + v21 * 0.6f * v18 + 1.0f) * 0.5f; + v6->field_0[4].y = (v14 - v21 * 0.1f + 1.0f) * 0.5f; + v6->field_0[4].z = 0.0f; + v6->field_0[4].w = 2.0f; + v6->field_0[5].x = (v13 + v21 * 0.5f * v18 + 1.0f) * 0.5f; + v6->field_0[5].y = (v14 + v21 * -0.5f + 1.0f) * 0.5f; + v6->field_0[5].z = 0.0f; + v6->field_0[5].w = 3.0f; + v6->field_0[6].x = (v13 + v21 * 0.0f * v18 + 1.0f) * 0.5f; + v6->field_0[6].y = (v14 - v21 * 0.8f + 1.0f) * 0.5f; + v6->field_0[6].z = 0.0f; + v6->field_0[6].w = 3.0f; + v6->field_80 = v16 * 1.6f * v17 * v22; + if (v6->field_80 > 0.0f && !v6->query_data[query_index]) + v2 = true; + } + } + + if (!v2 || reset_exposure) { + uniform_value[U_EXPOSURE] = 1; + render_texture_shader_set(&shaders_ft, SHADER_FT_EXPOSURE); + shaders_ft.local_frag_set(1, + chara_data[0].field_80, + chara_data[1].field_80, + chara_data[2].field_80, + chara_data[3].field_80); + + post_process_exposure_chara_data* v27 = chara_data; + for (int32_t i = 0; i < 4 && i < ROB_CHARA_COUNT; i++, v27++) + shaders_ft.local_frag_set(4ULL + (size_t)i * 8, 8, v27->field_0); + + if (reset_exposure) + glViewport(0, 0, 32, 1); + else + glViewport(exposure_history_counter, 0, 1, 1); + render_texture_bind(&exposure_history, 0); + gl_state_active_bind_texture_2d(0, in_tex_0); + gl_state_active_bind_texture_2d(1, in_tex_1); + render_texture_draw_params(&shaders_ft, + reset_exposure ? 32 : 1, 1, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + exposure_history_counter++; + exposure_history_counter %= 32; + } + + glViewport(0, 0, 1, 1); + render_texture_bind(&exposure, 0); + gl_state_active_bind_texture_2d(0, exposure_history.color_texture->tex); + render_texture_draw_params(&shaders_ft, 1, 1, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); +} + +void post_process_exposure::get_exposure_chara_data(void* pp, camera* cam) { + shader::unbind(); + + gl_state_set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + gl_state_set_depth_mask(GL_FALSE); + + post_process_exposure_chara_data* v3 = chara_data; + int32_t v4 = query_index++ % 3; + int32_t v7 = (v4 + 2) % 3; + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++, v3++) { + rob_chara* rob_chr = rob_chara_array_get(i); + if (!rob_chr || ~rob_chr->data.field_0 & 1) + continue; + + float_t max_face_depth = rob_chr->get_max_face_depth(); + + mat4 mat = mat4_identity; + sub_1405163C0(rob_chr, 4, &mat); + mat4_mult(&mat, &cam->view, &mat); + mat4_translate_mult(&mat, max_face_depth + 0.1f, 0.0f, -0.06f, &mat); + mat4_clear_rot(&mat, &mat); + mat4_mult( &mat, &cam->projection,&mat); + + ((post_process*)pp)->draw_query_samples(v3->query[v7], 0.0035f, mat); + + if (v3->query_data[v7] == -1) + v3->query_data[v7] = 0; + + if (v3->query_data[v4] != -1) { + int32_t v14 = 0; + glGetQueryObjectiv(v3->query[v4], GL_QUERY_RESULT_AVAILABLE, &v14); + if (v14) + glGetQueryObjectuiv(v3->query[v4], GL_QUERY_RESULT, v3->query_data); + else + v3->query_data[v4] = 0; + } + } + + gl_state_set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + gl_state_set_depth_mask(GL_TRUE); +} + +void post_process_exposure::init_fbo() { + if (!this) + return; + + exposure_history_counter = 0; + + if (!exposure_history.color_texture) + render_texture_init(&exposure_history, 32, 1, 0, GL_R32F, 0); + if (!exposure.color_texture) + render_texture_init(&exposure, 1, 1, 0, GL_R32F, 0); + + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) + if (!chara_data[i].query[0]) + glGenQueries(3, chara_data[i].query); +} + +static void sub_1405163C0(rob_chara* rob_chr, int32_t a2, mat4* mat) { + if (a2 >= 0 && a2 <= 26) + *mat = rob_chr->data.field_1E68.field_78[a2]; +} diff --git a/src/CRE/post_process/exposure.h b/src/CRE/post_process/exposure.h deleted file mode 100644 index 4c25e733..00000000 --- a/src/CRE/post_process/exposure.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "../../KKdLib/default.h" -#include "../../KKdLib/vec.h" -#include "../camera.h" -#include "../render_texture.h" -#include "../shared.h" - -struct post_process_exposure { - render_texture exposure_history; - render_texture exposure; - int32_t exposure_history_counter; - - post_process_exposure(); -}; - -extern post_process_exposure* post_process_exposure_init(); -extern void post_process_get_exposure(post_process_exposure* exp, camera* cam, int32_t render_width, - int32_t render_height, bool reset_exposure, GLuint in_tex_0, GLuint in_tex_1); -extern void post_process_exposure_init_fbo(post_process_exposure* exp); -extern void post_process_exposure_dispose(post_process_exposure* exp); diff --git a/src/CRE/post_process/exposure.hpp b/src/CRE/post_process/exposure.hpp new file mode 100644 index 00000000..bbce8009 --- /dev/null +++ b/src/CRE/post_process/exposure.hpp @@ -0,0 +1,35 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../../KKdLib/default.hpp" +#include "../../KKdLib/vec.hpp" +#include "../camera.h" +#include "../render_texture.h" +#include "../shared.h" + +struct post_process_exposure_chara_data { + vec4 field_0[8]; + float_t field_80; + GLuint query[3]; + GLuint query_data[3]; +}; + +struct post_process_exposure { + render_texture exposure_history; + render_texture exposure; + int32_t exposure_history_counter; + post_process_exposure_chara_data* chara_data; + int32_t query_index; + + post_process_exposure(); + virtual ~post_process_exposure(); + + void get_exposure(camera* cam, int32_t render_width, int32_t render_height, + bool reset_exposure, GLuint in_tex_0, GLuint in_tex_1); + void get_exposure_chara_data(void* pp, camera* cam); + void init_fbo(); +}; diff --git a/src/CRE/post_process/tone_map.c b/src/CRE/post_process/tone_map.c deleted file mode 100644 index f6414d25..00000000 --- a/src/CRE/post_process/tone_map.c +++ /dev/null @@ -1,436 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "tone_map.h" -#include "../fbo.hpp" -#include "../gl_state.h" -#include "../post_process.hpp" -#include "../shader_ft.h" - -static void post_process_tone_map_free_fbo(post_process_tone_map* tm); -static void post_process_tone_map_calculate_data(post_process_tone_map* tm); -static void post_process_tone_map_calculate_tex(post_process_tone_map* tm); - -post_process_tone_map* post_process_tone_map_init() { - post_process_tone_map* exp = force_malloc_s(post_process_tone_map, 1); - return exp; -} - -void post_process_apply_tone_map(post_process_tone_map* tm, - render_texture* in_tex, texture* light_proj_tex, texture* back_2d_tex, - render_texture* rt, render_texture* buf_rt, render_texture* contour_rt, - GLuint in_tex_0, GLuint in_tex_1, int32_t npr_param) { - if (!tm) - return; - - if (tm->data.update) { - post_process_tone_map_calculate_data(tm); - tm->data.update = false; - } - - if (tm->data.update_tex) { - post_process_tone_map_calculate_tex(tm); - - glBindTexture(GL_TEXTURE_1D, tm->tone_map); - glTexImage1D(GL_TEXTURE_1D, 0, GL_RG16F, - 16 * POST_PROCESS_TONE_MAP_SAT_GAMMA_SAMPLES, 0, GL_RG, GL_FLOAT, tm->data.tex); - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - - GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteriv(GL_TEXTURE_1D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - glBindTexture(GL_TEXTURE_1D, 0); - tm->data.update_tex = false; - } - - mat4 lens_flare_mat; - mat4 lens_shaft_mat; - mat4_scale(1.0f, (float_t)rt->color_texture->height - / (float_t)rt->color_texture->width, 1.0f, &lens_flare_mat); - mat4_scale(1.0f, (float_t)rt->color_texture->height - / (float_t)rt->color_texture->width, 1.0f, &lens_shaft_mat); - - uniform_value[U16] = 0; - uniform_value[U_TONE_MAP] = (int32_t)tm->data.tone_map_method; - uniform_value[U_FLARE] = 0; - uniform_value[U_SCENE_FADE] = tm->data.scene_fade.w > 0.009999999f ? 1 : 0; - uniform_value[U_AET_BACK] = 0; - uniform_value[U_LIGHT_PROJ] = 0; - uniform_value[U_NPR] = 0; - uniform_value[U25] = 0; - - glViewport(0, 0, rt->color_texture->width, rt->color_texture->height); - render_texture_bind(buf_rt, 0); - shader_set(&shaders_ft, SHADER_FT_TONEMAP); - shader_state_matrix_set_texture(&shaders_ft, 4, &lens_flare_mat); - shader_state_matrix_set_texture(&shaders_ft, 5, &lens_shaft_mat); - shader_local_vert_set_ptr(&shaders_ft, 1, &tm->shader_data.p_exposure); - shader_local_frag_set_ptr(&shaders_ft, 1, &tm->shader_data.p_flare_coef); - shader_local_frag_set_ptr(&shaders_ft, 2, &tm->shader_data.p_fade_color); - shader_local_frag_set_ptr(&shaders_ft, 4, &tm->shader_data.p_tone_scale); - shader_local_frag_set_ptr(&shaders_ft, 5, &tm->shader_data.p_tone_offset); - shader_local_frag_set_ptr(&shaders_ft, 6, &tm->shader_data.p_fade_func); - shader_local_frag_set_ptr(&shaders_ft, 7, &tm->shader_data.p_inv_tone); - gl_state_active_bind_texture_2d(0, in_tex->color_texture->tex); - gl_state_active_bind_texture_2d(1, in_tex_0); - gl_state_active_bind_texture_2d(2, 0); - gl_state_active_texture(2); - glBindTexture(GL_TEXTURE_1D, tm->tone_map); - gl_state_active_bind_texture_2d(3, in_tex_1); - if (uniform_value[U_LIGHT_PROJ] && light_proj_tex) - gl_state_active_bind_texture_2d(6, light_proj_tex->tex); - else if (uniform_value[U_AET_BACK] && back_2d_tex) - gl_state_active_bind_texture_2d(6, back_2d_tex->tex); - if (npr_param == 1) { - gl_state_active_bind_texture_2d(16, contour_rt->color_texture->tex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - gl_state_active_bind_texture_2d(17, contour_rt->depth_texture->tex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - gl_state_active_bind_texture_2d(14, rt->depth_texture->tex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - } - render_texture_draw_custom(&shaders_ft); - gl_state_active_texture(2); - glBindTexture(GL_TEXTURE_1D, 0); - uniform_value[U16] = 1; - - fbo::blit(buf_rt->fbos[0], rt->fbos[0], - 0, 0, buf_rt->color_texture->width, buf_rt->color_texture->height, - 0, 0, rt->color_texture->width, rt->color_texture->height, GL_COLOR_BUFFER_BIT, GL_LINEAR); -} - -void post_process_tone_map_init_fbo(post_process_tone_map* tm) { - if (!tm) - return; - - if (!tm->tone_map) - glGenTextures(1, &tm->tone_map); -} - -void post_process_tone_map_dispose(post_process_tone_map* tm) { - if (!tm) - return; - - post_process_tone_map_free_fbo(tm); - free(tm); -} - -static void post_process_tone_map_free_fbo(post_process_tone_map* tm) { - glDeleteTextures(1, &tm->tone_map); -} - -void post_process_tone_map_initialize_data(post_process_tone_map* tm, float_t exposure, bool auto_exposure, - float_t gamma, int32_t saturate_power, float_t saturate_coeff, - const vec3* scene_fade, float_t scene_fade_alpha, int32_t scene_fade_blend_func, - const vec3* tone_trans_start, const vec3* tone_trans_end, tone_map_method tone_map_method) { - post_process_tone_map_initialize_rate(tm, exposure, auto_exposure, 1.0f, - gamma, saturate_power, saturate_coeff, scene_fade, scene_fade_alpha, scene_fade_blend_func, - tone_trans_start, tone_trans_end, tone_map_method); -} - -void post_process_tone_map_initialize_rate(post_process_tone_map* tm, float_t exposure, bool auto_exposure, - float_t gamma, float_t gamma_rate, int32_t saturate_power, float_t saturate_coeff, - const vec3* scene_fade, float_t scene_fade_alpha, int32_t scene_fade_blend_func, - const vec3* tone_trans_start, const vec3* tone_trans_end, tone_map_method tone_map_method) { - tm->data.exposure = clamp(exposure, 0.0f, 4.0f); - tm->data.auto_exposure = auto_exposure; - tm->data.gamma = clamp(gamma, 0.2f, 2.2f); - tm->data.gamma_rate = clamp(gamma_rate, 0.5f, 2.0f); - tm->data.saturate_power = clamp(saturate_power, 1, 6); - tm->data.saturate_coeff = clamp(saturate_coeff, 0.0f, 1.0f); - tm->data.scene_fade.x = clamp(scene_fade->x, 0.0f, 1.0f); - tm->data.scene_fade.y = clamp(scene_fade->y, 0.0f, 1.0f); - tm->data.scene_fade.z = clamp(scene_fade->z, 0.0f, 1.0f); - tm->data.scene_fade.w = clamp(scene_fade_alpha, 0.0f, 1.0f); - tm->data.scene_fade_blend_func = clamp(scene_fade_blend_func, 0, 2); - tm->data.tone_trans_start.x = clamp(tone_trans_start->x, 0.0f, 1.0f); - tm->data.tone_trans_start.y = clamp(tone_trans_start->y, 0.0f, 1.0f); - tm->data.tone_trans_start.z = clamp(tone_trans_start->z, 0.0f, 1.0f); - tm->data.tone_trans_end.x = clamp(tone_trans_end->x, 0.0f, 1.0f); - tm->data.tone_trans_end.y = clamp(tone_trans_end->y, 0.0f, 1.0f); - tm->data.tone_trans_end.z = clamp(tone_trans_end->z, 0.0f, 1.0f); - tm->data.tone_map_method = clamp(tone_map_method, TONE_MAP_YCC_EXPONENT, TONE_MAP_RGB_LINEAR2); - tm->data.update_tex = false; - tm->data.update = true; - tm->data.update_tex = true; -} - -inline float_t post_process_tone_map_get_exposure(post_process_tone_map* tm) { - return tm->data.exposure; -} - -inline void post_process_tone_map_set_exposure(post_process_tone_map* tm, float_t value) { - value = clamp(value, 0.0f, 4.0f); - if (value != tm->data.exposure) { - tm->data.exposure = value; - tm->data.update = true; - tm->data.update_tex = true; - } -} - -inline bool post_process_tone_map_get_auto_exposure(post_process_tone_map* tm) { - return tm->data.auto_exposure; -} - -inline void post_process_tone_map_set_auto_exposure(post_process_tone_map* tm, bool value) { - if (value != tm->data.auto_exposure) { - tm->data.auto_exposure = value; - tm->data.update = true; - tm->data.update_tex = true; - } -} - -inline float_t post_process_tone_map_get_gamma(post_process_tone_map* tm) { - return tm->data.gamma; -} - -inline void post_process_tone_map_set_gamma(post_process_tone_map* tm, float_t value) { - value = clamp(value, 0.2f, 2.2f); - if (value != tm->data.gamma) { - tm->data.gamma = value; - tm->data.update = true; - tm->data.update_tex = true; - } -} - -inline float_t post_process_tone_map_get_gamma_rate(post_process_tone_map* tm) { - return tm->data.gamma_rate; -} - -inline void post_process_tone_map_set_gamma_rate(post_process_tone_map* tm, float_t value) { - value = clamp(value, 0.5f, 2.0f); - if (value != tm->data.gamma_rate) { - tm->data.gamma_rate = value; - tm->data.update_tex = true; - } -} - -inline int32_t post_process_tone_map_get_saturate_power(post_process_tone_map* tm) { - return tm->data.saturate_power; -} - -inline void post_process_tone_map_set_saturate_power(post_process_tone_map* tm, int32_t value) { - value = clamp(value, 1, 6); - if (value != tm->data.saturate_power) { - tm->data.saturate_power = value; - tm->data.update_tex = true; - } -} - -inline float_t post_process_tone_map_get_saturate_coeff(post_process_tone_map* tm) { - return tm->data.saturate_coeff; -} - -inline void post_process_tone_map_set_saturate_coeff(post_process_tone_map* tm, float_t value) { - value = clamp(value, 0.0f, 1.0f); - if (value != tm->data.saturate_coeff) { - tm->data.saturate_coeff = value; - tm->data.update_tex = true; - } -} - -inline void post_process_tone_map_get_scene_fade(post_process_tone_map* tm, vec4* value) { - *value = tm->data.scene_fade; -} - -inline void post_process_tone_map_set_scene_fade(post_process_tone_map* tm, const vec4* value) { - vec4 temp; - temp.x = clamp(value->x, 0.0f, 1.0f); - temp.y = clamp(value->y, 0.0f, 1.0f); - temp.z = clamp(value->z, 0.0f, 1.0f); - temp.w = clamp(value->w, 0.0f, 1.0f); - if (temp.x != tm->data.scene_fade.x - || temp.y != tm->data.scene_fade.y - || temp.z != tm->data.scene_fade.z - || temp.w != tm->data.scene_fade.w) { - tm->data.scene_fade = temp; - tm->data.update = true; - } -} - -inline void post_process_tone_map_get_scene_fade_color(post_process_tone_map* tm, vec3* value) { - *value = *(vec3*)&tm->data.scene_fade; -} - -inline void post_process_tone_map_set_scene_fade_color(post_process_tone_map* tm, const vec3* value) { - vec3 temp; - temp.x = clamp(value->x, 0.0f, 1.0f); - temp.y = clamp(value->y, 0.0f, 1.0f); - temp.z = clamp(value->z, 0.0f, 1.0f); - if (temp.x != tm->data.scene_fade.x - || temp.y != tm->data.scene_fade.y - || temp.z != tm->data.scene_fade.z) { - *(vec3*)&tm->data.scene_fade = temp; - tm->data.update = true; - } -} - -inline float_t post_process_tone_map_get_scene_fade_alpha(post_process_tone_map* tm) { - return tm->data.scene_fade.w; -} - -inline void post_process_tone_map_set_scene_fade_alpha(post_process_tone_map* tm, float_t value) { - value = clamp(value, 0.0f, 1.0f); - if (value != tm->data.scene_fade.w) { - tm->data.scene_fade.w = value; - tm->data.update = true; - } -} - -inline int32_t post_process_tone_map_get_scene_fade_blend_func(post_process_tone_map* tm) { - return tm->data.scene_fade_blend_func; -} - -inline void post_process_tone_map_set_scene_fade_blend_func(post_process_tone_map* tm, int32_t value) { - value = clamp(value, 0, 2); - if (value != tm->data.scene_fade_blend_func) { - tm->data.scene_fade_blend_func = value; - tm->data.update = true; - } -} - -inline void post_process_tone_map_get_tone_trans_start(post_process_tone_map* tm, vec3* value) { - *value = tm->data.tone_trans_start; -} - -inline void post_process_tone_map_set_tone_trans_start(post_process_tone_map* tm, const vec3* value) { - vec3 temp; - temp.x = clamp(value->x, 0.0f, 1.0f); - temp.y = clamp(value->y, 0.0f, 1.0f); - temp.z = clamp(value->z, 0.0f, 1.0f); - if (temp.x != tm->data.tone_trans_start.x - || temp.y != tm->data.tone_trans_start.y - || temp.z != tm->data.tone_trans_start.z) { - tm->data.tone_trans_start = temp; - tm->data.update = true; - } -} - -inline void post_process_tone_map_get_tone_trans_end(post_process_tone_map* tm, vec3* value) { - *value = tm->data.tone_trans_end; -} - -inline void post_process_tone_map_set_tone_trans_end(post_process_tone_map* tm, const vec3* value) { - vec3 temp; - temp.x = clamp(value->x, 0.009999999776f, 1.0f); - temp.y = clamp(value->y, 0.009999999776f, 1.0f); - temp.z = clamp(value->z, 0.009999999776f, 1.0f); - if (temp.x != tm->data.tone_trans_end.x - || temp.y != tm->data.tone_trans_end.y - || temp.z != tm->data.tone_trans_end.z) { - tm->data.tone_trans_end = temp; - tm->data.update = true; - } -} - -inline tone_map_method post_process_tone_map_get_tone_map_method(post_process_tone_map* tm) { - return tm->data.tone_map_method; -} - -inline void post_process_tone_map_set_tone_map_method(post_process_tone_map* tm, tone_map_method value) { - value = clamp(value, TONE_MAP_YCC_EXPONENT, TONE_MAP_RGB_LINEAR2); - if (value != tm->data.tone_map_method) { - tm->data.tone_map_method = value; - tm->data.update = true; - } -} - -inline float_t post_process_tone_map_get_lens_flare(post_process_tone_map* tm) { - return tm->data.lens_flare; -} - -inline void post_process_tone_map_set_lens_flare(post_process_tone_map* tm, float_t value) { - value = clamp(value, 0.0f, 1.0f); - if (value != tm->data.lens_flare) { - tm->data.lens_flare = value; - tm->data.update = true; - } -} - -inline float_t post_process_tone_map_get_lens_shaft(post_process_tone_map* tm) { - return tm->data.lens_shaft; -} - -inline void post_process_tone_map_set_lens_shaft(post_process_tone_map* tm, float_t value) { - value = clamp(value, 0.0f, 1.0f); - if (value != tm->data.lens_shaft) { - tm->data.lens_shaft = value; - tm->data.update = true; - } -} - -inline float_t post_process_tone_map_get_lens_ghost(post_process_tone_map* tm) { - return tm->data.lens_ghost; -} - -inline void post_process_tone_map_set_lens_ghost(post_process_tone_map* tm, float_t value) { - tm->data.lens_ghost = clamp(value, 0.0f, 1.0f); -} - -static void post_process_tone_map_calculate_data(post_process_tone_map* tm) { - vec3 tone_trans, tone_trans_scale, tone_trans_offset; - vec3_sub(tm->data.tone_trans_end, tm->data.tone_trans_start, tone_trans); - vec3_rcp(tone_trans, tone_trans_scale); - vec3_mult(tone_trans_scale, tm->data.tone_trans_start, tone_trans_offset); - vec3_negate(tone_trans_offset, tone_trans_offset); - - post_process_tone_map_shader_data* v = &tm->shader_data; - v->p_exposure.x = tm->data.exposure; - v->p_exposure.y = 0.0625f; - v->p_exposure.z = tm->data.exposure * 0.5f; - v->p_exposure.w = tm->data.auto_exposure ? 1.0f : 0.0f; - v->p_flare_coef.x = (tm->data.lens_flare * 2.0f) - * (tm->data.lens_flare_appear_power + tm->data.lens_flare_power); - v->p_flare_coef.y = tm->data.lens_shaft * 2.0f; - v->p_flare_coef.z = 0.0f; - v->p_flare_coef.w = 0.0f; - v->p_fade_color = tm->data.scene_fade; - if (tm->data.scene_fade_blend_func == 1 || tm->data.scene_fade_blend_func == 2) - vec3_mult_scalar(*(vec3*)&v->p_fade_color, v->p_fade_color.w, *(vec3*)&v->p_fade_color); - v->p_tone_scale.x = tone_trans_scale.x; - v->p_tone_scale.y = tone_trans_scale.y; - v->p_tone_scale.z = tone_trans_scale.z; - v->p_tone_offset.x = tone_trans_offset.x; - v->p_tone_offset.y = tone_trans_offset.y; - v->p_tone_offset.z = tone_trans_offset.z; - v->p_fade_func.x = (float_t)tm->data.scene_fade_blend_func; - v->p_inv_tone.x = tm->data.gamma > 0.0f ? 2.0f / (tm->data.gamma * 3.0f) : 0.0f; -} - -static void post_process_tone_map_calculate_tex(post_process_tone_map* tm) { - const float_t post_process_tone_map__scale = (float_t)(1.0 / (double_t)POST_PROCESS_TONE_MAP_SAT_GAMMA_SAMPLES); - const int32_t post_process_tone_map__size = 16 * POST_PROCESS_TONE_MAP_SAT_GAMMA_SAMPLES; - - int32_t i, j; - int32_t saturate_power; - float_t saturate_coeff; - - vec2* tex = tm->data.tex; - float_t gamma_power, gamma, saturation; - gamma_power = tm->data.gamma * tm->data.gamma_rate * 1.5f; - saturate_power = tm->data.saturate_power; - saturate_coeff = tm->data.saturate_coeff; - - tex[0].x = 0.0f; - tex[0].y = 0.0f; - for (i = 1; i < post_process_tone_map__size; i++) { - gamma = powf(1.0f - expf(-i * post_process_tone_map__scale), gamma_power); - saturation = gamma * 2.0f - 1.0f; - for (j = 0; j < saturate_power; j++) { - saturation *= saturation; - saturation *= saturation; - saturation *= saturation; - saturation *= saturation; - } - - tex[i].x = gamma; - tex[i].y = gamma * saturate_coeff - * ((float_t)POST_PROCESS_TONE_MAP_SAT_GAMMA_SAMPLES / (float_t)i) * (1.0f - saturation); - } -} diff --git a/src/CRE/post_process/tone_map.cpp b/src/CRE/post_process/tone_map.cpp new file mode 100644 index 00000000..d2ca026a --- /dev/null +++ b/src/CRE/post_process/tone_map.cpp @@ -0,0 +1,429 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "tone_map.hpp" +#include "../fbo.hpp" +#include "../gl_state.h" +#include "../post_process.hpp" +#include "../shader_ft.h" + +static void post_process_tone_map_calculate_data(post_process_tone_map* tm); +static void post_process_tone_map_calculate_tex(post_process_tone_map* tm); + +post_process_tone_map::post_process_tone_map() : data(), shader_data(), tone_map() { + +} + +post_process_tone_map::~post_process_tone_map() { + if (!this) + return; + + glDeleteTextures(1, &tone_map); +} + +void post_process_tone_map::apply(render_texture* in_tex, texture* light_proj_tex, texture* back_2d_tex, + render_texture* rt, render_texture* buf_rt, render_texture* contour_rt, + GLuint in_tex_0, GLuint in_tex_1, int32_t npr_param) { + if (!this) + return; + + if (data.update) { + post_process_tone_map_calculate_data(this); + data.update = false; + } + + if (data.update_tex) { + post_process_tone_map_calculate_tex(this); + + glBindTexture(GL_TEXTURE_1D, tone_map); + glTexImage1D(GL_TEXTURE_1D, 0, GL_RG16F, + 16 * POST_PROCESS_TONE_MAP_SAT_GAMMA_SAMPLES, 0, GL_RG, GL_FLOAT, data.tex); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + + GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteriv(GL_TEXTURE_1D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); + glBindTexture(GL_TEXTURE_1D, 0); + data.update_tex = false; + } + + mat4 lens_flare_mat; + mat4 lens_shaft_mat; + mat4_scale(1.0f, (float_t)rt->color_texture->height + / (float_t)rt->color_texture->width, 1.0f, &lens_flare_mat); + mat4_scale(1.0f, (float_t)rt->color_texture->height + / (float_t)rt->color_texture->width, 1.0f, &lens_shaft_mat); + + uniform_value[U16] = 0; + uniform_value[U_TONE_MAP] = (int32_t)data.tone_map_method; + uniform_value[U_FLARE] = 0; + uniform_value[U_SCENE_FADE] = data.scene_fade.w > 0.009999999f ? 1 : 0; + uniform_value[U_AET_BACK] = 0; + uniform_value[U_LIGHT_PROJ] = 0; + uniform_value[U_NPR] = 0; + uniform_value[U25] = 0; + + glViewport(0, 0, rt->color_texture->width, rt->color_texture->height); + render_texture_bind(buf_rt, 0); + shaders_ft.set(SHADER_FT_TONEMAP); + shaders_ft.state_matrix_set_texture(4, lens_flare_mat); + shaders_ft.state_matrix_set_texture(5, lens_shaft_mat); + shaders_ft.local_vert_set(1, shader_data.p_exposure); + shaders_ft.local_frag_set(1, shader_data.p_flare_coef); + shaders_ft.local_frag_set(2, shader_data.p_fade_color); + shaders_ft.local_frag_set(4, shader_data.p_tone_scale); + shaders_ft.local_frag_set(5, shader_data.p_tone_offset); + shaders_ft.local_frag_set(6, shader_data.p_fade_func); + shaders_ft.local_frag_set(7, shader_data.p_inv_tone); + gl_state_active_bind_texture_2d(0, in_tex->color_texture->tex); + gl_state_active_bind_texture_2d(1, in_tex_0); + gl_state_active_bind_texture_2d(2, 0); + gl_state_active_texture(2); + glBindTexture(GL_TEXTURE_1D, tone_map); + gl_state_active_bind_texture_2d(3, in_tex_1); + if (uniform_value[U_LIGHT_PROJ] && light_proj_tex) + gl_state_active_bind_texture_2d(6, light_proj_tex->tex); + else if (uniform_value[U_AET_BACK] && back_2d_tex) + gl_state_active_bind_texture_2d(6, back_2d_tex->tex); + if (npr_param == 1) { + gl_state_active_bind_texture_2d(16, contour_rt->color_texture->tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + gl_state_active_bind_texture_2d(17, contour_rt->depth_texture->tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + gl_state_active_bind_texture_2d(14, rt->depth_texture->tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + render_texture_draw_custom(&shaders_ft); + gl_state_active_texture(2); + glBindTexture(GL_TEXTURE_1D, 0); + uniform_value[U16] = 1; + + fbo::blit(buf_rt->fbos[0], rt->fbos[0], + 0, 0, buf_rt->color_texture->width, buf_rt->color_texture->height, + 0, 0, rt->color_texture->width, rt->color_texture->height, GL_COLOR_BUFFER_BIT, GL_LINEAR); +} + +void post_process_tone_map::init_fbo() { + if (!this) + return; + + if (!tone_map) + glGenTextures(1, &tone_map); +} + +void post_process_tone_map::initialize_data(float_t exposure, bool auto_exposure, + float_t gamma, int32_t saturate_power, float_t saturate_coeff, + const vec3& scene_fade_color, float_t scene_fade_alpha, int32_t scene_fade_blend_func, + const vec3& tone_trans_start, const vec3& tone_trans_end, tone_map_method tone_map_method) { + initialize_data(exposure, auto_exposure, 1.0f, gamma, saturate_power, saturate_coeff, + scene_fade_color, scene_fade_alpha, scene_fade_blend_func, + tone_trans_start, tone_trans_end, tone_map_method); +} + +void post_process_tone_map::initialize_data(float_t exposure, bool auto_exposure, + float_t gamma, float_t gamma_rate, int32_t saturate_power, float_t saturate_coeff, + const vec3& scene_fade_color, float_t scene_fade_alpha, int32_t scene_fade_blend_func, + const vec3& tone_trans_start, const vec3& tone_trans_end, tone_map_method tone_map_method) { + data.exposure = clamp(exposure, 0.0f, 4.0f); + data.auto_exposure = auto_exposure; + data.gamma = clamp(gamma, 0.2f, 2.2f); + data.gamma_rate = clamp(gamma_rate, 0.5f, 2.0f); + data.saturate_power = clamp(saturate_power, 1, 6); + data.saturate_coeff = clamp(saturate_coeff, 0.0f, 1.0f); + data.scene_fade.x = clamp(scene_fade_color.x, 0.0f, 1.0f); + data.scene_fade.y = clamp(scene_fade_color.y, 0.0f, 1.0f); + data.scene_fade.z = clamp(scene_fade_color.z, 0.0f, 1.0f); + data.scene_fade.w = clamp(scene_fade_alpha, 0.0f, 1.0f); + data.scene_fade_blend_func = clamp(scene_fade_blend_func, 0, 2); + data.tone_trans_start.x = clamp(tone_trans_start.x, 0.0f, 1.0f); + data.tone_trans_start.y = clamp(tone_trans_start.y, 0.0f, 1.0f); + data.tone_trans_start.z = clamp(tone_trans_start.z, 0.0f, 1.0f); + data.tone_trans_end.x = clamp(tone_trans_end.x, 0.0f, 1.0f); + data.tone_trans_end.y = clamp(tone_trans_end.y, 0.0f, 1.0f); + data.tone_trans_end.z = clamp(tone_trans_end.z, 0.0f, 1.0f); + data.tone_map_method = clamp(tone_map_method, TONE_MAP_YCC_EXPONENT, TONE_MAP_RGB_LINEAR2); + data.update_tex = false; + data.update = true; + data.update_tex = true; +} + +bool post_process_tone_map::get_auto_exposure() { + return data.auto_exposure; +} + +void post_process_tone_map::set_auto_exposure(bool value) { + if (value != data.auto_exposure) { + data.auto_exposure = value; + data.update = true; + data.update_tex = true; + } +} + +float_t post_process_tone_map::get_exposure() { + return data.exposure; +} + +void post_process_tone_map::set_exposure(float_t value) { + value = clamp(value, 0.0f, 4.0f); + if (value != data.exposure) { + data.exposure = value; + data.update = true; + data.update_tex = true; + } +} + +float_t post_process_tone_map::get_gamma() { + return data.gamma; +} + +void post_process_tone_map::set_gamma(float_t value) { + value = clamp(value, 0.2f, 2.2f); + if (value != data.gamma) { + data.gamma = value; + data.update = true; + data.update_tex = true; + } +} + +float_t post_process_tone_map::get_gamma_rate() { + return data.gamma_rate; +} + +void post_process_tone_map::set_gamma_rate(float_t value) { + value = clamp(value, 0.5f, 2.0f); + if (value != data.gamma_rate) { + data.gamma_rate = value; + data.update_tex = true; + } +} + +float_t post_process_tone_map::get_lens_flare() { + return data.lens_flare; +} + +void post_process_tone_map::set_lens_flare(float_t value) { + value = clamp(value, 0.0f, 1.0f); + if (value != data.lens_flare) { + data.lens_flare = value; + data.update = true; + } +} + +float_t post_process_tone_map::get_lens_ghost() { + return data.lens_ghost; +} + +void post_process_tone_map::set_lens_ghost(float_t value) { + data.lens_ghost = clamp(value, 0.0f, 1.0f); +} + +float_t post_process_tone_map::get_lens_shaft() { + return data.lens_shaft; +} + +void post_process_tone_map::set_lens_shaft(float_t value) { + value = clamp(value, 0.0f, 1.0f); + if (value != data.lens_shaft) { + data.lens_shaft = value; + data.update = true; + } +} + +float_t post_process_tone_map::get_saturate_coeff() { + return data.saturate_coeff; +} + +void post_process_tone_map::set_saturate_coeff(float_t value) { + value = clamp(value, 0.0f, 1.0f); + if (value != data.saturate_coeff) { + data.saturate_coeff = value; + data.update_tex = true; + } +} + +int32_t post_process_tone_map::get_saturate_power() { + return data.saturate_power; +} + +void post_process_tone_map::set_saturate_power(int32_t value) { + value = clamp(value, 1, 6); + if (value != data.saturate_power) { + data.saturate_power = value; + data.update_tex = true; + } +} + +vec4 post_process_tone_map::get_scene_fade() { + return data.scene_fade; +} + +void post_process_tone_map::set_scene_fade(const vec4& value) { + vec4 temp; + temp.x = clamp(value.x, 0.0f, 1.0f); + temp.y = clamp(value.y, 0.0f, 1.0f); + temp.z = clamp(value.z, 0.0f, 1.0f); + temp.z = clamp(value.w, 0.0f, 1.0f); + if (memcmp(&temp, &data.scene_fade, sizeof(vec4))) { + data.scene_fade = temp; + data.update = true; + } +} + +float_t post_process_tone_map::get_scene_fade_alpha() { + return data.scene_fade.w; +} + +void post_process_tone_map::set_scene_fade_alpha(float_t value) { + value = clamp(value, 0.0f, 1.0f); + if (value != data.scene_fade.w) { + data.scene_fade.w = value; + data.update = true; + } +} + +int32_t post_process_tone_map::get_scene_fade_blend_func() { + return data.scene_fade_blend_func; +} + +void post_process_tone_map::set_scene_fade_blend_func(int32_t value) { + value = clamp(value, 0, 2); + if (value != data.scene_fade_blend_func) { + data.scene_fade_blend_func = value; + data.update = true; + } +} + +vec3 post_process_tone_map::get_scene_fade_color() { + return *(vec3*)&data.scene_fade; +} + +void post_process_tone_map::set_scene_fade_color(const vec3& value) { + vec3 temp; + temp.x = clamp(value.x, 0.0f, 1.0f); + temp.y = clamp(value.y, 0.0f, 1.0f); + temp.z = clamp(value.z, 0.0f, 1.0f); + if (memcmp(&temp, &data.scene_fade, sizeof(vec3))) { + *(vec3*)&data.scene_fade = temp; + data.update = true; + } +} + +tone_map_method post_process_tone_map::get_tone_map_method() { + return data.tone_map_method; +} + +void post_process_tone_map::set_tone_map_method(tone_map_method value) { + value = clamp(value, TONE_MAP_YCC_EXPONENT, TONE_MAP_RGB_LINEAR2); + if (value != data.tone_map_method) { + data.tone_map_method = value; + data.update = true; + } +} + +void post_process_tone_map::get_tone_trans(vec3& start, vec3& end) { + start = get_tone_trans_start(); + end = get_tone_trans_start(); +} + +void post_process_tone_map::set_tone_trans(const vec3& start, const vec3& end) { + set_tone_trans_start(start); + set_tone_trans_end(end); +} + +vec3 post_process_tone_map::get_tone_trans_end() { + return data.tone_trans_end; +} + +void post_process_tone_map::set_tone_trans_end(const vec3& value) { + vec3 temp; + temp.x = clamp(value.x, 0.0f, 1.0f); + temp.y = clamp(value.y, 0.0f, 1.0f); + temp.z = clamp(value.z, 0.0f, 1.0f); + if (memcmp(&temp, &data.tone_trans_end, sizeof(vec3))) { + data.tone_trans_end = temp; + data.update = true; + } +} + +vec3 post_process_tone_map::get_tone_trans_start() { + return data.tone_trans_start; +} + +void post_process_tone_map::set_tone_trans_start(const vec3& value) { + vec3 temp; + temp.x = clamp(value.x, 0.0f, 1.0f); + temp.y = clamp(value.y, 0.0f, 1.0f); + temp.z = clamp(value.z, 0.0f, 1.0f); + if (memcmp(&temp, &data.tone_trans_start, sizeof(vec3))) { + data.tone_trans_start = temp; + data.update = true; + } +} + +static void post_process_tone_map_calculate_data(post_process_tone_map* tm) { + vec3 tone_trans, tone_trans_scale, tone_trans_offset; + vec3_sub(tm->data.tone_trans_end, tm->data.tone_trans_start, tone_trans); + vec3_rcp(tone_trans, tone_trans_scale); + vec3_mult(tone_trans_scale, tm->data.tone_trans_start, tone_trans_offset); + vec3_negate(tone_trans_offset, tone_trans_offset); + + post_process_tone_map_shader_data* v = &tm->shader_data; + v->p_exposure.x = tm->data.exposure; + v->p_exposure.y = 0.0625f; + v->p_exposure.z = tm->data.exposure * 0.5f; + v->p_exposure.w = tm->data.auto_exposure ? 1.0f : 0.0f; + v->p_flare_coef.x = (tm->data.lens_flare * 2.0f) + * (tm->data.lens_flare_appear_power + tm->data.lens_flare_power); + v->p_flare_coef.y = tm->data.lens_shaft * 2.0f; + v->p_flare_coef.z = 0.0f; + v->p_flare_coef.w = 0.0f; + v->p_fade_color = tm->data.scene_fade; + if (tm->data.scene_fade_blend_func == 1 || tm->data.scene_fade_blend_func == 2) + vec3_mult_scalar(*(vec3*)&v->p_fade_color, v->p_fade_color.w, *(vec3*)&v->p_fade_color); + v->p_tone_scale.x = tone_trans_scale.x; + v->p_tone_scale.y = tone_trans_scale.y; + v->p_tone_scale.z = tone_trans_scale.z; + v->p_tone_offset.x = tone_trans_offset.x; + v->p_tone_offset.y = tone_trans_offset.y; + v->p_tone_offset.z = tone_trans_offset.z; + v->p_fade_func.x = (float_t)tm->data.scene_fade_blend_func; + v->p_inv_tone.x = tm->data.gamma > 0.0f ? 2.0f / (tm->data.gamma * 3.0f) : 0.0f; +} + +static void post_process_tone_map_calculate_tex(post_process_tone_map* tm) { + const float_t post_process_tone_map__scale = (float_t)(1.0 / (double_t)POST_PROCESS_TONE_MAP_SAT_GAMMA_SAMPLES); + const int32_t post_process_tone_map__size = 16 * POST_PROCESS_TONE_MAP_SAT_GAMMA_SAMPLES; + + int32_t i, j; + int32_t saturate_power; + float_t saturate_coeff; + + vec2* tex = tm->data.tex; + float_t gamma_power, gamma, saturation; + gamma_power = tm->data.gamma * tm->data.gamma_rate * 1.5f; + saturate_power = tm->data.saturate_power; + saturate_coeff = tm->data.saturate_coeff; + + tex[0].x = 0.0f; + tex[0].y = 0.0f; + for (i = 1; i < post_process_tone_map__size; i++) { + gamma = powf(1.0f - expf(-i * post_process_tone_map__scale), gamma_power); + saturation = gamma * 2.0f - 1.0f; + for (j = 0; j < saturate_power; j++) { + saturation *= saturation; + saturation *= saturation; + saturation *= saturation; + saturation *= saturation; + } + + tex[i].x = gamma; + tex[i].y = gamma * saturate_coeff + * ((float_t)POST_PROCESS_TONE_MAP_SAT_GAMMA_SAMPLES / (float_t)i) * (1.0f - saturation); + } +} diff --git a/src/CRE/post_process/tone_map.h b/src/CRE/post_process/tone_map.h deleted file mode 100644 index b98c00c6..00000000 --- a/src/CRE/post_process/tone_map.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "../../KKdLib/default.h" -#include "../../KKdLib/light_param/glow.hpp" -#include "../../KKdLib/vec.h" -#include "../shared.h" -#include "../render_texture.h" - -#define POST_PROCESS_TONE_MAP_SAT_GAMMA_SAMPLES 32 - -struct post_process_tone_map_shader_data { - vec4 p_exposure; - vec4 p_flare_coef; - vec4 p_fade_color; - vec4 p_tone_scale; - vec4 p_tone_offset; - vec4 p_fade_func; - vec4 p_inv_tone; -}; - -struct post_process_tone_map_data { - vec2 tex[16 * POST_PROCESS_TONE_MAP_SAT_GAMMA_SAMPLES]; - float_t exposure; - bool auto_exposure; - float_t gamma; - float_t gamma_rate; - int32_t saturate_power; - float_t saturate_coeff; - vec4 scene_fade; - int32_t scene_fade_blend_func; - vec3 tone_trans_start; - vec3 tone_trans_end; - tone_map_method tone_map_method; - float_t lens_flare; - float_t lens_shaft; - float_t lens_ghost; - float_t lens_flare_power; - float_t lens_flare_appear_power; - bool update; - bool update_tex; -}; - -struct post_process_tone_map { - post_process_tone_map_data data; - post_process_tone_map_shader_data shader_data; - GLuint tone_map; -}; - -extern post_process_tone_map* post_process_tone_map_init(); -extern void post_process_apply_tone_map(post_process_tone_map* tm, - render_texture* in_tex, texture* light_proj_tex, texture* back_2d_tex, - render_texture* rt, render_texture* buf_rt, render_texture* contour_rt, - GLuint in_tex_0, GLuint in_tex_1, int32_t npr_param); -extern void post_process_tone_map_init_fbo(post_process_tone_map* tm); -extern void post_process_tone_map_dispose(post_process_tone_map* tm); - -extern void post_process_tone_map_initialize_data(post_process_tone_map* tm, float_t exposure, bool auto_exposure, - float_t gamma, int32_t saturate_power, float_t saturate_coeff, - const vec3* scene_fade_color, float_t scene_fade_alpha, int32_t scene_fade_blend_func, - const vec3* tone_trans_start, const vec3* tone_trans_end, tone_map_method tone_map_method); -extern void post_process_tone_map_initialize_rate(post_process_tone_map* tm, float_t exposure, bool auto_exposure, - float_t gamma, float_t gamma_rate, int32_t saturate_power, float_t saturate_coeff, - const vec3* scene_fade_color, float_t scene_fade_alpha, int32_t scene_fade_blend_func, - const vec3* tone_trans_start, const vec3* tone_trans_end, tone_map_method tone_map_method); -extern float_t post_process_tone_map_get_exposure(post_process_tone_map* tm); -extern void post_process_tone_map_set_exposure(post_process_tone_map* tm, float_t value); -extern bool post_process_tone_map_get_auto_exposure(post_process_tone_map* tm); -extern void post_process_tone_map_set_auto_exposure(post_process_tone_map* tm, bool value); -extern float_t post_process_tone_map_get_gamma(post_process_tone_map* tm); -extern void post_process_tone_map_set_gamma(post_process_tone_map* tm, float_t value); -extern float_t post_process_tone_map_get_gamma_rate(post_process_tone_map* tm); -extern void post_process_tone_map_set_gamma_rate(post_process_tone_map* tm, float_t value); -extern int32_t post_process_tone_map_get_saturate_power(post_process_tone_map* tm); -extern void post_process_tone_map_set_saturate_power(post_process_tone_map* tm, int32_t value); -extern float_t post_process_tone_map_get_saturate_coeff(post_process_tone_map* tm); -extern void post_process_tone_map_set_saturate_coeff(post_process_tone_map* tm, float_t value); -extern void post_process_tone_map_get_scene_fade(post_process_tone_map* tm, vec4* value); -extern void post_process_tone_map_set_scene_fade(post_process_tone_map* tm, const vec4* value); -extern void post_process_tone_map_get_scene_fade_color(post_process_tone_map* tm, vec3* value); -extern void post_process_tone_map_set_scene_fade_color(post_process_tone_map* tm, const vec3* value); -extern float_t post_process_tone_map_get_scene_fade_alpha(post_process_tone_map* tm); -extern void post_process_tone_map_set_scene_fade_alpha(post_process_tone_map* tm, float_t value); -extern int32_t post_process_tone_map_get_scene_fade_blend_func(post_process_tone_map* tm); -extern void post_process_tone_map_set_scene_fade_blend_func(post_process_tone_map* tm, int32_t value); -extern void post_process_tone_map_get_tone_trans_start(post_process_tone_map* tm, vec3* value); -extern void post_process_tone_map_set_tone_trans_start(post_process_tone_map* tm, const vec3* value); -extern void post_process_tone_map_get_tone_trans_end(post_process_tone_map* tm, vec3* value); -extern void post_process_tone_map_set_tone_trans_end(post_process_tone_map* tm, const vec3* value); -extern tone_map_method post_process_tone_map_get_tone_map_method(post_process_tone_map* tm); -extern void post_process_tone_map_set_tone_map_method(post_process_tone_map* tm, tone_map_method value); -extern float_t post_process_tone_map_get_lens_flare(post_process_tone_map* tm); -extern void post_process_tone_map_set_lens_flare(post_process_tone_map* tm, float_t value); -extern float_t post_process_tone_map_get_lens_shaft(post_process_tone_map* tm); -extern void post_process_tone_map_set_lens_shaft(post_process_tone_map* tm, float_t value); -extern float_t post_process_tone_map_get_lens_ghost(post_process_tone_map* tm); -extern void post_process_tone_map_set_lens_ghost(post_process_tone_map* tm, float_t value); diff --git a/src/CRE/post_process/tone_map.hpp b/src/CRE/post_process/tone_map.hpp new file mode 100644 index 00000000..3a7f7a96 --- /dev/null +++ b/src/CRE/post_process/tone_map.hpp @@ -0,0 +1,103 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../../KKdLib/default.hpp" +#include "../../KKdLib/light_param/glow.hpp" +#include "../../KKdLib/vec.hpp" +#include "../shared.h" +#include "../render_texture.h" + +#define POST_PROCESS_TONE_MAP_SAT_GAMMA_SAMPLES 32 + +struct post_process_tone_map_shader_data { + vec4 p_exposure; + vec4 p_flare_coef; + vec4 p_fade_color; + vec4 p_tone_scale; + vec4 p_tone_offset; + vec4 p_fade_func; + vec4 p_inv_tone; +}; + +struct post_process_tone_map_data { + vec2 tex[16 * POST_PROCESS_TONE_MAP_SAT_GAMMA_SAMPLES]; + float_t exposure; + bool auto_exposure; + float_t gamma; + float_t gamma_rate; + int32_t saturate_power; + float_t saturate_coeff; + vec4 scene_fade; + int32_t scene_fade_blend_func; + vec3 tone_trans_start; + vec3 tone_trans_end; + tone_map_method tone_map_method; + float_t lens_flare; + float_t lens_shaft; + float_t lens_ghost; + float_t lens_flare_power; + float_t lens_flare_appear_power; + bool update; + bool update_tex; +}; + +struct post_process_tone_map { + post_process_tone_map_data data; + post_process_tone_map_shader_data shader_data; + GLuint tone_map; + + post_process_tone_map(); + virtual ~post_process_tone_map(); + + void apply(render_texture* in_tex, texture* light_proj_tex, texture* back_2d_tex, + render_texture* rt, render_texture* buf_rt, render_texture* contour_rt, + GLuint in_tex_0, GLuint in_tex_1, int32_t npr_param); + void init_fbo(); + void initialize_data(float_t exposure, bool auto_exposure, + float_t gamma, int32_t saturate_power, float_t saturate_coeff, + const vec3& scene_fade_color, float_t scene_fade_alpha, int32_t scene_fade_blend_func, + const vec3& tone_trans_start, const vec3& tone_trans_end, tone_map_method tone_map_method); + void initialize_data(float_t exposure, bool auto_exposure, + float_t gamma, float_t gamma_rate, int32_t saturate_power, float_t saturate_coeff, + const vec3& scene_fade_color, float_t scene_fade_alpha, int32_t scene_fade_blend_func, + const vec3& tone_trans_start, const vec3& tone_trans_end, tone_map_method tone_map_method); + + bool get_auto_exposure(); + void set_auto_exposure(bool value); + float_t get_exposure(); + void set_exposure(float_t value); + float_t get_gamma(); + void set_gamma(float_t value); + float_t get_gamma_rate(); + void set_gamma_rate(float_t value); + float_t get_lens_flare(); + void set_lens_flare(float_t value); + float_t get_lens_ghost(); + void set_lens_ghost(float_t value); + float_t get_lens_shaft(); + void set_lens_shaft(float_t value); + float_t get_saturate_coeff(); + void set_saturate_coeff(float_t value); + int32_t get_saturate_power(); + void set_saturate_power(int32_t value); + vec4 get_scene_fade(); + void set_scene_fade(const vec4& value); + float_t get_scene_fade_alpha(); + void set_scene_fade_alpha(float_t value); + int32_t get_scene_fade_blend_func(); + void set_scene_fade_blend_func(int32_t value); + vec3 get_scene_fade_color(); + void set_scene_fade_color(const vec3& value); + tone_map_method get_tone_map_method(); + void set_tone_map_method(tone_map_method value); + void get_tone_trans(vec3& start, vec3& end); + void set_tone_trans(const vec3& start, const vec3& end); + vec3 get_tone_trans_end(); + void set_tone_trans_end(const vec3& value); + vec3 get_tone_trans_start(); + void set_tone_trans_start(const vec3& value); +}; diff --git a/src/CRE/pv_db.cpp b/src/CRE/pv_db.cpp new file mode 100644 index 00000000..6becbcb0 --- /dev/null +++ b/src/CRE/pv_db.cpp @@ -0,0 +1,2033 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "pv_db.hpp" +#include "render_context.hpp" +#include "../KKdLib/str_utils.hpp" + +extern render_context* rctx_ptr; + +pv_db::TaskPvDB task_pv_db; + +pv_db_pv_lyric::pv_db_pv_lyric() : index() { + +} + +pv_db_pv_lyric::~pv_db_pv_lyric() { + +} + +pv_db_pv_performer::pv_db_pv_performer() { + type = PV_PERFORMER_VOCAL; + chara = -1; + costume = -1; + pv_costume[0] = -1; + pv_costume[1] = -1; + pv_costume[2] = -1; + pv_costume[3] = -1; + pv_costume[4] = -1; + fixed = false; + exclude = -1; + size = PV_PERFORMER_NORMAL; + pseudo_same_id = -1; + item[0] = -1; + item[1] = -1; + item[2] = -1; + item[3] = -1; +} + +void pv_db_pv_performer::set_pv_costume(int32_t pv_costume, int32_t difficulty) { + if (difficulty == -1) { + for (int32_t i = 0; i < PV_DIFFICULTY_MAX; i++) + if (this->pv_costume[i] == -1) + this->pv_costume[i] = pv_costume; + } + else if (difficulty >= 0 && difficulty < PV_DIFFICULTY_MAX) + this->pv_costume[difficulty] = pv_costume; +} +pv_db_pv_attribute::pv_db_pv_attribute() : type() { + reset(); +} + +pv_db_pv_attribute::~pv_db_pv_attribute() { + +} + +void pv_db_pv_attribute::reset() { + type = PV_ATTRIBUTE_ORIGINAL; + bitset.reset(); +} + +pv_db_pv_motion::pv_db_pv_motion() : index(), id() { + +} + +pv_db_pv_motion::~pv_db_pv_motion() { + +} + +pv_db_pv_field::pv_db_pv_field() : index(), stage_index(), ex_stage_index(), +light_frame(), light_frame_set(), stage_flag(), npr_type(), cam_blur(), sdw_off() { + reset(); +} + +pv_db_pv_field::~pv_db_pv_field() { + +} + +void pv_db_pv_field::reset() { + index = -1; + stage_index = -1; + ex_stage_index = -1; + auth_3d_list.clear(); + auth_3d_list.shrink_to_fit(); + ex_auth_3d_list.clear(); + ex_auth_3d_list.shrink_to_fit(); + auth_3d_frame_list.clear(); + auth_3d_frame_list.shrink_to_fit(); + light.clear(); + light.shrink_to_fit(); + light_frame = -3; + light_frame_set = false; + + for (int32_t i = 0; i < 4; i++) { + aet[i].clear(); + aet[i].shrink_to_fit(); + } + + for (int32_t i = 0; i < 4; i++) { + aet_id[i].clear(); + aet_id[i].shrink_to_fit(); + } + + for (int32_t i = 0; i < 4; i++) { + aet_frame[i].clear(); + aet_frame[i].shrink_to_fit(); + } + + spr_set_back.clear(); + spr_set_back.shrink_to_fit(); + stage_flag = true; + npr_type = 0; + cam_blur = 0; + sdw_off = false; + play_eff_list.clear(); + play_eff_list.shrink_to_fit(); + stop_eff_list.clear(); + stop_eff_list.shrink_to_fit(); + effect_rs_list.clear(); + effect_rs_list.shrink_to_fit(); + effect_emision_rs_list.clear(); + effect_emision_rs_list.shrink_to_fit(); +} + +pv_db_pv_field_parent::pv_db_pv_field_parent() : ex_stage_set() { + +} + +pv_db_pv_field_parent::~pv_db_pv_field_parent() { + +} + +void pv_db_pv_field_parent::reset() { + data.clear(); + data.shrink_to_fit(); + ex_stage_set = false; +} + +pv_db_pv_item::pv_db_pv_item() : index() { + +} + +pv_db_pv_item::~pv_db_pv_item() { + +} + +pv_db_pv_hand_item::pv_db_pv_hand_item() : index(), id() { + +} + +pv_db_pv_hand_item::~pv_db_pv_hand_item() { + +} + +pv_db_pv_edit_effect::pv_db_pv_edit_effect() : index(), low_field() { + reset(); +} + +pv_db_pv_edit_effect::~pv_db_pv_edit_effect() { + +} + +void pv_db_pv_edit_effect::reset() { + index = -1; + name.clear(); + name.shrink_to_fit(); + low_field = false; +} + +pv_db_pv_title_image::pv_db_pv_title_image() : time(), end_time() { + reset(); +} + +pv_db_pv_title_image::~pv_db_pv_title_image() { + +} + +void pv_db_pv_title_image::reset() { + time = -1.0f; + end_time = -1.0f; + aet_name.clear(); + aet_name.shrink_to_fit(); +} + +pv_db_pv_songinfo::pv_db_pv_songinfo() { + reset(); +} + +pv_db_pv_songinfo::~pv_db_pv_songinfo() { + +} + +void pv_db_pv_songinfo::reset() { + music.clear(); + music.shrink_to_fit(); + lyrics.clear(); + lyrics.shrink_to_fit(); + arranger.clear(); + arranger.shrink_to_fit(); + manipulator.clear(); + manipulator.shrink_to_fit(); + pv_editor.clear(); + pv_editor.shrink_to_fit(); + guitar_player.clear(); + guitar_player.shrink_to_fit(); + + for (std::pair& i : ex_info) { + i.first.clear(); + i.first.shrink_to_fit(); + i.second.clear(); + i.second.shrink_to_fit(); + } +} + +pv_db_pv_movie::pv_db_pv_movie() : index() { + +} + +pv_db_pv_movie::~pv_db_pv_movie() { + +} + +pv_db_pv_difficulty::pv_db_pv_difficulty() : difficulty(), edition(), level(), level_sort_index(), movie_surface(), +version(), script_format(), high_speed_rate(), hidden_timing(), sudden_timing(), edit_chara_scale() { + +} + +pv_db_pv_difficulty::~pv_db_pv_difficulty() { + +} + +void pv_db_pv_difficulty::reset() { + difficulty = PV_DIFFICULTY_MAX; + edition = -1; + attribute.reset(); + script_file_name.clear(); + script_file_name.shrink_to_fit(); + level = PV_LV_00_0; + level_sort_index = 0; + se_name.clear(); + se_name.shrink_to_fit(); + pvbranch_success_se_name.clear(); + pvbranch_success_se_name.shrink_to_fit(); + slide_name.clear(); + slide_name.shrink_to_fit(); + chainslide_first_name.clear(); + chainslide_first_name.shrink_to_fit(); + chainslide_sub_name.clear(); + chainslide_sub_name.shrink_to_fit(); + chainslide_success_name.clear(); + chainslide_success_name.shrink_to_fit(); + chainslide_failure_name.clear(); + chainslide_failure_name.shrink_to_fit(); + slidertouch_name = "slide_windchime"; + + for (std::vector& i : motion) { + i.clear(); + i.shrink_to_fit(); + } + + field.reset(); + pv_item.clear(); + pv_item.shrink_to_fit(); + hand_item.clear(); + hand_item.shrink_to_fit(); + field_228.clear(); + field_228.shrink_to_fit(); + field_240.clear(); + field_240.shrink_to_fit(); + field_258.clear(); + field_258.shrink_to_fit(); + edit_effect.clear(); + edit_effect.shrink_to_fit(); + title_image.reset(); + songinfo.reset(); + movie_list.clear(); + movie_list.shrink_to_fit(); + movie_surface = PV_MOVIE_SURFACE_BACK; + effect_se_file_name.clear(); + effect_se_file_name.shrink_to_fit(); + effect_se_name_list.clear(); + effect_se_name_list.shrink_to_fit(); + version = 0; + script_format = 0; + high_speed_rate = 1; + hidden_timing = 0.3f; + sudden_timing = 0.6f; + edit_chara_scale = false; +} + +pv_db_pv_ex_song_ex_auth::pv_db_pv_ex_song_ex_auth() { + +} + +pv_db_pv_ex_song_ex_auth::~pv_db_pv_ex_song_ex_auth() { + +} + +pv_db_pv_ex_song::pv_db_pv_ex_song() : chara() { + reset(); +} + +pv_db_pv_ex_song::~pv_db_pv_ex_song() { + +} + +void pv_db_pv_ex_song::reset() { + for (int32_t& i : chara) + i = -1; + file.clear(); + file.shrink_to_fit(); + name.clear(); + name.shrink_to_fit(); + ex_auth.clear(); + ex_auth.shrink_to_fit(); +} + +pv_db_pv_ex_song_parent::pv_db_pv_ex_song_parent() : chara_count() { + reset(); +} + +pv_db_pv_ex_song_parent::~pv_db_pv_ex_song_parent() { + +} + +void pv_db_pv_ex_song_parent::reset() { + chara_count = 0; + data.clear(); + data.shrink_to_fit(); +} + +pv_db_pv_mdata::pv_db_pv_mdata() : flag() { + +} + +pv_db_pv_mdata::~pv_db_pv_mdata() { + reset(); +} + +void pv_db_pv_mdata::reset() { + flag = false; + dir.clear(); + dir.shrink_to_fit(); +} + +pv_db_pv_osage_init::pv_db_pv_osage_init() : frame(), stage() { + +} + +pv_db_pv_osage_init::~pv_db_pv_osage_init() { + +} + +pv_db_pv_stage_param::pv_db_pv_stage_param() : stage(), mhd_id() { + +} + +pv_db_pv_stage_param::~pv_db_pv_stage_param() { + +} + +pv_db_pv_disp2d::pv_db_pv_disp2d() : target_shadow_type(), title_start_2d_field(), title_end_2d_field(), +title_start_2d_low_field(), title_end_2d_low_field(), title_start_3d_field(), title_end_3d_field() { + reset(); +} + +pv_db_pv_disp2d::~pv_db_pv_disp2d() { + +} + +void pv_db_pv_disp2d::reset() { + set_name.clear(); + set_name.shrink_to_fit(); + target_shadow_type = -1; + title_start_2d_field = -1; + title_end_2d_field = -1; + title_start_2d_low_field = -1; + title_end_2d_low_field = -1; + title_start_3d_field = -1; + title_end_3d_field = -1; + title_2d_layer.clear(); + title_2d_layer.shrink_to_fit(); +} + +pv_db_pv_chreff_data::pv_db_pv_chreff_data() : type() { + +} + +pv_db_pv_chreff_data::~pv_db_pv_chreff_data() { + +} + +pv_db_pv_chreff::pv_db_pv_chreff() : id() { + +} + +pv_db_pv_chreff::~pv_db_pv_chreff() { + +} + +pv_db_pv_chrcam::pv_db_pv_chrcam() : id() { + +} + +pv_db_pv_chrcam::~pv_db_pv_chrcam() { + +} + +pv_db_pv_chrmot::pv_db_pv_chrmot() : id() { + +} + +pv_db_pv_chrmot::~pv_db_pv_chrmot() { + +} + +pv_db_pv_another_song::pv_db_pv_another_song() { + +} + +pv_db_pv_another_song::~pv_db_pv_another_song() { + +} + +pv_db_pv_frame_texture::pv_db_pv_frame_texture() : type() { + +} + +pv_db_pv_frame_texture::~pv_db_pv_frame_texture() { + reset(); +} + +void pv_db_pv_frame_texture::reset() { + data.clear(); + data.shrink_to_fit(); + type = PV_FRAME_TEXTURE_PRE_PP; +} + +pv_db_pv_auth_replace_by_module::pv_db_pv_auth_replace_by_module() : id(), module_id() { + +} + +pv_db_pv_auth_replace_by_module::~pv_db_pv_auth_replace_by_module() { + +} + +pv_db_pv::pv_db_pv() : id(), date(), remix_parent(), sabi(), edit(), disable_calc_motfrm_limit(), +use_osage_play_data(), eyes_xrot_adjust(), is_old_pv(), eyes_base_adjust_type(), pre_play_script() { + reset(); +} + +pv_db_pv::~pv_db_pv() { + +} + +pv_db_pv_difficulty* pv_db_pv::get_difficulty(int32_t difficulty, pv_attribute_type attribute_type) { + if (attribute_type == PV_ATTRIBUTE_END) + return 0; + + std::vector& diff = this->difficulty[difficulty]; + for (pv_db_pv_difficulty& i : diff) + if (i.attribute.type == attribute_type) + return &i; + return 0; +} + +pv_db_pv_difficulty* pv_db_pv::get_difficulty(int32_t difficulty, int32_t edition) { + std::vector& diff = this->difficulty[difficulty]; + for (pv_db_pv_difficulty& i : diff) + if (i.edition == edition) + return &i; + return 0; +} + +void pv_db_pv::reset() { + id = -1; + date = -1; + song_name.clear(); + song_name.shrink_to_fit(); + song_name_reading.clear(); + song_name_reading.shrink_to_fit(); + remix_parent = -1; + bpm = 0; + song_file_name.clear(); + song_file_name.shrink_to_fit(); + lyric.clear(); + lyric.shrink_to_fit(); + sabi = {}; + edit = 0; + disable_calc_motfrm_limit = false; + performer.clear(); + performer.shrink_to_fit(); + + for (int32_t i = 0; i < PV_DIFFICULTY_MAX; i++) { + difficulty[i].clear(); + difficulty[i].shrink_to_fit(); + } + + ex_song.reset(); + mdata.reset(); + osage_init.clear(); + osage_init.shrink_to_fit(); + stage_param.clear(); + stage_param.shrink_to_fit(); + disp2d.reset(); + use_osage_play_data = true; + pv_expression_file_name.clear(); + pv_expression_file_name.shrink_to_fit(); + chreff.clear(); + chreff.shrink_to_fit(); + chrcam.clear(); + chrcam.shrink_to_fit(); + chrmot.clear(); + chrmot.shrink_to_fit(); + eyes_xrot_adjust = false; + is_old_pv = false; + eyes_base_adjust_type = EYES_BASE_ADJUST_NONE; + eyes_rot_rate.clear(); + another_song.clear(); + another_song.shrink_to_fit(); + pre_play_script = false; + + for (int32_t i = 0; i < 6; i++) + frame_texture[i].reset(); + + auth_replace_by_module.clear(); + auth_replace_by_module.shrink_to_fit(); +} + +namespace pv_db { + static const char* aet_names[] = { + "aet_front", + "aet_front_low", + "aet_front_3d_surf", + "aet_back", + }; + + static const char* aet_list_names[] = { + "aet_front_list", + "aet_front_low_list", + "aet_front_3d_surf_list", + "aet_back_list", + }; + + static const char* aet_id_names[] = { + "aet_id_front", + "aet_id_front_low", + "aet_id_front_3d_surf", + "aet_id_back", + }; + + static const char* aet_id_list_names[] = { + "aet_id_front_list", + "aet_id_front_low_list", + "aet_id_front_3d_surf_list", + "aet_id_back_list", + }; + + static const char* aet_frame_names[] = { + "aet_front_frame", + "aet_front_low_frame", + "aet_front_3d_surf_frame", + "aet_back_frame", + }; + + static const char* aet_frame_list_names[] = { + "aet_front_frame_list", + "aet_front_low_frame_list", + "aet_front_3d_surf_frame_list", + "aet_back_frame_list", + }; + + static const char* difficulty_names[] = { + "easy", + "normal", + "hard", + "extreme", + "encore", + }; + + static const char* eyes_base_adjust_type_names[] = { + "DIRECTION", + "CLEARANCE", + "OFF", + }; + + static const char* frame_texture_names[] = { + "frame_texture", + "frame_texture_a", + "frame_texture_b", + "frame_texture_c", + "frame_texture_d", + "frame_texture_e", + }; + + static const char* frame_texture_type_names[] = { + "frame_texture_type", + "frame_texture_a_type", + "frame_texture_b_type", + "frame_texture_c_type", + "frame_texture_d_type", + "frame_texture_e_type", + }; + + static const char* performer_item_names[] = { + "item_zujo", + "item_face", + "item_neck", + "item_back", + }; + + static const char* pv_level_names[] = { + "PV_LV_00_0", + "PV_LV_00_5", + "PV_LV_01_0", + "PV_LV_01_5", + "PV_LV_02_0", + "PV_LV_02_5", + "PV_LV_03_0", + "PV_LV_03_5", + "PV_LV_04_0", + "PV_LV_04_5", + "PV_LV_05_0", + "PV_LV_05_5", + "PV_LV_06_0", + "PV_LV_06_5", + "PV_LV_07_0", + "PV_LV_07_5", + "PV_LV_08_0", + "PV_LV_08_5", + "PV_LV_09_0", + "PV_LV_09_5", + "PV_LV_10_0", + }; + + TaskPvDB::TaskPvDB() : state(), reset(), field_99() { + + } + + TaskPvDB::~TaskPvDB() { + + } + + bool TaskPvDB::Init() { + reset = false; + field_99 = false; + InitPerformerTypes(); + InitPerformerSizes(); + InitChrEffDataTypes(); + InitMovieSurfaces(); + + paths.push_back({ "rom/", "pv_db.txt" }); + paths.push_back({ "rom/", "pv_field.txt" }); + paths.push_back({ "rom/", "mdata_pv_db.txt" }); + paths.push_back({ "rom/", "mdata_pv_field.txt" }); + return true; + } + + bool TaskPvDB::Ctrl() { + switch (state) { + case 1: { + if (reset) { + paths.clear(); + pv_data.clear(); + reset = false; + } + + if (paths.size()) { + std::pair& path = paths.front(); + file_handler.read_file(rctx_ptr->data, path.first.c_str(), path.second.c_str()); + state = 2; + } + else + state = 0; + } break; + case 2: { + if (!file_handler.check_not_ready()) + state = 3; + } break; + case 3: { + const void* data = file_handler.get_data(); + size_t size = file_handler.get_size(); + if (data && size) { + key_val kv; + kv.parse(data, size); + + for (int32_t i = 0; i < 1000; i++) { + pv_db_pv* pv = 0; + for (pv_db_pv& j : pv_data) + if (j.id == i) { + pv = &j; + break; + } + + if (!pv) { + pv_db_pv pv; + if (ParsePvDb(&pv, kv, i)) { + ParsePvField(&pv, kv, i); + pv_data.push_back(pv); + } + } + else if (paths.front().second.find("field") != -1 || ParsePvDb(pv, kv, i)) + ParsePvField(pv, kv, i); + } + } + state = 4; + } break; + case 4: { + file_handler.free_data(); + paths.pop_front(); + state = 1; + } break; + default: { + if (reset) { + paths.clear(); + pv_data.clear(); + reset = false; + } + + if (paths.size()) + state = 1; + } + } + return false; + } + + bool TaskPvDB::Dest() { + return true; + } + + void TaskPvDB::InitChrEffDataTypes() { + chreff_data_types.insert({ "AUTH3D" , PV_CHREFF_DATA_AUTH3D }); + chreff_data_types.insert({ "AUTH3D_OBJ", PV_CHREFF_DATA_AUTH3D_OBJ }); + } + + void TaskPvDB::InitMovieSurfaces() { + movie_surfaces.insert({ "BACK" , PV_MOVIE_SURFACE_BACK }); + movie_surfaces.insert({ "FRONT", PV_MOVIE_SURFACE_FRONT }); + + } + + void TaskPvDB::InitPerformerSizes() { + performer_sizes.insert({ "NORMAL" , PV_PERFORMER_NORMAL }); + performer_sizes.insert({ "PLAY_CHARA", PV_PERFORMER_PLAY_CHARA }); + performer_sizes.insert({ "PV_CHARA" , PV_PERFORMER_PV_CHARA }); + performer_sizes.insert({ "SHORT" , PV_PERFORMER_SHORT }); + performer_sizes.insert({ "TALL" , PV_PERFORMER_TALL }); + } + + void TaskPvDB::InitPerformerTypes() { + performer_types.insert({ "VOCAL", PV_PERFORMER_VOCAL }); + performer_types.insert({ "PSEUDO_DEFAULT", PV_PERFORMER_PSEUDO_DEFAULT }); + performer_types.insert({ "PSEUDO_SAME", PV_PERFORMER_PSEUDO_SAME }); + performer_types.insert({ "PSEUDO_SWIM", PV_PERFORMER_PSEUDO_SWIM }); + performer_types.insert({ "PSEUDO_SWIM_S", PV_PERFORMER_PSEUDO_SWIM_S }); + performer_types.insert({ "PSEUDO_MYCHARA", PV_PERFORMER_PSEUDO_MYCHARA }); + performer_types.insert({ "GUEST", PV_PERFORMER_GUEST }); + } + + bool TaskPvDB::ParsePvDb(pv_db_pv* pv, key_val& kv, int32_t pv_id) { + if (!pv) + return false; + + char buf[0x100]; + sprintf_s(buf, sizeof(buf), "pv_%03d", pv_id); + + if (!kv.has_key(buf) || !kv.open_scope(buf)) + return false; + + size_t base_scope_index = kv.curr_scope - kv.scope.data();; + + std::string song_name; + if (!kv.read("song_name", song_name)) { + kv.close_scope(); + return false; + } + + std::string song_name_reading; + if (!kv.read("song_name_reading", song_name_reading)) { + kv.close_scope(); + return false; + } + + int32_t bpm; + if (!kv.read("bpm", bpm)) { + kv.close_scope(); + return false; + } + + std::string song_file_name; + if (!kv.read("song_file_name", song_file_name)) { + kv.close_scope(); + return false; + } + + int32_t date; + if (!kv.read("date", date) || pv->date >= date) { + kv.close_scope(); + return false; + } + + bool unsupported_script_format = false; + for (int32_t i = 0; i < PV_DIFFICULTY_MAX; i++) { + char buf[0x200]; + sprintf_s(buf, sizeof(buf), "difficulty.%s.0", difficulty_names[i]); + + if (!kv.open_scope(buf)) + continue; + + if (!kv.has_key("script_file_name")) { + kv.close_scope(); + continue; + } + + int32_t script_format; + if (kv.read("script_format", script_format) && script_format > 0x15122517) + unsupported_script_format = true; + + kv.close_scope(); + } + + if (unsupported_script_format) { + kv.close_scope(); + return false; + } + + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + stage_database* aft_stage_data = &aft_data->data_ft.stage_data; + + pv->reset(); + + pv->id = pv_id; + pv->song_name = song_name; + pv->song_name_reading = song_name_reading; + pv->bpm = bpm; + pv->song_file_name = song_file_name; + pv->date = date; + + int32_t remix_parent; + if (kv.read("remix_parent", remix_parent)) + pv->remix_parent = remix_parent; + + int32_t mdata_flag; + if (kv.read("mdata_flag", mdata_flag)) + pv->mdata.flag = mdata_flag > 0; + + int32_t mdata_dir; + if (kv.read("mdata.dir", mdata_dir)) + pv->mdata.dir = mdata_dir; + + if (kv.open_scope("lyric")) { + for (int32_t i = 0; i < 1000; i++) { + if (!kv.open_scope("%03zu", i)) + continue; + + pv_db_pv_lyric lyric; + if (kv.read(lyric.data)) { + lyric.index = i; + pv->lyric.push_back(lyric); + } + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.open_scope("sabi")) { + float_t start_time; + float_t play_time; + if (kv.read("start_time", start_time) && kv.read("play_time", play_time)) { + pv->sabi.start_time = start_time; + pv->sabi.play_time = play_time; + } + kv.close_scope(); + } + + int32_t edit; + if (kv.read("edit", edit)) + pv->edit = edit; + + if (kv.has_key("disable_calc_motfrm_limit")) + pv->disable_calc_motfrm_limit = true; + + int32_t count; + if (kv.read("performer", "num", count)) { + pv->performer.resize(count); + for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope("%zu", i)) + continue; + + pv_db_pv_performer& performer = pv->performer[i]; + + std::string type; + if (kv.read("type", type)) { + auto elem = performer_types.find(type); + if (elem != performer_types.end()) + performer.type = elem->second; + } + + const char* chara; + if (kv.read("chara", chara)) { + chara_index chara_index = chara_index_get_from_chara_name(chara); + if (chara_index != CHARA_MAX) + performer.chara = chara_index; + } + + int32_t costume; + if (kv.read("costume", costume)) + performer.costume = costume - 1; + + int32_t pv_costume; + if (kv.read("pv_costume", pv_costume)) { + pv_costume--; + for (int32_t j = 0; j < 5; j++) + if (performer.pv_costume[j] != -1) + performer.pv_costume[j] = pv_costume; + } + + if (kv.has_key("fixed")) + performer.fixed = true; + + int32_t pseudo_same_id; + if (kv.read("pseudo_same_id", pseudo_same_id)) + performer.pseudo_same_id = pseudo_same_id; + + int32_t exclude; + if (kv.read("exclude", exclude)) + performer.exclude = exclude; + + std::string size; + if (kv.read("size", size)) { + auto elem = performer_sizes.find(size); + if (elem != performer_sizes.end()) + performer.size = elem->second; + } + + for (int32_t j = 0; j < 4; j++) { + int32_t item; + if (kv.read(performer_item_names[j], item)) + performer.item[j] = item; + } + + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.read("chrcam", "length", count)) { + pv->chrcam.resize(count); + for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope("%zu", i)) + continue; + + pv_db_pv_chrcam& chrcam = pv->chrcam[i]; + + int32_t id; + if (kv.read("id", id)) + chrcam.id = id; + + std::string chara; + if (kv.read("chara", chara)) + chrcam.chara = chara; + + std::string org_name; + if (kv.read("org_name", org_name)) + chrcam.org_name = org_name; + + std::string name; + if (kv.read("name", name)) + chrcam.name = name; + + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.read("chrmot", "length", count)) { + pv->chrmot.resize(count); + for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope("%zu", i)) + continue; + + pv_db_pv_chrmot& chrmot = pv->chrmot[i]; + + int32_t id; + if (kv.read("id", id)) + chrmot.id = id; + + std::string chara; + if (kv.read("chara", chara)) + chrmot.chara = chara; + + std::string org_name; + if (kv.read("org_name", org_name)) + chrmot.org_name = org_name; + + std::string name; + if (kv.read("name", name)) + chrmot.name = name; + + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.read("chreff", "length", count)) { + pv->chreff.resize(count); + for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope("%zu", i)) + continue; + + pv_db_pv_chreff& chreff = pv->chreff[i]; + + int32_t id; + if (kv.read("id", id)) + chreff.id = id; + + std::string name; + if (kv.read("name", name)) + chreff.name = name; + + int32_t count; + if (kv.read("data", "length", count)) { + chreff.data.resize(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope("%zu", j)) + continue; + + pv_db_pv_chreff_data& data = chreff.data[j]; + + std::string type; + if (kv.read("type", type)) { + auto elem = chreff_data_types.find(type); + if (elem != chreff_data_types.end()) + data.type = elem->second; + } + + std::string name; + if (kv.read("name", name)) + chreff.name = name; + + kv.close_scope(); + } + kv.close_scope(); + } + + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.has_key("eyes_xrot_adjust")) + pv->eyes_xrot_adjust = true; + + if (kv.has_key("is_old_pv")) + pv->is_old_pv = true; + + pv->eyes_base_adjust_type = EYES_BASE_ADJUST_NONE; + + const char* eyes_base_adjust_type; + if (kv.read("eyes_base_adjust_type", eyes_base_adjust_type)) + for (int32_t i = EYES_BASE_ADJUST_NONE; i < EYES_BASE_ADJUST_MAX; i++) + if (!str_utils_compare(eyes_base_adjust_type, eyes_base_adjust_type_names[i])) { + pv->eyes_base_adjust_type = (::eyes_base_adjust_type)i; + break; + } + + if (kv.read("eyes_rot_rate", "length", count)) { + for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope("%zu", i)) + continue; + + const char* chr; + if (kv.read("chr", chr)) { + chara_index chara_index = chara_index_get_from_chara_name(chr); + float_t xp_rate; + float_t xn_rate; + if (chara_index != CHARA_MAX && kv.read("xp_rate", xp_rate) && kv.read("xn_rate", xn_rate)) { + pv_db_pv_eyes_rot_rate eyes_rot_rate; + eyes_rot_rate.xp_rate = xp_rate; + eyes_rot_rate.xn_rate = xn_rate; + pv->eyes_rot_rate.insert_or_assign(chara_index, eyes_rot_rate); + } + } + + kv.close_scope(); + } + kv.close_scope(); + } + + int32_t pv_costumes[ROB_CHARA_COUNT][PV_DIFFICULTY_MAX]; + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) + for (int32_t j = 0; j < PV_DIFFICULTY_MAX; j++) + pv_costumes[i][j] = -1; + + if (kv.open_scope("difficulty")) { + const char* difficulty_attribute_original; + const char* difficulty_attribute_extra; + const char* difficulty_attribute_slide; + kv.read("attribute.original", difficulty_attribute_original); + kv.read("attribute.extra", difficulty_attribute_extra); + kv.read("attribute.slide", difficulty_attribute_slide); + + for (int32_t i = 0; i < PV_DIFFICULTY_MAX; i++) { + std::vector& diff = pv->difficulty[i]; + + char buf[0x200]; + sprintf_s(buf, sizeof(buf), "%s", difficulty_names[i]); + + int32_t count; + if (!kv.read(buf, "length", count)) + continue; + + const char* attribute_original; + const char* attribute_extra; + const char* attribute_slide; + kv.read("attribute.original", attribute_original); + kv.read("attribute.extra", attribute_extra); + kv.read("attribute.slide", attribute_slide); + + diff.resize(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope("%d", j)) + continue; + + pv_db_pv_difficulty diff; + + diff.difficulty = (pv_difficulty)i; + + int32_t edition; + if (kv.read("edition", edition)) + diff.edition = edition; + + const char* _attribute_original; + if (!kv.read("attribute.original", _attribute_original)) { + if (attribute_original) + _attribute_original = attribute_original; + else if (difficulty_attribute_original) + _attribute_original = difficulty_attribute_original; + } + + if (_attribute_original) { + diff.attribute.type = PV_ATTRIBUTE_ORIGINAL; + diff.attribute.bitset.set(0, atoi(_attribute_original) > 0); + } + + const char* _attribute_extra; + if (!kv.read("attribute.extra", _attribute_extra)) { + if (attribute_extra) + _attribute_extra = attribute_extra; + else if (difficulty_attribute_extra) + _attribute_extra = difficulty_attribute_extra; + } + + if (_attribute_extra) { + diff.attribute.type = PV_ATTRIBUTE_EXTRA; + diff.attribute.bitset.set(1, atoi(_attribute_extra) > 0); + } + + const char* _attribute_slide; + if (!kv.read("attribute.slide", _attribute_slide)) { + if (attribute_slide) + _attribute_slide = attribute_slide; + else if (difficulty_attribute_slide) + _attribute_slide = difficulty_attribute_slide; + } + + if (_attribute_slide) + diff.attribute.bitset.set(2, atoi(_attribute_slide) > 0); + + std::string script_file_name; + if (!kv.read("script_file_name", script_file_name) + || !aft_data->check_file_exists(script_file_name.c_str())) { + kv.close_scope(); + continue; + } + + diff.script_file_name = script_file_name; + + const char* level; + if (kv.read("level", level)) + for (int32_t k = PV_LV_00_0; k < PV_LV_MAX; k++) + if (!str_utils_compare(level, pv_level_names[k])) { + diff.level = (pv_level)k; + break; + } + + int32_t level_sort_index; + if (kv.read("level_sort_index", level_sort_index)) + diff.level_sort_index = level_sort_index; + + key_val_scope diff_scope = *kv.curr_scope; + for (int32_t k = 0; k < 2; k++) { + *kv.curr_scope = k ? diff_scope : kv.scope[base_scope_index]; + + std::string se_name; + if (kv.read("se_name", se_name)) + diff.se_name = se_name; + + std::string pvbranch_success_se_name; + if (kv.read("pvbranch_success_se_name", pvbranch_success_se_name)) + diff.pvbranch_success_se_name = pvbranch_success_se_name; + + std::string slide_name; + if (kv.read("slide_name", slide_name)) + diff.slide_name = slide_name; + + std::string chainslide_first_name; + if (kv.read("chainslide_first_name", chainslide_first_name)) + diff.chainslide_first_name = chainslide_first_name; + + std::string chainslide_sub_name; + if (kv.read("chainslide_sub_name", chainslide_sub_name)) + diff.chainslide_sub_name = chainslide_sub_name; + + std::string chainslide_success_name; + if (kv.read("chainslide_success_name", chainslide_success_name)) + diff.chainslide_success_name = chainslide_success_name; + + std::string chainslide_failure_name; + if (kv.read("chainslide_failure_name", chainslide_failure_name)) + diff.chainslide_failure_name = chainslide_failure_name; + + std::string slidertouch_name; + if (kv.read("slidertouch_name", slidertouch_name)) + diff.slidertouch_name = slidertouch_name; + + for (size_t l = 0; l < ROB_CHARA_COUNT; l++) { + if (l) + sprintf_s(buf, sizeof(buf), "motion%zuP", l); + + if (!kv.open_scope(l ? buf : "motion")) + continue; + + for (size_t m = 0; m < 100; m++) { + sprintf_s(buf, sizeof(buf), "%02zu", (size_t)m); + + if (!kv.open_scope(buf)) + continue; + + const char* motion_name; + if (kv.read(buf, motion_name)) { + pv_db_pv_motion motion; + motion.index = (int32_t)m; + motion.id = aft_mot_db->get_motion_id(motion_name); + diff.motion[l].push_back(motion); + } + + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.open_scope("pv_item")) { + for (int32_t k = 0; k < 10; k++) { + if (!kv.open_scope("%02zu", k)) + continue; + + std::string name; + if (!kv.read(name)) + continue; + + pv_db_pv_item item; + item.index = k; + item.name = name; + diff.pv_item.push_back(item); + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.open_scope("hand_item")) { + for (int32_t k = 0; k < 20; k++) { + if (!kv.open_scope("%02zu", k)) + continue; + + std::string name; + if (!kv.read(name)) + continue; + + pv_db_pv_hand_item hand_item; + hand_item.index = k; + hand_item.id = -1; + hand_item.name = name; + diff.hand_item.push_back(hand_item); + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.open_scope("edit_effect")) { + for (int32_t k = 0; k < 0x200; k++) { + if (!kv.open_scope("%02zu", k)) + continue; + + std::string name; + if (!kv.read(name)) + continue; + + pv_db_pv_edit_effect edit_effect; + edit_effect.index = atoi(name.c_str()); + edit_effect.name = name; + diff.edit_effect.push_back(edit_effect); + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.open_scope("edit_effect_low_field")) { + for (int32_t k = 0; k < 0x200; k++) { + if (!kv.open_scope("%02zu", k)) + continue; + + int32_t index; + if (!kv.read(index)) + continue; + + if (index < diff.edit_effect.size()) + diff.edit_effect[index].low_field = true; + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.open_scope("title_image")) { + pv_db_pv_title_image& title_image = diff.title_image; + + float_t time; + if (kv.read("time", time)) + title_image.time = time; + + float_t end_time; + if (kv.read("end_time", end_time)) + title_image.end_time = end_time; + + std::string aet_name; + if (kv.read("aet_name", aet_name)) + title_image.aet_name = aet_name; + + kv.close_scope(); + } + + if (kv.open_scope("songinfo")) { + pv_db_pv_songinfo& songinfo = diff.songinfo; + + std::string music; + if (kv.read("music", music)) + songinfo.music = music; + + std::string lyrics; + if (kv.read("lyrics", lyrics)) + songinfo.lyrics = lyrics; + + std::string arranger; + if (kv.read("arranger", arranger)) + songinfo.arranger = arranger; + + std::string manipulator; + if (kv.read("manipulator", manipulator)) + songinfo.manipulator = manipulator; + + std::string pv_editor; + if (kv.read("pv_editor", pv_editor)) + songinfo.pv_editor = pv_editor; + + std::string guitar_player; + if (kv.read("guitar_player", guitar_player)) + songinfo.guitar_player = guitar_player; + + if (kv.open_scope("ex_info")) { + std::pair* ex_info = songinfo.ex_info; + + std::string key; + std::string val; + if (kv.read("0.key", key) && kv.read("0.val", val)) + ex_info[0] = { key, val }; + + if (kv.read("1.key", key) && kv.read("1.val", val)) + ex_info[1] = { key, val }; + + if (kv.read("2.key", key) && kv.read("2.val", val)) + ex_info[2] = { key, val }; + + if (kv.read("3.key", key) && kv.read("3.val", val)) + ex_info[3] = { key, val }; + + kv.close_scope(); + } + + kv.close_scope(); + } + + int32_t count; + if (!k && kv.read("movie_list", "length", count)) { + diff.movie_list.reserve(count); + for (int32_t l = 0; l < count; l++) { + if (!kv.open_scope(l)) + continue; + + pv_db_pv_movie movie; + if (kv.read("name", movie.name)) { + movie.index = l; + diff.movie_list.push_back(movie); + } + kv.close_scope(); + } + kv.close_scope(); + } + + std::string movie_file_name; + if (kv.read("movie_file_name", movie_file_name)) { + pv_db_pv_movie movie; + movie.index = 0; + movie.name = movie_file_name; + diff.movie_list.push_back(movie); + } + + std::string movie_surface; + if (kv.read("movie_surface", movie_surface)) { + auto elem = movie_surfaces.find(movie_surface); + if (elem != movie_surfaces.end()) + diff.movie_surface = elem->second; + } + + std::string effect_se_file_name; + if (kv.read("effect_se_file_name", effect_se_file_name)) + diff.effect_se_file_name = effect_se_file_name; + + if (!k && kv.read("effect_se_name_list", "length", count)) { + diff.effect_se_name_list.reserve(count); + for (int32_t l = 0; l < count; l++) { + if (!kv.open_scope(l)) + continue; + + std::string effect_se_name; + if (kv.read(effect_se_name)) + diff.effect_se_name_list.push_back(effect_se_name); + kv.close_scope(); + } + kv.close_scope(); + } + + if (k) { + int32_t version; + if (kv.read("version", version)) + diff.version = version; + + int32_t script_format; + if (kv.read("version", script_format)) + diff.script_format = script_format; + } + + int32_t high_speed_rate; + if (kv.read("high_speed_rate", high_speed_rate)) + diff.high_speed_rate = high_speed_rate; + + float_t hidden_timing; + if (kv.read("hidden_timing", hidden_timing)) + diff.hidden_timing = hidden_timing; + + float_t sudden_timing; + if (kv.read("sudden_timing", sudden_timing)) + diff.sudden_timing = sudden_timing; + + int32_t edit_chara_scale; + if (kv.read("edit_chara_scale", edit_chara_scale)) + diff.edit_chara_scale = edit_chara_scale == 1; + + for (int32_t l = 0; l < ROB_CHARA_COUNT; l++) { + if (!kv.open_scope("performer.%d.pv_costume", l)) + continue; + + int32_t pv_costume; + if (kv.read(pv_costume)) + pv_costumes[l][diff.difficulty] = pv_costume - 1; + kv.close_scope(); + } + } + + pv->difficulty[i].push_back(diff); + + kv.close_scope(); + } + kv.close_scope(); + } + + kv.close_scope(); + } + + if (kv.read("ex_song", "length", count)) { + int32_t chara_count = -1; + if (count <= 0) + goto ex_song_reset; + + pv->ex_song.data.reserve(count); + for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope(i)) + continue; + + const char* chara; + std::string file; + if (!kv.read("chara", chara) || !kv.read("file", file)) { + kv.close_scope(); + continue; + } + + std::string name; + kv.read("name", name); + + pv_db_pv_ex_song ex_song; + ex_song.chara[0] = chara_index_get_from_chara_name(chara); + + int32_t _chara_count = 1; + bool v533 = false; + + for (size_t j = 1; j < ROB_CHARA_COUNT; j++) { + sprintf_s(buf, sizeof(buf), "chara%zuP", j); + + const char* chara; + if (kv.read(buf, chara)) { + ex_song.chara[j] = chara_index_get_from_chara_name(chara); + if (v533) + goto ex_song_reset; + } + else + v533 = true; + } + + ex_song.file = file; + ex_song.name = name; + + int32_t count; + if (kv.read("ex_auth", "length", count)) { + ex_song.ex_auth.reserve(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) + continue; + + std::string org_name; + std::string name; + if (kv.read("org_name", org_name) + && kv.read("org_name", org_name)) { + pv_db_pv_ex_song_ex_auth ex_auth; + ex_auth.org_name = org_name; + ex_auth.name = name; + ex_song.ex_auth.push_back(ex_auth); + } + kv.close_scope(); + } + kv.close_scope(); + } + + pv->ex_song.data.push_back(ex_song); + if (chara_count < 0) + chara_count = _chara_count; + else if (chara_count != _chara_count) + goto ex_song_reset; + + kv.close_scope(); + } + + if (chara_count >= 0) + pv->ex_song.chara_count = chara_count; + else + ex_song_reset: + pv->ex_song.reset(); + + kv.close_scope(); + } + + if (kv.read("osage_init", "length", count)) { + pv->osage_init.reserve(count); + for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope(i)) + continue; + + std::string motion; + int32_t frame; + std::string stage; + if (kv.read("motion", motion) + && kv.read("frame", frame) + && kv.read("stage", stage)) { + pv_db_pv_osage_init osage_init; + osage_init.motion = motion; + osage_init.frame = frame; + osage_init.stage = aft_stage_data->get_stage_index(stage.c_str()); + pv->osage_init.push_back(osage_init); + } + + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.read("stage_param", "length", count)) { + pv->stage_param.reserve(count); + for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope(i)) + continue; + + pv_db_pv_stage_param stage_param; + std::string stage; + if (kv.read("stage", stage)) + stage_param.stage = aft_stage_data->get_stage_index(stage.c_str()); + + int32_t mhd_id; + if (kv.read("mhd_id", mhd_id)) + stage_param.mhd_id = mhd_id; + + if (stage_param.stage == -1 && stage_param.mhd_id < 0) { + kv.close_scope(); + break; + } + + std::string collision_file; + if (kv.read("collision_file", collision_file)) + stage_param.collision_file = collision_file; + + std::string wind_file; + if (kv.read("collision_file", wind_file)) + stage_param.wind_file = wind_file; + + pv->stage_param.push_back(stage_param); + + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.open_scope("disp2d")) { + pv_db_pv_disp2d& disp2d = pv->disp2d; + + std::string set_name; + if (kv.read("set_name", set_name)) + disp2d.set_name = set_name; + + int32_t target_shadow_type; + if (kv.read("target_shadow_type", target_shadow_type)) + disp2d.target_shadow_type = target_shadow_type > 0; + + int32_t title_start_2d_field; + int32_t title_end_2d_field; + if (kv.read("title_start_2d_field", title_start_2d_field) + && kv.read("title_end_2d_field", title_end_2d_field)) { + disp2d.title_start_2d_field = title_start_2d_field; + disp2d.title_end_2d_field = title_end_2d_field; + } + + int32_t title_start_2d_low_field; + int32_t title_end_2d_low_field; + if (kv.read("title_start_2d_low_field", title_start_2d_low_field) + && kv.read("title_end_2d_low_field", title_end_2d_low_field)) { + disp2d.title_start_2d_low_field = title_start_2d_low_field; + disp2d.title_end_2d_low_field = title_end_2d_low_field; + } + + int32_t title_start_3d_field; + int32_t title_end_3d_field; + if (kv.read("title_start_3d_field", title_start_3d_field) + && kv.read("title_end_3d_field", title_end_3d_field)) { + disp2d.title_start_3d_field = title_start_3d_field; + disp2d.title_end_3d_field = title_end_3d_field; + } + + std::string title_2d_layer; + if (kv.read("title_2d_layer", title_2d_layer)) + disp2d.title_2d_layer = title_2d_layer; + + kv.close_scope(); + } + + std::string use_osage_play_data; + if (kv.read("use_osage_play_data", use_osage_play_data)) + pv->use_osage_play_data = !use_osage_play_data.compare("false"); + + std::string pv_expression_file_name; + if (kv.read("pv_expression.file_name", pv_expression_file_name)) + pv->pv_expression_file_name = pv_expression_file_name; + + if (kv.read("another_song", "length", count)) { + pv->another_song.reserve(count); + for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope(i)) + continue; + + pv_db_pv_another_song another_song; + + std::string name; + if (kv.read("name", name)) + another_song.name = name; + + std::string song_file_name; + if (kv.read("song_file_name", song_file_name)) + another_song.song_file_name = song_file_name; + + pv->another_song.push_back(another_song); + + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.has_key("pre_play_script")) + pv->pre_play_script = true; + + for (int32_t i = 0; i < 6; i++) { + pv_db_pv_frame_texture& frame_texture = pv->frame_texture[i]; + + std::string data; + if (kv.read(frame_texture_names[i], data)) + frame_texture.data = data; + + const char* type; + if (kv.read(frame_texture_type_names[i], type)) { + if (!str_utils_compare(type, "PRE_PP")) + frame_texture.type = PV_FRAME_TEXTURE_PRE_PP; + else if (!str_utils_compare(type, "POST_PP")) + frame_texture.type = PV_FRAME_TEXTURE_POST_PP; + else if (!str_utils_compare(type, "FB")) + frame_texture.type = PV_FRAME_TEXTURE_FB; + else + frame_texture.type = PV_FRAME_TEXTURE_POST_PP; + } + else + frame_texture.type = PV_FRAME_TEXTURE_POST_PP; + } + + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) + for (int32_t j = 0; j < PV_DIFFICULTY_MAX; j++) { + int32_t pv_costume = pv_costumes[i][j]; + if (pv_costume == -1) + continue; + else if (i >= pv->performer.size()) + break; + + pv->performer[i].set_pv_costume(pv_costume, j); + } + + kv.close_scope(); + return true; + } + + bool TaskPvDB::ParsePvField(pv_db_pv* pv, key_val& kv, int32_t pv_id) { + if (!pv) + return false; + + char buf[0x100]; + sprintf_s(buf, sizeof(buf), "pv_%03d", pv_id); + + if (!kv.has_key(buf) || !kv.open_scope(buf)) + return false; + + data_struct* aft_data = &data_list[DATA_AFT]; + stage_database* aft_stage_data = &aft_data->data_ft.stage_data; + + for (int32_t i = 0; i < PV_DIFFICULTY_MAX; i++) { + std::vector& diff = pv->difficulty[i]; + for (pv_db_pv_difficulty& j : diff) { + if (!j.script_file_name.size()) + continue; + + char buf[0x200]; + sprintf_s(buf, sizeof(buf), "difficulty.%s.%d.field", difficulty_names[i], j.edition); + + int32_t count; + if (!kv.read(buf, "length", count) && !kv.read("field", "length", count)) + continue; + + j.field.data.clear(); + j.field.ex_stage_set = false; + + j.field.data.reserve(count); + for (int32_t k = 0; k < count; k++) { + if (!kv.open_scope("%02d", k)) + continue; + + pv_db_pv_field field;; + + const char* stage; + if (kv.read("stage", stage)) + field.stage_index = aft_stage_data->get_stage_index(stage); + + const char* ex_stage; + if (kv.read("ex_stage", ex_stage)) { + field.ex_stage_index = aft_stage_data->get_stage_index(ex_stage); + if (field.ex_stage_index != -1) + j.field.ex_stage_set = true; + } + + std::string auth_3d; + if (kv.read("auth_3d", auth_3d)) + field.auth_3d_list.push_back(auth_3d); + + int32_t count; + if (kv.read("auth_3d_list", "length", count)) { + field.auth_3d_list.reserve(count); + for (int32_t l = 0; l < count; l++) { + if (!kv.open_scope(l)) + continue; + + std::string auth_3d; + if (kv.read(auth_3d)) + field.auth_3d_list.push_back(auth_3d); + kv.close_scope(); + } + kv.close_scope(); + } + + std::string ex_auth_3d; + if (kv.read("ex_auth_3d", ex_auth_3d)) + field.ex_auth_3d_list.push_back(ex_auth_3d); + + count; + if (kv.read("auth_3d_list", "length", count)) { + field.ex_auth_3d_list.reserve(count); + for (int32_t l = 0; l < count; l++) { + if (!kv.open_scope(l)) + continue; + + std::string ex_auth_3d; + if (kv.read(ex_auth_3d)) + field.ex_auth_3d_list.push_back(ex_auth_3d); + kv.close_scope(); + } + kv.close_scope(); + } + + int32_t auth_3d_frame; + if (kv.read("auth_3d_frame", auth_3d_frame)) + field.auth_3d_frame_list.push_back(auth_3d_frame); + + count; + if (kv.read("auth_3d_frame_list", "length", count)) { + field.auth_3d_frame_list.reserve(count); + for (int32_t l = 0; l < count; l++) { + if (!kv.open_scope(l)) + continue; + + int32_t auth_3d_frame; + if (kv.read(auth_3d_frame)) + field.auth_3d_frame_list.push_back(auth_3d_frame); + kv.close_scope(); + } + kv.close_scope(); + } + + kv.read("light", field.light); + if (kv.read("light_frame", field.light_frame)) + field.light_frame_set = true; + + for (int32_t l = 0; l < 4; l++) { + std::string aet; + if (kv.read(aet_names[l], aet)) + field.aet[l].push_back(aet); + + int32_t count; + if (kv.read(aet_list_names[l], "length", count)) { + field.aet[l].reserve(count); + for (int32_t m = 0; m < count; m++) { + if (!kv.open_scope(m)) + continue; + + std::string aet; + if (kv.read(aet)) + field.aet[l].push_back(aet); + kv.close_scope(); + } + kv.close_scope(); + } + } + + for (int32_t l = 0; l < 4; l++) { + std::string aet_id; + if (kv.read(aet_id_names[l], aet_id)) + field.aet_id[l].push_back(aet_id); + + int32_t count; + if (kv.read(aet_id_list_names[l], "length", count)) { + field.aet_id[l].reserve(count); + for (int32_t m = 0; m < count; m++) { + if (!kv.open_scope(m)) + continue; + + std::string aet_id; + if (kv.read(aet_id)) + field.aet[l].push_back(aet_id); + kv.close_scope(); + } + kv.close_scope(); + } + } + + for (int32_t l = 0; l < 4; l++) { + int32_t aet_frame; + if (kv.read(aet_id_names[l], aet_frame)) + field.aet_frame[l].push_back(aet_frame); + + int32_t count; + if (kv.read(aet_id_list_names[l], "length", count)) { + field.aet_frame[l].reserve(count); + for (int32_t m = 0; m < count; m++) { + if (!kv.open_scope(m)) + continue; + + int32_t aet_frame; + if (kv.read(aet_frame)) + field.aet_frame[l].push_back(aet_frame); + kv.close_scope(); + } + kv.close_scope(); + } + } + + kv.read("spr_set_back", field.spr_set_back); + kv.read("stage_flag", field.stage_flag); + kv.read("npr_type", field.npr_type); + kv.read("cam_blur", field.cam_blur); + kv.read("sdw_off", field.sdw_off); + + if (kv.read("play_eff_list", "length", count)) { + field.play_eff_list.reserve(count); + for (int32_t l = 0; l < count; l++) { + if (!kv.open_scope(l)) + continue; + + std::string play_eff; + if (kv.read(play_eff)) + field.play_eff_list.push_back(play_eff); + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.read("stop_eff_list", "length", count)) { + field.stop_eff_list.reserve(count); + for (int32_t l = 0; l < count; l++) { + if (!kv.open_scope(l)) + continue; + + std::string stop_eff; + if (kv.read(stop_eff)) + field.stop_eff_list.push_back(stop_eff); + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.read("effect_rs_list", "length", count)) { + field.effect_rs_list.reserve(count); + for (int32_t l = 0; l < count; l++) { + if (!kv.open_scope(l)) + continue; + + std::string effect_rs; + if (kv.read(effect_rs)) + field.effect_rs_list.push_back(effect_rs); + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.read("effect_emision_rs_list", "length", count)) { + field.effect_rs_list.reserve(count); + for (int32_t l = 0; l < count; l++) { + if (!kv.open_scope(l)) + continue; + + float_t effect_emision_rs; + if (kv.read(effect_emision_rs)) + field.effect_emision_rs_list.push_back(effect_emision_rs); + kv.close_scope(); + } + kv.close_scope(); + } + + j.field.data.push_back(field); + + kv.close_scope(); + } + kv.close_scope(); + } + } + kv.close_scope(); + return false; + } +} + +bool task_pv_db_append_task() { + return app::TaskWork::AppendTask(task_pv_db_get(), "PV DB"); +} + +void task_pv_db_free_task() { + task_pv_db_get()->SetDest(); +} + +pv_db::TaskPvDB* task_pv_db_get() { + return &task_pv_db; +} + +uint32_t task_pv_db_get_paths_count() { + return (uint32_t)task_pv_db_get()->paths.size(); +} + +pv_db_pv* task_pv_db_get_pv(int32_t pv_id) { + std::list& pv_data = task_pv_db_get()->pv_data; + for (pv_db_pv& i : pv_data) + if (i.id == pv_id) + return &i; + return 0; +} + +pv_db_pv_difficulty* task_pv_db_get_pv_difficulty(int32_t pv_id, + int32_t difficulty, pv_attribute_type attribute_type) { + pv_db_pv* pv = task_pv_db_get_pv(pv_id); + if (!pv) + return 0; + + return pv->get_difficulty(difficulty, attribute_type); +} + +pv_db_pv_difficulty* task_pv_db_get_pv_difficulty(int32_t pv_id, + int32_t difficulty, int32_t edition) { + pv_db_pv* pv = task_pv_db_get_pv(pv_id); + if (!pv) + return 0; + + return pv->get_difficulty(difficulty, edition); +} + +bool task_pv_db_is_paths_empty() { + return !task_pv_db_get()->paths.size(); +} diff --git a/src/CRE/pv_db.hpp b/src/CRE/pv_db.hpp new file mode 100644 index 00000000..8e718206 --- /dev/null +++ b/src/CRE/pv_db.hpp @@ -0,0 +1,518 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include +#include +#include +#include +#include +#include "../KKdLib/default.hpp" +#include "../KKdLib/key_val.hpp" +#include "rob.hpp" +#include "task.hpp" + +enum pv_attribute_type { + PV_ATTRIBUTE_ORIGINAL = 0x00, + PV_ATTRIBUTE_EXTRA = 0x01, + PV_ATTRIBUTE_END = 0x02, +}; + +enum pv_chreff_data_type { + PV_CHREFF_DATA_AUTH3D = 0x00, + PV_CHREFF_DATA_AUTH3D_OBJ = 0x01, +}; + +enum pv_movie_surface { + PV_MOVIE_SURFACE_BACK = 0x00, + PV_MOVIE_SURFACE_FRONT = 0x01, +}; + +enum pv_difficulty { + PV_DIFFICULTY_EASY = 0x00, + PV_DIFFICULTY_NORMAL = 0x01, + PV_DIFFICULTY_HARD = 0x02, + PV_DIFFICULTY_EXTREME = 0x03, + PV_DIFFICULTY_ENCORE = 0x04, + PV_DIFFICULTY_MAX = 0x05, +}; + +enum pv_frame_texture_type { + PV_FRAME_TEXTURE_PRE_PP = 0x00, + PV_FRAME_TEXTURE_POST_PP = 0x01, + PV_FRAME_TEXTURE_FB = 0x02, +}; + +enum pv_level { + PV_LV_00_0 = 0x00, + PV_LV_00_5 = 0x01, + PV_LV_01_0 = 0x02, + PV_LV_01_5 = 0x03, + PV_LV_02_0 = 0x04, + PV_LV_02_5 = 0x05, + PV_LV_03_0 = 0x06, + PV_LV_03_5 = 0x07, + PV_LV_04_0 = 0x08, + PV_LV_04_5 = 0x09, + PV_LV_05_0 = 0x0A, + PV_LV_05_5 = 0x0B, + PV_LV_06_0 = 0x0C, + PV_LV_06_5 = 0x0D, + PV_LV_07_0 = 0x0E, + PV_LV_07_5 = 0x0F, + PV_LV_08_0 = 0x10, + PV_LV_08_5 = 0x11, + PV_LV_09_0 = 0x12, + PV_LV_09_5 = 0x13, + PV_LV_10_0 = 0x14, + PV_LV_MAX = 0x15, +}; + +enum pv_performer_size { + PV_PERFORMER_NORMAL = 0x00, + PV_PERFORMER_PLAY_CHARA = 0x01, + PV_PERFORMER_PV_CHARA = 0x02, + PV_PERFORMER_SHORT = 0x03, + PV_PERFORMER_TALL = 0x04, +}; + +enum pv_performer_type { + PV_PERFORMER_VOCAL = 0x00, + PV_PERFORMER_PSEUDO_DEFAULT = 0x01, + PV_PERFORMER_PSEUDO_SAME = 0x02, + PV_PERFORMER_PSEUDO_SWIM = 0x03, + PV_PERFORMER_PSEUDO_SWIM_S = 0x04, + PV_PERFORMER_PSEUDO_MYCHARA = 0x05, + PV_PERFORMER_GUEST = 0x06, +}; + +struct pv_db_pv_lyric { + int32_t index; + std::string data; + + pv_db_pv_lyric(); + ~pv_db_pv_lyric(); +}; + +struct pv_db_pv_sabi { + float_t start_time; + float_t play_time; +}; + +struct pv_db_pv_performer { + pv_performer_type type; + int32_t chara; + int32_t costume; + int32_t pv_costume[5]; + bool fixed; + int32_t exclude; + pv_performer_size size; + int32_t pseudo_same_id; + int32_t item[4]; + + pv_db_pv_performer(); + + void set_pv_costume(int32_t pv_costume, int32_t difficulty); +}; + +struct pv_db_pv_attribute { + pv_attribute_type type; + std::bitset<128> bitset; + + pv_db_pv_attribute(); + ~pv_db_pv_attribute(); + + void reset(); +}; + +struct pv_db_pv_motion { + int32_t index; + int32_t id; + std::string name; + + pv_db_pv_motion(); + ~pv_db_pv_motion(); +}; + +struct pv_db_pv_field { + int32_t index; + int32_t stage_index; + int32_t ex_stage_index; + std::vector auth_3d_list; + std::vector ex_auth_3d_list; + std::vector auth_3d_frame_list; + std::string light; + int32_t light_frame; + bool light_frame_set; + std::vector aet[4]; + std::vector aet_id[4]; + std::vector aet_frame[4]; + std::string spr_set_back; + bool stage_flag; + int32_t npr_type; + int32_t cam_blur; + bool sdw_off; + std::vector play_eff_list; + std::vector stop_eff_list; + std::vector effect_rs_list; + std::vector effect_emision_rs_list; + + pv_db_pv_field(); + ~pv_db_pv_field(); + + void reset(); +}; + +struct pv_db_pv_field_parent { + std::vector data; + bool ex_stage_set; + + pv_db_pv_field_parent(); + ~pv_db_pv_field_parent(); + + void reset(); +}; + +struct pv_db_pv_item { + int32_t index; + std::string name; + + pv_db_pv_item(); + ~pv_db_pv_item(); +}; + +struct pv_db_pv_hand_item { + int32_t index; + int32_t id; + std::string name; + + pv_db_pv_hand_item(); + ~pv_db_pv_hand_item(); +}; + +struct struc_426 { + int32_t field_0; + int32_t field_4; + int32_t field_8; +}; + +struct pv_db_pv_edit_effect { + int32_t index; + std::string name; + bool low_field; + + pv_db_pv_edit_effect(); + ~pv_db_pv_edit_effect(); + + void reset(); +}; + +struct pv_db_pv_title_image { + float_t time; + float_t end_time; + std::string aet_name; + + pv_db_pv_title_image(); + ~pv_db_pv_title_image(); + + void reset(); +}; + +struct pv_db_pv_songinfo { + std::string music; + std::string lyrics; + std::string arranger; + std::string manipulator; + std::string pv_editor; + std::string guitar_player; + std::pair ex_info[4]; + + pv_db_pv_songinfo(); + ~pv_db_pv_songinfo(); + + void reset(); +}; + +struct pv_db_pv_movie { + int32_t index; + std::string name; + + pv_db_pv_movie(); + ~pv_db_pv_movie(); +}; + +struct pv_db_pv_difficulty { + pv_difficulty difficulty; + int32_t edition; + pv_db_pv_attribute attribute; + std::string script_file_name; + pv_level level; + int32_t level_sort_index; + std::string se_name; + std::string pvbranch_success_se_name; + std::string slide_name; + std::string chainslide_first_name; + std::string chainslide_sub_name; + std::string chainslide_success_name; + std::string chainslide_failure_name; + std::string slidertouch_name; + std::vector motion[ROB_CHARA_COUNT]; + pv_db_pv_field_parent field; + std::vector pv_item; + std::vector hand_item; + std::vector field_228; + std::vector field_240; + std::vector field_258; + std::vector edit_effect; + pv_db_pv_title_image title_image; + pv_db_pv_songinfo songinfo; + std::vector movie_list; + pv_movie_surface movie_surface; + std::string effect_se_file_name; + std::vector effect_se_name_list; + int32_t version; + int32_t script_format; + int32_t high_speed_rate; + float_t hidden_timing; + float_t sudden_timing; + bool edit_chara_scale; + + pv_db_pv_difficulty(); + ~pv_db_pv_difficulty(); + + void reset(); +}; + +struct pv_db_pv_ex_song_ex_auth { + std::string org_name; + std::string name; + + pv_db_pv_ex_song_ex_auth(); + ~pv_db_pv_ex_song_ex_auth(); +}; + +struct pv_db_pv_ex_song { + int32_t chara[ROB_CHARA_COUNT]; + std::string file; + std::string name; + std::vector ex_auth; + + pv_db_pv_ex_song(); + ~pv_db_pv_ex_song(); + + void reset(); +}; + +struct pv_db_pv_ex_song_parent { + int32_t chara_count; + std::vector data; + + pv_db_pv_ex_song_parent(); + ~pv_db_pv_ex_song_parent(); + + void reset(); +}; + +struct pv_db_pv_mdata { + bool flag; + std::string dir; + + pv_db_pv_mdata(); + ~pv_db_pv_mdata(); + + void reset(); +}; + +struct pv_db_pv_osage_init { + std::string motion; + int32_t frame; + int32_t stage; + + pv_db_pv_osage_init(); + ~pv_db_pv_osage_init(); +}; + +struct pv_db_pv_stage_param { + int32_t stage; + int32_t mhd_id; + std::string collision_file; + std::string wind_file; + + pv_db_pv_stage_param(); + ~pv_db_pv_stage_param(); +}; + +struct pv_db_pv_disp2d { + std::string set_name; + int32_t target_shadow_type; + int32_t title_start_2d_field; + int32_t title_end_2d_field; + int32_t title_start_2d_low_field; + int32_t title_end_2d_low_field; + int32_t title_start_3d_field; + int32_t title_end_3d_field; + std::string title_2d_layer; + + pv_db_pv_disp2d(); + ~pv_db_pv_disp2d(); + + void reset(); +}; + +struct pv_db_pv_chreff_data { + pv_chreff_data_type type; + std::string name; + + pv_db_pv_chreff_data(); + ~pv_db_pv_chreff_data(); +}; + +struct pv_db_pv_chreff { + int32_t id; + std::string name; + std::vector data; + + pv_db_pv_chreff(); + ~pv_db_pv_chreff(); +}; + +struct pv_db_pv_chrcam { + int32_t id; + std::string chara; + std::string org_name; + std::string name; + + pv_db_pv_chrcam(); + ~pv_db_pv_chrcam(); +}; + +struct pv_db_pv_chrmot { + int32_t id; + std::string chara; + std::string org_name; + std::string name; + + pv_db_pv_chrmot(); + ~pv_db_pv_chrmot(); +}; + +struct pv_db_pv_eyes_rot_rate { + float_t xp_rate; + float_t xn_rate; +}; + +struct pv_db_pv_another_song { + std::string name; + std::string song_file_name; + + pv_db_pv_another_song(); + ~pv_db_pv_another_song(); +}; + +struct pv_db_pv_frame_texture { + std::string data; + pv_frame_texture_type type; + + pv_db_pv_frame_texture(); + ~pv_db_pv_frame_texture(); + + void reset(); +}; + +struct pv_db_pv_auth_replace_by_module { + int32_t id; + int32_t module_id; + std::string org_name; + std::string name; + + pv_db_pv_auth_replace_by_module(); + ~pv_db_pv_auth_replace_by_module(); +}; + +struct pv_db_pv { + int32_t id; + int32_t date; + std::string song_name; + std::string song_name_reading; + int32_t remix_parent; + int32_t bpm; + std::string song_file_name; + std::vector lyric; + pv_db_pv_sabi sabi; + int32_t edit; + bool disable_calc_motfrm_limit; + std::vector performer; + std::vector difficulty[PV_DIFFICULTY_MAX]; + pv_db_pv_ex_song_parent ex_song; + pv_db_pv_mdata mdata; + std::vector osage_init; + std::vector stage_param; + pv_db_pv_disp2d disp2d; + bool use_osage_play_data; + std::string pv_expression_file_name; + std::vector chreff; + std::vector chrcam; + std::vector chrmot; + bool eyes_xrot_adjust; + bool is_old_pv; + eyes_base_adjust_type eyes_base_adjust_type; + std::map eyes_rot_rate; + std::vector another_song; + bool pre_play_script; + pv_db_pv_frame_texture frame_texture[6]; + std::vector auth_replace_by_module; + + pv_db_pv(); + ~pv_db_pv(); + + pv_db_pv_difficulty* get_difficulty(int32_t difficulty, pv_attribute_type attribute_type); + pv_db_pv_difficulty* get_difficulty(int32_t difficulty, int32_t edition); + void reset(); +}; + +namespace pv_db { + class TaskPvDB : public app::Task { + public: + int32_t state; + std::list> paths; + p_file_handler file_handler; + std::list pv_data; + bool reset; + bool field_99; + std::map performer_types; + std::map performer_sizes; + std::map chreff_data_types; + std::map movie_surfaces; + std::map pv_levels; + + TaskPvDB(); + virtual ~TaskPvDB() override; + + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + + void InitChrEffDataTypes(); + void InitMovieSurfaces(); + void InitPerformerSizes(); + void InitPerformerTypes(); + void InitPvLevels(); + + bool ParsePvDb(pv_db_pv* pv, key_val& kv, int32_t pv_id); + bool ParsePvField(pv_db_pv* pv, key_val& kv, int32_t pv_id); + }; +} + +extern bool task_pv_db_append_task(); +extern void task_pv_db_free_task(); +extern pv_db::TaskPvDB* task_pv_db_get(); +extern uint32_t task_pv_db_get_paths_count(); +extern pv_db_pv* task_pv_db_get_pv(int32_t pv_id); +extern pv_db_pv_difficulty* task_pv_db_get_pv_difficulty(int32_t pv_id, + int32_t difficulty, pv_attribute_type attribute_type); +extern pv_db_pv_difficulty* task_pv_db_get_pv_difficulty(int32_t pv_id, + int32_t difficulty, int32_t edition); +extern bool task_pv_db_is_paths_empty(); diff --git a/src/CRE/pv_param_task.cpp b/src/CRE/pv_param.cpp similarity index 83% rename from src/CRE/pv_param_task.cpp rename to src/CRE/pv_param.cpp index a53f3ebd..ce7133c5 100644 --- a/src/CRE/pv_param_task.cpp +++ b/src/CRE/pv_param.cpp @@ -3,68 +3,70 @@ GitHub/GitLab: korenkonder */ -#include "pv_param_task.hpp" +#include "pv_param.hpp" #include "post_process.hpp" #include "render_context.hpp" extern render_context* rctx_ptr; -pv_param_bloom::pv_param_bloom() { - id = -1; - color = vec3_null; - brightpass = vec3_null; - range = 0.0f; -} +namespace pv_param { + bloom::bloom() { + id = -1; + color = vec3_null; + brightpass = vec3_null; + range = 0.0f; + } -pv_param_dof::pv_param_dof() { - id = -1; - focus = 0.0f; - focus_range = 100.0f; - fuzzing_range = 2.0f; - ratio = 0.0f; - quality = 1.0f; -} + dof::dof() { + id = -1; + focus = 0.0f; + focus_range = 100.0f; + fuzzing_range = 2.0f; + ratio = 0.0f; + quality = 1.0f; + } -pv_param_chara_alpha::pv_param_chara_alpha() { - frame = -1.0f; - duration = 1.0f; - prev_alpha = 1.0f; - alpha = 1.0f; - type = 0; -} + chara_alpha::chara_alpha() { + frame = -1.0f; + duration = 1.0f; + prev_alpha = 1.0f; + alpha = 1.0f; + type = 0; + } -pv_param_color_correction::pv_param_color_correction() { - id = -1; - hue = 1.0f; - saturation = 1.0f; - lightness = 1.0f; - exposure = 1.0f; - gamma = vec3_identity; - contrast = 1.0f; -} + color_correction::color_correction() { + id = -1; + hue = 1.0f; + saturation = 1.0f; + lightness = 1.0f; + exposure = 1.0f; + gamma = vec3_identity; + contrast = 1.0f; + } -pv_param_post_process_data_struct::pv_param_post_process_data_struct() { + post_process_data_struct::post_process_data_struct() { -} + } -pv_param_post_process_data_struct::~pv_param_post_process_data_struct() { + post_process_data_struct::~post_process_data_struct() { -} + } -pv_param_file_data_struct::pv_param_file_data_struct() { + file_data_struct::file_data_struct() { -} + } -pv_param_file_data_struct::~pv_param_file_data_struct() { + file_data_struct::~file_data_struct() { -} + } -pv_param_light_data_struct::pv_param_light_data_struct() { + light_data_struct::light_data_struct() { -} + } -pv_param_light_data_struct::~pv_param_light_data_struct() { + light_data_struct::~light_data_struct() { + } } namespace pv_param_task { @@ -107,7 +109,7 @@ namespace pv_param_task { else vec3_lerp_scalar(data.data_prev.color, data.data.color, value, frame / duration); - post_process_blur_set_intensity(rctx_ptr->post_process.blur, &value); + rctx_ptr->post_process.blur->set_intensity(value); frame += 1.0f; if (frame > duration) { @@ -162,8 +164,8 @@ namespace pv_param_task { } post_process_tone_map* tone_map = rctx_ptr->post_process.tone_map; - post_process_tone_map_set_saturate_coeff(tone_map, saturation); - post_process_tone_map_set_exposure(tone_map, exposure * 2.0f); + tone_map->set_saturate_coeff(saturation); + tone_map->set_exposure(exposure * 2.0f); vec3 tone_trans_start; vec3 tone_trans_end; @@ -171,8 +173,7 @@ namespace pv_param_task { CalcToneTrans(contrast + gamma.y, tone_trans_start.y, tone_trans_end.y); CalcToneTrans(contrast + gamma.z, tone_trans_start.z, tone_trans_end.z); - post_process_tone_map_set_tone_trans_start(tone_map, &tone_trans_start); - post_process_tone_map_set_tone_trans_end(tone_map, &tone_trans_end); + tone_map->set_tone_trans(tone_trans_start, tone_trans_end); frame += 1.0f; if (frame > duration) { @@ -211,13 +212,13 @@ namespace pv_param_task { } void PostProcessCtrlCharaAlpha::Reset() { - for (pv_param_chara_alpha& i : data.data) + for (pv_param::chara_alpha& i : data.data) i = {}; } void PostProcessCtrlCharaAlpha::Set() { int32_t index = 0; - for (pv_param_chara_alpha& i : data.data) { + for (pv_param::chara_alpha& i : data.data) { if (i.frame < 0.0f) { index++; continue; @@ -266,7 +267,7 @@ namespace pv_param_task { void PostProcessCtrlCharaItemAlpha::Set() { int32_t index = 0; - for (pv_param_chara_alpha& i : data.data) { + for (pv_param::chara_alpha& i : data.data) { if (i.frame < 0.0f) { index++; continue; @@ -355,7 +356,7 @@ namespace pv_param_task { } } - void PostProcessCtrlDof::SetData(pv_param_dof* dof, float_t duration) { + void PostProcessCtrlDof::SetData(pv_param::dof* dof, float_t duration) { frame = 0.0f; this->duration = duration; data.data = *dof; @@ -375,11 +376,11 @@ namespace pv_param_task { PostProcessTask::PostProcessTask() { } - + PostProcessTask::~PostProcessTask() { } - + bool PostProcessTask::Init() { dof.Reset(); cc.Reset(); @@ -388,7 +389,7 @@ namespace pv_param_task { chara_item_alpha.Reset(); return true; } - + bool PostProcessTask::Ctrl() { dof.Set(); cc.Set(); @@ -397,7 +398,7 @@ namespace pv_param_task { chara_item_alpha.Set(); return false; } - + bool PostProcessTask::Dest() { dof.Reset(); cc.Reset(); diff --git a/src/CRE/pv_param.hpp b/src/CRE/pv_param.hpp new file mode 100644 index 00000000..a2bab6a4 --- /dev/null +++ b/src/CRE/pv_param.hpp @@ -0,0 +1,204 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include +#include +#include +#include "../KKdLib/default.hpp" +#include "../KKdLib/vec.hpp" +#include "light_param.hpp" +#include "rob.hpp" +#include "task.hpp" + +namespace pv_param { + struct bloom { + int32_t id; + vec3 color; + vec3 brightpass; + float_t range; + + bloom(); + }; + + struct dof { + int32_t id; + float_t focus; + float_t focus_range; + float_t fuzzing_range; + float_t ratio; + float_t quality; + + dof(); + }; + + struct chara_alpha { + float_t frame; + float_t duration; + float_t prev_alpha; + float_t alpha; + int32_t type; + + chara_alpha(); + }; + + struct color_correction { + int32_t id; + float_t hue; + float_t saturation; + float_t lightness; + float_t exposure; + vec3 gamma; + float_t contrast; + + color_correction(); + }; + + struct post_process_data_struct { + dof dof_default; + color_correction cc_default; + bloom bloom_default; + std::string dof_file; + std::string cc_file; + std::string bloom_file; + std::vector dof; + std::vector cc; + std::vector bloom; + + post_process_data_struct(); + ~post_process_data_struct(); + }; + + struct file_data_struct { + std::vector dof_default; + std::vector cc_default; + std::vector bloom_default; + std::map> dof; + std::map> cc; + std::map> bloom; + + file_data_struct(); + ~file_data_struct(); + }; + + struct light_data_struct { + light_param_light_data light_default; + std::string chara_light_file; + std::string stage_light_file; + std::map chara_light; + std::map stage_light; + + light_data_struct(); + ~light_data_struct(); + }; +} + +namespace pv_param_task { + class PostProcessCtrl { + public: + float_t frame; + float_t duration; + + PostProcessCtrl(); + ~PostProcessCtrl(); + + virtual void Reset() = 0; + virtual void Set() = 0; + }; + + class PostProcessCtrlBloom : public PostProcessCtrl { + public: + struct Data { + pv_param::bloom data; + pv_param::bloom data_prev; + + Data(); + } data; + + PostProcessCtrlBloom(); + ~PostProcessCtrlBloom(); + + virtual void Reset() override; + virtual void Set() override; + }; + + class PostProcessCtrlCC : public PostProcessCtrl { + public: + struct Data { + pv_param::color_correction data; + pv_param::color_correction data_prev; + + Data(); + } data; + + PostProcessCtrlCC(); + ~PostProcessCtrlCC(); + + virtual void Reset() override; + virtual void Set() override; + + void CalcToneTrans(float_t value, float_t& tone_trans_start, float_t& tone_trans_end); + }; + + class PostProcessCtrlCharaAlpha : public PostProcessCtrl { + public: + struct Data { + pv_param::chara_alpha data[ROB_CHARA_COUNT]; + + Data(); + } data; + + PostProcessCtrlCharaAlpha(); + ~PostProcessCtrlCharaAlpha(); + + virtual void Reset() override; + virtual void Set() override; + }; + + class PostProcessCtrlCharaItemAlpha : public PostProcessCtrlCharaAlpha { + public: + PostProcessCtrlCharaItemAlpha(); + ~PostProcessCtrlCharaItemAlpha(); + + virtual void Set() override; + }; + + class PostProcessCtrlDof : public PostProcessCtrl { + public: + struct Data { + pv_param::dof data; + pv_param::dof data_prev; + + Data(); + } data; + + PostProcessCtrlDof(); + ~PostProcessCtrlDof(); + + virtual void Reset() override; + virtual void Set() override; + + void SetData(pv_param::dof* dof, float_t duration); + }; + + class PostProcessTask : public app::Task { + public: + PostProcessCtrlDof dof; + PostProcessCtrlCC cc; + PostProcessCtrlBloom bloom; + PostProcessCtrlCharaAlpha chara_alpha; + PostProcessCtrlCharaItemAlpha chara_item_alpha; + + PostProcessTask(); + virtual ~PostProcessTask() override; + + virtual bool Init() override; + virtual bool Ctrl() override; + virtual bool Dest() override; + }; + + extern PostProcessTask post_process_task; +} diff --git a/src/CRE/pv_param_task.hpp b/src/CRE/pv_param_task.hpp deleted file mode 100644 index b4dfa6c8..00000000 --- a/src/CRE/pv_param_task.hpp +++ /dev/null @@ -1,202 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include -#include -#include -#include "../KKdLib/default.h" -#include "../KKdLib/vec.h" -#include "light_param.hpp" -#include "rob.hpp" -#include "task.hpp" - -struct pv_param_bloom { - int32_t id; - vec3 color; - vec3 brightpass; - float_t range; - - pv_param_bloom(); -}; - -struct pv_param_dof { - int32_t id; - float_t focus; - float_t focus_range; - float_t fuzzing_range; - float_t ratio; - float_t quality; - - pv_param_dof(); -}; - -struct pv_param_chara_alpha { - float_t frame; - float_t duration; - float_t prev_alpha; - float_t alpha; - int32_t type; - - pv_param_chara_alpha(); -}; - -struct pv_param_color_correction { - int32_t id; - float_t hue; - float_t saturation; - float_t lightness; - float_t exposure; - vec3 gamma; - float_t contrast; - - pv_param_color_correction(); -}; - -struct pv_param_post_process_data_struct { - pv_param_dof dof_default; - pv_param_color_correction cc_default; - pv_param_bloom bloom_default; - std::string dof_file; - std::string cc_file; - std::string bloom_file; - std::vector dof; - std::vector cc; - std::vector bloom; - - pv_param_post_process_data_struct(); - ~pv_param_post_process_data_struct(); -}; - -struct pv_param_file_data_struct { - std::vector dof_default; - std::vector cc_default; - std::vector bloom_default; - std::map> dof; - std::map> cc; - std::map> bloom; - - pv_param_file_data_struct(); - ~pv_param_file_data_struct(); -}; - -struct pv_param_light_data_struct { - light_param_light_data light_default; - std::string chara_light_file; - std::string stage_light_file; - std::map chara_light; - std::map stage_light; - - pv_param_light_data_struct(); - ~pv_param_light_data_struct(); -}; - -namespace pv_param_task { - class PostProcessCtrl { - public: - float_t frame; - float_t duration; - - PostProcessCtrl(); - ~PostProcessCtrl(); - - virtual void Reset() = 0; - virtual void Set() = 0; - }; - - class PostProcessCtrlBloom : public PostProcessCtrl { - public: - struct Data { - pv_param_bloom data; - pv_param_bloom data_prev; - - Data(); - } data; - - PostProcessCtrlBloom(); - ~PostProcessCtrlBloom(); - - virtual void Reset() override; - virtual void Set() override; - }; - - class PostProcessCtrlCC : public PostProcessCtrl { - public: - struct Data { - pv_param_color_correction data; - pv_param_color_correction data_prev; - - Data(); - } data; - - PostProcessCtrlCC(); - ~PostProcessCtrlCC(); - - virtual void Reset() override; - virtual void Set() override; - - void CalcToneTrans(float_t value, float_t& tone_trans_start, float_t& tone_trans_end); - }; - - class PostProcessCtrlCharaAlpha : public PostProcessCtrl { - public: - struct Data { - pv_param_chara_alpha data[ROB_CHARA_COUNT]; - - Data(); - } data; - - PostProcessCtrlCharaAlpha(); - ~PostProcessCtrlCharaAlpha(); - - virtual void Reset() override; - virtual void Set() override; - }; - - class PostProcessCtrlCharaItemAlpha : public PostProcessCtrlCharaAlpha { - public: - PostProcessCtrlCharaItemAlpha(); - ~PostProcessCtrlCharaItemAlpha(); - - virtual void Set() override; - }; - - class PostProcessCtrlDof : public PostProcessCtrl { - public: - struct Data { - pv_param_dof data; - pv_param_dof data_prev; - - Data(); - } data; - - PostProcessCtrlDof(); - ~PostProcessCtrlDof(); - - virtual void Reset() override; - virtual void Set() override; - - void SetData(pv_param_dof* dof, float_t duration); - }; - - class PostProcessTask : public Task { - public: - PostProcessCtrlDof dof; - PostProcessCtrlCC cc; - PostProcessCtrlBloom bloom; - PostProcessCtrlCharaAlpha chara_alpha; - PostProcessCtrlCharaItemAlpha chara_item_alpha; - - PostProcessTask(); - virtual ~PostProcessTask() override; - - virtual bool Init() override; - virtual bool Ctrl() override; - virtual bool Dest() override; - }; - - extern PostProcessTask post_process_task; -} diff --git a/src/CRE/random.hpp b/src/CRE/random.hpp index e6067805..597c66e0 100644 --- a/src/CRE/random.hpp +++ b/src/CRE/random.hpp @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include struct RandState { diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index 9991a167..6966e3a7 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -167,12 +167,12 @@ void light_proj::get_proj_mat(vec3* view_point, vec3* interest, float_t fov, mat else { mat4 proj; mat4_persp(fov, 4.0, 0.1000000014901161, 10.0, &proj); - shader_state_matrix_set_projection(&shaders_ft, &proj, false); + shaders_ft.state_matrix_set_projection(proj, false); mat4 view; vec3 up = { 0.0f, 1.0f, 0.0f }; mat4_look_at(view_point, interest, &up, &view); - shader_state_matrix_set_modelview(&shaders_ft, 0, &view, true); + shaders_ft.state_matrix_set_modelview(0, view, true); } } @@ -204,7 +204,7 @@ bool light_proj::set_mat(render_context* rctx, bool set_mat) { } mat; get_proj_mat(&position, &interest, fov, &mat.m); - shader_env_vert_set_ptr_array(&shaders_ft, 24, 4, mat.v); + shaders_ft.env_vert_set(24, 4, mat.v); } else get_proj_mat(&position, &interest, fov, 0); @@ -469,12 +469,6 @@ chara_reflect(), chara_refract(), view_mat(), matrix_buffer() { camera = camera_init(); draw_state_init(&draw_state); glGenVertexArrays(1, &vao); - - face_init(&face); - for (int32_t i = FOG_DEPTH; i < FOG_MAX; i++) - fog_init(&fog_data[i]); - for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) - light_set_init(&light_set_data[i]); } render_context::~render_context() { @@ -520,7 +514,7 @@ void render_context::ctrl() { Glitter::glt_particle_manager.rctx = this; rctx_ptr = this; - TaskWork::Ctrl(); + app::TaskWork::Ctrl(); file_handler_storage_ctrl(); @@ -531,11 +525,11 @@ void render_context::ctrl() { void render_context::disp() { rctx_ptr = this; - TaskWork::Disp(); + app::TaskWork::Disp(); post_process.ctrl(camera); draw_pass_main(this); - TaskWork::Basic(); + app::TaskWork::Basic(); } void render_context::light_param_data_light_set(light_param_light * light) { @@ -615,54 +609,52 @@ void render_context::light_param_data_glow_set(light_param_glow* glow) { post_process_blur* blur = post_process.blur; post_process_tone_map* tone_map = post_process.tone_map; - post_process_tone_map_set_auto_exposure(tone_map, true); - post_process_tone_map_set_tone_map_method(tone_map, TONE_MAP_YCC_EXPONENT); - post_process_tone_map_set_saturate_coeff(tone_map, 1.0f); - post_process_tone_map_set_scene_fade(tone_map, &vec4_null); - post_process_tone_map_set_scene_fade_blend_func(tone_map, 0); - post_process_tone_map_set_tone_trans_start(tone_map, &vec3_null); - post_process_tone_map_set_tone_trans_end(tone_map, &vec3_identity); + tone_map->set_auto_exposure(true); + tone_map->set_tone_map_method(TONE_MAP_YCC_EXPONENT); + tone_map->set_saturate_coeff(1.0f); + tone_map->set_scene_fade(vec4_null); + tone_map->set_scene_fade_blend_func(0); + tone_map->set_tone_trans_start(vec3_null); + tone_map->set_tone_trans_end(vec3_identity); if (glow->has_exposure) - post_process_tone_map_set_exposure(tone_map, glow->exposure); + tone_map->set_exposure(glow->exposure); if (glow->has_gamma) - post_process_tone_map_set_gamma(tone_map, glow->gamma); + tone_map->set_gamma(glow->gamma); if (glow->has_saturate_power) - post_process_tone_map_set_saturate_power(tone_map, glow->saturate_power); + tone_map->set_saturate_power(glow->saturate_power); if (glow->has_saturate_coef) - post_process_tone_map_set_saturate_coeff(tone_map, glow->saturate_coef); + tone_map->set_saturate_coeff(glow->saturate_coef); if (glow->has_flare) { - post_process_tone_map_set_lens_flare(tone_map, glow->flare.x); - post_process_tone_map_set_lens_shaft(tone_map, glow->flare.x); - post_process_tone_map_set_lens_ghost(tone_map, glow->flare.x); + tone_map->set_lens_flare(glow->flare.x); + tone_map->set_lens_shaft(glow->flare.y); + tone_map->set_lens_ghost(glow->flare.z); } if (glow->has_sigma) - post_process_blur_set_radius(blur, &glow->sigma); + blur->set_radius(glow->sigma); if (glow->has_intensity) - post_process_blur_set_intensity(blur, &glow->intensity); + blur->set_intensity(glow->intensity); if (glow->has_auto_exposure) - post_process_tone_map_set_auto_exposure(tone_map, glow->auto_exposure); + tone_map->set_auto_exposure(glow->auto_exposure); if (glow->has_tone_map_method) - post_process_tone_map_set_tone_map_method(tone_map, glow->tone_map_method); + tone_map->set_tone_map_method(glow->tone_map_method); if (glow->has_fade_color) { vec4 fade_color = glow->fade_color; - post_process_tone_map_set_scene_fade(tone_map, &fade_color); - post_process_tone_map_set_scene_fade_blend_func(tone_map, glow->fade_color_blend_func); + tone_map->set_scene_fade(fade_color); + tone_map->set_scene_fade_blend_func(glow->fade_color_blend_func); } - if (glow->has_tone_transform) { - post_process_tone_map_set_tone_trans_start(tone_map, &glow->tone_transform_start); - post_process_tone_map_set_tone_trans_end(tone_map, &glow->tone_transform_end); - } + if (glow->has_tone_transform) + tone_map->set_tone_trans(glow->tone_transform_start, glow->tone_transform_end); } void render_context::light_param_data_ibl_set( diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index c51b187a..ef7822e2 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -5,12 +5,11 @@ #pragma once -#include "../KKdLib/default.h" -#include "../KKdLib/vec.h" -#include "../KKdLib/vector.h" -#include "light_param/face.h" -#include "light_param/fog.h" -#include "light_param/light.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/vec.hpp" +#include "light_param/face.hpp" +#include "light_param/fog.hpp" +#include "light_param/light.hpp" #include "light_param/wind.hpp" #include "light_param.hpp" #include "camera.h" @@ -66,13 +65,13 @@ enum draw_object_type { enum draw_pass_type { DRAW_PASS_SHADOW = 0x00, - DRAW_PASS_SSS = 0x01, + DRAW_PASS_SS_SSS = 0x01, DRAW_PASS_TYPE_2 = 0x02, DRAW_PASS_REFLECT = 0x03, DRAW_PASS_REFRACT = 0x04, - DRAW_PASS_PREPROCESS = 0x05, - DRAW_PASS_TYPE_6 = 0x06, - DRAW_PASS_TYPE_7 = 0x07, + DRAW_PASS_PRE_PROCESS = 0x05, + DRAW_PASS_CLEAR = 0x06, + DRAW_PASS_PRE_SPRITE = 0x07, DRAW_PASS_3D = 0x08, DRAW_PASS_SHOW_VECTOR = 0x09, DRAW_PASS_POST_PROCESS = 0x0A, @@ -81,7 +80,7 @@ enum draw_pass_type { DRAW_PASS_MAX = 0x0D, }; -enum draw_task_flags { +enum draw_task_flags : uint32_t { DRAW_TASK_SHADOW = 0x00000001, DRAW_TASK_2 = 0x00000002, DRAW_TASK_4 = 0x00000004, diff --git a/src/CRE/render_texture.c b/src/CRE/render_texture.c index 60a9fbfa..25f23400 100644 --- a/src/CRE/render_texture.c +++ b/src/CRE/render_texture.c @@ -103,7 +103,7 @@ inline void render_texture_draw(render_texture* rt, bool depth) { inline void render_texture_draw_custom(shader_set_data* set) { gl_state_bind_vertex_array(render_texture_vao); - shader_draw_arrays(set, GL_TRIANGLE_STRIP, 0, 3); + set->draw_arrays(GL_TRIANGLE_STRIP, 0, 3); gl_state_bind_vertex_array(0); } @@ -117,13 +117,13 @@ void render_texture_draw_params(shader_set_data* set, int32_t width, int32_t hei float_t scale, float_t param_x, float_t param_y, float_t param_z, float_t param_w) { float_t w = (float_t)max(width, 1); float_t h = (float_t)max(height, 1); - shader_local_vert_set(set, 0, scale / w, scale / h, w, h); - shader_local_frag_set(set, 0, scale / w, scale / h, w, h); - shader_local_vert_set(set, 3, param_x, param_y, param_z, param_w); - shader_local_frag_set(set, 3, param_x, param_y, param_z, param_w); + set->local_vert_set(0, scale / w, scale / h, w, h); + set->local_frag_set(0, scale / w, scale / h, w, h); + set->local_vert_set(3, param_x, param_y, param_z, param_w); + set->local_frag_set(3, param_x, param_y, param_z, param_w); gl_state_bind_vertex_array(render_texture_vao); - shader_draw_arrays(set, GL_TRIANGLE_STRIP, 0, 3); + set->draw_arrays(GL_TRIANGLE_STRIP, 0, 3); gl_state_bind_vertex_array(0); } @@ -139,7 +139,7 @@ int32_t render_texture_set_color_depth_textures(render_texture* rt, inline void render_texture_shader_set(shader_set_data* set, uint32_t index) { if (set && index) - shader_set(set, index); + set->set(index); else render_texture_shader.use(); } @@ -209,8 +209,7 @@ void render_texture_data_init() { " result = texture(g_color, frg.texcoord); \n" "}\n"; - shader_glsl_param param; - memset(¶m, 0, sizeof(shader_glsl_param)); + shader_glsl_param param = {}; param.name = "Render Texture"; render_texture_shader.load(render_texture_vert_shader, render_texture_frag_shader, 0, ¶m); @@ -221,8 +220,8 @@ void render_texture_data_init() { 3.0f, 1.0f, 2.0f, 1.0f, }; - glGenBuffers(1, &render_texture_vbo); glGenVertexArrays(1, &render_texture_vao); + glGenBuffers(1, &render_texture_vbo); glBindBuffer(GL_ARRAY_BUFFER, render_texture_vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(verts_quad), verts_quad, GL_STATIC_DRAW); diff --git a/src/CRE/render_texture.h b/src/CRE/render_texture.h index 2069f998..9896a397 100644 --- a/src/CRE/render_texture.h +++ b/src/CRE/render_texture.h @@ -7,7 +7,7 @@ #include "shared.h" #include "shader.h" -#include "shader_glsl.h" +#include "shader_glsl.hpp" #include "texture.hpp" struct render_texture { diff --git a/src/CRE/rob.cpp b/src/CRE/rob.cpp index e2ca8f0c..fd728663 100644 --- a/src/CRE/rob.cpp +++ b/src/CRE/rob.cpp @@ -7,13 +7,10 @@ #include "data.hpp" #include "draw_task.h" #include "../KKdLib/key_val.hpp" -#include "../KKdLib/str_utils.h" +#include "../KKdLib/str_utils.hpp" #include "random.hpp" #include "stage.hpp" -#define OSG_SET_TEXT_BUF_SIZE 0x400 -#define SKP_TEXT_BUF_SIZE 0x400 - struct MotFile { motion_set_info* mot_set_info; mot_set* mot_set; @@ -26,10 +23,10 @@ struct MotFile { bool CheckNotReady(); void FreeData(); void LoadFile(std::string* mdata_dir, uint32_t set); - void ParseFile(void* data, size_t size); + void ParseFile(const void* data, size_t size); bool Unload(); - static void ParseFileParent(void* data, void* file_data, size_t size); + static void ParseFileParent(void* data, const void* file_data, size_t size); }; struct MhdFile { @@ -45,12 +42,12 @@ struct MhdFile { bool CheckNotReady(); void FreeData(); void LoadFile(const char* path, const char* file, uint32_t set); - void ParseFile(void* data); + void ParseFile(const void* data); mothead* ParseMothead(mothead_file* mhdsf, size_t data); mothead_mot* ParseMotheadMot(mothead_mot_file* mhdsf, size_t data); bool Unload(); - static void ParseFileParent(void* data, void* file_data, size_t size); + static void ParseFileParent(void* data, const void* file_data, size_t size); }; struct osage_setting { @@ -149,7 +146,7 @@ struct pv_data_set_motion { ~pv_data_set_motion(); }; -class PvOsageManager : public Task { +class PvOsageManager : app::Task { public: int32_t state; int32_t chara_id; @@ -246,7 +243,7 @@ struct struc_462 { ~struc_462(); }; -struct SkinParamManager : public Task { +struct SkinParamManager : public app::Task { int32_t state; uint8_t index; std::vector field_70; @@ -269,7 +266,7 @@ struct SkinParamManager : public Task { bool sub_1406112F0(); }; -class TaskRobLoad : public Task { +class TaskRobLoad : public app::Task { public: bool field_68; int32_t field_6C; @@ -323,7 +320,7 @@ public: void UnloadLoadedChara(); }; -class RobImplTask : public Task { +class RobImplTask : public app::Task { public: std::list init_chara; std::list ctrl_chara; @@ -441,7 +438,7 @@ public: virtual bool IsFrameDependent() override; }; -class TaskRobManager : public Task { +class TaskRobManager : public app::Task { public: int32_t ctrl_state; int32_t dest_state; @@ -505,7 +502,7 @@ static void bone_node_expression_data_reset_scale(bone_node_expression_data* dat static void bone_node_expression_data_set_position_rotation(bone_node_expression_data* data, float_t position_x, float_t position_y, float_t position_z, float_t rotation_x, float_t rotation_y, float_t rotation_z); -static void bone_node_expression_data_set_position_rotation_vec3(bone_node_expression_data* data, +static void bone_node_expression_data_set_position_rotation(bone_node_expression_data* data, vec3* position, vec3* rotation); static bool check_module_index_is_501(int32_t module_index); @@ -527,9 +524,9 @@ static float_t exp_eq(float_t v1, float_t v2); static float_t exp_exp(float_t v1); static float_t exp_floor(float_t v1); static float_t exp_fmod(float_t v1, float_t v2); -static const exp_func_op1* exp_func_op1_find_func(string* name, const exp_func_op1* array); -static const exp_func_op2* exp_func_op2_find_func(string* name, const exp_func_op2* array); -static const exp_func_op3* exp_func_op3_find_func(string* name, const exp_func_op3* array); +static const exp_func_op1* exp_func_op1_find_func(std::string& name, const exp_func_op1* array); +static const exp_func_op2* exp_func_op2_find_func(std::string& name, const exp_func_op2* array); +static const exp_func_op3* exp_func_op3_find_func(std::string& name, const exp_func_op3* array); static float_t exp_ge(float_t v1, float_t v2); static float_t exp_gt(float_t v1, float_t v2); static float_t exp_le(float_t v1, float_t v2); @@ -853,12 +850,13 @@ static void rob_chara_bone_data_set_mouth_frame(rob_chara_bone_data* rob_bone_da static void rob_chara_bone_data_set_mouth_play_frame_step(rob_chara_bone_data* rob_bone_data, float_t step); static void rob_chara_bone_data_set_parent_mats(rob_chara_bone_data* rob_bone_data, uint16_t* parent_indices); -static void rob_chara_bone_data_set_rotation_y(rob_chara_bone_data* rob_bone_data, float_t rotation_y); +static void rob_chara_bone_data_set_rot_y(rob_chara_bone_data* rob_bone_data, float_t rot_y); static void rob_chara_bone_data_update(rob_chara_bone_data* rob_bone_data, mat4* mat); 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); +static float_t rob_chara_item_cos_data_get_max_face_depth(rob_chara_item_cos_data* item_cos_data); static void rob_chara_item_cos_data_reload_items(rob_chara_item_cos_data* itm_cos_data, int32_t chara_id, bone_database* bone_data, void* data, object_database* obj_db); static void rob_chara_item_cos_data_set_chara_index( @@ -967,7 +965,7 @@ static void rob_chara_set_adjust(rob_chara* rob_chr, rob_chara_data_adjust* adju 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); -static void rob_cmn_mottbl_read(void* a1, void* data, size_t size); +static void rob_cmn_mottbl_read(void* a1, const 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); @@ -987,7 +985,7 @@ static void rob_osage_set_force(rob_osage* rob_osg, float_t force, float_t force static void rob_osage_set_hinge(rob_osage* rob_osg, float_t hinge_y, float_t hinge_z); static void rob_osage_set_init_rot(rob_osage* rob_osg, float_t init_rot_y, float_t init_rot_z); static void rob_osage_set_motion_reset_data(rob_osage* rob_osg, int32_t motion_id, float_t frame); -static void rob_osage_set_rot(rob_osage* rob_osg, float_t rotation_y, float_t rotation_z); +static void rob_osage_set_rot(rob_osage* rob_osg, float_t rot_y, float_t rot_z); static void rob_osage_set_skin_param_osage_root(rob_osage* rob_osg, skin_param_osage_root* skp_root); static void rob_osage_set_skp_osg_nodes(rob_osage* rob_osg, std::vector* skp_osg_nodes); @@ -2418,6 +2416,10 @@ float_t rob_chara::get_frame_count() { return rob_chara_bone_data_get_frame_count(bone_data); } +float_t rob_chara::get_max_face_depth() { + return rob_chara_item_cos_data_get_max_face_depth(&item_cos_data); +} + static int16_t sub_14054FE90(rob_chara* rob_chr, bool a3) { int16_t v3 = rob_chr->data.miku_rot.rot_y_int16; if (!a3 || ~rob_chr->data.field_0 & 0x10) { @@ -2616,17 +2618,17 @@ static void sub_14041D340(rob_chara_bone_data* rob_bone_data, bool a2) { v2->field_0 &= ~0x20; } -static void sub_140414F00(struc_308* a1, float_t a2) { - a1->prev_eyes_adjust = a1->eyes_adjust; - a1->eyes_adjust = a2; +static void sub_140414F00(struc_308* a1, float_t rot_y) { + a1->prev_rot_y = a1->rot_y; + a1->rot_y = rot_y; } -static void sub_14041D270(rob_chara_bone_data* rob_bone_data, float_t a2) { - sub_140414F00(&rob_bone_data->motion_loaded.front()->field_4F8, a2); +static void sub_14041D270(rob_chara_bone_data* rob_bone_data, float_t rot_y) { + sub_140414F00(&rob_bone_data->motion_loaded.front()->field_4F8, rot_y); } -static void sub_14041D2A0(rob_chara_bone_data* rob_bone_data, float_t a2) { - rob_bone_data->motion_loaded.front()->field_4F8.prev_eyes_adjust = a2; +static void sub_14041D2A0(rob_chara_bone_data* rob_bone_data, float_t rot_y) { + rob_bone_data->motion_loaded.front()->field_4F8.prev_rot_y = rot_y; } static void sub_140555B00(rob_chara* rob_chr, bool a2) { @@ -2877,7 +2879,7 @@ static void sub_14053A9C0(struc_223* a1, rob_chara* rob_chr, a1->field_0.field_20 = v7->field_0; a1->field_0.field_20.field_0 &= ~0x4000; if (a1->field_0.field_10.field_0 & 0x100) - a1->field_0.field_274 = 0x8000; + a1->field_0.field_274 = (int16_t)0x8000; if (a1->field_0.field_10.field_0 & 0x200000) a1->field_0.field_2B8 = (int16_t)0x8000; @@ -3019,7 +3021,7 @@ void rob_chara::load_motion(int32_t motion_id, bool a3, float_t frame, sub_14041C990(this->bone_data, data.field_1588.field_0.field_70, data.field_1588.field_0.field_6C, -1.0f); } - rob_chara_bone_data_set_rotation_y(this->bone_data, + rob_chara_bone_data_set_rot_y(this->bone_data, (float_t)((double_t)data.field_1588.field_0.field_2B8 * M_PI * (1.0 / 32768.0))); sub_14041BC40(this->bone_data, !!(data.field_1588.field_0.field_20.field_8 & 0x20000000)); sub_14041B9D0(this->bone_data); @@ -3796,7 +3798,6 @@ static void bone_data_mult_0(bone_data* a1, int32_t skeleton_select) { static void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, bool solve_ik) { mat4 mat; - mat4 rot_mat; if (a1->has_parent) mat = *a1->parent_mat; else @@ -3809,12 +3810,11 @@ static void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, boo mat4_translate_mult(&mat, a1->trans.x, a1->trans.y, a1->trans.z, &mat); if (solve_ik) { a1->node[0].exp_data.rotation = vec3_null; - if (!a1->disable_mot_anim) { - rot_mat = a1->rot_mat[0]; - mat4_get_rotation(&rot_mat, &a1->node[0].exp_data.rotation); - } + if (!a1->disable_mot_anim) + mat4_get_rotation(&a1->rot_mat[0], &a1->node[0].exp_data.rotation); else if (bone_data_mult_1_exp_data(a1, &a1->node[0].exp_data, a3)) { vec3 rotation = a1->node[0].exp_data.rotation; + mat4 rot_mat; mat4_rotate(rotation.x, rotation.y, rotation.z, &rot_mat); a1->rot_mat[0] = rot_mat; } @@ -3822,6 +3822,7 @@ static void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, boo *a1->node[0].mat = mat; if (bone_data_mult_1_ik(a1, a3)) { + mat4 rot_mat; mat4_invrot_normalized(&mat, &rot_mat); mat4_mult(a1->node[0].mat, &rot_mat, &rot_mat); mat4_clear_trans(&rot_mat, &rot_mat); @@ -3833,7 +3834,7 @@ static void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, boo } } - rot_mat = a1->rot_mat[0]; + mat4 rot_mat = a1->rot_mat[0]; mat4_mult(&rot_mat, &mat, &mat); } else { @@ -3851,40 +3852,38 @@ static void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, boo if (a1->type < BONE_DATABASE_BONE_HEAD_IK_ROTATION) return; - rot_mat = a1->rot_mat[1]; + mat4 rot_mat = a1->rot_mat[1]; mat4_mult(&rot_mat, &mat, &mat); *a1->node[1].mat = mat; - mat4_translate_mult(&mat, a1->ik_segment_length[1], 0.0f, 0.0f, &mat); if (a1->type == BONE_DATABASE_BONE_HEAD_IK_ROTATION) { + mat4_translate_mult(&mat, a1->ik_segment_length[1], 0.0f, 0.0f, &mat); *a1->node[2].mat = mat; if (!solve_ik) return; a1->node[1].exp_data.position = vec3_null; - rot_mat = a1->rot_mat[1]; - mat4_get_rotation(&rot_mat, &a1->node[1].exp_data.rotation); + mat4_get_rotation(&a1->rot_mat[1], &a1->node[1].exp_data.rotation); bone_node_expression_data_reset_scale(&a1->node[1].exp_data); bone_node_expression_data_set_position_rotation(&a1->node[2].exp_data, a1->ik_segment_length[1], 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); } else { - rot_mat = a1->rot_mat[2]; + mat4_translate_mult(&mat, a1->ik_segment_length[1], 0.0f, 0.0f, &mat); + mat4 rot_mat = a1->rot_mat[2]; mat4_mult(&rot_mat, &mat, &mat); *a1->node[2].mat = mat; + mat4_translate_mult(&mat, a1->ik_2nd_segment_length[1], 0.0f, 0.0f, &mat); *a1->node[3].mat = mat; if (!solve_ik) return; a1->node[1].exp_data.position = vec3_null; - rot_mat = a1->rot_mat[1]; - mat4_get_rotation(&rot_mat, &a1->node[1].exp_data.rotation); + mat4_get_rotation(&a1->rot_mat[1], &a1->node[1].exp_data.rotation); bone_node_expression_data_reset_scale(&a1->node[1].exp_data); - a1->node[2].exp_data.position.x = a1->ik_segment_length[1]; - *(vec2*)&a1->node[2].exp_data.position.y = vec2_null; - rot_mat = a1->rot_mat[2]; - mat4_get_rotation(&rot_mat, &a1->node[2].exp_data.rotation); + a1->node[2].exp_data.position = { a1->ik_segment_length[1], 0.0f, 0.0f }; + mat4_get_rotation(&a1->rot_mat[2], &a1->node[2].exp_data.rotation); bone_node_expression_data_reset_scale(&a1->node[2].exp_data); bone_node_expression_data_set_position_rotation(&a1->node[3].exp_data, a1->ik_2nd_segment_length[1], 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); @@ -4398,11 +4397,12 @@ static void bone_data_parent_load_bone_indices_from_mot(bone_data_parent* a1, const mot_bone_info* bone_info = a2->bone_info.data(); for (size_t key_set_offset = 0, i = 0; key_set_offset < key_set_count; i++) { - int32_t bone_index = bone_data->get_skeleton_bone_index(skeleton_type_string, - bone_names[bone_info[i].index].c_str()); + motion_bone_index bone_index = (motion_bone_index)bone_data->get_skeleton_bone_index( + skeleton_type_string, bone_names[bone_info[i].index].c_str()); if (bone_index == -1) { - bone_index = bone_data->get_skeleton_bone_index(skeleton_type_string, - bone_names[bone_info[++i].index].c_str()); + i++; + bone_index = (motion_bone_index)bone_data->get_skeleton_bone_index( + skeleton_type_string, bone_names[bone_info[i].index].c_str()); if (bone_index == -1) break; } @@ -4497,7 +4497,7 @@ static void bone_node_expression_data_set_position_rotation(bone_node_expression data->parent_scale = vec3_identity; } -static void bone_node_expression_data_set_position_rotation_vec3(bone_node_expression_data* data, +static void bone_node_expression_data_set_position_rotation(bone_node_expression_data* data, vec3* position, vec3* rotation) { data->position = *position; data->rotation = *rotation; @@ -5872,7 +5872,7 @@ 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_osg->reset(); - bone_node_expression_data_set_position_rotation_vec3( + bone_node_expression_data_set_position_rotation( &rob_osg->exp_data, &osg_data->base.position, &osg_data->base.rotation); @@ -6059,8 +6059,8 @@ static float_t exp_fmod(float_t v1, float_t v2) { return fmodf(v1, v2); } -static const exp_func_op1* exp_func_op1_find_func(string* name, const exp_func_op1* array) { - char* name_str = string_data(name); +static const exp_func_op1* exp_func_op1_find_func(std::string& name, const exp_func_op1* array) { + const char* name_str = name.c_str(); while (array->name) { if (!str_utils_compare(name_str, array->name)) return array; @@ -6069,8 +6069,8 @@ static const exp_func_op1* exp_func_op1_find_func(string* name, const exp_func_o return 0; } -static const exp_func_op2* exp_func_op2_find_func(string* name, const exp_func_op2* array) { - char* name_str = string_data(name); +static const exp_func_op2* exp_func_op2_find_func(std::string& name, const exp_func_op2* array) { + const char* name_str = name.c_str(); while (array->name) { if (!str_utils_compare(name_str, array->name)) return array; @@ -6079,8 +6079,8 @@ static const exp_func_op2* exp_func_op2_find_func(string* name, const exp_func_o return 0; } -static const exp_func_op3* exp_func_op3_find_func(string* name, const exp_func_op3* array) { - char* name_str = string_data(name); +static const exp_func_op3* exp_func_op3_find_func(std::string& name, const exp_func_op3* array) { + const char* name_str = name.c_str(); while (array->name) { if (!str_utils_compare(name_str, array->name)) return array; @@ -6349,7 +6349,7 @@ static void mot_key_frame_interpolate(mot* a1, float_t frame, float_t* value, } else { const uint16_t* key = &frames[current_key]; - for (const uint16_t* v17 = &frames[keys_count]; key != v17; key++) + for (const uint16_t* key_end = &frames[keys_count]; key != key_end; key++) if (frame_int < *key) break; key_index = key - frames; @@ -6380,7 +6380,8 @@ static void mot_key_frame_interpolate(mot* a1, float_t frame, float_t* value, float_t p2 = values[2]; float_t t1 = values[1]; float_t t2 = values[3]; - *value = ((t - 1.0f) * t1 + t * t2) * (t - 1.0f) * (frame - curr_frame) + float_t t_1 = t - 1.0f; + *value = (t_1 * t1 + t * t2) * t_1 * (frame - curr_frame) + (t * 2.0f - 3.0f) * (t * t) * (p1 - p2) + p1; } a4->current_key = (int32_t)key_index; @@ -7638,9 +7639,9 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { a1->bone_data.global_trans = global_trans; a1->bone_data.global_rotation = global_rotation; - float_t rotation_y = a1->bone_data.rotation_y; + float_t rot_y = a1->bone_data.rot_y; mat4 mat; - mat4_rotate_y(rotation_y, &mat); + mat4_rotate_y(rot_y, &mat); mat4_translate_mult(&mat, global_trans.x, global_trans.y, global_trans.z, &mat); mat4_rotate_mult(&mat, global_rotation.x, global_rotation.y, global_rotation.z, &mat); for (bone_data& i : a1->bone_data.bones) @@ -9016,7 +9017,7 @@ static void sub_1405508F0(rob_chara* rob_chr, motion_database* mot_db) { } static bool sub_1404190E0(rob_chara_bone_data* rob_bone_data) { - return rob_bone_data->eyelid.blend.field_8 || rob_bone_data->eyelid.blend.field_9; + return rob_bone_data->eyelid.blend.field_8 || rob_bone_data->eyelid.blend.rot_y; } static void sub_140555F70(rob_chara* rob_chr, motion_database* mot_db) { @@ -9354,17 +9355,17 @@ static void sub_140504AC0(rob_chara* rob_chr) { } static void rob_base_rob_chara_ctrl_thread_main(rob_chara* rob_chr) { - data_struct* data = rctx_ptr->data; - bone_database* bone_data = &data->data_ft.bone_data; - motion_database* mot_db = &data->data_ft.mot_db; - object_database* obj_db = &data->data_ft.obj_db; + data_struct* aft_data = &data_list[DATA_AFT]; + bone_database* aft_bone_data = &aft_data->data_ft.bone_data; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + object_database* aft_obj_db = &aft_data->data_ft.obj_db; - sub_140514520(rob_chr, bone_data, mot_db); + sub_140514520(rob_chr, aft_bone_data, aft_mot_db); sub_14054CC80(rob_chr); - sub_1405077D0(rob_chr, bone_data, mot_db); - sub_1405070E0(rob_chr, bone_data, mot_db); + sub_1405077D0(rob_chr, aft_bone_data, aft_mot_db); + sub_1405070E0(rob_chr, aft_bone_data, aft_mot_db); rob_chara_arm_adjust_ctrl(rob_chr); - sub_140504710(rob_chr, mot_db, bone_data, data, obj_db); + sub_140504710(rob_chr, aft_mot_db, aft_bone_data, aft_data, aft_obj_db); sub_140504AC0(rob_chr); } @@ -9431,7 +9432,7 @@ static MotionBlendType motion_blend_mot_get_type(motion_blend_mot* a1) { static bool sub_140413810(motion_blend_mot* a1) { if (a1->blend && a1->blend->Field_30()) - return a1->blend->field_9; + return a1->blend->rot_y; return false; } @@ -9742,7 +9743,7 @@ static void sub_140406A70(vec3* a1, std::vector* bones, mat4* a3, vec mat4_clear_trans(v25->node->mat, &v39); mat4_transpose(&v38, &v38); mat4_mult(&v39, &v38, &v38); - if (rotation_blend < 1.0) { + if (rotation_blend < 1.0f) { mat4 rot_mat = v25->rot_mat[0]; mat4_lerp_rotation(&rot_mat, &v38, &v38, rotation_blend); } @@ -10526,7 +10527,7 @@ static void rob_chara_bone_data_left_hand_scale(rob_chara_bone_data* rob_bone_da 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) @@ -10556,7 +10557,7 @@ static void rob_chara_bone_data_right_hand_scale(rob_chara_bone_data* rob_bone_d 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) @@ -10972,13 +10973,13 @@ static void sub_140415A10(motion_blend_mot* a1) { v7.field_2 = !sub_140413790(&a1->field_4F8); v7.field_1 = sub_1404137A0(&a1->field_4F8); v7.frame = a1->mot_key_data.frame; - v7.eyes_adjust = a1->field_4F8.eyes_adjust; - v7.prev_eyes_adjust = a1->field_4F8.prev_eyes_adjust; - a1->blend->Field_18(&v7); + v7.rot_y = a1->field_4F8.rot_y; + v7.prev_rot_y = a1->field_4F8.prev_rot_y; + a1->blend->Step(&v7); } static bool sub_140410A20(motion_blend_mot* a1) { - return !a1->blend || !a1->blend->field_9; + return !a1->blend || !a1->blend->rot_y; } static void sub_140415B30(mot_blend* a1) { @@ -10989,9 +10990,9 @@ static void sub_140415B30(mot_blend* a1) { v3.field_3 = false; v3.field_4 = false; v3.frame = 0.0f; - v3.eyes_adjust = 0.0f; - v3.prev_eyes_adjust = 0.0f; - a1->blend.Field_18(&v3); + v3.rot_y = 0.0f; + v3.prev_rot_y = 0.0f; + a1->blend.Step(&v3); } static void sub_14041DAC0(rob_chara_bone_data* a1) { @@ -11529,8 +11530,8 @@ static void rob_chara_bone_data_set_parent_mats(rob_chara_bone_data* rob_bone_da i->parent = &rob_bone_data->nodes[*parent_indices++]; } -static void rob_chara_bone_data_set_rotation_y(rob_chara_bone_data* rob_bone_data, float_t rotation_y) { - rob_bone_data->motion_loaded.front()->bone_data.rotation_y = rotation_y; +static void rob_chara_bone_data_set_rot_y(rob_chara_bone_data* rob_bone_data, float_t rot_y) { + rob_bone_data->motion_loaded.front()->bone_data.rot_y = rot_y; } static void sub_140413EB0(struc_308* a1) { @@ -11592,7 +11593,7 @@ static void sub_14040FBF0(motion_blend_mot* a1, float_t a2) { static void sub_140410A40(motion_blend_mot* a1, std::vector* a2, std::vector* a3) { MotionBlend* v4 = a1->blend; - if (!v4 || !v4->field_9) + if (!v4 || !v4->rot_y) return; v4->Field_20(a2, a3); @@ -11610,7 +11611,7 @@ static void sub_140410A40(motion_blend_mot* a1, std::vector* a2, std: static void sub_140410B70(motion_blend_mot* a1, std::vector* a2) { MotionBlend* v3 = a1->blend; - if (!v3 || !v3->field_9) + if (!v3 || !v3->rot_y) return; v3->Field_20(&a1->bone_data.bones, a2); @@ -11626,7 +11627,7 @@ static void sub_140410B70(motion_blend_mot* a1, std::vector* a2) { } static void sub_140410CB0(mot_blend* a1, std::vector* a2) { - if (!a1->blend.field_9) + if (!a1->blend.rot_y) return; for (bone_data& i : *a2) { @@ -11758,7 +11759,7 @@ static void sub_140505C90(struc_264* a1) { a1->field_A8 = 0; a1->field_AC = 0; a1->field_B0 = 0; - a1->eyes_adjust = 0; + a1->field_B4 = 0; sub_140506C20(&a1->field_B8); a1->field_140 = 0; a1->field_144 = 0; @@ -12146,6 +12147,17 @@ static object_info rob_chara_item_cos_data_get_head_object_replace( return object_info(); } +static float_t rob_chara_item_cos_data_get_max_face_depth(rob_chara_item_cos_data* item_cos_data) { + float_t max_face_depth = 0.0f; + for (int32_t i = ITEM_SUB_ZUJO; i < ITEM_SUB_MAX; i++) { + int32_t item_no = item_cos_data->cos.arr[i]; + item_table_item* item = item_table_array_get_item(item_cos_data->chara_index, item_no); + if (item && max_face_depth < item->face_depth) + max_face_depth = item->face_depth; + } + return max_face_depth; +} + static int32_t item_cos_tex_chg_counter = 0; static texture_id item_cos_tex_chg_counter_get(texture_id id) { @@ -13225,10 +13237,10 @@ static void rob_chara_item_equip_object_load_ex_data(rob_chara_item_equip_object exp_data.rotation = v54->rotation; exp_data.scale = v54->scale; exp_data.parent_scale = vec3_identity; - node->parent_name = std::string(string_data(&v54->parent_name), v54->parent_name.length); + node->parent_name = std::string(v54->parent_name); bone_node* parent_bone_node = rob_chara_item_equip_object_get_bone_node_by_name(itm_eq_obj, - string_data(&v54->parent_name), bone_data); + v54->parent_name, bone_data); node->parent_bone_node = parent_bone_node; if (node->bone_node_ptr) { node->bone_node_ptr->exp_data = exp_data; @@ -13453,9 +13465,132 @@ static void rob_chara_item_equip_object_set_texture_pattern( itm_eq_obj->texture_pattern.push_back(tex_pat[i]); } +static rob_osage_node* sub_1405FAB90(rob_chara_item_equip_object* a1, std::string* a2, size_t* a3) { + if (!a2->size()) + return 0; + + size_t v8 = a2->find(',', 0); + if (v8 == -1) + return 0; + + std::string v22 = a2->substr(0, v8); + std::string v23 = a2->substr(v8 + 1); + size_t v11 = atoi(v23.c_str()); + if (a3) + *a3 = v11; + + rob_osage_node* node = 0; + for (ExOsageBlock*& i : a1->osage_blocks) + if (!v22.compare(i->name)) { + if (v11 + 1 < i->rob.nodes.size()) + node = rob_osage_get_node(&i->rob, v11 + 1); + break; + } + return node; +} + +static bool sub_14053E690(rob_osage_node_data_normal_ref* normal_ref) { + normal_ref->field_0 = false; + if (normal_ref->n == 0) + return normal_ref->field_0; + + if (normal_ref->u && !memcmp(&normal_ref->u->mat, &mat4u_null, sizeof(mat4u))) + normal_ref->u = 0; + + if (normal_ref->d && !memcmp(&normal_ref->d->mat, &mat4u_null, sizeof(mat4u))) + normal_ref->d = 0; + + if (normal_ref->l && !memcmp(&normal_ref->l->mat, &mat4u_null, sizeof(mat4u))) + normal_ref->l = 0; + + if (normal_ref->r && !memcmp(&normal_ref->r->mat, &mat4u_null, sizeof(mat4u))) + normal_ref->r = 0; + + if ((normal_ref->u || normal_ref->d) && (normal_ref->l || normal_ref->r)) { + if (!normal_ref->u) + normal_ref->u = normal_ref->n; + if (!normal_ref->d) + normal_ref->d = normal_ref->n; + if (!normal_ref->l) + normal_ref->l = normal_ref->n; + if (!normal_ref->r) + normal_ref->r = normal_ref->n; + normal_ref->field_0 = true; + } + return normal_ref->field_0; +} + +static void sub_14053CAC0(rob_osage_node_data_normal_ref* normal_ref) { + if (!normal_ref->field_0) + return; + + vec3 n_trans; + vec3 u_trans; + vec3 d_trans; + vec3 l_trans; + vec3 r_trans; + mat4_get_translation(&normal_ref->n->mat, &n_trans); + mat4_get_translation(&normal_ref->u->mat, &u_trans); + mat4_get_translation(&normal_ref->d->mat, &d_trans); + mat4_get_translation(&normal_ref->l->mat, &l_trans); + mat4_get_translation(&normal_ref->r->mat, &r_trans); + + vec3 v21; + vec3 v22; + vec3 v23; + if (sub_14053D1B0(&l_trans, &r_trans, &u_trans, &d_trans, &v22, &v21, &v23)) { + mat4u mat; + mat.row0.x = v23.x; + mat.row0.y = v21.x; + mat.row0.z = v22.x; + mat.row0.w = 0.0f; + mat.row1.x = v23.y; + mat.row1.y = v21.y; + mat.row1.z = v22.y; + mat.row1.w = 0.0f; + mat.row2.x = v23.z; + mat.row2.y = v21.z; + mat.row2.z = v22.z; + mat.row2.w = 0.0f; + vec3_dot(n_trans, v23, mat.row3.x); + vec3_dot(n_trans, v21, mat.row3.y); + vec3_dot(n_trans, v22, mat.row3.z); + vec3_negate(*(vec3*)&mat.row3, *(vec3*)&mat.row3); + mat.row3.w = 1.0f; + mat4_mult(&normal_ref->n->mat, &mat, &normal_ref->mat); + } +} + +static bool sub_1405FAA30(rob_chara_item_equip_object* a1, + skin_param_osage_root* a2, std::vector* a3) { + if (!a2->normal_ref.size()) + return true; + + for (skin_param_osage_root_normal_ref& i : a2->normal_ref) { + size_t v12 = 0; + rob_osage_node* v8 = sub_1405FAB90(a1, &i.n, &v12); + if (!v8) + continue; + + rob_osage_node_data* v10; + if (a3) + v10 = &(*a3)[v12]; + else + v10 = v8->data_ptr; + + v10->normal_ref.n = v8; + v10->normal_ref.u = sub_1405FAB90(a1, &i.u, 0); + v10->normal_ref.d = sub_1405FAB90(a1, &i.d, 0); + v10->normal_ref.l = sub_1405FAB90(a1, &i.l, 0); + v10->normal_ref.r = sub_1405FAB90(a1, &i.r, 0); + sub_14053CAC0(&v10->normal_ref); + } + return true; +} + static void rob_chara_item_equip_object_skp_load( rob_chara_item_equip_object* itm_eq_obj, key_val* kv, bone_database* bone_data) { - if (kv->key_hash.size() < 1) + if (kv->key.size() < 1) return; itm_eq_obj->field_1B8 = 0; @@ -13467,8 +13602,9 @@ static void rob_chara_item_equip_object_skp_load( rob_chara_item_equip_object_set_collision_target_osage(itm_eq_obj, &root, osg->rob.skin_param_ptr); itm_eq_obj->field_1B8 |= rob_chara_item_equip_object_set_boc(itm_eq_obj, &root, osg); itm_eq_obj->field_1B8 |= root.coli_type != 0; - //itm_eq_obj->field_1B8 |= sub_1405FAA30(itm_eq_obj, &root, 0); + itm_eq_obj->field_1B8 |= sub_1405FAA30(itm_eq_obj, &root, 0); } + for (ExClothBlock*& i : itm_eq_obj->cloth_blocks) { ExClothBlock* cls = i; skin_param_osage_root root; @@ -13736,7 +13872,7 @@ static void rob_chara_load_default_motion_sub(rob_chara* rob_chr, int32_t skelet sub_14041BC40(rob_chr->bone_data, false); sub_14041D270(rob_chr->bone_data, 0.0f); sub_14041D2A0(rob_chr->bone_data, 0.0f); - rob_chara_bone_data_set_rotation_y(rob_chr->bone_data, 0.0f); + rob_chara_bone_data_set_rot_y(rob_chr->bone_data, 0.0f); rob_chara_bone_data_set_motion_duration(rob_chr->bone_data, 0.0f, 1.0f, 1.0f); sub_14041D310(rob_chr->bone_data, 0.0f, 0.0f, 2); rob_chara_bone_data_interpolate(rob_chr->bone_data); @@ -13789,7 +13925,7 @@ static void rob_chara_set_pv_data(rob_chara* rob_chr, int8_t chara_id, rob_chara_item_cos_data_set_customize_items(&rob_chr->item_cos_data, &pv_data->customize_items); } -static void rob_cmn_mottbl_read(void* a1, void* data, size_t size) { +static void rob_cmn_mottbl_read(void* a1, const void* data, size_t size) { free(rob_cmn_mottbl_data); farc f; @@ -13937,9 +14073,9 @@ static void rob_osage_set_motion_reset_data(rob_osage* rob_osg, int32_t motion_i rob_osg->reset_data_list = &v6->second; } -static void rob_osage_set_rot(rob_osage* rob_osg, float_t rotation_y, float_t rotation_z) { - rob_osg->skin_param_ptr->rot.y = rotation_y * DEG_TO_RAD_FLOAT; - rob_osg->skin_param_ptr->rot.z = rotation_z * DEG_TO_RAD_FLOAT; +static void rob_osage_set_rot(rob_osage* rob_osg, float_t rot_y, float_t rot_z) { + rob_osg->skin_param_ptr->rot.y = rot_y * DEG_TO_RAD_FLOAT; + rob_osg->skin_param_ptr->rot.z = rot_z * DEG_TO_RAD_FLOAT; } static void rob_osage_set_skin_param_osage_root(rob_osage* rob_osg, skin_param_osage_root* skp_root) { @@ -13988,292 +14124,222 @@ static void rob_osage_free(rob_osage* rob_osg) { static void skin_param_osage_node_parse(key_val* kv, const char* name, std::vector* vec, skin_param_osage_root* skp_root) { - char buf[SKP_TEXT_BUF_SIZE]; - int32_t count; - size_t len; - size_t len1; - size_t len2; - size_t off; - - key_val lkv; - if (!kv->get_local_key_val(name, &lkv)) + if (!kv->open_scope(name)) return; - len = utf8_length(name); - memcpy(buf, name, len); - off = len; - - len1 = 5; - memcpy(&buf[len], ".node", 5); - off = len + len1; - - buf[off] = 0; - key_val sub_local_key_val; - if (lkv.get_local_key_val(buf, &sub_local_key_val)) { - if (lkv.read_int32_t(buf, off, ".length", 8, &count)) { - size_t c = vec->size(); - if (c < count) - vec->resize(count); - } - else - vec->clear(); - - int32_t j = 0; - for (auto i = vec->begin(); i != vec->end(); i++, j++) { - len2 = sprintf_s(buf + len + len1, - SKP_TEXT_BUF_SIZE - len - len1, ".%d", j); - off = len + len1 + len2; - - *i = skin_param_osage_node(); - - float_t coli_r = 0; - if (sub_local_key_val.read_float_t( - buf, off, ".coli_r", 8, &coli_r)) - i->coli_r = coli_r; - - float_t weight = 0; - if (sub_local_key_val.read_float_t( - buf, off, ".weight", 8, &weight)) - i->weight = weight; - - float_t inertial_cancel = 0; - if (sub_local_key_val.read_float_t( - buf, off, ".inertial_cancel", 17, &inertial_cancel)) - i->inertial_cancel = inertial_cancel; - - i->hinge.ymin = -skp_root->hinge_y; - i->hinge.ymax = skp_root->hinge_y; - i->hinge.zmin = -skp_root->hinge_z; - i->hinge.zmax = skp_root->hinge_z; - - float_t hinge_ymax = 0.0f; - if (sub_local_key_val.read_float_t( - buf, off, ".hinge_ymax", 12, &hinge_ymax)) - i->hinge.ymax = hinge_ymax; - - float_t hinge_ymin = 0.0f; - if (sub_local_key_val.read_float_t( - buf, off, ".hinge_ymin", 12, &hinge_ymin)) - i->hinge.ymin = hinge_ymin; - - float_t hinge_zmax = 0.0f; - if (sub_local_key_val.read_float_t( - buf, off, ".hinge_zmax", 12, &hinge_zmax)) - i->hinge.zmax = hinge_zmax; - - float_t hinge_zmin = 0.0f; - if (sub_local_key_val.read_float_t( - buf, off, ".hinge_zmin", 12, &hinge_zmin)) - i->hinge.zmin = hinge_zmin; - } + if (!kv->open_scope("node")) { + kv->close_scope(); + return; } + + int32_t count; + if (kv->read("length", count)) { + size_t c = vec->size(); + if (c < count) + vec->resize(count); + } + else + vec->clear(); + + int32_t j = 0; + for (auto i = vec->begin(); i != vec->end(); i++, j++) { + if (!kv->open_scope(j)) + continue; + + *i = skin_param_osage_node(); + + float_t coli_r = 0.0f; + if (kv->read("coli_r", coli_r)) + i->coli_r = coli_r; + + float_t weight = 0.0f; + if (kv->read("weight", weight)) + i->weight = weight; + + float_t inertial_cancel = 0.0f; + if (kv->read("inertial_cancel", inertial_cancel)) + i->inertial_cancel = inertial_cancel; + + i->hinge.ymin = -skp_root->hinge_y; + i->hinge.ymax = skp_root->hinge_y; + i->hinge.zmin = -skp_root->hinge_z; + i->hinge.zmax = skp_root->hinge_z; + + float_t hinge_ymax = 0.0f; + if (kv->read("hinge_ymax", hinge_ymax)) + i->hinge.ymax = hinge_ymax; + + float_t hinge_ymin = 0.0f; + if (kv->read("hinge_ymin", hinge_ymin)) + i->hinge.ymin = hinge_ymin; + + float_t hinge_zmax = 0.0f; + if (kv->read("hinge_zmax", hinge_zmax)) + i->hinge.zmax = hinge_zmax; + + float_t hinge_zmin = 0.0f; + if (kv->read("hinge_zmin", hinge_zmin)) + i->hinge.zmin = hinge_zmin; + kv->close_scope(); + } + + kv->close_scope(); + kv->close_scope(); } static void skin_param_osage_root_parse(key_val* kv, const char* name, skin_param_osage_root* skp_root, bone_database* bone_data) { - char buf[SKP_TEXT_BUF_SIZE]; - int32_t count; - size_t len; - size_t len1; - size_t len2; - size_t len3; - size_t off; - - key_val lkv; - if (!kv->get_local_key_val(name, &lkv)) + if (!kv->open_scope(name)) return; - len = utf8_length(name); - memcpy(buf, name, len); - off = len; - int32_t node_length = 0; - lkv.read_int32_t( - buf, off, ".node.length", 13, &node_length); + kv->read("node.length", node_length); - len1 = 5; - memcpy(&buf[len], ".root", 5); - off = len + len1; + if (!kv->open_scope("root")) { + kv->close_scope(); + return; + } float_t force = 0.0f; float_t force_gain = 0.0f; - if (lkv.read_float_t( - buf, off, ".force", 7, &force) - && lkv.read_float_t( - buf, off, ".force_gain", 12, &force_gain)) { + if (kv->read("force", force) + && kv->read("force_gain", force_gain)) { skp_root->force = force; skp_root->force_gain = force_gain; } float_t air_res = 0.0f; - if (lkv.read_float_t( - buf, off, ".air_res", 9, &air_res)) + if (kv->read("air_res", air_res)) skp_root->air_res = min(air_res, 0.9f); float_t rot_y = 0.0f; float_t rot_z = 0.0f; - if (lkv.read_float_t( - buf, off, ".rot_y", 7, &rot_y) - && lkv.read_float_t( - buf, off, ".rot_z", 7, &rot_z)) { + if (kv->read("rot_y", rot_y) + && kv->read("rot_z", rot_z)) { skp_root->rot_y = rot_y; skp_root->rot_z = rot_z; } float_t friction = 0.0f; - if (lkv.read_float_t( - buf, off, ".friction", 10, &friction)) + if (kv->read("friction", friction)) skp_root->friction = friction; float_t wind_afc = 0; - if (lkv.read_float_t( - buf, off, ".wind_afc", 10, &wind_afc)) { + if (kv->read("wind_afc", wind_afc)) { skp_root->wind_afc = wind_afc; if (!str_utils_compare_length(name, utf8_length(name), "c_opa", 5)) skp_root->wind_afc = 0.0f; } int32_t coli_type = 0; - if (lkv.read_int32_t( - buf, off, ".coli_type", 11, &coli_type)) + if (kv->read("coli_type", coli_type)) skp_root->coli_type = coli_type; float_t init_rot_y = 0.0f; float_t init_rot_z = 0.0f; - if (lkv.read_float_t( - buf, off, ".init_rot_y", 12, &init_rot_y) - && lkv.read_float_t( - buf, off, ".init_rot_z", 12, &init_rot_z)) { + if (kv->read("init_rot_y", init_rot_y) + && kv->read("init_rot_z", init_rot_z)) { skp_root->init_rot_y = init_rot_y; skp_root->init_rot_z = init_rot_z; } float_t hinge_y = 0.0f; float_t hinge_z = 0.0f; - if (lkv.read_float_t( - buf, off, ".hinge_y", 9, &hinge_y) - && lkv.read_float_t( - buf, off, ".hinge_z", 9, &hinge_z)) { + if (kv->read("hinge_y", hinge_y) + && kv->read("hinge_z", hinge_z)) { skp_root->hinge_y = hinge_y; skp_root->hinge_z = hinge_z; } float_t coli_r = 0.0f; - if (lkv.read_float_t( - buf, off, ".coli_r", 8, &coli_r)) + if (kv->read("coli_r", coli_r)) skp_root->coli_r = coli_r; float_t stiffness = 0.0f; - if (lkv.read_float_t( - buf, off, ".stiffness", 11, &stiffness)) + if (kv->read("stiffness", stiffness)) skp_root->stiffness = stiffness; float_t move_cancel = 0.0f; - if (lkv.read_float_t( - buf, off, ".move_cancel", 13, &move_cancel)) + if (kv->read("move_cancel", move_cancel)) skp_root->move_cancel = move_cancel; - len2 = 5; - memcpy(buf + len + len1, ".coli", 5); - off = len + len1 + len2; - - buf[off] = 0; - key_val sub_local_key_val; - if (lkv.read_int32_t(buf, off, ".length", 8, &count) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { + int32_t count; + if (kv->read("coli", "length", count)) { std::vector& vc = skp_root->coli; for (int32_t i = 0; i < count; i++) { - skin_param_osage_root_coli* c = &vc[i]; - len3 = sprintf_s(buf + len + len1 + len2, - SKP_TEXT_BUF_SIZE - len - len1 - len2, ".%d", i); - off = len + len1 + len2 + len3; + if (!kv->open_scope(i)) + continue; - skin_param_osage_root_coli_type type = SKIN_PARAM_OSAGE_ROOT_COLI_TYPE_NONE; - if (!sub_local_key_val.read_int32_t( - buf, off, ".type", 6, (int32_t*)&type)) + skin_param_osage_root_coli* c = &vc[i]; + + int32_t type = 0; + if (!kv->read("type", type)) { + kv->close_scope(); break; - c->type = type; + } + c->type = (skin_param_osage_root_coli_type)type; float_t radius = 0; - if (!sub_local_key_val.read_float_t( - buf, off, ".radius", 8, &radius)) + if (!kv->read("radius", radius)) { + kv->close_scope(); break; + } c->radius = radius; - const char* bone0_name = 0; - if (!sub_local_key_val.read_string( - buf, off, ".bone.0.name", 13, &bone0_name)) + const char* bone0_name; + if (!kv->read("bone.0.name", bone0_name)) { + kv->close_scope(); break; + } c->bone0_index = bone_data->get_skeleton_object_bone_index( bone_database_skeleton_type_to_string(BONE_DATABASE_SKELETON_COMMON), bone0_name); vec3 bone0_pos = vec3_null; - if (!sub_local_key_val.read_float_t( - buf, off, ".bone.0.posx", 13, &bone0_pos.x)) - break; - - if (!sub_local_key_val.read_float_t( - buf, off, ".bone.0.posy", 13, &bone0_pos.y)) - break; - - if (!sub_local_key_val.read_float_t( - buf, off, ".bone.0.posz", 13, &bone0_pos.z)) + if (!kv->read("bone.0.posx", bone0_pos.x) + || !kv->read("bone.0.posy", bone0_pos.y) + || !kv->read("bone.0.posz", bone0_pos.z)) { + kv->close_scope(); break; + } c->bone0_pos = bone0_pos; - const char* bone1_name = 0; - if (sub_local_key_val.read_string( - buf, off, ".bone.1.name", 13, &bone1_name)) { - + const char* bone1_name; + if (kv->read("bone.1.name", bone1_name)) { c->bone1_index = bone_data->get_skeleton_object_bone_index( bone_database_skeleton_type_to_string(BONE_DATABASE_SKELETON_COMMON), bone1_name); vec3 bone1_pos = vec3_null; - if (!sub_local_key_val.read_float_t( - buf, off, ".bone.1.posx", 13, &bone1_pos.x)) - break; - - if (!sub_local_key_val.read_float_t( - buf, off, ".bone.1.posy", 13, &bone1_pos.y)) - break; - - if (!sub_local_key_val.read_float_t( - buf, off, ".bone.1.posz", 13, &bone1_pos.z)) + if (!kv->read("bone.1.posx", bone1_pos.x) + || !kv->read("bone.1.posy", bone1_pos.y) + || !kv->read("bone.1.posz", bone1_pos.z)) { + kv->close_scope(); break; + } c->bone1_pos = bone1_pos; - } + kv->close_scope(); } + kv->close_scope(); } - len2 = 4; - memcpy(buf + len + len1, ".boc", 4); - off = len + len1 + len2; - - buf[off] = 0; - if (lkv.read_int32_t(buf, off, ".length", 8, &count) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { + if (kv->read("boc", "length", count)) { std::vector* vb = &skp_root->boc; vb->resize(count); for (int32_t i = 0; i < count; i++) { - len3 = sprintf_s(buf + len + len1 + len2, - SKP_TEXT_BUF_SIZE - len - len1 - len2, ".%d", i); - off = len + len1 + len2 + len3; + if (!kv->open_scope(i)) + continue; int32_t st_node = 0; std::string ed_root; int32_t ed_node = 0; - if (sub_local_key_val.read_int32_t( - buf, off, ".st_node", 9, &st_node) + if (kv->read("st_node", st_node) && st_node < node_length - && sub_local_key_val.read_string( - buf, off, ".ed_root", 9, &ed_root) - && sub_local_key_val.read_int32_t( - buf, off, ".ed_node", 9, &ed_node) + && kv->read("ed_root", ed_root) + && kv->read("ed_node", ed_node) && ed_node < node_length) { skin_param_osage_root_boc b; b.st_node = st_node; @@ -14281,47 +14347,40 @@ static void skin_param_osage_root_parse(key_val* kv, const char* name, b.ed_node = ed_node; vb->push_back(b); } + kv->close_scope(); } + kv->close_scope(); } - off = len + len1; std::string colli_tgt_osg; - if (lkv.read_string( - buf, off, ".colli_tgt_osg", 15, &colli_tgt_osg)) + if (kv->read("colli_tgt_osg", colli_tgt_osg)) skp_root->colli_tgt_osg = colli_tgt_osg; - len2 = 11; - memcpy(buf + len + len1, ".normal_ref", 11); - off = len + len1 + len2; - - buf[off] = 0; - if (lkv.read_int32_t(buf, off, ".length", 8, &count) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { + if (kv->read("normal_ref", "length", count)) { std::vector* vnr = &skp_root->normal_ref; vnr->resize(count); for (int32_t i = 0; i < count; i++) { - len3 = sprintf_s(buf + len + len1 + len2, - SKP_TEXT_BUF_SIZE - len - len1 - len2, ".%d", i); - off = len + len1 + len2 + len3; + if (!kv->open_scope(i)) + continue; std::string n; - if (sub_local_key_val.read_string( - buf, off, ".N", 3, &n)) { + if (kv->read("N", n)) { skin_param_osage_root_normal_ref nr; nr.n = n; - sub_local_key_val.read_string( - buf, off, ".U", 3, &nr.u); - sub_local_key_val.read_string( - buf, off, ".D", 3, &nr.d); - sub_local_key_val.read_string( - buf, off, ".L", 3, &nr.l); - sub_local_key_val.read_string( - buf, off, ".R", 3, &nr.r); + kv->read("U", nr.u); + kv->read("D", nr.d); + kv->read("L", nr.l); + kv->read("R", nr.r); vnr->push_back(nr); } + kv->close_scope(); } + kv->close_scope(); } + + kv->close_scope(); + kv->close_scope(); } static bool task_rob_load_check_load_req_data() { @@ -14345,7 +14404,7 @@ rob_chara_item_equip* rob_chara_array_get_item_equip(int32_t chara_id) { int32_t rob_chara_array_init_chara_index(chara_index chara_index, rob_chara_pv_data* pv_data, int32_t module_index, bool can_set_default) { - if (!TaskWork::CheckTaskReady(&task_rob_manager) + if (!app::TaskWork::CheckTaskReady(&task_rob_manager) || pv_data->type < ROB_CHARA_TYPE_0|| pv_data->type > ROB_CHARA_TYPE_3) return -1; @@ -14425,7 +14484,7 @@ int32_t rob_chara::get_rob_cmn_mottbl_motion_id(int32_t id) { } void task_rob_manager_append_task() { - TaskWork::AppendTask(&task_rob_manager, "ROB_MANAGER TASK"); + app::TaskWork::AppendTask(&task_rob_manager, "ROB_MANAGER TASK"); for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) rob_chara_pv_data_array[i].type = ROB_CHARA_TYPE_NONE; } @@ -14471,7 +14530,7 @@ parent_mat(), node(), ik_segment_length(), ik_2nd_segment_length(), arm_length() bone_data_parent::bone_data_parent() : rob_bone_data(), motion_bone_count(), ik_bone_count(), chain_pos(), global_trans(), -global_rotation(), bone_key_set_count(), global_key_set_count(), rotation_y() { +global_rotation(), bone_key_set_count(), global_key_set_count(), rot_y() { } @@ -14503,7 +14562,7 @@ void mot_play_data::reset() { field_48 = 0; } -MotionBlend::MotionBlend() : field_8(), field_9(), +MotionBlend::MotionBlend() : field_8(), rot_y(), duration(), frame(), step(1.0f), offset(), blend() { } @@ -14514,7 +14573,7 @@ MotionBlend::~MotionBlend() { void MotionBlend::Reset() { field_8 = false; - field_9 = false; + rot_y = false; duration = 0.0f; frame = 0.0f; step = 1.0f; @@ -14541,7 +14600,8 @@ void MotionBlend::SetDuration(float_t duration, float_t step, float_t offset) { } MotionBlendCross::MotionBlendCross() : field_20(), field_21(), -field_24(mat4u_identity), field_64(mat4u_identity), field_A4(mat4u_identity), field_E4(mat4u_identity) { +rot_y_mat(mat4u_identity), field_64(mat4u_identity), +field_A4(mat4u_identity), field_E4(mat4u_identity) { } @@ -14553,7 +14613,7 @@ void MotionBlendCross::Reset() { MotionBlend::Reset(); field_20 = false; field_21 = false; - field_24 = mat4u_identity; + rot_y_mat = mat4u_identity; field_64 = mat4u_identity; field_A4 = mat4u_identity; field_E4 = mat4u_identity; @@ -14563,26 +14623,26 @@ void MotionBlendCross::Field_10(float_t a2, float_t a3, int32_t a4) { } -void MotionBlendCross::Field_18(struc_400* a2) { +void MotionBlendCross::Step(struc_400* a2) { field_20 = a2->field_0; field_21 = true; if (duration <= 0.0f || duration <= frame || fabsf(duration - frame) <= 0.000001f) { field_8 = false; - field_9 = false; + rot_y = false; } else { - field_9 = true; + rot_y = true; blend = (frame + offset) / (duration + offset); frame += step; } - if (field_9) { + if (rot_y) { mat4 mat; - mat4_rotate_y(-a2->prev_eyes_adjust, &mat); - field_24 = mat; + mat4_rotate_y(-a2->prev_rot_y, &mat); + rot_y_mat = mat; } else - field_24 = mat4u_identity; + rot_y_mat = mat4u_identity; } void MotionBlendCross::Field_20(std::vector* a2, std::vector* a3) { @@ -14593,7 +14653,7 @@ void MotionBlendCross::Field_20(std::vector* a2, std::vectordata(); mat4_mult(&v4[4].rot_mat[0], &v4[0].rot_mat[0], &field_64); - mat4_mult(&v7[0].rot_mat[0], &field_24, &field_A4); + mat4_mult(&v7[0].rot_mat[0], &rot_y_mat, &field_A4); mat4_blend_rotation(&v4[0].rot_mat[0], &field_A4, &v4[0].rot_mat[0], blend); mat4_mult(&v7[4].rot_mat[0], &field_A4, &field_A4); mat4_blend_rotation(&v4[4].rot_mat[0], &v7[4].rot_mat[0], &v4[4].rot_mat[0], blend); @@ -14668,16 +14728,16 @@ MotionBlendCombine::~MotionBlendCombine() { } -void MotionBlendCombine::Field_18(struc_400* a2) { +void MotionBlendCombine::Step(struc_400* a2) { field_20 = a2->field_0; field_21 = true; - if (field_9) { + if (rot_y) { mat4 mat; - mat4_rotate_y(-a2->prev_eyes_adjust, &mat); - field_24 = mat; + mat4_rotate_y(-a2->prev_rot_y, &mat); + rot_y_mat = mat; } else - field_24 = mat4u_identity; + rot_y_mat = mat4u_identity; } bool MotionBlendCombine::Field_30() { @@ -14685,7 +14745,8 @@ bool MotionBlendCombine::Field_30() { } MotionBlendFreeze::MotionBlendFreeze() : field_20(),field_21(), field_24(), field_28(), field_2C(), field_30(), -field_34(mat4u_identity), field_74(mat4u_identity), field_B4(mat4u_identity), field_F4(mat4u_identity) { +rot_y_mat(mat4u_identity), field_74(mat4u_identity), +field_B4(mat4u_identity), field_F4(mat4u_identity) { } @@ -14701,7 +14762,7 @@ void MotionBlendFreeze::Reset() { field_28 = 0.0f; field_2C = 0.0f; field_30 = 2; - field_34 = mat4u_identity; + rot_y_mat = mat4u_identity; field_74 = mat4u_identity; field_B4 = mat4u_identity; field_F4 = mat4u_identity; @@ -14716,7 +14777,7 @@ void MotionBlendFreeze::Field_10(float_t a2, float_t a3, int32_t a4) { field_28 = a2; } -void MotionBlendFreeze::Field_18(struc_400* a2) { +void MotionBlendFreeze::Step(struc_400* a2) { field_24 = 2; if (duration <= 0.0f || duration <= frame || fabsf(duration - frame) <= 0.000001f) { float_t v7 = a2->frame; @@ -14724,10 +14785,10 @@ void MotionBlendFreeze::Field_18(struc_400* a2) { float_t v9 = v7 - v8; if (v7 < v8 || field_28 <= 0.0f || field_28 <= v9 || fabsf(field_28 - v9) <= 0.000001f) { field_8 = false; - field_9 = false; + rot_y = false; } else { - field_9 = true; + rot_y = true; field_24 = field_30; blend = 1.0f - (v9 + offset) / (field_28 + offset); if (a2->field_4) @@ -14737,7 +14798,7 @@ void MotionBlendFreeze::Field_18(struc_400* a2) { } } else { - field_9 = true; + rot_y = true; field_24 = 0; blend = (frame + offset) / (duration + offset); frame += step; @@ -14745,16 +14806,16 @@ void MotionBlendFreeze::Field_18(struc_400* a2) { field_21 = a2->field_1; } - if (field_9) { + if (rot_y) { mat4 mat; if (field_24) - mat4_rotate_y(a2->eyes_adjust, &mat); + mat4_rotate_y(a2->rot_y, &mat); else - mat4_rotate_y(-a2->prev_eyes_adjust, &mat); - field_34 = mat; + mat4_rotate_y(-a2->prev_rot_y, &mat); + rot_y_mat = mat; } else - field_34 = mat4u_identity; + rot_y_mat = mat4u_identity; } void MotionBlendFreeze::Field_20(std::vector* a2, std::vector* a3) { @@ -14763,7 +14824,7 @@ void MotionBlendFreeze::Field_20(std::vector* a2, std::vectordata(); mat4_mult(&v2[4].rot_mat[0], &v2->rot_mat[0], &field_74); - mat4_mult(&v2->rot_mat_prev[0][field_24], &field_34, &field_B4); + mat4_mult(&v2->rot_mat_prev[0][field_24], &rot_y_mat, &field_B4); mat4_blend_rotation(v2->rot_mat, &field_B4, v2->rot_mat, blend); mat4_mult(&v2[4].rot_mat_prev[0][field_24], &field_B4, &field_B4); mat4_blend_rotation(&v2[4].rot_mat[0], &v2[4].rot_mat_prev[0][field_24], &v2[4].rot_mat[0], blend); @@ -14845,13 +14906,13 @@ void PartialMotionBlendFreeze::Field_10(float_t a2, float_t a3, int32_t a4) { } -void PartialMotionBlendFreeze::Field_18(struc_400* a1) { +void PartialMotionBlendFreeze::Step(struc_400* a1) { if (duration <= 0.0f || duration <= frame || fabsf(duration - frame) <= 0.000001f) { field_8 = false; - field_9 = false; + rot_y = false; } else { - field_9 = true; + rot_y = true; frame += step; blend = (offset + frame) / (offset + duration); } @@ -14928,8 +14989,8 @@ void motion_blend_mot::reset() { 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.rot_y = 0.0f; + field_4F8.prev_rot_y = 0.0f; field_4F8.field_90 = vec3_identity; field_4F8.field_9C = vec3_identity; field_4F8.field_A8 = vec3_identity; @@ -15389,21 +15450,21 @@ void ExConstraintBlock::InitData(rob_chara_item_equip_object* itm_eq_obj, item_equip_object = itm_eq_obj; source_node_bone_node = rob_chara_item_equip_object_get_bone_node_by_name( - itm_eq_obj, string_data(&cns_data->source_node_name), bone_data); + itm_eq_obj, cns_data->source_node_name, bone_data); obj_skin_block_constraint_type type = cns_data->type; - char* up_vector_name; + const char* up_vector_name; if (type == OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION) { constraint_type = OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION; - up_vector_name = string_data(&cns_data->direction.up_vector.name); + up_vector_name = cns_data->direction.up_vector.name; } else if (type == OBJ_SKIN_BLOCK_CONSTRAINT_POSITION) { constraint_type = OBJ_SKIN_BLOCK_CONSTRAINT_POSITION; - up_vector_name = string_data(&cns_data->position.up_vector.name); + up_vector_name = cns_data->position.up_vector.name; } else if (type == OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE) { constraint_type = OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE; - up_vector_name = string_data(&cns_data->distance.up_vector.name); + up_vector_name = cns_data->distance.up_vector.name; } else if (type == OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION) { constraint_type = OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION; @@ -15602,37 +15663,36 @@ void ExExpressionBlock::InitData(rob_chara_item_equip_object* itm_eq_obj, } for (int32_t i = 0; i < 9; i++) { - const char* expression = string_data(&exp_data->expressions[i]); - if (!expression || str_utils_compare_length(expression, exp_data->expressions[i].length, "= ", 2)) + const char* expression = exp_data->expressions[i]; + if (!expression || str_utils_compare(expression, "= ")) break; expression += 2; int32_t index = 0; - expression = str_utils_get_next_int32_t(expression, &index, ' '); + expression = str_utils_get_next_int32_t(expression, index, ' '); values[i] = bone_node_get_exp_data_component(bone_node_ptr, index, &types[i]); while (expression) { - string v73; - expression = str_utils_get_next_string(expression, &v73, ' '); - if (!v73.length || !memcmp(string_data(&v73), "error", min(v73.length, 5)) && v73.length == 5) { - string_free(&v73); + std::string value_type; + expression = str_utils_get_next_string(expression, value_type, ' '); + if (!value_type.size() || !memcmp(value_type.c_str(), "error", + min(value_type.size(), 5)) && value_type.size() == 5) break; - } - if (*string_data(&v73) == 'n') { + if (value_type[0] == 'n') { stack_val->type = EX_EXPRESSION_BLOCK_STACK_NUMBER; - expression = str_utils_get_next_float_t(expression, &stack_val->number.value, ' '); + expression = str_utils_get_next_float_t(expression, stack_val->number.value, ' '); *stack_buf_val++ = stack_val; } - else if (*string_data(&v73) == 'v') { - string func_str; - expression = str_utils_get_next_string(expression, &func_str, ' '); + else if (value_type[0] == 'v') { + std::string func_str; + expression = str_utils_get_next_string(expression, func_str, ' '); stack_val->type = EX_EXPRESSION_BLOCK_STACK_VARIABLE; - int32_t v40 = *string_data(&func_str) - '0'; + int32_t v40 = func_str[0] - '0'; if (v40 < 9) { bone_node* v42 = rob_chara_item_equip_object_get_bone_node_by_name(itm_eq_obj, - string_data(&func_str) + 2, bone_data); + func_str.c_str() + 2, bone_data); if (v42) stack_val->var.value = bone_node_get_exp_data_component(v42, v40, &stack_val->type); else { @@ -15643,41 +15703,36 @@ void ExExpressionBlock::InitData(rob_chara_item_equip_object* itm_eq_obj, else stack_val->var.value = &frame; *stack_buf_val++ = stack_val; - string_free(&func_str); } - else if (*string_data(&v73) == 'f') { - string func_str; - expression = str_utils_get_next_string(expression, &func_str, ' '); + else if (value_type[0] == 'f') { + std::string func_str; + expression = str_utils_get_next_string(expression, func_str, ' '); stack_val->type = EX_EXPRESSION_BLOCK_STACK_OP1; stack_val->op1.v1 = stack_buf_val[-1]; - stack_val->op1.func = exp_func_op1_find_func(&func_str, exp_func_op1_array)->func; + stack_val->op1.func = exp_func_op1_find_func(func_str, exp_func_op1_array)->func; stack_buf_val[-1] = stack_val; - string_free(&func_str); } - else if (*string_data(&v73) == 'g') { - string func_str; - expression = str_utils_get_next_string(expression, &func_str, ' '); + else if (value_type[0] == 'g') { + std::string func_str; + expression = str_utils_get_next_string(expression, func_str, ' '); stack_val->type = EX_EXPRESSION_BLOCK_STACK_OP2; stack_val->op2.v1 = stack_buf_val[-2]; stack_val->op2.v2 = stack_buf_val[-1]; - stack_val->op2.func = exp_func_op2_find_func(&func_str, exp_func_op2_array)->func; + stack_val->op2.func = exp_func_op2_find_func(func_str, exp_func_op2_array)->func; stack_buf_val[-2] = stack_val; stack_buf_val--; - string_free(&func_str); } - else if (*string_data(&v73) == 'h') { - string func_str; - expression = str_utils_get_next_string(expression, &func_str, ' '); + else if (value_type[0] == 'h') { + std::string func_str; + expression = str_utils_get_next_string(expression, func_str, ' '); stack_val->type = EX_EXPRESSION_BLOCK_STACK_OP3; stack_val->op3.v1 = stack_buf_val[-3]; stack_val->op3.v2 = stack_buf_val[-2]; stack_val->op3.v3 = stack_buf_val[-1]; - stack_val->op3.func = exp_func_op3_find_func(&func_str, exp_func_op3_array)->func; + stack_val->op3.func = exp_func_op3_find_func(func_str, exp_func_op3_array)->func; stack_buf_val[-3] = stack_val; stack_buf_val -= 2; - string_free(&func_str); } - string_free(&v73); expressions[i] = stack_buf_val[-1]; stack_val++; } @@ -16198,7 +16253,7 @@ 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(), disable_update(), field_DC(), texture_color_coeff(), wet(), wind_strength(), +field_B4(), 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(), @@ -16270,7 +16325,7 @@ struc_523::~struc_523() { struc_264::struc_264() : field_0(), field_4(), field_18(), field_2C(), field_40(), field_54(), field_68(), field_6C(), field_70(), field_74(), field_78(), field_7C(), field_80(), field_84(), field_88(), field_8C(), field_90(), field_94(), field_98(), field_9C(), field_A0(), field_A4(), field_A5(), field_A8(), field_AC(), -field_B0(), eyes_adjust(), field_140(), field_144(), field_145(), field_146(), field_148(), field_150(), +field_B0(), field_B4(), field_140(), field_144(), field_145(), field_146(), field_148(), field_150(), field_152(), field_154(), field_158(), field_15C(), field_160(), field_164(), field_168(), field_16C(), field_170(), field_174(), field_178(), field_17C(), field_180(), field_184(), field_188(), field_18C(), field_190(), field_194(), field_198(), field_19C(), field_1A0(), field_1A4(), field_1A8(), field_1B0(), field_1B4(), @@ -17151,7 +17206,7 @@ void MotFile::LoadFile(std::string* mdata_dir, uint32_t set) { load_count = 1; } -void MotFile::ParseFile(void* data, size_t size) { +void MotFile::ParseFile(const void* data, size_t size) { mot_set = new ::mot_set; mot_set->unpack_file(data, size, false); } @@ -17169,7 +17224,7 @@ bool MotFile::Unload() { return false; } -void MotFile::ParseFileParent(void* data, void* file_data, size_t size) { +void MotFile::ParseFileParent(void* data, const void* file_data, size_t size) { ((MotFile*)data)->ParseFile(file_data, size); } @@ -17209,7 +17264,7 @@ void MhdFile::LoadFile(const char* path, const char* file, uint32_t set) { load_count = 1; } -void MhdFile::ParseFile(void* data) { +void MhdFile::ParseFile(const void* data) { mothead_file* mhdf = (mothead_file*)((size_t)data + ((uint32_t*)data)[1]); this->data = MhdFile::ParseMothead(mhdf, (size_t)mhdf); } @@ -17313,7 +17368,7 @@ bool MhdFile::Unload() { return false; } -void MhdFile::ParseFileParent(void* data, void* file_data, size_t size) { +void MhdFile::ParseFileParent(void* data, const void* file_data, size_t size) { ((MhdFile*)data)->ParseFile(file_data); } @@ -17326,98 +17381,64 @@ osage_setting::~osage_setting() { } void osage_setting::parse(key_val* kv) { - char buf[OSG_SET_TEXT_BUF_SIZE]; int32_t count; - int32_t count1; - size_t len; - size_t len1; - size_t len2; - size_t len3; - size_t off; + if (kv->read("cat", "length", count)) { + for (int32_t i = 0; i < count; i++) { + if (!kv->open_scope(i)) + continue; - key_val lkv; - if (kv->get_local_key_val("cat", &lkv)) { - len = 3; - memcpy(buf, "cat", 3); - off = len; + std::string name; + kv->read("name", name); - buf[off] = 0; - key_val slkv; - if (lkv.read_int32_t(buf, off, ".length", 8, &count) - && lkv.get_local_key_val(buf, &slkv)) - for (int32_t i = 0; i < count; i++) { - len1 = sprintf_s(buf + len, - OSG_SET_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + int32_t count; + if (kv->read("osg", "length", count)) { + for (int32_t j = 0; j < count; j++) { + if (!kv->open_scope(j)) + continue; - std::string name; - lkv.read_string( - buf, off, ".name", 6, &name); + int32_t exf = 0; + kv->read("exf", exf); - len2 = 4; - memcpy(buf + len + len1, ".osg", 4); - off = len + len1 + len2; + std::string parts; + kv->read("parts", parts); - buf[min(off, OSG_SET_TEXT_BUF_SIZE - 1)] = 0; - key_val sslkv; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sslkv)) - for (int32_t j = 0; j < count1; j++) { - len3 = sprintf_s(buf + len + len1 + len2, - OSG_SET_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); - off = len + len1 + len2 + len3; + std::string root; + kv->read("root", root); - int32_t exf = 0; - lkv.read_int32_t( - buf, off, ".exf", 5, &exf); + std::pair key = { name, root }; + auto elem = cat.find(key); + if (elem == cat.end()) + elem = cat.insert({ key, {} }).first; - std::string parts; - lkv.read_string( - buf, off, ".parts", 7, &parts); - - std::string root; - lkv.read_string( - buf, off, ".root", 6, &root); - - std::pair key = { name, root }; - auto elem = cat.find(key); - if (elem == cat.end()) - elem = cat.insert({ key, {} }).first; - - elem->second.exf = exf; - elem->second.parts = parse_parts_string(&parts); - } + elem->second.exf = exf; + elem->second.parts = parse_parts_string(&parts); + kv->close_scope(); + } + kv->close_scope(); } + kv->close_scope(); + } + kv->close_scope(); } - data_struct* data = rctx_ptr->data; - object_database* obj_db = &data->data_ft.obj_db; + data_struct* aft_data = &data_list[DATA_AFT]; + object_database* aft_obj_db = &aft_data->data_ft.obj_db; - if (kv->get_local_key_val("obj", &lkv)) { - len = 3; - memcpy(buf, "obj", 3); - off = len; + if (kv->read("obj", "length", count)) { + for (int32_t i = 0; i < count; i++) { + if (!kv->open_scope(i)) + continue; - buf[off] = 0; - key_val slkv; - if (lkv.read_int32_t(buf, off, ".length", 8, &count) - && lkv.get_local_key_val(buf, &slkv)) { - for (int32_t i = 0; i < count; i++) { - len1 = sprintf_s(buf + len, - OSG_SET_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + std::string cat; + kv->read("cat", cat); - std::string cat; - lkv.read_string( - buf, off, ".cat", 5, &cat); + std::string name; + kv->read("name", name); - std::string name; - lkv.read_string( - buf, off, ".name", 6, &name); - - obj.insert_or_assign(obj_db->get_object_info(name.c_str()), cat); - } + obj.insert_or_assign(aft_obj_db->get_object_info(name.c_str()), cat); + kv->close_scope(); } + kv->close_scope(); } } @@ -17558,18 +17579,18 @@ bool PvOsageManager::sub_1404F7AF0() { void PvOsageManager::sub_1404F7BD0(bool not_reset) { if (reset && !not_reset) { - data_struct* data = rctx_ptr->data; - bone_database* bone_data = &data->data_ft.bone_data; - motion_database* mot_db = &data->data_ft.mot_db; + data_struct* aft_data = &data_list[DATA_AFT]; + bone_database* aft_bone_data = &aft_data->data_ft.bone_data; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; rob_chara* rob_chr = rob_chara_array_get(chara_id); rob_chr->set_motion_id(rob_chr->get_rob_cmn_mottbl_motion_id(0), - 0.0f, 0.0f, 1, 0, MOTION_BLEND_CROSS, bone_data, mot_db); - rob_chr->set_face_mottbl_motion(0, 6, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, true, mot_db); - rob_chr->set_hand_l_mottbl_motion(0, 192, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); - rob_chr->set_hand_r_mottbl_motion(0, 192, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); - rob_chr->set_mouth_mottbl_motion(0, 131, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); - rob_chr->set_eyes_mottbl_motion(0, 165, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, mot_db); - rob_chr->set_eyelid_mottbl_motion_from_face(0, 0.0f, -1.0f, 0.0f, mot_db); + 0.0f, 0.0f, 1, 0, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); + rob_chr->set_face_mottbl_motion(0, 6, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, true, aft_mot_db); + rob_chr->set_hand_l_mottbl_motion(0, 192, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, aft_mot_db); + rob_chr->set_hand_r_mottbl_motion(0, 192, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, aft_mot_db); + rob_chr->set_mouth_mottbl_motion(0, 131, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, aft_mot_db); + rob_chr->set_eyes_mottbl_motion(0, 165, 0.0f, -1, 0.0f, 0.0f, 1.0f, -1, 0.0f, aft_mot_db); + rob_chr->set_eyelid_mottbl_motion_from_face(0, 0.0f, -1.0f, 0.0f, aft_mot_db); } Reset(); } @@ -17902,8 +17923,8 @@ void SkinParamManager::sub_14060FBD0() { if (!field_70.size()) return; - data_struct* data = rctx_ptr->data; - object_database* obj_db = &data->data_ft.obj_db; + data_struct* aft_data = &data_list[DATA_AFT]; + object_database* aft_obj_db = &aft_data->data_ft.obj_db; field_B8.clear(); for (struc_462& i : field_70) { @@ -17913,7 +17934,7 @@ void SkinParamManager::sub_14060FBD0() { if (!v9.is_null()) continue; - const char* v11 = obj_db->get_object_name(v9); + const char* v11 = aft_obj_db->get_object_name(v9); if (!v11) continue; @@ -18155,11 +18176,11 @@ bool TaskRobDisp::Ctrl() { if (pv_osage_manager_array_ptr_get_disp()) return false; - data_struct* data = rctx_ptr->data; - bone_database* bone_data = &data->data_ft.bone_data; - object_database* obj_db = &data->data_ft.obj_db; + data_struct* aft_data = &data_list[DATA_AFT]; + bone_database* aft_bone_data = &aft_data->data_ft.bone_data; + object_database* aft_obj_db = &aft_data->data_ft.obj_db; for (rob_chara*& i : init_chara) { - rob_disp_rob_chara_init(i, bone_data, data, obj_db); + rob_disp_rob_chara_init(i, aft_bone_data, aft_data, aft_obj_db); AppendCtrlCharaList(i); } init_chara.clear(); @@ -18448,14 +18469,14 @@ int32_t TaskRobLoad::CtrlFunc3() { free_req_data.clear(); } - data_struct* data = rctx_ptr->data; - motion_database* mot_db = &data->data_ft.mot_db; - object_database* obj_db = &data->data_ft.obj_db; + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + object_database* aft_obj_db = &aft_data->data_ft.obj_db; if (load_req_data_obj.size()) { for (ReqDataObj& i : load_req_data_obj) { AppendLoadedReqDataObj(&i); - LoadCharaItemsParent(i.chara_index, &i.cos, data, obj_db); + LoadCharaItemsParent(i.chara_index, &i.cos, aft_data, aft_obj_db); load_item_req_data_obj.push_back(i); } load_req_data_obj.clear(); @@ -18465,7 +18486,7 @@ int32_t TaskRobLoad::CtrlFunc3() { if (load_req_data.size()) { for (ReqData& i : load_req_data) { AppendLoadedReqData(&i); - LoadCharaObjSetMotionSet(i.chara_index, data, obj_db, mot_db); + LoadCharaObjSetMotionSet(i.chara_index, aft_data, aft_obj_db, aft_mot_db); load_item_req_data.push_back(i); } load_req_data.clear(); @@ -18664,11 +18685,11 @@ TaskRobManager::~TaskRobManager() { } bool TaskRobManager::Init() { - TaskWork::AppendTask(&task_rob_load, 0, "ROB_LOAD", 0); + app::TaskWork::AppendTask(&task_rob_load, 0, "ROB_LOAD", 0); rob_manager_rob_impl* rob_impls1 = rob_manager_rob_impls1_get(this); for (; rob_impls1->task; rob_impls1++) { RobImplTask* task = rob_impls1->task; - TaskWork::AppendTask(task, rob_impls1->name); + app::TaskWork::AppendTask(task, rob_impls1->name); task->is_frame_dependent = task->IsFrameDependent(); task->FreeCharaLists(); } @@ -18676,7 +18697,7 @@ bool TaskRobManager::Init() { rob_manager_rob_impl* rob_impls2 = rob_manager_rob_impls2_get(this); for (; rob_impls2->task; rob_impls2++) { RobImplTask* task = rob_impls2->task; - TaskWork::AppendTask(task, rob_impls2->name); + app::TaskWork::AppendTask(task, rob_impls2->name); task->is_frame_dependent = task->IsFrameDependent(); task->FreeCharaLists(); } @@ -18691,12 +18712,12 @@ bool TaskRobManager::Ctrl() { if (task_rob_load_check_load_req_data()) return false; if (load_chara.size()) { - data_struct* data = rctx_ptr->data; - bone_database* bone_data = &data->data_ft.bone_data; - motion_database* mot_db = &data->data_ft.mot_db; + data_struct* aft_data = &data_list[DATA_AFT]; + bone_database* aft_bone_data = &aft_data->data_ft.bone_data; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; for (rob_chara*& i : load_chara) { - i->reset_data(&i->pv_data, bone_data, mot_db); + i->reset_data(&i->pv_data, aft_bone_data, aft_mot_db); AppendLoadedCharaList(i); } CheckTypeAppendInitCharaLists(&load_chara); @@ -18873,7 +18894,7 @@ void TaskRobManager::AppendLoadedCharaList(rob_chara* rob_chr) { } bool TaskRobManager::CheckCharaLoaded(rob_chara* rob_chr) { - if (!TaskWork::CheckTaskReady(this) + if (!app::TaskWork::CheckTaskReady(this) || rob_chr->chara_id < 0 || rob_chr->chara_id >= ROB_CHARA_COUNT) return false; diff --git a/src/CRE/rob.hpp b/src/CRE/rob.hpp index 4d298434..b4152659 100644 --- a/src/CRE/rob.hpp +++ b/src/CRE/rob.hpp @@ -5,12 +5,12 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "../KKdLib/database/bone.hpp" #include "../KKdLib/database/motion.hpp" -#include "../KKdLib/mat.h" +#include "../KKdLib/mat.hpp" #include "../KKdLib/mot.hpp" -#include "../KKdLib/vec.h" +#include "../KKdLib/vec.hpp" #include "draw_object.h" #include "item_table.hpp" #include "object.hpp" @@ -34,9 +34,11 @@ enum ex_node_type { }; enum eyes_base_adjust_type { - EYES_BASE_ADJUST_DIRECTION = 0, - EYES_BASE_ADJUST_CLEARANCE = 1, - EYES_BASE_ADJUST_OFF = 2, + EYES_BASE_ADJUST_NONE = -1, + EYES_BASE_ADJUST_DIRECTION = 0x00, + EYES_BASE_ADJUST_CLEARANCE = 0x01, + EYES_BASE_ADJUST_OFF = 0x02, + EYES_BASE_ADJUST_MAX = 0x03, }; enum mot_bone_index { @@ -923,7 +925,7 @@ struct bone_data_parent { vec3 global_rotation; uint32_t bone_key_set_count; uint32_t global_key_set_count; - float_t rotation_y; + float_t rot_y; bone_data_parent(); ~bone_data_parent(); @@ -967,8 +969,8 @@ struct struc_308 { vec3 field_90; vec3 field_9C; vec3 field_A8; - float_t eyes_adjust; - float_t prev_eyes_adjust; + float_t rot_y; + float_t prev_rot_y; uint8_t field_BC; uint8_t field_BD; float_t field_C0; @@ -983,14 +985,14 @@ struct struc_400 { bool field_3; bool field_4; float_t frame; - float_t eyes_adjust; - float_t prev_eyes_adjust; + float_t rot_y; + float_t prev_rot_y; }; class MotionBlend { public: bool field_8; - bool field_9; + bool rot_y; float_t duration; float_t frame; float_t step; @@ -1001,7 +1003,7 @@ public: virtual ~MotionBlend(); virtual void Reset(); virtual void Field_10(float_t a2, float_t a3, int32_t a4) = 0; - virtual void Field_18(struc_400*) = 0; + virtual void Step(struc_400*) = 0; virtual void Field_20(std::vector*, std::vector*) = 0; virtual void Blend(bone_data*, bone_data*) = 0; virtual bool Field_30(); @@ -1013,7 +1015,7 @@ class MotionBlendCross : public MotionBlend { public: bool field_20; bool field_21; - mat4u field_24; + mat4u rot_y_mat; mat4u field_64; mat4u field_A4; mat4u field_E4; @@ -1022,7 +1024,7 @@ public: virtual ~MotionBlendCross() override; virtual void Reset() override; virtual void Field_10(float_t a2, float_t a3, int32_t a4) override; - virtual void Field_18(struc_400*) override; + virtual void Step(struc_400*) override; virtual void Field_20(std::vector*, std::vector*) override; virtual void Blend(bone_data*, bone_data*) override; }; @@ -1031,7 +1033,7 @@ class MotionBlendCombine : public MotionBlendCross { public: MotionBlendCombine(); virtual ~MotionBlendCombine() override; - virtual void Field_18(struc_400*) override; + virtual void Step(struc_400*) override; virtual bool Field_30() override; }; @@ -1043,7 +1045,7 @@ public: float_t field_28; float_t field_2C; int32_t field_30; - mat4u field_34; + mat4u rot_y_mat; mat4u field_74; mat4u field_B4; mat4u field_F4; @@ -1052,7 +1054,7 @@ public: virtual ~MotionBlendFreeze() override; virtual void Reset() override; virtual void Field_10(float_t a2, float_t a3, int32_t a4) override; - virtual void Field_18(struc_400*) override; + virtual void Step(struc_400*) override; virtual void Field_20(std::vector*, std::vector*) override; virtual void Blend(bone_data*, bone_data*) override; }; @@ -1063,7 +1065,7 @@ public: virtual ~PartialMotionBlendFreeze() override; virtual void Reset() override; virtual void Field_10(float_t a2, float_t a3, int32_t a4) override; - virtual void Field_18(struc_400*) override; + virtual void Step(struc_400*) override; virtual void Field_20(std::vector*, std::vector*) override; virtual void Blend(bone_data*, bone_data*) override; }; @@ -1883,7 +1885,7 @@ struct rob_chara_item_equip { int32_t field_A0; shadow_type_enum shadow_type; vec3 position; - int32_t eyes_adjust; + int32_t field_B4; std::vector texture_pattern; object_info field_D0; int32_t field_D4; @@ -2035,7 +2037,7 @@ struct struc_264 { int32_t field_A8; int32_t field_AC; int32_t field_B0; - bool eyes_adjust; + bool field_B4; struc_523 field_B8; int32_t field_140; int8_t field_144; @@ -2593,7 +2595,7 @@ struct struc_652 { int64_t field_260; int64_t field_268; int32_t field_270; - uint16_t field_274; + int16_t field_274; int16_t field_276; int32_t field_278; int32_t field_27C; @@ -2941,6 +2943,7 @@ struct rob_chara { mat4* get_bone_data_mat(size_t index); float_t get_frame(); float_t get_frame_count(); + float_t get_max_face_depth(); int32_t get_rob_cmn_mottbl_motion_id(int32_t id); void load_motion(int32_t motion_id, bool a3, float_t frame, MotionBlendType blend_type, bone_database* bone_data, motion_database* mot_db); diff --git a/src/CRE/shader.c b/src/CRE/shader.c index 74ea18c2..dfab66b0 100644 --- a/src/CRE/shader.c +++ b/src/CRE/shader.c @@ -4,9 +4,9 @@ */ #include "shader.h" -#include "../KKdLib/io/path.h" +#include "../KKdLib/io/path.hpp" #include "../KKdLib/hash.hpp" -#include "../KKdLib/str_utils.h" +#include "../KKdLib/str_utils.hpp" #include "gl_state.h" #include @@ -27,23 +27,21 @@ static bool shader_parse_define(const char* data, int32_t num_uniform, static char* shader_parse_include(char* data, farc* f); static void shader_update_data(shader_set_data* set); -int32_t shader_bind(shader* shader, uint32_t sub_index) { - int32_t num_sub = shader->num_sub; +int32_t shader::bind(uint32_t sub_index) { int32_t sub_shader_index = 0; if (num_sub < 1) return -1; - for (shader_sub* i = shader->sub; i->sub_index != sub_index; i++) { + for (shader_sub* i = sub; i->sub_index != sub_index; i++) { sub_shader_index++; if (sub_shader_index >= num_sub) return -1; } - shader_sub* sub_shader = &shader->sub[sub_shader_index]; + shader_sub* sub_shader = &sub[sub_shader_index]; if (!sub_shader) return -1; - int32_t num_uniform = shader->num_uniform; int32_t unival_curr = 1; int32_t unival = 0; GLint uniform_val[16]; @@ -53,13 +51,13 @@ int32_t shader_bind(shader* shader, uint32_t sub_index) { int32_t i = 0; for (i = 0; i < num_uniform && i < 16; i++) { - int32_t unival_max = shader->use_permut[i] + int32_t unival_max = use_permut[i] ? max(vp_unival_max[i], fp_unival_max[i]) : 0; - unival += unival_curr * min(uniform_value[(int32_t)shader->use_uniform[i]], unival_max); + unival += unival_curr * min(uniform_value[(int32_t)use_uniform[i]], unival_max); unival_curr *= unival_max + 1; int32_t unival_max_glsl = max(vp_unival_max[i], fp_unival_max[i]); - uniform_val[i] = min(uniform_value[shader->use_uniform[i]], unival_max_glsl); + uniform_val[i] = min(uniform_value[use_uniform[i]], unival_max_glsl); } for (; i < 16; i++) @@ -71,36 +69,42 @@ int32_t shader_bind(shader* shader, uint32_t sub_index) { return 0; } -inline void shader_draw_arrays(shader_set_data* set, - GLenum mode, GLint first, GLsizei count) { - shader_update_data(set); +void shader::unbind() { + gl_state_use_program(0); + gl_state_bind_uniform_buffer_base(0, 0); + gl_state_bind_uniform_buffer_base(1, 0); + gl_state_bind_uniform_buffer_base(2, 0); + gl_state_bind_uniform_buffer_base(3, 0); +} + +void shader_set_data::draw_arrays(GLenum mode, GLint first, GLsizei count) { + shader_update_data(this); glDrawArrays(mode, first, count); } -inline void shader_draw_elements(shader_set_data* set, - GLenum mode, GLsizei count, GLenum type, const void* indices) { - shader_update_data(set); +void shader_set_data::draw_elements(GLenum mode, + GLsizei count, GLenum type, const void* indices) { + shader_update_data(this); glDrawElements(mode, count, type, indices); } -inline void shader_draw_range_elements(shader_set_data* set, - GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices) { - shader_update_data(set); +void shader_set_data::draw_range_elements(GLenum mode, + GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices) { + shader_update_data(this); glDrawRangeElements(mode, start, end, count, type, indices); } -int32_t shader_get_index_by_name(shader_set_data* set, const char* name) { - shader* shaders = set->shaders; - for (size_t i = 0; i < set->size; i++) +int32_t shader_set_data::get_index_by_name(const char* name) { + for (size_t i = 0; i < size; i++) if (!str_utils_compare(shaders[i].name, name)) return (int32_t)shaders[i].index; return -1; } -void shader_load(shader_set_data* set, farc* f, bool ignore_cache, bool not_load_cache, +void shader_set_data::load(farc* f, bool ignore_cache, bool not_load_cache, const char* name, const shader_table* shaders_table, const size_t size, const shader_bind_func* bind_func_table, const size_t bind_func_table_size) { - if (!set || !f || !shaders_table || !size) + if (!this || !f || !shaders_table || !size) return; bool shader_cache_changed = false; @@ -128,10 +132,10 @@ void shader_load(shader_set_data* set, farc* f, bool ignore_cache, bool not_load std::vector vec_vert; std::vector vec_frag; std::vector program_data_binary; - set->shaders = force_malloc_s(shader, size); - set->size = size; + shaders = force_malloc_s(shader, size); + this->size = size; for (size_t i = 0; i < size; i++) { - shader* shader = &set->shaders[i]; + shader* shader = &shaders[i]; shader->name = shaders_table[i].name; shader->index = shaders_table[i].index; shader->num_sub = shaders_table[i].num_sub; @@ -404,42 +408,54 @@ void shader_load(shader_set_data* set, farc* f, bool ignore_cache, bool not_load if (shader_cache_changed) shader_cache_farc.write(temp_buf, FARC_COMPRESS_FArC, false); - memset(&set->data, 0, sizeof(set->data)); - glGenBuffers(1, &set->data.state_ubo); - gl_state_bind_uniform_buffer(set->data.state_ubo); - glBufferData(GL_UNIFORM_BUFFER, - sizeof(set->data.state), (void*)&set->data.state, GL_DYNAMIC_DRAW); + memset(&data, 0, sizeof(data)); + glGenBuffers(1, &data.state_ubo); + gl_state_bind_uniform_buffer(data.state_ubo); + glBufferData(GL_UNIFORM_BUFFER, sizeof(data.state), (void*)&data.state, GL_DYNAMIC_DRAW); gl_state_bind_uniform_buffer(0); - glGenBuffers(1, &set->data.state_matrix_ubo); - gl_state_bind_uniform_buffer(set->data.state_matrix_ubo); - glBufferData(GL_UNIFORM_BUFFER, - sizeof(set->data.state_matrix), (void*)&set->data.state_matrix, GL_DYNAMIC_DRAW); + glGenBuffers(1, &data.state_matrix_ubo); + gl_state_bind_uniform_buffer(data.state_matrix_ubo); + glBufferData(GL_UNIFORM_BUFFER, sizeof(data.state_matrix), (void*)&data.state_matrix, GL_DYNAMIC_DRAW); gl_state_bind_uniform_buffer(0); - glGenBuffers(1, &set->data.env_ubo); - gl_state_bind_uniform_buffer(set->data.env_ubo); - glBufferData(GL_UNIFORM_BUFFER, - sizeof(set->data.env), (void*)&set->data.env, GL_DYNAMIC_DRAW); + glGenBuffers(1, &data.env_ubo); + gl_state_bind_uniform_buffer(data.env_ubo); + glBufferData(GL_UNIFORM_BUFFER, sizeof(data.env), (void*)&data.env, GL_DYNAMIC_DRAW); gl_state_bind_uniform_buffer(0); - glGenBuffers(1, &set->data.buffer_ubo); - gl_state_bind_uniform_buffer(set->data.buffer_ubo); - glBufferData(GL_UNIFORM_BUFFER, - sizeof(set->data.buffer), (void*)&set->data.buffer, GL_DYNAMIC_DRAW); + glGenBuffers(1, &data.buffer_ubo); + gl_state_bind_uniform_buffer(data.buffer_ubo); + glBufferData(GL_UNIFORM_BUFFER, sizeof(data.buffer), (void*)&data.buffer, GL_DYNAMIC_DRAW); gl_state_bind_uniform_buffer(0); } -void shader_free(shader_set_data* set) { - glDeleteBuffers(1, &set->data.state_ubo); - glDeleteBuffers(1, &set->data.state_matrix_ubo); - glDeleteBuffers(1, &set->data.env_ubo); - glDeleteBuffers(1, &set->data.buffer_ubo); - memset(&set->data, 0, sizeof(set->data)); +void shader_set_data::set(uint32_t index) { + if (this && index && shaders && index != -1) { + env_frag_set(0x18, (float_t)uniform_value[U_TEXTURE_BLEND], 0.0, 0.0, 0.0); + shader* shader = &shaders[index]; + if (shader->bind_func) + shader->bind_func(this, shader); + else + shader->bind(shader->sub[0].sub_index); + gl_state_bind_uniform_buffer_base(0, data.state_ubo); + gl_state_bind_uniform_buffer_base(1, data.state_matrix_ubo); + gl_state_bind_uniform_buffer_base(2, data.env_ubo); + gl_state_bind_uniform_buffer_base(3, data.buffer_ubo); + } + else + shader::unbind(); +} + +void shader_set_data::unload() { + glDeleteBuffers(1, &data.state_ubo); + glDeleteBuffers(1, &data.state_matrix_ubo); + glDeleteBuffers(1, &data.env_ubo); + glDeleteBuffers(1, &data.buffer_ubo); + memset(&data, 0, sizeof(data)); - size_t size = set->size; for (size_t i = 0; i < size; i++) { - shader* shader = &set->shaders[i]; + shader* shader = &shaders[i]; int32_t num_sub = shader->num_sub; shader_sub* sub = shader->sub; for (size_t j = 0; j < num_sub; j++, sub++) { @@ -469,55 +485,26 @@ void shader_free(shader_set_data* set) { } free(shader->sub); } - free(set->shaders); + free(shaders); } -void shader_set(shader_set_data* set, uint32_t index) { - if (set && index && set->shaders && index != -1) { - shader_env_frag_set(set, 0x18, - (float_t)uniform_value[U_TEXTURE_BLEND], 0.0, 0.0, 0.0); - shader* shader = &set->shaders[index]; - if (shader->bind_func) - shader->bind_func(set, shader); - else - shader_bind(shader, shader->sub[0].sub_index); - gl_state_bind_uniform_buffer_base(0, set->data.state_ubo); - gl_state_bind_uniform_buffer_base(1, set->data.state_matrix_ubo); - gl_state_bind_uniform_buffer_base(2, set->data.env_ubo); - gl_state_bind_uniform_buffer_base(3, set->data.buffer_ubo); - } - else - shader_unbind(); -} - -inline void shader_unbind() { - gl_state_use_program(0); - gl_state_bind_uniform_buffer_base(0, 0); - gl_state_bind_uniform_buffer_base(1, 0); - gl_state_bind_uniform_buffer_base(2, 0); - gl_state_bind_uniform_buffer_base(3, 0); -} - -inline void shader_buffer_get_ptr(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_BUFFER_PARAMETERS || !data) +void shader_set_data::buffer_get(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_PROGRAM_BUFFER_PARAMETERS) return; - memcpy(data, &set->data.buffer.buffer[index], sizeof(vec4)); + data = this->data.buffer.buffer[index]; } -inline void shader_buffer_get_ptr_array(shader_set_data* set, - size_t index, size_t count, vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_BUFFER_PARAMETERS +void shader_set_data::buffer_get(size_t index, size_t count, vec4* data) { + if (!this || index >= SHADER_MAX_PROGRAM_BUFFER_PARAMETERS || index + count > SHADER_MAX_PROGRAM_BUFFER_PARAMETERS || !data) return; - memcpy(data, &set->data.buffer.buffer[index], sizeof(vec4) * count); + memcpy(data, &this->data.buffer.buffer[index], sizeof(vec4) * count); } -inline void shader_local_frag_get(shader_set_data* set, - size_t index, float_t* x, float_t* y, float_t* z, float_t* w) { - if (!set || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS || !x || !y || !z || !w) +void shader_set_data::local_frag_get(size_t index, float_t* x, float_t* y, float_t* z, float_t* w) { + if (!this || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS || !x || !y || !z || !w) return; GLfloat temp[4]; @@ -528,22 +515,17 @@ inline void shader_local_frag_get(shader_set_data* set, *w = temp[3]; } -inline void shader_local_frag_get_ptr(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS || !data) +void shader_set_data::local_frag_get(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS) return; GLfloat temp[4]; glGetUniformfv(gl_state_get_program(), (GLint)(index + SHADER_MAX_PROGRAM_LOCAL_PARAMETERS), temp); - data->x = temp[0]; - data->y = temp[1]; - data->z = temp[2]; - data->w = temp[3]; + data = { temp[0], temp[1], temp[2], temp[3] }; } -inline void shader_local_vert_get(shader_set_data* set, - size_t index, float_t* x, float_t* y, float_t* z, float_t* w) { - if (!set || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS || !x || !y || !z || !w) +void shader_set_data::local_vert_get(size_t index, float_t* x, float_t* y, float_t* z, float_t* w) { + if (!this || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS || !x || !y || !z || !w) return; GLfloat temp[4]; @@ -554,431 +536,378 @@ inline void shader_local_vert_get(shader_set_data* set, *w = temp[3]; } -inline void shader_local_vert_get_ptr(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS || !data) +void shader_set_data::local_vert_get(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS) return; GLfloat temp[4]; glGetUniformfv(gl_state_get_program(), (GLint)index, temp); - data->x = temp[0]; - data->y = temp[1]; - data->z = temp[2]; - data->w = temp[3]; + data = { temp[0], temp[1], temp[2], temp[3] }; } -inline void shader_env_frag_get(shader_set_data* set, - size_t index, float_t* x, float_t* y, float_t* z, float_t* w) { - if (!set || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS || !x || !y || !z || !w) +void shader_set_data::env_frag_get(size_t index, float_t* x, float_t* y, float_t* z, float_t* w) { + if (!this || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS || !x || !y || !z || !w) return; - vec4 data = set->data.env.frag[index]; + vec4& data = this->data.env.frag[index]; *x = data.x; *y = data.y; *z = data.z; *w = data.w; } -inline void shader_env_frag_get_ptr(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS || !data) +void shader_set_data::env_frag_get(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS) return; - *data = set->data.env.frag[index]; + data = this->data.env.frag[index]; } -inline void shader_env_frag_get_ptr_array(shader_set_data* set, - size_t index, size_t count, vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS +void shader_set_data::env_frag_get(size_t index, size_t count, vec4* data) { + if (!this || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS || index + count > SHADER_MAX_PROGRAM_ENV_PARAMETERS || !data) return; - memcpy(data, &set->data.env.frag[index], sizeof(vec4) * count); + memcpy(data, &this->data.env.frag[index], sizeof(vec4) * count); } -inline void shader_env_vert_get(shader_set_data* set, - size_t index, float_t* x, float_t* y, float_t* z, float_t* w) { - if (!set || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS || !x || !y || !z || !w) +void shader_set_data::env_vert_get(size_t index, float_t* x, float_t* y, float_t* z, float_t* w) { + if (!this || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS || !x || !y || !z || !w) return; - vec4 data = set->data.env.vert[index]; + vec4 data = this->data.env.vert[index]; *x = data.x; *y = data.y; *z = data.z; *w = data.w; } -inline void shader_env_vert_get_ptr(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS || !data) +void shader_set_data::env_vert_get(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS) return; - *data = set->data.env.vert[index]; + data = this->data.env.vert[index]; } -inline void shader_env_vert_get_ptr_array(shader_set_data* set, - size_t index, size_t count, vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS +void shader_set_data::env_vert_get(size_t index, size_t count, vec4* data) { + if (!this || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS || index + count > SHADER_MAX_PROGRAM_ENV_PARAMETERS || !data) return; - memcpy(data, &set->data.env.vert[index], sizeof(vec4) * count); + memcpy(data, &this->data.env.vert[index], sizeof(vec4) * count); } -inline void shader_state_clip_get_plane(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_CLIP_PLANES || !data) +void shader_set_data::state_clip_get_plane(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_CLIP_PLANES) return; - *data = set->data.state.clip[index].plane; + data = this->data.state.clip[index].plane; } -inline void shader_state_depth_get_range(shader_set_data* set, - vec4* data) { - if (!set || !data) +void shader_set_data::state_depth_get_range(vec4& data) { + if (!this) return; - *data = set->data.state.depth.range; + data = this->data.state.depth.range; } -inline void shader_state_fog_get_color(shader_set_data* set, - vec4* data) { - if (!set || !data) +void shader_set_data::state_fog_get_color(vec4& data) { + if (!this) return; - *data = set->data.state.fog.color; + data = this->data.state.fog.color; } -inline void shader_state_fog_get_params(shader_set_data* set, - vec4* data) { - if (!set || !data) +void shader_set_data::state_fog_get_params(vec4& data) { + if (!this) return; - *data = set->data.state.fog.params; + data = this->data.state.fog.params; } -inline void shader_state_light_get_ambient(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_light_get_ambient(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; - *data = set->data.state.light[index].ambient; + data = this->data.state.light[index].ambient; } -inline void shader_state_light_get_diffuse(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_light_get_diffuse(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; - *data = set->data.state.light[index].ambient; + data = this->data.state.light[index].ambient; } -inline void shader_state_light_get_specular(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_light_get_specular(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; - *data = set->data.state.light[index].ambient; + data = this->data.state.light[index].ambient; } -inline void shader_state_light_get_position(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_light_get_position(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; - *data = set->data.state.light[index].ambient; + data = this->data.state.light[index].ambient; } -inline void shader_state_light_get_attenuation(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_light_get_attenuation(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; - *data = set->data.state.light[index].ambient; + data = this->data.state.light[index].ambient; } -inline void shader_state_light_get_spot_direction(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_light_get_spot_direction(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; - *data = set->data.state.light[index].ambient; + data = this->data.state.light[index].ambient; } -inline void shader_state_light_get_half(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_light_get_half(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; - *data = set->data.state.light[index].ambient; + data = this->data.state.light[index].ambient; } -inline void shader_state_lightmodel_get_ambient(shader_set_data* set, - bool back, vec4* data) { - if (!set || !data) +void shader_set_data::state_lightmodel_get_ambient(bool back, vec4& data) { + if (!this) return; - *data = set->data.state.lightmodel[back ? 1 : 0].ambient; + data = this->data.state.lightmodel[back ? 1 : 0].ambient; } -inline void shader_state_lightmodel_get_scene_color(shader_set_data* set, - bool back, vec4* data) { - if (!set || !data) +void shader_set_data::state_lightmodel_get_scene_color(bool back, vec4& data) { + if (!this) return; - *data = set->data.state.lightmodel[back ? 1 : 0].scene_color; + data = this->data.state.lightmodel[back ? 1 : 0].scene_color; } -inline void shader_state_lightprod_get_ambient(shader_set_data* set, - bool back, size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_lightprod_get_ambient(bool back, size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; shader_state_lightprod* lightprod = back - ? set->data.state.lightprod_back : set->data.state.lightprod_front; - *data = lightprod[index].ambient; + ? this->data.state.lightprod_back : this->data.state.lightprod_front; + data = lightprod[index].ambient; } -inline void shader_state_lightprod_get_diffuse(shader_set_data* set, - bool back, size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_lightprod_get_diffuse(bool back, size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; shader_state_lightprod* lightprod = back - ? set->data.state.lightprod_back : set->data.state.lightprod_front; - *data = lightprod[index].diffuse; + ? this->data.state.lightprod_back : this->data.state.lightprod_front; + data = lightprod[index].diffuse; } -inline void shader_state_lightprod_get_specular(shader_set_data* set, - bool back, size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_lightprod_get_specular(bool back, size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; shader_state_lightprod* lightprod = back - ? set->data.state.lightprod_back : set->data.state.lightprod_front; - *data = lightprod[index].specular; + ? this->data.state.lightprod_back : this->data.state.lightprod_front; + data = lightprod[index].specular; } -inline void shader_state_material_get_ambient(shader_set_data* set, - bool back, vec4* data) { - if (!set || !data) +void shader_set_data::state_material_get_ambient(bool back, vec4& data) { + if (!this) return; - *data = set->data.state.material[back ? 1 : 0].ambient; + data = this->data.state.material[back ? 1 : 0].ambient; } -inline void shader_state_material_get_diffuse(shader_set_data* set, - bool back, vec4* data) { - if (!set || !data) +void shader_set_data::state_material_get_diffuse(bool back, vec4& data) { + if (!this) return; - *data = set->data.state.material[back ? 1 : 0].diffuse; + data = this->data.state.material[back ? 1 : 0].diffuse; } -inline void shader_state_material_get_specular(shader_set_data* set, - bool back, vec4* data) { - if (!set || !data) +void shader_set_data::state_material_get_specular(bool back, vec4& data) { + if (!this) return; - *data = set->data.state.material[back ? 1 : 0].specular; + data = this->data.state.material[back ? 1 : 0].specular; } -inline void shader_state_material_get_emission(shader_set_data* set, - bool back, vec4* data) { - if (!set || !data) +void shader_set_data::state_material_get_emission(bool back, vec4& data) { + if (!this) return; - *data = set->data.state.material[back ? 1 : 0].emission; + data = this->data.state.material[back ? 1 : 0].emission; } -inline void shader_state_material_get_shininess(shader_set_data* set, - bool back, vec4* data) { - if (!set || !data) +void shader_set_data::state_material_get_shininess(bool back, vec4& data) { + if (!this) return; - *data = set->data.state.material[back ? 1 : 0].shininess; + data = this->data.state.material[back ? 1 : 0].shininess; } -inline void shader_state_matrix_get_modelview(shader_set_data* set, - size_t index, mat4* data) { - if (!set || index >= SHADER_MAX_VERTEX_UNITS || !data) +void shader_set_data::state_matrix_get_modelview(size_t index, mat4& data) { + if (!this || index >= SHADER_MAX_VERTEX_UNITS) return; - *data = set->data.state_matrix.modelview[index].mat; + data = this->data.state_matrix.modelview[index].mat; } -inline void shader_state_matrix_get_projection(shader_set_data* set, - mat4* data) { - if (!set || !data) +void shader_set_data::state_matrix_get_projection(mat4& data) { + if (!this) return; - *data = set->data.state_matrix.projection.mat; + data = this->data.state_matrix.projection.mat; } -inline void shader_state_matrix_get_mvp(shader_set_data* set, - mat4* data) { - if (!set || !data) +void shader_set_data::state_matrix_get_mvp(mat4& data) { + if (!this) return; - *data = set->data.state_matrix.mvp.mat; + data = this->data.state_matrix.mvp.mat; } -inline void shader_state_matrix_get_texture(shader_set_data* set, - size_t index, mat4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_COORDS || !data) +void shader_set_data::state_matrix_get_texture(size_t index, mat4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_COORDS) return; - *data = set->data.state_matrix.texture[index].mat; + data = this->data.state_matrix.texture[index].mat; } -inline void shader_state_matrix_get_palette(shader_set_data* set, - size_t index, mat4* data) { - if (!set || index >= SHADER_MAX_PALETTE_MATRICES || !data) +void shader_set_data::state_matrix_get_palette(size_t index, mat4& data) { + if (!this || index >= SHADER_MAX_PALETTE_MATRICES) return; - *data = set->data.state_matrix.palette[index].mat; + data = this->data.state_matrix.palette[index].mat; } -inline void shader_state_matrix_get_program(shader_set_data* set, - size_t index, mat4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_MATRICES || !data) +void shader_set_data::state_matrix_get_program(size_t index, mat4& data) { + if (!this || index >= SHADER_MAX_PROGRAM_MATRICES) return; - *data = set->data.state_matrix.program[index].mat; + data = this->data.state_matrix.program[index].mat; } -inline void shader_state_point_get_size(shader_set_data* set, - vec4* data) { - if (!set || !data) +void shader_set_data::state_point_get_size(vec4& data) { + if (!this) return; - *data = set->data.state.point.size; + data = this->data.state.point.size; } -inline void shader_state_point_get_attenuation(shader_set_data* set, - vec4* data) { - if (!set || !data) +void shader_set_data::state_point_get_attenuation(vec4& data) { + if (!this) return; - *data = set->data.state.point.attenuation; + data = this->data.state.point.attenuation; } -inline void shader_state_texgen_get_eye_s(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_get_eye_s(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - *data = set->data.state.texgen[index].eye_s; + data = this->data.state.texgen[index].eye_s; } -inline void shader_state_texgen_get_eye_t(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_get_eye_t(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - *data = set->data.state.texgen[index].eye_t; + data = this->data.state.texgen[index].eye_t; } -inline void shader_state_texgen_get_eye_r(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_get_eye_r(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - *data = set->data.state.texgen[index].eye_r; + data = this->data.state.texgen[index].eye_r; } -inline void shader_state_texgen_get_eye_q(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_get_eye_q(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - *data = set->data.state.texgen[index].eye_q; + data = this->data.state.texgen[index].eye_q; } -inline void shader_state_texgen_get_object_s(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_get_object_s(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - *data = set->data.state.texgen[index].object_s; + data = this->data.state.texgen[index].object_s; } -inline void shader_state_texgen_get_object_t(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_get_object_t(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - *data = set->data.state.texgen[index].object_t; + data = this->data.state.texgen[index].object_t; } -inline void shader_state_texgen_get_object_r(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_get_object_r(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - *data = set->data.state.texgen[index].object_r; + data = this->data.state.texgen[index].object_r; } -inline void shader_state_texgen_get_object_q(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_get_object_q(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - *data = set->data.state.texgen[index].object_q; + data = this->data.state.texgen[index].object_q; } -inline void shader_state_texenv_get_color(shader_set_data* set, - size_t index, vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texenv_get_color(size_t index, vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - *data = set->data.state.texenv[index].color; + data = this->data.state.texenv[index].color; } -inline void shader_buffer_set_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_BUFFER_PARAMETERS || !data) +void shader_set_data::buffer_set(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_PROGRAM_BUFFER_PARAMETERS) return; - if (!memcmp(&set->data.buffer.buffer[index], data, sizeof(vec4))) + if (!memcmp(&this->data.buffer.buffer[index], &data, sizeof(vec4))) return; - set->data.buffer.buffer[index] = *data; - set->data.buffer_update_data = true; + this->data.buffer.buffer[index] = data; + this->data.buffer_update_data = true; } -inline void shader_buffer_set_ptr_array(shader_set_data* set, - size_t index, size_t count, const vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_BUFFER_PARAMETERS +void shader_set_data::buffer_set(size_t index, size_t count, const vec4* data) { + if (!this || index >= SHADER_MAX_PROGRAM_BUFFER_PARAMETERS || index + count > SHADER_MAX_PROGRAM_BUFFER_PARAMETERS || !data) return; - if (!memcmp(&set->data.buffer.buffer[index], data, sizeof(vec4) * count)) + if (!memcmp(&this->data.buffer.buffer[index], data, sizeof(vec4) * count)) return; - memcpy(&set->data.buffer.buffer[index], data, sizeof(vec4) * count); - set->data.buffer_update_data = true; + memcpy(&this->data.buffer.buffer[index], data, sizeof(vec4) * count); + this->data.buffer_update_data = true; } -inline void shader_local_frag_set(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS) +void shader_set_data::local_frag_set(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS) return; glUniform4f((GLint)(index + SHADER_MAX_PROGRAM_LOCAL_PARAMETERS), x, y, z, w); } -inline void shader_local_frag_set_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS || !data) +void shader_set_data::local_frag_set(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS) return; - glUniform4f((GLint)(index + SHADER_MAX_PROGRAM_LOCAL_PARAMETERS), data->x, data->y, data->z, data->w); + glUniform4f((GLint)(index + SHADER_MAX_PROGRAM_LOCAL_PARAMETERS), data.x, data.y, data.z, data.w); } -inline void shader_local_frag_set_ptr_array(shader_set_data* set, - size_t index, size_t count, const vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS +void shader_set_data::local_frag_set(size_t index, size_t count, const vec4* data) { + if (!this || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS || index + count > SHADER_MAX_PROGRAM_LOCAL_PARAMETERS || !data) return; @@ -986,820 +915,762 @@ inline void shader_local_frag_set_ptr_array(shader_set_data* set, (GLsizei)count, (const GLfloat*)data); } -inline void shader_local_vert_set(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS) +void shader_set_data::local_vert_set(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS) return; glUniform4f((GLint)index, x, y, z, w); } -inline void shader_local_vert_set_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS || !data) +void shader_set_data::local_vert_set(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS) return; - glUniform4f((GLint)index, data->x, data->y, data->z, data->w); + glUniform4f((GLint)index, data.x, data.y, data.z, data.w); } -inline void shader_local_vert_set_ptr_array(shader_set_data* set, - size_t index, size_t count, const vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS +void shader_set_data::local_vert_set(size_t index, size_t count, const vec4* data) { + if (!this || index >= SHADER_MAX_PROGRAM_LOCAL_PARAMETERS || index + count > SHADER_MAX_PROGRAM_LOCAL_PARAMETERS || !data) return; glUniform4fv((GLint)index, (GLsizei)count, (const GLfloat*)data); } -inline void shader_env_frag_set(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS) +void shader_set_data::env_frag_set(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS) return; - vec4 data; - data.x = x; - data.y = y; - data.z = z; - data.w = w; - if (!memcmp(&set->data.env.frag[index], &data, sizeof(vec4))) + vec4 data = { x, y, z, w }; + if (!memcmp(&this->data.env.frag[index], &data, sizeof(vec4))) return; - set->data.env.frag[index] = data; - set->data.env_update_data = true; + this->data.env.frag[index] = data; + this->data.env_update_data = true; } -inline void shader_env_frag_set_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS || !data) +void shader_set_data::env_frag_set(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS) return; - if (!memcmp(&set->data.env.frag[index], data, sizeof(vec4))) + if (!memcmp(&this->data.env.frag[index], &data, sizeof(vec4))) return; - set->data.env.frag[index] = *data; - set->data.env_update_data = true; + this->data.env.frag[index] = data; + this->data.env_update_data = true; } -inline void shader_env_frag_set_ptr_array(shader_set_data* set, - size_t index, size_t count, const vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS +void shader_set_data::env_frag_set(size_t index, size_t count, const vec4* data) { + if (!this || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS + || index + count > SHADER_MAX_PROGRAM_ENV_PARAMETERS) + return; + + if (!memcmp(&this->data.env.frag[index], data, sizeof(vec4) * count)) + return; + + memcpy(&this->data.env.frag[index], data, sizeof(vec4) * count); + this->data.env_update_data = true; +} + +void shader_set_data::env_vert_set(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS) + return; + + vec4 data = { x, y, z, w }; + if (!memcmp(&this->data.env.vert[index], &data, sizeof(vec4))) + return; + + this->data.env.vert[index] = data; + this->data.env_update_data = true; +} + +void shader_set_data::env_vert_set(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS) + return; + + if (!memcmp(&this->data.env.vert[index], &data, sizeof(vec4))) + return; + + this->data.env.vert[index] = data; + this->data.env_update_data = true; +} + +void shader_set_data::env_vert_set(size_t index, size_t count, const vec4* data) { + if (!this || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS || index + count > SHADER_MAX_PROGRAM_ENV_PARAMETERS || !data) return; - if (!memcmp(&set->data.env.frag[index], data, sizeof(vec4) * count)) + if (!memcmp(&this->data.env.vert[index], data, sizeof(vec4) * count)) return; - memcpy(&set->data.env.frag[index], data, sizeof(vec4) * count); - set->data.env_update_data = true; + memcpy(&this->data.env.vert[index], data, sizeof(vec4) * count); + this->data.env_update_data = true; } -inline void shader_env_vert_set(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS) - return; - - vec4 data; - data.x = x; - data.y = y; - data.z = z; - data.w = w; - if (!memcmp(&set->data.env.vert[index], &data, sizeof(vec4))) - return; - - set->data.env.vert[index] = data; - set->data.env_update_data = true; -} - -inline void shader_env_vert_set_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS || !data) - return; - - if (!memcmp(&set->data.env.vert[index], data, sizeof(vec4))) - return; - - set->data.env.vert[index] = *data; - set->data.env_update_data = true; -} - -inline void shader_env_vert_set_ptr_array(shader_set_data* set, - size_t index, size_t count, const vec4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_ENV_PARAMETERS - || index + count > SHADER_MAX_PROGRAM_ENV_PARAMETERS || !data) - return; - - if (!memcmp(&set->data.env.vert[index], data, sizeof(vec4) * count)) - return; - - memcpy(&set->data.env.vert[index], data, sizeof(vec4) * count); - set->data.env_update_data = true; -} - -inline void shader_state_clip_set_plane(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_CLIP_PLANES) +void shader_set_data::state_clip_set_plane(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_CLIP_PLANES) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.clip[index].plane, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.clip[index].plane, &data, sizeof(vec4))) return; - set->data.state.clip[index].plane = data; - set->data.state_update_data = true; + this->data.state.clip[index].plane = data; + this->data.state_update_data = true; } -inline void shader_state_clip_set_plane_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_CLIP_PLANES || !data) +void shader_set_data::state_clip_set_plane(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_CLIP_PLANES) return; - if (!memcmp(&set->data.state.clip[index].plane, data, sizeof(vec4))) + if (!memcmp(&this->data.state.clip[index].plane, &data, sizeof(vec4))) return; - set->data.state.clip[index].plane = *data; - set->data.state_update_data = true; + this->data.state.clip[index].plane = data; + this->data.state_update_data = true; } -inline void shader_state_depth_set_range(shader_set_data* set, - float_t x, float_t y, float_t z, float_t w) { - if (!set) +void shader_set_data::state_depth_set_range(float_t x, float_t y, float_t z, float_t w) { + if (!this) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.depth.range, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.depth.range, &data, sizeof(vec4))) return; - set->data.state.depth.range = data; - set->data.state_update_data = true; + this->data.state.depth.range = data; + this->data.state_update_data = true; } -inline void shader_state_depth_set_range_ptr(shader_set_data* set, - const vec4* data) { - if (!set || !data) +void shader_set_data::state_depth_set_range(const vec4& data) { + if (!this) return; - if (!memcmp(&set->data.state.depth.range, data, sizeof(vec4))) + if (!memcmp(&this->data.state.depth.range, &data, sizeof(vec4))) return; - set->data.state.depth.range = *data; - set->data.state_update_data = true; + this->data.state.depth.range = data; + this->data.state_update_data = true; } -inline void shader_state_fog_set_color(shader_set_data* set, - float_t x, float_t y, float_t z, float_t w) { - if (!set) +void shader_set_data::state_fog_set_color(float_t x, float_t y, float_t z, float_t w) { + if (!this) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.fog.color, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.fog.color, &data, sizeof(vec4))) return; - set->data.state.fog.color = data; - set->data.state_update_data = true; + this->data.state.fog.color = data; + this->data.state_update_data = true; } -inline void shader_state_fog_set_color_ptr(shader_set_data* set, - const vec4* data) { - if (!set || !data) +void shader_set_data::state_fog_set_color(const vec4& data) { + if (!this) return; - if (!memcmp(&set->data.state.fog.color, data, sizeof(vec4))) + if (!memcmp(&this->data.state.fog.color, &data, sizeof(vec4))) return; - set->data.state.fog.color = *data; - set->data.state_update_data = true; + this->data.state.fog.color = data; + this->data.state_update_data = true; } -inline void shader_state_fog_set_params(shader_set_data* set, - float_t x, float_t y, float_t z, float_t w) { - if (!set) +void shader_set_data::state_fog_set_params(float_t x, float_t y, float_t z, float_t w) { + if (!this) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.fog.params, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.fog.params, &data, sizeof(vec4))) return; - set->data.state.fog.params = data; - set->data.state_update_data = true; + this->data.state.fog.params = data; + this->data.state_update_data = true; } -inline void shader_state_fog_set_params_ptr(shader_set_data* set, - const vec4* data) { - if (!set || !data) +void shader_set_data::state_fog_set_params(const vec4& data) { + if (!this) return; - if (!memcmp(&set->data.state.fog.params, data, sizeof(vec4))) + if (!memcmp(&this->data.state.fog.params, &data, sizeof(vec4))) return; - set->data.state.fog.params = *data; - set->data.state_update_data = true; + this->data.state.fog.params = data; + this->data.state_update_data = true; } -inline void shader_state_light_set_ambient(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_LIGHTS) +void shader_set_data::state_light_set_ambient(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_LIGHTS) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.light[index].ambient, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.light[index].ambient, &data, sizeof(vec4))) return; - set->data.state.light[index].ambient = data; - set->data.state_update_data = true; + this->data.state.light[index].ambient = data; + this->data.state_update_data = true; vec4 lightprod_front; vec4 lightprod_back; - vec4_mult(set->data.state.light[index].ambient, - set->data.state.material[0].ambient, lightprod_front); - vec4_mult(set->data.state.light[index].ambient, - set->data.state.material[1].ambient, lightprod_back); - shader_state_lightprod_set_ambient_ptr(set, false, index, &lightprod_front); - shader_state_lightprod_set_ambient_ptr(set, true, index, &lightprod_back); + vec4_mult(this->data.state.light[index].ambient, + this->data.state.material[0].ambient, lightprod_front); + vec4_mult(this->data.state.light[index].ambient, + this->data.state.material[1].ambient, lightprod_back); + state_lightprod_set_ambient(false, index, lightprod_front); + state_lightprod_set_ambient(true, index, lightprod_back); } -inline void shader_state_light_set_ambient_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_light_set_ambient(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; - if (!memcmp(&set->data.state.light[index].ambient, data, sizeof(vec4))) + if (!memcmp(&this->data.state.light[index].ambient, &data, sizeof(vec4))) return; - set->data.state.light[index].ambient = *data; - set->data.state_update_data = true; + this->data.state.light[index].ambient = data; + this->data.state_update_data = true; vec4 lightprod_front; vec4 lightprod_back; - vec4_mult(set->data.state.light[index].ambient, - set->data.state.material[0].ambient, lightprod_front); - vec4_mult(set->data.state.light[index].ambient, - set->data.state.material[1].ambient, lightprod_back); - shader_state_lightprod_set_ambient_ptr(set, false, index, &lightprod_front); - shader_state_lightprod_set_ambient_ptr(set, true, index, &lightprod_back); + vec4_mult(this->data.state.light[index].ambient, + this->data.state.material[0].ambient, lightprod_front); + vec4_mult(this->data.state.light[index].ambient, + this->data.state.material[1].ambient, lightprod_back); + state_lightprod_set_ambient(false, index, lightprod_front); + state_lightprod_set_ambient(true, index, lightprod_back); } -inline void shader_state_light_set_diffuse(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_LIGHTS) +void shader_set_data::state_light_set_diffuse(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_LIGHTS) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.light[index].diffuse, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.light[index].diffuse, &data, sizeof(vec4))) return; - set->data.state.light[index].diffuse = data; - set->data.state_update_data = true; + this->data.state.light[index].diffuse = data; + this->data.state_update_data = true; vec4 lightprod_front; vec4 lightprod_back; - vec4_mult(set->data.state.light[index].diffuse, - set->data.state.material[0].diffuse, lightprod_front); - vec4_mult(set->data.state.light[index].diffuse, - set->data.state.material[1].diffuse, lightprod_back); - shader_state_lightprod_set_diffuse_ptr(set, false, index, &lightprod_front); - shader_state_lightprod_set_diffuse_ptr(set, true, index, &lightprod_back); + vec4_mult(this->data.state.light[index].diffuse, + this->data.state.material[0].diffuse, lightprod_front); + vec4_mult(this->data.state.light[index].diffuse, + this->data.state.material[1].diffuse, lightprod_back); + state_lightprod_set_diffuse(false, index, lightprod_front); + state_lightprod_set_diffuse(true, index, lightprod_back); } -inline void shader_state_light_set_diffuse_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_light_set_diffuse(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; - if (!memcmp(&set->data.state.light[index].diffuse, data, sizeof(vec4))) + if (!memcmp(&this->data.state.light[index].diffuse, &data, sizeof(vec4))) return; - set->data.state.light[index].diffuse = *data; - set->data.state_update_data = true; + this->data.state.light[index].diffuse = data; + this->data.state_update_data = true; vec4 lightprod_front; vec4 lightprod_back; - vec4_mult(set->data.state.light[index].diffuse, - set->data.state.material[0].diffuse, lightprod_front); - vec4_mult(set->data.state.light[index].diffuse, - set->data.state.material[1].diffuse, lightprod_back); - shader_state_lightprod_set_diffuse_ptr(set, false, index, &lightprod_front); - shader_state_lightprod_set_diffuse_ptr(set, true, index, &lightprod_back); + vec4_mult(this->data.state.light[index].diffuse, + this->data.state.material[0].diffuse, lightprod_front); + vec4_mult(this->data.state.light[index].diffuse, + this->data.state.material[1].diffuse, lightprod_back); + state_lightprod_set_diffuse(false, index, lightprod_front); + state_lightprod_set_diffuse(true, index, lightprod_back); } -inline void shader_state_light_set_specular(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_LIGHTS) +void shader_set_data::state_light_set_specular(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_LIGHTS) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.light[index].specular, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.light[index].specular, &data, sizeof(vec4))) return; - set->data.state.light[index].specular = data; - set->data.state_update_data = true; + this->data.state.light[index].specular = data; + this->data.state_update_data = true; vec4 lightprod_front; vec4 lightprod_back; - vec4_mult(set->data.state.light[index].specular, - set->data.state.material[0].specular, lightprod_front); - vec4_mult(set->data.state.light[index].specular, - set->data.state.material[1].specular, lightprod_back); - shader_state_lightprod_set_specular_ptr(set, false, index, &lightprod_front); - shader_state_lightprod_set_specular_ptr(set, true, index, &lightprod_back); + vec4_mult(this->data.state.light[index].specular, + this->data.state.material[0].specular, lightprod_front); + vec4_mult(this->data.state.light[index].specular, + this->data.state.material[1].specular, lightprod_back); + state_lightprod_set_specular(false, index, lightprod_front); + state_lightprod_set_specular(true, index, lightprod_back); } -inline void shader_state_light_set_specular_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_light_set_specular(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; - if (!memcmp(&set->data.state.light[index].specular, data, sizeof(vec4))) + if (!memcmp(&this->data.state.light[index].specular, &data, sizeof(vec4))) return; - set->data.state.light[index].specular = *data; - set->data.state_update_data = true; + this->data.state.light[index].specular = data; + this->data.state_update_data = true; vec4 lightprod_front; vec4 lightprod_back; - vec4_mult(set->data.state.light[index].specular, - set->data.state.material[0].specular, lightprod_front); - vec4_mult(set->data.state.light[index].specular, - set->data.state.material[1].specular, lightprod_back); - shader_state_lightprod_set_specular_ptr(set, false, index, &lightprod_front); - shader_state_lightprod_set_specular_ptr(set, true, index, &lightprod_back); + vec4_mult(this->data.state.light[index].specular, + this->data.state.material[0].specular, lightprod_front); + vec4_mult(this->data.state.light[index].specular, + this->data.state.material[1].specular, lightprod_back); + state_lightprod_set_specular(false, index, lightprod_front); + state_lightprod_set_specular(true, index, lightprod_back); } -inline void shader_state_light_set_position(shader_set_data* set, +void shader_set_data::state_light_set_position(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_LIGHTS) + return; + + vec4 data = { x, y, z, w }; + if (!memcmp(&this->data.state.light[index].position, &data, sizeof(vec4))) + return; + + this->data.state.light[index].position = data; + this->data.state_update_data = true; +} + +void shader_set_data::state_light_set_position(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) + return; + + if (!memcmp(&this->data.state.light[index].position, &data, sizeof(vec4))) + return; + + this->data.state.light[index].position = data; + this->data.state_update_data = true; +} + +void shader_set_data::state_light_set_attenuation(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_LIGHTS) + return; + + vec4 data = { x, y, z, w }; + if (!memcmp(&this->data.state.light[index].attenuation, &data, sizeof(vec4))) + return; + + this->data.state.light[index].attenuation = data; + this->data.state_update_data = true; +} + +void shader_set_data::state_light_set_attenuation(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) + return; + + if (!memcmp(&this->data.state.light[index].attenuation, &data, sizeof(vec4))) + return; + + this->data.state.light[index].attenuation = data; + this->data.state_update_data = true; +} + +void shader_set_data::state_light_set_spot_direction(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_LIGHTS) + return; + + vec4 data = { x, y, z, w }; + if (!memcmp(&this->data.state.light[index].spot_direction, &data, sizeof(vec4))) + return; + + this->data.state.light[index].spot_direction = data; + this->data.state_update_data = true; +} + +void shader_set_data::state_light_set_spot_direction(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) + return; + + if (!memcmp(&this->data.state.light[index].spot_direction, &data, sizeof(vec4))) + return; + + this->data.state.light[index].spot_direction = data; + this->data.state_update_data = true; +} + +void shader_set_data::state_light_set_half(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_LIGHTS) + return; + + vec4 data = { x, y, z, w }; + if (!memcmp(&this->data.state.light[index].half, &data, sizeof(vec4))) + return; + + this->data.state.light[index].half = data; + this->data.state_update_data = true; +} + +void shader_set_data::state_light_set_half(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) + return; + + if (!memcmp(&this->data.state.light[index].half, &data, sizeof(vec4))) + return; + + this->data.state.light[index].half = data; + this->data.state_update_data = true; +} + +void shader_set_data::state_lightmodel_set_ambient(bool back, float_t x, float_t y, float_t z, float_t w) { + if (!this) + return; + + vec4 data = { x, y, z, w }; + if (!memcmp(&this->data.state.lightmodel[back ? 1 : 0].ambient, &data, sizeof(vec4))) + return; + + this->data.state.lightmodel[back ? 1 : 0].ambient = data; + this->data.state_update_data = true; +} + +void shader_set_data::state_lightmodel_set_ambient(bool back, const vec4& data) { + if (!this) + return; + + if (!memcmp(&this->data.state.lightmodel[back ? 1 : 0].ambient, &data, sizeof(vec4))) + return; + + this->data.state.lightmodel[back ? 1 : 0].ambient = data; + this->data.state_update_data = true; +} + +void shader_set_data::state_lightmodel_set_scene_color(bool back, float_t x, float_t y, float_t z, float_t w) { + if (!this) + return; + + vec4 data = { x, y, z, w }; + if (!memcmp(&this->data.state.lightmodel[back ? 1 : 0].scene_color, &data, sizeof(vec4))) + return; + + this->data.state.lightmodel[back ? 1 : 0].scene_color = data; + this->data.state_update_data = true; +} + +void shader_set_data::state_lightmodel_set_scene_color(bool back, const vec4& data) { + if (!this) + return; + + if (!memcmp(&this->data.state.lightmodel[back ? 1 : 0].scene_color, &data, sizeof(vec4))) + return; + + this->data.state.lightmodel[back ? 1 : 0].scene_color = data; + this->data.state_update_data = true; +} + +void shader_set_data::state_lightprod_set_ambient(bool back, size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_LIGHTS) - return; - - vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.light[index].position, &data, sizeof(vec4))) - return; - - set->data.state.light[index].position = data; - set->data.state_update_data = true; -} - -inline void shader_state_light_set_position_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) - return; - - if (!memcmp(&set->data.state.light[index].position, data, sizeof(vec4))) - return; - - set->data.state.light[index].position = *data; - set->data.state_update_data = true; -} - -inline void shader_state_light_set_attenuation(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_LIGHTS) - return; - - vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.light[index].attenuation, &data, sizeof(vec4))) - return; - - set->data.state.light[index].attenuation = data; - set->data.state_update_data = true; -} - -inline void shader_state_light_set_attenuation_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) - return; - - if (!memcmp(&set->data.state.light[index].attenuation, data, sizeof(vec4))) - return; - - set->data.state.light[index].attenuation = *data; - set->data.state_update_data = true; -} - -inline void shader_state_light_set_spot_direction(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_LIGHTS) - return; - - vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.light[index].spot_direction, &data, sizeof(vec4))) - return; - - set->data.state.light[index].spot_direction = data; - set->data.state_update_data = true; -} - -inline void shader_state_light_set_spot_direction_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) - return; - - if (!memcmp(&set->data.state.light[index].spot_direction, data, sizeof(vec4))) - return; - - set->data.state.light[index].spot_direction = *data; - set->data.state_update_data = true; -} - -inline void shader_state_light_set_half(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_LIGHTS) - return; - - vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.light[index].half, &data, sizeof(vec4))) - return; - - set->data.state.light[index].half = data; - set->data.state_update_data = true; -} - -inline void shader_state_light_set_half_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) - return; - - if (!memcmp(&set->data.state.light[index].half, data, sizeof(vec4))) - return; - - set->data.state.light[index].half = *data; - set->data.state_update_data = true; -} - -inline void shader_state_lightmodel_set_ambient(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w) { - if (!set) - return; - - vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.lightmodel[back ? 1 : 0].ambient, &data, sizeof(vec4))) - return; - - set->data.state.lightmodel[back ? 1 : 0].ambient = data; - set->data.state_update_data = true; -} - -inline void shader_state_lightmodel_set_ambient_ptr(shader_set_data* set, - bool back, const vec4* data) { - if (!set || !data) - return; - - if (!memcmp(&set->data.state.lightmodel[back ? 1 : 0].ambient, data, sizeof(vec4))) - return; - - set->data.state.lightmodel[back ? 1 : 0].ambient = *data; - set->data.state_update_data = true; -} - -inline void shader_state_lightmodel_set_scene_color(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w) { - if (!set) - return; - - vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.lightmodel[back ? 1 : 0].scene_color, &data, sizeof(vec4))) - return; - - set->data.state.lightmodel[back ? 1 : 0].scene_color = data; - set->data.state_update_data = true; -} - -inline void shader_state_lightmodel_set_scene_color_ptr(shader_set_data* set, - bool back, const vec4* data) { - if (!set || !data) - return; - - if (!memcmp(&set->data.state.lightmodel[back ? 1 : 0].scene_color, data, sizeof(vec4))) - return; - - set->data.state.lightmodel[back ? 1 : 0].scene_color = *data; - set->data.state_update_data = true; -} - -inline void shader_state_lightprod_set_ambient(shader_set_data* set, - bool back, size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_LIGHTS) + if (!this || index >= SHADER_MAX_LIGHTS) return; shader_state_lightprod* lightprod = back - ? set->data.state.lightprod_back : set->data.state.lightprod_front; + ? data.state.lightprod_back : data.state.lightprod_front; vec4 data = { x, y, z, w }; if (!memcmp(&lightprod[index].ambient, &data, sizeof(vec4))) return; lightprod[index].ambient = data; - set->data.state_update_data = true; + this->data.state_update_data = true; } -inline void shader_state_lightprod_set_ambient_ptr(shader_set_data* set, - bool back, size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_lightprod_set_ambient(bool back, size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; shader_state_lightprod* lightprod = back - ? set->data.state.lightprod_back : set->data.state.lightprod_front; + ? this->data.state.lightprod_back : this->data.state.lightprod_front; - if (!memcmp(&lightprod[index].ambient, data, sizeof(vec4))) + if (!memcmp(&lightprod[index].ambient, &data, sizeof(vec4))) return; - lightprod[index].ambient = *data; - set->data.state_update_data = true; + lightprod[index].ambient = data; + this->data.state_update_data = true; } -inline void shader_state_lightprod_set_diffuse(shader_set_data* set, - bool back, size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_LIGHTS) +void shader_set_data::state_lightprod_set_diffuse(bool back, + size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_LIGHTS) return; shader_state_lightprod* lightprod = back - ? set->data.state.lightprod_back : set->data.state.lightprod_front; + ? data.state.lightprod_back : data.state.lightprod_front; vec4 data = { x, y, z, w }; if (!memcmp(&lightprod[index].diffuse, &data, sizeof(vec4))) return; lightprod[index].diffuse = data; - set->data.state_update_data = true; + this->data.state_update_data = true; } -inline void shader_state_lightprod_set_diffuse_ptr(shader_set_data* set, - bool back, size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_lightprod_set_diffuse(bool back, size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; shader_state_lightprod* lightprod = back - ? set->data.state.lightprod_back : set->data.state.lightprod_front; + ? this->data.state.lightprod_back : this->data.state.lightprod_front; - if (!memcmp(&lightprod[index].diffuse, data, sizeof(vec4))) + if (!memcmp(&lightprod[index].diffuse, &data, sizeof(vec4))) return; - lightprod[index].diffuse = *data; - set->data.state_update_data = true; + lightprod[index].diffuse = data; + this->data.state_update_data = true; } -inline void shader_state_lightprod_set_specular(shader_set_data* set, - bool back, size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_LIGHTS) +void shader_set_data::state_lightprod_set_specular(bool back, + size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_LIGHTS) return; shader_state_lightprod* lightprod = back - ? set->data.state.lightprod_back : set->data.state.lightprod_front; + ? data.state.lightprod_back : data.state.lightprod_front; vec4 data = { x, y, z, w }; if (!memcmp(&lightprod[index].specular, &data, sizeof(vec4))) return; lightprod[index].specular = data; - set->data.state_update_data = true; + this->data.state_update_data = true; } -inline void shader_state_lightprod_set_specular_ptr(shader_set_data* set, - bool back, size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_LIGHTS || !data) +void shader_set_data::state_lightprod_set_specular(bool back, + size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_LIGHTS) return; shader_state_lightprod* lightprod = back - ? set->data.state.lightprod_back : set->data.state.lightprod_front; + ? this->data.state.lightprod_back : this->data.state.lightprod_front; - if (!memcmp(&lightprod[index].specular, data, sizeof(vec4))) + if (!memcmp(&lightprod[index].specular, &data, sizeof(vec4))) return; - lightprod[index].specular = *data; - set->data.state_update_data = true; + lightprod[index].specular = data; + this->data.state_update_data = true; } -inline void shader_state_material_set_ambient(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w) { - if (!set) +void shader_set_data::state_material_set_ambient(bool back, float_t x, float_t y, float_t z, float_t w) { + if (!this) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.material[back ? 1 : 0].ambient, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.material[back ? 1 : 0].ambient, &data, sizeof(vec4))) return; - set->data.state.material[back ? 1 : 0].ambient = data; - set->data.state_update_data = true; + this->data.state.material[back ? 1 : 0].ambient = data; + this->data.state_update_data = true; - vec4 lightprod; for (int32_t index = 0; index < SHADER_MAX_LIGHTS; index++) { - vec4_mult(set->data.state.light[index].ambient, - set->data.state.material[back ? 1 : 0].ambient, lightprod); - shader_state_lightprod_set_ambient_ptr(set, back, index, &lightprod); + vec4 lightprod; + vec4_mult(this->data.state.light[index].ambient, + this->data.state.material[back ? 1 : 0].ambient, lightprod); + state_lightprod_set_ambient(back, index, lightprod); } } -inline void shader_state_material_set_ambient_ptr(shader_set_data* set, - bool back, const vec4* data) { - if (!set || !data) +void shader_set_data::state_material_set_ambient(bool back, const vec4& data) { + if (!this) return; - if (!memcmp(&set->data.state.material[back ? 1 : 0].ambient, data, sizeof(vec4))) + if (!memcmp(&this->data.state.material[back ? 1 : 0].ambient, &data, sizeof(vec4))) return; - set->data.state.material[back ? 1 : 0].ambient = *data; - set->data.state_update_data = true; + this->data.state.material[back ? 1 : 0].ambient = data; + this->data.state_update_data = true; - vec4 lightprod; for (int32_t index = 0; index < SHADER_MAX_LIGHTS; index++) { - vec4_mult(set->data.state.light[index].ambient, - set->data.state.material[back ? 1 : 0].ambient, lightprod); - shader_state_lightprod_set_ambient_ptr(set, back, index, &lightprod); + vec4 lightprod; + vec4_mult(this->data.state.light[index].ambient, + this->data.state.material[back ? 1 : 0].ambient, lightprod); + state_lightprod_set_ambient(back, index, lightprod); } } -inline void shader_state_material_set_diffuse(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w) { - if (!set) +void shader_set_data::state_material_set_diffuse(bool back, float_t x, float_t y, float_t z, float_t w) { + if (!this) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.material[back ? 1 : 0].diffuse, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.material[back ? 1 : 0].diffuse, &data, sizeof(vec4))) return; - set->data.state.material[back ? 1 : 0].diffuse = data; - set->data.state_update_data = true; - + this->data.state.material[back ? 1 : 0].diffuse = data; + this->data.state_update_data = true; vec4 lightprod; + for (int32_t index = 0; index < SHADER_MAX_LIGHTS; index++) { - vec4_mult(set->data.state.light[index].diffuse, - set->data.state.material[back ? 1 : 0].diffuse, lightprod); - shader_state_lightprod_set_diffuse_ptr(set, back, index, &lightprod); + vec4_mult(this->data.state.light[index].diffuse, + this->data.state.material[back ? 1 : 0].diffuse, lightprod); + state_lightprod_set_diffuse(back, index, lightprod); } } -inline void shader_state_material_set_diffuse_ptr(shader_set_data* set, - bool back, const vec4* data) { - if (!set || !data) +void shader_set_data::state_material_set_diffuse(bool back, const vec4& data) { + if (!this) return; - if (!memcmp(&set->data.state. material[back ? 1 : 0].diffuse, data, sizeof(vec4))) + if (!memcmp(&this->data.state. material[back ? 1 : 0].diffuse, &data, sizeof(vec4))) return; - set->data.state. material[back ? 1 : 0].diffuse = *data; - set->data.state_update_data = true; + this->data.state. material[back ? 1 : 0].diffuse = data; + this->data.state_update_data = true; - vec4 lightprod; for (int32_t index = 0; index < SHADER_MAX_LIGHTS; index++) { - vec4_mult(set->data.state.light[index].diffuse, - set->data.state.material[back ? 1 : 0].diffuse, lightprod); - shader_state_lightprod_set_diffuse_ptr(set, back, index, &lightprod); + vec4 lightprod; + vec4_mult(this->data.state.light[index].diffuse, + this->data.state.material[back ? 1 : 0].diffuse, lightprod); + state_lightprod_set_diffuse(back, index, lightprod); } } -inline void shader_state_material_set_specular(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w) { - if (!set) +void shader_set_data::state_material_set_specular(bool back, float_t x, float_t y, float_t z, float_t w) { + if (!this) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.material[back ? 1 : 0].specular, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.material[back ? 1 : 0].specular, &data, sizeof(vec4))) return; - set->data.state.material[back ? 1 : 0].specular = data; - set->data.state_update_data = true; + this->data.state.material[back ? 1 : 0].specular = data; + this->data.state_update_data = true; - vec4 lightprod; for (int32_t index = 0; index < SHADER_MAX_LIGHTS; index++) { - vec4_mult(set->data.state.light[index].specular, - set->data.state.material[back ? 1 : 0].specular, lightprod); - shader_state_lightprod_set_specular_ptr(set, back, index, &lightprod); + vec4 lightprod; + vec4_mult(this->data.state.light[index].specular, + this->data.state.material[back ? 1 : 0].specular, lightprod); + state_lightprod_set_specular(back, index, lightprod); } } -inline void shader_state_material_set_specular_ptr(shader_set_data* set, - bool back, const vec4* data) { - if (!set || !data) +void shader_set_data::state_material_set_specular(bool back, const vec4& data) { + if (!this) return; - if (!memcmp(&set->data.state.material[back ? 1 : 0].specular, data, sizeof(vec4))) + if (!memcmp(&this->data.state.material[back ? 1 : 0].specular, &data, sizeof(vec4))) return; - set->data.state.material[back ? 1 : 0].specular = *data; - set->data.state_update_data = true; + this->data.state.material[back ? 1 : 0].specular = data; + this->data.state_update_data = true; - vec4 lightprod; for (int32_t index = 0; index < SHADER_MAX_LIGHTS; index++) { - vec4_mult(set->data.state.light[index].specular, - set->data.state.material[back ? 1 : 0].specular, lightprod); - shader_state_lightprod_set_specular_ptr(set, back, index, &lightprod); + vec4 lightprod; + vec4_mult(this->data.state.light[index].specular, + this->data.state.material[back ? 1 : 0].specular, lightprod); + state_lightprod_set_specular(back, index, lightprod); } } -inline void shader_state_material_set_emission(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w) { - if (!set) +void shader_set_data::state_material_set_emission(bool back, float_t x, float_t y, float_t z, float_t w) { + if (!this) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.material[back ? 1 : 0].emission, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.material[back ? 1 : 0].emission, &data, sizeof(vec4))) return; - set->data.state.material[back ? 1 : 0].emission = data; - set->data.state_update_data = true; + this->data.state.material[back ? 1 : 0].emission = data; + this->data.state_update_data = true; } -inline void shader_state_material_set_emission_ptr(shader_set_data* set, - bool back, const vec4* data) { - if (!set || !data) +void shader_set_data::state_material_set_emission(bool back, const vec4& data) { + if (!this) return; - if (!memcmp(&set->data.state.material[back ? 1 : 0].emission, data, sizeof(vec4))) + if (!memcmp(&this->data.state.material[back ? 1 : 0].emission, &data, sizeof(vec4))) return; - set->data.state.material[back ? 1 : 0].emission = *data; - set->data.state_update_data = true; + this->data.state.material[back ? 1 : 0].emission = data; + this->data.state_update_data = true; } -inline void shader_state_material_set_shininess(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w) { - if (!set) +void shader_set_data::state_material_set_shininess(bool back, float_t x, float_t y, float_t z, float_t w) { + if (!this) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.material[back ? 1 : 0].shininess, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.material[back ? 1 : 0].shininess, &data, sizeof(vec4))) return; - set->data.state.material[back ? 1 : 0].shininess = data; - set->data.state_update_data = true; + this->data.state.material[back ? 1 : 0].shininess = data; + this->data.state_update_data = true; } -inline void shader_state_material_set_shininess_ptr(shader_set_data* set, - bool back, const vec4* data) { - if (!set || !data) +void shader_set_data::state_material_set_shininess(bool back, const vec4& data) { + if (!this) return; - if (!memcmp(&set->data.state.material[back ? 1 : 0].shininess, data, sizeof(vec4))) + if (!memcmp(&this->data.state.material[back ? 1 : 0].shininess, &data, sizeof(vec4))) return; - set->data.state.material[back ? 1 : 0].shininess = *data; - set->data.state_update_data = true; + this->data.state.material[back ? 1 : 0].shininess = data; + this->data.state_update_data = true; } -inline void shader_state_matrix_set_modelview(shader_set_data* set, - size_t index, const mat4* data, bool mult) { - if (!set || index >= SHADER_MAX_VERTEX_UNITS || !data) +void shader_set_data::state_matrix_set_modelview(size_t index, const mat4& data, bool mult) { + if (!this || index >= SHADER_MAX_VERTEX_UNITS) return; - if (memcmp(&set->data.state_matrix.modelview[index].mat, data, sizeof(mat4))) { + if (memcmp(&this->data.state_matrix.modelview[index].mat, &data, sizeof(mat4))) { mat4 mat; mat4 mat_inv; mat4 mat_trans; mat4 mat_invtrans; - mat = *data; + mat = data; mat4_inverse(&mat, &mat_inv); mat4_transpose(&mat, &mat_trans); mat4_transpose(&mat_inv, &mat_invtrans); - set->data.state_matrix.modelview[index].mat = mat; - set->data.state_matrix.modelview[index].inv = mat_inv; - set->data.state_matrix.modelview[index].trans = mat_trans; - set->data.state_matrix.modelview[index].invtrans = mat_invtrans; - set->data.state_matrix_update_data = true; + this->data.state_matrix.modelview[index].mat = mat; + this->data.state_matrix.modelview[index].inv = mat_inv; + this->data.state_matrix.modelview[index].trans = mat_trans; + this->data.state_matrix.modelview[index].invtrans = mat_invtrans; + this->data.state_matrix_update_data = true; } if (mult && index == 0) { mat4 mat; - mat4_mult(&set->data.state_matrix.modelview[0].mat, - &set->data.state_matrix.projection.mat, &mat); - shader_state_matrix_set_mvp(set, &mat); + mat4_mult(&this->data.state_matrix.modelview[0].mat, + &this->data.state_matrix.projection.mat, &mat); + state_matrix_set_mvp(mat); } } -inline void shader_state_matrix_set_projection(shader_set_data* set, - const mat4* data, bool mult) { - if (!set || !data) +void shader_set_data::state_matrix_set_projection(const mat4& data, bool mult) { + if (!this) return; - if (memcmp(&set->data.state_matrix.projection.mat, data, sizeof(mat4))) { + if (memcmp(&this->data.state_matrix.projection.mat, &data, sizeof(mat4))) { mat4 mat; mat4 mat_inv; mat4 mat_trans; mat4 mat_invtrans; - mat = *data; + mat = data; mat4_inverse(&mat, &mat_inv); mat4_transpose(&mat, &mat_trans); mat4_transpose(&mat_inv, &mat_invtrans); - set->data.state_matrix.projection.mat = mat; - set->data.state_matrix.projection.inv = mat_inv; - set->data.state_matrix.projection.trans = mat_trans; - set->data.state_matrix.projection.invtrans = mat_invtrans; - set->data.state_matrix_update_data = true; + this->data.state_matrix.projection.mat = mat; + this->data.state_matrix.projection.inv = mat_inv; + this->data.state_matrix.projection.trans = mat_trans; + this->data.state_matrix.projection.invtrans = mat_invtrans; + this->data.state_matrix_update_data = true; } if (mult) { mat4 mat; - mat4_mult(&set->data.state_matrix.modelview[0].mat, - &set->data.state_matrix.projection.mat, &mat); - shader_state_matrix_set_mvp(set, &mat); + mat4_mult(&this->data.state_matrix.modelview[0].mat, + &this->data.state_matrix.projection.mat, &mat); + state_matrix_set_mvp(mat); } } -inline void shader_state_matrix_set_mvp(shader_set_data* set, - const mat4* data) { - if (!set || !data) +void shader_set_data::state_matrix_set_mvp(const mat4& data) { + if (!this ) return; - if (!memcmp(&set->data.state_matrix.mvp.mat, data, sizeof(mat4))) + if (!memcmp(&this->data.state_matrix.mvp.mat, &data, sizeof(mat4))) return; mat4 mat; @@ -1807,38 +1678,35 @@ inline void shader_state_matrix_set_mvp(shader_set_data* set, mat4 mat_trans; mat4 mat_invtrans; - mat = *data; + mat = data; mat4_inverse(&mat, &mat_inv); mat4_transpose(&mat, &mat_trans); mat4_transpose(&mat_inv, &mat_invtrans); - set->data.state_matrix.mvp.mat = mat; - set->data.state_matrix.mvp.inv = mat_inv; - set->data.state_matrix.mvp.trans = mat_trans; - set->data.state_matrix.mvp.invtrans = mat_invtrans; - set->data.state_matrix_update_data = true; + this->data.state_matrix.mvp.mat = mat; + this->data.state_matrix.mvp.inv = mat_inv; + this->data.state_matrix.mvp.trans = mat_trans; + this->data.state_matrix.mvp.invtrans = mat_invtrans; + this->data.state_matrix_update_data = true; } -inline void shader_state_matrix_set_modelview_separate(shader_set_data* set, - size_t index, const mat4* model, const mat4* view, bool mult) { +void shader_set_data::state_matrix_set_modelview(size_t index, const mat4& model, const mat4& view, bool mult) { mat4 mv; - mat4_mult(model, view, &mv); - shader_state_matrix_set_modelview(set, index, &mv, true); + mat4_mult(&model, &view, &mv); + state_matrix_set_modelview(index, mv, true); } -inline void shader_state_matrix_set_mvp_separate(shader_set_data* set, - const mat4* model, const mat4* view, const mat4* projection) { +void shader_set_data::state_matrix_set_mvp(const mat4& model, const mat4& view, const mat4& projection) { mat4 mv; - mat4_mult(model, view, &mv); - shader_state_matrix_set_modelview(set, 0, &mv, false); - shader_state_matrix_set_projection(set, projection, true); + mat4_mult(&model, &view, &mv); + state_matrix_set_modelview(0, mv, false); + state_matrix_set_projection(projection, true); } -inline void shader_state_matrix_set_texture(shader_set_data* set, - size_t index, const mat4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_COORDS || !data) +void shader_set_data::state_matrix_set_texture(size_t index, const mat4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_COORDS) return; - if (!memcmp(&set->data.state_matrix.texture[index].mat, data, sizeof(mat4))) + if (!memcmp(&this->data.state_matrix.texture[index].mat, &data, sizeof(mat4))) return; mat4 mat; @@ -1846,23 +1714,22 @@ inline void shader_state_matrix_set_texture(shader_set_data* set, mat4 mat_trans; mat4 mat_invtrans; - mat = *data; + mat = data; mat4_inverse(&mat, &mat_inv); mat4_transpose(&mat, &mat_trans); mat4_transpose(&mat_inv, &mat_invtrans); - set->data.state_matrix.texture[index].mat = mat; - set->data.state_matrix.texture[index].inv = mat_inv; - set->data.state_matrix.texture[index].trans = mat_trans; - set->data.state_matrix.texture[index].invtrans = mat_invtrans; - set->data.state_matrix_update_data = true; + this->data.state_matrix.texture[index].mat = mat; + this->data.state_matrix.texture[index].inv = mat_inv; + this->data.state_matrix.texture[index].trans = mat_trans; + this->data.state_matrix.texture[index].invtrans = mat_invtrans; + this->data.state_matrix_update_data = true; } -inline void shader_state_matrix_set_palette(shader_set_data* set, - size_t index, const mat4* data) { - if (!set || index >= SHADER_MAX_PALETTE_MATRICES || !data) +void shader_set_data::state_matrix_set_palette(size_t index, const mat4& data) { + if (!this || index >= SHADER_MAX_PALETTE_MATRICES) return; - if (!memcmp(&set->data.state_matrix.palette[index].mat, data, sizeof(mat4))) + if (!memcmp(&this->data.state_matrix.palette[index].mat, &data, sizeof(mat4))) return; mat4 mat; @@ -1870,23 +1737,22 @@ inline void shader_state_matrix_set_palette(shader_set_data* set, mat4 mat_trans; mat4 mat_invtrans; - mat = *data; + mat = data; mat4_inverse(&mat, &mat_inv); mat4_transpose(&mat, &mat_trans); mat4_transpose(&mat_inv, &mat_invtrans); - set->data.state_matrix.palette[index].mat = mat; - set->data.state_matrix.palette[index].inv = mat_inv; - set->data.state_matrix.palette[index].trans = mat_trans; - set->data.state_matrix.palette[index].invtrans = mat_invtrans; - set->data.state_matrix_update_data = true; + this->data.state_matrix.palette[index].mat = mat; + this->data.state_matrix.palette[index].inv = mat_inv; + this->data.state_matrix.palette[index].trans = mat_trans; + this->data.state_matrix.palette[index].invtrans = mat_invtrans; + this->data.state_matrix_update_data = true; } -inline void shader_state_matrix_set_program(shader_set_data* set, - size_t index, const mat4* data) { - if (!set || index >= SHADER_MAX_PROGRAM_MATRICES || !data) +void shader_set_data::state_matrix_set_program(size_t index, const mat4& data) { + if (!this || index >= SHADER_MAX_PROGRAM_MATRICES) return; - if (!memcmp(&set->data.state_matrix.program[index].mat, data, sizeof(mat4))) + if (!memcmp(&this->data.state_matrix.program[index].mat, &data, sizeof(mat4))) return; mat4 mat; @@ -1894,290 +1760,268 @@ inline void shader_state_matrix_set_program(shader_set_data* set, mat4 mat_trans; mat4 mat_invtrans; - mat = *data; + mat = data; mat4_inverse(&mat, &mat_inv); mat4_transpose(&mat, &mat_trans); mat4_transpose(&mat_inv, &mat_invtrans); - set->data.state_matrix.program[index].mat = mat; - set->data.state_matrix.program[index].inv = mat_inv; - set->data.state_matrix.program[index].trans = mat_trans; - set->data.state_matrix.program[index].invtrans = mat_invtrans; - set->data.state_matrix_update_data = true; + this->data.state_matrix.program[index].mat = mat; + this->data.state_matrix.program[index].inv = mat_inv; + this->data.state_matrix.program[index].trans = mat_trans; + this->data.state_matrix.program[index].invtrans = mat_invtrans; + this->data.state_matrix_update_data = true; } -inline void shader_state_point_set_size(shader_set_data* set, - float_t x, float_t y, float_t z, float_t w) { - if (!set) +void shader_set_data::state_point_set_size(float_t x, float_t y, float_t z, float_t w) { + if (!this) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.point.size, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.point.size, &data, sizeof(vec4))) return; - set->data.state.point.size = data; - set->data.state_update_data = true; + this->data.state.point.size = data; + this->data.state_update_data = true; } -inline void shader_state_point_set_size_ptr(shader_set_data* set, - const vec4* data) { - if (!set || !data) +void shader_set_data::state_point_set_size(const vec4& data) { + if (!this) return; - if (!memcmp(&set->data.state.point.size, data, sizeof(vec4))) + if (!memcmp(&this->data.state.point.size, &data, sizeof(vec4))) return; - set->data.state.point.size = *data; - set->data.state_update_data = true; + this->data.state.point.size = data; + this->data.state_update_data = true; } -inline void shader_state_point_set_attenuation(shader_set_data* set, - float_t x, float_t y, float_t z, float_t w) { - if (!set) +void shader_set_data::state_point_set_attenuation(float_t x, float_t y, float_t z, float_t w) { + if (!this) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.point.attenuation, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.point.attenuation, &data, sizeof(vec4))) return; - set->data.state.point.attenuation = data; - set->data.state_update_data = true; + this->data.state.point.attenuation = data; + this->data.state_update_data = true; } -inline void shader_state_point_set_attenuation_ptr(shader_set_data* set, - const vec4* data) { - if (!set || !data) +void shader_set_data::state_point_set_attenuation(const vec4& data) { + if (!this) return; - if (!memcmp(&set->data.state.point.attenuation, data, sizeof(vec4))) + if (!memcmp(&this->data.state.point.attenuation, &data, sizeof(vec4))) return; - set->data.state.point.attenuation = *data; - set->data.state_update_data = true; + this->data.state.point.attenuation = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_eye_s(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS) +void shader_set_data::state_texgen_set_eye_s(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.texgen[index].eye_s, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].eye_s, &data, sizeof(vec4))) return; - set->data.state.texgen[index].eye_s = data; - set->data.state_update_data = true; + this->data.state.texgen[index].eye_s = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_eye_s_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_set_eye_s(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - if (!memcmp(&set->data.state.texgen[index].eye_s, data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].eye_s, &data, sizeof(vec4))) return; - set->data.state.texgen[index].eye_s = *data; - set->data.state_update_data = true; + this->data.state.texgen[index].eye_s = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_eye_t(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS) +void shader_set_data::state_texgen_set_eye_t(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.texgen[index].eye_t, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].eye_t, &data, sizeof(vec4))) return; - set->data.state.texgen[index].eye_t = data; - set->data.state_update_data = true; + this->data.state.texgen[index].eye_t = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_eye_t_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_set_eye_t(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - if (!memcmp(&set->data.state.texgen[index].eye_t, data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].eye_t, &data, sizeof(vec4))) return; - set->data.state.texgen[index].eye_t = *data; - set->data.state_update_data = true; + this->data.state.texgen[index].eye_t = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_eye_r(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS) +void shader_set_data::state_texgen_set_eye_r(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.texgen[index].eye_r, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].eye_r, &data, sizeof(vec4))) return; - set->data.state.texgen[index].eye_r = data; - set->data.state_update_data = true; + this->data.state.texgen[index].eye_r = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_eye_r_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_set_eye_r(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - if (!memcmp(&set->data.state.texgen[index].eye_r, data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].eye_r, &data, sizeof(vec4))) return; - set->data.state.texgen[index].eye_r = *data; - set->data.state_update_data = true; + this->data.state.texgen[index].eye_r = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_eye_q(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS) +void shader_set_data::state_texgen_set_eye_q(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.texgen[index].eye_q, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].eye_q, &data, sizeof(vec4))) return; - set->data.state.texgen[index].eye_q = data; - set->data.state_update_data = true; + this->data.state.texgen[index].eye_q = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_eye_q_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_set_eye_q(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - if (!memcmp(&set->data.state.texgen[index].eye_q, data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].eye_q, &data, sizeof(vec4))) return; - set->data.state.texgen[index].eye_q = *data; - set->data.state_update_data = true; + this->data.state.texgen[index].eye_q = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_object_s(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS) +void shader_set_data::state_texgen_set_object_s(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.texgen[index].object_s, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].object_s, &data, sizeof(vec4))) return; - set->data.state.texgen[index].object_s = data; - set->data.state_update_data = true; + this->data.state.texgen[index].object_s = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_object_s_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_set_object_s(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - if (!memcmp(&set->data.state.texgen[index].object_s, data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].object_s, &data, sizeof(vec4))) return; - set->data.state.texgen[index].object_s = *data; - set->data.state_update_data = true; + this->data.state.texgen[index].object_s = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_object_t(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS) +void shader_set_data::state_texgen_set_object_t(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.texgen[index].object_t, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].object_t, &data, sizeof(vec4))) return; - set->data.state.texgen[index].object_t = data; - set->data.state_update_data = true; + this->data.state.texgen[index].object_t = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_object_t_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_set_object_t(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - if (!memcmp(&set->data.state.texgen[index].object_t, data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].object_t, &data, sizeof(vec4))) return; - set->data.state.texgen[index].object_t = *data; - set->data.state_update_data = true; + this->data.state.texgen[index].object_t = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_object_r(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS) +void shader_set_data::state_texgen_set_object_r(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.texgen[index].object_r, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].object_r, &data, sizeof(vec4))) return; - set->data.state.texgen[index].object_r = data; - set->data.state_update_data = true; + this->data.state.texgen[index].object_r = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_object_r_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_set_object_r(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - if (!memcmp(&set->data.state.texgen[index].object_r, data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].object_r, &data, sizeof(vec4))) return; - set->data.state.texgen[index].object_r = *data; - set->data.state_update_data = true; + this->data.state.texgen[index].object_r = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_object_q(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS) +void shader_set_data::state_texgen_set_object_q(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.texgen[index].object_q, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].object_q, &data, sizeof(vec4))) return; - set->data.state.texgen[index].object_q = data; - set->data.state_update_data = true; + this->data.state.texgen[index].object_q = data; + this->data.state_update_data = true; } -inline void shader_state_texgen_set_object_q_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texgen_set_object_q(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - if (!memcmp(&set->data.state.texgen[index].object_q, data, sizeof(vec4))) + if (!memcmp(&this->data.state.texgen[index].object_q, &data, sizeof(vec4))) return; - set->data.state.texgen[index].object_q = *data; - set->data.state_update_data = true; + this->data.state.texgen[index].object_q = data; + this->data.state_update_data = true; } -inline void shader_state_texenv_set_color(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS) +void shader_set_data::state_texenv_set_color(size_t index, float_t x, float_t y, float_t z, float_t w) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; vec4 data = { x, y, z, w }; - if (!memcmp(&set->data.state.texenv[index].color, &data, sizeof(vec4))) + if (!memcmp(&this->data.state.texenv[index].color, &data, sizeof(vec4))) return; - set->data.state.texenv[index].color = data; - set->data.state_update_data = true; + this->data.state.texenv[index].color = data; + this->data.state_update_data = true; } -inline void shader_state_texenv_set_color_ptr(shader_set_data* set, - size_t index, const vec4* data) { - if (!set || index >= SHADER_MAX_TEXTURE_UNITS || !data) +void shader_set_data::state_texenv_set_color(size_t index, const vec4& data) { + if (!this || index >= SHADER_MAX_TEXTURE_UNITS) return; - if (!memcmp(&set->data.state.texenv[index].color, data, sizeof(vec4))) + if (!memcmp(&this->data.state.texenv[index].color, &data, sizeof(vec4))) return; - set->data.state.texenv[index].color = *data; - set->data.state_update_data = true; + this->data.state.texenv[index].color = data; + this->data.state_update_data = true; } static GLuint shader_compile_shader(GLenum type, const char* data, const char* file) { @@ -2218,9 +2062,8 @@ static GLuint shader_compile_shader(GLenum type, const char* data, const char* f buf[sizeof(buf) / sizeof(wchar_t) - 1] = 0; stream s; - io_open(&s, buf, L"wb"); - io_write(&s, data, utf8_length(data)); - io_free(&s); + s.open(buf, L"wb"); + s.write(data, utf8_length(data)); } #endif return 0; diff --git a/src/CRE/shader.h b/src/CRE/shader.h index 4b46f127..aaa4f603 100644 --- a/src/CRE/shader.h +++ b/src/CRE/shader.h @@ -7,10 +7,10 @@ #include #include -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "../KKdLib/farc.hpp" -#include "../KKdLib/mat.h" -#include "../KKdLib/vec.h" +#include "../KKdLib/mat.hpp" +#include "../KKdLib/vec.hpp" #include "static_var.h" #define SHADER_MAX_CLIP_PLANES 8 @@ -155,14 +155,9 @@ struct shader_data { }; struct shader; +struct shader_set_data; -struct shader_set_data { - shader* shaders; - size_t size; - shader_data data; -}; - -typedef void (* PFNSHADERPERMUTBINDFUNCPROC)(shader_set_data* set, shader* shader); +typedef void (*PFNSHADERPERMUTBINDFUNCPROC)(shader_set_data* set, shader* shad); struct shader_bind_func { uint32_t index; @@ -203,293 +198,163 @@ struct shader { const uniform_name* use_uniform; const bool* use_permut; PFNSHADERPERMUTBINDFUNCPROC bind_func; + + int32_t bind(uint32_t sub_index); + static void unbind(); }; -extern int32_t shader_bind(shader* shader, uint32_t sub_index); -extern void shader_draw_arrays(shader_set_data* set, - GLenum mode, GLint first, GLsizei count); -extern void shader_draw_elements(shader_set_data* set, - GLenum mode, GLsizei count, GLenum type, const void* indices); -extern void shader_draw_range_elements(shader_set_data* set, - GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices); -extern int32_t shader_get_index_by_name(shader_set_data* set, const char* name); -extern void shader_load(shader_set_data* set, farc* f, bool ignore_cache, bool not_load_cache, - const char* name, const shader_table* shaders_table, const size_t size, - const shader_bind_func* bind_func_table, const size_t bind_func_table_size); -extern void shader_free(shader_set_data* set); -extern void shader_set(shader_set_data* set, uint32_t index); -extern void shader_unbind(); +struct shader_set_data { + shader* shaders; + size_t size; + shader_data data; -extern void shader_buffer_get_ptr(shader_set_data* set, - size_t index, vec4* data); -extern void shader_buffer_get_ptr_array(shader_set_data* set, - size_t index, size_t count, vec4* data); -extern void shader_local_frag_get(shader_set_data* set, - size_t index, float_t* x, float_t* y, float_t* z, float_t* w); -extern void shader_local_frag_get_ptr(shader_set_data* set, - size_t index, vec4* data); -extern void shader_local_vert_get(shader_set_data* set, - size_t index, float_t* x, float_t* y, float_t* z, float_t* w); -extern void shader_local_vert_get_ptr(shader_set_data* set, - size_t index, vec4* data); -extern void shader_env_frag_get(shader_set_data* set, - size_t index, float_t* x, float_t* y, float_t* z, float_t* w); -extern void shader_env_frag_get_ptr(shader_set_data* set, - size_t index, vec4* data); -extern void shader_env_frag_get_ptr_array(shader_set_data* set, - size_t index, size_t count, vec4* data); -extern void shader_env_vert_get(shader_set_data* set, - size_t index, float_t* x, float_t* y, float_t* z, float_t* w); -extern void shader_env_vert_get_ptr(shader_set_data* set, - size_t index, vec4* data); -extern void shader_env_vert_get_ptr_array(shader_set_data* set, - size_t index, size_t count, vec4* data); -extern void shader_state_clip_get_plane(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_depth_get_range(shader_set_data* set, - vec4* data); -extern void shader_state_fog_get_color(shader_set_data* set, - vec4* data); -extern void shader_state_fog_get_params(shader_set_data* set, - vec4* data); -extern void shader_state_light_get_ambient(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_light_get_diffuse(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_light_get_specular(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_light_get_position(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_light_get_attenuation(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_light_get_spot_direction(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_light_get_half(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_lightmodel_get_ambient(shader_set_data* set, - bool back, vec4* data); -extern void shader_state_lightmodel_get_scene_color(shader_set_data* set, - bool back, vec4* data); -extern void shader_state_lightprod_get_ambient(shader_set_data* set, - bool back, size_t index, vec4* data); -extern void shader_state_lightprod_get_diffuse(shader_set_data* set, - bool back, size_t index, vec4* data); -extern void shader_state_lightprod_get_specular(shader_set_data* set, - bool back, size_t index, vec4* data); -extern void shader_state_material_get_ambient(shader_set_data* set, - bool back, vec4* data); -extern void shader_state_material_get_diffuse(shader_set_data* set, - bool back, vec4* data); -extern void shader_state_material_get_specular(shader_set_data* set, - bool back, vec4* data); -extern void shader_state_material_get_emission(shader_set_data* set, - bool back, vec4* data); -extern void shader_state_material_get_shininess(shader_set_data* set, - bool back, vec4* data); -extern void shader_state_matrix_get_modelview(shader_set_data* set, - size_t index, mat4* data); -extern void shader_state_matrix_get_projection(shader_set_data* set, - mat4* data); -extern void shader_state_matrix_get_mvp(shader_set_data* set, - mat4* data); -extern void shader_state_matrix_get_texture(shader_set_data* set, - size_t index, mat4* data); -extern void shader_state_matrix_get_palette(shader_set_data* set, - size_t index, mat4* data); -extern void shader_state_matrix_get_program(shader_set_data* set, - size_t index, mat4* data); -extern void shader_state_point_get_size(shader_set_data* set, - vec4* data); -extern void shader_state_point_get_attenuation(shader_set_data* set, - vec4* data); -extern void shader_state_texgen_get_eye_s(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_texgen_get_eye_t(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_texgen_get_eye_r(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_texgen_get_eye_q(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_texgen_get_object_s(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_texgen_get_object_t(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_texgen_get_object_r(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_texgen_get_object_q(shader_set_data* set, - size_t index, vec4* data); -extern void shader_state_texenv_get_color(shader_set_data* set, - size_t index, vec4* data); + void draw_arrays(GLenum mode, GLint first, GLsizei count); + void draw_elements(GLenum mode, + GLsizei count, GLenum type, const void* indices); + void draw_range_elements(GLenum mode, + GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices); + int32_t get_index_by_name(const char* name); + void load(farc* f, bool ignore_cache, bool not_load_cache, + const char* name, const shader_table* shaders_table, const size_t size, + const shader_bind_func* bind_func_table, const size_t bind_func_table_size); + void set(uint32_t index); + void unload(); -extern void shader_buffer_set_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_buffer_set_ptr_array(shader_set_data* set, - size_t index, size_t count, const vec4* data); -extern void shader_local_frag_set(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_local_frag_set_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_local_frag_set_ptr_array(shader_set_data* set, - size_t index, size_t count, const vec4* data); -extern void shader_local_vert_set(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_local_vert_set_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_local_vert_set_ptr_array(shader_set_data* set, - size_t index, size_t count, const vec4* data); -extern void shader_env_frag_set(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_env_frag_set_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_env_frag_set_ptr_array(shader_set_data* set, - size_t index, size_t count, const vec4* data); -extern void shader_env_vert_set(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_env_vert_set_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_env_vert_set_ptr_array(shader_set_data* set, - size_t index, size_t count, const vec4* data); -extern void shader_state_clip_set_plane(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_clip_set_plane_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_depth_set_range(shader_set_data* set, - float_t x, float_t y, float_t z, float_t w); -extern void shader_state_depth_set_range_ptr(shader_set_data* set, - const vec4* data); -extern void shader_state_fog_set_color(shader_set_data* set, - float_t x, float_t y, float_t z, float_t w); -extern void shader_state_fog_set_color_ptr(shader_set_data* set, - const vec4* data); -extern void shader_state_fog_set_params(shader_set_data* set, - float_t x, float_t y, float_t z, float_t w); -extern void shader_state_fog_set_params_ptr(shader_set_data* set, - const vec4* data); -extern void shader_state_light_set_ambient(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_light_set_ambient_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_light_set_diffuse(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_light_set_diffuse_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_light_set_specular(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_light_set_specular_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_light_set_position(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_light_set_position_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_light_set_attenuation(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_light_set_attenuation_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_light_set_spot_direction(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_light_set_spot_direction_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_light_set_half(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_light_set_half_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_lightmodel_set_ambient(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_lightmodel_set_ambient_ptr(shader_set_data* set, - bool back, const vec4* data); -extern void shader_state_lightmodel_set_scene_color(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_lightmodel_set_scene_color_ptr(shader_set_data* set, - bool back, const vec4* data); -extern void shader_state_lightprod_set_ambient(shader_set_data* set, - bool back, size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_lightprod_set_ambient_ptr(shader_set_data* set, - bool back, size_t index, const vec4* data); -extern void shader_state_lightprod_set_diffuse(shader_set_data* set, - bool back, size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_lightprod_set_diffuse_ptr(shader_set_data* set, - bool back, size_t index, const vec4* data); -extern void shader_state_lightprod_set_specular(shader_set_data* set, - bool back, size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_lightprod_set_specular_ptr(shader_set_data* set, - bool back, size_t index, const vec4* data); -extern void shader_state_material_set_ambient(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_material_set_ambient_ptr(shader_set_data* set, - bool back, const vec4* data); -extern void shader_state_material_set_diffuse(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_material_set_diffuse_ptr(shader_set_data* set, - bool back, const vec4* data); -extern void shader_state_material_set_specular(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_material_set_specular_ptr(shader_set_data* set, - bool back, const vec4* data); -extern void shader_state_material_set_emission(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_material_set_emission_ptr(shader_set_data* set, - bool back, const vec4* data); -extern void shader_state_material_set_shininess(shader_set_data* set, - bool back, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_material_set_shininess_ptr(shader_set_data* set, - bool back, const vec4* data); -extern void shader_state_matrix_set_modelview(shader_set_data* set, - size_t index, const mat4* data, bool mult); -extern void shader_state_matrix_set_projection(shader_set_data* set, - const mat4* data, bool mult); -extern void shader_state_matrix_set_mvp(shader_set_data* set, - const mat4* data); -extern void shader_state_matrix_set_modelview_separate(shader_set_data* set, - size_t index, const mat4* model, const mat4* view, bool mult); -extern void shader_state_matrix_set_mvp_separate(shader_set_data* set, - const mat4* model, const mat4* view, const mat4* projection); -extern void shader_state_matrix_set_texture(shader_set_data* set, - size_t index, const mat4* data); -extern void shader_state_matrix_set_palette(shader_set_data* set, - size_t index, const mat4* data); -extern void shader_state_matrix_set_program(shader_set_data* set, - size_t index, const mat4* data); -extern void shader_state_point_set_size(shader_set_data* set, - float_t x, float_t y, float_t z, float_t w); -extern void shader_state_point_set_size_ptr(shader_set_data* set, - const vec4* data); -extern void shader_state_point_set_attenuation(shader_set_data* set, - float_t x, float_t y, float_t z, float_t w); -extern void shader_state_point_set_attenuation_ptr(shader_set_data* set, - const vec4* data); -extern void shader_state_texgen_set_eye_s(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_texgen_set_eye_s_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_texgen_set_eye_t(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_texgen_set_eye_t_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_texgen_set_eye_r(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_texgen_set_eye_r_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_texgen_set_eye_q(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_texgen_set_eye_q_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_texgen_set_object_s(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_texgen_set_object_s_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_texgen_set_object_t(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_texgen_set_object_t_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_texgen_set_object_r(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_texgen_set_object_r_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_texgen_set_object_q(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_texgen_set_object_q_ptr(shader_set_data* set, - size_t index, const vec4* data); -extern void shader_state_texenv_set_color(shader_set_data* set, - size_t index, float_t x, float_t y, float_t z, float_t w); -extern void shader_state_texenv_set_color_ptr(shader_set_data* set, - size_t index, const vec4* data); \ No newline at end of file + void buffer_get(size_t index, vec4& data); + void buffer_get(size_t index, size_t count, vec4* data); + void local_frag_get(size_t index, float_t* x, float_t* y, float_t* z, float_t* w); + void local_frag_get(size_t index, vec4& data); + void local_vert_get(size_t index, float_t* x, float_t* y, float_t* z, float_t* w); + void local_vert_get(size_t index, vec4& data); + void env_frag_get(size_t index, float_t* x, float_t* y, float_t* z, float_t* w); + void env_frag_get(size_t index, vec4& data); + void env_frag_get(size_t index, size_t count, vec4* data); + void env_vert_get(size_t index, float_t* x, float_t* y, float_t* z, float_t* w); + void env_vert_get(size_t index, vec4& data); + void env_vert_get(size_t index, size_t count, vec4* data); + void state_clip_get_plane(size_t index, vec4& data); + void state_depth_get_range(vec4& data); + void state_fog_get_color(vec4& data); + void state_fog_get_params(vec4& data); + void state_light_get_ambient(size_t index, vec4& data); + void state_light_get_diffuse(size_t index, vec4& data); + void state_light_get_specular(size_t index, vec4& data); + void state_light_get_position(size_t index, vec4& data); + void state_light_get_attenuation(size_t index, vec4& data); + void state_light_get_spot_direction(size_t index, vec4& data); + void state_light_get_half(size_t index, vec4& data); + void state_lightmodel_get_ambient(bool back, vec4& data); + void state_lightmodel_get_scene_color(bool back, vec4& data); + void state_lightprod_get_ambient(bool back, size_t index, vec4& data); + void state_lightprod_get_diffuse(bool back, size_t index, vec4& data); + void state_lightprod_get_specular(bool back, size_t index, vec4& data); + void state_material_get_ambient(bool back, vec4& data); + void state_material_get_diffuse(bool back, vec4& data); + void state_material_get_specular(bool back, vec4& data); + void state_material_get_emission(bool back, vec4& data); + void state_material_get_shininess(bool back, vec4& data); + void state_matrix_get_modelview(size_t index, mat4& data); + void state_matrix_get_projection(mat4& data); + void state_matrix_get_mvp(mat4& data); + void state_matrix_get_texture(size_t index, mat4& data); + void state_matrix_get_palette(size_t index, mat4& data); + void state_matrix_get_program(size_t index, mat4& data); + void state_point_get_size(vec4& data); + void state_point_get_attenuation(vec4& data); + void state_texgen_get_eye_s(size_t index, vec4& data); + void state_texgen_get_eye_t(size_t index, vec4& data); + void state_texgen_get_eye_r(size_t index, vec4& data); + void state_texgen_get_eye_q(size_t index, vec4& data); + void state_texgen_get_object_s(size_t index, vec4& data); + void state_texgen_get_object_t(size_t index, vec4& data); + void state_texgen_get_object_r(size_t index, vec4& data); + void state_texgen_get_object_q(size_t index, vec4& data); + void state_texenv_get_color(size_t index, vec4& data); + + void buffer_set(size_t index, const vec4& data); + void buffer_set(size_t index, size_t count, const vec4* data); + void local_frag_set(size_t index, float_t x, float_t y, float_t z, float_t w); + void local_frag_set(size_t index, const vec4& data); + void local_frag_set(size_t index, size_t count, const vec4* data); + void local_vert_set(size_t index, float_t x, float_t y, float_t z, float_t w); + void local_vert_set(size_t index, const vec4& data); + void local_vert_set(size_t index, size_t count, const vec4* data); + void env_frag_set(size_t index, float_t x, float_t y, float_t z, float_t w); + void env_frag_set(size_t index, const vec4& data); + void env_frag_set(size_t index, size_t count, const vec4* data); + void env_vert_set(size_t index, float_t x, float_t y, float_t z, float_t w); + void env_vert_set(size_t index, const vec4& data); + void env_vert_set(size_t index, size_t count, const vec4* data); + void state_clip_set_plane(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_clip_set_plane(size_t index, const vec4& data); + void state_depth_set_range(float_t x, float_t y, float_t z, float_t w); + void state_depth_set_range(const vec4& data); + void state_fog_set_color(float_t x, float_t y, float_t z, float_t w); + void state_fog_set_color(const vec4& data); + void state_fog_set_params(float_t x, float_t y, float_t z, float_t w); + void state_fog_set_params(const vec4& data); + void state_light_set_ambient(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_light_set_ambient(size_t index, const vec4& data); + void state_light_set_diffuse(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_light_set_diffuse(size_t index, const vec4& data); + void state_light_set_specular(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_light_set_specular(size_t index, const vec4& data); + void state_light_set_position(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_light_set_position(size_t index, const vec4& data); + void state_light_set_attenuation(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_light_set_attenuation(size_t index, const vec4& data); + void state_light_set_spot_direction(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_light_set_spot_direction(size_t index, const vec4& data); + void state_light_set_half(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_light_set_half(size_t index, const vec4& data); + void state_lightmodel_set_ambient(bool back, float_t x, float_t y, float_t z, float_t w); + void state_lightmodel_set_ambient(bool back, const vec4& data); + void state_lightmodel_set_scene_color(bool back, float_t x, float_t y, float_t z, float_t w); + void state_lightmodel_set_scene_color(bool back, const vec4& data); + void state_lightprod_set_ambient(bool back, size_t index, float_t x, float_t y, float_t z, float_t w); + void state_lightprod_set_ambient(bool back, size_t index, const vec4& data); + void state_lightprod_set_diffuse(bool back, size_t index, float_t x, float_t y, float_t z, float_t w); + void state_lightprod_set_diffuse(bool back, size_t index, const vec4& data); + void state_lightprod_set_specular(bool back, size_t index, float_t x, float_t y, float_t z, float_t w); + void state_lightprod_set_specular(bool back, size_t index, const vec4& data); + void state_material_set_ambient(bool back, float_t x, float_t y, float_t z, float_t w); + void state_material_set_ambient(bool back, const vec4& data); + void state_material_set_diffuse(bool back, float_t x, float_t y, float_t z, float_t w); + void state_material_set_diffuse(bool back, const vec4& data); + void state_material_set_specular(bool back, float_t x, float_t y, float_t z, float_t w); + void state_material_set_specular(bool back, const vec4& data); + void state_material_set_emission(bool back, float_t x, float_t y, float_t z, float_t w); + void state_material_set_emission(bool back, const vec4& data); + void state_material_set_shininess(bool back, float_t x, float_t y, float_t z, float_t w); + void state_material_set_shininess(bool back, const vec4& data); + void state_matrix_set_modelview(size_t index, const mat4& data, bool mult); + void state_matrix_set_projection(const mat4& data, bool mult); + void state_matrix_set_mvp(const mat4& data); + void state_matrix_set_modelview(size_t index, const mat4& model, const mat4& view, bool mult); + void state_matrix_set_mvp(const mat4& model, const mat4& view, const mat4& projection); + void state_matrix_set_texture(size_t index, const mat4& data); + void state_matrix_set_palette(size_t index, const mat4& data); + void state_matrix_set_program(size_t index, const mat4& data); + void state_point_set_size(float_t x, float_t y, float_t z, float_t w); + void state_point_set_size(const vec4& data); + void state_point_set_attenuation(float_t x, float_t y, float_t z, float_t w); + void state_point_set_attenuation(const vec4& data); + void state_texgen_set_eye_s(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_texgen_set_eye_s(size_t index, const vec4& data); + void state_texgen_set_eye_t(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_texgen_set_eye_t(size_t index, const vec4& data); + void state_texgen_set_eye_r(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_texgen_set_eye_r(size_t index, const vec4& data); + void state_texgen_set_eye_q(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_texgen_set_eye_q(size_t index, const vec4& data); + void state_texgen_set_object_s(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_texgen_set_object_s(size_t index, const vec4& data); + void state_texgen_set_object_t(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_texgen_set_object_t(size_t index, const vec4& data); + void state_texgen_set_object_r(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_texgen_set_object_r(size_t index, const vec4& data); + void state_texgen_set_object_q(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_texgen_set_object_q(size_t index, const vec4& data); + void state_texenv_set_color(size_t index, float_t x, float_t y, float_t z, float_t w); + void state_texenv_set_color(size_t index, const vec4& data); +}; diff --git a/src/CRE/shader_ft.c b/src/CRE/shader_ft.c index 8120fb7e..3d9b1776 100644 --- a/src/CRE/shader_ft.c +++ b/src/CRE/shader_ft.c @@ -2283,8 +2283,8 @@ static void shader_bind_blinn(shader_set_data* set, shader* shad); static void shader_bind_cloth(shader_set_data* set, shader* shad); static void shader_bind_hair(shader_set_data* set, shader* shad); static void shader_bind_membrane(shader_set_data* set, shader* shad); -static void shader_bind_eye_ball(shader_set_data* set, shader* shader); -static void shader_bind_tone_map(shader_set_data* set, shader* shader); +static void shader_bind_eye_ball(shader_set_data* set, shader* shad); +static void shader_bind_tone_map(shader_set_data* set, shader* shad); static const shader_bind_func shader_ft_bind_func_table[] = { { @@ -2348,7 +2348,7 @@ glass_eye_struct glass_eye = { }; void shader_ft_load(shader_set_data* set, farc* f, bool ignore_cache) { - shader_load(set, f, false, false, "ft", shader_ft_table, shader_ft_table_size, + set->load(f, false, false, "ft", shader_ft_table, shader_ft_table_size, shader_ft_bind_func_table, shader_ft_bind_func_table_size); } @@ -2389,82 +2389,82 @@ static void glass_eye_set(glass_eye_struct* glass_eye, shader_set_data* set) { vec3_mult(glass_eye->field_68, glass_eye->field_68, *(vec3*)&temp); temp.w = temp.z; vec3_div(vec3_identity, *(vec3*)&temp, *(vec3*)&temp); - shader_local_vert_set_ptr(set, 0x0A, &temp); - shader_local_frag_set_ptr(set, 0x0A, &temp); + set->local_vert_set(0x0A, temp); + set->local_frag_set(0x0A, temp); *(vec3*)&temp = glass_eye->field_68; temp.w = 1.0f; - shader_local_vert_set_ptr(set, 0x0B, &temp); - shader_local_frag_set_ptr(set, 0x0B, &temp); + set->local_vert_set(0x0B, temp); + set->local_frag_set(0x0B, temp); temp = glass_eye->field_0; - shader_local_vert_set_ptr(set, 0x0C, &temp); + set->local_vert_set(0x0C, temp); temp = glass_eye->field_A0; - shader_local_vert_set_ptr(set, 0x0D, &temp); + set->local_vert_set(0x0D, temp); vec3_mult(glass_eye->field_90, glass_eye->field_90, *(vec3*)&temp); temp.w = temp.z; vec3_div(vec3_identity, *(vec3*)&temp, *(vec3*)&temp); - shader_local_vert_set_ptr(set, 0x0E, &temp); + set->local_vert_set(0x0E, temp); temp = glass_eye->field_10; - shader_local_vert_set_ptr(set, 0x0F, &temp); + set->local_vert_set(0x0F, temp); vec3_mult(glass_eye->field_68, glass_eye->field_68, *(vec3*)&temp); temp.w = temp.z; vec3_div(vec3_identity, *(vec3*)&temp, *(vec3*)&temp); - shader_local_vert_set_ptr(set, 0x0E, &temp); + set->local_vert_set(0x0E, temp); float_t v2 = (glass_eye->field_20 - glass_eye->field_24) / (glass_eye->field_20 + glass_eye->field_24); v2 *= v2; - shader_local_frag_set(set, 0x0C, 1.0f - v2, v2, 0.0f, 0.0f); + set->local_frag_set(0x0C, 1.0f - v2, v2, 0.0f, 0.0f); float_t v3 = (glass_eye->field_20 * glass_eye->field_20) / (glass_eye->field_24 * glass_eye->field_24); - shader_local_frag_set(set, 0x0D, v3, 1.0f - v3, glass_eye->field_20 / glass_eye->field_24, 0.0f); + set->local_frag_set(0x0D, v3, 1.0f - v3, glass_eye->field_20 / glass_eye->field_24, 0.0f); float_t v4 = (glass_eye->field_24 * glass_eye->field_24) / (glass_eye->field_20 * glass_eye->field_20); - shader_local_frag_set(set, 0x0E, 1.0f - v4, v4, glass_eye->field_24 / glass_eye->field_20, 0.0f); + set->local_frag_set(0x0E, 1.0f - v4, v4, glass_eye->field_24 / glass_eye->field_20, 0.0f); vec3_mult(glass_eye->field_74, glass_eye->field_74, *(vec3*)&temp); temp.w = -1.0f; vec3_div(vec3_identity, *(vec3*)&temp, *(vec3*)&temp); - shader_local_frag_set_ptr(set, 0x0F, &temp); + set->local_frag_set(0x0F, temp); vec3_mult(glass_eye->field_68, glass_eye->field_68, *(vec3*)&temp); temp.w = -1.0f; vec3_div(vec3_identity, *(vec3*)&temp, *(vec3*)&temp); - shader_local_frag_set_ptr(set, 0x10, &temp); + set->local_frag_set(0x10, temp); vec3_mult(glass_eye->field_80, glass_eye->field_80, *(vec3*)&temp); temp.w = -1.0f; vec3_div(vec3_identity, *(vec3*)&temp, *(vec3*)&temp); - shader_local_frag_set_ptr(set, 0x11, &temp); + set->local_frag_set(0x11, temp); vec2_mult(*(vec2*)&glass_eye->field_0, *(vec2*)&glass_eye->field_74, *(vec2*)&temp); temp.z = glass_eye->field_64 * 1.442695f; temp.w = glass_eye->field_8C; vec2_div(vec2_identity, *(vec2*)&temp, *(vec2*)&temp); - shader_local_frag_set_ptr(set, 0x12, &temp); + set->local_frag_set(0x12, temp); } static void shader_bind_blinn(shader_set_data* set, shader* shad) { - shader_bind(shad, uniform_value[U_NORMAL] + shad->bind(uniform_value[U_NORMAL] ? SHADER_FT_SUB_BLINN_FRAG : SHADER_FT_SUB_BLINN_VERT); } static void shader_bind_cloth(shader_set_data* set, shader* shad) { - shader_bind(shad, uniform_value[U_NPR] ? SHADER_FT_SUB_CLOTH_NPR1 + shad->bind(uniform_value[U_NPR] ? SHADER_FT_SUB_CLOTH_NPR1 : (uniform_value[U_ANISO] ? SHADER_FT_SUB_CLOTH_ANISO : SHADER_FT_SUB_CLOTH_DEFAULT)); } static void shader_bind_hair(shader_set_data* set, shader* shad) { - shader_bind(shad, uniform_value[U_NPR] ? SHADER_FT_SUB_HAIR_NPR1 + shad->bind(uniform_value[U_NPR] ? SHADER_FT_SUB_HAIR_NPR1 : (uniform_value[U_ANISO] ? SHADER_FT_SUB_HAIR_ANISO : SHADER_FT_SUB_HAIR_DEFAULT)); } static void shader_bind_membrane(shader_set_data* set, shader* shad) { uniform_value[U_MEMBRANE] = 3; - if (shader_bind(shad, SHADER_FT_SUB_MEMBRANE) < 0) + if (shad->bind(SHADER_FT_SUB_MEMBRANE) < 0) return; /*uint32_t(* sub_140192E00)() = (void*)0x0000000140192E00; @@ -2476,18 +2476,18 @@ static void shader_bind_membrane(shader_set_data* set, shader* shad) { //vec4 vec = (vec4){ 1.0f, 0.0f, 0.0f, 0.0f }; //mat4_mult_vec(&mat, &vec, &vec); - //shader_local_frag_set(set, 10, vec.x, vec.y, vec.z, 0.0f); + //set->local_frag_set(10, vec.x, vec.y, vec.z, 0.0f); } -static void shader_bind_eye_ball(shader_set_data* set, shader* shader) { +static void shader_bind_eye_ball(shader_set_data* set, shader* shad) { uniform_value[U18] = 0; - if (shader_bind(&set->shaders[SHADER_FT_GLASEYE], SHADER_FT_SUB_GLASS_EYE) >= 0) { + if (set->shaders[SHADER_FT_GLASEYE].bind(SHADER_FT_SUB_GLASS_EYE) >= 0) { glass_eye_calc(&glass_eye); glass_eye_set(&glass_eye, set); } } -static void shader_bind_tone_map(shader_set_data* set, shader* shader) { - shader_bind(shader, uniform_value[U_NPR] == 1 +static void shader_bind_tone_map(shader_set_data* set, shader* shad) { + shad->bind(uniform_value[U_NPR] == 1 ? SHADER_FT_SUB_TONE_MAP_NPR1 : SHADER_FT_SUB_TONE_MAP); } diff --git a/src/CRE/shader_ft.h b/src/CRE/shader_ft.h index 2e72fea6..ea05ec60 100644 --- a/src/CRE/shader_ft.h +++ b/src/CRE/shader_ft.h @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "shader.h" enum shader_ft_enum { diff --git a/src/CRE/shader_glsl.c b/src/CRE/shader_glsl.cpp similarity index 50% rename from src/CRE/shader_glsl.c rename to src/CRE/shader_glsl.cpp index b88b31fa..2f3090e6 100644 --- a/src/CRE/shader_glsl.c +++ b/src/CRE/shader_glsl.cpp @@ -3,9 +3,9 @@ GitHub/GitLab: korenkonder */ -#include "shader_glsl.h" +#include "shader_glsl.hpp" #include "../KKdLib/hash.hpp" -#include "../KKdLib/str_utils.h" +#include "../KKdLib/str_utils.hpp" #include "gl_state.h" #include "static_var.h" @@ -42,11 +42,11 @@ shader_glsl::~shader_glsl() { } -GLint shader_glsl::get_uniform_location(GLchar* name) { +GLint shader_glsl::get_uniform_location(const char* name) { if (program < 1) return GL_INVALID_INDEX; - return shader_get_uniform_location(program, name, &uniform); + return shader_get_uniform_location(program, (GLchar*)name, &uniform); } void shader_glsl::load(const char* vert, const char* frag, @@ -120,32 +120,32 @@ void shader_glsl::load_file(const char* vert_path, const char* frag_path, char* frag = 0; char* geom = 0; - io_open(&st, vert_path, "rb"); + st.open(vert_path, "rb"); if (st.io.stream) { l = st.length; vert = force_malloc_s(char, l + 1); - io_read(&st, vert, l); + st.read(vert, l); vert[l] = 0; } - io_free(&st); + st.close(); - io_open(&st, frag_path, "rb"); + st.open(frag_path, "rb"); if (st.io.stream) { l = st.length; frag = force_malloc_s(char, l + 1); - io_read(&st, frag, l); + st.read(frag, l); frag[l] = 0; } - io_free(&st); + st.close(); - io_open(&st, geom_path, "rb"); + st.open(geom_path, "rb"); if (st.io.stream) { l = st.length; geom = force_malloc_s(char, l + 1); - io_read(&st, geom, l); + st.read(geom, l); geom[l] = 0; } - io_free(&st); + st.close(); load(vert, frag, geom, param); free(vert); @@ -167,38 +167,302 @@ void shader_glsl::load_file(const wchar_t* vert_path, const wchar_t* frag_path, char* frag = 0; char* geom = 0; - io_open(&st, vert_path, L"rb"); + st.open(vert_path, L"rb"); if (st.io.stream) { l = st.length; vert = force_malloc_s(char, l + 1); - io_read(&st, vert, l); + st.read(vert, l); vert[l] = 0; } - io_free(&st); + st.close(); - io_open(&st, frag_path, L"rb"); + st.open(frag_path, L"rb"); if (st.io.stream) { l = st.length; frag = force_malloc_s(char, l + 1); - io_read(&st, frag, l); + st.read(frag, l); frag[l] = 0; } - io_free(&st); + st.close(); - io_open(&st, geom_path, L"rb"); + st.open(geom_path, L"rb"); if (st.io.stream) { l = st.length; geom = force_malloc_s(char, l + 1); - io_read(&st, geom, l); + st.read(geom, l); geom[l] = 0; } - io_free(&st); + st.close(); load(vert, frag, geom, param); free(vert); free(frag); } +void shader_glsl::set(const char* name, bool value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform1i(location, value ? 1 : 0); + } +} + +void shader_glsl::set(const char* name, int32_t value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform1i(location, value); + } +} + +void shader_glsl::set(const char* name, float_t value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform1f(location, value); + } +} + +void shader_glsl::set(const char* name, vec2i& value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform2i(location, value.x, value.y); + } +} + +void shader_glsl::set(const char* name, int32_t x, int32_t y) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform2i(location, x, y); + } +} + +void shader_glsl::set(const char* name, vec2& value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform2f(location, value.x, value.y); + } +} + +void shader_glsl::set(const char* name, float_t x, float_t y) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform2f(location, x, y); + } +} + +void shader_glsl::set(const char* name, vec3i& value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform3i(location, value.x, value.y, value.z); + } +} + +void shader_glsl::set(const char* name, int32_t x, int32_t y, int32_t z) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform3i(location, x, y, z); + } +} + +void shader_glsl::set(const char* name, vec3& value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform3f(location, value.x, value.y, value.z); + } +} + +void shader_glsl::set(const char* name, float_t x, float_t y, float_t z) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform3f(location, x, y, z); + } +} + +void shader_glsl::set(const char* name, vec4i& value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform4i(location, value.x, value.y, value.z, value.w); + } +} + +void shader_glsl::set(const char* name, vec4iu& value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform4i(location, value.x, value.y, value.z, value.w); + } +} + +void shader_glsl::set(const char* name, int32_t x, int32_t y, int32_t z, int32_t w) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform4i(location, x, y, z, w); + } +} + +void shader_glsl::set(const char* name, vec4& value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform4f(location, value.x, value.y, value.z, value.w); + } +} + +void shader_glsl::set(const char* name, vec4u& value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform4f(location, value.x, value.y, value.z, value.w); + } +} + +void shader_glsl::set(const char* name, float_t x, float_t y, float_t z, float_t w) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform4f(location, x, y, z, w); + } +} + +void shader_glsl::set(const char* name, bool transpose, mat3& value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniformMatrix3fv(location, 1, transpose, (GLfloat*)&value); + } +} + +void shader_glsl::set(const char* name, bool transpose, mat4& value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniformMatrix4fv(location, 1, transpose, (GLfloat*)&value); + } +} + +void shader_glsl::set(const char* name, bool transpose, mat4u& value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniformMatrix4fv(location, 1, transpose, (GLfloat*)&value); + } +} + +void shader_glsl::set(const char* name, size_t count, int32_t* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform1iv(location, (GLsizei)count, value); + } +} + +void shader_glsl::set(const char* name, size_t count, float_t* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform1fv(location, (GLsizei)count, value); + } +} + +void shader_glsl::set(const char* name, size_t count, vec2i* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform2iv(location, (GLsizei)count, (GLint*)value); + } +} + +void shader_glsl::set(const char* name, size_t count, vec2* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform2fv(location, (GLsizei)count, (GLfloat*)value); + } +} + +void shader_glsl::set(const char* name, size_t count, vec3i* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform3iv(location, (GLsizei)count, (GLint*)value); + } +} + +void shader_glsl::set(const char* name, size_t count, vec3* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform3fv(location, (GLsizei)count, (GLfloat*)value); + } +} + +void shader_glsl::set(const char* name, size_t count, vec4i* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform4iv(location, (GLsizei)count, (GLint*)value); + } +} + +void shader_glsl::set(const char* name, size_t count, vec4iu* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform4iv(location, (GLsizei)count, (GLint*)value); + } +} + +void shader_glsl::set(const char* name, size_t count, vec4* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform4fv(location, (GLsizei)count, (GLfloat*)value); + } +} + +void shader_glsl::set(const char* name, size_t count, vec4u* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniform4fv(location, (GLsizei)count, (GLfloat*)value); + } +} + +void shader_glsl::set(const char* name, size_t count, bool transpose, mat3* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniformMatrix3fv(location, (GLsizei)count, transpose, (GLfloat*)value); + } +} + +void shader_glsl::set(const char* name, size_t count, bool transpose, mat4* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniformMatrix4fv(location, (GLsizei)count, transpose, (GLfloat*)value); + } +} + +void shader_glsl::set(const char* name, size_t count, bool transpose, mat4u* value) { + int32_t location = get_uniform_location(name); + if (location != GL_INVALID_INDEX) { + use(); + glUniformMatrix4fv(location, (GLsizei)count, transpose, (GLfloat*)value); + } +} + void shader_glsl::set_uniform_block_binding(GLchar* name, GLint binding) { GLint index = shader_get_uniform_block_index(program, name, &uniform_block); if (index != GL_INVALID_INDEX) diff --git a/src/CRE/shader_glsl.h b/src/CRE/shader_glsl.h deleted file mode 100644 index 96cfd0b9..00000000 --- a/src/CRE/shader_glsl.h +++ /dev/null @@ -1,287 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include -#include -#include "../KKdLib/default.h" -#include "../KKdLib/farc.hpp" -#include "../KKdLib/mat.h" -#include "../KKdLib/vec.h" -#include - -#define SHADER_PARAM_NUM_PARAMS 12 - -struct shader_glsl_param { - const char* name; - char* frag; - char* vert; - char* param[SHADER_PARAM_NUM_PARAMS]; -}; - -struct shader_glsl { - std::string name; - GLuint program; - std::vector> uniform; - std::vector> uniform_block; - - shader_glsl(); - ~shader_glsl(); - - GLint get_uniform_location(GLchar* name); - void load(const char* vert_data, const char* frag_data, - const char* geom_data, shader_glsl_param* param); - void load_file(const char* vert_path, const char* frag_path, - const char* geom_path, shader_glsl_param* param); - void load_file(const wchar_t* vert_path, const wchar_t* frag_path, - const wchar_t* geom_path, shader_glsl_param* param); - void set_uniform_block_binding(GLchar* name, GLint binding); - void unload(); - void use(); -}; - -#define shader_glsl_set_bool(s, name, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform1i(location, value ? 1 : 0); \ - } \ -} - -#define shader_glsl_set_int(s, name, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform1i(location, value); \ - } \ -} - -#define shader_glsl_set_float(s, name, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform1f(location, value); \ - } \ -} - -#define shader_glsl_set_vec2i(s, name, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform2i(location, (value).x, (value).y); \ - } \ -} - -#define shader_glsl_set_vec2i_value(s, name, x, y) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform2i(location, (x), (y)); \ - } \ -} - -#define shader_glsl_set_vec2(s, name, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform2f(location, (value).x, (value).y); \ - } \ -} - -#define shader_glsl_set_vec2_value(s, name, x, y) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform2f(location, (x), (y)); \ - } \ -} - -#define shader_glsl_set_vec3i(s, name, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform3i(location, (value).x, (value).y, (value).z); \ - } \ -} - -#define shader_glsl_set_vec3i_value(s, name, x, y, z) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform3i(location, (x), (y), (z)); \ - } \ -} - -#define shader_glsl_set_vec3(s, name, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform3f(location, (value).x, (value).y, (value).z); \ - } \ -} - -#define shader_glsl_set_vec3_value(s, name, x, y, z) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform3f(location, (x), (y), (z)); \ - } \ -} - -#define shader_glsl_set_vec4i(s, name, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform4i(location, (value).x, (value).y, (value).z, (value).w); \ - } \ -} - -#define shader_glsl_set_vec4i_value(s, name, x, y, z, w) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform4i(location, (x), (y), (z), (w)); \ - } \ -} - -#define shader_glsl_set_vec4(s, name, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform4f(location, (value).x, (value).y, (value).z, (value).w); \ - } \ -} - -#define shader_glsl_set_vec4_value(s, name, x, y, z, w) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform4f(location, (x), (y), (z), (w)); \ - } \ -} - -#define shader_glsl_set_mat3(s, name, transpose, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniformMatrix3fv(location, 1, transpose, (GLfloat*)&(value)); \ - } \ -} - -#define shader_glsl_set_mat4(s, name, transpose, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniformMatrix4fv(location, 1, transpose, (GLfloat*)&(value)); \ - } \ -} - -#define shader_glsl_set_int_array(s, name, count, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform1iv(location, count, value); \ - } \ -} - -#define shader_glsl_set_float_array(s, name, count, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform1fv(location, count, value); \ - } \ -} - -#define shader_glsl_set_vec2i_array(s, name, count, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform2iv(location, count, (GLint*)value); \ - } \ -} - -#define shader_glsl_set_vec2_array(s, name, count, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform2fv(location, count, (GLfloat*)value); \ - } \ -} - -#define shader_glsl_set_vec3i_array(s, name, count, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform3iv(location, count, (GLint*)value); \ - } \ -} - -#define shader_glsl_set_vec3_array(s, name, count, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform3fv(location, count, (GLfloat*)value); \ - } \ -} - -#define shader_glsl_set_vec4i_array(s, name, count, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform4iv(location, count, (GLint*)value); \ - } \ -} - - #define shader_glsl_set_vec4_array(s, name, count, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniform4fv(location, count, (GLfloat*)value); \ - } \ -} - -#define shader_glsl_set_mat3_array(s, name, count, transpose, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniformMatrix3fv(location, count, transpose, (GLfloat*)value); \ - } \ -} - -#define shader_glsl_set_mat4_array(s, name, count, transpose, value) \ -{ \ - int32_t location = (s)->get_uniform_location((GLchar*)name); \ - if (location != GL_INVALID_INDEX) { \ - (s)->use(); \ - glUniformMatrix4fv(location, count, transpose, (GLfloat*)value); \ - } \ -} diff --git a/src/CRE/shader_glsl.hpp b/src/CRE/shader_glsl.hpp new file mode 100644 index 00000000..908acf30 --- /dev/null +++ b/src/CRE/shader_glsl.hpp @@ -0,0 +1,77 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include +#include +#include "../KKdLib/default.hpp" +#include "../KKdLib/farc.hpp" +#include "../KKdLib/mat.hpp" +#include "../KKdLib/vec.hpp" +#include + +#define SHADER_PARAM_NUM_PARAMS 12 + +struct shader_glsl_param { + const char* name; + char* frag; + char* vert; + char* param[SHADER_PARAM_NUM_PARAMS]; +}; + +struct shader_glsl { + std::string name; + GLuint program; + std::vector> uniform; + std::vector> uniform_block; + + shader_glsl(); + ~shader_glsl(); + + GLint get_uniform_location(const char* name); + void load(const char* vert_data, const char* frag_data, + const char* geom_data, shader_glsl_param* param); + void load_file(const char* vert_path, const char* frag_path, + const char* geom_path, shader_glsl_param* param); + void load_file(const wchar_t* vert_path, const wchar_t* frag_path, + const wchar_t* geom_path, shader_glsl_param* param); + void set(const char* name, bool value); + void set(const char* name, int32_t value); + void set(const char* name, float_t value); + void set(const char* name, vec2i& value); + void set(const char* name, int32_t x, int32_t y); + void set(const char* name, vec2& value); + void set(const char* name, float_t x, float_t y); + void set(const char* name, vec3i& value); + void set(const char* name, int32_t x, int32_t y, int32_t z); + void set(const char* name, vec3& value); + void set(const char* name, float_t x, float_t y, float_t z); + void set(const char* name, vec4i& value); + void set(const char* name, vec4iu& value); + void set(const char* name, int32_t x, int32_t y, int32_t z, int32_t w); + void set(const char* name, vec4& value); + void set(const char* name, vec4u& value); + void set(const char* name, float_t x, float_t y, float_t z, float_t w); + void set(const char* name, bool transpose, mat3& value); + void set(const char* name, bool transpose, mat4& value); + void set(const char* name, bool transpose, mat4u& value); + void set(const char* name, size_t count, int32_t* value); + void set(const char* name, size_t count, float_t* value); + void set(const char* name, size_t count, vec2i* value); + void set(const char* name, size_t count, vec2* value); + void set(const char* name, size_t count, vec3i* value); + void set(const char* name, size_t count, vec3* value); + void set(const char* name, size_t count, vec4i* value); + void set(const char* name, size_t count, vec4iu* value); + void set(const char* name, size_t count, vec4* value); + void set(const char* name, size_t count, vec4u* value); + void set(const char* name, size_t count, bool transpose, mat3* value); + void set(const char* name, size_t count, bool transpose, mat4* value); + void set(const char* name, size_t count, bool transpose, mat4u* value); + void set_uniform_block_binding(GLchar* name, GLint binding); + void unload(); + void use(); +}; diff --git a/src/CRE/shared.h b/src/CRE/shared.h index 9eee3fb3..64d29567 100644 --- a/src/CRE/shared.h +++ b/src/CRE/shared.h @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" -#include "../KKdLib/mat.h" -#include "../KKdLib/vec.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/mat.hpp" +#include "../KKdLib/vec.hpp" #include "static_var.h" diff --git a/src/CRE/stage.cpp b/src/CRE/stage.cpp index 7e1a2ceb..1b782ff1 100644 --- a/src/CRE/stage.cpp +++ b/src/CRE/stage.cpp @@ -5,8 +5,8 @@ #include "stage.hpp" #include "../KKdLib/hash.hpp" -#include "../KKdLib/str_utils.h" -#include "../KKdLib/vec.h" +#include "../KKdLib/str_utils.hpp" +#include "../KKdLib/vec.hpp" #include "draw_task.h" #include "light_param.hpp" #include "render_context.hpp" @@ -61,14 +61,14 @@ extern vec4 npr_spec_color; static uint16_t stage_counter; void dtm_stg_load(int32_t stage_index) { - if (TaskWork::CheckTaskReady(&dtm_stg)) + if (app::TaskWork::CheckTaskReady(&dtm_stg)) return; - if (TaskWork::CheckTaskReady(&dtm_stg)) { + if (app::TaskWork::CheckTaskReady(&dtm_stg)) { dtm_stg.stage_index = stage_index; dtm_stg.load_stage_index = stage_index; } - TaskWork::AppendTask(&dtm_stg, "DATA_TEST_STAGE"); + app::TaskWork::AppendTask(&dtm_stg, "DATA_TEST_STAGE"); } bool dtm_stg_unload() { @@ -286,13 +286,13 @@ static void stage_detail::TaskStage_GetLoadedStageInfos(stage_detail::TaskStage* } static bool stage_detail::TaskStage_Load(stage_detail::TaskStage* a1, const char* name) { - if (TaskWork::AppendTask(a1, name)) { + if (app::TaskWork::AppendTask(a1, name)) { stage_detail::TaskStage_Reset(a1); stage_detail::TaskStage_TaskWindAppend(a1); return false; } else { - if (!TaskWork::HasTaskDest(a1)) + if (!app::TaskWork::HasTaskDest(a1)) a1->SetDest(); return true; } @@ -323,7 +323,7 @@ static void stage_detail::TaskStage_SetStage(stage_detail::TaskStage* a1, task_s } static void stage_detail::TaskStage_TaskWindAppend(stage_detail::TaskStage* a1) { - TaskWork::AppendTask(&task_wind, a1, "CHARA WIND"); + app::TaskWork::AppendTask(&task_wind, a1, "CHARA WIND"); } static void stage_detail::TaskStage_Unload(stage_detail::TaskStage* a1) { diff --git a/src/CRE/stage.hpp b/src/CRE/stage.hpp index 5d9e06dc..c1d3bfc6 100644 --- a/src/CRE/stage.hpp +++ b/src/CRE/stage.hpp @@ -6,7 +6,7 @@ #pragma once #include -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "../KKdLib/database/stage.hpp" #include "render_context.hpp" #include "auth_3d.hpp" @@ -37,7 +37,7 @@ struct stage { #define TASK_STAGE_STAGE_COUNT 37 namespace stage_detail { - class TaskStage : public Task { + class TaskStage : public app::Task { public: int32_t state; stage stages[TASK_STAGE_STAGE_COUNT]; @@ -69,7 +69,7 @@ struct task_stage_info { task_stage_info(); }; -class DtmStg : public Task { +class DtmStg : public app::Task { public: int32_t stage_index; int32_t load_stage_index; diff --git a/src/CRE/stage_modern.cpp b/src/CRE/stage_modern.cpp index bcdd9323..bdab0dae 100644 --- a/src/CRE/stage_modern.cpp +++ b/src/CRE/stage_modern.cpp @@ -5,8 +5,8 @@ #include "stage_modern.hpp" #include "../KKdLib/hash.hpp" -#include "../KKdLib/str_utils.h" -#include "../KKdLib/vec.h" +#include "../KKdLib/str_utils.hpp" +#include "../KKdLib/vec.hpp" #include "draw_task.h" #include "light_param.hpp" #include "render_context.hpp" @@ -279,13 +279,13 @@ static void stage_detail::TaskStageModern_GetLoadedStageInfos(stage_detail::Task } static bool stage_detail::TaskStageModern_Load(stage_detail::TaskStageModern* a1, const char* name) { - if (TaskWork::AppendTask(a1, name)) { + if (app::TaskWork::AppendTask(a1, name)) { stage_detail::TaskStageModern_Reset(a1); stage_detail::TaskStageModern_TaskWindAppend(a1); return false; } else { - if (!TaskWork::HasTaskDest(a1)) + if (!app::TaskWork::HasTaskDest(a1)) a1->SetDest(); return true; } @@ -317,7 +317,7 @@ static void stage_detail::TaskStageModern_SetStage(stage_detail::TaskStageModern } static void stage_detail::TaskStageModern_TaskWindAppend(stage_detail::TaskStageModern* a1) { - TaskWork::AppendTask(&task_wind, a1, "CHARA WIND"); + app::TaskWork::AppendTask(&task_wind, a1, "CHARA WIND"); } static void stage_detail::TaskStageModern_Unload(stage_detail::TaskStageModern* a1) { diff --git a/src/CRE/stage_modern.hpp b/src/CRE/stage_modern.hpp index b563bde9..a5230a62 100644 --- a/src/CRE/stage_modern.hpp +++ b/src/CRE/stage_modern.hpp @@ -6,7 +6,7 @@ #pragma once #include -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "../KKdLib/database/stage.hpp" #include "render_context.hpp" #include "auth_3d.hpp" @@ -35,7 +35,7 @@ struct stage_modern { #define TASK_STAGE_STAGE_COUNT 37 namespace stage_detail { - class TaskStageModern : public Task { + class TaskStageModern : public app::Task { public: int32_t state; stage_modern stages[TASK_STAGE_STAGE_COUNT]; diff --git a/src/CRE/static_var.h b/src/CRE/static_var.h index f55ae5fd..6a0fdf2b 100644 --- a/src/CRE/static_var.h +++ b/src/CRE/static_var.h @@ -5,12 +5,12 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "../KKdLib/light_param/fog.hpp" #include "../KKdLib/light_param/light.hpp" -#include "../KKdLib/mat.h" -#include "../KKdLib/vec.h" -#include "../KKdLib/vec.h" +#include "../KKdLib/mat.hpp" +#include "../KKdLib/vec.hpp" +#include "../KKdLib/vec.hpp" #include enum draw_pass_3d_type { diff --git a/src/CRE/task.cpp b/src/CRE/task.cpp index 6e225a05..46b53bf8 100644 --- a/src/CRE/task.cpp +++ b/src/CRE/task.cpp @@ -9,386 +9,410 @@ extern float_t get_delta_frame(); extern uint32_t get_frame_counter(); -static void Task_add_base_calc_time(Task* t, uint32_t calc_time); -static void Task_do_basic(Task* t); -static void Task_do_ctrl(Task* t); -static void Task_do_ctrl_frames(int32_t frames, bool frame_skip); -static void Task_do_disp(Task* t); -static void Task_set_base_calc_time(Task* t, uint32_t base_calc_time); -static void Task_set_calc_time(Task* t); -static void Task_set_disp_time(Task* t, uint32_t disp_time); -static bool Task_sub_14019B810(Task* t, int32_t a2); -static void Task_sub_14019C480(Task* t, uint32_t a2); -static void Task_sub_14019C5A0(Task* t); - -static bool TaskWork_has_task_dest(Task* t); - extern float_t delta_frame_history; extern int32_t delta_frame_history_int; -TaskWork* task_work; +namespace app { + static void Task_add_base_calc_time(Task* t, uint32_t calc_time); + static void Task_do_basic(Task* t); + static void Task_do_ctrl(Task* t); + static void Task_do_ctrl_frames(int32_t frames, bool frame_skip); + static void Task_do_disp(Task* t); + static void Task_set_base_calc_time(Task* t, uint32_t base_calc_time); + static void Task_set_calc_time(Task* t); + static void Task_set_disp_time(Task* t, uint32_t disp_time); + static bool Task_sub_14019B810(Task* t, int32_t a2); + static void Task_sub_14019C480(Task* t, uint32_t a2); + static void Task_sub_14019C5A0(Task* t); -Task::Task() { - priority = 1; - parent_task = 0; - field_18 = TASK_NONE; - field_1C = 0; - field_20 = 0; - field_24 = TASK_NONE; - field_28 = 0; - field_2C = false; - is_frame_dependent = false; - SetName("(unknown)"); - field_4E = false; - field_4F = false; - base_calc_time = 0; - calc_time = 0; - calc_time_max = 0; - disp_time = 0; - disp_time_max = 0; -} + static bool TaskWork_has_task_dest(Task* t); -Task::~Task() { + TaskWork* task_work; -} + TaskInterface::TaskInterface() { -bool Task::Init() { - return true; -} - -bool Task::Ctrl() { - return false; -} - -bool Task::Dest() { - return true; -} - -void Task::Disp() { - -} - -void Task::Basic() { - -} - -uint32_t Task::GetCalcTime() { - return calc_time; -} - -uint32_t Task::GetCalcTimeMax() { - return calc_time_max; -} - -uint32_t Task::GetDispTime() { - return disp_time; -} - -uint32_t Task::GetDispTimeMax() { - return disp_time_max; -} - -char* Task::GetName() { - return name; -} - -bool Task::SetDest() { - if (!TaskWork::HasTask(this) || !Task_sub_14019B810(this, 2)) - return false; - - Task_sub_14019C480(this, 2); - return true; -} - -void Task::SetName(const char* name) { - if (!name) { - this->name[0] = 0; - return; } - size_t len = utf8_length(name); - len = min(len, sizeof(this->name) - 1); - memmove(&this->name, name, len); - this->name[len] = 0; -} + TaskInterface:: ~TaskInterface() { -void Task::SetPriority(int32_t priority) { - this->priority = priority; -} - -TaskWork::TaskWork() : current(), disp() { - -} - -TaskWork::~TaskWork() { - for (Task* i : tasks) - i->SetDest(); - - while (tasks.size()) - Ctrl(); -} - -bool TaskWork::AppendTask(Task* t, const char* name, int32_t priority) { - return TaskWork::AppendTask(t, task_work->current, name, priority); -} - -bool TaskWork::AppendTask(Task* t, Task* parent_task, const char* name, int32_t priority) { - Task_sub_14019C480(t, 0); - if (TaskWork::HasTask(t) || !Task_sub_14019B810(t, 1)) - return false; - - t->SetPriority(priority); - t->parent_task = parent_task; - t->field_18 = TASK_NONE; - t->field_1C = 0; - t->field_24 = TASK_NONE; - t->field_28 = 0; - t->SetName(name); - Task_sub_14019C480(t, 1); - Task_sub_14019C5A0(t); - task_work->tasks.push_back(t); - return true; -} - -void TaskWork::Basic() { - std::list* tasks = &task_work->tasks; - for (int32_t i = 0; i < 3; i++) - for (Task*& j : task_work->tasks) - if (j->priority == i) - Task_do_basic(j); -} - -bool TaskWork::CheckTaskReady(Task* t) { - return TaskWork::HasTask(t) && (t->field_18 == TASK_NONE || t->field_1C); -} - -void TaskWork::Ctrl() { - std::list* tasks = &task_work->tasks; - for (Task*& i : task_work->tasks) { - Task_sub_14019C5A0(i); - Task_set_base_calc_time(i, 0); } - for (int32_t i = 2; i >= 0; i--) - for (std::list::iterator j = task_work->tasks.end(); j != task_work->tasks.begin(); ) { - --j; - Task* tsk = *j; - if (tsk->priority != i || !TaskWork_has_task_dest(tsk)) - continue; - - time_struct t; - time_struct_init(&t); - task_work->current = tsk; - Task_do_ctrl(tsk); - task_work->current = 0; - Task_add_base_calc_time(tsk, (uint32_t)(time_struct_calc_time(&t) * 1000.0)); - } - - for (std::list::iterator i = task_work->tasks.begin(); i != task_work->tasks.end(); ) { - if (TaskWork::CheckTaskReady(*i)) { - i++; - continue; - } - - i = task_work->tasks.erase(i); - } - - int32_t frames = delta_frame_history_int; - if (frames > 1) - for (int32_t i = frames - 1; i; i--) - Task_do_ctrl_frames(frames, true); - Task_do_ctrl_frames(frames, false); - - for (Task*& i : task_work->tasks) - Task_set_calc_time(i); -} - -void TaskWork::Disp() { - task_work->disp = true; - std::list* tasks = &task_work->tasks; - for (int32_t i = 0; i < 3; i++) - for (Task*& j : task_work->tasks) { - Task* tsk = j; - if (tsk->priority != i) - continue; - - time_struct t; - time_struct_init(&t); - Task_do_disp(tsk); - Task_set_disp_time(tsk, (uint32_t)(time_struct_calc_time(&t) * 1000.0)); - } - task_work->disp = false; -} - -Task* TaskWork::GetTaskByIndex(int32_t index) { - int32_t k = 0; - for (int32_t i = 0; i < 3; i++) - for (Task*& j : task_work->tasks) - if (j->priority == i) - if (k++ == index) - return j; - return 0; -} - -bool TaskWork::HasTask(Task* t) { - std::list* tasks = &task_work->tasks; - for (Task*& i : task_work->tasks) - if (i == t) - return true; - return false; -} - -bool TaskWork::HasTaskDest(Task* t) { - if (TaskWork::HasTask(t)) - return t->field_18 == TASK_DEST; - else - return false; -} - -extern void task_work_init() { - task_work = new TaskWork; -} - -extern void task_work_free() { - delete task_work; -} - -static void Task_add_base_calc_time(Task* t, uint32_t calc_time) { - t->base_calc_time += calc_time; -} - -static void Task_do_basic(Task* t) { - if ((t->field_1C == 1 || t->field_1C == 2) - && t->field_18 != TASK_INIT && t->field_18 != TASK_DEST) - t->Basic(); -} - -static void Task_do_ctrl(Task* t) { - if (t->field_1C != 1) - return; - - if (t->field_18 == TASK_INIT && t->Init()) { - t->field_24 = TASK_CTRL; - t->field_18 = TASK_CTRL; - } - - if (t->field_18 == TASK_CTRL && t->Ctrl()) { - t->field_24 = TASK_DEST; - t->field_18 = TASK_DEST; - } - - if (t->field_18 == TASK_DEST && t->Dest()) { - t->field_28 = 0; - t->field_24 = TASK_MAX; - t->field_20 = 0; - } -} - -static void Task_do_ctrl_frames(int32_t frames, bool frame_skip) { - std::list* tasks = &task_work->tasks; - for (int32_t i = 0; i < 3; i++) - for (Task*& j : task_work->tasks) { - Task* tsk = j; - if (tsk->priority != i || TaskWork_has_task_dest(tsk)) - continue; - else if (tsk->is_frame_dependent) { - if (frames <= 0) - continue; - } - else if (frame_skip) - continue; - - time_struct t; - time_struct_init(&t); - task_work->current = tsk; - Task_do_ctrl(tsk); - task_work->current = 0; - Task_add_base_calc_time(tsk, (uint32_t)(time_struct_calc_time(&t) * 1000.0)); - } -} - -static void Task_do_disp(Task* t) { - if ((t->field_1C == 1 || t->field_1C == 2) - && t->field_18 != TASK_INIT && t->field_18 != TASK_DEST) - t->Disp(); -} - -static void Task_set_base_calc_time(Task* t, uint32_t base_calc_time) { - t->base_calc_time = base_calc_time; -} - -static void Task_set_calc_time(Task* t) { - t->calc_time = t->base_calc_time; - uint32_t frame_counter = get_frame_counter(); - if (frame_counter == (frame_counter / 300) * 300) - t->calc_time_max = 0; - t->calc_time = max(t->calc_time, t->calc_time_max); -} - -static void Task_set_disp_time(Task* t, uint32_t disp_time) { - t->disp_time = disp_time; - uint32_t frame_counter = get_frame_counter(); - if (frame_counter == (frame_counter / 300) * 300) - t->disp_time_max = 0; - t->disp_time = max(t->disp_time, t->disp_time_max); -} - -static bool Task_sub_14019B810(Task* t, int32_t a2) { - if (task_work->disp) - return false; - - if (a2 == 1) + bool TaskInterface::Init() { return true; - else if (a2 == 2) - return t->field_1C != 0; - else if (a2 == 3) - return t->field_1C == 1 || t->field_1C == 3; - else if (a2 == 4) - return t->field_1C == 1 || t->field_1C == 2; - else if (a2 == 5) - return t->field_1C == 2 || t->field_1C == 3; - return false; -} - -static void Task_sub_14019C480(Task* t, uint32_t a2) { - if (a2 > 1) - for (Task*& i : task_work->tasks) - if (i->parent_task == t) - Task_sub_14019C480(i, a2); - t->field_20 = a2; -} - -static void Task_sub_14019C5A0(Task* t) { - if (t->field_18 != TASK_INIT && t->field_18 != TASK_DEST - && Task_sub_14019B810(t, t->field_20)) { - switch (t->field_20) { - case 1: - t->field_24 = TASK_INIT; - t->field_28 = 1; - break; - case 2: - t->field_24 = TASK_DEST; - t->field_28 = 1; - break; - case 3: - t->field_28 = 2; - break; - case 4: - t->field_28 = 3; - break; - case 5: - t->field_28 = 1; - break; - } - t->field_20 = 0; } - t->field_18 = t->field_24; - t->field_1C = t->field_28; -} + bool TaskInterface::Ctrl() { + return false; + } -static bool TaskWork_has_task_dest(Task* t) { - if (TaskWork::HasTask(t)) - return t->field_18 == TASK_DEST; - return false; + bool TaskInterface::Dest() { + return true; + } + + void TaskInterface::Disp() { + + } + + void TaskInterface::Basic() { + + } + + Task::Task() { + priority = 1; + parent_task = 0; + field_18 = Task::Enum::None; + field_1C = 0; + field_20 = 0; + field_24 = Task::Enum::None; + field_28 = 0; + field_2C = false; + is_frame_dependent = false; + SetName("(unknown)"); + field_4E = false; + field_4F = false; + base_calc_time = 0; + calc_time = 0; + calc_time_max = 0; + disp_time = 0; + disp_time_max = 0; + } + + Task::~Task() { + + } + + uint32_t Task::GetCalcTime() { + return calc_time; + } + + uint32_t Task::GetCalcTimeMax() { + return calc_time_max; + } + + uint32_t Task::GetDispTime() { + return disp_time; + } + + uint32_t Task::GetDispTimeMax() { + return disp_time_max; + } + + char* Task::GetName() { + return name; + } + + bool Task::SetDest() { + if (!TaskWork::HasTask(this) || !Task_sub_14019B810(this, 2)) + return false; + + Task_sub_14019C480(this, 2); + return true; + } + + void Task::SetName(const char* name) { + if (!name) { + this->name[0] = 0; + return; + } + + size_t len = utf8_length(name); + len = min(len, sizeof(this->name) - 1); + memmove(&this->name, name, len); + this->name[len] = 0; + } + + void Task::SetPriority(int32_t priority) { + this->priority = priority; + } + + TaskWork::TaskWork() : current(), disp() { + + } + + TaskWork::~TaskWork() { + for (Task* i : tasks) + i->SetDest(); + + while (tasks.size()) + Ctrl(); + } + + bool TaskWork::AppendTask(Task* t, const char* name, int32_t priority) { + return TaskWork::AppendTask(t, task_work->current, name, priority); + } + + bool TaskWork::AppendTask(Task* t, Task* parent_task, const char* name, int32_t priority) { + Task_sub_14019C480(t, 0); + if (TaskWork::HasTask(t) || !Task_sub_14019B810(t, 1)) + return false; + + t->SetPriority(priority); + t->parent_task = parent_task; + t->field_18 = Task::Enum::None; + t->field_1C = 0; + t->field_24 = Task::Enum::None; + t->field_28 = 0; + t->SetName(name); + Task_sub_14019C480(t, 1); + Task_sub_14019C5A0(t); + task_work->tasks.push_back(t); + return true; + } + + void TaskWork::Basic() { + std::list* tasks = &task_work->tasks; + for (int32_t i = 0; i < 3; i++) + for (Task*& j : task_work->tasks) + if (j->priority == i) + Task_do_basic(j); + } + + bool TaskWork::CheckTaskReady(Task* t) { + return TaskWork::HasTask(t) && (t->field_18 == Task::Enum::None || t->field_1C); + } + + void TaskWork::Ctrl() { + std::list* tasks = &task_work->tasks; + for (Task*& i : task_work->tasks) { + Task_sub_14019C5A0(i); + Task_set_base_calc_time(i, 0); + } + + for (int32_t i = 2; i >= 0; i--) + for (std::list::iterator j = task_work->tasks.end(); j != task_work->tasks.begin(); ) { + --j; + Task* tsk = *j; + if (tsk->priority != i || !TaskWork_has_task_dest(tsk)) + continue; + + time_struct t; + time_struct_init(&t); + task_work->current = tsk; + Task_do_ctrl(tsk); + task_work->current = 0; + Task_add_base_calc_time(tsk, (uint32_t)(time_struct_calc_time(&t) * 1000.0)); + } + + for (std::list::iterator i = task_work->tasks.begin(); i != task_work->tasks.end(); ) { + if (TaskWork::CheckTaskReady(*i)) { + i++; + continue; + } + + i = task_work->tasks.erase(i); + } + + int32_t frames = delta_frame_history_int; + if (frames > 1) + for (int32_t i = frames - 1; i; i--) + Task_do_ctrl_frames(frames, true); + Task_do_ctrl_frames(frames, false); + + for (Task*& i : task_work->tasks) + Task_set_calc_time(i); + } + + void TaskWork::Disp() { + task_work->disp = true; + std::list* tasks = &task_work->tasks; + for (int32_t i = 0; i < 3; i++) + for (Task*& j : task_work->tasks) { + Task* tsk = j; + if (tsk->priority != i) + continue; + + time_struct t; + time_struct_init(&t); + Task_do_disp(tsk); + Task_set_disp_time(tsk, (uint32_t)(time_struct_calc_time(&t) * 1000.0)); + } + task_work->disp = false; + } + + Task* TaskWork::GetTaskByIndex(int32_t index) { + int32_t k = 0; + for (int32_t i = 0; i < 3; i++) + for (Task*& j : task_work->tasks) + if (j->priority == i) + if (k++ == index) + return j; + return 0; + } + + bool TaskWork::HasTask(Task* t) { + std::list* tasks = &task_work->tasks; + for (Task*& i : task_work->tasks) + if (i == t) + return true; + return false; + } + + bool TaskWork::HasTaskInit(Task* t) { + if (TaskWork::HasTask(t)) + return t->field_18 == Task::Enum::Init; + else + return false; + } + + bool TaskWork::HasTaskCtrl(Task* t) { + if (TaskWork::HasTask(t)) + return t->field_18 == Task::Enum::Ctrl; + else + return false; + } + + bool TaskWork::HasTaskDest(Task* t) { + if (TaskWork::HasTask(t)) + return t->field_18 == Task::Enum::Dest; + else + return false; + } + + extern void task_work_init() { + task_work = new TaskWork; + } + + extern void task_work_free() { + delete task_work; + } + + static void Task_add_base_calc_time(Task* t, uint32_t calc_time) { + t->base_calc_time += calc_time; + } + + static void Task_do_basic(Task* t) { + if ((t->field_1C == 1 || t->field_1C == 2) + && t->field_18 != Task::Enum::Init && t->field_18 != Task::Enum::Dest) + t->Basic(); + } + + static void Task_do_ctrl(Task* t) { + if (t->field_1C != 1) + return; + + if (t->field_18 == Task::Enum::Init && t->Init()) { + t->field_24 = Task::Enum::Ctrl; + t->field_18 = Task::Enum::Ctrl; + } + + if (t->field_18 == Task::Enum::Ctrl && t->Ctrl()) { + t->field_24 = Task::Enum::Dest; + t->field_18 = Task::Enum::Dest; + } + + if (t->field_18 == Task::Enum::Dest && t->Dest()) { + t->field_28 = 0; + t->field_24 = Task::Enum::Max; + t->field_20 = 0; + } + } + + static void Task_do_ctrl_frames(int32_t frames, bool frame_skip) { + std::list* tasks = &task_work->tasks; + for (int32_t i = 0; i < 3; i++) + for (Task*& j : task_work->tasks) { + Task* tsk = j; + if (tsk->priority != i || TaskWork_has_task_dest(tsk)) + continue; + else if (tsk->is_frame_dependent) { + if (frames <= 0) + continue; + } + else if (frame_skip) + continue; + + time_struct t; + time_struct_init(&t); + task_work->current = tsk; + Task_do_ctrl(tsk); + task_work->current = 0; + Task_add_base_calc_time(tsk, (uint32_t)(time_struct_calc_time(&t) * 1000.0)); + } + } + + static void Task_do_disp(Task* t) { + if ((t->field_1C == 1 || t->field_1C == 2) + && t->field_18 != Task::Enum::Init && t->field_18 != Task::Enum::Dest) + t->Disp(); + } + + static void Task_set_base_calc_time(Task* t, uint32_t base_calc_time) { + t->base_calc_time = base_calc_time; + } + + static void Task_set_calc_time(Task* t) { + t->calc_time = t->base_calc_time; + uint32_t frame_counter = get_frame_counter(); + if (frame_counter == (frame_counter / 300) * 300) + t->calc_time_max = 0; + t->calc_time = max(t->calc_time, t->calc_time_max); + } + + static void Task_set_disp_time(Task* t, uint32_t disp_time) { + t->disp_time = disp_time; + uint32_t frame_counter = get_frame_counter(); + if (frame_counter == (frame_counter / 300) * 300) + t->disp_time_max = 0; + t->disp_time = max(t->disp_time, t->disp_time_max); + } + + static bool Task_sub_14019B810(Task* t, int32_t a2) { + if (task_work->disp) + return false; + + if (a2 == 1) + return true; + else if (a2 == 2) + return t->field_1C != 0; + else if (a2 == 3) + return t->field_1C == 1 || t->field_1C == 3; + else if (a2 == 4) + return t->field_1C == 1 || t->field_1C == 2; + else if (a2 == 5) + return t->field_1C == 2 || t->field_1C == 3; + return false; + } + + static void Task_sub_14019C480(Task* t, uint32_t a2) { + if (a2 > 1) + for (Task*& i : task_work->tasks) + if (i->parent_task == t) + Task_sub_14019C480(i, a2); + t->field_20 = a2; + } + + static void Task_sub_14019C5A0(Task* t) { + if (t->field_18 != Task::Enum::Init && t->field_18 != Task::Enum::Dest + && Task_sub_14019B810(t, t->field_20)) { + switch (t->field_20) { + case 1: + t->field_24 = Task::Enum::Init; + t->field_28 = 1; + break; + case 2: + t->field_24 = Task::Enum::Dest; + t->field_28 = 1; + break; + case 3: + t->field_28 = 2; + break; + case 4: + t->field_28 = 3; + break; + case 5: + t->field_28 = 1; + break; + } + t->field_20 = 0; + } + + t->field_18 = t->field_24; + t->field_1C = t->field_28; + } + + static bool TaskWork_has_task_dest(Task* t) { + if (TaskWork::HasTask(t)) + return t->field_18 == Task::Enum::Dest; + return false; + } } diff --git a/src/CRE/task.hpp b/src/CRE/task.hpp index d1888fb0..4cdda6cf 100644 --- a/src/CRE/task.hpp +++ b/src/CRE/task.hpp @@ -6,80 +6,90 @@ #pragma once #include -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" -enum task_enum { - TASK_NONE = 0x00, - TASK_INIT = 0x01, - TASK_CTRL = 0x02, - TASK_DEST = 0x03, - TASK_MAX = 0x04, -}; +namespace app { + class TaskInterface { + public: + TaskInterface(); + virtual ~TaskInterface(); -class Task { -public: - int32_t priority; - Task* parent_task; - task_enum field_18; - uint32_t field_1C; - uint32_t field_20; - task_enum field_24; - uint32_t field_28; - bool field_2C; - bool is_frame_dependent; - char name[32]; - bool field_4E; - bool field_4F; - uint32_t base_calc_time; - uint32_t calc_time; - uint32_t calc_time_max; - uint32_t disp_time; - uint32_t disp_time_max; + virtual bool Init(); + virtual bool Ctrl(); + virtual bool Dest(); + virtual void Disp(); + virtual void Basic(); + }; - Task(); - virtual ~Task(); + class Task : public TaskInterface { + public: + enum class Enum { + None = 0x00, + Init = 0x01, + Ctrl = 0x02, + Dest = 0x03, + Max = 0x04, + }; - virtual bool Init(); - virtual bool Ctrl(); - virtual bool Dest(); - virtual void Disp(); - virtual void Basic(); + int32_t priority; + Task* parent_task; + Enum field_18; + uint32_t field_1C; + uint32_t field_20; + Enum field_24; + uint32_t field_28; + bool field_2C; + bool is_frame_dependent; + char name[32]; + bool field_4E; + bool field_4F; + uint32_t base_calc_time; + uint32_t calc_time; + uint32_t calc_time_max; + uint32_t disp_time; + uint32_t disp_time_max; - uint32_t GetCalcTime(); - uint32_t GetCalcTimeMax(); - uint32_t GetDispTime(); - uint32_t GetDispTimeMax(); - char* GetName(); + Task(); + virtual ~Task(); - bool SetDest(); - void SetName(const char* name); - void SetPriority(int32_t priority); -}; + uint32_t GetCalcTime(); + uint32_t GetCalcTimeMax(); + uint32_t GetDispTime(); + uint32_t GetDispTimeMax(); + char* GetName(); -struct TaskWork; + bool SetDest(); + void SetName(const char* name); + void SetPriority(int32_t priority); + }; -extern TaskWork* task_work; + struct TaskWork; -struct TaskWork { - std::list tasks; - Task* current; - bool disp; + extern TaskWork* task_work; - TaskWork(); - ~TaskWork(); + struct TaskWork { + std::list tasks; + Task* current; + bool disp; - static bool AppendTask(Task* t, - const char* name = "(unknown)", int32_t priority = 1); - static bool AppendTask(Task* t, Task* parent_task = task_work->current, - const char* name = "(unknown)", int32_t priority = 1); - static void Basic(); - static bool CheckTaskReady(Task* t); - static void Ctrl(); - static void Disp(); - static Task* GetTaskByIndex(int32_t index); - static bool HasTask(Task* t); - static bool HasTaskDest(Task* t); -}; + TaskWork(); + ~TaskWork(); -extern void task_work_init(); -extern void task_work_free(); \ No newline at end of file + static bool AppendTask(Task* t, + const char* name = "(unknown)", int32_t priority = 1); + static bool AppendTask(Task* t, Task* parent_task = task_work->current, + const char* name = "(unknown)", int32_t priority = 1); + static void Basic(); + static bool CheckTaskReady(Task* t); + static void Ctrl(); + static void Disp(); + static Task* GetTaskByIndex(int32_t index); + static bool HasTask(Task* t); + static bool HasTaskInit(Task* t); + static bool HasTaskCtrl(Task* t); + static bool HasTaskDest(Task* t); + }; + + extern void task_work_init(); + extern void task_work_free(); +} diff --git a/src/CRE/texture.cpp b/src/CRE/texture.cpp index ed211422..1ba11628 100644 --- a/src/CRE/texture.cpp +++ b/src/CRE/texture.cpp @@ -4,7 +4,7 @@ */ #include "texture.hpp" -#include "../KKdLib/mat.h" +#include "../KKdLib/mat.hpp" #include "../KKdLib/txp.hpp" #include "gl_state.h" #include "static_var.h" diff --git a/src/CRE/texture.hpp b/src/CRE/texture.hpp index d3c7c2d3..cd1444ea 100644 --- a/src/CRE/texture.hpp +++ b/src/CRE/texture.hpp @@ -6,8 +6,8 @@ #pragma once #include -#include "../KKdLib/default.h" -#include "../KKdLib/image.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/image.hpp" #include "../KKdLib/txp.hpp" #include diff --git a/src/CRE/time.h b/src/CRE/time.h index c34f4ebc..8237c3a8 100644 --- a/src/CRE/time.h +++ b/src/CRE/time.h @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" struct time_struct { LARGE_INTEGER timestamp; diff --git a/src/CRE/timer.h b/src/CRE/timer.h index 633c2e72..ea046e65 100644 --- a/src/CRE/timer.h +++ b/src/CRE/timer.h @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" #include "lock.h" #include "time.h" diff --git a/src/DivaGL/DivaGL.vcxproj b/src/DivaGL/DivaGL.vcxproj index 939285dc..88c70149 100644 --- a/src/DivaGL/DivaGL.vcxproj +++ b/src/DivaGL/DivaGL.vcxproj @@ -494,22 +494,26 @@ del "$(SolutionDir)bin\$(TargetName).lib" - - - - - - + + + + + + + + - - - - - + + + + + + + \ No newline at end of file diff --git a/src/DivaGL/bone_data.c b/src/DivaGL/bone_data.cpp similarity index 88% rename from src/DivaGL/bone_data.c rename to src/DivaGL/bone_data.cpp index 958b1b72..162beda3 100644 --- a/src/DivaGL/bone_data.c +++ b/src/DivaGL/bone_data.cpp @@ -3,8 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "bone_data.h" -#include "../KKdLib/interpolation.h" +#include "bone_data.hpp" typedef enum HeapCMallocType { HeapCMallocSystem = 0x00, @@ -33,12 +32,12 @@ typedef struct struc_404 { int32_t field_4; } struc_404; -ex_node_block_vtbl* ex_osage_block_vftable = (ex_node_block_vtbl*)0x0000000140A82F88; -ex_node_block_vtbl* ex_node_block_vftable = (ex_node_block_vtbl*)0x0000000140A82DC8; +ExNodeBlock_vtbl* ExOsageBlock_vftable = (ExNodeBlock_vtbl*)0x0000000140A82F88; +ExNodeBlock_vtbl* ExNodeBlock_vftable = (ExNodeBlock_vtbl*)0x0000000140A82DC8; -static const aft_object_info aft_object_info_null = { (uint16_t)-1, (uint16_t)-1 }; +static const object_info object_info_null = { (uint16_t)-1, (uint16_t)-1 }; -static aft_bone_database_struct** bone_database_ptr = (aft_bone_database_struct**)0x00000000140FBC1C0; +static bone_database_struct** bone_database_ptr = (bone_database_struct**)0x00000000140FBC1C0; static struc_403** rob_cmn_mottbl_data_ptr = (struc_403**)0x00000001411E8258; static void* (*HeapCMallocAllocate)(HeapCMallocType type, size_t size, const char* name) = (void* (*)(HeapCMallocType, size_t, const char*))0x00000001403F2A00; @@ -77,7 +76,7 @@ static void bone_node_data_reset_position_rotation(bone_node_expression_data* da } static bone_data* bone_data_init(bone_data* bone) { - bone->type = (aft_bone_database_bone_type)0; + bone->type = (bone_database_bone_type)0; bone->has_parent = 0; bone->motion_bone_index = (motion_bone_index)0; bone->mirror = 0; @@ -97,53 +96,54 @@ static bone_data* bone_data_init(bone_data* bone) { bone->rot_mat[i] = mat4u_null; for (int32_t i = 0; i < 2; i++) - bone->trans_dup[i] = vec3_null; + bone->trans_prev[i] = vec3_null; - for (int32_t i = 0; i < 6; i++) - bone->rot_mat_dup[i] = mat4u_null; + for (int32_t i = 0; i < 2; i++) + for (int32_t j = 0; j < 3; j++) + bone->rot_mat_prev[i][j] = mat4u_null; bone->pole_target_mat = 0; bone->parent_mat = 0; bone->node = 0; - bone->field_2E0 = 0.0f; + bone->arm_length = 0.0f; bone->eyes_xrot_adjust_neg = 1.0f; bone->eyes_xrot_adjust_pos = 1.0f; return bone; } -static void aft_bone_database_bones_calculate_count(aft_bone_database_bone* bones, size_t* object_bone_count, +static void bone_database_bones_calculate_count(bone_database_bone* bones, size_t* object_bone_count, size_t* motion_bone_count, size_t* total_bone_count, size_t* ik_bone_count, size_t* chain_pos) { size_t _object_bone_count = 0; size_t _motion_bone_count = 0; size_t _total_bone_count = 0; size_t _ik_bone_count = 0; size_t _chain_pos = 0; - for (aft_bone_database_bone* i = bones; i->type != AFT_BONE_DATABASE_BONE_END; i++) + for (bone_database_bone* i = bones; i->type != BONE_DATABASE_BONE_END; i++) switch (i->type) { - case AFT_BONE_DATABASE_BONE_ROTATION: - case AFT_BONE_DATABASE_BONE_TYPE_1: - case AFT_BONE_DATABASE_BONE_POSITION: + case BONE_DATABASE_BONE_ROTATION: + case BONE_DATABASE_BONE_TYPE_1: + case BONE_DATABASE_BONE_POSITION: _object_bone_count++; _motion_bone_count++; _total_bone_count++; _chain_pos++; break; - case AFT_BONE_DATABASE_BONE_POSITION_ROTATION: + case BONE_DATABASE_BONE_POSITION_ROTATION: _object_bone_count++; _motion_bone_count++; _total_bone_count++; _ik_bone_count++; _chain_pos++; break; - case AFT_BONE_DATABASE_BONE_HEAD_IK_ROTATION: + case BONE_DATABASE_BONE_HEAD_IK_ROTATION: _object_bone_count++; _motion_bone_count++; _total_bone_count += 3; _ik_bone_count++; _chain_pos += 2; break; - case AFT_BONE_DATABASE_BONE_ARM_IK_ROTATION: - case AFT_BONE_DATABASE_BONE_LEGS_IK_ROTATION: + case BONE_DATABASE_BONE_ARM_IK_ROTATION: + case BONE_DATABASE_BONE_LEGS_IK_ROTATION: _object_bone_count += 3; _motion_bone_count++; _total_bone_count += 4; @@ -158,40 +158,40 @@ static void aft_bone_database_bones_calculate_count(aft_bone_database_bone* bone *chain_pos = _chain_pos; } -static aft_bone_database_skeleton* aft_bone_database_get_skeleton_by_type(aft_bone_database_skeleton_type type) { - if (type == AFT_BONE_DATABASE_SKELETON_NONE || !*bone_database_ptr +static bone_database_skeleton* bone_database_get_skeleton_by_type(bone_database_skeleton_type type) { + if (type == BONE_DATABASE_SKELETON_NONE || !*bone_database_ptr || (*bone_database_ptr)->signature != 0x9102720) return 0; return (*bone_database_ptr)->skeletons[type]; } -static aft_bone_database_bone* aft_bone_database_get_bones_by_type(aft_bone_database_skeleton_type type) { - aft_bone_database_skeleton* skel = aft_bone_database_get_skeleton_by_type(type); +static bone_database_bone* bone_database_get_bones_by_type(bone_database_skeleton_type type) { + bone_database_skeleton* skel = bone_database_get_skeleton_by_type(type); if (!skel) return 0; return skel->bones; } -static uint16_t* aft_bone_database_get_skeleton_parent_indices_by_type(aft_bone_database_skeleton_type type) { - aft_bone_database_skeleton* skel = aft_bone_database_get_skeleton_by_type(type); +static uint16_t* bone_database_get_skeleton_parent_indices_by_type(bone_database_skeleton_type type) { + bone_database_skeleton* skel = bone_database_get_skeleton_by_type(type); if (!skel) return 0; return skel->parent_indices; } -static vec3* aft_bone_database_get_skeleton_positions_by_type(aft_bone_database_skeleton_type type) { - aft_bone_database_skeleton* skel = aft_bone_database_get_skeleton_by_type(type); +static vec3* bone_database_get_skeleton_positions_by_type(bone_database_skeleton_type type) { + bone_database_skeleton* skel = bone_database_get_skeleton_by_type(type); if (!skel) return 0; return skel->positions; } -static float_t aft_bone_database_get_skeleton_heel_height(aft_bone_database_skeleton_type a1) { - aft_bone_database_skeleton* skel = aft_bone_database_get_skeleton_by_type(a1); +static float_t bone_database_get_skeleton_heel_height(bone_database_skeleton_type a1) { + bone_database_skeleton* skel = bone_database_get_skeleton_by_type(a1); if (skel) return skel->heel_height[0]; else @@ -245,14 +245,14 @@ static void rob_chara_bone_data_reserve(rob_chara_bone_data* rob_bone_data) { } static void rob_chara_bone_data_calculate_bones(rob_chara_bone_data* rob_bone_data, - aft_bone_database_bone* bones) { - aft_bone_database_bones_calculate_count(bones, &rob_bone_data->object_bone_count, + bone_database_bone* bones) { + bone_database_bones_calculate_count(bones, &rob_bone_data->object_bone_count, &rob_bone_data->motion_bone_count, &rob_bone_data->total_bone_count, &rob_bone_data->ik_bone_count, &rob_bone_data->chain_pos); } static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, - aft_bone_database_bone* a2) { + bone_database_bone* a2) { size_t chain_pos = 0; size_t ik_bone_count = 0; size_t total_bone_count = 0; @@ -260,24 +260,24 @@ static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, mat4* mats = rob_bone_data->mats.begin; mat4* mats2 = rob_bone_data->mats2.begin; bone_node* nodes = rob_bone_data->nodes.begin; - for (aft_bone_database_bone* i = a2; i->type != AFT_BONE_DATABASE_BONE_END; i++) + for (bone_database_bone* i = a2; i->type != BONE_DATABASE_BONE_END; i++) switch (i->type) { - case AFT_BONE_DATABASE_BONE_ROTATION: - case AFT_BONE_DATABASE_BONE_TYPE_1: - case AFT_BONE_DATABASE_BONE_POSITION: + case BONE_DATABASE_BONE_ROTATION: + case BONE_DATABASE_BONE_TYPE_1: + case BONE_DATABASE_BONE_POSITION: (nodes++)->mat = mats++; chain_pos++; total_bone_count++; break; - case AFT_BONE_DATABASE_BONE_POSITION_ROTATION: + case BONE_DATABASE_BONE_POSITION_ROTATION: (nodes++)->mat = mats++; chain_pos++; ik_bone_count++; total_bone_count++; break; - case AFT_BONE_DATABASE_BONE_HEAD_IK_ROTATION: + case BONE_DATABASE_BONE_HEAD_IK_ROTATION: (nodes++)->mat = mats2++; (nodes++)->mat = mats++; (nodes++)->mat = mats2++; @@ -286,8 +286,8 @@ static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, ik_bone_count++; total_bone_count += 3; break; - case AFT_BONE_DATABASE_BONE_ARM_IK_ROTATION: - case AFT_BONE_DATABASE_BONE_LEGS_IK_ROTATION: + case BONE_DATABASE_BONE_ARM_IK_ROTATION: + case BONE_DATABASE_BONE_LEGS_IK_ROTATION: (nodes++)->mat = mats++; (nodes++)->mat = mats++; (nodes++)->mat = mats++; @@ -351,21 +351,21 @@ static void bone_data_parent_load_rob_chara(bone_data_parent* a1) { } static void bone_data_parent_load_bone_database(bone_data_parent* bone, - aft_bone_database_bone* bones, vec3* common_translation, vec3* translation) { + bone_database_bone* bones, vec3* common_translation, vec3* translation) { rob_chara_bone_data* rob_bone_data = bone->rob_bone_data; size_t chain_pos = 0; size_t total_bone_count = 0; size_t ik_bone_count = 0; - aft_bone_database_bone* v15 = bones; + bone_database_bone* v15 = bones; bone_data* v16 = bone->bones.begin; - for (size_t i = 0; v15->type != AFT_BONE_DATABASE_BONE_END; i++, v15++, v16++) { + for (size_t i = 0; v15->type != BONE_DATABASE_BONE_END; i++, v15++, v16++) { v16->motion_bone_index = (motion_bone_index)i; - v16->type = (aft_bone_database_bone_type)v15->type; + v16->type = (bone_database_bone_type)v15->type; v16->mirror = v15->mirror; v16->parent = v15->parent; v16->flags = v15->flags; - if (v15->type >= AFT_BONE_DATABASE_BONE_POSITION_ROTATION) + if (v15->type >= BONE_DATABASE_BONE_POSITION_ROTATION) v16->key_set_count = 6; else v16->key_set_count = 3; @@ -380,18 +380,18 @@ static void bone_data_parent_load_bone_database(bone_data_parent* bone, v16->pole_target_mat = 0; switch (v15->type) { - case AFT_BONE_DATABASE_BONE_ROTATION: - case AFT_BONE_DATABASE_BONE_TYPE_1: - case AFT_BONE_DATABASE_BONE_POSITION: + case BONE_DATABASE_BONE_ROTATION: + case BONE_DATABASE_BONE_TYPE_1: + case BONE_DATABASE_BONE_POSITION: chain_pos++; total_bone_count++; break; - case AFT_BONE_DATABASE_BONE_POSITION_ROTATION: + case BONE_DATABASE_BONE_POSITION_ROTATION: chain_pos++; ik_bone_count++; total_bone_count++; break; - case AFT_BONE_DATABASE_BONE_HEAD_IK_ROTATION: + case BONE_DATABASE_BONE_HEAD_IK_ROTATION: v16->ik_segment_length[0] = (common_translation++)->x; v16->ik_segment_length[1] = (translation++)->x; @@ -399,8 +399,8 @@ static void bone_data_parent_load_bone_database(bone_data_parent* bone, ik_bone_count++; total_bone_count += 3; break; - case AFT_BONE_DATABASE_BONE_ARM_IK_ROTATION: - case AFT_BONE_DATABASE_BONE_LEGS_IK_ROTATION: + case BONE_DATABASE_BONE_ARM_IK_ROTATION: + case BONE_DATABASE_BONE_LEGS_IK_ROTATION: v16->ik_segment_length[0] = (common_translation++)->x; v16->ik_segment_length[1] = (translation++)->x; v16->ik_2nd_segment_length[0] = (common_translation++)->x; @@ -429,9 +429,9 @@ static void bone_data_parent_load_bone_database(bone_data_parent* bone, static void bone_data_parent_data_init(bone_data_parent* bone, rob_chara_bone_data* rob_bone_data) { bone->rob_bone_data = rob_bone_data; - aft_bone_database_bone* common_bone_data = aft_bone_database_get_bones_by_type(rob_bone_data->base_skeleton_type); - vec3* common_translation = aft_bone_database_get_skeleton_positions_by_type(rob_bone_data->base_skeleton_type); - vec3* translation = aft_bone_database_get_skeleton_positions_by_type(rob_bone_data->skeleton_type); + bone_database_bone* common_bone_data = bone_database_get_bones_by_type(rob_bone_data->base_skeleton_type); + vec3* common_translation = bone_database_get_skeleton_positions_by_type(rob_bone_data->base_skeleton_type); + vec3* translation = bone_database_get_skeleton_positions_by_type(rob_bone_data->skeleton_type); bone_data_parent_load_rob_chara(bone); bone_data_parent_load_bone_database(bone, common_bone_data, common_translation, translation); } @@ -474,7 +474,7 @@ static void mot_key_data_reserve_key_sets(mot_key_data* a1) { a1->key_sets_ready = true; } -static void mot_key_data_init_key_sets(mot_key_data* a1, aft_bone_database_skeleton_type type, +static void mot_key_data_init_key_sets(mot_key_data* a1, bone_database_skeleton_type type, size_t motion_bone_count, size_t ik_bone_count) { mot_key_data_get_key_set_count(a1, motion_bone_count, ik_bone_count); mot_key_data_reserve_key_sets(a1); @@ -846,8 +846,9 @@ static void bone_data_mult_1_ik_hands(bone_data* a1, vec3* a2) { return; len = sqrtf(len); - if (len != 0.0f) + if (len != 0.0f) { vec3_mult_scalar(v17, 1.0f / len, v17); + } vec3 v16; vec3_cross(v17, v15, v16); @@ -1124,7 +1125,7 @@ static bool bone_data_mult_1_exp_data(bone_data* a1, bone_node_expression_data* } void bone_data_mult_ik(bone_data* a1, int32_t skeleton_select) { - if (a1->type < AFT_BONE_DATABASE_BONE_HEAD_IK_ROTATION) + if (a1->type < BONE_DATABASE_BONE_HEAD_IK_ROTATION) return; mat4 mat; @@ -1164,7 +1165,7 @@ void bone_data_mult_ik(bone_data* a1, int32_t skeleton_select) { } } - if (a1->type == AFT_BONE_DATABASE_BONE_HEAD_IK_ROTATION) { + if (a1->type == BONE_DATABASE_BONE_HEAD_IK_ROTATION) { mat4_transpose(&rot_mat, &a1->rot_mat[1]); mat4_transpose(&mat, a1->node[1].mat); mat4_translate_mult(&mat, a1->ik_segment_length[skeleton_select], 0.0f, 0.0f, &mat); @@ -1179,9 +1180,9 @@ void bone_data_mult_ik(bone_data* a1, int32_t skeleton_select) { float_t v24; float_t v25; if (v8 > 0.000001f) { - float_t v26 = a1->field_2E0; - if (v26 > 0.0001f) { - float_t v27 = (v21 + v20) * v26; + float_t arm_length = a1->arm_length; + if (arm_length > 0.0001f) { + float_t v27 = (v21 + v20) * arm_length; if (v10 > v27) { v10 = v27; v8 = v27 * v27; @@ -1196,7 +1197,7 @@ void bone_data_mult_ik(bone_data* a1, int32_t skeleton_select) { v24 = sqrtf(1.0f - v23 * v23); v25 = sqrtf(1.0f - v22 * v22); - if (a1->type == AFT_BONE_DATABASE_BONE_LEGS_IK_ROTATION) + if (a1->type == BONE_DATABASE_BONE_LEGS_IK_ROTATION) v24 = -v24; else v25 = -v25; @@ -1231,18 +1232,18 @@ static void bone_data_mult_0(bone_data* a1, int32_t skeleton_select) { else mat = mat4_identity; - if (a1->type == AFT_BONE_DATABASE_BONE_POSITION) { + if (a1->type == BONE_DATABASE_BONE_POSITION) { mat4_translate_mult(&mat, a1->trans.x, a1->trans.y, a1->trans.z, &mat); a1->rot_mat[0] = mat4u_identity; } - else if (a1->type == AFT_BONE_DATABASE_BONE_TYPE_1) { + else if (a1->type == BONE_DATABASE_BONE_TYPE_1) { mat4_mult_vec3_inv_trans(&mat, &a1->trans, &a1->trans); mat4_translate_mult(&mat, a1->trans.x, a1->trans.y, a1->trans.z, &mat); a1->rot_mat[0] = mat4u_identity; } else { mat4 rot_mat; - if (a1->type == AFT_BONE_DATABASE_BONE_POSITION_ROTATION) { + if (a1->type == BONE_DATABASE_BONE_POSITION_ROTATION) { mat4_transpose(&a1->rot_mat[0], &rot_mat); mat4_rotate_z_mult(&rot_mat, a1->rotation.z, &rot_mat); } @@ -1280,8 +1281,8 @@ void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, bool a4) { else mat4_transpose(parent_mat, &mat); - if (a1->type != AFT_BONE_DATABASE_BONE_TYPE_1 && a1->type != AFT_BONE_DATABASE_BONE_POSITION) { - if (a1->type != AFT_BONE_DATABASE_BONE_POSITION_ROTATION) + if (a1->type != BONE_DATABASE_BONE_TYPE_1 && a1->type != BONE_DATABASE_BONE_POSITION) { + if (a1->type != BONE_DATABASE_BONE_POSITION_ROTATION) a1->trans = a1->base_translation[1]; mat4_translate_mult(&mat, a1->trans.x, a1->trans.y, a1->trans.z, &mat); @@ -1329,7 +1330,7 @@ void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, bool a4) { bone_node_expression_data_reset_scale(&a1->node[0].exp_data); } - if (a1->type < AFT_BONE_DATABASE_BONE_HEAD_IK_ROTATION) + if (a1->type < BONE_DATABASE_BONE_HEAD_IK_ROTATION) return; mat4_transpose(&a1->rot_mat[1], &rot_mat); @@ -1337,7 +1338,7 @@ void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, bool a4) { mat4_transpose(&mat, a1->node[1].mat); mat4_translate_mult(&mat, a1->ik_segment_length[1], 0.0f, 0.0f, &mat); - if (a1->type == AFT_BONE_DATABASE_BONE_HEAD_IK_ROTATION) { + if (a1->type == BONE_DATABASE_BONE_HEAD_IK_ROTATION) { mat4_transpose(&mat, a1->node[2].mat); if (!a4) return; @@ -1438,9 +1439,9 @@ static void sub_14040FBF0(motion_blend_mot* a1, float_t a2) { } static bool sub_1404136B0(motion_blend_mot* a1) { - motion_blend* v1 = a1->blend; + MotionBlend* v1 = a1->blend; if (v1) - return v1->__vftable->field_30(v1); + return v1->__vftable->Field30(v1); else return false; } @@ -1450,11 +1451,11 @@ static bool sub_140410250(struc_313* a1, size_t a2) { } static void sub_140410A40(motion_blend_mot* a1, vector_old_bone_data* a2, vector_old_bone_data* a3) { - motion_blend* v1 = a1->blend; - if (!v1 || !v1->field_9) + MotionBlend* v1 = a1->blend; + if (!v1 || !v1->rot_y) return; - v1->__vftable->field_20(v1, a2, a3); + v1->__vftable->Field20(v1, a2, a3); for (bone_data* i = a2->begin; i != a2->end; i++) { if (!sub_140410250(&a1->field_0.field_8, i->motion_bone_index)) continue; @@ -1462,16 +1463,16 @@ static void sub_140410A40(motion_blend_mot* a1, vector_old_bone_data* a2, vector bone_data* v8 = 0; if (a3) v8 = &a3->begin[i->motion_bone_index]; - v1->__vftable->field_28(v1, &a2->begin[i->motion_bone_index], v8); + v1->__vftable->Blend(v1, &a2->begin[i->motion_bone_index], v8); } } static void sub_140410B70(motion_blend_mot* a1, vector_old_bone_data* a2) { - motion_blend* v1 = a1->blend; - if (!v1 || !v1->field_9) + MotionBlend* v1 = a1->blend; + if (!v1 || !v1->rot_y) return; - v1->__vftable->field_20(v1, &a1->bone_data.bones, a2); + v1->__vftable->Field20(v1, &a1->bone_data.bones, a2); for (bone_data* i = a1->bone_data.bones.begin; i != a1->bone_data.bones.end; i++) { if (!sub_140410250(&a1->field_0.field_8, i->motion_bone_index)) continue; @@ -1479,12 +1480,12 @@ static void sub_140410B70(motion_blend_mot* a1, vector_old_bone_data* a2) { bone_data* v6 = 0; if (a2) v6 = &a2->begin[i->motion_bone_index]; - v1->__vftable->field_28(a1->blend, &a1->bone_data.bones.begin[i->motion_bone_index], v6); + v1->__vftable->Blend(a1->blend, &a1->bone_data.bones.begin[i->motion_bone_index], v6); } } -static motion_blend_type sub_1404125C0(motion_blend_mot* a1) { - motion_blend* v1 = a1->blend; +static MotionBlendType sub_1404125C0(motion_blend_mot* a1) { + MotionBlend* v1 = a1->blend; if (v1 == &a1->cross.base) return MOTION_BLEND_CROSS; if (v1 == &a1->freeze.base) @@ -1495,13 +1496,13 @@ static motion_blend_type sub_1404125C0(motion_blend_mot* a1) { } static void sub_140410CB0(mot_blend* a1, vector_old_bone_data* a2) { - motion_blend* v1 = &a1->blend.base; - if (!v1->field_9) + MotionBlend* v1 = &a1->blend.base; + if (!v1->rot_y) return; for (bone_data* i = a2->begin; i != a2->end; i++) if (sub_140410250(&a1->field_0.field_8, i->motion_bone_index)) - v1->__vftable->field_28(&a1->blend.base, &a2->begin[i->motion_bone_index], 0); + v1->__vftable->Blend(&a1->blend.base, &a2->begin[i->motion_bone_index], 0); } static void sub_1404182B0(rob_chara_bone_data* rob_bone_data) { @@ -1582,22 +1583,6 @@ void rob_chara_bone_data_update(rob_chara_bone_data* rob_bone_data, mat4* a2) { motion_blend_mot_mult_mat(rob_bone_data->motion_loaded.head->next->value, a2); } -static mot_blend* mot_blend_init(mot_blend* a1) { - memset(a1, 0, sizeof(mot_blend)); - a1->mot_key_data.frame = -1.0f; - a1->mot_key_data.motion_id = -1; - a1->mot_play_data.frame_data.field_8 = 1.0f; - a1->mot_play_data.frame_data.field_4 = 1.0f; - a1->mot_play_data.frame_data.field_10 = -1.0f; - a1->mot_play_data.frame_data.field_14 = -1.0f; - a1->mot_play_data.frame_data.field_18 = -1; - a1->mot_play_data.frame_data.field_1C = -1; - a1->mot_play_data.frame_data.field_24 = -1.0f; - a1->mot_play_data.frame_data.field_2C = -1; - a1->blend.base.field_14 = 1.0f; - return a1; -} - static void rob_chara_bone_data_eyes_xrot_adjust(rob_chara_bone_data* rob_bone_data, struc_241* a2, eyes_adjust* a3) { float_t v1_neg; @@ -1642,17 +1627,17 @@ static void rob_chara_bone_data_eyes_xrot_adjust(rob_chara_bone_data* rob_bone_d } static void rob_chara_bone_data_init_skeleton(rob_chara_bone_data* rob_bone_data, - aft_bone_database_skeleton_type base_skeleton_type, - aft_bone_database_skeleton_type skeleton_type) { + bone_database_skeleton_type base_skeleton_type, + bone_database_skeleton_type skeleton_type) { if (rob_bone_data->base_skeleton_type == base_skeleton_type && rob_bone_data->skeleton_type == skeleton_type) return; - aft_bone_database_bone* bones = aft_bone_database_get_bones_by_type(base_skeleton_type); + bone_database_bone* bones = bone_database_get_bones_by_type(base_skeleton_type); rob_chara_bone_data_calculate_bones(rob_bone_data, bones); rob_chara_bone_data_reserve(rob_bone_data); rob_chara_bone_data_set_mats(rob_bone_data, bones); - uint16_t* parent_indices = aft_bone_database_get_skeleton_parent_indices_by_type(base_skeleton_type); + uint16_t* parent_indices = bone_database_get_skeleton_parent_indices_by_type(base_skeleton_type); rob_chara_bone_data_set_parent_mats(rob_bone_data, parent_indices); rob_bone_data->base_skeleton_type = base_skeleton_type; rob_bone_data->skeleton_type = skeleton_type; @@ -1690,33 +1675,33 @@ static bool mot_blend_eyelid_check(motion_bone_index bone_index) { || (bone_index >= MOTION_BONE_N_MABU_L_D_A && bone_index <= MOTION_BONE_TL_MABU_R_U_C_WJ); } -static void mot_key_data_get_key_set_count_by_bone_database_bones(mot_key_data* a1, aft_bone_database_bone* bones) { +static void mot_key_data_get_key_set_count_by_bone_database_bones(mot_key_data* a1, bone_database_bone* bones) { size_t object_bone_count; size_t motion_bone_count; size_t total_bone_count; size_t ik_bone_count; size_t chain_pos; - aft_bone_database_bones_calculate_count(bones, &object_bone_count, + bone_database_bones_calculate_count(bones, &object_bone_count, &motion_bone_count, &total_bone_count, &ik_bone_count, &chain_pos); mot_key_data_get_key_set_count(a1, motion_bone_count, ik_bone_count); } static void mot_key_data_reserve_key_sets_by_skeleton_type(mot_key_data* a1, - aft_bone_database_skeleton_type type) { - mot_key_data_get_key_set_count_by_bone_database_bones(a1, aft_bone_database_get_bones_by_type(type)); + bone_database_skeleton_type type) { + mot_key_data_get_key_set_count_by_bone_database_bones(a1, bone_database_get_bones_by_type(type)); mot_key_data_reserve_key_sets(a1); a1->skeleton_type = type; } -static void mot_blend_reserve_key_sets(mot_blend* blend, aft_bone_database_skeleton_type type, +static void mot_blend_reserve_key_sets(mot_blend* blend, bone_database_skeleton_type type, bool(*a3)(motion_bone_index), size_t motion_bone_count) { mot_key_data_reserve_key_sets_by_skeleton_type(&blend->mot_key_data, type); sub_140413350(&blend->field_0, a3, motion_bone_count); } static void rob_chara_bone_data_init_data(rob_chara_bone_data* rob_bone_data, - aft_bone_database_skeleton_type base_type, - aft_bone_database_skeleton_type type) { + bone_database_skeleton_type base_type, + bone_database_skeleton_type type) { rob_chara_bone_data_init_skeleton(rob_bone_data, base_type, type); for (motion_blend_mot** i = rob_bone_data->motions.begin; i != rob_bone_data->motions.end; i++) motion_blend_mot_load_bone_data(*i, rob_bone_data, motion_blend_mot_check); @@ -1744,7 +1729,6 @@ static void sub_140506C20(struc_523* a1) { a1->field_1 = 0; a1->field_4 = 0; a1->field_8 = 0; - a1->field_9 = 0; a1->field_C = 0; a1->field_10 = 0; a1->field_1C = 0; @@ -1789,23 +1773,23 @@ static void sub_140505C90(struc_264* a1) { a1->field_0 = 0; a1->field_4.field_0 = 0; sub_140548350(&a1->field_4.field_4); - a1->field_4.field_C = -1; + a1->field_4.motion_id = -1; a1->field_4.field_10 = 0; a1->field_18.field_0 = 0; sub_140548350(&a1->field_18.field_4); - a1->field_18.field_C = -1; + a1->field_18.motion_id = -1; a1->field_18.field_10 = 0; a1->field_2C.field_0 = 0; sub_140548350(&a1->field_2C.field_4); - a1->field_2C.field_C = -1; + a1->field_2C.motion_id = -1; a1->field_2C.field_10 = 0; a1->field_40.field_0 = 0; sub_140548350(&a1->field_40.field_4); - a1->field_40.field_C = -1; + a1->field_40.motion_id = -1; a1->field_40.field_10 = 0; a1->field_54.field_0 = 0; sub_140548350(&a1->field_54.field_4); - a1->field_54.field_C = -1; + a1->field_54.motion_id = -1; a1->field_54.field_10 = 0; a1->field_68 = 0; a1->field_6C = 0; @@ -1827,7 +1811,7 @@ static void sub_140505C90(struc_264* a1) { a1->field_A8 = 0; sub_140507140(&a1->field_AC); a1->field_B0 = 0; - a1->eyes_adjust = 0; + a1->field_B4 = 0; sub_140506C20(&a1->field_B8); a1->field_140 = 0; a1->field_144 = 0; @@ -1873,16 +1857,16 @@ static void sub_140505C90(struc_264* a1) { a1->field_1D4 = 0; } -static void rob_sub_action_init_sub(rob_sub_action* sub_act) { +static void rob_sub_action_reset(RobSubAction* sub_act) { sub_act->data.field_0 = 0; sub_act->data.field_8 = 0; sub_act->data.field_10 = 0; sub_act->data.field_18 = 0; - sub_act->data.cry.base.__vftable->field_8(&sub_act->data.cry.base); - sub_act->data.shake_hand.base.__vftable->field_8(&sub_act->data.shake_hand.base); - sub_act->data.embarrassed.base.__vftable->field_8(&sub_act->data.embarrassed.base); - sub_act->data.angry.base.__vftable->field_8(&sub_act->data.angry.base); - sub_act->data.laugh.base.__vftable->field_8(&sub_act->data.laugh.base); + sub_act->data.cry.base.__vftable->Field_8(&sub_act->data.cry.base); + sub_act->data.shake_hand.base.__vftable->Field_8(&sub_act->data.shake_hand.base); + sub_act->data.embarrassed.base.__vftable->Field_8(&sub_act->data.embarrassed.base); + sub_act->data.angry.base.__vftable->Field_8(&sub_act->data.angry.base); + sub_act->data.laugh.base.__vftable->Field_8(&sub_act->data.laugh.base); } static int32_t* sub_140507180(int32_t* a1) { @@ -1890,7 +1874,7 @@ static int32_t* sub_140507180(int32_t* a1) { return a1; } -static void sub_140506440(rob_chara_adjust* a1) { +static void rob_chara_motion_reset(rob_chara_motion* a1) { a1->motion_id = -1; a1->prev_motion_id = -1; a1->frame_data.frame = 0.0f; @@ -1898,7 +1882,7 @@ static void sub_140506440(rob_chara_adjust* a1) { a1->frame_data.last_set_frame = 0.0f; a1->step_data.frame = 0.0f; a1->step_data.field_4 = 0.0f; - a1->step_data.field_8 = -1.0f; + a1->step_data.step = -1.0f; a1->step = -1.0f; a1->field_24 = 0; a1->field_28 = 0; @@ -1917,35 +1901,37 @@ static void sub_140506440(rob_chara_adjust* a1) { a1->field_13C = 1.0f; a1->field_140 = 0; a1->field_144 = 0; - a1->field_150.field_0.base.__vftable->field_8(&a1->field_150.field_0.base); - a1->field_150.field_48.base.__vftable->field_8(&a1->field_150.field_48.base); - a1->field_150.field_90.base.__vftable->field_8(&a1->field_150.field_90.base); - a1->field_150.field_D8.base.__vftable->field_8(&a1->field_150.field_D8.base); - a1->field_150.field_120.base.__vftable->field_8(&a1->field_150.field_120.base); - a1->field_150.field_168.base.__vftable->field_8(&a1->field_150.field_168.base); - a1->field_150.field_1B0 = aft_object_info_null; - a1->field_150.field_1B4 = aft_object_info_null; - a1->field_150.field_1B8 = aft_object_info_null; - a1->field_150.field_1BC = aft_object_info_null; + a1->field_150.face.base.__vftable->Reset(&a1->field_150.face.base); + a1->field_150.hand_l.base.__vftable->Reset(&a1->field_150.hand_l.base); + a1->field_150.hand_r.base.__vftable->Reset(&a1->field_150.hand_r.base); + a1->field_150.mouth.base.__vftable->Reset(&a1->field_150.mouth.base); + a1->field_150.eye.base.__vftable->Reset(&a1->field_150.eye.base); + a1->field_150.eyelid.base.__vftable->Reset(&a1->field_150.eyelid.base); + a1->field_150.head_object = object_info_null; + a1->field_150.hand_l_object = object_info_null; + a1->field_150.hand_r_object = object_info_null; + a1->field_150.face_object = object_info_null; a1->field_150.field_1C0 = 0; - a1->field_150.field_1C4 = 0.0f; - a1->field_318.base.__vftable->field_8(&a1->field_318); - a1->field_360.base.__vftable->field_8(&a1->field_360); - a1->field_3A8 = aft_object_info_null; - a1->field_3B0.field_0.base.__vftable->field_8(&a1->field_3B0.field_0.base); - a1->field_3B0.field_48.base.__vftable->field_8(&a1->field_3B0.field_48.base); - a1->field_3B0.field_90.base.__vftable->field_8(&a1->field_3B0.field_90.base); - a1->field_3B0.field_D8.base.__vftable->field_8(&a1->field_3B0.field_D8.base); - a1->field_3B0.field_120.base.__vftable->field_8(&a1->field_3B0.field_120.base); - a1->field_3B0.field_168.base.__vftable->field_8(&a1->field_3B0.field_168.base); - a1->field_3B0.field_1B0 = aft_object_info_null; - a1->field_3B0.field_1B4 = aft_object_info_null; - a1->field_3B0.field_1B8 = aft_object_info_null; - a1->field_3B0.field_1BC = aft_object_info_null; + a1->field_150.time = 0.0f; + a1->hand_l.base.__vftable->Reset(&a1->hand_l.base); + a1->hand_r.base.__vftable->Reset(&a1->hand_r.base); + a1->hand_l_object = object_info_null; + a1->hand_r_object = object_info_null; + a1->field_3B0.face.base.__vftable->Reset(&a1->field_3B0.face.base); + a1->field_3B0.hand_l.base.__vftable->Reset(&a1->field_3B0.hand_l.base); + a1->field_3B0.hand_r.base.__vftable->Reset(&a1->field_3B0.hand_r.base); + a1->field_3B0.mouth.base.__vftable->Reset(&a1->field_3B0.mouth.base); + a1->field_3B0.eye.base.__vftable->Reset(&a1->field_3B0.eye.base); + a1->field_3B0.eyelid.base.__vftable->Reset(&a1->field_3B0.eyelid.base); + a1->field_3B0.head_object = object_info_null; + a1->field_3B0.hand_l_object = object_info_null; + a1->field_3B0.hand_r_object = object_info_null; + a1->field_3B0.face_object = object_info_null; a1->field_3B0.field_1C0 = 0; + a1->field_3B0.time = 0.0f; - rob_chara_data_parts_adjust* parts_adjust = a1->parts_adjust; - rob_chara_data_parts_adjust* parts_adjust_prev = a1->parts_adjust_prev; + rob_chara_data_adjust* parts_adjust = a1->parts_adjust; + rob_chara_data_adjust* parts_adjust_prev = a1->parts_adjust_prev; for (int32_t i = 0; i < 13; i++) { parts_adjust->enable = false; parts_adjust->frame = 0.0f; @@ -1959,9 +1945,9 @@ static void sub_140506440(rob_chara_adjust* a1) { parts_adjust->type = 6; parts_adjust->cycle_type = 0; parts_adjust->ignore_gravity = false; - parts_adjust->external_force_min = vec3_null; - parts_adjust->external_force_strength = vec3_null; parts_adjust->external_force = vec3_null; + parts_adjust->external_force_cycle_strength = vec3_null; + parts_adjust->external_force_cycle = vec3_null; parts_adjust->cycle = 1.0f; parts_adjust->phase = 0.0f; parts_adjust->force = 1.0f; @@ -1979,9 +1965,9 @@ static void sub_140506440(rob_chara_adjust* a1) { parts_adjust_prev->type = 6; parts_adjust_prev->cycle_type = 0; parts_adjust_prev->ignore_gravity = false; - parts_adjust_prev->external_force_min = vec3_null; - parts_adjust_prev->external_force_strength = vec3_null; parts_adjust_prev->external_force = vec3_null; + parts_adjust_prev->external_force_cycle_strength = vec3_null; + parts_adjust_prev->external_force_cycle = vec3_null; parts_adjust_prev->cycle = 1.0f; parts_adjust_prev->phase = 0.0f; parts_adjust_prev->force = 1.0f; @@ -1991,8 +1977,8 @@ static void sub_140506440(rob_chara_adjust* a1) { parts_adjust_prev++; } - rob_chara_data_parts_adjust* v7 = a1->field_10D8; - struc_222* v8 = a1->field_12C8; + rob_chara_data_adjust* v7 = &a1->adjust_global; + rob_chara_data_arm_adjust* v8 = a1->arm_adjust; rob_chara_data_hand_adjust* hand_adjust = a1->hand_adjust; rob_chara_data_hand_adjust* hand_adjust_prev = a1->hand_adjust_prev; for (int32_t i = 0; i < 2; i++) { @@ -2008,52 +1994,52 @@ static void sub_140506440(rob_chara_adjust* a1) { v7->type = 6; v7->cycle_type = 0; v7->ignore_gravity = false; - v7->external_force_min = vec3_null; - v7->external_force_strength = vec3_null; v7->external_force = vec3_null; + v7->external_force_cycle_strength = vec3_null; + v7->external_force_cycle = vec3_null; v7->cycle = 1.0f; v7->phase = 0.0f; v7->force = 1.0f; v7->strength = 1.0f; v7->strength_transition = 0.0f; - v8->field_0 = 0; - v8->field_4 = 0.0f; - v8->field_8 = 0.0f; - v8->field_C = 0.0f; + v8->enable = 0; + v8->value = 0.0f; + v8->prev_value = 0.0f; + v8->next_value = 0.0f; v8->duration = 0.0f; v8->frame = 0.0f; - hand_adjust->field_0 = 0; - hand_adjust->field_2 = 0; - hand_adjust->field_4 = -1; - hand_adjust->field_8 = 1.0f; - hand_adjust->field_C = 1.0f; - hand_adjust->field_10 = 0.0f; - hand_adjust->field_14 = 0.0f; - hand_adjust->field_18 = 1.0f; - hand_adjust->field_1C = 1.0f; - hand_adjust->field_20 = 0; - hand_adjust->field_21 = 0; - hand_adjust->field_22 = 0; - hand_adjust->field_23 = 0; - hand_adjust->field_24 = vec3_null; + hand_adjust->enable = false; + hand_adjust->scale_select = 0; + hand_adjust->type = ROB_CHARA_DATA_HAND_ADJUST_NONE; + hand_adjust->current_scale = 1.0f; + hand_adjust->scale = 1.0f; + hand_adjust->duration = 0.0f; + hand_adjust->current_time = 0.0f; + hand_adjust->rotation_blend = 1.0f; + hand_adjust->scale_blend = 1.0f; + hand_adjust->enable_scale = false; + hand_adjust->disable_x = false; + hand_adjust->disable_y = false; + hand_adjust->disable_z = false; + hand_adjust->offset = vec3_null; hand_adjust->field_30 = vec3_null; - hand_adjust->field_3C = 0; - hand_adjust_prev->field_0 = 0; - hand_adjust_prev->field_2 = 0; - hand_adjust_prev->field_4 = -1; - hand_adjust_prev->field_8 = 1.0f; - hand_adjust_prev->field_C = 1.0f; - hand_adjust_prev->field_10 = 0.0f; - hand_adjust_prev->field_14 = 0.0f; - hand_adjust_prev->field_18 = 1.0f; - hand_adjust_prev->field_1C = 1.0f; - hand_adjust_prev->field_20 = 0; - hand_adjust_prev->field_21 = 0; - hand_adjust_prev->field_22 = 0; - hand_adjust_prev->field_23 = 0; - hand_adjust_prev->field_24 = vec3_null; + hand_adjust->arm_length = 0; + hand_adjust_prev->enable = false; + hand_adjust_prev->scale_select = 0; + hand_adjust_prev->type = ROB_CHARA_DATA_HAND_ADJUST_NONE; + hand_adjust_prev->current_scale = 1.0f; + hand_adjust_prev->scale = 1.0f; + hand_adjust_prev->duration = 0.0f; + hand_adjust_prev->current_time = 0.0f; + hand_adjust_prev->rotation_blend = 1.0f; + hand_adjust_prev->scale_blend = 1.0f; + hand_adjust_prev->enable_scale = false; + hand_adjust_prev->disable_x = false; + hand_adjust_prev->disable_y = false; + hand_adjust_prev->disable_z = false; + hand_adjust_prev->offset = vec3_null; hand_adjust_prev->field_30 = vec3_null; - hand_adjust_prev->field_3C = 0; + hand_adjust_prev->arm_length = 0; v7++; v8++; hand_adjust++; @@ -2075,12 +2061,12 @@ static void sub_140539750(struc_223* a1) { void(*sub_1405335C0)(struc_223 * a1) = (void(*)(struc_223*))0x00000001405335C0; - sub_14053A660(&a1->field_20); - sub_14053A660(&a1->field_10); + sub_14053A660(&a1->field_0.field_20); + sub_14053A660(&a1->field_0.field_10); sub_140537110(a1); sub_1405335C0(a1); a1->field_7A0 = 0; - a1->field_7A8 = -1; + a1->motion_set_id = -1; } static void rob_chara_data_reset(rob_chara_data* a1) { @@ -2093,8 +2079,8 @@ static void rob_chara_data_reset(rob_chara_data* a1) { a1->field_0 = 0; sub_140505C90(&a1->field_8); - rob_sub_action_init_sub(&a1->rob_sub_action); - sub_140506440(&a1->adjust); + rob_sub_action_reset(&a1->rob_sub_action); + rob_chara_motion_reset(&a1->motion); sub_140539750(&a1->field_1588); rob_chara_data_miku_rot_reset(&a1->miku_rot); rob_chara_data_adjuct_reset(&a1->adjust_data); @@ -2134,7 +2120,7 @@ static void bone_data_parent_reset(bone_data_parent* a1) { a1->bone_key_set_count = 0; a1->global_key_set_count = 0; a1->field_78 = 0; - a1->rotation_y = 0; + a1->rot_y = 0; a1->bones.end = a1->bones.begin; a1->bone_indices.end = a1->bone_indices.begin; } @@ -2145,8 +2131,8 @@ static void sub_140413470(struc_308* a1) { a1->mat = mat4u_identity; a1->field_4C = mat4u_identity; a1->field_8C = false; - a1->eyes_adjust = 0.0f; - a1->prev_eyes_adjust = 0.0f; + a1->rot_y = 0.0f; + a1->prev_rot_y = 0.0f; a1->field_90 = vec3_identity; a1->field_9C = vec3_identity; a1->field_A8 = vec3_identity; @@ -2160,7 +2146,7 @@ static void sub_140413470(struc_308* a1) { static void motion_blend_mot_reset(motion_blend_mot* a1) { bone_data_parent_reset(&a1->bone_data); a1->mot_key_data.key_sets_ready = 0; - a1->mot_key_data.skeleton_type = AFT_BONE_DATABASE_SKELETON_NONE; + a1->mot_key_data.skeleton_type = BONE_DATABASE_SKELETON_NONE; a1->mot_key_data.frame = -1.0f; a1->mot_key_data.key_set_count = 0; a1->mot_key_data.mot_data = 0; @@ -2171,10 +2157,10 @@ static void motion_blend_mot_reset(motion_blend_mot* a1) { a1->mot_key_data.key_set_data.end = a1->mot_key_data.key_set_data.begin; a1->mot_key_data.motion_id = -1; a1->mot_play_data.frame_data.frame = 0.0f; - a1->mot_play_data.frame_data.field_8 = 1.0f; - a1->mot_play_data.frame_data.field_4 = 1.0f; - a1->mot_play_data.frame_data.field_C = 0.0f; - a1->mot_play_data.frame_data.field_10 = -1.0f; + a1->mot_play_data.frame_data.step = 1.0f; + a1->mot_play_data.frame_data.step_prev = 1.0f; + a1->mot_play_data.frame_data.frame_count = 0.0f; + a1->mot_play_data.frame_data.last_frame = -1.0f; a1->mot_play_data.frame_data.field_14 = -1.0f; a1->mot_play_data.frame_data.field_18 = -1; a1->mot_play_data.frame_data.field_1C = -1; @@ -2191,15 +2177,15 @@ static void motion_blend_mot_reset(motion_blend_mot* a1) { a1->field_0.bone_check_func = 0; sub_1404119A0(&a1->field_0.field_8); a1->field_0.motion_bone_count = 0; - a1->cross.base.__vftable->field_8(&a1->cross.base); - a1->freeze.base.__vftable->field_8(&a1->freeze.base); - a1->combine.base.base.__vftable->field_8(&a1->combine.base.base); + a1->cross.base.__vftable->Reset(&a1->cross.base); + a1->freeze.base.__vftable->Reset(&a1->freeze.base); + a1->combine.base.base.__vftable->Reset(&a1->combine.base.base); a1->blend = 0; } static void mot_blend_reset(mot_blend* a1) { a1->mot_key_data.key_sets_ready = 0; - a1->mot_key_data.skeleton_type = AFT_BONE_DATABASE_SKELETON_NONE; + a1->mot_key_data.skeleton_type = BONE_DATABASE_SKELETON_NONE; a1->mot_key_data.frame = -1.0f; a1->mot_key_data.key_set_count = 0; a1->mot_key_data.mot_data = 0; @@ -2210,10 +2196,10 @@ static void mot_blend_reset(mot_blend* a1) { a1->mot_key_data.key_set_data.end = a1->mot_key_data.key_set_data.begin; a1->mot_key_data.motion_id = -1; a1->mot_play_data.frame_data.frame = 0.0f; - a1->mot_play_data.frame_data.field_8 = 1.0f; - a1->mot_play_data.frame_data.field_4 = 1.0f; - a1->mot_play_data.frame_data.field_C = 0.0f; - a1->mot_play_data.frame_data.field_10 = -1.0f; + a1->mot_play_data.frame_data.step = 1.0f; + a1->mot_play_data.frame_data.step_prev = 1.0f; + a1->mot_play_data.frame_data.frame_count = 0.0f; + a1->mot_play_data.frame_data.last_frame = -1.0f; a1->mot_play_data.frame_data.field_14 = -1.0f; a1->mot_play_data.frame_data.field_18 = -1; a1->mot_play_data.frame_data.field_1C = -1; @@ -2226,7 +2212,7 @@ static void mot_blend_reset(mot_blend* a1) { a1->mot_play_data.field_38 = 0; a1->mot_play_data.field_40 = 0; a1->mot_play_data.field_48 = 0; - a1->blend.base.__vftable->field_8(&a1->blend.base); + a1->blend.base.__vftable->Reset(&a1->blend.base); a1->field_0.bone_check_func = 0; sub_1404119A0(&a1->field_0.field_8); a1->field_0.motion_bone_count = 0; @@ -2266,10 +2252,8 @@ static void sub_1404198D0(struc_258* a1) { a1->field_A4 = 0; a1->field_A8 = 0; a1->field_AC = 0; - a1->eyes_adjust = 0; - a1->field_B8 = 0; - a1->field_B0 = 0; - a1->field_BC = 0; + a1->field_B0 = 0.0f; + a1->field_B4 = vec3_null; a1->field_C0 = vec3_null; a1->field_CC = mat4u_identity; a1->field_10C = mat4u_identity; @@ -2314,9 +2298,7 @@ static void sub_1403FAEF0(struc_312* a1) { a1->field_0.field_10 = 0; a1->field_0.field_14 = 0; a1->field_0.field_18 = 0; - a1->field_0.field_1C = 0; - a1->field_0.field_20 = 0; - a1->field_0.field_24 = 0; + a1->field_0.field_1C = vec3_null; a1->field_0.field_28 = 0; a1->field_2C.field_0 = 0; a1->field_2C.field_4 = 0; @@ -2325,27 +2307,16 @@ static void sub_1403FAEF0(struc_312* a1) { a1->field_2C.field_10 = 0; a1->field_2C.field_14 = 0; a1->field_2C.field_18 = 0; - a1->field_2C.field_1C = 0; - a1->field_2C.field_20 = 0; - a1->field_2C.field_24 = 0; + a1->field_2C.field_1C = vec3_null; a1->field_2C.field_28 = 0; a1->field_58 = 0; a1->field_8C = 1.0f; - a1->field_90 = 0; - a1->field_94 = 0; - a1->field_98 = 1.0f; - a1->field_5C = 0; - a1->field_68 = 0; - a1->field_74 = 0; - a1->field_80 = 0; - a1->field_60 = 0; - a1->field_6C = 0; - a1->field_78 = 0; - a1->field_84 = 0; - a1->field_64 = 0; - a1->field_70 = 0; - a1->field_7C = 0; - a1->field_88 = 0; + 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) { @@ -2368,8 +2339,8 @@ static void rob_chara_bone_data_reset(rob_chara_bone_data* rob_bone_data) { rob_bone_data->mats.end = rob_bone_data->mats.begin; rob_bone_data->mats2.end = rob_bone_data->mats2.begin; rob_bone_data->nodes.end = rob_bone_data->nodes.begin; - rob_bone_data->base_skeleton_type = AFT_BONE_DATABASE_SKELETON_NONE; - rob_bone_data->skeleton_type = AFT_BONE_DATABASE_SKELETON_NONE; + rob_bone_data->base_skeleton_type = BONE_DATABASE_SKELETON_NONE; + rob_bone_data->skeleton_type = BONE_DATABASE_SKELETON_NONE; if (rob_bone_data->motion_loaded.size && vector_old_length(rob_bone_data->motions) == 3) { rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 0); @@ -2388,7 +2359,7 @@ static void rob_chara_bone_data_reset(rob_chara_bone_data* rob_bone_data) { mot_blend_reset(&rob_bone_data->mouth); mot_blend_reset(&rob_bone_data->eye); mot_blend_reset(&rob_bone_data->eyelid); - rob_bone_data->field_758 = 0; + rob_bone_data->disable_eye_motion = 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; @@ -2399,19 +2370,19 @@ static void rob_chara_bone_data_reset(rob_chara_bone_data* rob_bone_data) { sub_1403FAEF0(&rob_bone_data->field_958); } -static skeleton_rotation_offset* skeleton_rotation_offset_array_get(aft_bone_database_skeleton_type type) { +static skeleton_rotation_offset* skeleton_rotation_offset_array_get(bone_database_skeleton_type type) { skeleton_rotation_offset** skeleton_rotation_offset_array_ptr = (skeleton_rotation_offset**)0x0000000140A01560; - if (type >= AFT_BONE_DATABASE_SKELETON_COMMON && type <= AFT_BONE_DATABASE_SKELETON_TETO) + if (type >= BONE_DATABASE_SKELETON_COMMON && type <= BONE_DATABASE_SKELETON_TETO) return skeleton_rotation_offset_array_ptr[type]; else return 0; } static vec3* bone_data_set_key_data(bone_data* data, vec3* keyframe_data, - aft_bone_database_skeleton_type skeleton_type, bool get_data, bool reverse_x) { - aft_bone_database_bone_type type = data->type; - if (type == AFT_BONE_DATABASE_BONE_POSITION_ROTATION) { + bone_database_skeleton_type skeleton_type, bool get_data, bool reverse_x) { + bone_database_bone_type type = data->type; + if (type == BONE_DATABASE_BONE_POSITION_ROTATION) { if (get_data) { data->trans = *keyframe_data; if (reverse_x) @@ -2419,8 +2390,8 @@ static vec3* bone_data_set_key_data(bone_data* data, vec3* keyframe_data, } keyframe_data++; } - else if (type >= AFT_BONE_DATABASE_BONE_HEAD_IK_ROTATION - && type <= AFT_BONE_DATABASE_BONE_LEGS_IK_ROTATION) { + else if (type >= BONE_DATABASE_BONE_HEAD_IK_ROTATION + && type <= BONE_DATABASE_BONE_LEGS_IK_ROTATION) { if (get_data) { data->ik_target = *keyframe_data; if (reverse_x) @@ -2430,7 +2401,7 @@ static vec3* bone_data_set_key_data(bone_data* data, vec3* keyframe_data, } if (get_data) { - if (type == AFT_BONE_DATABASE_BONE_TYPE_1 || type == AFT_BONE_DATABASE_BONE_POSITION) { + if (type == BONE_DATABASE_BONE_TYPE_1 || type == BONE_DATABASE_BONE_POSITION) { data->trans = *keyframe_data; if (reverse_x) data->trans.x = -data->trans.x; @@ -2562,27 +2533,27 @@ static bool motion_blend_mot_interpolate_get_reverse(int32_t* a1) { } static void sub_140415430(motion_blend_mot* a1) { - float_t rotation_y = a1->bone_data.rotation_y; + float_t rot_y = a1->bone_data.rot_y; vec3 global_trans = a1->bone_data.global_trans; vec3 global_rotation = a1->bone_data.global_rotation; mat4 mat; - mat4_rotate_y(rotation_y, &mat); + mat4_rotate_y(rot_y, &mat); mat4_translate_mult(&mat, global_trans.x, global_trans.y, global_trans.z, &mat); mat4_rotate_mult(&mat, global_rotation.x, global_rotation.y, global_rotation.z, &mat); for (bone_data* i = a1->bone_data.bones.begin; i != a1->bone_data.bones.end; i++) switch (i->type) { - case AFT_BONE_DATABASE_BONE_TYPE_1: + case BONE_DATABASE_BONE_TYPE_1: mat4_mult_vec3_trans(&mat, &i->trans, &i->trans); break; - case AFT_BONE_DATABASE_BONE_POSITION_ROTATION: { + case BONE_DATABASE_BONE_POSITION_ROTATION: { mat4 rot_mat; mat4_clear_trans(&mat, &rot_mat); mat4_transpose(&rot_mat, &i->rot_mat[0]); mat4_mult_vec3_trans(&mat, &i->trans, &i->trans); } break; - case AFT_BONE_DATABASE_BONE_HEAD_IK_ROTATION: - case AFT_BONE_DATABASE_BONE_ARM_IK_ROTATION: - case AFT_BONE_DATABASE_BONE_LEGS_IK_ROTATION: + case BONE_DATABASE_BONE_HEAD_IK_ROTATION: + case BONE_DATABASE_BONE_ARM_IK_ROTATION: + case BONE_DATABASE_BONE_LEGS_IK_ROTATION: mat4_mult_vec3_trans(&mat, &i->ik_target, &i->ik_target); break; } @@ -2593,7 +2564,7 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { bool reverse = motion_blend_mot_interpolate_get_reverse(&a1->field_4F8.field_0); float_t frame = a1->mot_play_data.frame_data.frame; - aft_bone_database_skeleton_type skeleton_type = a1->bone_data.rob_bone_data->base_skeleton_type; + bone_database_skeleton_type skeleton_type = a1->bone_data.rob_bone_data->base_skeleton_type; bone_data* bones_data = a1->bone_data.bones.begin; for (uint16_t* i = a1->bone_data.bone_indices.begin; i != a1->bone_data.bone_indices.end; i++) { bone_data* data = &bones_data[*i]; @@ -2611,7 +2582,8 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { uint32_t bone_key_set_count = a1->bone_data.bone_key_set_count; if (frame != a1->mot_key_data.frame) { - mot_key_data_interpolate(&a1->mot_key_data, frame, bone_key_set_count, a1->bone_data.global_key_set_count); + mot_key_data_interpolate(&a1->mot_key_data, frame, + bone_key_set_count, a1->bone_data.global_key_set_count); a1->mot_key_data.frame = frame; } @@ -2627,7 +2599,7 @@ static void motion_blend_mot_interpolate(motion_blend_mot* a1) { } static void mot_blend_interpolate(mot_blend* a1, vector_old_bone_data* bones, - vector_old_uint16_t* bone_indices, aft_bone_database_skeleton_type skeleton_type) { + vector_old_uint16_t* bone_indices, bone_database_skeleton_type skeleton_type) { if (!a1->mot_key_data.key_sets_ready || !a1->mot_key_data.mot_data || a1->field_30) return; @@ -2649,21 +2621,21 @@ static void sub_1401EB1D0(bone_data* a1, int32_t a2) { if (!a1->flags) return; - if (a1->type >= AFT_BONE_DATABASE_BONE_TYPE_1 && a1->type <= AFT_BONE_DATABASE_BONE_POSITION_ROTATION) - a1->trans_dup[a2] = a1->trans; + if (a1->type >= BONE_DATABASE_BONE_TYPE_1 && a1->type <= BONE_DATABASE_BONE_POSITION_ROTATION) + a1->trans_prev[a2] = a1->trans; switch (a1->type) { - case AFT_BONE_DATABASE_BONE_ARM_IK_ROTATION: - case AFT_BONE_DATABASE_BONE_LEGS_IK_ROTATION: - a1->rot_mat_dup[a2 + 4] = a1->rot_mat[2]; - case AFT_BONE_DATABASE_BONE_HEAD_IK_ROTATION: - a1->rot_mat_dup[a2 + 2] = a1->rot_mat[1]; - case AFT_BONE_DATABASE_BONE_ROTATION: - case AFT_BONE_DATABASE_BONE_TYPE_1: - case AFT_BONE_DATABASE_BONE_POSITION: - case AFT_BONE_DATABASE_BONE_POSITION_ROTATION: + case BONE_DATABASE_BONE_ARM_IK_ROTATION: + case BONE_DATABASE_BONE_LEGS_IK_ROTATION: + a1->rot_mat_prev[2][a2] = a1->rot_mat[2]; + case BONE_DATABASE_BONE_HEAD_IK_ROTATION: + a1->rot_mat_prev[1][a2] = a1->rot_mat[1]; + case BONE_DATABASE_BONE_ROTATION: + case BONE_DATABASE_BONE_TYPE_1: + case BONE_DATABASE_BONE_POSITION: + case BONE_DATABASE_BONE_POSITION_ROTATION: default: - a1->rot_mat_dup[a2] = a1->rot_mat[0]; + a1->rot_mat_prev[0][a2] = a1->rot_mat[0]; break; } } @@ -2753,12 +2725,14 @@ static void sub_14041AD90(rob_chara_bone_data* a1) { sub_140413EA0(&a1->face.field_0, sub_14041B800); if (a1->eyelid.mot_key_data.key_sets_ready && a1->eyelid.mot_key_data.mot_data && !a1->eyelid.field_30) sub_140413EA0(&a1->face.field_0, sub_14041B1C0); - else if (a1->eye.mot_key_data.key_sets_ready && a1->eye.mot_key_data.mot_data && !a1->eye.field_30 || a1->field_758) + else if (a1->eye.mot_key_data.key_sets_ready && a1->eye.mot_key_data.mot_data && !a1->eye.field_30 + || a1->disable_eye_motion) sub_140413EA0(&a1->face.field_0, sub_14041B440); } static void sub_14041AD50(rob_chara_bone_data* a1) { - if (a1->eye.mot_key_data.key_sets_ready && a1->eye.mot_key_data.mot_data && !a1->eye.field_30 || a1->field_758) + if (a1->eye.mot_key_data.key_sets_ready && a1->eye.mot_key_data.mot_data && !a1->eye.field_30 + || a1->disable_eye_motion) sub_140413EA0(&a1->eyelid.field_0, sub_14041B440); } @@ -2800,7 +2774,7 @@ static mot_data* mot_key_data_load_file(mot_key_data* a1, int32_t motion_id) { static void sub_140414ED0(mot_blend* a1, int32_t motion_id) { mot_key_data_load_file(&a1->mot_key_data, motion_id); - a1->blend.base.__vftable->field_8(&a1->blend.base); + a1->blend.base.__vftable->Reset(&a1->blend.base); } static void sub_14041BE50(rob_chara_bone_data* rob_bone_data, int32_t motion_id) { @@ -2817,7 +2791,7 @@ static void sub_14041ABA0(rob_chara_bone_data* a1) { while (v3 != v1) { if (a1->face.mot_key_data.key_sets_ready && a1->face.mot_key_data.mot_data && !a1->face.field_30) { - if (!a1->field_758 || a1->eye.mot_key_data.key_sets_ready + if (!a1->disable_eye_motion || a1->eye.mot_key_data.key_sets_ready && a1->eye.mot_key_data.mot_data && !a1->eye.field_30) sub_140413EA0(&v3->value->field_0, sub_14041B4E0); else @@ -2829,7 +2803,7 @@ static void sub_14041ABA0(rob_chara_bone_data* a1) { sub_140413EA0(&v3->value->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->eye.mot_key_data.key_sets_ready && a1->eye.mot_key_data.mot_data && !a1->eye.field_30) sub_140413EA0(&v3->value->field_0, sub_14041B1C0); @@ -2866,7 +2840,7 @@ static bool sub_1404137A0(struc_308* a1) { } static void sub_140415A10(motion_blend_mot* a1) { - motion_blend* v1 = a1->blend; + MotionBlend* v1 = a1->blend; if (!v1) return; @@ -2881,14 +2855,14 @@ static void sub_140415A10(motion_blend_mot* a1) { v7.field_2 = !sub_140413790(&a1->field_4F8); v7.field_1 = sub_1404137A0(&a1->field_4F8); v7.frame = a1->mot_key_data.frame; - v7.eyes_adjust = a1->field_4F8.eyes_adjust; - v7.prev_eyes_adjust = a1->field_4F8.prev_eyes_adjust; - v1->__vftable->field_18(v1, &v7); + v7.rot_y = a1->field_4F8.rot_y; + v7.prev_rot_y = a1->field_4F8.prev_rot_y; + v1->__vftable->Step(v1, &v7); } static bool sub_140410A20(motion_blend_mot* a1) { - motion_blend* v1 = a1->blend; - return !v1 || !v1->field_9; + MotionBlend* v1 = a1->blend; + return !v1 || !v1->rot_y; } static void sub_140415B30(mot_blend* a1) { @@ -2899,9 +2873,9 @@ static void sub_140415B30(mot_blend* a1) { v3.field_3 = false; v3.field_4 = false; v3.frame = 0.0f; - v3.eyes_adjust = 0.0f; - v3.prev_eyes_adjust = 0.0f; - a1->blend.base.__vftable->field_18(&a1->blend.base, &v3); + v3.rot_y = 0.0f; + v3.prev_rot_y = 0.0f; + a1->blend.base.__vftable->Step(&a1->blend.base, &v3); } static void sub_14041DAC0(rob_chara_bone_data* a1) { @@ -2949,7 +2923,7 @@ void rob_chara_bone_data_interpolate(rob_chara_bone_data* rob_bone_data) { v3 = v3->next; } - aft_bone_database_skeleton_type skeleton_type = rob_bone_data->base_skeleton_type; + bone_database_skeleton_type skeleton_type = rob_bone_data->base_skeleton_type; motion_blend_mot* v5 = rob_bone_data->motion_loaded.head->next->value; vector_old_bone_data* bones = &v5->bone_data.bones; vector_old_uint16_t* bone_indices = &v5->bone_data.bone_indices; @@ -2968,8 +2942,8 @@ static void sub_140412E10(motion_blend_mot* a1, int32_t a2) { continue; sub_1401EB1D0(i, a2); - if (i->type == AFT_BONE_DATABASE_BONE_POSITION_ROTATION && a1->field_4F8.field_0 & 2) - vec3_add(i->trans_dup[a2], a1->field_4F8.field_90, i->trans_dup[a2]); + if (i->type == BONE_DATABASE_BONE_POSITION_ROTATION && a1->field_4F8.field_0 & 2) + vec3_add(i->trans_prev[a2], a1->field_4F8.field_90, i->trans_prev[a2]); } } @@ -2977,26 +2951,26 @@ static void sub_1401EAD00(bone_data* a1, bone_data* a2) { if (!a1->flags) return; - if (a1->type >= AFT_BONE_DATABASE_BONE_TYPE_1 && a1->type <= AFT_BONE_DATABASE_BONE_POSITION_ROTATION) { + if (a1->type >= BONE_DATABASE_BONE_TYPE_1 && a1->type <= BONE_DATABASE_BONE_POSITION_ROTATION) { a1->trans = a2->trans; - a1->trans_dup[0] = a2->trans_dup[0]; + a1->trans_prev[0] = a2->trans_prev[0]; } switch (a1->type) { - case AFT_BONE_DATABASE_BONE_ARM_IK_ROTATION: - case AFT_BONE_DATABASE_BONE_LEGS_IK_ROTATION: - a1->rot_mat[2] = a1->rot_mat[2]; - a1->rot_mat_dup[4] = a1->rot_mat_dup[4]; - case AFT_BONE_DATABASE_BONE_HEAD_IK_ROTATION: - a1->rot_mat[1] = a1->rot_mat[1]; - a1->rot_mat_dup[2] = a1->rot_mat_dup[2]; - case AFT_BONE_DATABASE_BONE_ROTATION: - case AFT_BONE_DATABASE_BONE_TYPE_1: - case AFT_BONE_DATABASE_BONE_POSITION: - case AFT_BONE_DATABASE_BONE_POSITION_ROTATION: + case BONE_DATABASE_BONE_ARM_IK_ROTATION: + case BONE_DATABASE_BONE_LEGS_IK_ROTATION: + a1->rot_mat[2] = a2->rot_mat[2]; + a1->rot_mat_prev[2][0] = a2->rot_mat_prev[2][0]; + case BONE_DATABASE_BONE_HEAD_IK_ROTATION: + a1->rot_mat[1] = a2->rot_mat[1]; + a1->rot_mat_prev[1][0] = a2->rot_mat_prev[1][0]; + case BONE_DATABASE_BONE_ROTATION: + case BONE_DATABASE_BONE_TYPE_1: + case BONE_DATABASE_BONE_POSITION: + case BONE_DATABASE_BONE_POSITION_ROTATION: default: - a1->rot_mat[0] = a1->rot_mat[0]; - a1->rot_mat_dup[0] = a1->rot_mat_dup[0]; + a1->rot_mat[0] = a2->rot_mat[0]; + a1->rot_mat_prev[0][0] = a2->rot_mat_prev[0][0]; break; } } @@ -3006,30 +2980,30 @@ static void sub_140412BB0(motion_blend_mot* a1, vector_old_bone_data* a2) { sub_1401EAD00(i, &a2->begin[i->motion_bone_index]); } -static void sub_1403FBF10(motion_blend* a1, float_t a2) { +static void sub_1403FBF10(MotionBlend* a1, float_t a2) { a1->blend = clamp(a2, 0.0f, 1.0f); a1->field_8 = 1; - a1->field_9 = 1; + a1->rot_y = true; } static void sub_1404148C0(motion_blend_mot* a1, float_t a2) { - motion_blend* v2 = a1->blend; + MotionBlend* v2 = a1->blend; if (v2) sub_1403FBF10(v2, a2); } -static void sub_1404147F0(motion_blend_mot* a1, motion_blend_type type, float_t blend) { +static void sub_1404147F0(motion_blend_mot* a1, MotionBlendType type, float_t blend) { if (type == MOTION_BLEND_FREEZE) { - a1->freeze.base.__vftable->field_8(&a1->freeze.base); + a1->freeze.base.__vftable->Reset(&a1->freeze.base); a1->blend = &a1->freeze.base; sub_140412E10(a1, 0); } else if (type == MOTION_BLEND_CROSS) { - a1->cross.base.__vftable->field_8(&a1->cross.base); + a1->cross.base.__vftable->Reset(&a1->cross.base); a1->blend = &a1->cross.base; } else if (type == MOTION_BLEND_COMBINE) { - a1->combine.base.base.__vftable->field_8(&a1->combine.base.base); + a1->combine.base.base.__vftable->Reset(&a1->combine.base.base); a1->blend = &a1->combine.base.base; sub_1404148C0(a1, blend); } @@ -3037,13 +3011,13 @@ static void sub_1404147F0(motion_blend_mot* a1, motion_blend_type type, float_t a1->blend = 0; } -static int32_t sub_1401F0E70(aft_bone_database_skeleton_type type, char* name) { - aft_bone_database_struct* bone_database - = *(aft_bone_database_struct**)0x0000000140FBC1C0; - int32_t(*sub_1401F0EA0)(char* a1, char* a2) - = (int32_t(*)(char*, char*))0x00000001401F0EA0; +static int32_t sub_1401F0E70(bone_database_skeleton_type type, const char* name) { + bone_database_struct* bone_database + = *(bone_database_struct**)0x0000000140FBC1C0; + int32_t(*sub_1401F0EA0)(const char* a1, const char* a2) + = (int32_t(*)(const char*, const char*))0x00000001401F0EA0; - if (!bone_database || type == AFT_BONE_DATABASE_SKELETON_NONE) + if (!bone_database || type == BONE_DATABASE_SKELETON_NONE) return -1; else return sub_1401F0EA0(bone_database->skeleton_names[type], name); @@ -3053,16 +3027,16 @@ static void bone_data_parent_load_bone_indices_from_mot(bone_data_parent* a1, mo if (!a2) return; - char** (*sub_140403B00)() - = (char** (*)())0x0000000140403B00; + const char** (*sub_140403B00)() + = (const char** (*)())0x0000000140403B00; void (*sub_14040F210)(vector_old_uint16_t * a1, size_t a2) = (void (*)(vector_old_uint16_t*, size_t))0x000000014040F210; - char** v4 = sub_140403B00(); + const char** v4 = sub_140403B00(); vector_old_uint16_t* v5 = &a1->bone_indices; uint16_t v6 = a2->data_file->info; a1->bone_indices.end = a1->bone_indices.begin; - aft_bone_database_skeleton_type v8 = a1->rob_bone_data->base_skeleton_type; + bone_database_skeleton_type v8 = a1->rob_bone_data->base_skeleton_type; uint16_t v9 = (v6 & 0x3FFF) - 1; if (!v9) return; @@ -3099,7 +3073,7 @@ static void bone_data_parent_load_bone_indices_from_mot(bone_data_parent* a1, mo v15->key_set_offset = (int32_t)v10; v15->frame = -1.0f; - if (v15->type >= AFT_BONE_DATABASE_BONE_POSITION_ROTATION) + if (v15->type >= BONE_DATABASE_BONE_POSITION_ROTATION) v10 += 6; else v10 += 3; @@ -3113,7 +3087,7 @@ static void sub_140413C30(struc_308* a1) { } static void motion_blend_mot_load_file(motion_blend_mot* a1, - int32_t motion_id, motion_blend_type a3, float_t blend) { + int32_t motion_id, MotionBlendType a3, float_t blend) { sub_1404147F0(a1, a3, blend); mot_data* v5 = mot_key_data_load_file(&a1->mot_key_data, motion_id); bone_data_parent* v6 = &a1->bone_data; @@ -3152,7 +3126,7 @@ static void sub_14041AE40(rob_chara_bone_data* a1) { if (a1->face.mot_key_data.key_sets_ready && a1->face.mot_key_data.mot_data && !a1->face.field_30) { - if (!a1->field_758 || a1->eye.mot_key_data.key_sets_ready + if (!a1->disable_eye_motion || a1->eye.mot_key_data.key_sets_ready && a1->eye.mot_key_data.mot_data && !a1->eye.field_30) sub_140413EA0(v3, sub_14041B4E0); else @@ -3164,7 +3138,7 @@ static void sub_14041AE40(rob_chara_bone_data* a1) { sub_140413EA0(&v1->next->value->field_0, sub_14041B800); else if (a1->eyelid.mot_key_data.key_sets_ready && a1->eyelid.mot_key_data.mot_data && !a1->eyelid.field_30) { - if (!a1->field_758 || a1->eye.mot_key_data.key_sets_ready + if (!a1->disable_eye_motion || a1->eye.mot_key_data.key_sets_ready && a1->eye.mot_key_data.mot_data && !a1->eye.field_30) sub_140413EA0(v3, sub_14041B1C0); else @@ -3184,7 +3158,7 @@ static void sub_14041AE40(rob_chara_bone_data* a1) { } void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, - int32_t motion_id, motion_blend_type motion_blend_type) { + int32_t motion_id, MotionBlendType motion_blend_type) { void(*rob_chara_bone_data_motion_blend_mot_list_init)(rob_chara_bone_data * rob_bone_data) = (void(*)(rob_chara_bone_data*))0x000000014041A9E0; void(*rob_chara_bone_data_motion_blend_mot_list_free)(rob_chara_bone_data * rob_bone_data, size_t a2) @@ -3202,7 +3176,7 @@ void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, if (!rob_bone_data->motion_loaded.size) return; - if (motion_blend_type == 1) { + if (motion_blend_type == MOTION_BLEND_FREEZE) { rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 1); sub_14041AE40(rob_bone_data); list_ptr_motion_blend_mot_node*v15 = rob_bone_data->motion_loaded.head; @@ -3329,8 +3303,8 @@ static void sub_14041BC40(rob_chara_bone_data* a1, char a2) { } static void sub_140414F00(struc_308* a1, float_t a2) { - a1->prev_eyes_adjust = a1->eyes_adjust; - a1->eyes_adjust = a2; + a1->prev_rot_y = a1->rot_y; + a1->rot_y = a2; } static void sub_14041D270(rob_chara_bone_data* a1, float_t a2) { @@ -3338,44 +3312,46 @@ static void sub_14041D270(rob_chara_bone_data* a1, float_t a2) { } static void sub_14041D2A0(rob_chara_bone_data* a1, float_t a2) { - a1->motion_loaded.head->next->value->field_4F8.prev_eyes_adjust = a2; + a1->motion_loaded.head->next->value->field_4F8.prev_rot_y = a2; } -static void rob_chara_bone_data_set_rotation_y(rob_chara_bone_data* rob_bone_data, float_t rotation_y) { - rob_bone_data->motion_loaded.head->next->value->bone_data.rotation_y = rotation_y; +static void rob_chara_bone_data_set_rot_y(rob_chara_bone_data* rob_bone_data, float_t rot_y) { + rob_bone_data->motion_loaded.head->next->value->bone_data.rot_y = rot_y; } -static void sub_1403FBED0(motion_blend* a1, float_t a2, float_t a3, float_t a4) { - if (a2 < 0.0f) { +static void sub_1403FBED0(MotionBlend* a1, float_t duration, float_t step, float_t offset) { + if (duration < 0.0f) { a1->field_8 = false; - a1->field_C = 0.0f; - a1->field_10 = 0.0f; - a1->field_14 = a3; - a1->field_18 = a4; + a1->duration = 0.0f; + a1->frame = 0.0f; + a1->step = step; + a1->offset = offset; } else { a1->field_8 = true; - a1->field_C = a2; - a1->field_10 = 0.0f; - a1->field_14 = a3; - a1->field_18 = a4; + a1->duration = duration; + a1->frame = 0.0f; + a1->step = step; + a1->offset = offset; } } -static void sub_140414C60(motion_blend_mot* a1, float_t a2, float_t a3, float_t a4) { - motion_blend* v4 = a1->blend; +static void motion_blend_mot_set_duration(motion_blend_mot* a1, + float_t duration, float_t step, float_t offset) { + MotionBlend* v4 = a1->blend; if (v4) - sub_1403FBED0(v4, a2, a3, a4); + sub_1403FBED0(v4, duration, step, offset); } -static void sub_14041BF80(rob_chara_bone_data* a1, float_t a2, float_t a3, float_t a4) { - sub_140414C60(a1->motion_loaded.head->next->value, a2, a3, a4); +static void rob_chara_bone_data_set_motion_duration(rob_chara_bone_data* a1, + float_t duration, float_t step, float_t offset) { + motion_blend_mot_set_duration(a1->motion_loaded.head->next->value, duration, step, offset); } -static void sub_14041D310(rob_chara_bone_data* a1) { - motion_blend* v1 = a1->motion_loaded.head->next->value->blend; +static void sub_14041D310(rob_chara_bone_data* a1, float_t a2, float_t a3, int32_t a4) { + MotionBlend* v1 = a1->motion_loaded.head->next->value->blend; if (v1) - v1->__vftable->field_10(v1); + v1->__vftable->Field10(v1, a2, a3, a4); } static void rob_chara_load_default_motion_sub(rob_chara* a1, int32_t a2, int32_t motion_id) { @@ -3393,9 +3369,9 @@ static void rob_chara_load_default_motion_sub(rob_chara* a1, int32_t a2, int32_t sub_14041BC40(a1->bone_data, 0); sub_14041D270(a1->bone_data, 0.0f); sub_14041D2A0(a1->bone_data, 0.0f); - rob_chara_bone_data_set_rotation_y(a1->bone_data, 0.0f); - sub_14041BF80(a1->bone_data, 0.0f, 1.0f, 1.0f); - sub_14041D310(a1->bone_data); + rob_chara_bone_data_set_rot_y(a1->bone_data, 0.0f); + rob_chara_bone_data_set_motion_duration(a1->bone_data, 0.0f, 1.0f, 1.0f); + sub_14041D310(a1->bone_data, 0.0f, 0.0f, 2); rob_chara_bone_data_interpolate(a1->bone_data); rob_chara_bone_data_update(a1->bone_data, 0); sub_140412E10(a1->bone_data->motion_loaded.head->next->value, a2); @@ -3405,7 +3381,7 @@ int32_t rob_cmn_mottbl_get_motion_index(rob_chara* a1, int32_t a2) { struc_403* rob_cmn_mottbl_data = *rob_cmn_mottbl_data_ptr; if (a2 == 224) - return a1->data.adjust.motion_id; + return a1->data.motion.motion_id; if (a2 >= 214 && a2 <= 223) return ((uint32_t*)&a1->data_prev.field_1E68.field_1C88)[a2]; if (a2 >= 226 && a2 <= 235) @@ -3435,7 +3411,7 @@ static bone_node* rob_chara_bone_data_get_node(rob_chara_bone_data* rob_bone_dat return 0; } -static char* ex_node_block_get_parent_name(ex_node_block* a1) { +static char* ExNodeBlock_get_parent_name(ExNodeBlock* a1) { return string_data(&a1->parent_name); } @@ -3462,9 +3438,9 @@ static void rob_chara_item_equip_object_get_parent_bone_nodes( rob_chara_item_equip_object* a1, bone_node* a2) { a1->bone_nodes = a2; a1->mat = a2->mat; - for (ex_node_block** i = a1->node_blocks.begin; i != a1->node_blocks.end; i++) + for (ExNodeBlock** i = a1->node_blocks.begin; i != a1->node_blocks.end; i++) (*i)->parent_bone_node = rob_chara_item_equip_object_get_bone_node_by_name( - a1, ex_node_block_get_parent_name(*i)); + a1, ExNodeBlock_get_parent_name(*i)); } static void rob_chara_item_equip_get_parent_bone_nodes(rob_chara_item_equip* a1, bone_node* a2) { @@ -3533,17 +3509,17 @@ static void sub_14041D560(rob_chara_bone_data* a1, char a2, char a3) { static void rob_chara_bone_data_ik_scale_calculate( rob_chara_bone_data_ik_scale* a1, vector_old_bone_data* a2, - aft_bone_database_skeleton_type base_skeleton_type, - aft_bone_database_skeleton_type skeleton_type) { + bone_database_skeleton_type base_skeleton_type, + bone_database_skeleton_type skeleton_type) { bone_data* b_cl_mune = &a2->begin[MOTION_BONE_CL_MUNE]; bone_data* b_kl_kubi = &a2->begin[MOTION_BONE_KL_KUBI]; bone_data* b_c_kata_l = &a2->begin[MOTION_BONE_C_KATA_L]; bone_data* b_cl_momo_l = &a2->begin[MOTION_BONE_CL_MOMO_L]; float_t base_height = fabsf(b_cl_momo_l->base_translation[0].y) + b_cl_momo_l->ik_segment_length[0] - + b_cl_momo_l->ik_2nd_segment_length[0] + aft_bone_database_get_skeleton_heel_height(base_skeleton_type); + + b_cl_momo_l->ik_2nd_segment_length[0] + bone_database_get_skeleton_heel_height(base_skeleton_type); float_t height = fabsf(b_cl_momo_l->base_translation[1].y) + b_cl_momo_l->ik_segment_length[1] - + b_cl_momo_l->ik_2nd_segment_length[1] + aft_bone_database_get_skeleton_heel_height(skeleton_type); + + b_cl_momo_l->ik_2nd_segment_length[1] + bone_database_get_skeleton_heel_height(skeleton_type); a1->ratio0 = height / base_height; a1->ratio1 = (fabsf(b_kl_kubi->base_translation[1].y) + b_cl_mune->ik_segment_length[1]) / (fabsf(b_kl_kubi->base_translation[0].y) + b_cl_mune->ik_segment_length[0]); @@ -3580,10 +3556,10 @@ static void sub_140513C60(rob_chara_item_equip* a1, int32_t a2, bool a3) { a1->field_18[a2] |= 4; } -static aft_object_info sub_140525C00(rob_chara_item_sub_data* a1, int32_t a2) { - tree_pair_int32_t_int32_t_node* v2 = a1->field_3F8.head; - tree_pair_int32_t_int32_t_node* v3 = v2; - tree_pair_int32_t_int32_t_node* v4 = v2->parent; +static object_info sub_140525C00(rob_chara_item_cos_data* a1, int32_t a2) { + tree_pair_int32_t_object_info_node* v2 = a1->head_replace.head; + tree_pair_int32_t_object_info_node* v3 = v2; + tree_pair_int32_t_object_info_node* v4 = v2->parent; while (!v4->is_null) if (v4->key >= a2) { v3 = v4; @@ -3592,23 +3568,23 @@ static aft_object_info sub_140525C00(rob_chara_item_sub_data* a1, int32_t a2) { else v4 = v4->right; - tree_pair_int32_t_int32_t_node* v6; + tree_pair_int32_t_object_info_node* v6; if (v3 == v2 || a2 < v3->key) v6 = v2; else v6 = v3; if (v6 == v2) - return aft_object_info_null; + return object_info_null; else - return *(aft_object_info*)&v6->value; + return v6->value; } -static aft_object_info sub_1405104C0(rob_chara* a1, int32_t a2) { +static object_info sub_1405104C0(rob_chara* a1, int32_t a2) { if (a2 > 8) - return aft_object_info_null; + return object_info_null; - aft_object_info v3 = sub_140525C00(&a1->item_sub_data, a2); + object_info v3 = sub_140525C00(&a1->item_cos_data, a2); if (v3.id == -1 && v3.set_id == -1) return a1->chara_init_data->head_objects[a2]; return v3; @@ -3653,26 +3629,26 @@ void rob_chara_reset_data(rob_chara* a1, rob_chara_pv_data* a2) { int32_t v2 = a1->data.field_8.field_1CC; rob_chara_bone_data_reset(a1->bone_data); rob_chara_bone_data_init_data(a1->bone_data, - AFT_BONE_DATABASE_SKELETON_COMMON, a1->chara_init_data->skeleton_type); + BONE_DATABASE_SKELETON_COMMON, a1->chara_init_data->skeleton_type); rob_chara_data_reset(&a1->data); rob_chara_data_reset(&a1->data_prev); rob_chara_item_equip_get_parent_bone_nodes(a1->item_equip, rob_chara_bone_data_get_node(a1->bone_data, 0)); - a1->field_4 = a2->index; + a1->field_4 = a2->type; sub_140517060(a1, a2->field_4); a1->field_A = a2->field_16; a1->field_1C = 1.0f; vec3 v8 = a2->field_8; - if (a2->index != 2) { + if (a2->type != ROB_CHARA_TYPE_2) { vec3 v19 = a2->field_8; v19.y += 1.0f; v8.y = sub_140228BD0(&v19, 0.0); } rob_chara_data* v3 = &a1->data; - v3->miku_rot.field_0 = a2->field_14; - v3->miku_rot.field_6 = a2->field_14; - v3->miku_rot.field_18 = v8; + v3->miku_rot.rot_y_int16 = a2->rot_y_int16; + v3->miku_rot.field_6 = a2->rot_y_int16; + v3->miku_rot.position = v8; v3->miku_rot.field_24 = v8; v3->miku_rot.field_48 = v8; v3->adjust_data.scale = chara_size_table_get_value(a1->pv_data.chara_size_index); @@ -3687,17 +3663,17 @@ void rob_chara_reset_data(rob_chara* a1, rob_chara_pv_data* a2) { sub_14041D560(a1->bone_data, 1, 0); rob_chara_bone_data_get_ik_scale(a1->bone_data); float_t ratio0 = rob_chara_bone_data_get_ik_scale_ratio0(a1->bone_data); - v3->adjust.field_138 = ratio0; - v3->adjust.field_13C = ratio0; - v3->adjust.field_140 = 0; - v3->adjust.field_144 = 0; - v3->adjust.field_148 = 0; + v3->motion.field_138 = ratio0; + v3->motion.field_13C = ratio0; + v3->motion.field_140 = 0; + v3->motion.field_144 = 0; + v3->motion.field_148 = 0; rob_chara_load_default_motion(a1); v3->field_8.field_0 = 0; v3->field_8.field_4.field_0 = 1; - v3->field_8.field_4.field_C = rob_cmn_mottbl_get_motion_index(a1, 0); + v3->field_8.field_4.motion_id = rob_cmn_mottbl_get_motion_index(a1, 0); v3->field_8.field_4.field_10 = a2->field_5; - rob_chara_load_motion(a1, v3->field_8.field_4.field_C, v3->field_8.field_4.field_10, 0.0, 0); + rob_chara_load_motion(a1, v3->field_8.field_4.motion_id, v3->field_8.field_4.field_10, 0.0, 0); if (!a2->field_6) v3->field_8.field_1CC = v2; sub_1405167A0(a1); @@ -3705,9 +3681,9 @@ void rob_chara_reset_data(rob_chara* a1, rob_chara_pv_data* a2) { sub_140513C60(a1->item_equip, 1, false); sub_140513C60(a1->item_equip, 10, false); sub_140513C60(a1->item_equip, 11, false); - aft_object_info v17 = sub_1405104C0(a1, 0); - v3->adjust.field_150.field_1B0 = v17; - v3->adjust.field_3B0.field_1B0 = v17; + object_info v17 = sub_1405104C0(a1, 0); + v3->motion.field_150.head_object = v17; + v3->motion.field_3B0.head_object = v17; sub_140517120(a1, 0x1F, true); a1->field_20 = 0; } @@ -3770,10 +3746,8 @@ static void skin_param_init(skin_param* skp) { } static void rob_osage_init(rob_osage* rob_osg) { - void (*sub_140216750)(tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data * a1, - tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node * a2) - = (void (*)(tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data*, - tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node*))0x0000000140216750; + void (*sub_140216750)(tree_motion_reset_data * a1, tree_motion_reset_data_node * a2) + = (void (*)(tree_motion_reset_data*, tree_motion_reset_data_node*))0x0000000140216750; void (*vector_old_rob_osage_node_clear)(vector_old_rob_osage_node * vec, rob_osage_node * begin, rob_osage_node * end) = (void (*)(vector_old_rob_osage_node*, rob_osage_node*, rob_osage_node*))0x00000001404817E0; @@ -3806,7 +3780,7 @@ static void rob_osage_init(rob_osage* rob_osg) { rob_osg->field_1F0F = false; skin_param_init(&rob_osg->skin_param); rob_osg->skin_param_ptr = &rob_osg->skin_param; - rob_osg->osage_setting.parts = -1; + rob_osg->osage_setting.parts = ROB_OSAGE_PARTS_NONE; rob_osg->osage_setting.exf = 0; rob_osg->reset_data_list = 0; rob_osg->field_2A4 = 0.0f; @@ -3834,22 +3808,17 @@ static void rob_osage_node_free(rob_osage_node* node) { } static void rob_osage_free(rob_osage* rob_osg) { - void (*sub_14021BEF0)(tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data * a1, - tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node * *a2, - tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node * a3, - tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node * a4) - = (void (*)(tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data*, - tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node**, - tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node*, - tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node*))0x000000014021BEF0; + void (*sub_14021BEF0)(tree_motion_reset_data * a1, tree_motion_reset_data_node * *a2, + tree_motion_reset_data_node * a3, tree_motion_reset_data_node * a4) + = (void (*)(tree_motion_reset_data*, tree_motion_reset_data_node**, + tree_motion_reset_data_node*, tree_motion_reset_data_node*))0x000000014021BEF0; void (*vector_old_rob_osage_node_clear)(vector_old_rob_osage_node * vec, rob_osage_node * begin, rob_osage_node * end) - = (void (*)(vector_old_rob_osage_node*, - rob_osage_node*, rob_osage_node*))0x00000001404817E0; + = (void (*)(vector_old_rob_osage_node*, rob_osage_node*, rob_osage_node*))0x00000001404817E0; rob_osage_init(rob_osg); - tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data_node* v6; + tree_motion_reset_data_node* v6; sub_14021BEF0(&rob_osg->motion_reset_data, &v6, rob_osg->motion_reset_data.head->left, rob_osg->motion_reset_data.head); operator_delete(rob_osg->motion_reset_data.head); @@ -3886,15 +3855,15 @@ static void rob_osage_free(rob_osage* rob_osg) { } } -void ex_node_block_field_10(ex_node_block* node) { +void ExNodeBlock_field_10(ExNodeBlock* node) { node->field_59 = false; } -void* ex_osage_block_dispose(ex_osage_block* osg, bool dispose) { - osg->base.__vftable = ex_osage_block_vftable; - ex_osage_block_reset(osg); +ExOsageBlock* ExOsageBlock_dispose(ExOsageBlock* osg, bool dispose) { + osg->base.__vftable = ExOsageBlock_vftable; + ExOsageBlock_reset(osg); rob_osage_free(&osg->rob); - osg->base.__vftable = ex_node_block_vftable; + osg->base.__vftable = ExNodeBlock_vftable; if (osg->base.parent_name.capacity > 0x0F) operator_delete(osg->base.parent_name.ptr); osg->base.parent_name = string_empty; @@ -3903,8 +3872,8 @@ void* ex_osage_block_dispose(ex_osage_block* osg, bool dispose) { return osg; } -void ex_osage_block_init(ex_osage_block* osg) { - osg->base.__vftable->reset(&osg->base); +void ExOsageBlock_init(ExOsageBlock* osg) { + osg->base.__vftable->Reset(&osg->base); } static void sub_14047EE90(rob_osage* rob_osg, mat4* mat) { @@ -4091,7 +4060,7 @@ static void rob_osage_set_wind_direction(rob_osage* osg_block_data, vec3* wind_d osg_block_data->wind_direction = vec3_null; } -static void ex_osage_block_set_wind_direction(ex_osage_block* osg) { +static void ExOsageBlock_set_wind_direction(ExOsageBlock* osg) { vec3* (*wind_task_struct_get_wind_direction)() = (vec3 * (*)())0x000000014053D560; vec3 wind_direction = *wind_task_struct_get_wind_direction(); @@ -5024,13 +4993,13 @@ static void sub_140480260(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo rob_osg->parent_mat = *rob_osg->parent_mat_ptr; } -void ex_osage_block_field_18(ex_osage_block* osg, int32_t a2, bool a3) { +void ExOsageBlock_field_18(ExOsageBlock* osg, int32_t a2, bool a3) { float_t(*get_delta_frame)() = (float_t(*)())0x0000000140192D50; rob_chara_item_equip* rob_item_equip = osg->base.item_equip_object->item_equip; float_t step = get_delta_frame() * rob_item_equip->step; - if (vector_old_length(rob_item_equip->field_940) - && rob_item_equip->field_940.begin[0].field_C) + if (vector_old_length(rob_item_equip->opd_blend_data) + && rob_item_equip->opd_blend_data.begin[0].field_C) step = 1.0f; bone_node* parent_node = osg->base.parent_bone_node; @@ -5043,7 +5012,7 @@ void ex_osage_block_field_18(ex_osage_block* osg, int32_t a2, bool a3) { case 1: case 2: if ((a2 == 1 && osg->base.field_58) || (a2 == 2 && osg->rob.field_2A0)) { - ex_osage_block_set_wind_direction(osg); + ExOsageBlock_set_wind_direction(osg); sub_14047C800(&osg->rob, parent_node_mat, &parent_scale, step, a3, true, osg->base.field_5A); } break; @@ -5072,7 +5041,7 @@ static void sub_14047C750(rob_osage* rob_osg, mat4* mat, vec3* parent_scale, flo sub_14047C770(rob_osg, mat, parent_scale, step, 0); } -void ex_osage_block_field_20(ex_osage_block* osg) { +void ExOsageBlock_field_20(ExOsageBlock* osg) { osg->field_1FF8 &= ~2; if (osg->base.field_59) { osg->base.field_59 = false; @@ -5083,8 +5052,8 @@ void ex_osage_block_field_20(ex_osage_block* osg) { rob_chara_item_equip* rob_item_equip = osg->base.item_equip_object->item_equip; float_t step = get_delta_frame() * rob_item_equip->step; - if (vector_old_length(rob_item_equip->field_940) - && rob_item_equip->field_940.begin[0].field_C) + if (vector_old_length(rob_item_equip->opd_blend_data) + && rob_item_equip->opd_blend_data.begin[0].field_C) step = 1.0f; bone_node* parent_node = osg->base.parent_bone_node; @@ -5098,7 +5067,7 @@ void ex_osage_block_field_20(ex_osage_block* osg) { mat4_scale_rot(&mat, scale.x, scale.y, scale.z, &mat); mat4_transpose(&mat, &mat); } - ex_osage_block_set_wind_direction(osg); + ExOsageBlock_set_wind_direction(osg); rob_osage_coli_set(&osg->rob, osg->mat); sub_14047C750(&osg->rob, &mat, &parent_scale, step); @@ -5251,18 +5220,19 @@ void sub_14047E240(rob_osage* rob_osg, mat4* a2, vec3* a3, vector_old_opd_blend_ } } -void ex_osage_block_set_osage_play_data(ex_osage_block* osg) { +void ExOsageBlock_set_osage_play_data(ExOsageBlock* osg) { rob_chara_item_equip* rob_itm_equip = osg->base.item_equip_object->item_equip; bone_node* parent_node = osg->base.parent_bone_node; vec3 parent_scale = parent_node->exp_data.parent_scale; - sub_14047E240(&osg->rob, parent_node->ex_data_mat, &parent_scale, &rob_itm_equip->field_940); + sub_14047E240(&osg->rob, parent_node->ex_data_mat, + &parent_scale, &rob_itm_equip->opd_blend_data); } -void ex_osage_block_disp(ex_osage_block* osg) { +void ExOsageBlock_disp(ExOsageBlock* osg) { } -void ex_osage_block_reset(ex_osage_block* osg) { +void ExOsageBlock_reset(ExOsageBlock* osg) { osg->index = 0; rob_osage_init(&osg->rob); osg->field_1FF8 &= ~3; @@ -5271,16 +5241,16 @@ void ex_osage_block_reset(ex_osage_block* osg) { osg->base.bone_node_ptr = 0; } -void ex_osage_block_field_40(ex_osage_block* osg) { +void ExOsageBlock_field_40(ExOsageBlock* osg) { } -void ex_osage_block_field_48(ex_osage_block* osg) { +void ExOsageBlock_field_48(ExOsageBlock* osg) { void (*sub_14047F990) (rob_osage * a1, mat4 * a2, vec3 * a3, bool a4) = (void (*) (rob_osage*, mat4*, vec3*, bool))0x000000014047F990; osg->step = 4.0f; - ex_osage_block_set_wind_direction(osg); + ExOsageBlock_set_wind_direction(osg); rob_osage_coli_set(&osg->rob, osg->mat); bone_node* parent_node = osg->base.parent_bone_node; vec3 parent_scale = parent_node->exp_data.parent_scale; @@ -5289,7 +5259,7 @@ void ex_osage_block_field_48(ex_osage_block* osg) { osg->field_1FF8 &= ~2; } -void ex_osage_block_field_50(ex_osage_block* osg) { +void ExOsageBlock_field_50(ExOsageBlock* osg) { if (osg->base.field_59) { osg->base.field_59 = 0; return; @@ -5299,7 +5269,7 @@ void ex_osage_block_field_50(ex_osage_block* osg) { vec3 * parent_scale, float_t step, bool a5) = (void(*) (rob_osage*, mat4*, vec3*, float_t, bool))0x000000014047C770; - ex_osage_block_set_wind_direction(osg); + ExOsageBlock_set_wind_direction(osg); bone_node* parent_node = osg->base.parent_bone_node; vec3 parent_scale = parent_node->exp_data.parent_scale; @@ -5385,7 +5355,7 @@ void sub_14047E1C0(rob_osage* rob_osg, vec3* a2) { } } -void ex_osage_block_field_58(ex_osage_block* osg) { +void ExOsageBlock_field_58(ExOsageBlock* osg) { void (*_sub_14047E1C0) (rob_osage * a1, vec3 * a2) = (void (*) (rob_osage*, vec3*))0x000000014047E1C0; diff --git a/src/DivaGL/bone_data.h b/src/DivaGL/bone_data.hpp similarity index 54% rename from src/DivaGL/bone_data.h rename to src/DivaGL/bone_data.hpp index 649d3a14..1b222552 100644 --- a/src/DivaGL/bone_data.h +++ b/src/DivaGL/bone_data.hpp @@ -5,215 +5,41 @@ #pragma once -#include "../KKdLib/default.h" -#include "../KKdLib/mat.h" -#include "../KKdLib/string.h" -#include "../KKdLib/vec.h" -#include "../KKdLib/vector.h" -#include "shader_table.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/mat.hpp" +#include "../KKdLib/vec.hpp" +#include "string.hpp" +#include "vector.hpp" +#include "shader_table.hpp" #include -typedef enum shadow_type_enum { - SHADOW_CHARA = 0x00, - SHADOW_STAGE = 0x01, -} shadow_type_enum; +enum bone_database_bone_type { + BONE_DATABASE_BONE_ROTATION = 0x00, + BONE_DATABASE_BONE_TYPE_1 = 0x01, + BONE_DATABASE_BONE_POSITION = 0x02, + BONE_DATABASE_BONE_POSITION_ROTATION = 0x03, + BONE_DATABASE_BONE_HEAD_IK_ROTATION = 0x04, + BONE_DATABASE_BONE_ARM_IK_ROTATION = 0x05, + BONE_DATABASE_BONE_LEGS_IK_ROTATION = 0x06, + BONE_DATABASE_BONE_END = 0xFF, +}; -typedef enum aft_obj_vertex_attrib_type { - AFT_OBJ_VERTEX_ATTRIB_POSITION = 0x0001, - AFT_OBJ_VERTEX_ATTRIB_NORMAL = 0x0002, - AFT_OBJ_VERTEX_ATTRIB_TANGENT = 0x0004, - AFT_OBJ_VERTEX_ATTRIB_BINORMAL = 0x0008, - AFT_OBJ_VERTEX_ATTRIB_TEXCOORD0 = 0x0010, - AFT_OBJ_VERTEX_ATTRIB_TEXCOORD1 = 0x0020, - AFT_OBJ_VERTEX_ATTRIB_TEXCOORD2 = 0x0040, - AFT_OBJ_VERTEX_ATTRIB_TEXCOORD3 = 0x0080, - AFT_OBJ_VERTEX_ATTRIB_COLOR0 = 0x0100, - AFT_OBJ_VERTEX_ATTRIB_COLOR1 = 0x0200, - AFT_OBJ_VERTEX_ATTRIB_BONE_WEIGHT = 0x0400, - AFT_OBJ_VERTEX_ATTRIB_BONE_INDEX = 0x0800, - AFT_OBJ_VERTEX_ATTRIB_UNK_1000 = 0x1000, -} aft_obj_vertex_attrib_type; +enum bone_database_skeleton_type { + BONE_DATABASE_SKELETON_COMMON = 0, + BONE_DATABASE_SKELETON_MIKU = 1, + BONE_DATABASE_SKELETON_KAITO = 2, + BONE_DATABASE_SKELETON_LEN = 3, + BONE_DATABASE_SKELETON_LUKA = 4, + BONE_DATABASE_SKELETON_MEIKO = 5, + BONE_DATABASE_SKELETON_RIN = 6, + BONE_DATABASE_SKELETON_HAKU = 7, + BONE_DATABASE_SKELETON_NERU = 8, + BONE_DATABASE_SKELETON_SAKINE = 9, + BONE_DATABASE_SKELETON_TETO = 10, + BONE_DATABASE_SKELETON_NONE = -1, +}; -typedef enum aft_obj_mesh_flags { - AFT_OBJ_MESH_1 = 0x01, - AFT_OBJ_MESH_FACE_CAMERA_POSITION = 0x02, - AFT_OBJ_MESH_TRANSLUCENT_NO_SHADOW = 0x04, - AFT_OBJ_MESH_FACE_CAMERA_VIEW = 0x08, -} aft_obj_mesh_flags; - -typedef enum aft_obj_material_flags { - AFT_OBJ_MATERIAL_COLOR = 0x0001, - AFT_OBJ_MATERIAL_COLOR_ALPHA = 0x0002, - AFT_OBJ_MATERIAL_COLOR_L1 = 0x0004, - AFT_OBJ_MATERIAL_COLOR_L1_ALPHA = 0x0008, - AFT_OBJ_MATERIAL_COLOR_L2 = 0x0010, - AFT_OBJ_MATERIAL_COLOR_L2_ALPHA = 0x0020, - AFT_OBJ_MATERIAL_TRANSPARENCY = 0x0040, - AFT_OBJ_MATERIAL_SPECULAR = 0x0080, - AFT_OBJ_MATERIAL_NORMAL = 0x0100, - AFT_OBJ_MATERIAL_NORMALALT = 0x0200, - AFT_OBJ_MATERIAL_ENVIRONMENT = 0x0400, - AFT_OBJ_MATERIAL_COLOR_L3 = 0x0800, - AFT_OBJ_MATERIAL_COLOR_L3_ALPHA = 0x1000, - AFT_OBJ_MATERIAL_TRANSLUCENCY = 0x2000, - AFT_OBJ_MATERIAL_FLAG_14 = 0x4000, - AFT_OBJ_MATERIAL_OVERRIDE_IBL = 0x8000, -} aft_obj_material_flags; - -typedef enum aft_obj_material_texture_sampler_flags { - AFT_OBJ_MATERIAL_TEXTURE_SAMPLER_REPEAT_U = 0x00001, - AFT_OBJ_MATERIAL_TEXTURE_SAMPLER_REPEAT_V = 0x00002, - AFT_OBJ_MATERIAL_TEXTURE_SAMPLER_MIRROR_U = 0x00004, - AFT_OBJ_MATERIAL_TEXTURE_SAMPLER_MIRROR_V = 0x00008, - AFT_OBJ_MATERIAL_TEXTURE_SAMPLER_IGNORE_ALPHA = 0x00010, - AFT_OBJ_MATERIAL_TEXTURE_SAMPLER_BORDER = 0x08000, - AFT_OBJ_MATERIAL_TEXTURE_SAMPLER_CLAMP_TO_EDGE = 0x10000, -} aft_obj_material_texture_sampler_flags; - -typedef enum aft_obj_primitive_type { - AFT_OBJ_PRIMITIVE_POINTS = 0x00, - AFT_OBJ_PRIMITIVE_LINES = 0x01, - AFT_OBJ_PRIMITIVE_LINE_STRIP = 0x02, - AFT_OBJ_PRIMITIVE_LINE_LOOP = 0x03, - AFT_OBJ_PRIMITIVE_TRIANGLES = 0x04, - AFT_OBJ_PRIMITIVE_TRIANGLE_STRIP = 0x05, - AFT_OBJ_PRIMITIVE_TRIANGLE_FAN = 0x06, - AFT_OBJ_PRIMITIVE_QUADS = 0x07, - AFT_OBJ_PRIMITIVE_QUAD_STRIP = 0x08, - AFT_OBJ_PRIMITIVE_POLYGON = 0x09, -} aft_obj_primitive_type; - -typedef enum aft_obj_index_format { - AFT_OBJ_INDEX_U8 = 0x00, - AFT_OBJ_INDEX_U16 = 0x01, - AFT_OBJ_INDEX_U32 = 0x02, -} aft_obj_index_format; - -typedef enum aft_obj_sub_mesh_flags { - AFT_OBJ_SUB_MESH_RECIEVE_SHADOW = 0x01, - AFT_OBJ_SUB_MESH_CAST_SHADOW = 0x02, - AFT_OBJ_SUB_MESH_TRANSPARENT = 0x04, - AFT_OBJ_SUB_MESH_FLAG_8 = 0x08, - AFT_OBJ_SUB_MESH_FLAG_10 = 0x10, - AFT_OBJ_SUB_MESH_FLAG_20 = 0x20, - AFT_OBJ_SUB_MESH_FLAG_40 = 0x40, - AFT_OBJ_SUB_MESH_FLAG_80 = 0x80, -} aft_obj_sub_mesh_flags; - -typedef enum aft_obj_skin_block_constraint_type { - AFT_OBJ_SKIN_BLOCK_CONSTRAINT_NONE = 0x00, - AFT_OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION = 0x01, - AFT_OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION = 0x02, - AFT_OBJ_SKIN_BLOCK_CONSTRAINT_POSITION = 0x03, - AFT_OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE = 0x04, -} aft_obj_skin_block_constraint_type; - -typedef enum aft_obj_database_string_type { - AFT_OBJ_DATABASE_STRING_OBJECT_FILE_NAME = 0x00, - AFT_OBJ_DATABASE_STRING_TEXTURE_FILE_NAME = 0x01, - AFT_OBJ_DATABASE_STRING_ARCHIVE_FILE_NAME = 0x02, -} aft_obj_database_string_type; - -typedef enum aft_obj_material_texture_type { - AFT_OBJ_MATERIAL_TEXTURE_NONE = 0x0, - AFT_OBJ_MATERIAL_TEXTURE_COLOR = 0x01, - AFT_OBJ_MATERIAL_TEXTURE_NORMAL = 0x02, - AFT_OBJ_MATERIAL_TEXTURE_SPECULAR = 0x03, - AFT_OBJ_MATERIAL_TEXTURE_HEIGHT = 0x04, - AFT_OBJ_MATERIAL_TEXTURE_REFLECTION = 0x05, - AFT_OBJ_MATERIAL_TEXTURE_TRANSLUCENCY = 0x06, - AFT_OBJ_MATERIAL_TEXTURE_TRANSPARENCY = 0x07, - AFT_OBJ_MATERIAL_TEXTURE_ENVIRONMENT_SPHERE = 0x08, - AFT_OBJ_MATERIAL_TEXTURE_ENVIRONMENT_CUBE = 0x09, -} aft_obj_material_texture_type; - -typedef enum aft_obj_material_shader_vertex_tranlsation_type { - AFT_OBJ_MATERIAL_SHADER_VERTEX_TRANLSATION_DEFAULT = 0x00, - AFT_OBJ_MATERIAL_SHADER_VERTEX_TRANLSATION_ENVELOPE = 0x01, - AFT_OBJ_MATERIAL_SHADER_VERTEX_TRANLSATION_MORPHING = 0x02, -} aft_obj_material_shader_vertex_tranlsation_type; - -typedef enum aft_obj_material_shader_color_source_type { - AFT_OBJ_MATERIAL_SHADER_COLOR_SOURCE_MATERIAL_COLOR = 0x00, - AFT_OBJ_MATERIAL_SHADER_COLOR_SOURCE_VERTEX_COLOR = 0x01, - AFT_OBJ_MATERIAL_SHADER_COLOR_SOURCE_VERTEX_MORPH = 0x02, -} aft_obj_material_shader_color_source_type; - -typedef enum aft_obj_material_shader_bump_map_type { - AFT_OBJ_MATERIAL_SHADER_BUMP_MAP_NONE = 0x00, - AFT_OBJ_MATERIAL_SHADER_BUMP_MAP_DOT = 0x01, - AFT_OBJ_MATERIAL_SHADER_BUMP_MAP_ENV = 0x02, -} aft_obj_material_shader_bump_map_type; - -typedef enum aft_obj_material_shader_specular_quality { - AFT_OBJ_MATERIAL_SHADER_SPECULAR_QUALITY_LOW = 0x00, - AFT_OBJ_MATERIAL_SHADER_SPECULAR_QUALITY_HIGH = 0x01, -} aft_obj_material_shader_specular_quality; - -typedef enum aft_obj_material_shader_aniso_direction { - AFT_OBJ_MATERIAL_SHADER_ANISO_DIRECTION_NORMAL = 0x00, - AFT_OBJ_MATERIAL_SHADER_ANISO_DIRECTION_U = 0x01, - AFT_OBJ_MATERIAL_SHADER_ANISO_DIRECTION_V = 0x02, - AFT_OBJ_MATERIAL_SHADER_ANISO_DIRECTION_RADIAL = 0x03, -} aft_obj_material_shader_aniso_direction; - -typedef enum aft_obj_material_shader_blend_factor { - AFT_OBJ_MATERIAL_SHADER_BLEND_FACTOR_ZERO = 0x0, - AFT_OBJ_MATERIAL_SHADER_BLEND_FACTOR_ONE = 0x1, - AFT_OBJ_MATERIAL_SHADER_BLEND_FACTOR_SRC_COLOR = 0x2, - AFT_OBJ_MATERIAL_SHADER_BLEND_FACTOR_INVERSE_SRC_COLOR = 0x3, - AFT_OBJ_MATERIAL_SHADER_BLEND_FACTOR_SRC_ALPHA = 0x4, - AFT_OBJ_MATERIAL_SHADER_BLEND_FACTOR_INVERSE_SRC_ALPHA = 0x5, - AFT_OBJ_MATERIAL_SHADER_BLEND_FACTOR_DST_ALPHA = 0x6, - AFT_OBJ_MATERIAL_SHADER_BLEND_FACTOR_INVERSE_DST_ALPHA = 0x7, - AFT_OBJ_MATERIAL_SHADER_BLEND_FACTOR_DST_COLOR = 0x8, - AFT_OBJ_MATERIAL_SHADER_BLEND_FACTOR_INVERSE_DST_COLOR = 0x9, -} aft_obj_material_shader_blend_factor; - -typedef enum aft_obj_material_specular_quality { - AFT_OBJ_MATERIAL_SPECULAR_QUALITY_LOW = 0x00, - AFT_OBJ_MATERIAL_SPECULAR_QUALITY_HIGH = 0x01, -} aft_obj_material_specular_quality; - -typedef enum aft_obj_material_vertex_translation_type { - AFT_OBJ_MATERIAL_VERTEX_TRANSLATION_DEFAULT = 0x00, - AFT_OBJ_MATERIAL_VERTEX_TRANSLATION_ENVELOPE = 0x01, - AFT_OBJ_MATERIAL_VERTEX_TRANSLATION_MORPHING = 0x02, -} aft_obj_material_vertex_translation_type; - -typedef enum aft_obj_material_shader_lighting_type { - AFT_OBJ_MATERIAL_SHADER_LIGHTING_LAMBERT = 0x00, - AFT_OBJ_MATERIAL_SHADER_LIGHTING_CONSTANT = 0x01, - AFT_OBJ_MATERIAL_SHADER_LIGHTING_PHONG = 0x02, -} aft_obj_material_shader_lighting_type; - -typedef enum aft_bone_database_bone_type { - AFT_BONE_DATABASE_BONE_ROTATION = 0x00, - AFT_BONE_DATABASE_BONE_TYPE_1 = 0x01, - AFT_BONE_DATABASE_BONE_POSITION = 0x02, - AFT_BONE_DATABASE_BONE_POSITION_ROTATION = 0x03, - AFT_BONE_DATABASE_BONE_HEAD_IK_ROTATION = 0x04, - AFT_BONE_DATABASE_BONE_ARM_IK_ROTATION = 0x05, - AFT_BONE_DATABASE_BONE_LEGS_IK_ROTATION = 0x06, - AFT_BONE_DATABASE_BONE_END = 0xFF, -} aft_bone_database_bone_type; - -typedef enum aft_bone_database_skeleton_type { - AFT_BONE_DATABASE_SKELETON_COMMON = 0, - AFT_BONE_DATABASE_SKELETON_MIKU = 1, - AFT_BONE_DATABASE_SKELETON_KAITO = 2, - AFT_BONE_DATABASE_SKELETON_LEN = 3, - AFT_BONE_DATABASE_SKELETON_LUKA = 4, - AFT_BONE_DATABASE_SKELETON_MEIKO = 5, - AFT_BONE_DATABASE_SKELETON_RIN = 6, - AFT_BONE_DATABASE_SKELETON_HAKU = 7, - AFT_BONE_DATABASE_SKELETON_NERU = 8, - AFT_BONE_DATABASE_SKELETON_SAKINE = 9, - AFT_BONE_DATABASE_SKELETON_TETO = 10, - AFT_BONE_DATABASE_SKELETON_NONE = -1, -} aft_bone_database_skeleton_type; - -typedef enum chara_index { +enum chara_index { CHARA_MIKU = 0, CHARA_RIN = 1, CHARA_LEN = 2, @@ -225,9 +51,9 @@ typedef enum chara_index { CHARA_SAKINE = 8, CHARA_TETO = 9, CHARA_MAX = 10, -} chara_index; +}; -typedef enum draw_task_flags { +enum draw_task_flags { DRAW_TASK_SHADOW = 0x00000001, DRAW_TASK_2 = 0x00000002, DRAW_TASK_4 = 0x00000004, @@ -260,131 +86,200 @@ typedef enum draw_task_flags { DRAW_TASK_20000000 = 0x20000000, DRAW_TASK_40000000 = 0x40000000, DRAW_TASK_NO_TRANSLUCENCY = 0x80000000, -} draw_task_flags; +}; -typedef enum ex_expression_block_stack_type { +enum ex_expression_block_stack_type { EX_EXPRESSION_BLOCK_STACK_NUMBER = 0x00, EX_EXPRESSION_BLOCK_STACK_VARIABLE = 0x01, EX_EXPRESSION_BLOCK_STACK_VARIABLE_RADIAN = 0x02, EX_EXPRESSION_BLOCK_STACK_OP1 = 0x03, EX_EXPRESSION_BLOCK_STACK_OP2 = 0x04, EX_EXPRESSION_BLOCK_STACK_OP3 = 0x05, -} ex_expression_block_stack_type; +}; -typedef enum ex_node_type { +enum ExNodeType { EX_NONE = 0x00, EX_OSAGE = 0x01, EX_EXPRESSION = 0x02, EX_CONSTRAINT = 0x03, EX_CLOTH = 0x04, -} ex_node_type; +}; -typedef enum eyes_base_adjust_type { - EYES_BASE_ADJUST_DIRECTION = 0, - EYES_BASE_ADJUST_CLEARANCE = 1, - EYES_BASE_ADJUST_OFF = 2, -} eyes_base_adjust_type; +enum eyes_base_adjust_type { + EYES_BASE_ADJUST_NONE = -1, + EYES_BASE_ADJUST_DIRECTION = 0x00, + EYES_BASE_ADJUST_CLEARANCE = 0x01, + EYES_BASE_ADJUST_OFF = 0x02, + EYES_BASE_ADJUST_MAX = 0x03, +}; -typedef enum mot_key_set_type { +enum item_id { + ITEM_NONE = -1, + ITEM_BODY = 0x00, + ITEM_ATAMA = 0x01, + ITEM_KATA_R = 0x02, + ITEM_MUNE = 0x03, + ITEM_KATA_L = 0x04, + ITEM_UDE_R = 0x05, + ITEM_SENAKA = 0x06, + ITEM_UDE_L = 0x07, + ITEM_HARA = 0x08, + ITEM_KOSI = 0x09, + ITEM_TE_R = 0x0A, + ITEM_TE_L = 0x0B, + ITEM_MOMO = 0x0C, + ITEM_SUNE = 0x0D, + ITEM_ASI = 0x0E, + ITEM_KAMI = 0x0F, + ITEM_OUTER = 0x10, + ITEM_PANTS = 0x11, + ITEM_ZUJO = 0x12, + ITEM_MEGANE = 0x13, + ITEM_KUBI = 0x14, + ITEM_JOHA_USHIRO = 0x15, + ITEM_KUCHI = 0x16, + ITEM_ITEM09 = 0x17, + ITEM_ITEM10 = 0x18, + ITEM_ITEM11 = 0x19, + ITEM_ITEM12 = 0x1A, + ITEM_ITEM13 = 0x1B, + ITEM_ITEM14 = 0x1C, + ITEM_ITEM15 = 0x1D, + ITEM_ITEM16 = 0x1E, + ITEM_MAX = 0x1F, +}; + +enum item_sub_id { + ITEM_SUB_NONE = -1, + ITEM_SUB_ZUJO = 0x00, + ITEM_SUB_KAMI = 0x01, + ITEM_SUB_HITAI = 0x02, + ITEM_SUB_ME = 0x03, + ITEM_SUB_MEGANE = 0x04, + ITEM_SUB_MIMI = 0x05, + ITEM_SUB_KUCHI = 0x06, + ITEM_SUB_MAKI = 0x07, + ITEM_SUB_KUBI = 0x08, + ITEM_SUB_INNER = 0x09, + ITEM_SUB_OUTER = 0x0A, + ITEM_SUB_JOHA_MAE = 0x0B, + ITEM_SUB_JOHA_USHIRO = 0x0C, + ITEM_SUB_HADA = 0x0D, + ITEM_SUB_KATA = 0x0E, + ITEM_SUB_U_UDE = 0x0F, + ITEM_SUB_L_UDE = 0x10, + ITEM_SUB_TE = 0x11, + ITEM_SUB_BELT = 0x12, + ITEM_SUB_COSI = 0x13, + ITEM_SUB_PANTS = 0x14, + ITEM_SUB_ASI = 0x15, + ITEM_SUB_SUNE = 0x16, + ITEM_SUB_KUTSU = 0x17, + ITEM_SUB_HEAD = 0x18, + ITEM_SUB_MAX = 0x19, +}; + +enum mot_key_set_type { MOT_KEY_SET_NONE = 0x00, MOT_KEY_SET_STATIC = 0x01, MOT_KEY_SET_HERMITE = 0x02, MOT_KEY_SET_HERMITE_TANGENT = 0x03, -} mot_key_set_type; +}; -typedef enum mothead_data_type { - MOTHEAD_DATA_TYPE_0 = 0x00, - MOTHEAD_DATA_TYPE_1 = 0x01, - MOTHEAD_DATA_TYPE_2 = 0x02, - MOTHEAD_DATA_TYPE_3 = 0x03, - MOTHEAD_DATA_TYPE_4 = 0x04, - MOTHEAD_DATA_TYPE_5 = 0x05, - MOTHEAD_DATA_TYPE_6 = 0x06, - MOTHEAD_DATA_TYPE_7 = 0x07, - MOTHEAD_DATA_TYPE_8 = 0x08, - MOTHEAD_DATA_TYPE_9 = 0x09, - MOTHEAD_DATA_TYPE_10 = 0x0A, - MOTHEAD_DATA_TYPE_11 = 0x0B, - MOTHEAD_DATA_TYPE_12 = 0x0C, - MOTHEAD_DATA_TYPE_13 = 0x0D, - MOTHEAD_DATA_TYPE_14 = 0x0E, - MOTHEAD_DATA_TYPE_15 = 0x0F, - MOTHEAD_DATA_TYPE_16 = 0x10, - MOTHEAD_DATA_TYPE_17 = 0x11, - MOTHEAD_DATA_TYPE_18 = 0x12, - MOTHEAD_DATA_TYPE_19 = 0x13, - MOTHEAD_DATA_TYPE_20 = 0x14, - MOTHEAD_DATA_TYPE_21 = 0x15, - MOTHEAD_DATA_TYPE_22 = 0x16, - MOTHEAD_DATA_TYPE_23 = 0x17, - MOTHEAD_DATA_TYPE_24 = 0x18, - MOTHEAD_DATA_TYPE_25 = 0x19, - MOTHEAD_DATA_TYPE_26 = 0x1A, - MOTHEAD_DATA_TYPE_27 = 0x1B, - MOTHEAD_DATA_TYPE_28 = 0x1C, - MOTHEAD_DATA_TYPE_29 = 0x1D, - MOTHEAD_DATA_TYPE_30 = 0x1E, - MOTHEAD_DATA_TYPE_31 = 0x1F, - MOTHEAD_DATA_TYPE_32 = 0x20, - MOTHEAD_DATA_TYPE_33 = 0x21, - MOTHEAD_DATA_TYPE_34 = 0x22, - MOTHEAD_DATA_TYPE_35 = 0x23, - MOTHEAD_DATA_TYPE_36 = 0x24, - MOTHEAD_DATA_TYPE_37 = 0x25, - MOTHEAD_DATA_TYPE_38 = 0x26, - MOTHEAD_DATA_TYPE_39 = 0x27, - MOTHEAD_DATA_TYPE_40 = 0x28, - MOTHEAD_DATA_TYPE_41 = 0x29, - MOTHEAD_DATA_TYPE_42 = 0x2A, - MOTHEAD_DATA_TYPE_43 = 0x2B, - MOTHEAD_DATA_TYPE_44 = 0x2C, - MOTHEAD_DATA_TYPE_45 = 0x2D, - MOTHEAD_DATA_TYPE_46 = 0x2E, - MOTHEAD_DATA_TYPE_47 = 0x2F, - MOTHEAD_DATA_TYPE_48 = 0x30, - MOTHEAD_DATA_TYPE_49 = 0x31, - MOTHEAD_DATA_TYPE_50 = 0x32, - MOTHEAD_DATA_TYPE_51 = 0x33, - MOTHEAD_DATA_TYPE_52 = 0x34, - MOTHEAD_DATA_TYPE_53 = 0x35, - MOTHEAD_DATA_TYPE_54 = 0x36, - MOTHEAD_DATA_TYPE_55 = 0x37, - MOTHEAD_DATA_TYPE_56 = 0x38, - MOTHEAD_DATA_TYPE_57 = 0x39, - MOTHEAD_DATA_TYPE_58 = 0x3A, - MOTHEAD_DATA_TYPE_59 = 0x3B, - MOTHEAD_DATA_TYPE_60 = 0x3C, - MOTHEAD_DATA_TYPE_61 = 0x3D, - MOTHEAD_DATA_TYPE_62 = 0x3E, - MOTHEAD_DATA_TYPE_63 = 0x3F, - MOTHEAD_DATA_TYPE_64 = 0x40, - MOTHEAD_DATA_TYPE_65 = 0x41, - MOTHEAD_DATA_TYPE_66 = 0x42, - MOTHEAD_DATA_TYPE_67 = 0x43, - MOTHEAD_DATA_TYPE_68 = 0x44, - MOTHEAD_DATA_TYPE_69 = 0x45, - MOTHEAD_DATA_TYPE_70 = 0x46, - MOTHEAD_DATA_TYPE_71 = 0x47, - MOTHEAD_DATA_TYPE_72 = 0x48, - MOTHEAD_DATA_TYPE_73 = 0x49, - MOTHEAD_DATA_TYPE_74 = 0x4A, - MOTHEAD_DATA_TYPE_75 = 0x4B, - MOTHEAD_DATA_TYPE_76 = 0x4C, - MOTHEAD_DATA_TYPE_77 = 0x4D, - MOTHEAD_DATA_TYPE_78 = 0x4E, - MOTHEAD_DATA_TYPE_79 = 0x4F, - MOTHEAD_DATA_TYPE_80 = 0x50, -} mothead_data_type; +enum mothead_data_type { + MOTHEAD_DATA_TYPE_0 = 0x00, + MOTHEAD_DATA_TYPE_1 = 0x01, + MOTHEAD_DATA_TYPE_2 = 0x02, + MOTHEAD_DATA_TYPE_3 = 0x03, + MOTHEAD_DATA_TYPE_4 = 0x04, + MOTHEAD_DATA_TYPE_5 = 0x05, + MOTHEAD_DATA_TYPE_6 = 0x06, + MOTHEAD_DATA_TYPE_7 = 0x07, + MOTHEAD_DATA_TYPE_8 = 0x08, + MOTHEAD_DATA_TYPE_9 = 0x09, + MOTHEAD_DATA_TYPE_10 = 0x0A, + MOTHEAD_DATA_TYPE_11 = 0x0B, + MOTHEAD_DATA_TYPE_12 = 0x0C, + MOTHEAD_DATA_TYPE_13 = 0x0D, + MOTHEAD_DATA_TYPE_14 = 0x0E, + MOTHEAD_DATA_TYPE_15 = 0x0F, + MOTHEAD_DATA_TYPE_16 = 0x10, + MOTHEAD_DATA_TYPE_17 = 0x11, + MOTHEAD_DATA_TYPE_18 = 0x12, + MOTHEAD_DATA_TYPE_19 = 0x13, + MOTHEAD_DATA_TYPE_20 = 0x14, + MOTHEAD_DATA_TYPE_21 = 0x15, + MOTHEAD_DATA_TYPE_22 = 0x16, + MOTHEAD_DATA_TYPE_23 = 0x17, + MOTHEAD_DATA_TYPE_24 = 0x18, + MOTHEAD_DATA_TYPE_25 = 0x19, + MOTHEAD_DATA_TYPE_26 = 0x1A, + MOTHEAD_DATA_TYPE_27 = 0x1B, + MOTHEAD_DATA_TYPE_28 = 0x1C, + MOTHEAD_DATA_TYPE_29 = 0x1D, + MOTHEAD_DATA_TYPE_30 = 0x1E, + MOTHEAD_DATA_TYPE_31 = 0x1F, + MOTHEAD_DATA_TYPE_32 = 0x20, + MOTHEAD_DATA_TYPE_33 = 0x21, + MOTHEAD_DATA_TYPE_34 = 0x22, + MOTHEAD_DATA_TYPE_35 = 0x23, + MOTHEAD_DATA_TYPE_36 = 0x24, + MOTHEAD_DATA_TYPE_37 = 0x25, + MOTHEAD_DATA_TYPE_38 = 0x26, + MOTHEAD_DATA_TYPE_39 = 0x27, + MOTHEAD_DATA_TYPE_40 = 0x28, + MOTHEAD_DATA_TYPE_41 = 0x29, + MOTHEAD_DATA_TYPE_42 = 0x2A, + MOTHEAD_DATA_TYPE_43 = 0x2B, + MOTHEAD_DATA_TYPE_44 = 0x2C, + MOTHEAD_DATA_TYPE_45 = 0x2D, + MOTHEAD_DATA_TYPE_46 = 0x2E, + MOTHEAD_DATA_TYPE_47 = 0x2F, + MOTHEAD_DATA_TYPE_48 = 0x30, + MOTHEAD_DATA_TYPE_49 = 0x31, + MOTHEAD_DATA_SET_FACE_MOTION_ID = 0x32, + MOTHEAD_DATA_TYPE_51 = 0x33, + MOTHEAD_DATA_TYPE_52 = 0x34, + MOTHEAD_DATA_SET_FACE_MOTTBL_MOTION = 0x35, + MOTHEAD_DATA_SET_HAND_R_MOTTBL_MOTION = 0x36, + MOTHEAD_DATA_SET_HAND_L_MOTTBL_MOTION = 0x37, + MOTHEAD_DATA_SET_MOUTH_MOTTBL_MOTION = 0x38, + MOTHEAD_DATA_SET_EYES_MOTTBL_MOTION = 0x39, + MOTHEAD_DATA_SET_EYELID_MOTTBL_MOTION = 0x3A, + MOTHEAD_DATA_SET_ROB_CHARA_HEAD_OBJECT = 0x3B, + MOTHEAD_DATA_TYPE_60 = 0x3C, + MOTHEAD_DATA_SET_EYELID_MOTION_FROM_FACE = 0x3D, + MOTHEAD_DATA_ROB_PARTS_ADJUST = 0x3E, + MOTHEAD_DATA_TYPE_63 = 0x3F, + MOTHEAD_DATA_WIND_RESET = 0x40, + MOTHEAD_DATA_OSAGE_RESET = 0x41, + MOTHEAD_DATA_OSAGE_STEP = 0x42, + MOTHEAD_DATA_TYPE_67 = 0x43, + MOTHEAD_DATA_TYPE_68 = 0x44, + MOTHEAD_DATA_TYPE_69 = 0x45, + MOTHEAD_DATA_TYPE_70 = 0x46, + MOTHEAD_DATA_OSAGE_MOVE_CANCEL = 0x47, + MOTHEAD_DATA_TYPE_72 = 0x48, + MOTHEAD_DATA_ROB_HAND_ADJUST = 0x49, + MOTHEAD_DATA_TYPE_74 = 0x4A, + 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, + MOTHEAD_DATA_MAX = 0x51, +}; -typedef enum motion_blend_type { +enum MotionBlendType { MOTION_BLEND_NONE = -1, MOTION_BLEND = 0x00, MOTION_BLEND_FREEZE = 0x01, MOTION_BLEND_CROSS = 0x02, MOTION_BLEND_COMBINE = 0x03, -} motion_blend_type; +}; -typedef enum motion_bone_index { +enum motion_bone_index { MOTION_BONE_NONE = -1, MOTION_BONE_N_HARA_CP = 0x00, MOTION_BONE_KG_HARA_Y = 0x01, @@ -572,48 +467,462 @@ typedef enum motion_bone_index { MOTION_BONE_N_HARA_B_WJ_EX = 0xB7, MOTION_BONE_N_HARA_C_WJ_EX = 0xB8, MOTION_BONE_MAX = 0xB9, -} motion_bone_index; +}; -typedef enum rob_sub_action_execute_type { - ROB_SUB_ACTION_EXECUTE_NONE = 0, - ROB_SUB_ACTION_EXECUTE_CRY = 1, - ROB_SUB_ACTION_EXECUTE_SHAKE_HAND = 2, - ROB_SUB_ACTION_EXECUTE_EMBARRASSED = 3, - ROB_SUB_ACTION_EXECUTE_ANGRY = 4, - ROB_SUB_ACTION_EXECUTE_LAUGH = 5, - ROB_SUB_ACTION_EXECUTE_COUNT_NUM = 6, -} rob_sub_action_execute_type; +enum obj_vertex_format : uint32_t { + OBJ_VERTEX_NONE = 0x0000, + OBJ_VERTEX_POSITION = 0x0001, + OBJ_VERTEX_NORMAL = 0x0002, + OBJ_VERTEX_TANGENT = 0x0004, + OBJ_VERTEX_BINORMAL = 0x0008, + OBJ_VERTEX_TEXCOORD0 = 0x0010, + OBJ_VERTEX_TEXCOORD1 = 0x0020, + OBJ_VERTEX_TEXCOORD2 = 0x0040, + OBJ_VERTEX_TEXCOORD3 = 0x0080, + OBJ_VERTEX_COLOR0 = 0x0100, + OBJ_VERTEX_COLOR1 = 0x0200, + OBJ_VERTEX_BONE_WEIGHT = 0x0400, + OBJ_VERTEX_BONE_INDEX = 0x0800, + OBJ_VERTEX_UNK_1000 = 0x1000, +}; -typedef enum rob_sub_action_param_type { - ROB_SUB_ACTION_PARAM_NONE = 0, - ROB_SUB_ACTION_PARAM_CRY = 1, - ROB_SUB_ACTION_PARAM_SHAKE_HAND = 2, - ROB_SUB_ACTION_PARAM_EMBARRASSED = 3, - ROB_SUB_ACTION_PARAM_ANGRY = 4, - ROB_SUB_ACTION_PARAM_LAUGH = 5, - ROB_SUB_ACTION_PARAM_COUNT_NUM = 6, -} rob_sub_action_param_type; +enum obj_mesh_flags { + OBJ_MESH_1 = 0x01, + OBJ_MESH_FACE_CAMERA_POSITION = 0x02, + OBJ_MESH_TRANSLUCENT_NO_SHADOW = 0x04, + OBJ_MESH_FACE_CAMERA_VIEW = 0x08, +}; -typedef enum texture_flags { +enum obj_material_flags { + 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_texture_sampler_flags { + OBJ_MATERIAL_TEXTURE_SAMPLER_REPEAT_U = 0x00001, + OBJ_MATERIAL_TEXTURE_SAMPLER_REPEAT_V = 0x00002, + OBJ_MATERIAL_TEXTURE_SAMPLER_MIRROR_U = 0x00004, + OBJ_MATERIAL_TEXTURE_SAMPLER_MIRROR_V = 0x00008, + OBJ_MATERIAL_TEXTURE_SAMPLER_IGNORE_ALPHA = 0x00010, + OBJ_MATERIAL_TEXTURE_SAMPLER_BORDER = 0x08000, + OBJ_MATERIAL_TEXTURE_SAMPLER_CLAMP_TO_EDGE = 0x10000, +}; + +enum obj_primitive_type { + OBJ_PRIMITIVE_POINTS = 0x00, + OBJ_PRIMITIVE_LINES = 0x01, + OBJ_PRIMITIVE_LINE_STRIP = 0x02, + OBJ_PRIMITIVE_LINE_LOOP = 0x03, + OBJ_PRIMITIVE_TRIANGLES = 0x04, + OBJ_PRIMITIVE_TRIANGLE_STRIP = 0x05, + OBJ_PRIMITIVE_TRIANGLE_FAN = 0x06, + OBJ_PRIMITIVE_QUADS = 0x07, + OBJ_PRIMITIVE_QUAD_STRIP = 0x08, + OBJ_PRIMITIVE_POLYGON = 0x09, +}; + +enum obj_index_format { + OBJ_INDEX_U8 = 0x00, + OBJ_INDEX_U16 = 0x01, + OBJ_INDEX_U32 = 0x02, +}; + +enum obj_sub_mesh_flags { + 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_skin_block_constraint_type { + OBJ_SKIN_BLOCK_CONSTRAINT_NONE = 0x00, + OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION = 0x01, + OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION = 0x02, + OBJ_SKIN_BLOCK_CONSTRAINT_POSITION = 0x03, + OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE = 0x04, +}; + +enum obj_database_string_type { + OBJ_DATABASE_STRING_OBJECT_FILE_NAME = 0x00, + OBJ_DATABASE_STRING_TEXTURE_FILE_NAME = 0x01, + OBJ_DATABASE_STRING_ARCHIVE_FILE_NAME = 0x02, +}; + +enum obj_material_texture_type { + OBJ_MATERIAL_TEXTURE_NONE = 0x0, + OBJ_MATERIAL_TEXTURE_COLOR = 0x01, + OBJ_MATERIAL_TEXTURE_NORMAL = 0x02, + OBJ_MATERIAL_TEXTURE_SPECULAR = 0x03, + OBJ_MATERIAL_TEXTURE_HEIGHT = 0x04, + OBJ_MATERIAL_TEXTURE_REFLECTION = 0x05, + OBJ_MATERIAL_TEXTURE_TRANSLUCENCY = 0x06, + OBJ_MATERIAL_TEXTURE_TRANSPARENCY = 0x07, + OBJ_MATERIAL_TEXTURE_ENVIRONMENT_SPHERE = 0x08, + OBJ_MATERIAL_TEXTURE_ENVIRONMENT_CUBE = 0x09, +}; + +enum obj_material_shader_vertex_tranlsation_type { + OBJ_MATERIAL_SHADER_VERTEX_TRANLSATION_DEFAULT = 0x00, + OBJ_MATERIAL_SHADER_VERTEX_TRANLSATION_ENVELOPE = 0x01, + OBJ_MATERIAL_SHADER_VERTEX_TRANLSATION_MORPHING = 0x02, +}; + +enum obj_material_shader_color_source_type { + OBJ_MATERIAL_SHADER_COLOR_SOURCE_MATERIAL_COLOR = 0x00, + OBJ_MATERIAL_SHADER_COLOR_SOURCE_VERTEX_COLOR = 0x01, + OBJ_MATERIAL_SHADER_COLOR_SOURCE_VERTEX_MORPH = 0x02, +}; + +enum obj_material_shader_bump_map_type { + OBJ_MATERIAL_SHADER_BUMP_MAP_NONE = 0x00, + OBJ_MATERIAL_SHADER_BUMP_MAP_DOT = 0x01, + OBJ_MATERIAL_SHADER_BUMP_MAP_ENV = 0x02, +}; + +enum obj_material_shader_specular_quality { + OBJ_MATERIAL_SHADER_SPECULAR_QUALITY_LOW = 0x00, + OBJ_MATERIAL_SHADER_SPECULAR_QUALITY_HIGH = 0x01, +}; + +enum obj_material_shader_aniso_direction { + OBJ_MATERIAL_SHADER_ANISO_DIRECTION_NORMAL = 0x00, + OBJ_MATERIAL_SHADER_ANISO_DIRECTION_U = 0x01, + OBJ_MATERIAL_SHADER_ANISO_DIRECTION_V = 0x02, + OBJ_MATERIAL_SHADER_ANISO_DIRECTION_RADIAL = 0x03, +}; + +enum obj_material_shader_blend_factor { + OBJ_MATERIAL_SHADER_BLEND_FACTOR_ZERO = 0x0, + OBJ_MATERIAL_SHADER_BLEND_FACTOR_ONE = 0x1, + OBJ_MATERIAL_SHADER_BLEND_FACTOR_SRC_COLOR = 0x2, + OBJ_MATERIAL_SHADER_BLEND_FACTOR_INVERSE_SRC_COLOR = 0x3, + OBJ_MATERIAL_SHADER_BLEND_FACTOR_SRC_ALPHA = 0x4, + OBJ_MATERIAL_SHADER_BLEND_FACTOR_INVERSE_SRC_ALPHA = 0x5, + OBJ_MATERIAL_SHADER_BLEND_FACTOR_DST_ALPHA = 0x6, + OBJ_MATERIAL_SHADER_BLEND_FACTOR_INVERSE_DST_ALPHA = 0x7, + OBJ_MATERIAL_SHADER_BLEND_FACTOR_DST_COLOR = 0x8, + OBJ_MATERIAL_SHADER_BLEND_FACTOR_INVERSE_DST_COLOR = 0x9, +}; + +enum obj_material_specular_quality { + OBJ_MATERIAL_SPECULAR_QUALITY_LOW = 0x00, + OBJ_MATERIAL_SPECULAR_QUALITY_HIGH = 0x01, +}; + +enum obj_material_vertex_translation_type { + OBJ_MATERIAL_VERTEX_TRANSLATION_DEFAULT = 0x00, + OBJ_MATERIAL_VERTEX_TRANSLATION_ENVELOPE = 0x01, + OBJ_MATERIAL_VERTEX_TRANSLATION_MORPHING = 0x02, +}; + +enum obj_material_shader_lighting_type { + OBJ_MATERIAL_SHADER_LIGHTING_LAMBERT = 0x00, + OBJ_MATERIAL_SHADER_LIGHTING_CONSTANT = 0x01, + OBJ_MATERIAL_SHADER_LIGHTING_PHONG = 0x02, +}; + +enum rob_bone_index { + ROB_BONE_NONE = -1, + ROB_BONE_N_HARA_CP = 0x00, + ROB_BONE_KG_HARA_Y = 0x01, + ROB_BONE_KL_HARA_XZ = 0x02, + ROB_BONE_KL_HARA_ETC = 0x03, + ROB_BONE_N_HARA = 0x04, + ROB_BONE_CL_MUNE = 0x05, + ROB_BONE_N_MUNE_B = 0x06, + ROB_BONE_KL_MUNE_B_WJ = 0x07, + ROB_BONE_KL_KUBI = 0x08, + ROB_BONE_N_KAO = 0x09, + ROB_BONE_CL_KAO = 0x0A, + ROB_BONE_FACE_ROOT = 0x0B, + ROB_BONE_N_AGO = 0x0C, + ROB_BONE_KL_AGO_WJ = 0x0D, + ROB_BONE_N_TOOTH_UNDER = 0x0E, + ROB_BONE_TL_TOOTH_UNDER_WJ = 0x0F, + ROB_BONE_N_EYE_L = 0x10, + ROB_BONE_KL_EYE_L = 0x11, + ROB_BONE_N_EYE_L_WJ_EX = 0x12, + ROB_BONE_KL_HIGHLIGHT_L_WJ = 0x13, + ROB_BONE_N_EYE_R = 0x14, + ROB_BONE_KL_EYE_R = 0x15, + ROB_BONE_N_EYE_R_WJ_EX = 0x16, + ROB_BONE_KL_HIGHLIGHT_R_WJ = 0x17, + ROB_BONE_N_EYELID_L_A = 0x18, + ROB_BONE_TL_EYELID_L_A_WJ = 0x19, + ROB_BONE_N_EYELID_L_B = 0x1A, + ROB_BONE_TL_EYELID_L_B_WJ = 0x1B, + ROB_BONE_N_EYELID_R_A = 0x1C, + ROB_BONE_TL_EYELID_R_A_WJ = 0x1D, + ROB_BONE_N_EYELID_R_B = 0x1E, + ROB_BONE_TL_EYELID_R_B_WJ = 0x1F, + ROB_BONE_N_KUTI_D = 0x20, + ROB_BONE_TL_KUTI_D_WJ = 0x21, + ROB_BONE_N_KUTI_D_L = 0x22, + ROB_BONE_TL_KUTI_D_L_WJ = 0x23, + ROB_BONE_N_KUTI_D_R = 0x24, + ROB_BONE_TL_KUTI_D_R_WJ = 0x25, + ROB_BONE_N_KUTI_DS_L = 0x26, + ROB_BONE_TL_KUTI_DS_L_WJ = 0x27, + ROB_BONE_N_KUTI_DS_R = 0x28, + ROB_BONE_TL_KUTI_DS_R_WJ = 0x29, + ROB_BONE_N_KUTI_L = 0x2A, + ROB_BONE_TL_KUTI_L_WJ = 0x2B, + ROB_BONE_N_KUTI_M_L = 0x2C, + ROB_BONE_TL_KUTI_M_L_WJ = 0x2D, + ROB_BONE_N_KUTI_M_R = 0x2E, + ROB_BONE_TL_KUTI_M_R_WJ = 0x2F, + ROB_BONE_N_KUTI_R = 0x30, + ROB_BONE_TL_KUTI_R_WJ = 0x31, + ROB_BONE_N_KUTI_U = 0x32, + ROB_BONE_TL_KUTI_U_WJ = 0x33, + ROB_BONE_N_KUTI_U_L = 0x34, + ROB_BONE_TL_KUTI_U_L_WJ = 0x35, + ROB_BONE_N_KUTI_U_R = 0x36, + ROB_BONE_TL_KUTI_U_R_WJ = 0x37, + ROB_BONE_N_MABU_L_D_A = 0x38, + ROB_BONE_TL_MABU_L_D_A_WJ = 0x39, + ROB_BONE_N_MABU_L_D_B = 0x3A, + ROB_BONE_TL_MABU_L_D_B_WJ = 0x3B, + ROB_BONE_N_MABU_L_D_C = 0x3C, + ROB_BONE_TL_MABU_L_D_C_WJ = 0x3D, + ROB_BONE_N_MABU_L_U_A = 0x3E, + ROB_BONE_TL_MABU_L_U_A_WJ = 0x3F, + ROB_BONE_N_MABU_L_U_B = 0x40, + ROB_BONE_TL_MABU_L_U_B_WJ = 0x41, + ROB_BONE_N_EYELASHES_L = 0x42, + ROB_BONE_TL_EYELASHES_L_WJ = 0x43, + ROB_BONE_N_MABU_L_U_C = 0x44, + ROB_BONE_TL_MABU_L_U_C_WJ = 0x45, + ROB_BONE_N_MABU_R_D_A = 0x46, + ROB_BONE_TL_MABU_R_D_A_WJ = 0x47, + ROB_BONE_N_MABU_R_D_B = 0x48, + ROB_BONE_TL_MABU_R_D_B_WJ = 0x49, + ROB_BONE_N_MABU_R_D_C = 0x4A, + ROB_BONE_TL_MABU_R_D_C_WJ = 0x4B, + ROB_BONE_N_MABU_R_U_A = 0x4C, + ROB_BONE_TL_MABU_R_U_A_WJ = 0x4D, + ROB_BONE_N_MABU_R_U_B = 0x4E, + ROB_BONE_TL_MABU_R_U_B_WJ = 0x4F, + ROB_BONE_N_EYELASHES_R = 0x50, + ROB_BONE_TL_EYELASHES_R_WJ = 0x51, + ROB_BONE_N_MABU_R_U_C = 0x52, + ROB_BONE_TL_MABU_R_U_C_WJ = 0x53, + ROB_BONE_N_MAYU_L = 0x54, + ROB_BONE_TL_MAYU_L_WJ = 0x55, + ROB_BONE_N_MAYU_L_B = 0x56, + ROB_BONE_TL_MAYU_L_B_WJ = 0x57, + ROB_BONE_N_MAYU_L_C = 0x58, + ROB_BONE_TL_MAYU_L_C_WJ = 0x59, + ROB_BONE_N_MAYU_R = 0x5A, + ROB_BONE_TL_MAYU_R_WJ = 0x5B, + ROB_BONE_N_MAYU_R_B = 0x5C, + ROB_BONE_TL_MAYU_R_B_WJ = 0x5D, + ROB_BONE_N_MAYU_R_C = 0x5E, + ROB_BONE_TL_MAYU_R_C_WJ = 0x5F, + ROB_BONE_N_TOOTH_UPPER = 0x60, + ROB_BONE_TL_TOOTH_UPPER_WJ = 0x61, + ROB_BONE_N_KUBI_WJ_EX = 0x62, + ROB_BONE_N_WAKI_L = 0x63, + ROB_BONE_KL_WAKI_L_WJ = 0x64, + ROB_BONE_TL_UP_KATA_L = 0x65, + ROB_BONE_C_KATA_L = 0x66, + ROB_BONE_KATA_L_WJ_CU = 0x67, + ROB_BONE_UDE_L_WJ = 0x68, + ROB_BONE_KL_TE_L_WJ = 0x69, + ROB_BONE_N_HITO_L_EX = 0x6A, + ROB_BONE_NL_HITO_L_WJ = 0x6B, + ROB_BONE_NL_HITO_B_L_WJ = 0x6C, + ROB_BONE_NL_HITO_C_L_WJ = 0x6D, + ROB_BONE_N_KO_L_EX = 0x6E, + ROB_BONE_NL_KO_L_WJ = 0x6F, + ROB_BONE_NL_KO_B_L_WJ = 0x70, + ROB_BONE_NL_KO_C_L_WJ = 0x71, + ROB_BONE_N_KUSU_L_EX = 0x72, + ROB_BONE_NL_KUSU_L_WJ = 0x73, + ROB_BONE_NL_KUSU_B_L_WJ = 0x74, + ROB_BONE_NL_KUSU_C_L_WJ = 0x75, + ROB_BONE_N_NAKA_L_EX = 0x76, + ROB_BONE_NL_NAKA_L_WJ = 0x77, + ROB_BONE_NL_NAKA_B_L_WJ = 0x78, + ROB_BONE_NL_NAKA_C_L_WJ = 0x79, + ROB_BONE_N_OYA_L_EX = 0x7A, + ROB_BONE_NL_OYA_L_WJ = 0x7B, + ROB_BONE_NL_OYA_B_L_WJ = 0x7C, + ROB_BONE_NL_OYA_C_L_WJ = 0x7D, + ROB_BONE_N_STE_L_WJ_EX = 0x7E, + ROB_BONE_N_SUDE_L_WJ_EX = 0x7F, + ROB_BONE_N_SUDE_B_L_WJ_EX = 0x80, + ROB_BONE_N_HIJI_L_WJ_EX = 0x81, + ROB_BONE_N_UP_KATA_L_EX = 0x82, + ROB_BONE_N_SKATA_L_WJ_CD_EX = 0x83, + ROB_BONE_N_SKATA_B_L_WJ_CD_CU_EX = 0x84, + ROB_BONE_N_SKATA_C_L_WJ_CD_CU_EX = 0x85, + ROB_BONE_N_WAKI_R = 0x86, + ROB_BONE_KL_WAKI_R_WJ = 0x87, + ROB_BONE_TL_UP_KATA_R = 0x88, + ROB_BONE_C_KATA_R = 0x89, + ROB_BONE_KATA_R_WJ_CU = 0x8A, + ROB_BONE_UDE_R_WJ = 0x8B, + ROB_BONE_KL_TE_R_WJ = 0x8C, + ROB_BONE_N_HITO_R_EX = 0x8D, + ROB_BONE_NL_HITO_R_WJ = 0x8E, + ROB_BONE_NL_HITO_B_R_WJ = 0x8F, + ROB_BONE_NL_HITO_C_R_WJ = 0x90, + ROB_BONE_N_KO_R_EX = 0x91, + ROB_BONE_NL_KO_R_WJ = 0x92, + ROB_BONE_NL_KO_B_R_WJ = 0x93, + ROB_BONE_NL_KO_C_R_WJ = 0x94, + ROB_BONE_N_KUSU_R_EX = 0x95, + ROB_BONE_NL_KUSU_R_WJ = 0x96, + ROB_BONE_NL_KUSU_B_R_WJ = 0x97, + ROB_BONE_NL_KUSU_C_R_WJ = 0x98, + ROB_BONE_N_NAKA_R_EX = 0x99, + ROB_BONE_NL_NAKA_R_WJ = 0x9A, + ROB_BONE_NL_NAKA_B_R_WJ = 0x9B, + ROB_BONE_NL_NAKA_C_R_WJ = 0x9C, + ROB_BONE_N_OYA_R_EX = 0x9D, + ROB_BONE_NL_OYA_R_WJ = 0x9E, + ROB_BONE_NL_OYA_B_R_WJ = 0x9F, + ROB_BONE_NL_OYA_C_R_WJ = 0xA0, + ROB_BONE_N_STE_R_WJ_EX = 0xA1, + ROB_BONE_N_SUDE_R_WJ_EX = 0xA2, + ROB_BONE_N_SUDE_B_R_WJ_EX = 0xA3, + ROB_BONE_N_HIJI_R_WJ_EX = 0xA4, + ROB_BONE_N_UP_KATA_R_EX = 0xA5, + ROB_BONE_N_SKATA_R_WJ_CD_EX = 0xA6, + ROB_BONE_N_SKATA_B_R_WJ_CD_CU_EX = 0xA7, + ROB_BONE_N_SKATA_C_R_WJ_CD_CU_EX = 0xA8, + ROB_BONE_KL_KOSI_Y = 0xA9, + ROB_BONE_KL_KOSI_XZ = 0xAA, + ROB_BONE_KL_KOSI_ETC_WJ = 0xAB, + ROB_BONE_CL_MOMO_L = 0xAC, + ROB_BONE_J_MOMO_L_WJ = 0xAD, + ROB_BONE_J_SUNE_L_WJ = 0xAE, + ROB_BONE_KL_ASI_L_WJ_CO = 0xAF, + ROB_BONE_KL_TOE_L_WJ = 0xB0, + ROB_BONE_N_HIZA_L_WJ_EX = 0xB1, + ROB_BONE_CL_MOMO_R = 0xB2, + ROB_BONE_J_MOMO_R_WJ = 0xB3, + ROB_BONE_J_SUNE_R_WJ = 0xB4, + ROB_BONE_KL_ASI_R_WJ_CO = 0xB5, + ROB_BONE_KL_TOE_R_WJ = 0xB6, + ROB_BONE_N_HIZA_R_WJ_EX = 0xB7, + ROB_BONE_N_MOMO_A_L_WJ_CD_EX = 0xB8, + ROB_BONE_N_MOMO_B_L_WJ_EX = 0xB9, + ROB_BONE_N_MOMO_C_L_WJ_EX = 0xBA, + ROB_BONE_N_MOMO_A_R_WJ_CD_EX = 0xBB, + ROB_BONE_N_MOMO_B_R_WJ_EX = 0xBC, + ROB_BONE_N_MOMO_C_R_WJ_EX = 0xBD, + ROB_BONE_N_HARA_CD_EX = 0xBE, + ROB_BONE_N_HARA_B_WJ_EX = 0xBF, + ROB_BONE_N_HARA_C_WJ_EX = 0xC0, + ROB_BONE_MAX = 0xC1, +}; + +enum rob_chara_type { + ROB_CHARA_TYPE_NONE = -1, + ROB_CHARA_TYPE_0 = 0x00, + ROB_CHARA_TYPE_1 = 0x01, + ROB_CHARA_TYPE_2 = 0x02, + ROB_CHARA_TYPE_3 = 0x03, +}; + +enum rob_chara_data_hand_adjust_type : uint16_t { + ROB_CHARA_DATA_HAND_ADJUST_NONE = (uint16_t)-1, + ROB_CHARA_DATA_HAND_ADJUST_NORMAL = 0x00, + ROB_CHARA_DATA_HAND_ADJUST_SHORT = 0x01, + ROB_CHARA_DATA_HAND_ADJUST_TALL = 0x02, + ROB_CHARA_DATA_HAND_ADJUST_MIN = 0x03, + ROB_CHARA_DATA_HAND_ADJUST_MAX = 0x04, + ROB_CHARA_DATA_HAND_ADJUST_OPPOSITE_CHARA = 0x05, + ROB_CHARA_DATA_HAND_ADJUST_CUSTOM = 0x06, + ROB_CHARA_DATA_HAND_ADJUST_1P = 0x07, + ROB_CHARA_DATA_HAND_ADJUST_2P = 0x08, + ROB_CHARA_DATA_HAND_ADJUST_3P = 0x09, + ROB_CHARA_DATA_HAND_ADJUST_4P = 0x0A, +}; + +enum rob_osage_parts { + ROB_OSAGE_PARTS_NONE = -1, + ROB_OSAGE_PARTS_LEFT = 0x00, + ROB_OSAGE_PARTS_RIGHT = 0x01, + ROB_OSAGE_PARTS_CENTER = 0x02, + ROB_OSAGE_PARTS_LONG_C = 0x03, + ROB_OSAGE_PARTS_SHORT_L = 0x04, + ROB_OSAGE_PARTS_SHORT_R = 0x05, + ROB_OSAGE_PARTS_APPEND_L = 0x06, + ROB_OSAGE_PARTS_APPEND_R = 0x07, + ROB_OSAGE_PARTS_MUFFLER = 0x08, + ROB_OSAGE_PARTS_WHITE_ONE_L = 0x09, + ROB_OSAGE_PARTS_PONY = 0x0A, + ROB_OSAGE_PARTS_ANGEL_L = 0x0B, + ROB_OSAGE_PARTS_ANGEL_R = 0x0C, + ROB_OSAGE_PARTS_MAX = 0x0D, +}; + +enum shadow_type_enum { + SHADOW_CHARA = 0x00, + SHADOW_STAGE = 0x01, +}; + +enum SubActExecType { + SUB_ACTION_EXECUTE_NONE = 0x00, + SUB_ACTION_EXECUTE_CRY = 0x01, + SUB_ACTION_EXECUTE_SHAKE_HAND = 0x02, + SUB_ACTION_EXECUTE_EMBARRASSED = 0x03, + SUB_ACTION_EXECUTE_ANGRY = 0x04, + SUB_ACTION_EXECUTE_LAUGH = 0x05, + SUB_ACTION_EXECUTE_COUNT_NUM = 0x06, +}; + +enum SubActParamType { + SUB_ACTION_PARAM_NONE = 0x00, + SUB_ACTION_PARAM_CRY = 0x01, + SUB_ACTION_PARAM_SHAKE_HAND = 0x02, + SUB_ACTION_PARAM_EMBARRASSED = 0x03, + SUB_ACTION_PARAM_ANGRY = 0x04, + SUB_ACTION_PARAM_LAUGH = 0x05, + SUB_ACTION_PARAM_COUNT_NUM = 0x06, +}; + +enum texture_flags { TEXTURE_BLOCK_COMPRESSION = 0x1, -} texture_flags; +}; #define list(t) \ -typedef struct list_##t##_node list_##t##_node; \ +struct list_##t##_node; \ \ struct list_##t##_node { \ list_##t##_node* next; \ list_##t##_node* prev; \ - t* value; \ + t value; \ }; \ \ -typedef struct list_##t { \ +struct list_##t { \ list_##t##_node* head; \ size_t size; \ -} list_##t; +}; #define list_ptr(t) \ -typedef struct list_ptr_##t##_node list_ptr_##t##_node; \ +struct list_ptr_##t##_node; \ \ struct list_ptr_##t##_node { \ list_ptr_##t##_node* next; \ @@ -621,13 +930,13 @@ struct list_ptr_##t##_node { \ t* value; \ }; \ \ -typedef struct list_ptr_##t { \ +struct list_ptr_##t { \ list_ptr_##t##_node* head; \ size_t size; \ -} list_ptr_##t; +}; #define tree_def(t) \ -typedef struct tree_##t##_node tree_##t##_node; \ +struct tree_##t##_node; \ \ struct tree_##t##_node { \ tree_##t##_node* left; \ @@ -638,13 +947,13 @@ struct tree_##t##_node { \ t value; \ }; \ \ -typedef struct tree_##t { \ +struct tree_##t { \ tree_##t##_node* head; \ size_t size; \ -} tree_##t; +}; #define tree_ptr(t) \ -typedef struct tree_ptr_##t##_node tree_ptr_##t##_node; \ +struct tree_ptr_##t##_node; \ \ struct tree_ptr_##t##_node { \ tree_ptr_##t##_node* left; \ @@ -655,13 +964,13 @@ struct tree_ptr_##t##_node { \ t* value; \ }; \ \ -typedef struct tree_ptr_##t { \ +struct tree_ptr_##t { \ tree_ptr_##t##_node* head; \ size_t size; \ -} tree_ptr_##t; +}; #define tree_pair(t1, t2) \ -typedef struct tree_pair_##t1##_##t2##_node tree_pair_##t1##_##t2##_node; \ +struct tree_pair_##t1##_##t2##_node; \ \ struct tree_pair_##t1##_##t2##_node { \ tree_pair_##t1##_##t2##_node* left; \ @@ -673,13 +982,13 @@ struct tree_pair_##t1##_##t2##_node { \ t2 value; \ }; \ \ -typedef struct tree_pair_##t1##_##t2 { \ +struct tree_pair_##t1##_##t2 { \ tree_pair_##t1##_##t2##_node* head; \ size_t size; \ -} tree_pair_##t1##_##t2; +}; #define tree_pair_ptr(t1, t2) \ -typedef struct tree_pair_##t1##_ptr_##t2##_node tree_pair_##t1##_ptr_##t2##_node; \ +struct tree_pair_##t1##_ptr_##t2##_node; \ \ struct tree_pair_##t1##_ptr_##t2##_node { \ tree_pair_##t1##_ptr_##t2##_node* left; \ @@ -691,22 +1000,22 @@ struct tree_pair_##t1##_ptr_##t2##_node { \ t2* value; \ }; \ \ -typedef struct tree_pair_##t1##_ptr_##t2 { \ +struct tree_pair_##t1##_ptr_##t2 { \ tree_pair_##t1##_ptr_##t2##_node* head; \ size_t size; \ -} tree_pair_##t1##_ptr_##t2; +}; -typedef struct aft_bone_database_bone { +struct bone_database_bone { uint8_t type; bool has_parent; uint8_t parent; uint8_t pole_target; uint8_t mirror; uint8_t flags; - char* name; -} aft_bone_database_bone; + const char* name; +}; -typedef struct aft_bone_database_bone_file { +struct bone_database_bone_file { uint8_t type; bool has_parent; uint8_t parent; @@ -714,20 +1023,20 @@ typedef struct aft_bone_database_bone_file { uint8_t mirror; uint8_t flags; uint32_t name_offset; -} aft_bone_database_bone_file; +}; -typedef struct aft_bone_database_skeleton { - aft_bone_database_bone* bones; +struct bone_database_skeleton { + bone_database_bone* bones; int32_t posittion_count; int32_t field_C; vec3* positions; float_t* heel_height; uint32_t object_bone_name_count; int32_t field_24; - char** object_bone_names; + const char** object_bone_names; int32_t motion_bone_name_count; int32_t field_34; - char** motion_bone_names; + const char** motion_bone_names; uint16_t* parent_indices; int32_t field_48; int32_t field_4C; @@ -735,54 +1044,54 @@ typedef struct aft_bone_database_skeleton { int32_t field_54; int32_t field_58; int32_t field_5C; -} aft_bone_database_skeleton; +}; -typedef struct aft_bone_database_struct { +struct bone_database_struct { uint32_t signature; uint32_t skeleton_count; - aft_bone_database_skeleton** skeletons; - char** skeleton_names; -} aft_bone_database_struct; + bone_database_skeleton** skeletons; + const char** skeleton_names; +}; -typedef struct rob_chara rob_chara; -typedef struct rob_chara_bone_data rob_chara_bone_data; -typedef struct rob_chara_item_equip rob_chara_item_equip; -typedef struct bone_node bone_node; +struct rob_chara; +struct rob_chara_bone_data; +struct rob_chara_item_equip; +struct bone_node; -typedef struct bone_node_expression_data { +struct bone_node_expression_data { vec3 position; vec3 rotation; vec3 scale; vec3 parent_scale; -} bone_node_expression_data; +}; -typedef struct bone_node { - char* name; +struct bone_node { + const char* name; mat4* mat; bone_node* parent; bone_node_expression_data exp_data; mat4* ex_data_mat; -} bone_node; +}; vector_old(bone_node) -typedef struct struc_314 { +struct struc_314 { uint32_t* field_0; size_t field_8; -} struc_314; +}; -typedef struct mot_key_set { +struct mot_key_set { mot_key_set_type type; int32_t keys_count; int32_t current_key; int32_t last_key; uint16_t* frames; float_t* values; -} mot_key_set; +}; vector_old(mot_key_set) -typedef union request_data_object_data { +union item_cos_data { struct { int32_t zujo; int32_t kami; @@ -809,77 +1118,79 @@ typedef union request_data_object_data { int32_t sune; int32_t kutsu; int32_t head; - }; - int32_t array[25]; -} request_data_object_data; + } data; + int32_t arr[25]; +}; -typedef struct struc_285 { - int64_t field_0; - int64_t field_8; - int64_t field_10; - int64_t field_18; -} struc_285; +struct texture; -list(struc_285) +struct item_cos_texture_change_tex { + texture* org; + texture* chg; + bool changed; +}; -typedef struct struc_289 { - int32_t field_0; - int32_t field_4; - int64_t field_8; - int64_t field_10; - int64_t field_18; -} struc_289; +vector_old(item_cos_texture_change_tex) -list(struc_289) +struct item_cos_texture_change { + uint32_t item_no; + vector_old_item_cos_texture_change_tex tex; +}; -typedef struct struc_298 { - int64_t field_0; - int64_t field_8; - int64_t field_10; -} struc_298; +struct item_cos_item_change { + item_id id; + vector_old_uint32_t item_nos; +}; -typedef struct struc_293 { - int32_t key; - void* value; -} struc_293; +struct object_info { + uint16_t id; + uint16_t set_id; +}; -list(struc_293) +struct texture_pattern_struct { + int32_t src; + int32_t dst; +}; +tree_def(item_cos_texture_change) +tree_def(item_cos_item_change) +tree_pair(object_info, item_id) tree_pair(int32_t, int32_t) +vector_old(texture_pattern_struct) +tree_pair(int32_t, object_info) list_ptr(void) -typedef struct rob_chara_item_sub_data { - chara_index chara_index; - int32_t field_4; - request_data_object_data field_8; - request_data_object_data field_6C; - list_struc_285 field_D0; - list_struc_289 field_E0; - list_struc_293 field_F0; - list_ptr_void field_100; - struc_298 field_110[31]; - tree_pair_int32_t_int32_t field_3F8; -} rob_chara_item_sub_data; +struct rob_chara_item_cos_data { + ::chara_index chara_index; + ::chara_index chara_index_2nd; + item_cos_data field_8; + item_cos_data field_6C; + tree_item_cos_texture_change texture_change; + tree_item_cos_item_change item_change; + tree_pair_object_info_item_id field_F0; + tree_pair_int32_t_int32_t field_100; + vector_old_texture_pattern_struct texture_pattern[31]; + tree_pair_int32_t_object_info head_replace; +}; -typedef struct struc_525 { +struct struc_525 { int32_t field_0; int32_t field_4; -} struc_525; +}; -typedef struct struc_524 { +struct struc_524 { int32_t field_0; struc_525 field_4; - int32_t field_C; + int32_t motion_id; uint8_t field_10; -} struc_524; +}; -typedef struct struc_523 { +struct struc_523 { uint8_t field_0; uint8_t field_1; int32_t field_4; - uint8_t field_8; - uint8_t field_9; + int16_t field_8; int32_t field_C; int32_t field_10; int32_t field_14; @@ -902,16 +1213,17 @@ typedef struct struc_523 { list_ptr_void field_58; int64_t field_68; int64_t field_70; - int64_t field_78; - int32_t field_80; -} struc_523; + int32_t field_78; + float_t field_7C; + float_t field_80; +}; -typedef struct struc_526 { +struct struc_526 { int32_t field_0; int32_t field_4; -} struc_526; +}; -typedef struct struc_264 { +struct struc_264 { uint8_t field_0; struc_524 field_4; struc_524 field_18; @@ -938,7 +1250,7 @@ typedef struct struc_264 { int32_t field_A8; int32_t field_AC; int32_t field_B0; - uint8_t eyes_adjust; + uint8_t field_B4; struc_523 field_B8; int32_t field_140; uint8_t field_144; @@ -982,139 +1294,146 @@ typedef struct struc_264 { int32_t field_1CC; int32_t field_1D0; int32_t field_1D4; -} struc_264; +}; -typedef struct rob_sub_action rob_sub_action; +struct SubActExec; +struct SubActParam; -typedef struct rob_sub_action_vtbl { - void(*dispose)(rob_sub_action*, bool); -} rob_sub_action_vtbl; +struct SubActExec_vtbl { + SubActExec* (* Dispose)(SubActExec*, bool); + void(* Field_8)(SubActExec*); + void(* Field_10)(SubActExec*, SubActParam*); + void(* Field_18)(SubActExec*, rob_chara*); + void(* Field_20)(SubActExec*, rob_chara*); +}; -typedef struct rob_sub_action_execute rob_sub_action_execute; - -typedef struct rob_sub_action_execute_vftable { - void(*dispose)(rob_sub_action_execute*); - void(*field_8)(rob_sub_action_execute*); - void(*field_10)(rob_sub_action_execute*); - void(*field_18)(rob_sub_action_execute*, rob_chara*); - void(*field_20)(rob_sub_action_execute*, rob_chara*); -} rob_sub_action_execute_vftable; - -struct rob_sub_action_execute { - rob_sub_action_execute_vftable* __vftable; - rob_sub_action_execute_type type; +struct SubActExec { + SubActExec_vtbl* __vftable; + SubActExecType type; int32_t field_C; }; -typedef struct rob_sub_action_execute_cry { - rob_sub_action_execute base; -} rob_sub_action_execute_cry; - -typedef struct rob_sub_action_execute_shake_hand { - rob_sub_action_execute base; - int64_t field_10; - uint8_t field_18; -} rob_sub_action_execute_shake_hand; - -typedef struct rob_sub_action_execute_embarrassed { - rob_sub_action_execute base; - uint8_t field_10; -} rob_sub_action_execute_embarrassed; - -typedef struct rob_sub_action_execute_angry { - rob_sub_action_execute base; -} rob_sub_action_execute_angry; - -typedef struct rob_sub_action_execute_laugh { - rob_sub_action_execute base; -} rob_sub_action_execute_laugh; - -typedef struct rob_sub_action_execute_count_num { - rob_sub_action_execute base; - int64_t field_10; - int32_t field_18; -} rob_sub_action_execute_count_num; - -typedef struct rob_sub_action_param { - rob_sub_action_param_type type; -} rob_sub_action_param; - -typedef struct rob_sub_action_data { - rob_sub_action_execute* field_0; - rob_sub_action_execute* field_8; - rob_sub_action_param* field_10; - rob_sub_action_execute* field_18; - rob_sub_action_execute_cry cry; - rob_sub_action_execute_shake_hand shake_hand; - rob_sub_action_execute_embarrassed embarrassed; - rob_sub_action_execute_angry angry; - rob_sub_action_execute_laugh laugh; - rob_sub_action_execute_count_num count_num; -} rob_sub_action_data; - -struct rob_sub_action { - rob_sub_action_vtbl* __vftable; - rob_sub_action_data data; +struct SubActExecCry { + SubActExec base; }; -typedef struct struc_389 { +struct SubActExecShakeHand { + SubActExec base; + int64_t field_10; + uint8_t field_18; +}; + +struct SubActExecEmbarrassed { + SubActExec base; + uint8_t field_10; +}; + +struct SubActExecAngry { + SubActExec base; +}; + +struct SubActExecLaugh { + SubActExec base; +}; + +struct SubActExecCountNum { + SubActExec base; + int64_t field_10; + int32_t field_18; +}; + +struct SubActParam_vtbl { + void* (*Dispose)(void*, bool); +}; + +struct SubActParam { + SubActParam_vtbl* __vftable; + SubActParamType type; +}; + +struct RobSubAction; + +struct RobSubAction_vtbl { + void(*dispose)(RobSubAction*, bool); +}; + +struct RobSubAction { + RobSubAction_vtbl* __vftable; + + struct Data { + SubActExec* field_0; + SubActExec* field_8; + SubActParam* field_10; + SubActExec* field_18; + SubActExecCry cry; + SubActExecShakeHand shake_hand; + SubActExecEmbarrassed embarrassed; + SubActExecAngry angry; + SubActExecLaugh laugh; + SubActExecCountNum count_num; + } data; +}; + +struct struc_389 { float_t frame; float_t prev_frame; float_t last_set_frame; -} struc_389; - -typedef struct struc_406 { - float_t frame; - float_t field_4; - float_t field_8; -} struc_406; - -typedef struct rob_partial_motion rob_partial_motion; - -typedef struct rob_partial_motion_vtbl { - void(*dispose)(rob_partial_motion*, bool); - void(*field_8)(void*); -} rob_partial_motion_vtbl; - -struct rob_partial_motion { - rob_partial_motion_vtbl* __vftable; - int32_t field_8; - int32_t field_C; - int32_t field_10; - float_t field_14; - float_t field_18; - float_t field_1C; - float_t field_20; - float_t field_24; - float_t field_28; - float_t field_2C; - struc_389* field_30; - struc_389* field_38; - int32_t field_40; - int32_t field_44; }; -typedef struct rob_face_motion { - rob_partial_motion base; -} rob_face_motion; +struct struc_406 { + float_t frame; + float_t field_4; + float_t step; +}; -typedef struct rob_hand_motion { - rob_partial_motion base; -} rob_hand_motion; +struct RobPartialMotion; -typedef struct rob_mouth_motion { - rob_partial_motion base; -} rob_mouth_motion; +struct RobPartialMotion_vtbl { + RobPartialMotion* (*dispose)(RobPartialMotion*, bool); + void* (*Reset)(RobPartialMotion*); +}; -typedef struct rob_eyes_motion { - rob_partial_motion base; -} rob_eyes_motion; +struct RobPartialMotion { + RobPartialMotion_vtbl* __vftable; -typedef struct rob_eyelid_motion { - rob_partial_motion base; -} rob_eyelid_motion; + struct Data { + int32_t motion_id; + int32_t mottbl_index; + int32_t state; + float_t frame; + float_t play_frame_step; + float_t frame_count; + float_t duration; + float_t step; + float_t offset; + float_t field_24; + struc_389* frame_data; + struc_406* step_data; + int32_t field_38; + } data; +}; -typedef struct rob_chara_data_parts_adjust { +struct RobFaceMotion { + RobPartialMotion base; +}; + +struct RobHandMotion { + RobPartialMotion base; +}; + +struct RobMouthMotion { + RobPartialMotion base; +}; + +struct RobEyesMotion { + RobPartialMotion base; +}; + +struct RobEyelidMotion { + RobPartialMotion base; +}; + +struct rob_chara_data_adjust { bool enable; float_t frame; float_t transition_frame; @@ -1122,72 +1441,66 @@ typedef struct rob_chara_data_parts_adjust { float_t curr_force; float_t curr_strength; int32_t motion_id; - int32_t set_frame; + float_t set_frame; float_t force_duration; int32_t type; int32_t cycle_type; 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; float_t strength; float_t strength_transition; -} rob_chara_data_parts_adjust; +}; -typedef struct rob_chara_data_hand_adjust { - uint8_t field_0; - uint8_t field_1; - int16_t field_2; - int16_t field_4; - float_t field_8; - float_t field_C; - float_t field_10; - float_t field_14; - float_t field_18; - float_t field_1C; - uint8_t field_20; - uint8_t field_21; - uint8_t field_22; - uint8_t field_23; - vec3 field_24; +struct rob_chara_data_hand_adjust { + bool enable; + int16_t scale_select; + rob_chara_data_hand_adjust_type type; + float_t current_scale; + float_t scale; + float_t duration; + float_t current_time; + float_t rotation_blend; + float_t scale_blend; + bool enable_scale; + bool disable_x; + bool disable_y; + bool disable_z; + vec3 offset; vec3 field_30; - int32_t field_3C; + float_t arm_length; int32_t field_40; -} rob_chara_data_hand_adjust; +}; -typedef struct struc_222 { - uint8_t field_0; - float_t field_4; - float_t field_8; - float_t field_C; +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; -} struc_222; +}; -typedef struct aft_object_info { - uint16_t id; - uint16_t set_id; -} aft_object_info; - -typedef struct struc_405 { - rob_face_motion field_0; - rob_hand_motion field_48; - rob_hand_motion field_90; - rob_mouth_motion field_D8; - rob_eyes_motion field_120; - rob_eyelid_motion field_168; - aft_object_info field_1B0; - aft_object_info field_1B4; - aft_object_info field_1B8; - aft_object_info field_1BC; +struct struc_405 { + RobFaceMotion face; + RobHandMotion hand_l; + RobHandMotion hand_r; + RobMouthMotion mouth; + RobEyesMotion eye; + RobEyelidMotion eyelid; + object_info head_object; + object_info hand_l_object; + object_info hand_r_object; + object_info face_object; int32_t field_1C0; - float_t field_1C4; -} struc_405; + float_t time; +}; -typedef struct rob_chara_adjust { +struct rob_chara_motion { int32_t motion_id; int32_t prev_motion_id; struc_389 frame_data; @@ -1209,75 +1522,47 @@ typedef struct rob_chara_adjust { int32_t field_148; int32_t field_14C; struc_405 field_150; - rob_hand_motion field_318; - rob_hand_motion field_360; - aft_object_info field_3A8; - aft_object_info field_3AC; + RobHandMotion hand_l; + RobHandMotion hand_r; + 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_adjust; + rob_chara_data_arm_adjust arm_adjust[2]; +}; -typedef struct struc_228 { +struct struc_228 { int32_t field_0; int32_t field_4; uint32_t field_8; int32_t field_C; -} struc_228; +}; -typedef struct struc_227 { +struct struc_227 { int32_t field_0; float_t field_4; float_t field_8; -} struc_227; +}; -typedef struct mothead_data { +struct mothead_data { mothead_data_type type; int32_t frame; void* data; -} mothead_data; +}; -typedef struct struc_377 { - mothead_data* field_0; - mothead_data* field_8; -} struc_377; +struct mothead_data2 { + int32_t type; + void* data; +}; -typedef struct struc_226 { - uint8_t field_0[27]; -} struc_226; - -typedef struct struc_225 { - float_t field_0[27]; -} struc_225; - -typedef struct struc_224 { - int32_t field_0[27]; -} struc_224; - -typedef struct struc_306 { - int16_t field_0; - float_t field_4; - float_t field_8; - int16_t field_C; - int16_t field_E; - vec3 field_10; - vec3 field_1C; - vec3 field_28; - int32_t field_34; - int32_t field_38; - int32_t field_3C; - int32_t field_40; - int32_t field_44; - int32_t field_48; -} struc_306; - -typedef struct struc_223 { - int32_t field_0; - float_t field_4; +struct struc_652 { + int32_t motion_id; + float_t frame_count; float_t field_8; int16_t field_C; struc_228 field_10; @@ -1298,12 +1583,13 @@ typedef struct struc_223 { float_t field_78; float_t field_7C; float_t field_80; - uint8_t field_84; + int8_t field_84; int32_t field_88; int32_t field_8C; int32_t field_90; int16_t field_94; - int32_t field_98; + int16_t field_96; + int16_t field_98; int32_t field_9C; int16_t field_A0; int32_t field_A4; @@ -1325,15 +1611,15 @@ typedef struct struc_223 { int16_t field_220; list_ptr_void field_228; int16_t field_238; - int32_t field_23C; + float_t field_23C; int32_t field_240; int16_t field_244; - int64_t field_248; + const mothead_data2* field_248; int64_t field_250; float_t field_258; int32_t field_25C; - int64_t field_260; - int64_t field_268; + struc_526 field_260; + struc_526 field_268; int32_t field_270; int16_t field_274; int16_t field_276; @@ -1346,12 +1632,12 @@ typedef struct struc_223 { int32_t field_294; int32_t field_298; float_t field_29C; - uint8_t field_2A0; + int8_t field_2A0; float_t field_2A4; - float_t coli; + float_t field_2A8; float_t field_2AC; int64_t field_2B0; - int16_t rotation_y; + int16_t field_2B8; int32_t field_2BC; float_t field_2C0; float_t field_2C4; @@ -1363,73 +1649,106 @@ typedef struct struc_223 { int16_t field_2E8; int32_t field_2EC; int32_t field_2F0; - int32_t field_2F4; - int32_t field_2F8; + struc_526 field_2F4; int32_t field_2FC; - uint8_t field_300; + int8_t field_300; int32_t field_304; int32_t field_308; float_t field_30C; int32_t field_310; int16_t field_314; - float_t field_318; - float_t field_31C; - float_t field_320; + vec3 field_318; float_t field_324; float_t field_328; - int32_t field_32C; - struc_377 field_330; - int32_t field_340; - int32_t field_344; - int32_t field_348; - float_t field_34C; - vec3 field_350; - struc_226 field_35C[3]; - struc_225 field_3B0[3]; - struc_224 field_4F4[3]; - int64_t field_638; - float_t field_640; - float_t field_644; - uint8_t field_648; - int32_t field_64C; - float_t field_650; - float_t field_654; - float_t field_658; - int32_t field_65C; - float_t field_660; - float_t field_664; - uint8_t field_668; - struc_306 field_66C[4]; - int64_t* field_7A0; - int32_t field_7A8; -} struc_223; + int32_t iterations; +}; -typedef struct rob_chara_data_miku_rot { +struct struc_377 { + mothead_data* field_0; + mothead_data* field_8; +}; + +struct struc_226 { + uint8_t field_0[27]; +}; + +struct struc_225 { + float_t field_0[27]; +}; + +struct struc_224 { + int32_t field_0[27]; +}; + +struct struc_306 { int16_t field_0; - int16_t field_2; - int16_t field_4; - int16_t field_6; - int32_t field_8; - int32_t field_C; - int32_t field_10; - int32_t field_14; - vec3 field_18; - vec3 field_24; - int32_t field_30; + float_t field_4; + float_t field_8; + int16_t field_C; + int16_t field_E; + vec3 field_10; + vec3 field_1C; + vec3 field_28; int32_t field_34; int32_t field_38; int32_t field_3C; int32_t field_40; int32_t field_44; + int32_t field_48; +}; + +struct struc_651 { + struc_377 field_0; + int32_t field_10; + int32_t field_14; + int32_t field_18; + float_t field_1C; + vec3 field_20; + struc_226 field_2C[3]; + struc_225 field_80[3]; + struc_224 field_1C4[3]; + int64_t field_308; + float_t field_310; + float_t field_314; + int8_t field_318; + int32_t field_31C; + float_t field_320; + float_t field_324; + float_t field_328; + float_t field_32C; + float_t field_330; + float_t field_334; + int8_t field_338; + struc_306 field_33C[4]; +}; + +struct struc_223 { + struc_652 field_0; + struc_651 field_330; + int64_t *field_7A0; + int32_t motion_set_id; +}; + +struct rob_chara_data_miku_rot { + int16_t rot_y_int16; + int16_t field_2; + int16_t field_4; + int16_t field_6; + int32_t field_8; + int32_t field_C; + float_t field_10; + int32_t field_14; + vec3 position; + vec3 field_24; + vec3 field_30; + vec3 field_3C; vec3 field_48; vec3 field_54; - int32_t field_60; - int32_t field_64; - int32_t field_68; + vec3 field_60; mat4u field_6C; -} rob_chara_data_miku_rot; +}; -typedef struct rob_chara_adjust_data { +struct rob_chara_adjust_data { float_t scale; bool height_adjust; float_t pos_adjust_y; @@ -1445,38 +1764,40 @@ typedef struct rob_chara_adjust_data { float_t right_hand_scale; float_t left_hand_scale_default; float_t right_hand_scale_default; -} rob_chara_adjust_data; +}; -typedef struct struc_195 { - vec3 rotation; +struct struc_195 { + vec3 prev_trans; vec3 trans; float_t scale; float_t field_1C; float_t field_20; float_t field_24; -} struc_195; +}; -typedef struct struc_210 { +struct struc_210 { vec2 field_0; float_t scale; -} struc_210; +}; -typedef struct struc_215 { +struct struc_215 { int64_t field_0; float_t field_8; -} struc_215; +}; vector_old(struc_215) -typedef struct struc_267 { +struct struc_267 { float_t field_0; int16_t field_4; + int16_t field_6; float_t field_8; int16_t field_C; -} struc_267; + int16_t field_E; +}; -typedef struct struc_209 { - int32_t field_0; +struct struc_209 { + int16_t field_0; int32_t field_4; int32_t field_8; int32_t field_C; @@ -1580,10 +1901,7 @@ typedef struct struc_209 { int32_t field_1EAC; int32_t field_1EB0; struc_267 field_1EB4[4]; - int32_t field_1EF4; - int32_t field_1EF8; - int32_t field_1EFC; - int32_t field_1F00; + int32_t field_1EF4[4]; uint8_t field_1F04; int32_t field_1F08; int32_t field_1F0C; @@ -1595,17 +1913,17 @@ typedef struct struc_209 { uint8_t field_1F24; uint8_t field_1F25; uint8_t field_1F26; -} struc_209; +}; -typedef struct rob_chara_data { +struct rob_chara_data { uint8_t field_0; uint8_t field_1; uint8_t field_2; uint8_t field_3; int32_t field_4; struc_264 field_8; - rob_sub_action rob_sub_action; - rob_chara_adjust adjust; + RobSubAction rob_sub_action; + rob_chara_motion motion; struc_223 field_1588; rob_chara_data_miku_rot miku_rot; rob_chara_adjust_data adjust_data; @@ -1631,70 +1949,69 @@ typedef struct rob_chara_data { int32_t field_3DD8; float_t field_3DDC; uint8_t field_3DE0; -} rob_chara_data; +}; -typedef struct struc_242 { - int32_t field_0; - int32_t field_4; - int32_t field_8; - int32_t field_C; - int32_t field_10; - int32_t field_14; - int32_t field_18; - int32_t field_1C; - int32_t field_20; - int32_t field_24; - int32_t field_28; -} struc_242; +struct struc_242 { + float_t field_0; + float_t field_4; + float_t field_8; + float_t field_C; + float_t field_10; + float_t field_14; + float_t field_18; + vec3 field_1C; + float_t field_28; +}; -typedef struct eyes_adjust { +struct eyes_adjust { bool xrot_adjust; eyes_base_adjust_type base_adjust; float_t neg; float_t pos; -} eyes_adjust; +}; -typedef struct rob_chara_pv_data { - int32_t index; - uint8_t field_4; - uint8_t field_5; - uint8_t field_6; +struct rob_chara_pv_data_customize_items { + int32_t head; + int32_t face; + int32_t chest; + int32_t back; +}; + +struct rob_chara_pv_data { + rob_chara_type type; + int8_t field_4; + int8_t field_5; + int8_t field_6; vec3 field_8; - int16_t field_14; + int16_t rot_y_int16; int16_t field_16; struc_242 field_18; struc_242 field_44; int32_t field_70; - int32_t field_74; - int32_t field_78; - int32_t field_7C; - int32_t field_80; - int32_t field_84; - int32_t field_88; - int32_t field_8C; - int32_t field_90; - int32_t field_94; - int32_t field_98; + int32_t motion_face_ids[10]; int32_t chara_size_index; - bool height_adjust; - int32_t item_no[4]; + int8_t height_adjust; + union { + rob_chara_pv_data_customize_items data; + int32_t arr[4]; + } customize_items; eyes_adjust eyes_adjust; -} rob_chara_pv_data; +}; -typedef struct touch_area touch_area; +struct touch_area; -typedef struct touch_area_vftable { - void(*dispose)(touch_area*); +struct touch_area_vftable { + touch_area(*dispose)(touch_area*, bool); void(*field_8)(touch_area*); void(*field_10)(touch_area*); void(*field_18)(touch_area*); void(*field_20)(touch_area*); void(*field_28)(touch_area*); void(*field_30)(touch_area*); -} touch_area_vftable; +}; struct touch_area { - touch_area_vftable* vftable; + touch_area_vftable* __vftable; int32_t field_8; int32_t field_C; float_t field_10; @@ -1705,22 +2022,28 @@ struct touch_area { int32_t field_24; }; -typedef struct rob_touch_area { +struct rob_touch_area { touch_area area; int64_t field_28; uint8_t field_30[3]; int16_t field_34; -} rob_touch_area; +}; vector_old(rob_touch_area) -typedef struct rob_touch { - void** dispose; +struct rob_touch; + +struct rob_touch_vftable { + rob_touch* (*dispose)(rob_touch*, bool); +}; + +struct rob_touch { + rob_touch_vftable __vftable; uint8_t field_8; vector_old_rob_touch_area area; -} rob_touch; +}; -typedef struct struc_307 { +struct struc_307 { int64_t field_0; int32_t field_8; int32_t field_C; @@ -1731,41 +2054,41 @@ typedef struct struc_307 { int16_t field_1E; int64_t field_20; rob_chara_bone_data* field_28; -} struc_307; +}; -typedef struct struc_218 { +struct struc_218 { vec3 bone_offset; float_t scale; - int32_t bone_index; - int32_t field_14; -} struc_218; + rob_bone_index bone_index; + int32_t ik; +}; -typedef struct struc_344 { - int32_t field_0; +struct struc_344 { + int32_t chara_size_index; int32_t field_4; int32_t field_8; int32_t field_C; -} struc_344; +}; -typedef struct chara_init_data { +struct chara_init_data { int32_t field_0; int32_t object_set; - aft_bone_database_skeleton_type skeleton_type; - int32_t field_C; - int32_t field_10; - int32_t field_14; - int32_t field_18; - int32_t field_1C; - int32_t field_20; - int32_t field_24; - int32_t field_28; - int32_t field_2C; - int32_t field_30; - int32_t field_34; - int32_t field_38; - int32_t field_3C; - int32_t field_40; - int32_t field_44; + bone_database_skeleton_type skeleton_type; + object_info field_C; + object_info field_10; + object_info field_14; + object_info field_18; + object_info field_1C; + object_info field_20; + object_info field_24; + object_info field_28; + object_info field_2C; + object_info field_30; + object_info field_34; + object_info field_38; + object_info field_3C; + object_info field_40; + object_info field_44; int32_t field_48; int32_t field_4C; int32_t field_50; @@ -1793,7 +2116,7 @@ typedef struct chara_init_data { int32_t field_A8; int32_t field_AC; int32_t field_B0; - int32_t eyes_adjust; + int32_t field_B4; int32_t field_B8; int32_t field_BC; int32_t field_C0; @@ -1918,7 +2241,7 @@ typedef struct chara_init_data { int32_t field_29C; int32_t field_2A0; int32_t field_2A4; - int32_t coli; + int32_t field_2A8; int32_t field_2AC; int32_t field_2B0; int32_t field_2B4; @@ -2252,23 +2575,22 @@ typedef struct chara_init_data { int32_t field_7D4; int32_t field_7D8; int32_t field_7DC; - int32_t field_7E0; - int16_t base_face_object_id; - int16_t base_face_object_set; - int32_t field_7E8; - int32_t field_7EC; - int32_t field_7F0; - int32_t field_7F4; - int32_t field_7F8; - int32_t field_7FC; - int32_t field_800; - int32_t field_804; - int32_t field_808; - int32_t field_80C; - int32_t field_810; - int32_t field_814; - int32_t field_818; - int32_t motion_set; + object_info field_7E0; + object_info field_7E4; + object_info field_7E8; + object_info field_7EC; + object_info field_7F0; + object_info field_7F4; + object_info field_7F8; + object_info field_7FC; + object_info field_800; + object_info field_804; + object_info field_808; + object_info field_80C; + object_info field_810; + object_info field_814; + object_info field_818; + uint32_t motion_set; int32_t field_820; int32_t field_824; struc_218* field_828; @@ -2277,16 +2599,23 @@ typedef struct chara_init_data { int32_t field_840; int32_t field_844; struc_344* field_848; - aft_object_info* head_objects; + object_info* head_objects; void* field_858; void* field_860; - aft_object_info* face_objects; -} chara_init_data; + object_info* face_objects; +}; -typedef struct rob_detail { +struct rob_detail; + +struct rob_detail_vtbl { + rob_detail* (*dispose)(rob_detail*, bool); +}; + +struct rob_detail { + rob_detail_vtbl* __vftable; rob_chara* field_8; rob_chara_data* field_10; -} rob_detail; +}; struct rob_chara { uint8_t chara_id; @@ -2305,7 +2634,7 @@ struct rob_chara { struc_307* field_20; rob_chara_bone_data* bone_data; rob_chara_item_equip* item_equip; - rob_chara_item_sub_data item_sub_data; + rob_chara_item_cos_data item_cos_data; rob_chara_data data; rob_chara_data data_prev; chara_init_data* chara_init_data; @@ -2315,52 +2644,51 @@ struct rob_chara { rob_touch rob_touch; }; -typedef struct struc_313 { +struct struc_313 { vector_old_uint32_t bitfield; size_t motion_bone_count; -} struc_313; +}; -typedef struct mot { +struct mot { uint16_t key_set_count; uint16_t frame_count; uint16_t field_4; - uint16_t field_6; mot_key_set* key_sets; -} mot; +}; -typedef struct struc_369 { +struct struc_369 { int32_t field_0; float_t field_4; -} struc_369; +}; -typedef struct mot_key_set_file { +struct mot_key_set_file { uint16_t info; uint16_t frame_count; -} mot_key_set_file; +}; -typedef struct mot_data { +struct mot_data { mot_key_set_file* data_file; uint16_t* key_set_types; void* key_sets; uint16_t* bone_info; -} mot_data; +}; -typedef struct mot_key_data { +struct mot_key_data { bool key_sets_ready; size_t key_set_count; vector_old_mot_key_set key_set; mot mot; vector_old_float_t key_set_data; mot_data* mot_data; - aft_bone_database_skeleton_type skeleton_type; + bone_database_skeleton_type skeleton_type; int32_t skeleton_select; int32_t motion_id; float_t frame; struc_369 field_68; -} mot_key_data; +}; -typedef struct bone_data { - aft_bone_database_bone_type type; +struct bone_data { + bone_database_bone_type type; int32_t has_parent; motion_bone_index motion_bone_index; int32_t mirror; @@ -2374,66 +2702,70 @@ typedef struct bone_data { vec3 ik_target; vec3 trans; mat4u rot_mat[3]; - vec3 trans_dup[2]; - mat4u rot_mat_dup[6]; + vec3 trans_prev[2]; + mat4u rot_mat_prev[3][2]; mat4* pole_target_mat; mat4* parent_mat; bone_node* node; 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; -} bone_data; +}; vector_old(bone_data) -typedef struct struc_400 { +struct struc_400 { bool field_0; bool field_1; bool field_2; bool field_3; bool field_4; float_t frame; - float_t eyes_adjust; - float_t prev_eyes_adjust; -} struc_400; + float_t rot_y; + float_t prev_rot_y; +}; -typedef struct motion_blend motion_blend; +struct MotionBlend; -typedef struct motion_blend_vtbl { - void(*dispose)(motion_blend*); - void(*field_8)(motion_blend*); - void(*field_10)(motion_blend*); - void(*field_18)(motion_blend*, struc_400*); - void(*field_20)(motion_blend*, vector_old_bone_data*, vector_old_bone_data*); - void(*field_28)(motion_blend*, bone_data*, bone_data*); - bool(*field_30)(motion_blend*); -} motion_blend_vtbl; +struct /*VFT*/ MotionBlend_vtbl { + void* (*Dispose)(MotionBlend*, bool); + void (*Reset)(MotionBlend*); + void (*Field10)(MotionBlend*, float_t a2, float_t a3, int32_t a4); + void (*Step)(MotionBlend*, struc_400*); + void (*Field20)(MotionBlend*, vector_old_bone_data*, vector_old_bone_data*); + void (*Blend)(MotionBlend*, bone_data*, bone_data*); + bool (*Field30)(MotionBlend*); +}; -struct motion_blend { - motion_blend_vtbl* __vftable; +struct MotionBlend { + MotionBlend_vtbl* __vftable; bool field_8; - bool field_9; - float_t field_C; - float_t field_10; - float_t field_14; - float_t field_18; + bool rot_y; + float_t duration; + float_t frame; + float_t step; + float_t offset; float_t blend; }; -typedef struct motion_blend_cross { - motion_blend base; +struct PartialMotionBlendFreeze { + MotionBlend base; +}; + +struct MotionBlendCross { + MotionBlend base; bool field_20; bool field_21; mat4u field_24; mat4u field_64; mat4u field_A4; mat4u field_E4; -} motion_blend_cross; +}; -typedef struct motion_blend_freeze { - motion_blend base; +struct MotionBlendFreeze { + MotionBlend base; uint8_t field_20; uint8_t field_21; int32_t field_24; @@ -2442,53 +2774,53 @@ typedef struct motion_blend_freeze { int32_t field_30; mat4u field_34; mat4u field_74; - mat4u eyes_adjust; + mat4u rot_y; mat4u field_F4; -} motion_blend_freeze; +}; -typedef struct motion_blend_combine { - motion_blend_cross base; -} motion_blend_combine; +struct MotionBlendCombine { + MotionBlendCross base; +}; -typedef struct struc_240 { +struct struc_240 { bool(*bone_check_func)(motion_bone_index bone_index); struc_313 field_8; size_t motion_bone_count; -} struc_240; +}; -typedef struct mot_play_frame_data { +struct mot_play_frame_data { float_t frame; - float_t field_4; - float_t field_8; - float_t field_C; - float_t field_10; + float_t step; + float_t step_prev; + float_t frame_count; + float_t last_frame; float_t field_14; int32_t field_18; int32_t field_1C; float_t field_20; float_t field_24; - uint8_t field_28; + bool field_28; int32_t field_2C; -} mot_play_frame_data; +}; -typedef struct mot_play_data { +struct mot_play_data { mot_play_frame_data frame_data; int32_t field_30; bool field_34; float_t field_38; float_t* field_40; float_t* field_48; -} mot_play_data; +}; -typedef struct mot_blend { +struct mot_blend { struc_240 field_0; uint8_t field_30; mot_key_data mot_key_data; mot_play_data mot_play_data; - motion_blend_freeze blend; -} mot_blend; + PartialMotionBlendFreeze blend; +}; -typedef struct struc_241 { +struct struc_241 { float_t field_0; float_t field_4; float_t field_8; @@ -2506,22 +2838,22 @@ typedef struct struc_241 { float_t field_38; float_t field_3C; float_t field_40; -} struc_241; +}; -typedef struct struc_243 { - int32_t field_0; - int32_t field_4; - int32_t field_8; - int32_t field_C; +struct struc_243 { + float_t field_0; + float_t field_4; + float_t field_8; + float_t field_C; int32_t field_10; int32_t field_14; int32_t field_18; int32_t field_1C; - int32_t field_20; - int32_t field_24; -} struc_243; + float_t field_20; + float_t field_24; +}; -typedef struct struc_258 { +struct struc_258 { vector_old_bone_data* field_0; mat4u field_8; struc_241 field_48; @@ -2539,63 +2871,54 @@ typedef struct struc_258 { int32_t field_A8; int32_t field_AC; float_t field_B0; - int32_t eyes_adjust; - int32_t field_B8; - int32_t field_BC; + vec3 field_B4; vec3 field_C0; mat4u field_CC; mat4u field_10C; - uint8_t field_14C; + bool field_14C; float_t field_150; float_t field_154; float_t field_158; struc_243 field_15C; - int32_t field_184; - int32_t field_188; - int32_t field_18C; - int32_t field_190; - uint8_t field_194; - uint8_t field_195; - int32_t field_198; - int32_t field_19C; - int32_t field_1A0; + float_t field_184; + float_t field_188; + float_t field_18C; + bool field_190; + bool field_191; + bool field_192; + bool field_193; + bool field_194; + bool field_195; + float_t field_198; + float_t field_19C; + float_t field_1A0; int32_t field_1A4; int32_t field_1A8; - int32_t field_1AC; - int32_t field_1B0; + float_t field_1AC; + float_t field_1B0; int32_t field_1B4; int32_t field_1B8; vec2 field_1BC; uint8_t field_1C4; int32_t field_1C8; int32_t field_1CC; -} struc_258; +}; -typedef struct struc_312 { +struct struc_312 { struc_242 field_0; struc_242 field_2C; uint8_t field_58; uint8_t field_59; - int32_t field_5C; - int32_t field_60; - int32_t field_64; - int32_t field_68; - int32_t field_6C; - int32_t field_70; - int32_t field_74; - int32_t field_78; - int32_t field_7C; - int32_t field_80; - int32_t field_84; - int32_t field_88; + vec3 field_5C; + vec3 field_68; + vec3 field_74; + vec3 field_80; float_t field_8C; - int32_t field_90; - int32_t field_94; - float_t field_98; - int32_t field_9C; -} struc_312; + vector_old_bone_data* bones; + float_t step; +}; -typedef struct bone_data_parent { +struct bone_data_parent { rob_chara_bone_data* rob_bone_data; bool field_8; bool field_9; @@ -2609,10 +2932,10 @@ typedef struct bone_data_parent { uint32_t bone_key_set_count; uint32_t global_key_set_count; float_t field_78; - float_t rotation_y; -} bone_data_parent; + float_t rot_y; +}; -typedef struct struc_308 { +struct struc_308 { int32_t field_0; int32_t field_4; uint8_t field_8; @@ -2622,38 +2945,39 @@ typedef struct struc_308 { vec3 field_90; vec3 field_9C; vec3 field_A8; - float_t eyes_adjust; - float_t prev_eyes_adjust; + float_t rot_y; + float_t prev_rot_y; uint8_t field_BC; uint8_t field_BD; float_t field_C0; float_t field_C4; vec3 field_C8; -} struc_308; +}; -typedef struct motion_blend_mot { +struct motion_blend_mot { struc_240 field_0; - motion_blend_cross cross; - motion_blend_freeze freeze; - motion_blend_combine combine; + MotionBlendCross cross; + MotionBlendFreeze freeze; + MotionBlendCombine combine; bone_data_parent bone_data; mot_key_data mot_key_data; mot_play_data mot_play_data; struc_308 field_4F8; int32_t field_5CC; - motion_blend* blend; -} motion_blend_mot; + MotionBlend* blend; +}; vector_old_ptr(motion_blend_mot) +vector_old(mat4) list_ptr(motion_blend_mot) list(size_t) -typedef struct rob_chara_bone_data_ik_scale { +struct rob_chara_bone_data_ik_scale { float_t ratio0; float_t ratio1; float_t ratio2; float_t ratio3; -} rob_chara_bone_data_ik_scale; +}; struct rob_chara_bone_data { uint8_t field_0; @@ -2666,8 +2990,8 @@ struct rob_chara_bone_data { vector_old_mat4 mats; vector_old_mat4 mats2; vector_old_bone_node nodes; - aft_bone_database_skeleton_type base_skeleton_type; - aft_bone_database_skeleton_type skeleton_type; + bone_database_skeleton_type base_skeleton_type; + bone_database_skeleton_type skeleton_type; vector_old_ptr_motion_blend_mot motions; list_size_t motion_indices; list_size_t motion_loaded_indices; @@ -2678,7 +3002,7 @@ struct rob_chara_bone_data { mot_blend mouth; mot_blend eye; mot_blend eyelid; - uint8_t field_758; + bool disable_eye_motion; rob_chara_bone_data_ik_scale ik_scale; vec3 field_76C; vec3 field_778; @@ -2687,59 +3011,59 @@ struct rob_chara_bone_data { struc_312 field_958; }; -typedef struct opd_blend_data { +struct opd_blend_data { int32_t motion_id; float_t frame; float_t frame_count; - uint8_t field_C; - motion_blend_type type; + bool field_C; + MotionBlendType type; float_t blend; -} opd_blend_data; +}; vector_old(opd_blend_data) -typedef struct aft_obj_skin_block_node { - char* parent_name; +struct obj_skin_block_node { + const char* parent_name; vec3 position; vec3 rotation; vec3 scale; -} aft_obj_skin_block_node; +}; -typedef struct aft_obj_skin_block_osage_node { +struct obj_skin_block_osage_node { uint32_t name_index; float_t length; vec3 rotation; -} aft_obj_skin_block_osage_node; +}; -typedef struct aft_obj_skin_block_osage { - aft_obj_skin_block_node node; +struct obj_skin_block_osage { + obj_skin_block_node node; int32_t start_index; int32_t count; int32_t external_name_index; int32_t name_index; - aft_obj_skin_block_osage_node* nodes; + obj_skin_block_osage_node* nodes; int32_t field_48; int32_t field_4C; int32_t field_50; int32_t field_54; -} aft_obj_skin_block_osage; +}; -typedef struct aft_obj_skin_block_expression { - aft_obj_skin_block_node node; - char* name; +struct obj_skin_block_expression { + obj_skin_block_node node; + const char* name; uint32_t expression_count; - char* expressions[9]; -} aft_obj_skin_block_expression; + const char* expressions[9]; +}; -typedef struct struc_231 { +struct struc_231 { uint8_t* bone_name; float_t weight; uint32_t matrix_index; uint32_t field_10; int32_t field_14; -} struc_231; +}; -typedef struct struc_230 { +struct struc_230 { vec3 field_0; vec3 field_C; float_t field_18; @@ -2747,9 +3071,9 @@ typedef struct struc_230 { int32_t field_20; int32_t field_24; struc_231 field_28[4]; -} struc_230; +}; -typedef struct struc_251 { +struct struc_251 { uint32_t field_0; float_t field_4; float_t field_8; @@ -2761,11 +3085,65 @@ typedef struct struc_251 { float_t field_20; float_t field_24; float_t field_28; -} struc_251; +}; -typedef struct aft_obj_skin_block_cloth { - char* mesh_name; - char* backface_mesh_name; +struct skin_param_osage_root_coli { + int32_t type; + int32_t bone0_index; + int32_t bone1_index; + float_t radius; + vec3 bone0_pos; + vec3 bone1_pos; +}; + +vector_old(skin_param_osage_root_coli) + +struct skin_param_osage_root_boc { + int32_t ed_node; + string ed_root; + int32_t st_node; +}; + +vector_old(skin_param_osage_root_boc) + +struct skin_param_osage_root_normal_ref { + string n; + string u; + string d; + string l; + string r; +}; + +vector_old(skin_param_osage_root_normal_ref) + +struct skin_param_osage_root { + int32_t field_0; + float_t force; + float_t force_gain; + float_t air_res; + float_t rot_y; + float_t rot_z; + float_t init_rot_y; + float_t init_rot_z; + float_t hinge_y; + float_t hinge_z; + const char* name; + vector_old_skin_param_osage_root_coli coli; + float_t coli_r; + float_t friction; + float_t wind_afc; + int32_t yz_order; + vector_old_skin_param_osage_root_boc boc; + int32_t coli_type; + float_t stiffness; + float_t move_cancel; + string colli_tgt_osg; + vector_old_skin_param_osage_root_normal_ref normal_ref; +}; + +struct obj_skin_block_cloth { + const char* mesh_name; + const char* backface_mesh_name; uint32_t field_8; uint32_t count; uint32_t field_10; @@ -2775,169 +3153,172 @@ typedef struct aft_obj_skin_block_cloth { struc_251* field_20; uint16_t* field_24; uint16_t* field_28; - int64_t field_48; + skin_param_osage_root* skp_root; uint32_t field_30; uint32_t field_54; -} aft_obj_skin_block_cloth; +}; -typedef struct aft_obj_skin_block_constraint_orientation { +struct obj_skin_block_constraint_orientation { vec3 offset; -} aft_obj_skin_block_constraint_orientation; +}; -typedef struct aft_obj_skin_block_constraint_up_vector_old { +struct obj_skin_block_constraint_up_vector_old { bool active; float_t roll; vec3 affected_axis; vec3 point_at; - char* name; -} aft_obj_skin_block_constraint_up_vector_old; + const char* name; +}; -typedef struct aft_obj_skin_block_constraint_direction { - aft_obj_skin_block_constraint_up_vector_old up_vector; +struct obj_skin_block_constraint_direction { + obj_skin_block_constraint_up_vector_old up_vector; vec3 align_axis; vec3 target_offset; -} aft_obj_skin_block_constraint_direction; +}; -typedef struct aft_obj_skin_block_constraint_attach_point { +struct obj_skin_block_constraint_attach_point { int32_t affected_by_orientation; int32_t affected_by_scaling; vec3 offset; -} aft_obj_skin_block_constraint_attach_point; +}; -typedef struct aft_obj_skin_block_constraint_position { - aft_obj_skin_block_constraint_up_vector_old up_vector; - aft_obj_skin_block_constraint_attach_point constrained_object; - aft_obj_skin_block_constraint_attach_point constraining_object; -} aft_obj_skin_block_constraint_position; +struct obj_skin_block_constraint_position { + obj_skin_block_constraint_up_vector_old up_vector; + obj_skin_block_constraint_attach_point constrained_object; + obj_skin_block_constraint_attach_point constraining_object; +}; -typedef struct aft_obj_skin_block_constraint_distance { - aft_obj_skin_block_constraint_up_vector_old up_vector; +struct obj_skin_block_constraint_distance { + obj_skin_block_constraint_up_vector_old up_vector; float_t distance; - aft_obj_skin_block_constraint_attach_point constrained_object; - aft_obj_skin_block_constraint_attach_point constraining_object; -} aft_obj_skin_block_constraint_distance; + obj_skin_block_constraint_attach_point constrained_object; + obj_skin_block_constraint_attach_point constraining_object; +}; -typedef struct aft_obj_skin_block_constraint { - aft_obj_skin_block_node node; - char* type; - char* name; +struct obj_skin_block_constraint { + obj_skin_block_node node; + const char* type; + const char* name; int32_t coupling; - char* source_node_name; + const char* source_node_name; union { - aft_obj_skin_block_constraint_orientation orientation; - aft_obj_skin_block_constraint_direction direction; - aft_obj_skin_block_constraint_position position; - aft_obj_skin_block_constraint_distance distance; + obj_skin_block_constraint_orientation orientation; + obj_skin_block_constraint_direction direction; + obj_skin_block_constraint_position position; + obj_skin_block_constraint_distance distance; }; -} aft_obj_skin_block_constraint; +}; -typedef struct aft_obj_skin_block { - char* signature; - union { - aft_obj_skin_block_node node; - aft_obj_skin_block_osage osage; - aft_obj_skin_block_expression expression; - aft_obj_skin_block_cloth cloth; - aft_obj_skin_block_constraint constraint; - }; -} aft_obj_skin_block; +union obj_skin_block_union { + obj_skin_block_node base; + obj_skin_block_cloth cloth; + obj_skin_block_constraint constraint; + obj_skin_block_expression expression; + obj_skin_block_osage osage; +}; -typedef struct rob_chara_item_equip_object rob_chara_item_equip_object; -typedef struct ex_node_block ex_node_block; +struct obj_skin_block { + const char* signature; + obj_skin_block_union* block; +}; -typedef struct ex_node_block_vtbl { - void* (*dispose)(ex_node_block*, bool dispose); - void(*init)(ex_node_block*); - void(*field_10)(ex_node_block*); - void(*field_18)(ex_node_block*, int64_t, int64_t); - void(*field_20)(ex_node_block*); - void(*set_osage_play_data)(ex_node_block*); - void(*disp)(ex_node_block*); - void(*reset)(ex_node_block*); - void(*field_40)(ex_node_block*); - void(*field_48)(ex_node_block*); - void(*field_50)(ex_node_block*); - void(*field_58)(ex_node_block*); -} ex_node_block_vtbl; +struct rob_chara_item_equip_object; +struct ExNodeBlock; -struct ex_node_block { - ex_node_block_vtbl* __vftable; +struct ExNodeBlock_vtbl { + void* (*Dispose)(ExNodeBlock*, bool dispose); + void(*Field8)(ExNodeBlock*); + void(*Field10)(ExNodeBlock*); + void(*Field18)(ExNodeBlock*, int32_t, bool); + void(*Field20)(ExNodeBlock*); + void(*SetOsagePlayData)(ExNodeBlock*); + void(*Disp)(ExNodeBlock*); + void(*Reset)(ExNodeBlock*); + void(*Field40)(ExNodeBlock*); + void(*Field48)(ExNodeBlock*); + void(*Field50)(ExNodeBlock*); + void(*Field58)(ExNodeBlock*); +}; + +struct ExNodeBlock { + ExNodeBlock_vtbl* __vftable; bone_node* bone_node_ptr; - ex_node_type type; - char* name; + ExNodeType type; + const char* name; bone_node* parent_bone_node; string parent_name; - ex_node_block* parent_node; + ExNodeBlock* parent_node; rob_chara_item_equip_object* item_equip_object; bool field_58; bool field_59; bool field_5A; }; -typedef struct ex_null_block { - ex_node_block base; - aft_obj_skin_block_node* node_data; -} ex_null_block; +struct ExNullBlock { + ExNodeBlock base; + obj_skin_block_node* node_data; +}; -typedef struct rob_osage_node rob_osage_node; +struct rob_osage_node; -typedef struct rob_osage_node_data_normal_ref { +struct rob_osage_node_data_normal_ref { bool field_0; + int field_4; rob_osage_node* n; rob_osage_node* u; rob_osage_node* d; rob_osage_node* l; rob_osage_node* r; mat4u mat; -} rob_osage_node_data_normal_ref; +}; -typedef struct skin_param_hinge { +struct skin_param_hinge { float_t ymin; float_t ymax; float_t zmin; float_t zmax; -} skin_param_hinge; +}; -typedef struct skin_param_osage_node { +struct skin_param_osage_node { float_t coli_r; float_t weight; float_t inertial_cancel; skin_param_hinge hinge; -} skin_param_osage_node; +}; vector_old_ptr(rob_osage_node) -typedef struct rob_osage_node_data { +struct rob_osage_node_data { float_t force; vector_old_ptr_rob_osage_node boc; rob_osage_node_data_normal_ref normal_ref; skin_param_osage_node skp_osg_node; -} rob_osage_node_data; +}; -typedef struct opd_vec3_data { +struct opd_vec3_data { float_t* x; float_t* y; float_t* z; -} opd_vec3_data; +}; vector_old(opd_vec3_data) -typedef struct struc_477 { +struct struc_477 { float_t length; vec3 angle; -} struc_477; +}; -typedef struct struc_476 { +struct struc_476 { struc_477 field_0; struc_477 field_10; -} struc_476; +}; -typedef struct rob_osage_node_reset_data { +struct rob_osage_node_reset_data { vec3 trans; vec3 trans_diff; vec3 rotation; float_t length; -} rob_osage_node_reset_data; +}; struct rob_osage_node { float_t length; @@ -2965,18 +3346,7 @@ struct rob_osage_node { vector_old(rob_osage_node) -typedef struct skin_param_osage_root_coli { - int32_t type; - int32_t bone0_index; - int32_t bone1_index; - float_t radius; - vec3 bone0_pos; - vec3 bone1_pos; -} skin_param_osage_root_coli; - -vector_old(skin_param_osage_root_coli) - -typedef struct skin_param { +struct skin_param { vector_old_skin_param_osage_root_coli coli; float_t friction; float_t wind_afc; @@ -2991,9 +3361,9 @@ typedef struct skin_param { float_t force; float_t force_gain; vector_old_rob_osage_node* colli_tgt_osg; -} skin_param; +}; -typedef struct osage_coli { +struct osage_coli { int32_t type; float_t radius; vec3 bone0_pos; @@ -3002,11 +3372,11 @@ typedef struct osage_coli { float_t bone_pos_diff_length; float_t bone_pos_diff_length_squared; float_t field_34; -} osage_coli; +}; vector_old(osage_coli) -typedef struct osage_ring_data { +struct osage_ring_data { float_t ring_rectangle_x; float_t ring_rectangle_y; float_t ring_rectangle_width; @@ -3016,40 +3386,30 @@ typedef struct osage_ring_data { bool field_18; vector_old_osage_coli coli; vector_old_skin_param_osage_root_coli skp_root_coli; -} osage_ring_data; - -typedef struct pair_int32_t_int32_t { - int32_t key; - int32_t value; -} pair_int32_t_int32_t; - -typedef struct list_rob_osage_node_reset_data_node list_rob_osage_node_reset_data_node; - -struct list_rob_osage_node_reset_data_node { - list_rob_osage_node_reset_data_node* next; - list_rob_osage_node_reset_data_node* prev; - rob_osage_node_reset_data value; }; -typedef struct list_rob_osage_node_reset_data { - list_rob_osage_node_reset_data_node* head; - size_t size; -} list_rob_osage_node_reset_data; +struct pair_int32_t_int32_t { + int32_t key; + int32_t value; +}; -typedef struct pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data { +list(rob_osage_node_reset_data) + +struct pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data { pair_int32_t_int32_t key; list_rob_osage_node_reset_data value; -} pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data; +}; -tree_def(pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data) typedef pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data motion_reset_data; -typedef struct osage_setting_osg_cat { - int32_t parts; - size_t exf; -} osage_setting_osg_cat; +tree_def(motion_reset_data) -typedef struct rob_osage { +struct osage_setting_osg_cat { + rob_osage_parts parts; + size_t exf; +}; + +struct rob_osage { skin_param* skin_param_ptr; bone_node_expression_data exp_data; vector_old_rob_osage_node nodes; @@ -3073,69 +3433,69 @@ typedef struct rob_osage { bool field_1F0E; bool field_1F0F; osage_ring_data ring; - tree_pair_pair_int32_t_int32_t_list_rob_osage_node_reset_data motion_reset_data; + tree_motion_reset_data motion_reset_data; list_rob_osage_node_reset_data* reset_data_list; bool set_external_force; vec3 external_force; -} rob_osage; +}; -typedef struct ex_osage_block { - ex_node_block base; +struct ExOsageBlock { + ExNodeBlock base; size_t index; rob_osage rob; mat4* mat; int32_t field_1FF8; float_t step; -} ex_osage_block; +}; -typedef struct ex_constraint_block { - ex_node_block base; - aft_obj_skin_block_constraint_type type; +struct ExConstraintBlock { + ExNodeBlock base; + obj_skin_block_constraint_type type; bone_node* source_node_bone_node; bone_node* direction_up_vector_bone_node; - aft_obj_skin_block_constraint* cns_data; + obj_skin_block_constraint* cns_data; int64_t field_80; -} ex_constraint_block; +}; -typedef struct struc_323 { +struct struc_323 { int32_t field_0; int64_t field_8; int64_t field_10; int64_t field_18; int64_t field_20; -} struc_323; +}; -typedef struct ex_expression_block_stack ex_expression_block_stack; +struct ex_expression_block_stack; -typedef struct ex_expression_block_stack_number { +struct ex_expression_block_stack_number { float_t value; -}ex_expression_block_stack_number; +}; -typedef struct ex_expression_block_stack_variable { +struct ex_expression_block_stack_variable { float_t* value; -}ex_expression_block_stack_variable; +}; -typedef struct ex_expression_block_stack_variable_radian { +struct ex_expression_block_stack_variable_radian { float_t* value; -} ex_expression_block_stack_variable_radian; +}; -typedef struct ex_expression_block_stack_op1 { +struct ex_expression_block_stack_op1 { float_t(*func)(float_t v1); ex_expression_block_stack* v1; -} ex_expression_block_stack_op1; +}; -typedef struct ex_expression_block_stack_op2 { +struct ex_expression_block_stack_op2 { float_t(*func)(float_t v1, float_t v2); ex_expression_block_stack* v1; ex_expression_block_stack* v2; -} ex_expression_block_stack_op2; +}; -typedef struct ex_expression_block_stack_op3 { +struct ex_expression_block_stack_op3 { float_t(*func)(float_t v1, float_t v2, float_t v3); ex_expression_block_stack* v1; ex_expression_block_stack* v2; ex_expression_block_stack* v3; -} ex_expression_block_stack_op3; +}; struct ex_expression_block_stack { ex_expression_block_stack_type type; @@ -3149,37 +3509,37 @@ struct ex_expression_block_stack { }; }; -typedef struct ex_expression_block { - ex_node_block base; +struct ExExpressionBlock { + ExNodeBlock base; float_t* values[9]; ex_expression_block_stack_type types[9]; ex_expression_block_stack* expressions[9]; ex_expression_block_stack stack_data[384]; - aft_obj_skin_block_expression* exp_data; + obj_skin_block_expression* exp_data; bool field_3D20; void(*field_3D28)(bone_node_expression_data*); float_t frame; bool init; -} ex_expression_block; +}; -typedef struct cloth cloth; +struct cloth; -typedef struct cloth_vftable { - void(*dispose)(void*); - void(*field_8)(void*); - void(*field_10)(void*); - void(*field_18)(void*); - void(*field_20)(void*); - void(*field_28)(void*, int64_t); - void(*field_30)(void*); - void(*field_38)(void*); - void(*field_40)(void*); - void(*field_48)(void*); - void(*field_50)(void*); - void(*field_58)(void*); -} cloth_vftable; +struct cloth_vtbl { + void* (*dispose)(cloth*, bool dispose); + void(*field_8)(cloth*); + void(*set_skin_param_coli_r)(cloth*, float_t coli_r); + void(*set_skin_param_friction)(cloth*, float_t friction); + void(*set_skin_param_wind_afc)(cloth*, float_t wind_afc); + void(*set_wind_direction)(cloth*, vec3* wind_direction); + void(*field_30)(cloth*); + void(*set_skin_param_hinge)(cloth* cls, float_t hinge_y, float_t hinge_z); + void(*field_40)(cloth*); + void(*field_48)(cloth*); + void(*field_50)(cloth*); + void(*field_58)(cloth*); +}; -typedef struct struc_342 { +struct struc_342 { int32_t field_0; vec3 field_4; int64_t field_10; @@ -3209,131 +3569,167 @@ typedef struct struc_342 { int64_t field_D8; int64_t field_E0; int64_t field_E8; -} struc_342; +}; -typedef struct struc_341 { - int64_t field_0; - int64_t field_8; - int64_t field_10; -} struc_341; +struct rob_cloth_node { + int field_0; + vec3 position; + vec3 field_10; + vec3 field_1C; + vec3 field_28; + vec3 normal; + vec3 tangent; + vec3 binormal; + float_t tangent_sign; + vec2 field_5C; + vec3 field_64; + float_t field_70; + int field_74; + int field_78; + int field_7C; + __int64 field_80; + int field_88; + rob_osage_node_reset_data reset_data; + int field_B4; + vector_old_opd_vec3_data opd_data; + struc_476 field_D0; +}; + +vector_old(rob_cloth_node) + +struct struc_341 { + size_t field_0; + size_t field_8; + float_t field_10; + int32_t field_14; +}; vector_old(struc_341) struct cloth { - cloth_vftable* vftable; + cloth_vtbl* __vftable; int32_t field_8; - int64_t field_10; - int64_t field_18; - struc_342* field_20; - int64_t field_28; - int64_t field_30; - vec3 field_38; + size_t first_node; + size_t field_18; + vector_old_rob_cloth_node nodes; + vec3 wind_direction; float_t field_44; - uint8_t field_48; - vec3 field_4C; + bool set_external_force; + vec3 external_force; vector_old_struc_341 field_58; - skin_param* field_70; - skin_param field_78; + skin_param* skin_param_ptr; + skin_param skin_param; osage_coli coli[64]; osage_coli coli_ring[64]; - vec3 field_1CE8; - vec3 field_1CF4; - bool field_1D00; - int64_t field_1D08; - int64_t field_1D10; - int64_t field_1D18; - int64_t field_1D20; - int64_t field_1D28; - int64_t field_1D30; - mat4u* field_1D38; + osage_ring_data ring; + mat4* field_1D38; }; -typedef struct aft_obj_bounding_sphere { +struct obj_bounding_sphere { vec3 center; float_t radius; -} aft_obj_bounding_sphere; +}; -typedef struct aft_obj_axis_aligned_bounding_box { +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_axis_aligned_bounding_box { vec3 center; vec3 size; -} aft_obj_axis_aligned_bounding_box; +}; -typedef struct aft_obj_sub_mesh { - uint32_t field_0; - aft_obj_bounding_sphere bounding_sphere; +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]; uint32_t bone_indices_count; uint16_t* bone_indices; uint32_t bones_per_vertex; - aft_obj_primitive_type primitive_type; - aft_obj_index_format index_format; + obj_primitive_type primitive_type; + obj_index_format index_format; uint32_t indices_count; uint16_t* indices; - aft_obj_sub_mesh_flags flags; - uint32_t field_4C; - int32_t field_50; - int32_t field_54; - int32_t field_58; - int32_t field_5C; - aft_obj_axis_aligned_bounding_box* axis_aligned_bounding_box; + obj_sub_mesh_attrib attrib; + uint32_t reserved[4]; + obj_axis_aligned_bounding_box* axis_aligned_bounding_box; uint16_t first_index; uint16_t last_index; uint32_t indices_offset; -} aft_obj_sub_mesh; +}; -typedef union aft_obj_mesh_attrib_offsets { - struct { - vec3* position; - vec3* normal; - vec4* tangent; - vec3* binormal; - vec2* texcoord0; - vec2* texcoord1; - vec2* texcoord2; - vec2* texcoord3; - vec4* color0; - vec4* color1; - vec4* bone_weight; - vec4* bone_index; - void* field_60; - void* field_68; - void* field_70; - void* field_78; - void* field_80; - void* field_88; - void* field_90; - void* field_98; - }; +struct obj_mesh_vertex_array { + vec3* position; + vec3* normal; + vec4* tangent; + vec3* binormal; + vec2* texcoord0; + vec2* texcoord1; + vec2* texcoord2; + vec2* texcoord3; + vec4* color0; + vec4* color1; + vec4* bone_weight; + vec4* bone_index; + void* field_60; + void* field_68; + void* field_70; + void* field_78; + void* field_80; + void* field_88; + void* field_90; + void* field_98; +}; + +union obj_mesh_vertex_array_union { + obj_mesh_vertex_array data; void* ptr[20]; -} aft_obj_mesh_attrib_offsets; +}; -typedef struct aft_obj_mesh { - uint32_t field_0; - aft_obj_bounding_sphere bounding_sphere; - uint32_t sub_meshes_count; - aft_obj_sub_mesh* sub_meshes; - aft_obj_vertex_attrib_type attrib_type; - uint32_t vertex_size; - uint32_t vertex_count; - aft_obj_mesh_attrib_offsets attrib_offsets; - aft_obj_mesh_flags flags; - uint32_t attrib_flags; - uint32_t field_D8; - uint32_t field_DC; - uint32_t field_E0; - uint32_t field_E4; - uint32_t field_E8; - uint32_t field_EC; +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 : 28; +}; + +union obj_mesh_attrib { + obj_mesh_attrib_member m; + uint32_t w; +}; + +struct obj_mesh { + uint32_t flags; + obj_bounding_sphere bounding_sphere; + uint32_t num_submesh; + obj_sub_mesh* submesh_array; + obj_vertex_format vertex_format; + uint32_t size_vertex; + uint32_t num_vertex; + obj_mesh_vertex_array_union vertex; + obj_mesh_attrib attrib; + uint32_t vertex_flags; + uint32_t reserved[6]; char name[64]; -} aft_obj_mesh; +}; -typedef union aft_obj_material_shader { +union obj_material_shader { char name[8]; aft_shader_enum index; -} aft_obj_material_shader; +}; -typedef struct aft_obj_material_shader_flags { +struct obj_material_shader_flags { uint32_t vertex_translation_type : 2; uint32_t color_source_type : 2; uint32_t lambert_shading : 1; @@ -3347,26 +3743,26 @@ typedef struct aft_obj_material_shader_flags { uint32_t cast_shadow : 1; uint32_t specular_quality : 1; uint32_t aniso_direction : 3; -} aft_obj_material_shader_flags; +}; -typedef struct aft_obj_material_texture { - aft_obj_material_texture_sampler_flags sampler_flags; +struct obj_material_texture { + obj_material_texture_sampler_flags sampler_flags; uint32_t texture_id; int32_t texture_flags; char shader_name[8]; float_t weight; mat4u tex_coord_mat; float_t unk[8]; -} aft_obj_material_texture; +}; -typedef struct aft_obj_material { - aft_obj_material_flags material_flags; - aft_obj_material_shader shader; +struct obj_material { + obj_material_flags material_flags; + obj_material_shader shader; union { uint32_t shader_flags; - aft_obj_material_shader_flags shader_flags_data; + obj_material_shader_flags shader_flags_data; }; - aft_obj_material_texture textures[8]; + obj_material_texture textures[8]; int32_t blend_flags; vec4u diffuse; vec4u ambient; @@ -3374,25 +3770,25 @@ typedef struct aft_obj_material { vec4u emission; float_t shininess; float_t intensity; - aft_obj_bounding_sphere reserved_sphere; + obj_bounding_sphere reserved_sphere; char name[64]; float_t bump_depth; float_t unk[15]; -} aft_obj_material; +}; -typedef struct aft_obj_material_data { +struct obj_material_data { int32_t texture_count; - aft_obj_material material; -} aft_obj_material_data; + obj_material material; +}; -typedef struct aft_obj { +struct aft_obj { uint32_t field_0; uint32_t field_4; - aft_obj_bounding_sphere bounding_sphere; + obj_bounding_sphere bounding_sphere; uint32_t meshes_count; - aft_obj_mesh* meshes; + obj_mesh* meshes; uint32_t materials_count; - aft_obj_material_data* materials; + obj_material_data* materials; uint32_t field_38; uint32_t field_3C; uint32_t field_40; @@ -3403,116 +3799,107 @@ typedef struct aft_obj { uint32_t field_54; uint32_t field_58; uint32_t field_5C; -} aft_obj; +}; -typedef struct aft_obj_mesh_vertex_buffer -{ +struct obj_mesh_vertex_buffer { int32_t count; GLuint buffers[3]; int32_t index; GLenum enum_data; -} aft_obj_mesh_vertex_buffer; +}; -typedef struct aft_obj_vertex_buffer { +struct obj_vertex_buffer { int32_t meshes_count; - aft_obj_mesh_vertex_buffer* meshes; -} aft_obj_vertex_buffer; + obj_mesh_vertex_buffer* meshes; +}; -typedef GLuint aft_obj_mesh_index_buffer; +typedef GLuint obj_mesh_index_buffer; -typedef struct aft_obj_index_buffer { +struct obj_index_buffer { int32_t meshes_count; - aft_obj_mesh_index_buffer* meshes; -} aft_obj_index_buffer; + obj_mesh_index_buffer* meshes; +}; -typedef struct texture_pattern_struct { - int32_t src; - int32_t dst; -} texture_pattern_struct; - -vector_old(texture_pattern_struct) - -typedef struct aft_obj_skin_osage_node { +struct obj_skin_osage_node { int32_t name_index; float_t length; int32_t index; -} aft_obj_skin_osage_node; +}; -typedef struct aft_obj_skin_ex_data { +struct obj_skin_osage_sibling_info { + int32_t name_index; + int32_t sibling_name_index; + float_t distance; +}; + +struct obj_skin_ex_data { int32_t osage_name_count; int32_t osage_node_count; - char** field_8; - aft_obj_skin_osage_node* osage_nodes; - char** osage_names; - aft_obj_skin_block* blocks; - int32_t field_28; - int32_t field_2C; - char** strings; - int64_t osage_sibling_infos; - int32_t field_40; - int32_t field_44; - int32_t field_48; - int32_t field_4C; - int32_t field_50; - int32_t field_54; - int32_t field_58; - int32_t field_5C; -} aft_obj_skin_ex_data; + const char** field_8; + obj_skin_osage_node* osage_nodes; + const char** osage_names; + obj_skin_block* blocks; + int32_t bone_names_count; + const char** bone_names; + obj_skin_osage_sibling_info* osage_sibling_infos; + uint32_t cloth_count; + uint32_t reserved[7]; +}; -typedef struct aft_obj_skin { +struct obj_skin { uint32_t* bone_ids; mat4u* bone_matrices; - char** bone_names; - aft_obj_skin_ex_data* ex_data; + const char** bone_names; + obj_skin_ex_data* ex_data; uint32_t bone_count; int32_t bone_parent_ids_offset; int32_t field_28; int32_t field_2C; int32_t field_30; -} aft_obj_skin; +}; -typedef struct aft_obj_set_info { +struct obj_set_info { int32_t id; string name; string object_file_name; string texture_file_name; string archive_file_name; -} aft_obj_set_info; +}; -typedef struct pair_uint32_t_obj_set_info { +struct pair_uint32_t_obj_set_info { uint32_t id; - aft_obj_set_info data; -} pair_uint32_t_obj_set_info; + obj_set_info data; +}; vector_old(pair_uint32_t_obj_set_info) -typedef struct aft_obj_database { +struct obj_database { vector_old_pair_uint32_t_obj_set_info field_0; size_t field_18; vector_old_pair_uint32_t_obj_set_info field_20; bool field_38; -} aft_obj_database; +}; -typedef struct aft_obj_set { +struct obj_set { uint32_t signature; uint32_t objects_count; uint32_t max_object_id; aft_obj** objects; - aft_obj_skin** object_skins; - char** object_names; + obj_skin** object_skins; + const char** object_names; uint32_t* object_ids; uint32_t* texture_ids; uint32_t texture_ids_count; uint32_t field_3C; uint32_t field_40; -} aft_obj_set; +}; -typedef struct aft_obj_bounding_box { +struct obj_bounding_box { vec3 center; vec3 size; -} aft_obj_bounding_box; +}; -typedef struct texture { +struct texture { int32_t init_count; int32_t id; texture_flags flags; @@ -3523,10 +3910,10 @@ typedef struct texture { GLenum internal_format; int32_t max_mipmap_level; int32_t size; -} texture; +}; -typedef struct struc_332 { - aft_obj_sub_mesh field_0; +struct struc_332 { + obj_sub_mesh field_0; int64_t field_70; int64_t field_78; int64_t field_80; @@ -3569,99 +3956,112 @@ typedef struct struc_332 { int64_t field_1A8; int64_t field_1B0; int64_t field_1B8; -} struc_332; +}; -typedef struct struc_295 { +struct struc_295 { int32_t field_0; int32_t field_4; int64_t field_8; int64_t field_10; -} struc_295; +}; vector_old(struc_295) -typedef struct rob_cloth { +struct struc_469 { + vec3 field_0; + vec3 field_C; + vec4 tangent; + bone_node* field_28[4]; + mat4* field_48[4]; + mat4* field_68[4]; + float_t weight[4]; + mat4 field_98; + mat4 field_D8; + mat4 field_118; +}; + +vector_old(struc_469) + +struct rob_cloth { cloth base; - int64_t field_1D40; - int64_t field_1D48; - int64_t field_1D50; - rob_chara_item_equip_object* field_1D58; + vector_old_struc_469 field_1D40; + rob_chara_item_equip_object* itm_eq_obj; struc_230* field_1D60; - aft_obj_skin_block_cloth* cls_data; + obj_skin_block_cloth* cls_data; float_t move_cancel; - uint8_t field_1D74; - aft_obj_mesh field_1D78[2]; + bool osage_reset; + obj_mesh field_1D78[2]; struc_332 field_1FD8[2]; - aft_obj_axis_aligned_bounding_box field_2358; - aft_obj_mesh_vertex_buffer field_2370[2]; + obj_axis_aligned_bounding_box field_2358; + obj_mesh_vertex_buffer field_2370[2]; GLuint mesh_buffer; int32_t field_23A4; - vector_old_struc_295 field_23A8; - int64_t field_23B8; -} rob_cloth; + tree_motion_reset_data motion_reset_data; + list_rob_osage_node_reset_data* reset_data_list; +}; -typedef struct ex_cloth_block { - ex_node_block base; +struct ExClothBlock { + ExNodeBlock base; rob_cloth rob; - aft_obj_skin_block_cloth* cls_data; + obj_skin_block_cloth* cls_data; mat4* field_2428; int64_t field_2430; -} ex_cloth_block; +}; -vector_old_ptr(ex_node_block) -vector_old_ptr(ex_null_block) -vector_old_ptr(ex_osage_block) -vector_old_ptr(ex_constraint_block) -vector_old_ptr(ex_expression_block) -vector_old_ptr(ex_cloth_block) +vector_old_ptr(ExNodeBlock) +vector_old_ptr(ExNullBlock) +vector_old_ptr(ExOsageBlock) +vector_old_ptr(ExConstraintBlock) +vector_old_ptr(ExExpressionBlock) +vector_old_ptr(ExClothBlock) -typedef struct ex_data_name_bone_index { - char* name; +struct ex_data_name_bone_index { + const char* name; int32_t bone_index; -} ex_data_name_bone_index; +}; vector_old(ex_data_name_bone_index) -typedef struct texture_data_struct { +struct texture_data_struct { int32_t field_0; - vec3 field_4; - vec3 field_10; - vec3 field_1C; - vec3 field_28; -} texture_data_struct; + vec3 texture_color_coeff; + vec3 texture_color_offset; + vec3 texture_specular_coeff; + vec3 texture_specular_offset; +}; struct rob_chara_item_equip_object { size_t index; - mat4* mat; - aft_object_info object_info; + mat4* mats; + object_info object_info; int32_t field_14; - vector_old_texture_pattern_struct field_18; + vector_old_texture_pattern_struct texture_pattern; texture_data_struct texture_data; - char field_64; + bool null_blocks_data_set; bone_node_expression_data exp_data; float_t alpha; draw_task_flags draw_task_flags; bool disp; int32_t field_A4; - mat4* field_A8; + mat4* mat; int32_t osage_iterations; bone_node* bone_nodes; - vector_old_ptr_ex_node_block node_blocks; + vector_old_ptr_ExNodeBlock node_blocks; vector_old_bone_node ex_data_bone_nodes; vector_old_mat4 ex_data_matrices; vector_old_mat4 field_108; vector_old_ex_data_name_bone_index ex_bones; int64_t field_138; - vector_old_ptr_ex_null_block null_blocks; - vector_old_ptr_ex_osage_block osage_blocks; - vector_old_ptr_ex_constraint_block constraint_blocks; - vector_old_ptr_ex_expression_block expression_blocks; - vector_old_ptr_ex_cloth_block cloth_blocks; - char field_1B8; - int64_t field_1C0; - char field_1C8; - aft_obj_skin_ex_data* skin_ex_data; - aft_obj_skin* skin; + vector_old_ptr_ExNullBlock null_blocks; + vector_old_ptr_ExOsageBlock osage_blocks; + vector_old_ptr_ExConstraintBlock constraint_blocks; + vector_old_ptr_ExExpressionBlock expression_blocks; + vector_old_ptr_ExClothBlock cloth_blocks; + int8_t field_1B8; + size_t frame_count; + bool use_opd; + obj_skin_ex_data* skin_ex_data; + obj_skin* skin; rob_chara_item_equip* item_equip; }; @@ -3676,11 +4076,11 @@ struct rob_chara_item_equip { int32_t field_A0; shadow_type_enum shadow_type; vec3 position; - int32_t eyes_adjust; + int32_t field_B4; vector_old_texture_pattern_struct texture_pattern; - aft_object_info field_D0; - int32_t field_D4; - uint8_t field_D8; + object_info field_D0; + item_id field_D4; + bool disable_update; int32_t field_DC; vec4u texture_color_coeff; float_t wet; @@ -3715,7 +4115,7 @@ struct rob_chara_item_equip { int64_t field_930; float_t step; bool use_opd; - vector_old_opd_blend_data field_940; + vector_old_opd_blend_data opd_blend_data; bool parts_short; bool parts_append; bool parts_white_one_l; @@ -3725,21 +4125,21 @@ extern void bone_data_mult_ik(bone_data* a1, int32_t a2); extern void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, bool solve_ik); extern void bone_data_mult_2(rob_chara_bone_data* a1, mat4* a2); extern void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, - int32_t motion_id, motion_blend_type blend_type); + int32_t motion_id, MotionBlendType blend_type); extern void rob_chara_bone_data_interpolate(rob_chara_bone_data* a1); extern void rob_chara_bone_data_update(rob_chara_bone_data* a1, mat4* a2); extern void rob_chara_reset_data(rob_chara* a1, rob_chara_pv_data* a2); -extern void ex_node_block_field_10(ex_node_block* node); +extern void ExNodeBlock_field_10(ExNodeBlock* node); -extern void* ex_osage_block_dispose(ex_osage_block* osg, bool dispose); -extern void ex_osage_block_init(ex_osage_block* osg); -extern void ex_osage_block_field_18(ex_osage_block* osg, int32_t a2, bool a3); -extern void ex_osage_block_field_20(ex_osage_block* osg); -extern void ex_osage_block_set_osage_play_data(ex_osage_block* osg); -extern void ex_osage_block_disp(ex_osage_block* osg); -extern void ex_osage_block_reset(ex_osage_block* osg); -extern void ex_osage_block_field_40(ex_osage_block* osg); -extern void ex_osage_block_field_48(ex_osage_block* osg); -extern void ex_osage_block_field_50(ex_osage_block* osg); -extern void ex_osage_block_field_58(ex_osage_block* osg); +extern ExOsageBlock* ExOsageBlock_dispose(ExOsageBlock* osg, bool dispose); +extern void ExOsageBlock_init(ExOsageBlock* osg); +extern void ExOsageBlock_field_18(ExOsageBlock* osg, int32_t a2, bool a3); +extern void ExOsageBlock_field_20(ExOsageBlock* osg); +extern void ExOsageBlock_set_osage_play_data(ExOsageBlock* osg); +extern void ExOsageBlock_disp(ExOsageBlock* osg); +extern void ExOsageBlock_reset(ExOsageBlock* osg); +extern void ExOsageBlock_field_40(ExOsageBlock* osg); +extern void ExOsageBlock_field_48(ExOsageBlock* osg); +extern void ExOsageBlock_field_50(ExOsageBlock* osg); +extern void ExOsageBlock_field_58(ExOsageBlock* osg); diff --git a/src/DivaGL/dllmain.c b/src/DivaGL/dllmain.cpp similarity index 89% rename from src/DivaGL/dllmain.c rename to src/DivaGL/dllmain.cpp index 330ba97a..d3cde5b4 100644 --- a/src/DivaGL/dllmain.c +++ b/src/DivaGL/dllmain.cpp @@ -3,10 +3,10 @@ GitHub/GitLab: korenkonder */ -#include "../KKdLib/default.h" -#include "inject.h" -#include "print.h" -#include "shader_table.h" +#include "../KKdLib/default.hpp" +#include "inject.hpp" +#include "print.hpp" +#include "shader_table.hpp" #include bool APIENTRY DllMain(HMODULE handle, DWORD ul_reason_for_call, LPVOID lpReserved) { diff --git a/src/DivaGL/gl.c b/src/DivaGL/gl.cpp similarity index 99% rename from src/DivaGL/gl.c rename to src/DivaGL/gl.cpp index 69ab5a0b..99ea86d1 100644 --- a/src/DivaGL/gl.c +++ b/src/DivaGL/gl.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "gl.h" +#include "gl.hpp" void (FASTCALL* _glPushMatrix)(); void (FASTCALL* _glPopMatrix)(); diff --git a/src/DivaGL/gl.h b/src/DivaGL/gl.hpp similarity index 94% rename from src/DivaGL/gl.h rename to src/DivaGL/gl.hpp index 5d7a7d87..2b630acd 100644 --- a/src/DivaGL/gl.h +++ b/src/DivaGL/gl.hpp @@ -5,9 +5,9 @@ #pragma once -#include "../KKdLib/default.h" -#include "../KKdLib/vec.h" -#include "../KKdLib/mat.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/vec.hpp" +#include "../KKdLib/mat.hpp" #include extern void (FASTCALL* _glPushMatrix)(); diff --git a/src/DivaGL/inject.c b/src/DivaGL/inject.cpp similarity index 74% rename from src/DivaGL/inject.c rename to src/DivaGL/inject.cpp index 4c20193e..d910bb2b 100644 --- a/src/DivaGL/inject.c +++ b/src/DivaGL/inject.cpp @@ -3,11 +3,11 @@ GitHub/GitLab: korenkonder */ -#include "inject.h" -#include "bone_data.h" -#include "gl.h" -#include "print.h" -#include "shader_table.h" +#include "inject.hpp" +#include "bone_data.hpp" +#include "gl.hpp" +#include "print.hpp" +#include "shader_table.hpp" #include typedef struct patch_struct { @@ -68,24 +68,24 @@ static patch_struct patch_data[] = { { (void*)0x00000001405E4B50, (uint64_t)&aft_shader_bind, }, { (void*)0x00000001401D3860, (uint64_t)&printf_proxy, }, //{ (void*)0x0000000140507210, (uint64_t)&rob_chara_reset_data, }, - //{ (void*)0x00000001401EBD30, (uint64_t)&bone_data_mult_ik, }, - //{ (void*)0x00000001401EB6D0, (uint64_t)&bone_data_mult_1, }, - //{ (void*)0x000000014041DA50, (uint64_t)&bone_data_mult_2, }, - //{ (void*)0x000000014041CF50, (uint64_t)&rob_chara_data_bone_data_motion_load, }, - //{ (void*)0x0000000140418870, (uint64_t)&rob_chara_data_bone_data_interpolate, }, - //{ (void*)0x0000000140418A60, (uint64_t)&rob_chara_data_bone_data_update, }, - { (void*)0x00000001405EEAE0, (uint64_t)&ex_osage_block_dispose, }, - { (void*)0x00000001405F3640, (uint64_t)&ex_osage_block_init, }, - { (void*)0x00000001405F39E0, (uint64_t)&ex_node_block_field_10, }, - { (void*)0x00000001405F49F0, (uint64_t)&ex_osage_block_field_18, }, - { (void*)0x00000001405F2140, (uint64_t)&ex_osage_block_field_20, }, - { (void*)0x00000001405F2470, (uint64_t)&ex_osage_block_set_osage_play_data, }, - { (void*)0x00000001405F26F0, (uint64_t)&ex_osage_block_disp, }, - { (void*)0x00000001405F2640, (uint64_t)&ex_osage_block_reset, }, - { (void*)0x00000001405F2860, (uint64_t)&ex_osage_block_field_40, }, - { (void*)0x00000001405F4640, (uint64_t)&ex_osage_block_field_48, }, - { (void*)0x00000001405F4730, (uint64_t)&ex_osage_block_field_50, }, - { (void*)0x00000001405F48F0, (uint64_t)&ex_osage_block_field_58, }, + { (void*)0x00000001401EBD30, (uint64_t)&bone_data_mult_ik, }, + { (void*)0x00000001401EB6D0, (uint64_t)&bone_data_mult_1, }, + { (void*)0x000000014041DA50, (uint64_t)&bone_data_mult_2, }, + //{ (void*)0x000000014041CF50, (uint64_t)&rob_chara_bone_data_motion_load, }, + { (void*)0x0000000140418870, (uint64_t)&rob_chara_bone_data_interpolate, }, + { (void*)0x0000000140418A60, (uint64_t)&rob_chara_bone_data_update, }, + //{ (void*)0x00000001405EEAE0, (uint64_t)&ex_osage_block_dispose, }, + //{ (void*)0x00000001405F3640, (uint64_t)&ex_osage_block_init, }, + //{ (void*)0x00000001405F39E0, (uint64_t)&ex_node_block_field_10, }, + //{ (void*)0x00000001405F49F0, (uint64_t)&ex_osage_block_field_18, }, + //{ (void*)0x00000001405F2140, (uint64_t)&ex_osage_block_field_20, }, + //{ (void*)0x00000001405F2470, (uint64_t)&ex_osage_block_set_osage_play_data, }, + //{ (void*)0x00000001405F26F0, (uint64_t)&ex_osage_block_disp, }, + //{ (void*)0x00000001405F2640, (uint64_t)&ex_osage_block_reset, }, + //{ (void*)0x00000001405F2860, (uint64_t)&ex_osage_block_field_40, }, + //{ (void*)0x00000001405F4640, (uint64_t)&ex_osage_block_field_48, }, + //{ (void*)0x00000001405F4730, (uint64_t)&ex_osage_block_field_50, }, + //{ (void*)0x00000001405F48F0, (uint64_t)&ex_osage_block_field_58, }, }; static uint64_t shader_bind_func_orig_data[6]; diff --git a/src/DivaGL/inject.h b/src/DivaGL/inject.hpp similarity index 93% rename from src/DivaGL/inject.h rename to src/DivaGL/inject.hpp index f3b16238..00c7c9e5 100644 --- a/src/DivaGL/inject.h +++ b/src/DivaGL/inject.hpp @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" extern void* inject_data(void* address, void* data, size_t count); extern uint8_t inject_uint8_t(void* address, uint8_t data); diff --git a/src/DivaGL/print.c b/src/DivaGL/print.cpp similarity index 94% rename from src/DivaGL/print.c rename to src/DivaGL/print.cpp index 9fe692fb..c3ad4f2d 100644 --- a/src/DivaGL/print.c +++ b/src/DivaGL/print.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "print.h" +#include "print.hpp" void printf_divagl(const char* fmt, ...) { char buf[0x1000]; diff --git a/src/DivaGL/print.h b/src/DivaGL/print.hpp similarity index 83% rename from src/DivaGL/print.h rename to src/DivaGL/print.hpp index 64fc74eb..cfd4939a 100644 --- a/src/DivaGL/print.h +++ b/src/DivaGL/print.hpp @@ -5,7 +5,7 @@ #pragma once -#include "../KKdLib/default.h" +#include "../KKdLib/default.hpp" extern void printf_divagl(const char* fmt, ...); extern void printf_proxy(const char* fmt, ...); diff --git a/src/DivaGL/shader_table.c b/src/DivaGL/shader_table.cpp similarity index 79% rename from src/DivaGL/shader_table.c rename to src/DivaGL/shader_table.cpp index 208b4ab7..316093e9 100644 --- a/src/DivaGL/shader_table.c +++ b/src/DivaGL/shader_table.cpp @@ -3,9 +3,84 @@ GitHub/GitLab: korenkonder */ -#include "shader_table.h" -#include "gl.h" -#include "../KKdLib/mat.h" +#include "shader_table.hpp" +#include "gl.hpp" +#include "../KKdLib/mat.hpp" + +enum uniform_name { + U_NONE = 0x00, + U01 = 0x01, + U_ALPHA_TEST = 0x02, + U_ANISO = 0x03, + U_AET_BACK = 0x04, + U_TEXTURE_BLEND = 0x05, + U_CHARA_COLOR = 0x06, + U_CLIP_PLANE = 0x07, + U08 = 0x08, + U_DEPTH_PEEL = 0x09, + U0A = 0x0A, + U0B = 0x0B, + U_ALPHA_BLEND = 0x0C, + U_RIPPLE_EMIT = 0x0D, + U_ESM_FILTER = 0x0E, + U_EXPOSURE = 0x0F, + U_SCENE_FADE = 0x10, + U_FADE = 0x11, + U12 = 0x12, + U_FLARE = 0x13, + U_FOG_HEIGHT = 0x14, + U_FOG = 0x15, + U16 = 0x16, + U_GAUSS = 0x17, + U18 = 0x18, + U_IMAGE_FILTER = 0x19, + U_INSTANCE = 0x1A, + U_TONE_CURVE = 0x1B, + U_LIGHT_PROJ = 0x1C, + U_MAGNIFY = 0x1D, + U_MEMBRANE = 0x1E, + U_MLAA = 0x1F, + U20 = 0x20, + U_MORPH_COLOR = 0x21, + U_MORPH = 0x22, + U_MOVIE = 0x23, + U24 = 0x24, + U25 = 0x25, + U26 = 0x26, + U_NPR = 0x27, + U_LIGHT_1 = 0x28, + U_REFLECT = 0x29, + U_REDUCE = 0x2A, + U_SELF_SHADOW = 0x2B, + U_SHADOW = 0x2C, + U2D = 0x2D, + U2E = 0x2E, + U_SHOW_VECTOR = 0x2F, + U_BONE_MAT = 0x30, + U_SNOW_PARTICLE = 0x31, + U_SPECULAR_IBL = 0x32, + U_SPRITE_BLEND = 0x33, + U_TEX_0_TYPE = 0x34, + U_TEX_1_TYPE = 0x35, + U_SSS_FILTER = 0x36, + U37 = 0x37, + U_STAR = 0x38, + U_TEXTURE_COUNT = 0x39, + U_ENV_MAP = 0x3A, + U_RIPPLE = 0x3B, + U_TRANSLUCENCY = 0x3C, + U_NORMAL = 0x3D, + U_TRANSPARENCY = 0x3E, + U_WATER_REFLECT = 0x3F, + U40 = 0x40, + U41 = 0x41, + U_LIGHT_0 = 0x42, + U_SPECULAR = 0x43, + U_TONE_MAP = 0x44, + U45 = 0x45, + U_MAX = 0x46, + U_INVALID = 0xFFFFFFFF, +}; typedef struct uniform_array { int32_t array[70]; diff --git a/src/DivaGL/shader_table.h b/src/DivaGL/shader_table.hpp similarity index 99% rename from src/DivaGL/shader_table.h rename to src/DivaGL/shader_table.hpp index a5d11cd7..93322eb8 100644 --- a/src/DivaGL/shader_table.h +++ b/src/DivaGL/shader_table.hpp @@ -5,8 +5,7 @@ #pragma once -#include "../KKdLib/default.h" -#include "../CRE/shared.h" +#include "../KKdLib/default.hpp" typedef enum aft_shader_sub_enum { SHADER_SUB_FFP = 0, diff --git a/src/KKdLib/string.c b/src/DivaGL/string.cpp similarity index 99% rename from src/KKdLib/string.c rename to src/DivaGL/string.cpp index 1a288294..ab58161f 100644 --- a/src/KKdLib/string.c +++ b/src/DivaGL/string.cpp @@ -3,8 +3,8 @@ GitHub/GitLab: korenkonder */ -#include "string.h" -#include "str_utils.h" +#include "string.hpp" +#include "../KKdLib/str_utils.hpp" const string string_empty = { "", diff --git a/src/KKdLib/string.h b/src/DivaGL/string.hpp similarity index 97% rename from src/KKdLib/string.h rename to src/DivaGL/string.hpp index 1689c298..3a2a5412 100644 --- a/src/KKdLib/string.h +++ b/src/DivaGL/string.hpp @@ -5,8 +5,8 @@ #pragma once -#include "default.h" -#include "vector.h" +#include "../KKdLib/default.hpp" +#include "vector.hpp" #define STRING_LENGTH (32 - sizeof(ssize_t) * 2) #define STRING_NULL_LENGTH (STRING_LENGTH - 1) diff --git a/src/KKdLib/vector.c b/src/DivaGL/vector.cpp similarity index 97% rename from src/KKdLib/vector.c rename to src/DivaGL/vector.cpp index 9ccd94fd..56882635 100644 --- a/src/KKdLib/vector.c +++ b/src/DivaGL/vector.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "vector.h" +#include "vector.hpp" vector_old_func(char) vector_old_func(wchar_t) diff --git a/src/KKdLib/vector.h b/src/DivaGL/vector.hpp similarity index 99% rename from src/KKdLib/vector.h rename to src/DivaGL/vector.hpp index 0bc1dadf..f9933c4b 100644 --- a/src/KKdLib/vector.h +++ b/src/DivaGL/vector.hpp @@ -5,7 +5,7 @@ #pragma once -#include "default.h" +#include "../KKdLib/default.hpp" #define vector_old_dispose_func(t) void(* dispose_func)(t* data) #define vector_old_empty(t) {}//(vector_old_##t){ 0, 0, 0 } diff --git a/src/KKdLib/a3da.cpp b/src/KKdLib/a3da.cpp index 8801d2eb..4db030dd 100644 --- a/src/KKdLib/a3da.cpp +++ b/src/KKdLib/a3da.cpp @@ -5,12 +5,12 @@ #include "a3da.hpp" #include "f2/struct.hpp" -#include "io/path.h" -#include "io/stream.h" -#include "half_t.h" +#include "io/path.hpp" +#include "io/stream.hpp" +#include "half_t.hpp" #include "hash.hpp" #include "key_val.hpp" -#include "str_utils.h" +#include "str_utils.hpp" #include struct a3da_vec3_header { @@ -43,58 +43,54 @@ struct a3dc_key_header { uint32_t length; }; -#define A3DA_TEXT_BUF_SIZE 0x400 - -static void a3da_read_inner(a3da* a, stream* s); -static void a3da_write_inner(a3da* a, stream* s); +static void a3da_read_inner(a3da* a, stream& s); +static void a3da_write_inner(a3da* a, stream& s); static void a3da_read_text(a3da* a, void* data, size_t size); static void a3da_write_text(a3da* a, void** data, size_t* size, bool a3dc); static void a3da_read_data(a3da* a, void* data, size_t size); static void a3da_write_data(a3da* a, void** data, size_t* size); static void a3da_get_time_stamp(char* buf, size_t buf_size); -static bool key_val_read_a3da_key(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_key* value); -static void key_val_write_a3da_key(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_key& value); -static bool key_val_read_a3da_key_raw_data(key_val* kv, char* buf, - size_t offset, a3da_key* value); -static void key_val_write_a3da_key_raw_data(stream* s, char* buf, - size_t offset, a3da_key& value); -static bool key_val_read_a3da_model_transform(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_model_transform* value); -static void key_val_write_a3da_model_transform(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_model_transform& value, int32_t write_mask); -static bool key_val_read_a3da_rgba(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_rgba* value); -static void key_val_write_a3da_rgba(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_rgba& value); -static bool key_val_read_a3da_vec3(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_vec3* value); -static void key_val_write_a3da_vec3(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_vec3& value); +static bool key_val_read(key_val* kv, + std::string&& key, a3da_key& value); +static void key_val_out_write(key_val_out* kv, stream& s, + std::string&& key, a3da_key& value); +static bool key_val_read_raw_data(key_val* kv, + a3da_key& value); +static void key_val_out_write_raw_data(key_val_out* kv, stream& s, + a3da_key& value); +static bool key_val_read(key_val* kv, + std::string&& key, a3da_model_transform& value); +static void key_val_out_write(key_val_out* kv, stream& s, + std::string&& key, a3da_model_transform& value, int32_t write_mask = 0x1F); +static bool key_val_read(key_val* kv, + std::string&& key, a3da_rgba& value); +static void key_val_out_write(key_val_out* kv, stream& s, + std::string&& key, a3da_rgba& value); +static bool key_val_read(key_val* kv, + std::string&& key, a3da_vec3& value); +static void key_val_out_write(key_val_out* kv, stream& s, + std::string&& key, a3da_vec3& value); static void a3dc_read_a3da_key(void* data, size_t size, a3da_key* value); -static void a3dc_write_a3da_key(stream* s, a3da_key& value); +static void a3dc_write_a3da_key(stream& s, a3da_key& value); static void a3dc_read_a3da_key_f16(void* data, size_t size, a3da_key* value, a3da_compress_f16 f16); -static void a3dc_write_a3da_key_f16(stream* s, a3da_key& value, a3da_compress_f16 f16); +static void a3dc_write_a3da_key_f16(stream& s, a3da_key& value, a3da_compress_f16 f16); static void a3dc_read_a3da_model_transform(void* data, size_t size, a3da_model_transform* value, a3da_compress_f16 f16); -static void a3dc_write_a3da_model_transform(stream* s, +static void a3dc_write_a3da_model_transform(stream& s, a3da_model_transform& value, a3da_compress_f16 f16); -static void a3dc_write_a3da_model_transform_offset(stream* s, +static void a3dc_write_a3da_model_transform_offset(stream& s, a3da_model_transform& value); -static void a3dc_write_a3da_model_transform_offset_data(stream* s, +static void a3dc_write_a3da_model_transform_offset_data(stream& s, a3da_model_transform& value); static void a3dc_read_a3da_rgba(void* data, size_t size, a3da_rgba* value); -static void a3dc_write_a3da_rgba(stream* s, a3da_rgba& value); +static void a3dc_write_a3da_rgba(stream& s, a3da_rgba& value); static void a3dc_read_a3da_vec3(void* data, size_t size, a3da_vec3* value); -static void a3dc_write_a3da_vec3(stream* s, a3da_vec3& value); +static void a3dc_write_a3da_vec3(stream& s, a3da_vec3& value); static void a3dc_read_a3da_vec3_f16(void* data, size_t size, a3da_vec3* value, a3da_compress_f16 f16); -static void a3dc_write_a3da_vec3_f16(stream* s, a3da_vec3& value, a3da_compress_f16 f16); +static void a3dc_write_a3da_vec3_f16(stream& s, a3da_vec3& value, a3da_compress_f16 f16); -a3da::a3da() : ready(), compressed(), format(), _compress_f16(), _file_name(), _property_version(), - _converter_version(), ambient(), auth_2d(), camera_auxiliary(), camera_root(), chara(), curve(), - dof(), event(), fog(), light(), m_object_hrc(), m_object_hrc_list(), material_list(), motion(), - object(), object_hrc(), object_hrc_list(), object_list(), play_control(), point(), post_process() { +a3da::a3da() : ready(), compressed(), format(), _compress_f16(), +_file_name(), _property_version(), _converter_version() { } @@ -109,10 +105,9 @@ void a3da::read(const char* path) { char* path_a3da = str_utils_add(path, (char*)".a3da"); if (path_check_file_exists(path_a3da)) { stream s; - io_open(&s, path_a3da, "rb"); + s.open(path_a3da, "rb"); if (s.io.stream) - a3da_read_inner(this, &s); - io_free(&s); + a3da_read_inner(this, s); } free(path_a3da); } @@ -124,10 +119,9 @@ void a3da::read(const wchar_t* path) { wchar_t* path_a3da = str_utils_add(path, (wchar_t*)L".a3da"); if (path_check_file_exists(path_a3da)) { stream s; - io_open(&s, path_a3da, L"rb"); + s.open(path_a3da, L"rb"); if (s.io.stream) - a3da_read_inner(this, &s); - io_free(&s); + a3da_read_inner(this, s); } free(path_a3da); } @@ -137,9 +131,8 @@ void a3da::read(const void* data, size_t size) { return; stream s; - io_open(&s, data, size); - a3da_read_inner(this, &s); - io_free(&s); + s.open(data, size); + a3da_read_inner(this, s); } void a3da::write(const char* path) { @@ -148,10 +141,9 @@ void a3da::write(const char* path) { char* path_a3da = str_utils_add(path, ".a3da"); stream s; - io_open(&s, path_a3da, "wb"); + s.open(path_a3da, "wb"); if (s.io.stream) - a3da_write_inner(this, &s); - io_free(&s); + a3da_write_inner(this, s); free(path_a3da); } @@ -161,10 +153,9 @@ void a3da::write(const wchar_t* path) { wchar_t* path_a3da = str_utils_add(path, L".a3da"); stream s; - io_open(&s, path_a3da, L"wb"); + s.open(path_a3da, L"wb"); if (s.io.stream) - a3da_write_inner(this, &s); - io_free(&s); + a3da_write_inner(this, s); free(path_a3da); } @@ -173,10 +164,9 @@ void a3da::write(void** data, size_t* size) { return; stream s; - io_open(&s); - a3da_write_inner(this, &s); - io_copy(&s, data, size); - io_free(&s); + s.open(); + a3da_write_inner(this, s); + s.copy(data, size); } bool a3da::load_file(void* data, const char* path, const char* file, uint32_t hash) { @@ -396,88 +386,85 @@ a3da_post_process::~a3da_post_process() { } -static void a3da_read_inner(a3da* a, stream* s) { +static void a3da_read_inner(a3da* a, stream& s) { a3dc_header header; memset(&header, 0, sizeof(a3dc_header)); a->format = A3DA_FORMAT_F; - uint32_t signature = io_read_uint32_t(s); - io_set_position(s, 0x00, SEEK_SET); + uint32_t signature = s.read_uint32_t(); + s.set_position(0x00, SEEK_SET); stream _s; if (signature == reverse_endianness_int32_t('A3DA')) { f2_struct st; st.read(s); - io_open(&_s, &st.data); + _s.open(st.data); a->format = A3DA_FORMAT_F2; } else { - size_t length = s->length; + size_t length = s.length; void* data = force_malloc(length); - io_read(s, data, length); - io_open(&_s, data, length); + s.read(data, length); + _s.open(data, length); free(data); } void* a3da_data; - signature = io_read_uint32_t(&_s); + signature = _s.read_uint32_t(); if (signature != reverse_endianness_int32_t('#A3D')) - goto End; + return; - signature = io_read_uint32_t(&_s); + signature = _s.read_uint32_t(); if ((signature & 0xFF) == 'A') { header.string_offset = 0x10; header.string_length = (int32_t)(_s.length - 0x10); } else if ((signature & 0xFF) == 'C') { - io_set_position(&_s, 0x10, SEEK_SET); - io_read_int32_t(&_s); - io_read_int32_t(&_s); - uint32_t sub_headers_offset = io_read_uint32_t_reverse_endianness(&_s, true); - uint16_t sub_headers_count = io_read_uint16_t_reverse_endianness(&_s, true); - uint16_t sub_headers_stride = io_read_uint16_t_reverse_endianness(&_s, true); + _s.set_position(0x10, SEEK_SET); + _s.read_int32_t(); + _s.read_int32_t(); + uint32_t sub_headers_offset = _s.read_uint32_t_reverse_endianness(true); + uint16_t sub_headers_count = _s.read_uint16_t_reverse_endianness(true); + uint16_t sub_headers_stride = _s.read_uint16_t_reverse_endianness(true); if (sub_headers_count != 0x02) - goto End; + return; - io_set_position(&_s, sub_headers_offset, SEEK_SET); - if (io_read_int32_t(&_s) != 0x50) - goto End; - header.string_offset = io_read_uint32_t_reverse_endianness(&_s, true); - header.string_length = io_read_uint32_t_reverse_endianness(&_s, true); + _s.set_position(sub_headers_offset, SEEK_SET); + if (_s.read_int32_t() != 0x50) + return; + header.string_offset = _s.read_uint32_t_reverse_endianness(true); + header.string_length = _s.read_uint32_t_reverse_endianness(true); - io_set_position(&_s, (int64_t)sub_headers_offset + sub_headers_stride, SEEK_SET); - if (io_read_int32_t(&_s) != 0x4C42) - goto End; - header.binary_offset = io_read_uint32_t_reverse_endianness(&_s, true); - header.binary_length = io_read_uint32_t_reverse_endianness(&_s, true); + _s.set_position((int64_t)sub_headers_offset + sub_headers_stride, SEEK_SET); + if (_s.read_int32_t() != 0x4C42) + return; + header.binary_offset = _s.read_uint32_t_reverse_endianness(true); + header.binary_length = _s.read_uint32_t_reverse_endianness(true); } else - goto End; + return; - io_set_position(&_s, header.string_offset, SEEK_SET); + _s.set_position(header.string_offset, SEEK_SET); a3da_data = force_malloc(header.string_length + 1LL); - io_read(&_s, a3da_data, header.string_length); + _s.read(a3da_data, header.string_length); ((uint8_t*)a3da_data)[header.string_length] = 0; a3da_read_text(a, a3da_data, header.string_length); free(a3da_data); if (signature == reverse_endianness_int32_t('C___')) { a->compressed = true; - io_set_position(&_s, header.binary_offset, SEEK_SET); + _s.set_position(header.binary_offset, SEEK_SET); void* a3dc_data = force_malloc(header.binary_length); - io_read(&_s, a3dc_data, header.binary_length); + _s.read(a3dc_data, header.binary_length); a3da_read_data(a, a3dc_data, header.binary_length); free(a3dc_data); } a->ready = true; - -End: - io_free(&_s); } -static void a3da_write_inner(a3da* a, stream* s) { +static void a3da_write_inner(a3da* a, stream& s) { bool a3dc = a->compressed || a->format > A3DA_FORMAT_AFT; void* a3dc_data = 0; @@ -490,10 +477,10 @@ static void a3da_write_inner(a3da* a, stream* s) { a3da_write_text(a, &a3da_data, &a3da_data_length, a3dc); stream s_a3da; - stream* _s = s; + stream& _s = s; if (a->format > A3DA_FORMAT_AFT) { - io_open(&s_a3da); - _s = &s_a3da; + s_a3da.open(); + _s = s_a3da; } if (a3dc) { @@ -505,37 +492,37 @@ static void a3da_write_inner(a3da* a, stream* s) { header.binary_offset = (uint32_t)(0x40 + align_val(a3da_data_length, 0x20)); header.binary_length = (uint32_t)a3dc_data_length; - io_write(_s, "#A3DC__________\n", 16); - io_write_int32_t(_s, 0x2000); - io_write_int32_t(_s, 0x00); - io_write_uint32_t_reverse_endianness(_s, 0x20, true); - io_write_uint16_t_reverse_endianness(_s, 0x02, true); - io_write_uint16_t_reverse_endianness(_s, 0x10, true); - io_write_char(_s, 'P'); - io_align_write(_s, 0x04); - io_write_uint32_t_reverse_endianness(_s, header.string_offset, true); - io_write_uint32_t_reverse_endianness(_s, header.string_length, true); - io_write_uint32_t_reverse_endianness(_s, 0x01, true); - io_write_char(_s, 'B'); - io_write_char(_s, 'L'); - io_align_write(_s, 0x04); - io_write_uint32_t_reverse_endianness(_s, header.binary_offset, true); - io_write_uint32_t_reverse_endianness(_s, header.binary_length, true); - io_write_uint32_t_reverse_endianness(_s, 0x20, true); - io_write(_s, a3da_data, a3da_data_length); - io_align_write(_s, 0x20); - io_write(_s, a3dc_data, a3dc_data_length); + _s.write("#A3DC__________\n", 16); + _s.write_int32_t(0x2000); + _s.write_int32_t(0x00); + _s.write_uint32_t_reverse_endianness(0x20, true); + _s.write_uint16_t_reverse_endianness(0x02, true); + _s.write_uint16_t_reverse_endianness(0x10, true); + _s.write_char('P'); + _s.align_write(0x04); + _s.write_uint32_t_reverse_endianness(header.string_offset, true); + _s.write_uint32_t_reverse_endianness(header.string_length, true); + _s.write_uint32_t_reverse_endianness(0x01, true); + _s.write_char('B'); + _s.write_char('L'); + _s.align_write(0x04); + _s.write_uint32_t_reverse_endianness(header.binary_offset, true); + _s.write_uint32_t_reverse_endianness(header.binary_length, true); + _s.write_uint32_t_reverse_endianness(0x20, true); + _s.write(a3da_data, a3da_data_length); + _s.align_write(0x20); + _s.write(a3dc_data, a3dc_data_length); free(a3dc_data); } else - io_write(_s, a3da_data, a3da_data_length); + _s.write(a3da_data, a3da_data_length); free(a3da_data); if (a->format > A3DA_FORMAT_AFT) { f2_struct st; - io_align_write(&s_a3da, 0x10); - io_copy(&s_a3da, &st.data); - io_free(&s_a3da); + s_a3da.align_write(0x10); + s_a3da.copy(st.data); + s_a3da.close(); st.header.signature = reverse_endianness_uint32_t('A3DA'); st.header.length = 0x40; @@ -548,1112 +535,865 @@ static void a3da_write_inner(a3da* a, stream* s) { } static void a3da_read_text(a3da* a, void* data, size_t size) { - char buf[A3DA_TEXT_BUF_SIZE]; - int32_t count; - int32_t count1; - size_t len; - size_t len1; - size_t len2; - size_t len3; - size_t off; - key_val kv; kv.parse((uint8_t*)data, size); - key_val lkv; - if (kv.get_local_key_val("_", &lkv)) { - len = 1; - memcpy(buf, "_", 1); - off = len; - lkv.read_int32_t( - buf, off, ".compress_f16", 14, (int32_t*)&a->_compress_f16); - lkv.read_string( - buf, off, ".converter.version", 19, &a->_converter_version); - lkv.read_string( - buf, off, ".file_name", 11, &a->_file_name); - lkv.read_string( - buf, off, ".property.version", 19, &a->_property_version); + if (kv.open_scope("_")) { + int32_t compress_f16; + if (kv.read("compress_f16", compress_f16)) + a->_compress_f16 = (a3da_compress_f16)compress_f16; + kv.read("converter.version", a->_converter_version); + kv.read("file_name", a->_file_name); + kv.read("property.version", a->_property_version); + + kv.close_scope(); } - if (kv.get_local_key_val("camera_auxiliary", &lkv)) { + if (kv.open_scope("camera_auxiliary")) { a3da_camera_auxiliary* ca = &a->camera_auxiliary; - len = 16; - memcpy(buf, "camera_auxiliary", 16); - off = len; - - if (key_val_read_a3da_key(&lkv, - buf, off, ".auto_exposure", 15, &ca->auto_exposure)) + if (key_val_read(&kv, "auto_exposure", ca->auto_exposure)) enum_or(ca->flags, A3DA_CAMERA_AUXILIARY_AUTO_EXPOSURE); - if (key_val_read_a3da_key(&lkv, - buf, off, ".exposure", 10, &ca->exposure)) + if (key_val_read(&kv, "exposure", ca->exposure)) enum_or(ca->flags, A3DA_CAMERA_AUXILIARY_EXPOSURE); - if (key_val_read_a3da_key(&lkv, - buf, off, ".exposure_rate", 15, &ca->exposure_rate)) + if (key_val_read(&kv, "exposure_rate", ca->exposure_rate)) enum_or(ca->flags, A3DA_CAMERA_AUXILIARY_EXPOSURE_RATE); - if (key_val_read_a3da_key(&lkv, - buf, off, ".gamma", 7, &ca->gamma)) + if (key_val_read(&kv, "gamma", ca->gamma)) enum_or(ca->flags, A3DA_CAMERA_AUXILIARY_GAMMA); - if (key_val_read_a3da_key(&lkv, - buf, off, ".gamma_rate", 12, &ca->gamma_rate)) + if (key_val_read(&kv, "gamma_rate", ca->gamma_rate)) enum_or(ca->flags, A3DA_CAMERA_AUXILIARY_GAMMA_RATE); - if (key_val_read_a3da_key(&lkv, - buf, off, ".saturate", 10, &ca->saturate)) + if (key_val_read(&kv, "saturate", ca->saturate)) enum_or(ca->flags, A3DA_CAMERA_AUXILIARY_SATURATE); if (ca->flags & (A3DA_CAMERA_AUXILIARY_EXPOSURE_RATE | A3DA_CAMERA_AUXILIARY_GAMMA_RATE)) if (a->format < A3DA_FORMAT_F || a->format == A3DA_FORMAT_AFT) a->format = A3DA_FORMAT_F; + + kv.close_scope(); } - if (kv.get_local_key_val("play_control", &lkv)) { + if (kv.open_scope("play_control")) { a3da_play_control* pc = &a->play_control; - len = 12; - memcpy(buf, "play_control", 12); - off = len; - - lkv.read_float_t( - buf, off, ".begin", 7, &pc->begin); - if (lkv.read_int32_t( - buf, off, ".div", 5, &pc->div)) + kv.read("begin", pc->begin); + if (kv.read("div", pc->div)) enum_or(pc->flags, A3DA_PLAY_CONTROL_DIV); - lkv.read_float_t( - buf, off, ".fps", 5, &pc->fps); - if (lkv.read_float_t( - buf, off, ".offset", 8, &pc->offset)) + kv.read("fps", pc->fps); + if (kv.read("offset", pc->offset)) enum_or(pc->flags, A3DA_PLAY_CONTROL_OFFSET); - lkv.read_float_t( - buf, off, ".size", 6, &pc->size); + kv.read("size", pc->size); + + kv.close_scope(); } - if (kv.get_local_key_val("post_process", &lkv)) { + if (kv.open_scope("post_process")) { a3da_post_process* pp = &a->post_process; - len = 12; - memcpy(buf, "post_process", 12); - off = len; - - if (key_val_read_a3da_rgba(&lkv, - buf, off, ".Diffuse", 9, &pp->intensity)) + if (key_val_read(&kv, "Diffuse", pp->intensity)) enum_or(pp->flags, A3DA_POST_PROCESS_INTENSITY); - if (key_val_read_a3da_key(&lkv, - buf, off, ".lens_flare", 12, &pp->lens_flare)) + if (key_val_read(&kv, "lens_flare", pp->lens_flare)) enum_or(pp->flags, A3DA_POST_PROCESS_LENS_FLARE); - if (key_val_read_a3da_key(&lkv, - buf, off, ".lens_ghost", 12, &pp->lens_ghost)) + if (key_val_read(&kv, "lens_ghost", pp->lens_ghost)) enum_or(pp->flags, A3DA_POST_PROCESS_LENS_GHOST); - if (key_val_read_a3da_key(&lkv, - buf, off, ".lens_shaft", 12, &pp->lens_shaft)) + if (key_val_read(&kv, "lens_shaft", pp->lens_shaft)) enum_or(pp->flags, A3DA_POST_PROCESS_LENS_SHAFT); - if (key_val_read_a3da_rgba(&lkv, - buf, off, ".Ambient", 9, &pp->radius)) + if (key_val_read(&kv, "Ambient", pp->radius)) enum_or(pp->flags, A3DA_POST_PROCESS_RADIUS); - if (key_val_read_a3da_rgba(&lkv, - buf, off, ".Specular", 10, &pp->scene_fade)) + if (key_val_read(&kv, "Specular", pp->scene_fade)) enum_or(pp->flags, A3DA_POST_PROCESS_SCENE_FADE); + + kv.close_scope(); } - if (kv.get_local_key_val("dof", &lkv)) { + if (kv.open_scope("dof")) { a3da_dof* d = &a->dof; - len = 3; - memcpy(buf, "dof", 3); - off = len; + d->has_dof = key_val_read(&kv, "", d->model_transform); - d->has_dof = key_val_read_a3da_model_transform(&lkv, - buf, off, "", 1, &d->model_transform); + kv.close_scope(); } - len = 7; - memcpy(buf, "ambient", 7); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("ambient", &lkv)) { + int32_t count; + if (kv.read("ambient", "length", count)) { std::vector& va = a->ambient; va.resize(count); for (int32_t i = 0; i < count; i++) { - a3da_ambient* a = &va[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - if (key_val_read_a3da_rgba(&lkv, - buf, off, ".light.Diffuse", 15, &a->light_diffuse)) + a3da_ambient* a = &va[i]; + if (key_val_read(&kv, "light.Diffuse", a->light_diffuse)) enum_or(a->flags, A3DA_AMBIENT_LIGHT_DIFFUSE); - lkv.read_string( - buf, off, ".name", 6, &a->name); - if (key_val_read_a3da_rgba(&lkv, - buf, off, ".rim.light.Diffuse", 19, &a->rim_light_diffuse)) + kv.read("name", a->name); + if (key_val_read(&kv, "rim.light.Diffuse", a->rim_light_diffuse)) enum_or(a->flags, A3DA_AMBIENT_RIM_LIGHT_DIFFUSE); + + kv.close_scope(); } + kv.close_scope(); } - len = 7; - memcpy(buf, "auth_2d", 7); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("auth_2d", &lkv)) { + if (kv.read("auth_2d", "length", count)) { std::vector& va2 = a->auth_2d; va2.resize(count); for (int32_t i = 0; i < count; i++) { - std::string* a2 = &va2[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - lkv.read_string( - buf, off, ".name", 6, a2); + kv.read(va2[i]); + kv.close_scope(); } + kv.close_scope(); } - len = 11; - memcpy(buf, "camera_root", 11); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("camera_root", &lkv)) { + if (kv.read("camera_root", "length", count)) { std::vector& vcr = a->camera_root; vcr.resize(count); for (int32_t i = 0; i < count; i++) { - a3da_camera_root* cr = &vcr[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - key_val_read_a3da_model_transform(&lkv, - buf, off, ".interest", 10, &cr->interest); - key_val_read_a3da_model_transform(&lkv, - buf, off, "", 1, &cr->model_transform); + a3da_camera_root* cr = &vcr[i]; + key_val_read(&kv, "interest", cr->interest); + key_val_read(&kv, "", cr->model_transform); a3da_camera_root_view_point* vp = &cr->view_point; - len2 = 11; - memcpy(buf + len + len1, ".view_point", 11); - off = len + len1 + len2; + if (!kv.open_scope("view_point")) { + kv.close_scope(); + continue; + } - lkv.read_float_t( - buf, off, ".aspect", 8, &vp->aspect); + kv.read("aspect", vp->aspect); - memcpy(buf + len + len1 + len2, ".fov_is_horizontal", 19); - if (lkv.has_key(buf)) { - key_val_read_a3da_key(&lkv, - buf, off, ".fov", 5, &vp->fov); - lkv.read_bool( - buf, off, ".fov_is_horizontal", 19, &vp->fov_is_horizontal); + if (kv.has_key("fov_is_horizontal")) { + key_val_read(&kv, "fov", vp->fov); + kv.read("fov_is_horizontal", vp->fov_is_horizontal); enum_or(vp->flags, A3DA_CAMERA_ROOT_VIEW_POINT_FOV); } else { - lkv.read_float_t( - buf, off, ".camera_aperture_h", 19, &vp->camera_aperture_h); - lkv.read_float_t( - buf, off, ".camera_aperture_w", 19, &vp->camera_aperture_w); - key_val_read_a3da_key(&lkv, - buf, off, ".focal_length", 14, &vp->focal_length); + kv.read("camera_aperture_h", vp->camera_aperture_h); + kv.read("camera_aperture_w", vp->camera_aperture_w); + key_val_read(&kv, "focal_length", vp->focal_length); } - key_val_read_a3da_model_transform(&lkv, - buf, off, "", 1, &vp->model_transform); - if (key_val_read_a3da_key(&lkv, - buf, off, ".roll", 6, &vp->roll)) + key_val_read(&kv, "", vp->model_transform); + if (key_val_read(&kv, "roll", vp->roll)) enum_or(vp->flags, A3DA_CAMERA_ROOT_VIEW_POINT_ROLL); + + kv.close_scope(); + kv.close_scope(); } + kv.close_scope(); } - len = 5; - memcpy(buf, "chara", 5); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("chara", &lkv)) { + if (kv.read("chara", "length", count)) { std::vector& vc = a->chara; vc.resize(count); for (int32_t i = 0; i < count; i++) { - a3da_chara* c = &vc[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - key_val_read_a3da_model_transform(&lkv, - buf, off, "", 1, &c->model_transform); - lkv.read_string( - buf, off, ".name", 6, &c->name); + a3da_chara* c = &vc[i]; + key_val_read(&kv, "", c->model_transform); + kv.read("name", c->name); + + kv.close_scope(); } + kv.close_scope(); } - len = 5; - memcpy(buf, "curve", 5); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("curve", &lkv)) { + if (kv.read("curve", "length", count)) { std::vector& vc = a->curve; vc.resize(count); for (int32_t i = 0; i < count; i++) { - a3da_curve* c = &vc[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - key_val_read_a3da_key(&lkv, - buf, off, ".cv", 4, &c->curve); - lkv.read_string( - buf, off, ".name", 6, &c->name); + a3da_curve* c = &vc[i]; + key_val_read(&kv, "cv", c->curve); + kv.read("name", c->name); + + kv.close_scope(); } + kv.close_scope(); } - len = 5; - memcpy(buf, "event", 5); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("event", &lkv)) { + if (kv.read("event", "length", count)) { std::vector& ve = a->event; ve.resize(count); for (int32_t i = 0; i < count; i++) { - a3da_event* e = &ve[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - lkv.read_float_t( - buf, off, ".begin", 7, &e->begin); - lkv.read_float_t( - buf, off, ".clip_begin", 12, &e->clip_begin); - lkv.read_float_t( - buf, off, ".clip_end", 10, &e->clip_end); - lkv.read_float_t( - buf, off, ".end", 5, &e->end); - lkv.read_string( - buf, off, ".name", 6, &e->name); - lkv.read_string( - buf, off, ".param1", 8, &e->param_1); - lkv.read_string( - buf, off, ".ref", 5, &e->ref); - lkv.read_float_t( - buf, off, ".time_ref_scale", 16, &e->time_ref_scale); - lkv.read_int32_t( - buf, off, ".type", 6, (int32_t*)&e->type); + a3da_event* e = &ve[i]; + kv.read("begin", e->begin); + kv.read("clip_begin", e->clip_begin); + kv.read("clip_end", e->clip_end); + kv.read("end", e->end); + kv.read("name", e->name); + kv.read("param1", e->param_1); + kv.read("ref", e->ref); + kv.read("time_ref_scale", e->time_ref_scale); + + int32_t type = 0; + if (kv.read("type", type)) + e->type = (a3da_event_type)type; + + kv.close_scope(); } + kv.close_scope(); } - len = 3; - memcpy(buf, "fog", 3); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("fog", &lkv)) { + if (kv.read("fog", "length", count)) { std::vector& vf = a->fog; vf.resize(count); for (int32_t i = 0; i < count; i++) { - a3da_fog* f = &vf[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - if (key_val_read_a3da_rgba(&lkv, - buf, off, ".Diffuse", 9, &f->color)) + a3da_fog* f = &vf[i]; + if (key_val_read(&kv, "Diffuse", f->color)) enum_or(f->flags, A3DA_FOG_COLOR); - if (key_val_read_a3da_key(&lkv, - buf, off, ".density", 9, &f->density)) + if (key_val_read(&kv, "density", f->density)) enum_or(f->flags, A3DA_FOG_DENSITY); - if (key_val_read_a3da_key(&lkv, - buf, off, ".end", 5, &f->end)) + if (key_val_read(&kv, "end", f->end)) enum_or(f->flags, A3DA_FOG_END); - lkv.read_int32_t( - buf, off, ".id", 4, (int32_t*)&f->id); + + int32_t id; + if (kv.read("id", id)) + f->id = (fog_id)id; + std::string name; - if (lkv.read_string( - buf, off, ".name", 7, &name)) { - if (str_utils_compare(name.c_str(), "Z")) + if (kv.read("name", name)) { + if (!name.compare("Z")) f->id = FOG_DEPTH; - else if (str_utils_compare(name.c_str(), "Height")) + else if (!name.compare("Height")) f->id = FOG_HEIGHT; } - if (key_val_read_a3da_key(&lkv, - buf, off, ".start", 7, &f->start)) + + if (key_val_read(&kv, "start", f->start)) enum_or(f->flags, A3DA_FOG_START); + + kv.close_scope(); } + kv.close_scope(); } - len = 5; - memcpy(buf, "light", 5); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("light", &lkv)) { + if (kv.read("light", "length", count)) { std::vector& vl = a->light; vl.resize(count); for (int32_t i = 0; i < count; i++) { - a3da_light* l = &vl[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - if (key_val_read_a3da_rgba(&lkv, - buf, off, ".Ambient", 9, &l->ambient)) + a3da_light* l = &vl[i]; + if (key_val_read(&kv, "Ambient", l->ambient)) enum_or(l->flags, A3DA_LIGHT_AMBIENT); - if (key_val_read_a3da_key(&lkv, - buf, off, ".ConeAngle", 11, &l->cone_angle)) + if (key_val_read(&kv, "ConeAngle", l->cone_angle)) enum_or(l->flags, A3DA_LIGHT_CONE_ANGLE); - if (key_val_read_a3da_key(&lkv, - buf, off, ".CONSTANT", 10, &l->constant)) + if (key_val_read(&kv, "CONSTANT", l->constant)) enum_or(l->flags, A3DA_LIGHT_CONSTANT); - if (key_val_read_a3da_rgba(&lkv, - buf, off, ".Diffuse", 9, &l->diffuse)) + if (key_val_read(&kv, "Diffuse", l->diffuse)) enum_or(l->flags, A3DA_LIGHT_DIFFUSE); - if (key_val_read_a3da_key(&lkv, - buf, off, ".DropOff", 9, &l->drop_off)) + if (key_val_read(&kv, "DropOff", l->drop_off)) enum_or(l->flags, A3DA_LIGHT_DROP_OFF); - if (key_val_read_a3da_key(&lkv, - buf, off, ".FAR", 5, &l->_far)) + if (key_val_read(&kv, "FAR", l->_far)) enum_or(l->flags, A3DA_LIGHT_FAR); - lkv.read_int32_t( - buf, off, ".id", 4, (int32_t*)&l->id); - if (key_val_read_a3da_key(&lkv, - buf, off, ".Intensity", 11, &l->intensity)) + + int32_t id = 0; + if (kv.read("id", id)) + l->id = (light_id)id; + + if (key_val_read(&kv, "Intensity", l->intensity)) enum_or(l->flags, A3DA_LIGHT_INTENSITY); - if (key_val_read_a3da_key(&lkv, - buf, off, ".LINEAR", 8, &l->linear)) + if (key_val_read(&kv, "LINEAR", l->linear)) enum_or(l->flags, A3DA_LIGHT_LINEAR); - if (key_val_read_a3da_model_transform(&lkv, - buf, off, ".position", 10, &l->position)) + if (key_val_read(&kv, "position", l->position)) enum_or(l->flags, A3DA_LIGHT_POSITION); - if (key_val_read_a3da_key(&lkv, - buf, off, ".QUADRATIC", 11, &l->quadratic)) + if (key_val_read(&kv, "QUADRATIC", l->quadratic)) enum_or(l->flags, A3DA_LIGHT_QUADRATIC); - if (key_val_read_a3da_rgba(&lkv, - buf, off, ".Specular", 10, &l->specular)) + if (key_val_read(&kv, "Specular", l->specular)) enum_or(l->flags, A3DA_LIGHT_SPECULAR); - if (key_val_read_a3da_model_transform(&lkv, - buf, off, ".spot_direction", 16, &l->spot_direction)) + if (key_val_read(&kv, "spot_direction", l->spot_direction)) enum_or(l->flags, A3DA_LIGHT_SPOT_DIRECTION); - if (key_val_read_a3da_rgba(&lkv, - buf, off, ".Incandescence", 15, &l->tone_curve)) + if (key_val_read(&kv, "Incandescence", l->tone_curve)) enum_or(l->flags, A3DA_LIGHT_TONE_CURVE); - lkv.read_string( - buf, off, ".type", 6, &l->type); + kv.read("type", l->type); + + kv.close_scope(); } + kv.close_scope(); } - len = 8; - memcpy(buf, "m_objhrc", 8); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("m_objhrc", &lkv)) { + if (kv.read("m_objhrc", "length", count)) { std::vector& vmoh = a->m_object_hrc; vmoh.resize(count); for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope(i)) + continue; + a3da_m_object_hrc* moh = &vmoh[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; - - len2 = 9; - memcpy(buf + len + len1, ".instance", 9); - off = len + len1 + len2; - - buf[off] = 0; - key_val sub_local_key_val; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sub_local_key_val) ) { + int32_t count; + if (kv.read("instance", "length", count)) { std::vector& voi = moh->instance; - voi.resize(count1); - for (int32_t j = 0; j < count1; j++) { + voi.resize(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) + continue; + a3da_object_instance* oi = &voi[j]; - len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); - off = len + len1 + len2 + len3; + key_val_read(&kv, "", oi->model_transform); + kv.read("name", oi->name); + kv.read("shadow", oi->shadow); + kv.read("uid_name", oi->uid_name); - key_val_read_a3da_model_transform(&sub_local_key_val, - buf, off, "", 1, &oi->model_transform); - sub_local_key_val.read_string( - buf, off, ".name", 6, &oi->name); - sub_local_key_val.read_bool( - buf, off, ".shadow", 8, &oi->shadow); - sub_local_key_val.read_string( - buf, off, ".uid_name", 10, &oi->uid_name); + kv.close_scope(); } + kv.close_scope(); } - off = len + len1; - key_val_read_a3da_model_transform(&lkv, - buf, off, "", 1, &moh->model_transform); - lkv.read_string( - buf, off, ".name", 6, &moh->name); + key_val_read(&kv, "", moh->model_transform); + kv.read("name", moh->name); - len2 = 5; - memcpy(buf + len + len1, ".node", 5); - off = len + len1 + len2; + if (kv.read("node", "length", count)) { + std::vector& von = moh->node; - buf[off] = 0; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { - std::vector& vmohn = moh->node; + von.resize(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) + continue; - vmohn.resize(count1); - for (int32_t j = 0; j < count1; j++) { - a3da_object_node* mohn = &vmohn[j]; - len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); - off = len + len1 + len2 + len3; + a3da_object_node* on = &von[j]; + if (kv.read("joint_orient", on->joint_orient)) + enum_or(on->flags, A3DA_OBJECT_NODE_JOINT_ORIENT); + key_val_read(&kv, "", on->model_transform); + kv.read("name", on->name); + kv.read("parent", on->parent); - if (sub_local_key_val.read_vec3( - buf, off, ".joint_orient", 14, &mohn->joint_orient)) - enum_or(mohn->flags, A3DA_OBJECT_NODE_JOINT_ORIENT); - key_val_read_a3da_model_transform(&sub_local_key_val, - buf, off, "", 1, &mohn->model_transform); - sub_local_key_val.read_string( - buf, off, ".name", 6, &mohn->name); - sub_local_key_val.read_int32_t( - buf, off, ".parent", 8, &mohn->parent); + kv.close_scope(); } + kv.close_scope(); } + + kv.close_scope(); } + kv.close_scope(); } - len = 13; - memcpy(buf, "m_objhrc_list", 13); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("m_objhrc_list", &lkv)) { + if (kv.read("m_objhrc_list", "length", count)) { std::vector& vmohl = a->m_object_hrc_list; vmohl.resize(count); for (int32_t i = 0; i < count; i++) { - std::string* mohl = &vmohl[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - lkv.read_string( - buf, off, "", 1, mohl); + kv.read(vmohl[i]); + kv.close_scope(); } + kv.close_scope(); } - len = 13; - memcpy(buf, "material_list", 13); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("material_list", &lkv)) { + if (kv.read("material_list", "length", count)) { std::vector& vml = a->material_list; vml.resize(count); for (int32_t i = 0; i < count; i++) { - a3da_material_list* ml = &vml[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - if (key_val_read_a3da_rgba(&lkv, - buf, off, ".blend_color", 13, &ml->blend_color)) + a3da_material_list* ml = &vml[i]; + if (key_val_read(&kv, "blend_color", ml->blend_color)) enum_or(ml->flags, A3DA_MATERIAL_LIST_BLEND_COLOR); - if (key_val_read_a3da_key(&lkv, - buf, off, ".glow_intensity", 16, &ml->glow_intensity)) + if (key_val_read(&kv, "glow_intensity", ml->glow_intensity)) enum_or(ml->flags, A3DA_MATERIAL_LIST_GLOW_INTENSITY); - if (key_val_read_a3da_rgba(&lkv, - buf, off, ".incandescence", 15, &ml->incandescence)) + if (key_val_read(&kv, "incandescence", ml->incandescence)) enum_or(ml->flags, A3DA_MATERIAL_LIST_INCANDESCENCE); - lkv.read_string( - buf, off, ".name", 6, &ml->name); + kv.read("name", ml->name); + + kv.close_scope(); } + kv.close_scope(); } - len = 6; - memcpy(buf, "motion", 6); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("motion", &lkv)) { + if (kv.read("motion", "length", count)) { std::vector& vm = a->motion; vm.resize(count); for (int32_t i = 0; i < count; i++) { - std::string* m = &vm[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - lkv.read_string( - buf, off, "", 1, m); + kv.read(vm[i]); + kv.close_scope(); } + kv.close_scope(); } - len = 6; - memcpy(buf, "object", 6); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("object", &lkv)) { + if (kv.read("object", "length", count)) { std::vector& vo = a->object; vo.resize(count); for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope(i)) + continue; + a3da_object* o = &vo[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + key_val_read(&kv, "", o->model_transform); + if (kv.read("morph", o->morph)) + kv.read("morph_offset", o->morph_offset); + kv.read("name", o->name); + kv.read("parent_name", o->parent_name); + kv.read("parent_node", o->parent_node); + if (kv.read("pat", o->pattern)) + kv.read("pat_offset", o->pattern_offset); - key_val_read_a3da_model_transform(&lkv, - buf, off, "", 1, &o->model_transform); - if (lkv.read_string( - buf, off, ".morph", 7, &o->morph)) - lkv.read_float_t( - buf, off, ".morph_offset", 14, &o->morph_offset); - lkv.read_string( - buf, off, ".name", 6, &o->name); - lkv.read_string( - buf, off, ".parent_name", 13, &o->parent_name); - lkv.read_string( - buf, off, ".parent_node", 13, &o->parent_node); - if (lkv.read_string( - buf, off, ".pat", 5, &o->pattern)) - lkv.read_float_t( - buf, off, ".pat_offset", 12, &o->pattern_offset); - - len2 = 8; - memcpy(buf + len + len1, ".tex_pat", 8); - off = len + len1 + len2; - - buf[off] = 0; - key_val sub_local_key_val; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { + int32_t count; + if (kv.read("tex_pat", "length", count)) { std::vector& votp = o->texture_pattern; - votp.resize(count1); - for (int32_t j = 0; j < count1; j++) { - a3da_object_texture_pattern* otp = &votp[j]; - len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); - off = len + len1 + len2 + len3; + votp.resize(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) + continue; - sub_local_key_val.read_string( - buf, off, ".name", 6, &otp->name); - if (sub_local_key_val.read_string( - buf, off, ".pat", 5, &otp->pattern)) - sub_local_key_val.read_float_t( - buf, off, ".pat_offset", 12, &otp->pattern_offset); + a3da_object_texture_pattern* otp = &votp[j]; + kv.read("name", otp->name); + if (kv.read("pat", otp->pattern)) + kv.read("pat_offset", otp->pattern_offset); + + kv.close_scope(); } + kv.close_scope(); } - len2 = 14; - memcpy(buf + len + len1, ".tex_transform", 14); - off = len + len1 + len2; - - buf[off] = 0; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { + if (kv.read("tex_transform", "length", count)) { std::vector& vott = o->texture_transform; - vott.resize(count1); - for (int32_t j = 0; j < count1; j++) { + vott.resize(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) + continue; + a3da_object_texture_transform* ott = &vott[j]; - len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); - off = len + len1 + len2 + len3; - - if (key_val_read_a3da_key(&sub_local_key_val, - buf, off, ".coverageU", 11, &ott->coverage_u)) + if (key_val_read(&kv, "coverageU", ott->coverage_u)) enum_or(ott->flags, A3DA_OBJECT_TEXTURE_TRANSFORM_COVERAGE_U); - if (key_val_read_a3da_key(&sub_local_key_val, - buf, off, ".coverageV", 11, &ott->coverage_v)) + if (key_val_read(&kv, "coverageV", ott->coverage_v)) enum_or(ott->flags, A3DA_OBJECT_TEXTURE_TRANSFORM_COVERAGE_V); - sub_local_key_val.read_string( - buf, off, ".name", 6, &ott->name); - if (key_val_read_a3da_key(&sub_local_key_val, - buf, off, ".offsetU", 9, &ott->offset_u)) + kv.read("name", ott->name); + if (key_val_read(&kv, "offsetU", ott->offset_u)) enum_or(ott->flags, A3DA_OBJECT_TEXTURE_TRANSFORM_OFFSET_U); - if (key_val_read_a3da_key(&sub_local_key_val, - buf, off, ".offsetV", 9, &ott->offset_v)) + if (key_val_read(&kv, "offsetV", ott->offset_v)) enum_or(ott->flags, A3DA_OBJECT_TEXTURE_TRANSFORM_OFFSET_V); - if (key_val_read_a3da_key(&sub_local_key_val, - buf, off, ".repeatU", 9, &ott->repeat_u)) + if (key_val_read(&kv, "repeatU", ott->repeat_u)) enum_or(ott->flags, A3DA_OBJECT_TEXTURE_TRANSFORM_REPEAT_U); - if (key_val_read_a3da_key(&sub_local_key_val, - buf, off, ".repeatV", 9, &ott->repeat_v)) + if (key_val_read(&kv, "repeatV", ott->repeat_v)) enum_or(ott->flags, A3DA_OBJECT_TEXTURE_TRANSFORM_REPEAT_V); - if (key_val_read_a3da_key(&sub_local_key_val, - buf, off, ".rotate", 8, &ott->rotate)) + if (key_val_read(&kv, "rotate", ott->rotate)) enum_or(ott->flags, A3DA_OBJECT_TEXTURE_TRANSFORM_ROTATE); - if (key_val_read_a3da_key(&sub_local_key_val, - buf, off, ".rotateFrame", 13, &ott->rotate_frame)) + if (key_val_read(&kv, "rotateFrame", ott->rotate_frame)) enum_or(ott->flags, A3DA_OBJECT_TEXTURE_TRANSFORM_ROTATE_FRAME); - if (key_val_read_a3da_key(&sub_local_key_val, - buf, off, ".translateFrameU", 17, &ott->translate_frame_u)) + if (key_val_read(&kv, "translateFrameU", ott->translate_frame_u)) enum_or(ott->flags, A3DA_OBJECT_TEXTURE_TRANSFORM_TRANSLATE_FRAME_U); - if (key_val_read_a3da_key(&sub_local_key_val, - buf, off, ".translateFrameV", 17, &ott->translate_frame_v)) + if (key_val_read(&kv, "translateFrameV", ott->translate_frame_v)) enum_or(ott->flags, A3DA_OBJECT_TEXTURE_TRANSFORM_TRANSLATE_FRAME_V); + + kv.close_scope(); } + kv.close_scope(); } - off = len + len1; - lkv.read_string( - buf, off, ".uid_name", 10, &o->uid_name); + kv.read("uid_name", o->uid_name); + + kv.close_scope(); } + kv.close_scope(); } - len = 6; - memcpy(buf, "objhrc", 6); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("objhrc", &lkv)) { - std::vector& voh = a->object_hrc; - - voh.resize(count); - for (int32_t i = 0; i < count; i++) { - a3da_object_hrc* oh = &voh[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; - - lkv.read_string( - buf, off, ".name", 6, &oh->name); - - len2 = 5; - memcpy(buf + len + len1, ".node", 5); - off = len + len1 + len2; - - buf[off] = 0; - key_val sub_local_key_val; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { - std::vector& vohn = oh->node; - - vohn.resize(count1); - for (int32_t j = 0; j < count1; j++) { - a3da_object_node* ohn = &vohn[j]; - len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); - off = len + len1 + len2 + len3; - - if (sub_local_key_val.read_vec3( - buf, off, ".joint_orient", 14, &ohn->joint_orient)) - enum_or(ohn->flags, A3DA_OBJECT_NODE_JOINT_ORIENT); - key_val_read_a3da_model_transform(&sub_local_key_val, - buf, off, "", 1, &ohn->model_transform); - sub_local_key_val.read_string( - buf, off, ".name", 6, &ohn->name); - sub_local_key_val.read_int32_t( - buf, off, ".parent", 8, &ohn->parent); - } - } - - off = len + len1; - lkv.read_string( - buf, off, ".parent_name", 13, &oh->parent_name); - lkv.read_string( - buf, off, ".parent_node", 13, &oh->parent_node); - lkv.read_bool( - buf, off, ".shadow", 8, &oh->shadow); - lkv.read_string( - buf, off, ".uid_name", 10, &oh->uid_name); - } - } - - len = 11; - memcpy(buf, "objhrc_list", 11); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("objhrc_list", &lkv)) { - std::vector& vohl = a->object_hrc_list; - - vohl.resize(count); - for (int32_t i = 0; i < count; i++) { - std::string* ohl = &vohl[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; - - lkv.read_string( - buf, off, "", 1, ohl); - } - } - - len = 11; - memcpy(buf, "object_list", 11); - off = len; - - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("object_list", &lkv)) { + if (kv.read("object_list", "length", count)) { std::vector& vol = a->object_list; vol.resize(count); for (int32_t i = 0; i < count; i++) { - std::string* ol = &vol[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - lkv.read_string( - buf, off, "", 1, ol); + kv.read(vol[i]); + kv.close_scope(); } + kv.close_scope(); } - len = 5; - memcpy(buf, "point", 5); - off = len; + if (kv.read("objhrc", "length", count)) { + std::vector& voh = a->object_hrc; - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("point", &lkv)) { + voh.resize(count); + for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope(i)) + continue; + + a3da_object_hrc* oh = &voh[i]; + kv.read("name", oh->name); + + int32_t count; + if (kv.read("node", "length", count)) { + std::vector& vohn = oh->node; + + vohn.resize(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) + continue; + + a3da_object_node* ohn = &vohn[j]; + if (kv.read("joint_orient", ohn->joint_orient)) + enum_or(ohn->flags, A3DA_OBJECT_NODE_JOINT_ORIENT); + key_val_read(&kv, "", ohn->model_transform); + kv.read("name", ohn->name); + kv.read("parent", ohn->parent); + + kv.close_scope(); + } + kv.close_scope(); + } + + kv.read("parent_name", oh->parent_name); + kv.read("parent_node", oh->parent_node); + kv.read("shadow", oh->shadow); + kv.read("uid_name", oh->uid_name); + + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.read("objhrc_list", "length", count)) { + std::vector& vohl = a->object_hrc_list; + + vohl.resize(count); + for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope(i)) + continue; + + kv.read(vohl[i]); + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.read("point", "length", count)) { std::vector& vp = a->point; vp.resize(count); for (int32_t i = 0; i < count; i++) { - a3da_point* p = &vp[i]; - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - key_val_read_a3da_model_transform(&lkv, - buf, off, "", 1, &p->model_transform); - lkv.read_string( - buf, off, ".name", 6, &p->name); + a3da_point* p = &vp[i]; + key_val_read(&kv, "", p->model_transform); + kv.read("name", p->name); + + kv.close_scope(); } + kv.close_scope(); } } static void a3da_write_text(a3da* a, void** data, size_t* size, bool a3dc) { - char buf[A3DA_TEXT_BUF_SIZE]; - int32_t count; - int32_t count1; - size_t len; - size_t len1; - size_t len2; - size_t len3; - size_t off; - char a3da_timestamp[0x100]; a3da_get_time_stamp(a3da_timestamp, 0x100); stream s; - io_open(&s); + s.open(); if (a3dc) { if (a->_compress_f16 != A3DA_COMPRESS_F32F32F32F32) - io_write(&s, "#-compress_f16\n", 15); + s.write("#-compress_f16\n", 15); } else - io_write(&s, "#A3DA__________\n", 16); + s.write("#A3DA__________\n", 16); - io_write_utf8_string(&s, a3da_timestamp); + s.write_utf8_string(a3da_timestamp); - len = 1; - memcpy(buf, "_", 1); - off = len; + key_val_out kv; - if (a3dc && a->format > A3DA_FORMAT_AFT) - key_val::write_int32_t(&s, buf, off, ".compress_f16", 14, a->_compress_f16); - key_val::write_string(&s, buf, off, ".converter.version", 19, a->_converter_version); - key_val::write_string(&s, buf, off, ".file_name", 11, a->_file_name); - key_val::write_string(&s, buf, off, ".property.version", 18, a->_property_version); + { + kv.open_scope("_"); + + if (a3dc && a->format > A3DA_FORMAT_AFT) + kv.write(s, "compress_f16", a->_compress_f16); + kv.write(s, "converter.version", a->_converter_version); + kv.write(s, "file_name", a->_file_name); + kv.write(s, "property.version", a->_property_version); + + kv.close_scope(); + } if (a->ambient.size() && a->format == A3DA_FORMAT_MGF) { - len = 7; - memcpy(buf, "ambient", 7); - off = len; + kv.open_scope("ambient"); std::vector& va = a->ambient; - count = (int32_t)va.size(); + int32_t count = (int32_t)va.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + a3da_ambient* a = &va[sort_index[i]]; - - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - if (a->flags & A3DA_AMBIENT_LIGHT_DIFFUSE) - key_val_write_a3da_rgba(&s, - buf, off, ".light.Diffuse", 15, a->light_diffuse); - key_val::write_string(&s, buf, off, ".name", 6, a->name); + key_val_out_write(&kv, s, "light.Diffuse", a->light_diffuse); + kv.write(s, "name", a->name); if (a->flags & A3DA_AMBIENT_RIM_LIGHT_DIFFUSE) - key_val_write_a3da_rgba(&s, - buf, off, ".rimlight.Diffuse", 18, a->rim_light_diffuse); + key_val_out_write(&kv, s, "rimlight.Diffuse", a->rim_light_diffuse); + + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (a->auth_2d.size()) { - len = 7; - memcpy(buf, "auth_2d", 7); - off = len; + kv.open_scope("auth_2d"); std::vector& va2 = a->auth_2d; - count = (int32_t)va2.size(); + int32_t count = (int32_t)va2.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - std::string& a2 = va2[sort_index[i]]; - - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val::write_string(&s, buf, off, ".name", 6, a2); + kv.open_scope(sort_index[i]); + kv.write(s, "name", va2[sort_index[i]]); + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (a->camera_auxiliary.flags) { - len = 16; - memcpy(buf, "camera_auxiliary", 16); - off = len; + kv.open_scope("camera_auxiliary"); a3da_camera_auxiliary* ca = &a->camera_auxiliary; if (a->format == A3DA_FORMAT_F || a->format > A3DA_FORMAT_AFT) { if (ca->flags & A3DA_CAMERA_AUXILIARY_EXPOSURE_RATE) - key_val_write_a3da_key(&s, buf, off, ".exposure_rate", 15, ca->exposure_rate); + key_val_out_write(&kv, s, "exposure_rate", ca->exposure_rate); if (ca->flags & A3DA_CAMERA_AUXILIARY_GAMMA_RATE) - key_val_write_a3da_key(&s, buf, off, ".gamma_rate", 12, ca->gamma_rate); + key_val_out_write(&kv, s, "gamma_rate", ca->gamma_rate); if (ca->flags & A3DA_CAMERA_AUXILIARY_SATURATE) - key_val_write_a3da_key(&s, buf, off, ".saturate", 10, ca->saturate); + key_val_out_write(&kv, s, "saturate", ca->saturate); } else { if (ca->flags & A3DA_CAMERA_AUXILIARY_AUTO_EXPOSURE) - key_val_write_a3da_key(&s, buf, off, ".auto_exposure", 15, ca->auto_exposure); + key_val_out_write(&kv, s, "auto_exposure", ca->auto_exposure); if (ca->flags & A3DA_CAMERA_AUXILIARY_EXPOSURE) - key_val_write_a3da_key(&s, buf, off, ".exposure", 10, ca->exposure); + key_val_out_write(&kv, s, "exposure", ca->exposure); if (ca->flags & A3DA_CAMERA_AUXILIARY_GAMMA) - key_val_write_a3da_key(&s, buf, off, ".gamma", 7, ca->gamma); + key_val_out_write(&kv, s, "gamma", ca->gamma); if (ca->flags & A3DA_CAMERA_AUXILIARY_SATURATE) - key_val_write_a3da_key(&s, buf, off, ".saturate", 10, ca->saturate); + key_val_out_write(&kv, s, "saturate", ca->saturate); } + + kv.close_scope(); } if (a->camera_root.size() > 0) { - len = 11; - memcpy(buf, "camera_root", 11); - off = len; + kv.open_scope("camera_root"); std::vector& vcr = a->camera_root; - count = (int32_t)vcr.size(); + int32_t count = (int32_t)vcr.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + a3da_camera_root* cr = &vcr[sort_index[i]]; + key_val_out_write(&kv, s, "interest", cr->interest, 0x1F); + key_val_out_write(&kv, s, "", cr->model_transform, 0x1E); - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; + { + kv.open_scope("view_point"); - key_val_write_a3da_model_transform(&s, - buf, off, ".interest", 10, cr->interest, 0x1F); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, cr->model_transform, 0x1E); + a3da_camera_root_view_point* vp = &cr->view_point; + kv.write(s, "aspect", vp->aspect); + if (vp->flags & A3DA_CAMERA_ROOT_VIEW_POINT_FOV) { + key_val_out_write(&kv, s, "fov", vp->fov); + kv.write(s, "fov_is_horizontal", vp->fov_is_horizontal); + } + else { + kv.write(s, "camera_aperture_h", vp->camera_aperture_h); + kv.write(s, "camera_aperture_w", vp->camera_aperture_w); + key_val_out_write(&kv, s, "focal_length", vp->focal_length); + } + key_val_out_write(&kv, s, "", vp->model_transform, 0x10); + if (vp->flags & A3DA_CAMERA_ROOT_VIEW_POINT_ROLL) + key_val_out_write(&kv, s, "roll", vp->roll); + key_val_out_write(&kv, s, "", vp->model_transform, 0x0F); - a3da_camera_root_view_point* vp = &cr->view_point; - - len2 = 11; - memcpy(buf + len + len1, ".view_point", 11); - off = len + len1 + len2; - - key_val::write_float_t(&s, - buf, off, ".aspect", 8, vp->aspect); - if (vp->flags & A3DA_CAMERA_ROOT_VIEW_POINT_FOV) { - key_val_write_a3da_key(&s, - buf, off, ".fov", 5, vp->fov); - key_val::write_bool(&s, - buf, off, ".fov_is_horizontal", 19, vp->fov_is_horizontal); + kv.close_scope(); } - else { - key_val::write_float_t(&s, - buf, off, ".camera_aperture_h", 19, vp->camera_aperture_h); - key_val::write_float_t(&s, - buf, off, ".camera_aperture_w", 19, vp->camera_aperture_w); - key_val_write_a3da_key(&s, - buf, off, ".focal_length", 14, vp->focal_length); - } - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, vp->model_transform, 0x10); - if (vp->flags & A3DA_CAMERA_ROOT_VIEW_POINT_ROLL) - key_val_write_a3da_key(&s, - buf, off, ".roll", 6, vp->roll); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, vp->model_transform, 0x0F); - off = len + len1; - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, cr->model_transform, 0x01); + key_val_out_write(&kv, s, "", cr->model_transform, 0x01); + + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (a->chara.size() > 0) { - len = 5; - memcpy(buf, "chara", 5); - off = len; + kv.open_scope("chara"); std::vector& vc = a->chara; - count = (int32_t)vc.size(); + int32_t count = (int32_t)vc.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + a3da_chara* c = &vc[sort_index[i]]; + kv.write(s, "name", c->name); + key_val_out_write(&kv, s, "", c->model_transform); - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val::write_string(&s, buf, off, ".name", 6, c->name); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, c->model_transform, 0x1F); + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (a->curve.size() > 0) { - len = 5; - memcpy(buf, "curve", 5); - off = len; + kv.open_scope("curve"); std::vector& vc = a->curve; - count = (int32_t)vc.size(); + int32_t count = (int32_t)vc.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + a3da_curve* c = &vc[sort_index[i]]; + key_val_out_write(&kv, s, "cv", c->curve); + kv.write(s, "name", c->name); - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val_write_a3da_key(&s, buf, off, ".cv", 4, c->curve); - key_val::write_string(&s, buf, off, ".name", 6, c->name); + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (a->dof.has_dof && a->format == A3DA_FORMAT_AFT) { - len = 3; - memcpy(buf, "dof", 3); - off = len; + kv.open_scope("dof"); a3da_dof* d = &a->dof; + kv.write(s, "name", "DOF"); + key_val_out_write(&kv, s, "", d->model_transform); - key_val::write_string(&s, buf, off, ".name", 6, "DOF"); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, d->model_transform, 0x1F); + kv.close_scope(); } if (a->event.size() > 0) { - len = 5; - memcpy(buf, "event", 5); - off = len; + kv.open_scope("event"); std::vector& ve = a->event; - count = (int32_t)ve.size(); + int32_t count = (int32_t)ve.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + a3da_event* e = &ve[sort_index[i]]; + kv.write(s, "begin", e->begin); + kv.write(s, "clip_begin", e->clip_begin); + kv.write(s, "clip_en", e->clip_end); + kv.write(s, "end", e->end); + kv.write(s, "name", e->name); + kv.write(s, "param1", e->param_1); + kv.write(s, "ref", e->ref); + kv.write(s, "time_ref_scale", e->time_ref_scale); + kv.write(s, "type", e->type); - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val::write_float_t(&s, buf, off, ".begin", 7, e->begin); - key_val::write_float_t(&s, buf, off, ".clip_begin", 12, e->clip_begin); - key_val::write_float_t(&s, buf, off, ".clip_en", 9, e->clip_end); - key_val::write_float_t(&s, buf, off, ".end", 5, e->end); - key_val::write_string(&s, buf, off, ".name", 6, e->name); - key_val::write_string(&s, buf, off, ".param1", 8, e->param_1); - key_val::write_string(&s, buf, off, ".ref", 5, e->ref); - key_val::write_float_t(&s, buf, off, ".time_ref_scale", 16, e->time_ref_scale); - key_val::write_int32_t(&s, buf, off, ".type", 6, e->type); + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (a->fog.size() > 0) { - len = 3; - memcpy(buf, "fog", 3); - off = len; + kv.open_scope("fog"); std::vector& vf = a->fog; - count = (int32_t)vf.size(); + int32_t count = (int32_t)vf.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + a3da_fog* f = &vf[sort_index[i]]; - - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - if (f->flags & A3DA_FOG_COLOR) - key_val_write_a3da_rgba(&s, buf, off, ".Diffuse", 9, f->color); + key_val_out_write(&kv, s, "Diffuse", f->color); if (f->flags & A3DA_FOG_DENSITY) - key_val_write_a3da_key(&s, buf, off, ".density", 4, f->density); + key_val_out_write(&kv, s, "density", f->density); if (f->flags & A3DA_FOG_END) - key_val_write_a3da_key(&s, buf, off, ".end", 5, f->end); - key_val::write_int32_t(&s, buf, off, ".id", 4, f->id); + key_val_out_write(&kv, s, "end", f->end); + kv.write(s, "id", f->id); if (f->flags & A3DA_FOG_START) - key_val_write_a3da_key(&s, buf, off, ".start", 7, f->start); + key_val_out_write(&kv, s, "start", f->start); + + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (a->light.size() > 0) { - len = 5; - memcpy(buf, "light", 5); - off = len; + kv.open_scope("light"); bool xhd = a->format == A3DA_FORMAT_XHD; std::vector& vl = a->light; - count = (int32_t)vl.size(); + int32_t count = (int32_t)vl.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + a3da_light* l = &vl[sort_index[i]]; - - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - if (l->flags & A3DA_LIGHT_AMBIENT) - key_val_write_a3da_rgba(&s, - buf, off, ".Ambient", 9, l->ambient); + key_val_out_write(&kv, s, "Ambient", l->ambient); if (l->flags & A3DA_LIGHT_CONSTANT && xhd) - key_val_write_a3da_key(&s, - buf, off, ".CONSTANT", 10, l->constant); + key_val_out_write(&kv, s, "CONSTANT", l->constant); if (l->flags & A3DA_LIGHT_CONE_ANGLE && xhd) - key_val_write_a3da_key(&s, - buf, off, ".ConeAngle", 11, l->cone_angle); + key_val_out_write(&kv, s, "ConeAngle", l->cone_angle); if (l->flags & A3DA_LIGHT_DIFFUSE) - key_val_write_a3da_rgba(&s, - buf, off, ".Diffuse", 9, l->diffuse); + key_val_out_write(&kv, s, "Diffuse", l->diffuse); if (l->flags & A3DA_LIGHT_DROP_OFF && xhd) - key_val_write_a3da_key(&s, - buf, off, ".DropOff", 9, l->drop_off); + key_val_out_write(&kv, s, "DropOff", l->drop_off); if (l->flags & A3DA_LIGHT_FAR && xhd) - key_val_write_a3da_key(&s, - buf, off, ".FAR", 5, l->_far); + key_val_out_write(&kv, s, "FAR", l->_far); if (l->flags & A3DA_LIGHT_TONE_CURVE) - key_val_write_a3da_rgba(&s, - buf, off, ".Incandescence", 15, l->tone_curve); + key_val_out_write(&kv, s, "Incandescence", l->tone_curve); if (l->flags & A3DA_LIGHT_INTENSITY && xhd) - key_val_write_a3da_key(&s, - buf, off, ".Intensity", 9, l->intensity); + key_val_out_write(&kv, s, "Intensity", l->intensity); if (l->flags & A3DA_LIGHT_LINEAR && xhd) - key_val_write_a3da_key(&s, - buf, off, ".LINEAR", 6, l->linear); + key_val_out_write(&kv, s, "LINEAR", l->linear); if (l->flags & A3DA_LIGHT_QUADRATIC && xhd) - key_val_write_a3da_key(&s, - buf, off, ".QUADRATIC", 11, l->quadratic); + key_val_out_write(&kv, s, "QUADRATIC", l->quadratic); if (l->flags & A3DA_LIGHT_SPECULAR) - key_val_write_a3da_rgba(&s, - buf, off, ".Specular", 10, l->specular); - key_val::write_int32_t(&s, - buf, off, ".id", 4, l->id); + key_val_out_write(&kv, s, "Specular", l->specular); + kv.write(s, "id", l->id); const char* name = "none"; switch (l->id) { case LIGHT_CHARA: @@ -1675,516 +1415,403 @@ static void a3da_write_text(a3da* a, void** data, size_t* size, bool a3dc) { name = "ToneCurve"; break; } - key_val::write_string(&s, - buf, off, ".name", 6, name); + kv.write(s, "name", name); if (l->flags & A3DA_LIGHT_POSITION) - key_val_write_a3da_model_transform(&s, - buf, off, ".position", 9, l->position, 0x1F); + key_val_out_write(&kv, s, "position", l->position); if (l->flags & A3DA_LIGHT_SPOT_DIRECTION) - key_val_write_a3da_model_transform(&s, - buf, off, ".spot_direction", 9, l->spot_direction, 0x1F); - key_val::write_string(&s, - buf, off, ".type", 6, l->type); + key_val_out_write(&kv, s, "spot_direction", l->spot_direction); + kv.write(s, "type", l->type); + + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (a->m_object_hrc.size() > 0) { - len = 8; - memcpy(buf, "m_objhrc", 8); - off = len; + kv.open_scope("m_objhrc"); std::vector& vmoh = a->m_object_hrc; - count = (int32_t)vmoh.size(); + int32_t count = (int32_t)vmoh.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + a3da_m_object_hrc* moh = &vmoh[sort_index[i]]; - - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - if (moh->instance.size()) { - len2 = 9; - memcpy(buf + len + len1, ".instance", 9); - off = len + len1 + len2; + kv.open_scope("instance"); std::vector& voi = moh->instance; - count1 = (int32_t)voi.size(); + int32_t count = (int32_t)voi.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count1); - for (int32_t j = 0; j < count1; j++) { + key_val_out::get_lexicographic_order(&sort_index, count); + for (int32_t j = 0; j < count; j++) { + kv.open_scope(sort_index[j]); + a3da_object_instance* oi = &voi[sort_index[j]]; + key_val_out_write(&kv, s, "", oi->model_transform, 0x10); + kv.write(s, "name", oi->name); + key_val_out_write(&kv, s, "", oi->model_transform, 0x0C); + kv.write(s, "shadow", oi->shadow); + key_val_out_write(&kv, s, "", oi->model_transform, 0x02); + kv.write(s, "uid_name", oi->uid_name); + key_val_out_write(&kv, s, "", oi->model_transform, 0x01); - len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index[j]); - off = len + len1 + len2 + len3; - - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, oi->model_transform, 0x10); - key_val::write_string(&s, - buf, off, ".name", 6, oi->name); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, oi->model_transform, 0x0C); - key_val::write_bool(&s, - buf, off, ".shadow", 6, oi->shadow); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, oi->model_transform, 0x02); - key_val::write_string(&s, - buf, off, ".uid_name", 10, oi->uid_name); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, oi->model_transform, 0x01); + kv.close_scope(); } - off = len + len1 + len2; - key_val::write_int32_t(&s, buf, off, ".length", 8, count1); + kv.write(s, "length", count); + kv.close_scope(); } - off = len + len1; - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, moh->model_transform, 0x10); - key_val::write_string(&s, - buf, off, ".name", 6, moh->name); + key_val_out_write(&kv, s, "", moh->model_transform, 0x10); + kv.write(s, "name", moh->name); if (moh->node.size()) { - len2 = 5; - memcpy(buf + len + len1, ".node", 5); - off = len + len1 + len2; + kv.open_scope("node"); - std::vector& vmohn = moh->node; - count1 = (int32_t)vmohn.size(); + std::vector& von = moh->node; + int32_t count = (int32_t)von.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count1); - for (int32_t j = 0; j < count1; j++) { - a3da_object_node* mohn = &vmohn[sort_index[j]]; + key_val_out::get_lexicographic_order(&sort_index, count); + for (int32_t j = 0; j < count; j++) { + kv.open_scope(sort_index[j]); - len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index[j]); - off = len + len1 + len2 + len3; + a3da_object_node* on = &von[sort_index[j]]; + key_val_out_write(&kv, s, "", on->model_transform, 0x10); + if (on->flags & A3DA_OBJECT_NODE_JOINT_ORIENT) + kv.write(s, "joint_orient", on->joint_orient); + kv.write(s, "name", on->name); + kv.write(s, "parent", on->parent); + key_val_out_write(&kv, s, "", on->model_transform, 0x0F); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, mohn->model_transform, 0x10); - if (mohn->flags & A3DA_OBJECT_NODE_JOINT_ORIENT) - key_val::write_vec3(&s, - buf, off, ".joint_orient", 14, mohn->joint_orient); - key_val::write_string(&s, - buf, off, ".name", 6, mohn->name); - key_val::write_int32_t(&s, - buf, off, ".parent", 8, mohn->parent); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, mohn->model_transform, 0x0F); + kv.close_scope(); } - off = len + len1 + len2; - key_val::write_int32_t(&s, buf, off, ".length", 8, count1); + kv.write(s, "length", count); + kv.close_scope(); } - off = len + len1; - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, moh->model_transform, 0x0F); + key_val_out_write(&kv, s, "", moh->model_transform, 0x0F); + + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } - if (a->m_object_hrc_list.size() > 0) { - len = 13; - memcpy(buf, "m_objhrc_list", 13); - off = len; + if (a->m_object_hrc_list.size()) { + kv.open_scope("m_objhrc_list"); std::vector& vmohl = a->m_object_hrc_list; - count = (int32_t)vmohl.size(); + int32_t count = (int32_t)vmohl.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - std::string& mohl = vmohl[sort_index[i]]; - - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val::write_string(&s, buf, off, "", 1, mohl); + kv.open_scope(sort_index[i]); + kv.write(s, "name", vmohl[sort_index[i]]); + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (a->material_list.size() > 0 && (a->format == A3DA_FORMAT_X || a->format == A3DA_FORMAT_XHD)) { - len = 13; - memcpy(buf, "material_list", 13); - off = len; + kv.open_scope("material_list"); std::vector& vml = a->material_list; - count = (int32_t)vml.size(); + int32_t count = (int32_t)vml.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + a3da_material_list* ml = &vml[sort_index[i]]; + if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR) + key_val_out_write(&kv, s, "blend_color", ml->blend_color); + if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR) + key_val_out_write(&kv, s, "glow_intensity", ml->glow_intensity); + kv.write(s, "hash_name", hash_string_murmurhash(&ml->name)); + if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR) + key_val_out_write(&kv, s, "incandescence", ml->incandescence); + kv.write(s, "name", ml->name); - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR) - key_val_write_a3da_rgba(&s, buf, off, ".blend_color", 13, ml->blend_color); - if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR) - key_val_write_a3da_key(&s, buf, off, ".glow_intensity", 16, ml->glow_intensity); - key_val::write_uint32_t(&s, buf, off, ".hash_name", - 11, hash_string_murmurhash(&ml->name)); - if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR) - key_val_write_a3da_rgba(&s, buf, off, ".incandescence", 15, ml->incandescence); - key_val::write_string(&s, buf, off, ".name", 6, ml->name); + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } - if (a->motion.size() > 0) { - len = 6; - memcpy(buf, "motion", 6); - off = len; + if (a->motion.size()) { + kv.open_scope("motion"); std::vector& vm = a->motion; - count = (int32_t)vm.size(); + int32_t count = (int32_t)vm.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - std::string& m = vm[sort_index[i]]; - - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val::write_string(&s, buf, off, "", 1, m); + kv.open_scope(sort_index[i]); + kv.write(s, "name", vm[sort_index[i]]); + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (a->object.size() > 0) { - len = 6; - memcpy(buf, "object", 6); - off = len; + kv.open_scope("object"); std::vector& vo = a->object; - count = (int32_t)vo.size(); + int32_t count = (int32_t)vo.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + a3da_object* o = &vo[sort_index[i]]; - - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, o->model_transform, 0x10); + key_val_out_write(&kv, s, "", o->model_transform, 0x10); if (o->morph.size()) { - key_val::write_string(&s, - buf, off, ".morph", 7, o->morph); - key_val::write_float_t(&s, - buf, off, ".morph_offset", 14, o->morph_offset); + kv.write(s, "morph", o->morph); + kv.write(s, "morph_offset", o->morph_offset); } - key_val::write_string(&s, - buf, off, ".name", 6, o->name); - key_val::write_string(&s, - buf, off, ".parent_name", 13, o->parent_name); - key_val::write_string(&s, - buf, off, ".parent_node", 13, o->parent_node); + kv.write(s, "name", o->name); + kv.write(s, "parent_name", o->parent_name); + kv.write(s, "parent_node", o->parent_node); if (o->pattern.size()) { - key_val::write_string(&s, - buf, off, ".pat", 5, o->pattern); - key_val::write_float_t(&s, - buf, off, ".pat_offset", 12, o->pattern_offset); + kv.write(s, "pat", o->pattern); + kv.write(s, "pat_offset", o->pattern_offset); } - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, o->model_transform, 0x0C); + key_val_out_write(&kv, s, "", o->model_transform, 0x0C); if (o->texture_pattern.size()) { - len2 = 8; - memcpy(buf + len + len1, ".tex_pat", 8); - off = len + len1 + len2; + kv.open_scope("tex_pat"); std::vector& votp = o->texture_pattern; - count1 = (int32_t)votp.size(); + int32_t count = (int32_t)votp.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count1); - for (int32_t j = 0; j < count1; j++) { + key_val_out::get_lexicographic_order(&sort_index, count); + for (int32_t j = 0; j < count; j++) { + kv.open_scope(sort_index[j]); + a3da_object_texture_pattern* otp = &votp[sort_index[j]]; - - len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index[j]); - off = len + len1 + len2 + len3; - - key_val::write_string(&s, - buf, off, ".name", 6, otp->name); + kv.write(s, "name", otp->name); if (otp->pattern.size()) { - key_val::write_string(&s, - buf, off, ".pat", 5, otp->pattern); - key_val::write_float_t(&s, - buf, off, ".pat_offset", 12, otp->pattern_offset); + kv.write(s, "pat", otp->pattern); + kv.write(s, "pat_offset", otp->pattern_offset); } + + kv.close_scope(); } - off = len + len1 + len2; - key_val::write_int32_t(&s, buf, off, ".length", 8, count1); + kv.write(s, "length", count); + kv.close_scope(); } if (o->texture_transform.size()) { - len2 = 14; - memcpy(buf + len + len1, ".tex_transform", 14); - off = len + len1 + len2; + kv.open_scope("tex_transform"); std::vector& vott = o->texture_transform; - count1 = (int32_t)vott.size(); + int32_t count = (int32_t)vott.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count1); - for (int32_t j = 0; j < count1; j++) { + key_val_out::get_lexicographic_order(&sort_index, count); + for (int32_t j = 0; j < count; j++) { + kv.open_scope(sort_index[j]); + a3da_object_texture_transform* ott = &vott[sort_index[j]]; - - len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index[j]); - off = len + len1 + len2 + len3; - if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_COVERAGE_U) - key_val_write_a3da_key(&s, - buf, off, ".coverageU", 11, ott->coverage_u); + key_val_out_write(&kv, s, "coverageU", ott->coverage_u); if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_COVERAGE_V) - key_val_write_a3da_key(&s, - buf, off, ".coverageV", 11, ott->coverage_v); - key_val::write_string(&s, - buf, off, ".name", 6, ott->name); + key_val_out_write(&kv, s, "coverageV", ott->coverage_v); + kv.write(s, "name", ott->name); if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_OFFSET_U) - key_val_write_a3da_key(&s, - buf, off, ".offsetU", 9, ott->offset_u); + key_val_out_write(&kv, s, "offsetU", ott->offset_u); if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_OFFSET_V) - key_val_write_a3da_key(&s, - buf, off, ".offsetV", 9, ott->offset_v); + key_val_out_write(&kv, s, "offsetV", ott->offset_v); if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_REPEAT_U) - key_val_write_a3da_key(&s, - buf, off, ".repeatU", 9, ott->repeat_u); + key_val_out_write(&kv, s, "repeatU", ott->repeat_u); if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_REPEAT_V) - key_val_write_a3da_key(&s, - buf, off, ".repeatV", 9, ott->repeat_v); + key_val_out_write(&kv, s, "repeatV", ott->repeat_v); if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_ROTATE) - key_val_write_a3da_key(&s, - buf, off, ".rotate", 8, ott->rotate); + key_val_out_write(&kv, s, "rotate", ott->rotate); if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_ROTATE_FRAME) - key_val_write_a3da_key(&s, - buf, off, ".rotateFrame", 13, ott->rotate_frame); + key_val_out_write(&kv, s, "rotateFrame", ott->rotate_frame); if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_TRANSLATE_FRAME_U) - key_val_write_a3da_key(&s, - buf, off, ".translateFrameU", 17, ott->translate_frame_u); + key_val_out_write(&kv, s, "translateFrameU", ott->translate_frame_u); if (ott->flags & A3DA_OBJECT_TEXTURE_TRANSFORM_TRANSLATE_FRAME_V) - key_val_write_a3da_key(&s, - buf, off, ".translateFrameV", 17, ott->translate_frame_v); + key_val_out_write(&kv, s, "translateFrameV", ott->translate_frame_v); + + kv.close_scope(); } - off = len + len1 + len2; - key_val::write_int32_t(&s, buf, off, ".length", 8, count1); + kv.write(s, "length", count); + kv.close_scope(); } - off = len + len1; - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, o->model_transform, 0x02); - key_val::write_string(&s, - buf, off, ".uid_name", 10, o->uid_name); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, o->model_transform, 0x01); + key_val_out_write(&kv, s, "", o->model_transform, 0x02); + kv.write(s, "uid_name", o->uid_name); + key_val_out_write(&kv, s, "", o->model_transform, 0x01); + + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } - if (a->object_list.size() > 0) { - len = 11; - memcpy(buf, "object_list", 11); - off = len; + if (a->object_list.size()) { + kv.open_scope("object_list"); std::vector& vol = a->object_list; - count = (int32_t)vol.size(); + int32_t count = (int32_t)vol.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - std::string& ol = vol[sort_index[i]]; - - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val::write_string(&s, buf, off, "", 1, ol); + kv.open_scope(sort_index[i]); + kv.write(s, "name", vol[sort_index[i]]); + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (a->object_hrc.size() > 0) { - len = 6; - memcpy(buf, "objhrc", 6); - off = len; + kv.open_scope("objhrc"); std::vector& voh = a->object_hrc; - count = (int32_t)voh.size(); + int32_t count = (int32_t)voh.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + a3da_object_hrc* oh = &voh[sort_index[i]]; - - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val::write_string(&s, - buf, off, ".name", 6, oh->name); + kv.write(s, "name", oh->name); if (oh->node.size()) { - len2 = 5; - memcpy(buf + len + len1, ".node", 5); - off = len + len1 + len2; + kv.open_scope("node"); std::vector& vohn = oh->node; - count1 = (int32_t)vohn.size(); + int32_t count = (int32_t)vohn.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count1); - for (int32_t j = 0; j < count1; j++) { + key_val_out::get_lexicographic_order(&sort_index, count); + for (int32_t j = 0; j < count; j++) { + kv.open_scope(sort_index[j]); + a3da_object_node* ohn = &vohn[sort_index[j]]; - - len3 = sprintf_s(buf + len + len1 + len2, - A3DA_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index[j]); - off = len + len1 + len2 + len3; - - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, ohn->model_transform, 0x10); + key_val_out_write(&kv, s, "", ohn->model_transform, 0x10); if (ohn->flags & A3DA_OBJECT_NODE_JOINT_ORIENT) - key_val::write_vec3(&s, - buf, off, ".joint_orient", 14, ohn->joint_orient); - key_val::write_string(&s, - buf, off, ".name", 6, ohn->name); - key_val::write_int32_t(&s, - buf, off, ".parent", 8, ohn->parent); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, ohn->model_transform, 0x0F); + kv.write(s, "joint_orient", ohn->joint_orient); + kv.write(s, "name", ohn->name); + kv.write(s, "parent", ohn->parent); + key_val_out_write(&kv, s, "", ohn->model_transform, 0x0F); + + kv.close_scope(); } - off = len + len1 + len2; - key_val::write_int32_t(&s, buf, off, ".length", 8, count1); + kv.write(s, "length", count); + kv.close_scope(); } - off = len + len1; - key_val::write_string(&s, - buf, off, ".parent_name", 13, oh->parent_name); - key_val::write_string(&s, - buf, off, ".parent_node", 13, oh->parent_node); - key_val::write_bool(&s, - buf, off, ".shadow", 6, oh->shadow); - key_val::write_string(&s, - buf, off, ".uid_name", 10, oh->uid_name); + kv.write(s, "parent_name", oh->parent_name); + kv.write(s, "parent_node", oh->parent_node); + kv.write(s, "shadow", oh->shadow); + kv.write(s, "uid_name", oh->uid_name); + + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } - if (a->object_hrc_list.size() > 0) { - len = 11; - memcpy(buf, "objhrc_list", 11); - off = len; + if (a->object_hrc_list.size()) { + kv.open_scope("objhrc_list"); std::vector& vohl = a->object_hrc_list; - count = (int32_t)vohl.size(); + int32_t count = (int32_t)vohl.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - std::string& ohl = vohl[sort_index[i]]; - - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val::write_string(&s, buf, off, "", 1, ohl); + kv.open_scope(sort_index[i]); + kv.write(s, "name", vohl[sort_index[i]]); + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } { + kv.open_scope("play_control"); + a3da_play_control* pc = &a->play_control; - - len = 12; - memcpy(buf, "play_control", 12); - off = len; - - key_val::write_float_t(&s, - buf, off, ".begin", 6, pc->begin); + kv.write(s, "begin", pc->begin); if (pc->flags & A3DA_PLAY_CONTROL_DIV && a->format > A3DA_FORMAT_AFT) - key_val::write_int32_t(&s, - buf, off, ".div", 5, pc->div); - key_val::write_float_t(&s, - buf, off, ".fps", 5, pc->fps); + kv.write(s, "div", pc->div); + kv.write(s, "fps", pc->fps); if (pc->flags & A3DA_PLAY_CONTROL_OFFSET) { if (a->format > A3DA_FORMAT_AFT) { - key_val::write_float_t(&s, - buf, off, ".offset", 8, pc->offset); - key_val::write_float_t(&s, - buf, off, ".size", 6, pc->size); + kv.write(s, "offset", pc->offset); + kv.write(s, "size", pc->size); } else - key_val::write_float_t(&s, - buf, off, ".size", 6, pc->size + pc->offset); + kv.write(s, "size", pc->size + pc->offset); } else - key_val::write_float_t(&s, - buf, off, ".size", 6, pc->size); + kv.write(s, "size", pc->size); + + kv.close_scope(); } if (a->post_process.flags) { - len = 12; - memcpy(buf, "post_process", 12); - off = len; + kv.open_scope("post_process"); a3da_post_process* pp = &a->post_process; if (a->post_process.flags & A3DA_POST_PROCESS_RADIUS) - key_val_write_a3da_rgba(&s, buf, off, ".Ambient", 9, pp->radius); + key_val_out_write(&kv, s, "Ambient", pp->radius); if (a->post_process.flags & A3DA_POST_PROCESS_INTENSITY) - key_val_write_a3da_rgba(&s, buf, off, ".Diffuse", 9, pp->intensity); + key_val_out_write(&kv, s, "Diffuse", pp->intensity); if (a->post_process.flags & A3DA_POST_PROCESS_SCENE_FADE) - key_val_write_a3da_rgba(&s, buf, off, ".Specular", 10, pp->scene_fade); + key_val_out_write(&kv, s, "Specular", pp->scene_fade); if (a->post_process.flags & A3DA_POST_PROCESS_LENS_FLARE) - key_val_write_a3da_key(&s, buf, off, ".lens_flare", 12, pp->lens_flare); + key_val_out_write(&kv, s, "lens_flare", pp->lens_flare); if (a->post_process.flags & A3DA_POST_PROCESS_LENS_GHOST) - key_val_write_a3da_key(&s, buf, off, ".lens_ghost", 12, pp->lens_ghost); + key_val_out_write(&kv, s, "lens_ghost", pp->lens_ghost); if (a->post_process.flags & A3DA_POST_PROCESS_LENS_SHAFT) - key_val_write_a3da_key(&s, buf, off, ".lens_shaft", 12, pp->lens_shaft); + key_val_out_write(&kv, s, "lens_shaft", pp->lens_shaft); + + kv.close_scope(); } if (a->point.size() > 0) { - len = 5; - memcpy(buf, "point", 5); - off = len; + kv.open_scope("point"); std::vector& vp = a->point; - count = (int32_t)vp.size(); + int32_t count = (int32_t)vp.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + a3da_point* p = &vp[sort_index[i]]; + kv.write(s, "name", p->name); + key_val_out_write(&kv, s, "", p->model_transform); - len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val::write_string(&s, buf, off, ".name", 6, p->name); - key_val_write_a3da_model_transform(&s, - buf, off, "", 1, p->model_transform, 0x1F); + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } - io_copy(&s, data, size); - io_free(&s); + s.copy(data, size); } static void a3da_read_data(a3da* a, void* data, size_t size) { @@ -2356,259 +1983,258 @@ static void a3da_write_data(a3da* a, void** data, size_t* size) { a3da_compress_f16& _compress_f16 = a->_compress_f16; stream s; - io_open(&s); + s.open(); for (a3da_camera_root& i : a->camera_root) { - a3dc_write_a3da_model_transform_offset(&s, i.model_transform); - a3dc_write_a3da_model_transform_offset(&s, i.view_point.model_transform); - a3dc_write_a3da_model_transform_offset(&s, i.interest); + a3dc_write_a3da_model_transform_offset(s, i.model_transform); + a3dc_write_a3da_model_transform_offset(s, i.view_point.model_transform); + a3dc_write_a3da_model_transform_offset(s, i.interest); } for (a3da_chara& i : a->chara) - a3dc_write_a3da_model_transform_offset(&s, i.model_transform); + a3dc_write_a3da_model_transform_offset(s, i.model_transform); if (a->dof.has_dof) { a3da_dof* d = &a->dof; - a3dc_write_a3da_model_transform_offset(&s, d->model_transform); + a3dc_write_a3da_model_transform_offset(s, d->model_transform); } for (a3da_light& i : a->light) { if (i.flags & A3DA_LIGHT_POSITION) - a3dc_write_a3da_model_transform_offset(&s, i.position); + a3dc_write_a3da_model_transform_offset(s, i.position); if (i.flags & A3DA_LIGHT_SPOT_DIRECTION) - a3dc_write_a3da_model_transform_offset(&s, i.spot_direction); + a3dc_write_a3da_model_transform_offset(s, i.spot_direction); } for (a3da_m_object_hrc& i : a->m_object_hrc) { - a3dc_write_a3da_model_transform_offset(&s, i.model_transform); + a3dc_write_a3da_model_transform_offset(s, i.model_transform); for (a3da_object_node& j : i.node) - a3dc_write_a3da_model_transform_offset(&s, j.model_transform); + a3dc_write_a3da_model_transform_offset(s, j.model_transform); for (a3da_object_instance& j : i.instance) - a3dc_write_a3da_model_transform_offset(&s, j.model_transform); + a3dc_write_a3da_model_transform_offset(s, j.model_transform); } for (a3da_object& i : a->object) - a3dc_write_a3da_model_transform_offset(&s, i.model_transform); + a3dc_write_a3da_model_transform_offset(s, i.model_transform); for (a3da_object_hrc& i : a->object_hrc) for (a3da_object_node& j : i.node) - a3dc_write_a3da_model_transform_offset(&s, j.model_transform); + a3dc_write_a3da_model_transform_offset(s, j.model_transform); for (a3da_point& i : a->point) - a3dc_write_a3da_model_transform_offset(&s, i.model_transform); + a3dc_write_a3da_model_transform_offset(s, i.model_transform); for (a3da_ambient& i : a->ambient) { if (i.flags & A3DA_AMBIENT_LIGHT_DIFFUSE) - a3dc_write_a3da_rgba(&s, i.light_diffuse); + a3dc_write_a3da_rgba(s, i.light_diffuse); if (i.flags & A3DA_AMBIENT_RIM_LIGHT_DIFFUSE) - a3dc_write_a3da_rgba(&s, i.rim_light_diffuse); + a3dc_write_a3da_rgba(s, i.rim_light_diffuse); } if (a->camera_auxiliary.flags) { a3da_camera_auxiliary* ca = &a->camera_auxiliary; if (ca->flags & A3DA_CAMERA_AUXILIARY_AUTO_EXPOSURE) - a3dc_write_a3da_key(&s, ca->auto_exposure); + a3dc_write_a3da_key(s, ca->auto_exposure); if (ca->flags & A3DA_CAMERA_AUXILIARY_EXPOSURE) - a3dc_write_a3da_key(&s, ca->exposure); + a3dc_write_a3da_key(s, ca->exposure); if (ca->flags & A3DA_CAMERA_AUXILIARY_EXPOSURE_RATE) - a3dc_write_a3da_key(&s, ca->exposure_rate); + a3dc_write_a3da_key(s, ca->exposure_rate); if (ca->flags & A3DA_CAMERA_AUXILIARY_GAMMA) - a3dc_write_a3da_key(&s, ca->gamma); + a3dc_write_a3da_key(s, ca->gamma); if (ca->flags & A3DA_CAMERA_AUXILIARY_GAMMA_RATE) - a3dc_write_a3da_key(&s, ca->gamma_rate); + a3dc_write_a3da_key(s, ca->gamma_rate); if (ca->flags & A3DA_CAMERA_AUXILIARY_SATURATE) - a3dc_write_a3da_key(&s, ca->saturate); + a3dc_write_a3da_key(s, ca->saturate); } for (a3da_camera_root& i : a->camera_root) { - a3dc_write_a3da_model_transform(&s, i.model_transform, _compress_f16); + a3dc_write_a3da_model_transform(s, i.model_transform, _compress_f16); a3da_camera_root_view_point* vp = &i.view_point; - a3dc_write_a3da_model_transform(&s, vp->model_transform, _compress_f16); + a3dc_write_a3da_model_transform(s, vp->model_transform, _compress_f16); if (vp->flags & A3DA_CAMERA_ROOT_VIEW_POINT_ROLL) - a3dc_write_a3da_key(&s, vp->roll); + a3dc_write_a3da_key(s, vp->roll); if (vp->flags & A3DA_CAMERA_ROOT_VIEW_POINT_FOV) - a3dc_write_a3da_key(&s, vp->fov); + a3dc_write_a3da_key(s, vp->fov); else - a3dc_write_a3da_key(&s, vp->focal_length); - a3dc_write_a3da_model_transform(&s, i.interest, _compress_f16); + a3dc_write_a3da_key(s, vp->focal_length); + a3dc_write_a3da_model_transform(s, i.interest, _compress_f16); } for (a3da_chara& i : a->chara) - a3dc_write_a3da_model_transform(&s, i.model_transform, _compress_f16); + a3dc_write_a3da_model_transform(s, i.model_transform, _compress_f16); for (a3da_curve& i : a->curve) - a3dc_write_a3da_key(&s, i.curve); + a3dc_write_a3da_key(s, i.curve); if (a->dof.has_dof) { a3da_dof* d = &a->dof; - a3dc_write_a3da_model_transform(&s, d->model_transform, _compress_f16); + a3dc_write_a3da_model_transform(s, d->model_transform, _compress_f16); } for (a3da_light& i : a->light) { if (i.flags & A3DA_LIGHT_POSITION) - a3dc_write_a3da_model_transform(&s, i.position, _compress_f16); + a3dc_write_a3da_model_transform(s, i.position, _compress_f16); if (i.flags & A3DA_LIGHT_SPOT_DIRECTION) - a3dc_write_a3da_model_transform(&s, i.spot_direction, _compress_f16); + a3dc_write_a3da_model_transform(s, i.spot_direction, _compress_f16); if (i.flags & A3DA_LIGHT_AMBIENT) - a3dc_write_a3da_rgba(&s, i.ambient); + a3dc_write_a3da_rgba(s, i.ambient); if (i.flags & A3DA_LIGHT_DIFFUSE) - a3dc_write_a3da_rgba(&s, i.diffuse); + a3dc_write_a3da_rgba(s, i.diffuse); if (i.flags & A3DA_LIGHT_SPECULAR) - a3dc_write_a3da_rgba(&s, i.specular); + a3dc_write_a3da_rgba(s, i.specular); if (i.flags & A3DA_LIGHT_TONE_CURVE) - a3dc_write_a3da_rgba(&s, i.tone_curve); + a3dc_write_a3da_rgba(s, i.tone_curve); if (a->format == A3DA_FORMAT_XHD) { if (i.flags & A3DA_LIGHT_INTENSITY) - a3dc_write_a3da_key(&s, i.intensity); + a3dc_write_a3da_key(s, i.intensity); if (i.flags & A3DA_LIGHT_FAR) - a3dc_write_a3da_key(&s, i._far); + a3dc_write_a3da_key(s, i._far); if (i.flags & A3DA_LIGHT_CONSTANT) - a3dc_write_a3da_key(&s, i.constant); + a3dc_write_a3da_key(s, i.constant); if (i.flags & A3DA_LIGHT_LINEAR) - a3dc_write_a3da_key(&s, i.linear); + a3dc_write_a3da_key(s, i.linear); if (i.flags & A3DA_LIGHT_QUADRATIC) - a3dc_write_a3da_key(&s, i.quadratic); + a3dc_write_a3da_key(s, i.quadratic); if (i.flags & A3DA_LIGHT_DROP_OFF) - a3dc_write_a3da_key(&s, i.drop_off); + a3dc_write_a3da_key(s, i.drop_off); if (i.flags & A3DA_LIGHT_CONE_ANGLE) - a3dc_write_a3da_key(&s, i.cone_angle); + a3dc_write_a3da_key(s, i.cone_angle); } } for (a3da_fog& i : a->fog) { if (i.flags & A3DA_FOG_DENSITY) - a3dc_write_a3da_key(&s, i.density); + a3dc_write_a3da_key(s, i.density); if (i.flags & A3DA_FOG_END) - a3dc_write_a3da_key(&s, i.end); + a3dc_write_a3da_key(s, i.end); if (i.flags & A3DA_FOG_START) - a3dc_write_a3da_key(&s, i.start); + a3dc_write_a3da_key(s, i.start); if (i.flags & A3DA_FOG_COLOR) - a3dc_write_a3da_rgba(&s, i.color); + a3dc_write_a3da_rgba(s, i.color); } for (a3da_m_object_hrc& i : a->m_object_hrc) { - a3dc_write_a3da_model_transform(&s, i.model_transform, _compress_f16); + a3dc_write_a3da_model_transform(s, i.model_transform, _compress_f16); for (a3da_object_node& j : i.node) - a3dc_write_a3da_model_transform(&s, j.model_transform, _compress_f16); + a3dc_write_a3da_model_transform(s, j.model_transform, _compress_f16); for (a3da_object_instance& j : i.instance) - a3dc_write_a3da_model_transform(&s, j.model_transform, _compress_f16); + a3dc_write_a3da_model_transform(s, j.model_transform, _compress_f16); } for (a3da_material_list& i : a->material_list) { if (i.flags & A3DA_MATERIAL_LIST_GLOW_INTENSITY) - a3dc_write_a3da_key(&s, i.glow_intensity); + a3dc_write_a3da_key(s, i.glow_intensity); if (i.flags & A3DA_MATERIAL_LIST_BLEND_COLOR) - a3dc_write_a3da_rgba(&s, i.blend_color); + a3dc_write_a3da_rgba(s, i.blend_color); if (i.flags & A3DA_MATERIAL_LIST_INCANDESCENCE) - a3dc_write_a3da_rgba(&s, i.incandescence); + a3dc_write_a3da_rgba(s, i.incandescence); } for (a3da_object& i : a->object) { - a3dc_write_a3da_model_transform(&s, i.model_transform, _compress_f16); + a3dc_write_a3da_model_transform(s, i.model_transform, _compress_f16); for (a3da_object_texture_transform& j : i.texture_transform) { if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_COVERAGE_U) - a3dc_write_a3da_key(&s, j.coverage_u); + a3dc_write_a3da_key(s, j.coverage_u); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_COVERAGE_V) - a3dc_write_a3da_key(&s, j.coverage_v); + a3dc_write_a3da_key(s, j.coverage_v); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_REPEAT_U) - a3dc_write_a3da_key(&s, j.repeat_u); + a3dc_write_a3da_key(s, j.repeat_u); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_REPEAT_V) - a3dc_write_a3da_key(&s, j.repeat_v); + a3dc_write_a3da_key(s, j.repeat_v); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_OFFSET_U) - a3dc_write_a3da_key(&s, j.offset_u); + a3dc_write_a3da_key(s, j.offset_u); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_OFFSET_V) - a3dc_write_a3da_key(&s, j.offset_v); + a3dc_write_a3da_key(s, j.offset_v); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_ROTATE) - a3dc_write_a3da_key(&s, j.rotate); + a3dc_write_a3da_key(s, j.rotate); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_ROTATE_FRAME) - a3dc_write_a3da_key(&s, j.rotate_frame); + a3dc_write_a3da_key(s, j.rotate_frame); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_TRANSLATE_FRAME_U) - a3dc_write_a3da_key(&s, j.translate_frame_u); + a3dc_write_a3da_key(s, j.translate_frame_u); if (j.flags & A3DA_OBJECT_TEXTURE_TRANSFORM_TRANSLATE_FRAME_V) - a3dc_write_a3da_key(&s, j.translate_frame_v); + a3dc_write_a3da_key(s, j.translate_frame_v); } } for (a3da_object_hrc& i : a->object_hrc) for (a3da_object_node& j : i.node) - a3dc_write_a3da_model_transform(&s, j.model_transform, _compress_f16); + a3dc_write_a3da_model_transform(s, j.model_transform, _compress_f16); for (a3da_point& i : a->point) - a3dc_write_a3da_model_transform(&s, i.model_transform, _compress_f16); + a3dc_write_a3da_model_transform(s, i.model_transform, _compress_f16); if (a->post_process.flags) { a3da_post_process* pp = &a->post_process; if (pp->flags & A3DA_POST_PROCESS_LENS_FLARE) - a3dc_write_a3da_key(&s, pp->lens_flare); + a3dc_write_a3da_key(s, pp->lens_flare); if (pp->flags & A3DA_POST_PROCESS_LENS_GHOST) - a3dc_write_a3da_key(&s, pp->lens_ghost); + a3dc_write_a3da_key(s, pp->lens_ghost); if (pp->flags & A3DA_POST_PROCESS_LENS_SHAFT) - a3dc_write_a3da_key(&s, pp->lens_shaft); + a3dc_write_a3da_key(s, pp->lens_shaft); if (pp->flags & A3DA_POST_PROCESS_INTENSITY) - a3dc_write_a3da_rgba(&s, pp->intensity); + a3dc_write_a3da_rgba(s, pp->intensity); if (pp->flags & A3DA_POST_PROCESS_RADIUS) - a3dc_write_a3da_rgba(&s, pp->radius); + a3dc_write_a3da_rgba(s, pp->radius); if (pp->flags & A3DA_POST_PROCESS_SCENE_FADE) - a3dc_write_a3da_rgba(&s, pp->scene_fade); + a3dc_write_a3da_rgba(s, pp->scene_fade); } for (a3da_camera_root& i : a->camera_root) { a3da_camera_root_view_point* vp = &i.view_point; - a3dc_write_a3da_model_transform_offset_data(&s, i.model_transform); - a3dc_write_a3da_model_transform_offset_data(&s, vp->model_transform); - a3dc_write_a3da_model_transform_offset_data(&s, i.interest); + a3dc_write_a3da_model_transform_offset_data(s, i.model_transform); + a3dc_write_a3da_model_transform_offset_data(s, vp->model_transform); + a3dc_write_a3da_model_transform_offset_data(s, i.interest); } for (a3da_chara& i : a->chara) - a3dc_write_a3da_model_transform_offset_data(&s, i.model_transform); + a3dc_write_a3da_model_transform_offset_data(s, i.model_transform); if (a->dof.has_dof) { a3da_dof* d = &a->dof; - a3dc_write_a3da_model_transform_offset_data(&s, d->model_transform); + a3dc_write_a3da_model_transform_offset_data(s, d->model_transform); } for (a3da_light& i : a->light) { if (i.flags & A3DA_LIGHT_POSITION) - a3dc_write_a3da_model_transform_offset_data(&s, i.position); + a3dc_write_a3da_model_transform_offset_data(s, i.position); if (i.flags & A3DA_LIGHT_SPOT_DIRECTION) - a3dc_write_a3da_model_transform_offset_data(&s, i.spot_direction); + a3dc_write_a3da_model_transform_offset_data(s, i.spot_direction); } for (a3da_m_object_hrc& i : a->m_object_hrc) { - a3dc_write_a3da_model_transform_offset_data(&s, i.model_transform); + a3dc_write_a3da_model_transform_offset_data(s, i.model_transform); for (a3da_object_node& j : i.node) - a3dc_write_a3da_model_transform_offset_data(&s, j.model_transform); + a3dc_write_a3da_model_transform_offset_data(s, j.model_transform); for (a3da_object_instance& j : i.instance) - a3dc_write_a3da_model_transform_offset_data(&s, j.model_transform); + a3dc_write_a3da_model_transform_offset_data(s, j.model_transform); } for (a3da_object& i : a->object) - a3dc_write_a3da_model_transform_offset_data(&s, i.model_transform); + a3dc_write_a3da_model_transform_offset_data(s, i.model_transform); for (a3da_object_hrc& i : a->object_hrc) for (a3da_object_node& j : i.node) - a3dc_write_a3da_model_transform_offset_data(&s, j.model_transform); + a3dc_write_a3da_model_transform_offset_data(s, j.model_transform); for (a3da_point& i : a->point) - a3dc_write_a3da_model_transform_offset_data(&s, i.model_transform); + a3dc_write_a3da_model_transform_offset_data(s, i.model_transform); - io_align_write(&s, 0x10); - io_copy(&s, data, size); - io_free(&s); + s.align_write(0x10); + s.copy(data, size); } static void a3da_get_time_stamp(char* buf, size_t buf_size) { @@ -2630,58 +2256,59 @@ static void a3da_get_time_stamp(char* buf, size_t buf_size) { tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, 1900 + tm.tm_year); } -static bool key_val_read_a3da_key(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_key* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - key_val lkv; - if (!kv->get_local_key_val(buf, &lkv)) +static bool key_val_read(key_val* kv, + std::string&& key, a3da_key& value) { + if (!kv->open_scope(key)) return false; - else if (lkv.read_int32_t(buf, offset, ".bin_offset", 12, &value->bin_offset)) { - value->flags = A3DA_KEY_BIN_OFFSET; - return true; - } - else if (!lkv.read_int32_t(buf, offset, ".type", 6, (int32_t*)&value->type)) - return false; - - if (value->type == A3DA_KEY_NONE) - return true; - else if (value->type == A3DA_KEY_STATIC) { - lkv.read_float_t(buf, offset, ".value", 7, &value->value); + else if (kv->read("bin_offset", value.bin_offset)) { + value.flags = A3DA_KEY_BIN_OFFSET; + kv->close_scope(); return true; } - lkv.read_int32_t(buf, offset, - ".ep_type_post", 14, (int32_t*)&value->ep_type_post); - lkv.read_int32_t(buf, offset, - ".ep_type_pre", 13, (int32_t*)&value->ep_type_pre); - lkv.read_float_t(buf, offset, ".max", 5, &value->max_frame); - - if (key_val_read_a3da_key_raw_data(&lkv, buf, offset, value)) - return true; - - memcpy(buf + offset, ".key", 5); - offset += 4; - - key_val sub_local_key_val; - if (!lkv.get_local_key_val(buf, &sub_local_key_val)) + int32_t type = 0; + if (!kv->read("type", type)) { + kv->close_scope(); return false; + } + value.type = (a3da_key_type)type; + + if (value.type == A3DA_KEY_NONE) + return true; + else if (value.type == A3DA_KEY_STATIC) { + kv->read("value", value.value); + return true; + } + + int32_t ep_type_post = 0; + if (kv->read("ep_type_post", ep_type_post)) + value.ep_type_post = (a3da_ep_type)ep_type_post; + + int32_t ep_type_pre = 0; + if (kv->read("ep_type_pre", ep_type_pre)) + value.ep_type_pre = (a3da_ep_type)ep_type_pre; + + kv->read("max", value.max_frame); + + if (key_val_read_raw_data(kv, value)) + return true; int32_t length = 0; - sub_local_key_val.read_int32_t(buf, offset, ".length", 8, &length); - value->keys.reserve(length); + if (!kv->read("key", "length", length)) { + kv->close_scope(); + return false; + } + + value.keys.reserve(length); kft3 k = { 0.0f, 0.0f, 0.0f, 0.0f }; - size_t len = offset; for (int32_t i = 0; i < length; i++) { - size_t len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", i); - offset = len + len1; + kv->open_scope(i); - const char* data; + const char* data = 0; int32_t type = 0; - sub_local_key_val.read_string(buf, offset, ".data", 6, &data); - sub_local_key_val.read_int32_t(buf, offset, ".type", 6, &type); + kv->read("data", data); + kv->read("type", type); switch (type) { case 0: { @@ -2690,7 +2317,7 @@ static bool key_val_read_a3da_key(key_val* kv, char* buf, k = { f, 0.0f, 0.0f, 0.0f }; else k = { 0.0f, 0.0f, 0.0f, 0.0f }; - value->keys.push_back(k); + value.keys.push_back(k); } break; case 1: { float_t f; @@ -2699,7 +2326,7 @@ static bool key_val_read_a3da_key(key_val* kv, char* buf, k = { f, v, 0.0f, 0.0f }; else k = { 0.0f, 0.0f, 0.0f, 0.0f }; - value->keys.push_back(k); + value.keys.push_back(k); } break; case 2: { float_t f; @@ -2709,7 +2336,7 @@ static bool key_val_read_a3da_key(key_val* kv, char* buf, k = { f, v, t, t }; else k = { 0.0f, 0.0f, 0.0f, 0.0f }; - value->keys.push_back(k); + value.keys.push_back(k); } break; case 3: { float_t f; @@ -2720,62 +2347,64 @@ static bool key_val_read_a3da_key(key_val* kv, char* buf, k = { f, v, t1, t2 }; else k = { 0.0f, 0.0f, 0.0f, 0.0f }; - value->keys.push_back(k); + value.keys.push_back(k); } break; default: { k = { 0.0f, 0.0f, 0.0f, 0.0f }; - value->keys.push_back(k); + value.keys.push_back(k); } break; } + + kv->close_scope(); } + + kv->close_scope(); + kv->close_scope(); return true; } -static void key_val_write_a3da_key(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_key& value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - +static void key_val_out_write(key_val_out* kv, stream& s, + std::string&& key, a3da_key& value) { + kv->open_scope(key); if (value.flags & A3DA_KEY_BIN_OFFSET) { - key_val::write_int32_t(s, buf, offset, ".bin_offset", 12, value.bin_offset); + kv->write(s, "bin_offset", value.bin_offset); value.flags, ~A3DA_KEY_BIN_OFFSET; value.bin_offset = 0; + kv->close_scope(); return; } if (value.type == A3DA_KEY_NONE) { - key_val::write_int32_t(s, buf, offset, ".type", 6, 0); + kv->write(s, "type", 0); + kv->close_scope(); return; } else if (value.type == A3DA_KEY_STATIC) { - key_val::write_int32_t(s, buf, offset, ".type", 6, 1); - key_val::write_float_t(s, buf, offset, ".value", 7, value.value); + kv->write(s, "type", 1); + kv->write(s, "value", value.value); + kv->close_scope(); return; } if (value.ep_type_post != A3DA_EP_NONE) - key_val::write_int32_t(s, buf, offset, - ".ep_type_post", 14, value.ep_type_post); + kv->write(s, "ep_type_post", value.ep_type_post); if (value.ep_type_pre != A3DA_EP_NONE) - key_val::write_int32_t(s, buf, offset, - ".ep_type_pre", 13, value.ep_type_pre); + kv->write(s, "ep_type_pre", value.ep_type_pre); if (value.raw_data) { - key_val_write_a3da_key_raw_data(s, buf, offset, value); + key_val_out_write_raw_data(kv, s, value); + kv->close_scope(); return; } - memcpy(buf + offset, ".key", 5); - offset += 4; + kv->open_scope("key"); int32_t length = (int32_t)value.keys.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, length); - size_t len = offset; + key_val_out::get_lexicographic_order(&sort_index, length); for (int32_t i = 0; i < length; i++) { - size_t len1 = sprintf_s(buf + len, A3DA_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - offset = len + len1; + kv->open_scope(sort_index[i]); kft3 k = value.keys[sort_index[i]]; kf_type kt = KEY_FRAME_TYPE_3; @@ -2801,46 +2430,51 @@ static void key_val_write_a3da_key(stream* s, char* buf, break; } - key_val::write_string(s, buf, offset, ".data", 6, data_buf); - key_val::write_int32_t(s, buf, offset, ".type", 6, kt); + kv->write(s, "data", data_buf); + kv->write(s, "type", kt); + + kv->close_scope(); } - offset = len; - key_val::write_int32_t(s, buf, offset, ".length", 8, length); + kv->close_scope(); - offset -= 4; - key_val::write_float_t(s, buf, offset, ".max", 5, value.max_frame); - key_val::write_int32_t(s, buf, offset, ".type", 6, value.type); + kv->write(s, "length", length); + + kv->write(s, "max", value.max_frame); + kv->write(s, "type", value.type); + + kv->close_scope(); } -static bool key_val_read_a3da_key_raw_data(key_val* kv, char* buf, - size_t offset, a3da_key* value) { +static bool key_val_read_raw_data(key_val* kv, + a3da_key& value) { int32_t key_type = 0; - if (!kv->read_int32_t(buf, offset, ".raw_data_key_type", 19, &key_type)) + if (!kv->read("raw_data_key_type", key_type)) return false; const char* value_type; - kv->read_string(buf, offset, ".raw_data.value_type", 21, &value_type); + kv->read("raw_data.value_type", value_type); if (str_utils_compare(value_type, "float")) return false; int32_t value_list_size = 0; - kv->read_int32_t(buf, offset, ".raw_data.value_list_size", 26, &value_list_size); + kv->read("raw_data.value_list_size", value_list_size); int32_t value_list_offset = 0; - if (kv->read_int32_t( buf, offset, ".raw_data.value_list_offset", 28, &value_list_offset)) { + if (kv->read( "raw_data.value_list_offset", value_list_offset)) { if (key_type != 3) return false; - value->raw_data = true; - value->raw_data_binary = true; - value->raw_data_value_list_size = value_list_size; - value->raw_data_value_list_offset = value_list_offset; + value.raw_data = true; + value.raw_data_binary = true; + value.raw_data_value_list_size = value_list_size; + value.raw_data_value_list_offset = value_list_offset; return true; } - const char* value_list; - kv->read_string( buf, offset, ".raw_data.value_list", 21, &value_list); + const char* value_list = 0; + if (!kv->read("raw_data.value_list", value_list)) + return false; const char* s = value_list; size_t c = 1; @@ -2852,7 +2486,7 @@ static bool key_val_read_a3da_key_raw_data(key_val* kv, char* buf, if (c != value_list_size) return false; - char b[A3DA_TEXT_BUF_SIZE]; + char b[0x200]; float_t* fs = force_malloc_s(float_t, c); s = value_list; for (size_t i = 0; i < c; i++) { @@ -2868,46 +2502,46 @@ static bool key_val_read_a3da_key_raw_data(key_val* kv, char* buf, switch (key_type) { case 0: { kft3 k = { 0.0f, 0.0f, 0.0f, 0.0f }; - value->keys.reserve(c); + value.keys.reserve(c); for (size_t i = 0; i < c; i++) { k.frame = *fs++; - value->keys.push_back(k); + value.keys.push_back(k); } fs -= c; } break; case 1: { kft3 k = { 0.0f, 0.0f, 0.0f, 0.0f }; c /= 2; - value->keys.reserve(c); + value.keys.reserve(c); for (size_t i = 0; i < c; i++) { k.frame = *fs++; k.value = *fs++; - value->keys.push_back(k); + value.keys.push_back(k); } fs -= c * 2; } break; case 2: { kft3 k = { 0.0f, 0.0f, 0.0f, 0.0f }; c /= 3; - value->keys.reserve(c); + value.keys.reserve(c); for (size_t i = 0; i < c; i++) { k.frame = *fs++; k.value = *fs++; k.tangent1 = k.tangent2 = *fs++; - value->keys.push_back(k); + value.keys.push_back(k); } fs -= c * 3; } break; case 3: { kft3 k = { 0.0f, 0.0f, 0.0f, 0.0f }; c /= 4; - value->keys.reserve(c); + value.keys.reserve(c); for (size_t i = 0; i < c; i++) { k.frame = *fs++; k.value = *fs++; k.tangent1 = *fs++; k.tangent2 = *fs++; - value->keys.push_back(k); + value.keys.push_back(k); } fs -= c * 4; } break; @@ -2917,23 +2551,23 @@ static bool key_val_read_a3da_key_raw_data(key_val* kv, char* buf, } free(fs); - value->raw_data = true; + value.raw_data = true; return true; } -static void key_val_write_a3da_key_raw_data(stream* s, char* buf, - size_t offset, a3da_key& value) { - key_val::write_float_t(s, buf, offset, ".max", 5, value.max_frame); +static void key_val_out_write_raw_data(key_val_out* kv, stream& s, + a3da_key& value) { + kv->write(s, "max", value.max_frame); int32_t length = (int32_t)value.keys.size(); if (value.raw_data_binary) { - key_val::write_int32_t(s, buf, offset, ".raw_data.value_list_offset", 6, + kv->write(s, "raw_data.value_list_offset", value.raw_data_value_list_offset); - key_val::write_int32_t(s, buf, offset, ".raw_data.value_list_size", 26, + kv->write(s, "raw_data.value_list_size", value.raw_data_value_list_size); - key_val::write_string(s, buf, offset, ".raw_data.value_type", 21, "float"); - key_val::write_int32_t(s, buf, offset, ".raw_data_key_type", 19, 3); - key_val::write_int32_t(s, buf, offset, ".type", 6, value.type); + kv->write(s, "raw_data.value_type", "float"); + kv->write(s, "raw_data_key_type", 3); + kv->write(s, "type", value.type); return; } @@ -2948,9 +2582,11 @@ static void key_val_write_a3da_key_raw_data(stream* s, char* buf, break; } - memcpy(buf + offset, ".raw_data.value_list=", 22); + s.write_string(*kv->curr_scope); + s.write_char('.'); + s.write_utf8_string("raw_data.value_list"); + s.write_char('='); - io_write_utf8_string(s, buf); char data_buf[0x200]; switch (key_type) { case KEY_FRAME_TYPE_0: @@ -2958,9 +2594,9 @@ static void key_val_write_a3da_key_raw_data(stream* s, char* buf, kft3 k = value.keys[i]; sprintf_s(data_buf, sizeof(data_buf), "%g", k.frame); - io_write_utf8_string(s, data_buf); + s.write_utf8_string(data_buf); if (i + 1 < length) - io_write_char(s, ','); + s.write_char(','); } break; case KEY_FRAME_TYPE_1: @@ -2968,9 +2604,9 @@ static void key_val_write_a3da_key_raw_data(stream* s, char* buf, kft3 k = value.keys[i]; sprintf_s(data_buf, sizeof(data_buf), "%g,%g", k.frame, k.value); - io_write_utf8_string(s, data_buf); + s.write_utf8_string(data_buf); if (i + 1 < length) - io_write_char(s, ','); + s.write_char(','); } break; case KEY_FRAME_TYPE_2: @@ -2978,9 +2614,9 @@ static void key_val_write_a3da_key_raw_data(stream* s, char* buf, kft3 k = value.keys[i]; sprintf_s(data_buf, sizeof(data_buf), "%g,%g,%g", k.frame, k.value, k.tangent1); - io_write_utf8_string(s, data_buf); + s.write_utf8_string(data_buf); if (i + 1 < length) - io_write_char(s, ','); + s.write_char(','); } break; case KEY_FRAME_TYPE_3: @@ -2988,57 +2624,48 @@ static void key_val_write_a3da_key_raw_data(stream* s, char* buf, kft3 k = value.keys[i]; sprintf_s(data_buf, sizeof(data_buf), "%g,%g,%g,%g", k.frame, k.value, k.tangent1, k.tangent2); - io_write_utf8_string(s, data_buf); + s.write_utf8_string(data_buf); if (i + 1 < length) - io_write_char(s, ','); + s.write_char(','); } break; } - io_write_char(s, '\n'); + s.write_char('\n'); - key_val::write_int32_t(s, buf, offset, ".raw_data.value_list_size", 26, + kv->write(s, "raw_data.value_list_size", (int32_t)(length * ((size_t)key_type + 1))); - key_val::write_string(s, buf, offset, ".raw_data.value_type", 21, "float"); - key_val::write_int32_t(s, buf, offset, ".raw_data_key_type", 19, key_type); - key_val::write_int32_t(s, buf, offset, ".type", 6, value.type); + kv->write(s, "raw_data.value_type", "float"); + kv->write(s, "raw_data_key_type", key_type); + kv->write(s, "type", value.type); } -static bool key_val_read_a3da_model_transform(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, - a3da_model_transform* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - key_val lkv; - if (!kv->get_local_key_val(buf, &lkv)) +static bool key_val_read(key_val* kv, + std::string&& key, a3da_model_transform& value) { + if (!kv->open_scope(key)) return false; - else if (lkv.read_int32_t(buf, offset, - ".model_transform.bin_offset", 28, &value->bin_offset)) { - value->flags = A3DA_MODEL_TRANSFORM_BIN_OFFSET; + + else if (kv->read("model_transform.bin_offset", value.bin_offset)) { + value.flags = A3DA_MODEL_TRANSFORM_BIN_OFFSET; + kv->close_scope(); return true; } - key_val_read_a3da_vec3(&lkv, buf, offset, ".rot", 5, &value->rotation); - key_val_read_a3da_vec3(&lkv, buf, offset, ".scale", 7, &value->scale); - key_val_read_a3da_vec3(&lkv, buf, offset, ".trans", 7, &value->translation); - key_val_read_a3da_key(&lkv, buf, offset,".visibility", 12, &value->visibility); + key_val_read(kv, "rot", value.rotation); + key_val_read(kv, "scale", value.scale); + key_val_read(kv, "trans", value.translation); + key_val_read(kv, "visibility", value.visibility); - if (value->visibility.type == A3DA_KEY_NONE) { - value->visibility.type = A3DA_KEY_STATIC; - value->visibility.value = 1.0f; - } + kv->close_scope(); return true; } -static void key_val_write_a3da_model_transform(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_model_transform& value, int32_t write_mask) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; +static void key_val_out_write(key_val_out* kv, stream& s, + std::string&& key, a3da_model_transform& value, int32_t write_mask) { + kv->open_scope(key); if (value.flags & A3DA_MODEL_TRANSFORM_BIN_OFFSET) { if (write_mask & 0x10) { - key_val::write_int32_t(s, buf, offset, - ".model_transform.bin_offset", 28, value.bin_offset); + kv->write(s, "model_transform.bin_offset", value.bin_offset); } if (write_mask & 0x01) if (value.flags & A3DA_MODEL_TRANSFORM_BIN_OFFSET) { @@ -3048,84 +2675,84 @@ static void key_val_write_a3da_model_transform(stream* s, char* buf, } else { if (write_mask & 0x08) - key_val_write_a3da_vec3(s, buf, offset, ".rot", 5, value.rotation); + key_val_out_write(kv, s, "rot", value.rotation); if (write_mask & 0x04) - key_val_write_a3da_vec3(s, buf, offset, ".scale", 7, value.scale); + key_val_out_write(kv, s, "scale", value.scale); if (write_mask & 0x02) - key_val_write_a3da_vec3(s, buf, offset, ".trans", 7, value.translation); + key_val_out_write(kv, s, "trans", value.translation); if (write_mask & 0x01) - key_val_write_a3da_key(s, buf, offset, ".visibility", 12, value.visibility); + key_val_out_write(kv, s, "visibility", value.visibility); } + + kv->close_scope(); } -static bool key_val_read_a3da_rgba(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_rgba* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - key_val lkv; - if (!kv->get_local_key_val(buf, &lkv)) +static bool key_val_read(key_val* kv, + std::string&& key, a3da_rgba& value) { + if (!kv->open_scope(key)) return false; - if (key_val_read_a3da_key(&lkv, buf, offset, ".r", 3, &value->r)) - enum_or(value->flags, A3DA_RGBA_R); - if (key_val_read_a3da_key(&lkv, buf, offset, ".g", 3, &value->g)) - enum_or(value->flags, A3DA_RGBA_G); - if (key_val_read_a3da_key(&lkv, buf, offset, ".b", 3, &value->b)) - enum_or(value->flags, A3DA_RGBA_B); - if (key_val_read_a3da_key(&lkv, buf, offset, ".a", 3, &value->a)) - enum_or(value->flags, A3DA_RGBA_A); + if (key_val_read(kv, "r", value.r)) + enum_or(value.flags, A3DA_RGBA_R); + if (key_val_read(kv, "g", value.g)) + enum_or(value.flags, A3DA_RGBA_G); + if (key_val_read(kv, "b", value.b)) + enum_or(value.flags, A3DA_RGBA_B); + if (key_val_read(kv, "a", value.a)) + enum_or(value.flags, A3DA_RGBA_A); + + kv->close_scope(); return true; } -static void key_val_write_a3da_rgba(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_rgba& value) { +static void key_val_out_write(key_val_out* kv, stream& s, + std::string&& key, a3da_rgba& value) { if (!value.flags) return; - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; + kv->open_scope(key); if (value.flags & A3DA_RGBA_R) - key_val_write_a3da_key(s, buf, offset, ".r", 3, value.r); + key_val_out_write(kv, s, "r", value.r); if (value.flags & A3DA_RGBA_G) - key_val_write_a3da_key(s, buf, offset, ".g", 3, value.g); + key_val_out_write(kv, s, "g", value.g); if (value.flags & A3DA_RGBA_B) - key_val_write_a3da_key(s, buf, offset, ".b", 3, value.b); + key_val_out_write(kv, s, "b", value.b); if (value.flags & A3DA_RGBA_A) - key_val_write_a3da_key(s, buf, offset, ".a", 3, value.a); + key_val_out_write(kv, s, "a", value.a); + + kv->close_scope(); } -static bool key_val_read_a3da_vec3(key_val* kv, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_vec3* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - key_val lkv; - if (!kv->get_local_key_val(buf, &lkv)) +static bool key_val_read(key_val* kv, + std::string&& key, a3da_vec3& value) { + if (!kv->open_scope(key)) return false; - key_val_read_a3da_key(&lkv, buf, offset, ".x", 3, &value->x); - key_val_read_a3da_key(&lkv, buf, offset, ".y", 3, &value->y); - key_val_read_a3da_key(&lkv, buf, offset, ".z", 3, &value->z); + key_val_read(kv, "x", value.x); + key_val_read(kv, "y", value.y); + key_val_read(kv, "z", value.z); + + kv->close_scope(); return true; } -static void key_val_write_a3da_vec3(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, a3da_vec3& value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; +static void key_val_out_write(key_val_out* kv, stream& s, + std::string&& key, a3da_vec3& value) { + kv->open_scope(key); - key_val_write_a3da_key(s, buf, offset, ".x", 3, value.x); - key_val_write_a3da_key(s, buf, offset, ".y", 3, value.y); - key_val_write_a3da_key(s, buf, offset, ".z", 3, value.z); + key_val_out_write(kv, s, "x", value.x); + key_val_out_write(kv, s, "y", value.y); + key_val_out_write(kv, s, "z", value.z); + + kv->close_scope(); } inline static void a3dc_read_a3da_key(void* data, size_t size, a3da_key* value) { a3dc_read_a3da_key_f16(data, size, value, A3DA_COMPRESS_F32F32F32F32); } -inline static void a3dc_write_a3da_key(stream* s, a3da_key& value) { +inline static void a3dc_write_a3da_key(stream& s, a3da_key& value) { a3dc_write_a3da_key_f16(s, value, A3DA_COMPRESS_F32F32F32F32); } @@ -3213,7 +2840,7 @@ static void a3dc_read_a3da_key_f16(void* data, size_t size, a3da_key* value, a3d } } -static void a3dc_write_a3da_key_f16(stream* s, a3da_key& value, a3da_compress_f16 f16) { +static void a3dc_write_a3da_key_f16(stream& s, a3da_key& value, a3da_compress_f16 f16) { if (value.raw_data) { if (value.keys.size() < 1) { value.raw_data = false; @@ -3234,31 +2861,31 @@ static void a3dc_write_a3da_key_f16(stream* s, a3da_key& value, a3da_compress_f1 if (!value.raw_data_binary) return; - value.raw_data_value_list_offset = (int32_t)io_get_position(s); + value.raw_data_value_list_offset = (int32_t)s.get_position(); int32_t len = (int32_t)value.keys.size(); value.raw_data_value_list_size = len * 4; for (int32_t i = 0; i < len; i++) { kft3* k = &value.keys[i]; - io_write_float_t(s, k->frame); - io_write_float_t(s, k->value); - io_write_float_t(s, k->tangent1); - io_write_float_t(s, k->tangent2); + s.write_float_t(k->frame); + s.write_float_t(k->value); + s.write_float_t(k->tangent1); + s.write_float_t(k->tangent2); } return; } - value.bin_offset = (int32_t)io_get_position(s); + value.bin_offset = (int32_t)s.get_position(); enum_or(value.flags, A3DA_KEY_BIN_OFFSET); if (value.type == A3DA_KEY_NONE) { - io_write_int32_t(s, A3DA_KEY_NONE); - io_write_float_t(s, 0.0f); + s.write_int32_t(A3DA_KEY_NONE); + s.write_float_t(0.0f); return; } else if (value.type == A3DA_KEY_STATIC) { - io_write_int32_t(s, A3DA_KEY_STATIC); - io_write_float_t(s, value.value); + s.write_int32_t(A3DA_KEY_STATIC); + s.write_float_t(value.value); return; } @@ -3271,34 +2898,34 @@ static void a3dc_write_a3da_key_f16(stream* s, a3da_key& value, a3da_compress_f1 head.ep_type_post = value.ep_type_post; head.max_frame = value.max_frame; head.length = len; - io_write(s, &head, sizeof(a3dc_key_header)); + s.write(&head, sizeof(a3dc_key_header)); switch (f16) { case A3DA_COMPRESS_F32F32F32F32: for (uint32_t i = 0; i < len; i++) { kft3* k = &value.keys[i]; - io_write_float_t(s, k->frame); - io_write_float_t(s, k->value); - io_write_float_t(s, k->tangent1); - io_write_float_t(s, k->tangent2); + s.write_float_t(k->frame); + s.write_float_t(k->value); + s.write_float_t(k->tangent1); + s.write_float_t(k->tangent2); } break; case A3DA_COMPRESS_I16F16F32F32: for (uint32_t i = 0; i < len; i++) { kft3* k = &value.keys[i]; - io_write_int16_t(s, (int16_t)roundf(k->frame)); - io_write_half_t(s, float_to_half(k->value)); - io_write_float_t(s, k->tangent1); - io_write_float_t(s, k->tangent2); + s.write_int16_t((int16_t)roundf(k->frame)); + s.write_half_t(float_to_half(k->value)); + s.write_float_t(k->tangent1); + s.write_float_t(k->tangent2); } break; case A3DA_COMPRESS_I16F16F16F16: for (uint32_t i = 0; i < len; i++) { kft3* k = &value.keys[i]; - io_write_int16_t(s, (int16_t)roundf(k->frame)); - io_write_half_t(s, float_to_half(k->value)); - io_write_half_t(s, float_to_half(k->tangent1)); - io_write_half_t(s, float_to_half(k->tangent2)); + s.write_int16_t((int16_t)roundf(k->frame)); + s.write_half_t(float_to_half(k->value)); + s.write_half_t(float_to_half(k->tangent1)); + s.write_half_t(float_to_half(k->tangent2)); } break; } @@ -3338,14 +2965,9 @@ static void a3dc_read_a3da_model_transform(void* data, size_t size, a3dc_read_a3da_vec3_f16(data, size, &value->rotation, f16); a3dc_read_a3da_vec3(data, size, &value->translation); a3dc_read_a3da_key(data, size, &value->visibility); - - if (value->visibility.type == A3DA_KEY_NONE) { - value->visibility.type = A3DA_KEY_STATIC; - value->visibility.value = 1.0f; - } } -static void a3dc_write_a3da_model_transform(stream* s, +static void a3dc_write_a3da_model_transform(stream& s, a3da_model_transform& value, a3da_compress_f16 f16) { a3dc_write_a3da_vec3(s, value.scale); a3dc_write_a3da_vec3(s, value.rotation); @@ -3353,47 +2975,47 @@ static void a3dc_write_a3da_model_transform(stream* s, a3dc_write_a3da_key(s, value.visibility); } -static void a3dc_write_a3da_model_transform_offset(stream* s, +static void a3dc_write_a3da_model_transform_offset(stream& s, a3da_model_transform& value) { - value.bin_offset = (int32_t)io_get_position(s); + value.bin_offset = (int32_t)s.get_position(); enum_or(value.flags, A3DA_MODEL_TRANSFORM_BIN_OFFSET); - io_write(s, 0x30); + s.write(0x30); } -static void a3dc_write_a3da_model_transform_offset_data(stream* s, +static void a3dc_write_a3da_model_transform_offset_data(stream& s, a3da_model_transform& value) { - io_position_push(s, value.bin_offset, SEEK_SET); - io_write_uint32_t(s, value.scale.x.bin_offset); + s.position_push(value.bin_offset, SEEK_SET); + s.write_uint32_t(value.scale.x.bin_offset); enum_and(value.scale.x.flags, ~A3DA_KEY_BIN_OFFSET); value.scale.x.bin_offset = 0; - io_write_uint32_t(s, value.scale.y.bin_offset); + s.write_uint32_t(value.scale.y.bin_offset); enum_and(value.scale.y.flags, ~A3DA_KEY_BIN_OFFSET); value.scale.y.bin_offset = 0; - io_write_uint32_t(s, value.scale.z.bin_offset); + s.write_uint32_t(value.scale.z.bin_offset); enum_and(value.scale.z.flags, ~A3DA_KEY_BIN_OFFSET); value.scale.z.bin_offset = 0; - io_write_uint32_t(s, value.rotation.x.bin_offset); + s.write_uint32_t(value.rotation.x.bin_offset); enum_and(value.rotation.x.flags, ~A3DA_KEY_BIN_OFFSET); value.rotation.x.bin_offset = 0; - io_write_uint32_t(s, value.rotation.y.bin_offset); + s.write_uint32_t(value.rotation.y.bin_offset); enum_and(value.rotation.y.flags, ~A3DA_KEY_BIN_OFFSET); value.rotation.y.bin_offset = 0; - io_write_uint32_t(s, value.rotation.z.bin_offset); + s.write_uint32_t(value.rotation.z.bin_offset); enum_and(value.rotation.z.flags, ~A3DA_KEY_BIN_OFFSET); value.rotation.z.bin_offset = 0; - io_write_uint32_t(s, value.translation.x.bin_offset); + s.write_uint32_t(value.translation.x.bin_offset); enum_and(value.translation.x.flags, ~A3DA_KEY_BIN_OFFSET); value.translation.x.bin_offset = 0; - io_write_uint32_t(s, value.translation.y.bin_offset); + s.write_uint32_t(value.translation.y.bin_offset); enum_and(value.translation.y.flags, ~A3DA_KEY_BIN_OFFSET); value.translation.y.bin_offset = 0; - io_write_uint32_t(s, value.translation.z.bin_offset); + s.write_uint32_t(value.translation.z.bin_offset); enum_and(value.translation.z.flags, ~A3DA_KEY_BIN_OFFSET); value.translation.z.bin_offset = 0; - io_write_uint32_t(s, value.visibility.bin_offset); + s.write_uint32_t(value.visibility.bin_offset); enum_and(value.visibility.flags, ~A3DA_KEY_BIN_OFFSET); value.visibility.bin_offset = 0; - io_position_pop(s); + s.position_pop(); } static void a3dc_read_a3da_rgba(void* data, size_t size, a3da_rgba* value) { @@ -3410,7 +3032,7 @@ static void a3dc_read_a3da_rgba(void* data, size_t size, a3da_rgba* value) { a3dc_read_a3da_key(data, size, &value->a); } -static void a3dc_write_a3da_rgba(stream* s, a3da_rgba& value) { +static void a3dc_write_a3da_rgba(stream& s, a3da_rgba& value) { if (!value.flags) return; @@ -3430,7 +3052,7 @@ static void a3dc_read_a3da_vec3(void* data, size_t size, a3da_vec3* value) { a3dc_read_a3da_key(data, size, &value->z); } -static void a3dc_write_a3da_vec3(stream* s, a3da_vec3& value) { +static void a3dc_write_a3da_vec3(stream& s, a3da_vec3& value) { a3dc_write_a3da_key(s, value.x); a3dc_write_a3da_key(s, value.y); a3dc_write_a3da_key(s, value.z); @@ -3442,7 +3064,7 @@ static void a3dc_read_a3da_vec3_f16(void* data, size_t size, a3da_vec3* value, a a3dc_read_a3da_key_f16(data, size, &value->z, f16); } -static void a3dc_write_a3da_vec3_f16(stream* s, a3da_vec3& value, a3da_compress_f16 f16) { +static void a3dc_write_a3da_vec3_f16(stream& s, a3da_vec3& value, a3da_compress_f16 f16) { a3dc_write_a3da_key_f16(s, value.x, f16); a3dc_write_a3da_key_f16(s, value.y, f16); a3dc_write_a3da_key_f16(s, value.z, f16); diff --git a/src/KKdLib/a3da.hpp b/src/KKdLib/a3da.hpp index 1c15f99b..45c6d8a6 100644 --- a/src/KKdLib/a3da.hpp +++ b/src/KKdLib/a3da.hpp @@ -7,12 +7,12 @@ #include #include -#include "default.h" +#include "default.hpp" #include "light_param/fog.hpp" #include "light_param/light.hpp" -#include "kf.h" -#include "mat.h" -#include "vec.h" +#include "kf.hpp" +#include "mat.hpp" +#include "vec.hpp" enum a3da_ambient_flags { A3DA_AMBIENT_LIGHT_DIFFUSE = 0x01, diff --git a/src/KKdLib/aes.c b/src/KKdLib/aes.cpp similarity index 99% rename from src/KKdLib/aes.c rename to src/KKdLib/aes.cpp index c8cdfe1f..2096f793 100644 --- a/src/KKdLib/aes.c +++ b/src/KKdLib/aes.cpp @@ -38,7 +38,7 @@ NOTE: String length must be evenly divisible by 16byte (str_len % 16 == 0) /*****************************************************************************/ /* Includes: */ /*****************************************************************************/ -#include "aes.h" +#include "aes.hpp" /*****************************************************************************/ /* Defines: */ diff --git a/src/KKdLib/aes.h b/src/KKdLib/aes.hpp similarity index 99% rename from src/KKdLib/aes.h rename to src/KKdLib/aes.hpp index 021673c0..3525c01f 100644 --- a/src/KKdLib/aes.h +++ b/src/KKdLib/aes.hpp @@ -5,7 +5,7 @@ #ifndef _AES_H_ #define _AES_H_ -#include "default.h" +#include "default.hpp" #include // #define the macros below to 1/0 to enable/disable the mode of operation. diff --git a/src/KKdLib/aet.c b/src/KKdLib/aet.cpp similarity index 75% rename from src/KKdLib/aet.c rename to src/KKdLib/aet.cpp index 697a1055..0ea03f9f 100644 --- a/src/KKdLib/aet.c +++ b/src/KKdLib/aet.cpp @@ -3,4 +3,4 @@ GitHub/GitLab: korenkonder */ -#include "aet.h" +#include "aet.hpp" diff --git a/src/KKdLib/aet.h b/src/KKdLib/aet.hpp similarity index 99% rename from src/KKdLib/aet.h rename to src/KKdLib/aet.hpp index 17256fb7..29d6b60a 100644 --- a/src/KKdLib/aet.h +++ b/src/KKdLib/aet.hpp @@ -9,9 +9,9 @@ #include #include -#include "default.h" -#include "kf.h" -#include "vec.h" +#include "default.hpp" +#include "kf.hpp" +#include "vec.hpp" enum aet_blend_mode { AET_BLEND_MODE_NONE = 0, diff --git a/src/KKdLib/database/aet.c b/src/KKdLib/database/aet.cpp similarity index 75% rename from src/KKdLib/database/aet.c rename to src/KKdLib/database/aet.cpp index 697a1055..0ea03f9f 100644 --- a/src/KKdLib/database/aet.c +++ b/src/KKdLib/database/aet.cpp @@ -3,4 +3,4 @@ GitHub/GitLab: korenkonder */ -#include "aet.h" +#include "aet.hpp" diff --git a/src/KKdLib/database/sprite.h b/src/KKdLib/database/aet.hpp similarity index 73% rename from src/KKdLib/database/sprite.h rename to src/KKdLib/database/aet.hpp index ae73750d..3b25d82b 100644 --- a/src/KKdLib/database/sprite.h +++ b/src/KKdLib/database/aet.hpp @@ -5,4 +5,4 @@ #pragma once -#include "../default.h" +#include "../default.hpp" diff --git a/src/KKdLib/database/auth_3d.cpp b/src/KKdLib/database/auth_3d.cpp index ec6cea87..f29215ab 100644 --- a/src/KKdLib/database/auth_3d.cpp +++ b/src/KKdLib/database/auth_3d.cpp @@ -4,21 +4,20 @@ */ #include "auth_3d.hpp" -#include "../io/path.h" -#include "../io/stream.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" #include "../key_val.hpp" +#include "../hash.hpp" #include "../sort.hpp" -#include "../str_utils.h" - -#define AUTH_3D_DATABASE_TEXT_BUF_SIZE 0x400 +#include "../str_utils.hpp" static void auth_3d_database_load_categories(auth_3d_database* auth_3d_db, auth_3d_database_file* auth_3d_db_file, bool mdata); static void auth_3d_database_load_uids(auth_3d_database* auth_3d_db, auth_3d_database_file* auth_3d_db_file, bool mdata); -static void auth_3d_database_file_read_inner(auth_3d_database_file* auth_3d_db_file, stream* s); -static void auth_3d_database_file_write_inner(auth_3d_database_file* auth_3d_db_file, stream* s); +static void auth_3d_database_file_read_inner(auth_3d_database_file* auth_3d_db_file, stream& s); +static void auth_3d_database_file_write_inner(auth_3d_database_file* auth_3d_db_file, stream& s); static void auth_3d_database_file_read_text(auth_3d_database_file* auth_3d_db_file, void* data, size_t size); static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_file, void** data, size_t* size); @@ -37,10 +36,9 @@ void auth_3d_database_file::read(const char* path) { char* path_bin = str_utils_add(path, ".bin"); if (path_check_file_exists(path_bin)) { stream s; - io_open(&s, path_bin, "rb"); + s.open(path_bin, "rb"); if (s.io.stream) - auth_3d_database_file_read_inner(this, &s); - io_free(&s); + auth_3d_database_file_read_inner(this, s); } free(path_bin); } @@ -52,10 +50,9 @@ void auth_3d_database_file::read(const wchar_t* path) { 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"); + s.open(path_bin, L"rb"); if (s.io.stream) - auth_3d_database_file_read_inner(this, &s); - io_free(&s); + auth_3d_database_file_read_inner(this, s); } free(path_bin); } @@ -65,9 +62,8 @@ void auth_3d_database_file::read(const void* data, size_t size) { return; stream s; - io_open(&s, data, size); - auth_3d_database_file_read_inner(this, &s); - io_free(&s); + s.open(data, size); + auth_3d_database_file_read_inner(this, s); } void auth_3d_database_file::write(const char* path) { @@ -76,10 +72,9 @@ void auth_3d_database_file::write(const char* path) { char* path_bin = str_utils_add(path, ".bin"); stream s; - io_open(&s, path_bin, "wb"); + s.open(path_bin, "wb"); if (s.io.stream) - auth_3d_database_file_write_inner(this, &s); - io_free(&s); + auth_3d_database_file_write_inner(this, s); free(path_bin); } @@ -89,10 +84,9 @@ void auth_3d_database_file::write(const wchar_t* path) { wchar_t* path_bin = str_utils_add(path, L".bin"); stream s; - io_open(&s, path_bin, L"wb"); + s.open(path_bin, L"wb"); if (s.io.stream) - auth_3d_database_file_write_inner(this, &s); - io_free(&s); + auth_3d_database_file_write_inner(this, s); free(path_bin); } @@ -101,10 +95,9 @@ void auth_3d_database_file::write(void** data, size_t* size) { return; stream s; - io_open(&s); - auth_3d_database_file_write_inner(this, &s); - io_copy(&s, data, size); - io_free(&s); + s.open(); + auth_3d_database_file_write_inner(this, s); + s.copy(data, size); } bool auth_3d_database_file::load_file(void* data, const char* path, const char* file, uint32_t hash) { @@ -130,6 +123,22 @@ auth_3d_database::~auth_3d_database() { } +int32_t auth_3d_database::get_category_index(const char* name) { + uint32_t name_hash = hash_utf8_murmurhash(name); + for (auth_3d_database_category i : category) + if (hash_string_murmurhash(&i.name) == name_hash) + return (int32_t)(&i - category.data()); + return -1; +} + +int32_t auth_3d_database::get_uid(const char* name) { + uint32_t name_hash = hash_utf8_murmurhash(name); + for (auth_3d_database_uid& i : uid) + if (hash_string_murmurhash(&i.name) == name_hash) + return (int32_t)(&i - uid.data()); + return -1; +} + void auth_3d_database::merge_mdata(auth_3d_database_file* base_auth_3d_db, auth_3d_database_file* mdata_auth_3d_db) { if (!base_auth_3d_db || !mdata_auth_3d_db @@ -274,168 +283,142 @@ static void auth_3d_database_load_uids(auth_3d_database* auth_3d_db, } } -static void auth_3d_database_file_read_inner(auth_3d_database_file* auth_3d_db_file, stream* s) { - uint32_t signature = io_read_uint32_t(s); +static void auth_3d_database_file_read_inner(auth_3d_database_file* auth_3d_db_file, stream& s) { + uint32_t signature = s.read_uint32_t(); if (signature != reverse_endianness_int32_t('#A3D')) return; - signature = io_read_uint32_t(s); + signature = s.read_uint32_t(); if ((signature & 0xFF) != 'A') return; size_t string_offset = 0x10; - size_t string_length = (int32_t)(s->length - 0x10); + size_t string_length = (int32_t)(s.length - 0x10); - io_set_position(s, string_offset, SEEK_SET); + s.set_position(string_offset, SEEK_SET); void* a3da_data = force_malloc(string_length); - io_read(s, a3da_data, string_length); + s.read(a3da_data, string_length); auth_3d_database_file_read_text(auth_3d_db_file, a3da_data, string_length); free(a3da_data); auth_3d_db_file->ready = true; } -static void auth_3d_database_file_write_inner(auth_3d_database_file* auth_3d_db_file, stream* s) { +static void auth_3d_database_file_write_inner(auth_3d_database_file* auth_3d_db_file, stream& s) { void* a3da_data = 0; size_t a3da_data_length = 0; auth_3d_database_file_write_text(auth_3d_db_file, &a3da_data, &a3da_data_length); - io_write(s, a3da_data, a3da_data_length); + s.write(a3da_data, a3da_data_length); free(a3da_data); } static void auth_3d_database_file_read_text(auth_3d_database_file* auth_3d_db_file, void* data, size_t size) { - char buf[AUTH_3D_DATABASE_TEXT_BUF_SIZE]; - int32_t count; - size_t len; - size_t len1; - size_t off; - key_val kv; kv.parse(data, size); - key_val lkv; - - len = 8; - memcpy(buf, "category", 8); - off = len; auth_3d_db_file->category.clear(); - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("category", &lkv)) { + int32_t count; + if (kv.read("category", "length", count)) { std::vector& vc = auth_3d_db_file->category; vc.resize(count); for (int32_t i = 0; i < count; i++) { - std::string* c = &vc[i]; - len1 = sprintf_s(buf + len, AUTH_3D_DATABASE_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; - lkv.read_string( - buf, off, ".value", 7, c); + kv.read("value", vc[i]); + kv.close_scope(); } + kv.close_scope(); } - len = 3; - memcpy(buf, "uid", 3); - off = len; + if (kv.open_scope("uid")) { + auth_3d_db_file->uid.clear(); + if (!kv.read("max", auth_3d_db_file->uid_max)) + auth_3d_db_file->uid_max = -1; - auth_3d_db_file->uid.clear(); - if (!kv.read_int32_t(buf, off, ".max", 5, &auth_3d_db_file->uid_max)) - auth_3d_db_file->uid_max = -1; + int32_t count; + if (kv.read("length", count)) { + std::vector& vu = auth_3d_db_file->uid; - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("uid", &lkv)) { - std::vector& vu = auth_3d_db_file->uid; + vu.resize(count); + for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope(i)) + continue; - vu.resize(count); - for (int32_t i = 0; i < count; i++) { - auth_3d_database_uid_file* u = &vu[i]; - len1 = sprintf_s(buf + len, AUTH_3D_DATABASE_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + auth_3d_database_uid_file* u = &vu[i]; + kv.read("category", u->category); + if (kv.read("org_uid", u->org_uid)) + enum_or(u->flags, AUTH_3D_DATABASE_UID_ORG_UID); + if (kv.read("size", u->size)) + enum_or(u->flags, AUTH_3D_DATABASE_UID_SIZE); + kv.read("value", u->value); - lkv.read_string( - buf, off, ".category", 10, &u->category); - if (lkv.read_int32_t( - buf, off, ".org_uid", 9, &u->org_uid)) - enum_or(u->flags, AUTH_3D_DATABASE_UID_ORG_UID); - if (lkv.read_float_t( - buf, off, ".size", 6, &u->size)) - enum_or(u->flags, AUTH_3D_DATABASE_UID_SIZE); - lkv.read_string( - buf, off, ".value", 7, &u->value); + kv.close_scope(); + } } + kv.close_scope(); } } static void auth_3d_database_file_write_text(auth_3d_database_file* auth_3d_db_file, void** data, size_t* size) { - char buf[AUTH_3D_DATABASE_TEXT_BUF_SIZE]; - int32_t count; - size_t len; - size_t len1; - size_t off; - stream s; - io_open(&s); + s.open(); - io_write(&s, "#A3DA__________\n", 16); - io_write(&s, "# date time was eliminated.\n", 28); + s.write("#A3DA__________\n", 16); + s.write("# date time was eliminated.\n", 28); + key_val_out kv; if (auth_3d_db_file->category.size() > 0) { - len = 8; - memcpy(buf, "category", 8); - off = len; + kv.open_scope("category"); std::vector& vc = auth_3d_db_file->category; - count = (int32_t)vc.size(); + int32_t count = (int32_t)vc.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { - std::string& c = vc[sort_index[i]]; - - len1 = sprintf_s(buf + len, AUTH_3D_DATABASE_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val::write_string(&s, buf, off, ".value", 7, c); + kv.open_scope(sort_index[i]); + kv.write(s, "value", vc[sort_index[i]]); + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (auth_3d_db_file->uid.size() > 0) { - len = 3; - memcpy(buf, "uid", 3); - off = len; + kv.open_scope("uid"); int32_t uid_max = -1; std::vector& vu = auth_3d_db_file->uid; - count = (int32_t)vu.size(); + int32_t count = (int32_t)vu.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + auth_3d_database_uid_file* u = &vu[sort_index[i]]; - len1 = sprintf_s(buf + len, AUTH_3D_DATABASE_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - key_val::write_string(&s, buf, off, ".category", 10, u->category); + kv.write(s, "category", u->category); if ((int32_t)(u->flags & AUTH_3D_DATABASE_UID_ORG_UID)) - key_val::write_int32_t(&s, buf, off, ".org_uid", 9, u->org_uid); + kv.write(s, "org_uid", u->org_uid); if ((int32_t)(u->flags & AUTH_3D_DATABASE_UID_SIZE)) - key_val::write_float_t(&s, buf, off, ".size", 6, u->size); - key_val::write_string(&s, buf, off, ".value", 7, u->value); + kv.write(s, "size", u->size); + kv.write(s, "value", u->value); if ((int32_t)(u->flags & AUTH_3D_DATABASE_UID_ORG_UID) && u->org_uid > uid_max) uid_max = u->org_uid; + + kv.close_scope(); } - if (uid_max == 0) + if (!uid_max) uid_max = count; - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); - key_val::write_int32_t(&s, buf, off, ".max", 5, uid_max); + kv.write(s, "length", count); + kv.write(s, "max", uid_max); + kv.close_scope(); } - io_copy(&s, data, size); - io_free(&s); + s.copy(data, size); } diff --git a/src/KKdLib/database/auth_3d.hpp b/src/KKdLib/database/auth_3d.hpp index 6d34e058..c75e0e40 100644 --- a/src/KKdLib/database/auth_3d.hpp +++ b/src/KKdLib/database/auth_3d.hpp @@ -7,7 +7,7 @@ #include #include -#include "../default.h" +#include "../default.hpp" enum auth_3d_database_uid_flags { AUTH_3D_DATABASE_UID_ORG_UID = 0x01, @@ -73,6 +73,8 @@ struct auth_3d_database { auth_3d_database(); ~auth_3d_database(); + int32_t get_category_index(const char* name); + int32_t get_uid(const char* name); void merge_mdata(auth_3d_database_file* base_auth_3d_db, auth_3d_database_file* mdata_auth_3d_db); void split_mdata(auth_3d_database_file* base_auth_3d_db, diff --git a/src/KKdLib/database/bone.cpp b/src/KKdLib/database/bone.cpp index 4052a193..ed3e3a77 100644 --- a/src/KKdLib/database/bone.cpp +++ b/src/KKdLib/database/bone.cpp @@ -5,10 +5,10 @@ #include "bone.hpp" #include "../f2/struct.hpp" -#include "../io/path.h" -#include "../io/stream.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" #include "../hash.hpp" -#include "../str_utils.h" +#include "../str_utils.hpp" struct bone_database_skeleton_header { int64_t offset; @@ -20,10 +20,10 @@ struct bone_database_skeleton_header { int64_t parent_indices_offset; }; -static void bone_database_classic_read_inner(bone_database* bone_data, stream* s); -static void bone_database_classic_write_inner(bone_database* bone_data, stream* s); -static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, uint32_t header_length); -static void bone_database_modern_write_inner(bone_database* bone_data, stream* s); +static void bone_database_classic_read_inner(bone_database* bone_data, stream& s); +static void bone_database_classic_write_inner(bone_database* bone_data, stream& s); +static void bone_database_modern_read_inner(bone_database* bone_data, stream& s, uint32_t header_length); +static void bone_database_modern_write_inner(bone_database* bone_data, stream& s); static int64_t bone_database_strings_get_string_offset(std::vector& vec, std::vector& vec_off, const char* str); static bool bone_database_strings_push_back_check(std::vector& vec, const char* str); @@ -44,17 +44,15 @@ void bone_database::read(const char* path, bool modern) { char* path_bin = str_utils_add(path, ".bin"); if (path_check_file_exists(path_bin)) { stream s; - io_open(&s, path_bin, "rb"); + s.open(path_bin, "rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); - io_read(&s, data, s.length); + s.read(data, s.length); stream s_bin; - io_open(&s_bin, data, s.length); - bone_database_classic_read_inner(this, &s_bin); - io_free(&s_bin); + s_bin.open(data, s.length); + bone_database_classic_read_inner(this, s_bin); free(data); } - io_free(&s); } free(path_bin); } @@ -65,10 +63,9 @@ void bone_database::read(const char* path, bool modern) { st.read(path_bon); if (st.header.signature == reverse_endianness_uint32_t('BONE')) { stream s_bone; - io_open(&s_bone, &st.data); + s_bone.open(st.data); s_bone.is_big_endian = st.header.use_big_endian; - bone_database_modern_read_inner(this, &s_bone, st.header.length); - io_free(&s_bone); + bone_database_modern_read_inner(this, s_bone, st.header.length); } } free(path_bon); @@ -83,17 +80,15 @@ void bone_database::read(const wchar_t* path, bool 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"); + s.open(path_bin, L"rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); - io_read(&s, data, s.length); + s.read(data, s.length); stream s_bin; - io_open(&s_bin, data, s.length); - bone_database_classic_read_inner(this, &s_bin); - io_free(&s_bin); + s_bin.open(data, s.length); + bone_database_classic_read_inner(this, s_bin); free(data); } - io_free(&s); } free(path_bin); } @@ -104,10 +99,9 @@ void bone_database::read(const wchar_t* path, bool modern) { st.read(path_bon); if (st.header.signature == reverse_endianness_uint32_t('BONE')) { stream s_bone; - io_open(&s_bone, &st.data); + s_bone.open(st.data); s_bone.is_big_endian = st.header.use_big_endian; - bone_database_modern_read_inner(this, &s_bone, st.header.length); - io_free(&s_bone); + bone_database_modern_read_inner(this, s_bone, st.header.length); } } free(path_bon); @@ -120,19 +114,17 @@ void bone_database::read(const void* data, size_t size, bool modern) { if (!modern) { stream s; - io_open(&s, data, size); - bone_database_classic_read_inner(this, &s); - io_free(&s); + s.open(data, size); + bone_database_classic_read_inner(this, s); } else { f2_struct st; st.read(data, size); if (st.header.signature == reverse_endianness_uint32_t('BONE')) { stream s_bone; - io_open(&s_bone, &st.data); + s_bone.open(st.data); s_bone.is_big_endian = st.header.use_big_endian; - bone_database_modern_read_inner(this, &s_bone, st.header.length); - io_free(&s_bone); + bone_database_modern_read_inner(this, s_bone, st.header.length); } } } @@ -144,19 +136,17 @@ void bone_database::write(const char* path) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); stream s; - io_open(&s, path_bin, "wb"); + s.open(path_bin, "wb"); if (s.io.stream) - bone_database_classic_write_inner(this, &s); - io_free(&s); + bone_database_classic_write_inner(this, s); free(path_bin); } else { char* path_bon = str_utils_add(path, ".bon"); stream s; - io_open(&s, path_bon, "wb"); + s.open(path_bon, "wb"); if (s.io.stream) - bone_database_modern_write_inner(this, &s); - io_free(&s); + bone_database_modern_write_inner(this, s); free(path_bon); } } @@ -168,19 +158,17 @@ void bone_database::write(const wchar_t* path) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); stream s; - io_open(&s, path_bin, L"wb"); + s.open(path_bin, L"wb"); if (s.io.stream) - bone_database_classic_write_inner(this, &s); - io_free(&s); + bone_database_classic_write_inner(this, s); free(path_bin); } else { wchar_t* path_bon = str_utils_add(path, L".bon"); stream s; - io_open(&s, path_bon, L"wb"); + s.open(path_bon, L"wb"); if (s.io.stream) - bone_database_modern_write_inner(this, &s); - io_free(&s); + bone_database_modern_write_inner(this, s); free(path_bon); } } @@ -190,14 +178,13 @@ void bone_database::write(void** data, size_t* size) { return; stream s; - io_open(&s); + s.open(); if (!modern) - bone_database_classic_write_inner(this, &s); + bone_database_classic_write_inner(this, s); else - bone_database_modern_write_inner(this, &s); - io_align_write(&s, 0x10); - io_copy(&s, data, size); - io_free(&s); + bone_database_modern_write_inner(this, s); + s.align_write(0x10); + s.copy(data, size); } bool bone_database::get_skeleton(const char* name, bone_database_skeleton** skeleton) { @@ -475,138 +462,132 @@ bone_database_skeleton::~bone_database_skeleton() { } -static void bone_database_classic_read_inner(bone_database* bone_data, stream* s) { - uint32_t signature = io_read_uint32_t(s); +static void bone_database_classic_read_inner(bone_database* bone_data, stream& s) { + uint32_t signature = s.read_uint32_t(); if (signature != 0x09102720) return; - uint32_t skeleton_count = io_read_uint32_t(s); - uint32_t skeleton_offsets_offset = io_read_uint32_t(s); - uint32_t skeleton_name_offsets_offset = io_read_uint32_t(s); - io_read(s, 0x14); + uint32_t skeleton_count = s.read_uint32_t(); + uint32_t skeleton_offsets_offset = s.read_uint32_t(); + uint32_t skeleton_name_offsets_offset = s.read_uint32_t(); + s.read(0x14); bone_data->skeleton.resize(skeleton_count); - io_position_push(s, skeleton_offsets_offset, SEEK_SET); + s.position_push(skeleton_offsets_offset, SEEK_SET); for (uint32_t i = 0; i < skeleton_count; i++) { bone_database_skeleton* skel = &bone_data->skeleton[i]; - uint32_t skeleton_offset = io_read_uint32_t(s); + uint32_t skeleton_offset = s.read_uint32_t(); - io_position_push(s, skeleton_offset, SEEK_SET); - uint32_t bones_offset = io_read_uint32_t(s); - uint32_t position_count = io_read_uint32_t(s); - uint32_t positions_offset = io_read_uint32_t(s); - uint32_t unknown_value_offset = io_read_uint32_t(s); - uint32_t object_bone_count = io_read_uint32_t(s); - uint32_t object_bone_names_offset = io_read_uint32_t(s); - uint32_t motion_bone_count = io_read_uint32_t(s); - uint32_t motion_bone_names_offset = io_read_uint32_t(s); - uint32_t parent_indices_offset = io_read_uint32_t(s); - io_read(s, 0x14); + s.position_push(skeleton_offset, SEEK_SET); + uint32_t bones_offset = s.read_uint32_t(); + uint32_t position_count = s.read_uint32_t(); + uint32_t positions_offset = s.read_uint32_t(); + uint32_t unknown_value_offset = s.read_uint32_t(); + uint32_t object_bone_count = s.read_uint32_t(); + uint32_t object_bone_names_offset = s.read_uint32_t(); + uint32_t motion_bone_count = s.read_uint32_t(); + uint32_t motion_bone_names_offset = s.read_uint32_t(); + uint32_t parent_indices_offset = s.read_uint32_t(); + s.read(0x14); uint32_t bone_count = 0; - io_position_push(s, bones_offset, SEEK_SET); + s.position_push(bones_offset, SEEK_SET); while (true) { - if (io_read_uint8_t(s) == 0xFF) + if (s.read_uint8_t() == 0xFF) break; - io_read(s, 0x0B); + s.read(0x0B); bone_count++; } - io_position_pop(s); + s.position_pop(); skel->bone.resize(bone_count); - io_position_push(s, bones_offset, SEEK_SET); + s.position_push(bones_offset, SEEK_SET); for (uint32_t j = 0; j < bone_count; j++) { bone_database_bone* bone = &skel->bone[j]; - bone->type = (bone_database_bone_type)io_read_uint8_t(s); - bone->has_parent = io_read_uint8_t(s) ? true : false; - bone->parent = io_read_uint8_t(s); - bone->pole_target = io_read_uint8_t(s); - bone->mirror = io_read_uint8_t(s); - bone->disable_mot_anim = io_read_uint8_t(s); - io_read(s, 0x02); - io_read_string_null_terminated_offset(s, io_read_uint32_t(s), &bone->name); + bone->type = (bone_database_bone_type)s.read_uint8_t(); + bone->has_parent = s.read_uint8_t() ? true : false; + bone->parent = s.read_uint8_t(); + bone->pole_target = s.read_uint8_t(); + bone->mirror = s.read_uint8_t(); + bone->disable_mot_anim = s.read_uint8_t(); + s.read(0x02); + bone->name = s.read_string_null_terminated_offset(s.read_uint32_t()); } - io_position_pop(s); + s.position_pop(); skel->position.resize(position_count); - io_position_push(s, positions_offset, SEEK_SET); + s.position_push(positions_offset, SEEK_SET); for (uint32_t j = 0; j < position_count; j++) { vec3* position = &skel->position[j]; - position->x = io_read_float_t(s); - position->y = io_read_float_t(s); - position->z = io_read_float_t(s); + position->x = s.read_float_t(); + position->y = s.read_float_t(); + position->z = s.read_float_t(); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, unknown_value_offset, SEEK_SET); - skel->heel_height = io_read_float_t(s); - io_position_pop(s); + s.position_push(unknown_value_offset, SEEK_SET); + skel->heel_height = s.read_float_t(); + s.position_pop(); skel->object_bone.resize(object_bone_count); - io_position_push(s, object_bone_names_offset, SEEK_SET); - for (uint32_t j = 0; j < object_bone_count; j++) { - std::string* object_bone_name = &skel->object_bone[j]; - io_read_string_null_terminated_offset(s, io_read_uint32_t(s), object_bone_name); - } - io_position_pop(s); + s.position_push(object_bone_names_offset, SEEK_SET); + for (uint32_t j = 0; j < object_bone_count; j++) + skel->object_bone[j] = s.read_string_null_terminated_offset(s.read_uint32_t()); + s.position_pop(); skel->motion_bone.resize(motion_bone_count); - io_position_push(s, motion_bone_names_offset, SEEK_SET); - for (uint32_t j = 0; j < motion_bone_count; j++) { - std::string* motion_bone_name = &skel->motion_bone[j]; - io_read_string_null_terminated_offset(s, io_read_uint32_t(s), motion_bone_name); - } - io_position_pop(s); + s.position_push(motion_bone_names_offset, SEEK_SET); + for (uint32_t j = 0; j < motion_bone_count; j++) + skel->motion_bone[j] = s.read_string_null_terminated_offset(s.read_uint32_t()); + s.position_pop(); skel->parent_index.resize(motion_bone_count); - io_position_push(s, parent_indices_offset, SEEK_SET); - io_read(s, skel->parent_index.data(), motion_bone_count * sizeof(uint16_t)); - io_position_pop(s); - io_position_pop(s); + s.position_push(parent_indices_offset, SEEK_SET); + s.read(skel->parent_index.data(), motion_bone_count * sizeof(uint16_t)); + s.position_pop(); + s.position_pop(); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, skeleton_name_offsets_offset, SEEK_SET); - for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skeleton = &bone_data->skeleton[i]; - io_read_string_null_terminated_offset(s, io_read_uint32_t(s), &skeleton->name); - } - io_position_pop(s); + s.position_push(skeleton_name_offsets_offset, SEEK_SET); + for (uint32_t i = 0; i < skeleton_count; i++) + bone_data->skeleton[i].name = s.read_string_null_terminated_offset(s.read_uint32_t()); + s.position_pop(); bone_data->is_x = false; bone_data->modern = false; bone_data->ready = true; } -static void bone_database_classic_write_inner(bone_database* bone_data, stream* s) { - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); +static void bone_database_classic_write_inner(bone_database* bone_data, stream& s) { + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); uint32_t skeleton_count = (uint32_t)bone_data->skeleton.size(); - int64_t skeleton_offsets_offset = io_get_position(s); - io_write(s, skeleton_count * 0x04ULL); + int64_t skeleton_offsets_offset = s.get_position(); + s.write(skeleton_count * 0x04ULL); - int64_t skeleton_name_offset = io_get_position(s); + int64_t skeleton_name_offset = s.get_position(); for (bone_database_skeleton& i : bone_data->skeleton) - io_write_string_null_terminated(s, &i.name); + s.write_string_null_terminated(i.name); - int64_t skeleton_name_offsets_offset = io_get_position(s); + int64_t skeleton_name_offsets_offset = s.get_position(); for (bone_database_skeleton& i : bone_data->skeleton) { - io_write_uint32_t(s, (uint32_t)skeleton_name_offset); + s.write_uint32_t((uint32_t)skeleton_name_offset); skeleton_name_offset += i.name.size() + 1; } @@ -628,123 +609,123 @@ static void bone_database_classic_write_inner(bone_database* bone_data, stream* for (bone_database_bone& j : skel->bone) if (bone_database_strings_push_back_check(strings, j.name.c_str())) { - string_offsets.push_back(io_get_position(s)); - io_write_string_null_terminated(s, &j.name); + string_offsets.push_back(s.get_position()); + s.write_string_null_terminated(j.name); } if (bone_database_strings_push_back_check(strings, "End")) { - string_offsets.push_back(io_get_position(s)); - io_write_utf8_string_null_terminated(s, "End"); + string_offsets.push_back(s.get_position()); + s.write_utf8_string_null_terminated("End"); } - io_align_write(s, 0x04); + s.align_write(0x04); - int64_t bones_offset = io_get_position(s); + int64_t bones_offset = s.get_position(); for (bone_database_bone& j : skel->bone) { - io_write_uint8_t(s, (uint8_t)j.type); - io_write_uint8_t(s, j.has_parent ? 1 : 0); - io_write_uint8_t(s, j.parent); - io_write_uint8_t(s, j.pole_target); - io_write_uint8_t(s, j.mirror); - io_write_uint8_t(s, j.disable_mot_anim); - io_write(s, 0x02); - io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(strings, + s.write_uint8_t((uint8_t)j.type); + s.write_uint8_t(j.has_parent ? 1 : 0); + s.write_uint8_t(j.parent); + s.write_uint8_t(j.pole_target); + s.write_uint8_t(j.mirror); + s.write_uint8_t(j.disable_mot_anim); + s.write(0x02); + s.write_uint32_t((uint32_t)bone_database_strings_get_string_offset(strings, string_offsets, j.name.c_str())); } - io_write_uint32_t(s, 0xFF); - io_write_uint32_t(s, 0xFF); - io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(strings, + s.write_uint32_t(0xFF); + s.write_uint32_t(0xFF); + s.write_uint32_t((uint32_t)bone_database_strings_get_string_offset(strings, string_offsets, "End")); - int64_t positions_offset = io_get_position(s); - io_write(s, skel->position.data(), sizeof(vec3) * position_count); + int64_t positions_offset = s.get_position(); + s.write(skel->position.data(), sizeof(vec3) * position_count); - int64_t unknown_value_offset = io_get_position(s); - io_write_float_t(s, skel->heel_height); + int64_t unknown_value_offset = s.get_position(); + s.write_float_t(skel->heel_height); for (std::string& j : skel->object_bone) if (bone_database_strings_push_back_check(strings, j.c_str())) { - string_offsets.push_back(io_get_position(s)); - io_write_string_null_terminated(s, &j); + string_offsets.push_back(s.get_position()); + s.write_string_null_terminated(j); } - io_align_write(s, 0x04); + s.align_write(0x04); - int64_t object_bone_names_offset = io_get_position(s); + int64_t object_bone_names_offset = s.get_position(); for (std::string& j : skel->object_bone) - io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(strings, + s.write_uint32_t((uint32_t)bone_database_strings_get_string_offset(strings, string_offsets, j.c_str())); for (std::string& j : skel->motion_bone) if (bone_database_strings_push_back_check(strings, j.c_str())) { - string_offsets.push_back(io_get_position(s)); - io_write_string_null_terminated(s, &j); + string_offsets.push_back(s.get_position()); + s.write_string_null_terminated(j); } - io_align_write(s, 0x04); + s.align_write(0x04); - int64_t motion_bone_names_offset = io_get_position(s); + int64_t motion_bone_names_offset = s.get_position(); for (std::string& j : skel->motion_bone) - io_write_uint32_t(s, (uint32_t)bone_database_strings_get_string_offset(strings, + s.write_uint32_t((uint32_t)bone_database_strings_get_string_offset(strings, string_offsets, j.c_str())); - int64_t parent_indices_offset = io_get_position(s); - io_write(s, skel->parent_index.data(), sizeof(uint16_t) * motion_bone_count); - io_align_write(s, 0x04); + int64_t parent_indices_offset = s.get_position(); + s.write(skel->parent_index.data(), sizeof(uint16_t) * motion_bone_count); + s.align_write(0x04); - skeleton_offsets[skel - bone_data->skeleton.data()] = io_get_position(s); - io_write_uint32_t(s, (uint32_t)bones_offset); - io_write_uint32_t(s, position_count); - io_write_uint32_t(s, (uint32_t)positions_offset); - io_write_uint32_t(s, (uint32_t)unknown_value_offset); - io_write_uint32_t(s, object_bone_count); - io_write_uint32_t(s, (uint32_t)object_bone_names_offset); - io_write_uint32_t(s, motion_bone_count); - io_write_uint32_t(s, (uint32_t)motion_bone_names_offset); - io_write_uint32_t(s, (uint32_t)parent_indices_offset); - io_write(s, 0x14); + skeleton_offsets[skel - bone_data->skeleton.data()] = s.get_position(); + s.write_uint32_t((uint32_t)bones_offset); + s.write_uint32_t(position_count); + s.write_uint32_t((uint32_t)positions_offset); + s.write_uint32_t((uint32_t)unknown_value_offset); + s.write_uint32_t(object_bone_count); + s.write_uint32_t((uint32_t)object_bone_names_offset); + s.write_uint32_t(motion_bone_count); + s.write_uint32_t((uint32_t)motion_bone_names_offset); + s.write_uint32_t((uint32_t)parent_indices_offset); + s.write(0x14); strings.clear(); string_offsets.clear(); } - io_position_push(s, 0x00, SEEK_SET); - io_write_uint32_t(s, 0x09102720); - io_write_uint32_t(s, skeleton_count); - io_write_uint32_t(s, (uint32_t)skeleton_offsets_offset); - io_write_uint32_t(s, (uint32_t)skeleton_name_offsets_offset); - io_write(s, 0x14); - io_position_pop(s); + s.position_push(0x00, SEEK_SET); + s.write_uint32_t(0x09102720); + s.write_uint32_t(skeleton_count); + s.write_uint32_t((uint32_t)skeleton_offsets_offset); + s.write_uint32_t((uint32_t)skeleton_name_offsets_offset); + s.write(0x14); + s.position_pop(); - io_position_push(s, skeleton_offsets_offset, SEEK_SET); + s.position_push(skeleton_offsets_offset, SEEK_SET); for (uint32_t i = 0; i < skeleton_count; i++) - io_write_uint32_t(s, (uint32_t)skeleton_offsets[i]); - io_position_pop(s); + s.write_uint32_t((uint32_t)skeleton_offsets[i]); + s.position_pop(); free(skeleton_offsets); } -static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, uint32_t header_length) { - uint32_t signature = io_read_uint32_t_stream_reverse_endianness(s); +static void bone_database_modern_read_inner(bone_database* bone_data, stream& s, uint32_t header_length) { + uint32_t signature = s.read_uint32_t_reverse_endianness(); if (signature != 0x09102720) return; bool is_x = true; - io_set_position(s, 0x0C, SEEK_SET); - is_x &= io_read_uint32_t_stream_reverse_endianness(s) == 0; + s.set_position(0x0C, SEEK_SET); + is_x &= s.read_uint32_t_reverse_endianness() == 0; - io_set_position(s, 0x04, SEEK_SET); + s.set_position(0x04, SEEK_SET); - uint32_t skeleton_count = io_read_uint32_t_stream_reverse_endianness(s); - int64_t skeleton_offsets_offset = io_read_offset(s, header_length, is_x); - int64_t skeleton_name_offsets_offset = io_read_offset(s, header_length, is_x); + uint32_t skeleton_count = s.read_uint32_t_reverse_endianness(); + int64_t skeleton_offsets_offset = s.read_offset(header_length, is_x); + int64_t skeleton_name_offsets_offset = s.read_offset(header_length, is_x); bone_data->skeleton.resize(skeleton_count); - io_position_push(s, skeleton_offsets_offset, SEEK_SET); + s.position_push(skeleton_offsets_offset, SEEK_SET); for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skeleton = &bone_data->skeleton[i]; - int64_t skeleton_offset = io_read_offset(s, header_length, is_x); + bone_database_skeleton* skel = &bone_data->skeleton[i]; + int64_t skeleton_offset = s.read_offset(header_length, is_x); - io_position_push(s, skeleton_offset, SEEK_SET); + s.position_push(skeleton_offset, SEEK_SET); int64_t bones_offset; uint32_t position_count; int64_t positions_offset; @@ -755,159 +736,153 @@ static void bone_database_modern_read_inner(bone_database* bone_data, stream* s, int64_t motion_bone_names_offset; int64_t parent_indices_offset; if (!is_x) { - bones_offset = io_read_offset_f2(s, header_length); - position_count = io_read_uint32_t_stream_reverse_endianness(s); - positions_offset = io_read_offset_f2(s, header_length); - unknown_value_offset = io_read_offset_f2(s, header_length); - object_bone_count = io_read_uint32_t_stream_reverse_endianness(s); - object_bone_names_offset = io_read_offset_f2(s, header_length); - motion_bone_count = io_read_uint32_t_stream_reverse_endianness(s); - motion_bone_names_offset = io_read_offset_f2(s, header_length); - parent_indices_offset = io_read_offset_f2(s, header_length); - io_read(s, 0x14); + bones_offset = s.read_offset_f2(header_length); + position_count = s.read_uint32_t_reverse_endianness(); + positions_offset = s.read_offset_f2(header_length); + unknown_value_offset = s.read_offset_f2(header_length); + object_bone_count = s.read_uint32_t_reverse_endianness(); + object_bone_names_offset = s.read_offset_f2(header_length); + motion_bone_count = s.read_uint32_t_reverse_endianness(); + motion_bone_names_offset = s.read_offset_f2(header_length); + parent_indices_offset = s.read_offset_f2(header_length); + s.read(0x14); } else { - bones_offset = io_read_offset_x(s); - position_count = io_read_uint32_t_stream_reverse_endianness(s); - positions_offset = io_read_offset_x(s); - unknown_value_offset = io_read_offset_x(s); - object_bone_count = io_read_uint32_t_stream_reverse_endianness(s); - object_bone_names_offset = io_read_offset_x(s); - motion_bone_count = io_read_uint32_t_stream_reverse_endianness(s); - motion_bone_names_offset = io_read_offset_x(s); - parent_indices_offset = io_read_offset_x(s); - io_read(s, 0x28); + bones_offset = s.read_offset_x(); + position_count = s.read_uint32_t_reverse_endianness(); + positions_offset = s.read_offset_x(); + unknown_value_offset = s.read_offset_x(); + object_bone_count = s.read_uint32_t_reverse_endianness(); + object_bone_names_offset = s.read_offset_x(); + motion_bone_count = s.read_uint32_t_reverse_endianness(); + motion_bone_names_offset = s.read_offset_x(); + parent_indices_offset = s.read_offset_x(); + s.read(0x28); } uint32_t bone_count = 0; - io_position_push(s, bones_offset, SEEK_SET); + s.position_push(bones_offset, SEEK_SET); if (!is_x) while (true) { - if (io_read_uint8_t(s) == 0xFF) + if (s.read_uint8_t() == 0xFF) break; - io_read(s, 0x0B); + s.read(0x0B); bone_count++; } else while (true) { - if (io_read_uint8_t(s) == 0xFF) + if (s.read_uint8_t() == 0xFF) break; - io_read(s, 0x0F); + s.read(0x0F); bone_count++; } - io_position_pop(s); + s.position_pop(); - skeleton->bone.resize(bone_count); + skel->bone.resize(bone_count); - io_position_push(s, bones_offset, SEEK_SET); + s.position_push(bones_offset, SEEK_SET); if (!is_x) for (uint32_t j = 0; j < bone_count; j++) { - bone_database_bone* bone = &skeleton->bone[j]; - bone->type = (bone_database_bone_type)io_read_uint8_t(s); - bone->has_parent = io_read_uint8_t(s) ? true : false; - bone->parent = io_read_uint8_t(s); - bone->pole_target = io_read_uint8_t(s); - bone->mirror = io_read_uint8_t(s); - bone->disable_mot_anim = io_read_uint8_t(s); - io_read(s, 0x02); - io_read_string_null_terminated_offset(s, io_read_offset_f2(s, header_length), &bone->name); + bone_database_bone* bone = &skel->bone[j]; + bone->type = (bone_database_bone_type)s.read_uint8_t(); + bone->has_parent = s.read_uint8_t() ? true : false; + bone->parent = s.read_uint8_t(); + bone->pole_target = s.read_uint8_t(); + bone->mirror = s.read_uint8_t(); + bone->disable_mot_anim = s.read_uint8_t(); + s.read(0x02); + bone->name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length)); } else for (uint32_t j = 0; j < bone_count; j++) { - bone_database_bone* bone = &skeleton->bone[j]; - bone->type = (bone_database_bone_type)io_read_uint8_t(s); - bone->has_parent = io_read_uint8_t(s) ? true : false; - bone->parent = io_read_uint8_t(s); - bone->pole_target = io_read_uint8_t(s); - bone->mirror = io_read_uint8_t(s); - bone->disable_mot_anim = io_read_uint8_t(s); - io_read(s, 0x02); - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &bone->name); + bone_database_bone* bone = &skel->bone[j]; + bone->type = (bone_database_bone_type)s.read_uint8_t(); + bone->has_parent = s.read_uint8_t() ? true : false; + bone->parent = s.read_uint8_t(); + bone->pole_target = s.read_uint8_t(); + bone->mirror = s.read_uint8_t(); + bone->disable_mot_anim = s.read_uint8_t(); + s.read(0x02); + bone->name = s.read_string_null_terminated_offset(s.read_offset_x()); } - io_position_pop(s); + s.position_pop(); - skeleton->position.resize(position_count); + skel->position.resize(position_count); - io_position_push(s, positions_offset, SEEK_SET); + s.position_push(positions_offset, SEEK_SET); for (uint32_t j = 0; j < position_count; j++) { - vec3* position = &skeleton->position[j]; - position->x = io_read_float_t_stream_reverse_endianness(s); - position->y = io_read_float_t_stream_reverse_endianness(s); - position->z = io_read_float_t_stream_reverse_endianness(s); + vec3* position = &skel->position[j]; + position->x = s.read_float_t_reverse_endianness(); + position->y = s.read_float_t_reverse_endianness(); + position->z = s.read_float_t_reverse_endianness(); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, unknown_value_offset, SEEK_SET); - skeleton->heel_height = io_read_float_t_stream_reverse_endianness(s); - io_position_pop(s); + s.position_push(unknown_value_offset, SEEK_SET); + skel->heel_height = s.read_float_t_reverse_endianness(); + s.position_pop(); - skeleton->object_bone.resize(object_bone_count); + skel->object_bone.resize(object_bone_count); - io_position_push(s, object_bone_names_offset, SEEK_SET); + s.position_push(object_bone_names_offset, SEEK_SET); if (!is_x) - for (uint32_t j = 0; j < object_bone_count; j++) { - std::string* object_bone_name = &skeleton->object_bone[j]; - io_read_string_null_terminated_offset(s, io_read_offset_f2(s, header_length), object_bone_name); - } + for (uint32_t j = 0; j < object_bone_count; j++) + skel->object_bone[j] = s.read_string_null_terminated_offset( + s.read_offset_f2(header_length)); else - for (uint32_t j = 0; j < object_bone_count; j++) { - std::string* object_bone_name = &skeleton->object_bone[j]; - io_read_string_null_terminated_offset(s, io_read_offset_x(s), object_bone_name); - } - io_position_pop(s); + for (uint32_t j = 0; j < object_bone_count; j++) + skel->object_bone[j] = s.read_string_null_terminated_offset( + s.read_offset_x()); + s.position_pop(); - skeleton->motion_bone.resize(motion_bone_count); + skel->motion_bone.resize(motion_bone_count); - io_position_push(s, motion_bone_names_offset, SEEK_SET); + s.position_push(motion_bone_names_offset, SEEK_SET); if (!is_x) - for (uint32_t j = 0; j < motion_bone_count; j++) { - std::string* motion_bone_name = &skeleton->motion_bone[j]; - io_read_string_null_terminated_offset(s, io_read_offset_f2(s, header_length), motion_bone_name); - } + for (uint32_t j = 0; j < motion_bone_count; j++) + skel->motion_bone[j] = s.read_string_null_terminated_offset( + s.read_offset_f2(header_length)); else - for (uint32_t j = 0; j < motion_bone_count; j++) { - std::string* motion_bone_name = &skeleton->motion_bone[j]; - io_read_string_null_terminated_offset(s, io_read_offset_x(s), motion_bone_name); - } - io_position_pop(s); + for (uint32_t j = 0; j < motion_bone_count; j++) + skel->motion_bone[j] = s.read_string_null_terminated_offset( + s.read_offset_x()); + s.position_pop(); - skeleton->parent_index.resize(motion_bone_count); + skel->parent_index.resize(motion_bone_count); - io_position_push(s, parent_indices_offset, SEEK_SET); - io_read(s, skeleton->parent_index.data(), motion_bone_count * sizeof(uint16_t)); - if (s->is_big_endian) { - uint16_t* parent_indices = skeleton->parent_index.data(); + s.position_push(parent_indices_offset, SEEK_SET); + s.read(skel->parent_index.data(), motion_bone_count * sizeof(uint16_t)); + if (s.is_big_endian) { + uint16_t* parent_indices = skel->parent_index.data(); for (uint32_t j = 0; j < motion_bone_count; j++) parent_indices[j] = reverse_endianness_uint16_t(parent_indices[j]); } - io_position_pop(s); - io_position_pop(s); + s.position_pop(); + s.position_pop(); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, skeleton_name_offsets_offset, SEEK_SET); + s.position_push(skeleton_name_offsets_offset, SEEK_SET); if (!is_x) - for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skeleton = &bone_data->skeleton[i]; - io_read_string_null_terminated_offset(s, io_read_offset_f2(s, header_length), &skeleton->name); - } + for (uint32_t i = 0; i < skeleton_count; i++) + bone_data->skeleton[i].name = s.read_string_null_terminated_offset( + s.read_offset_f2(header_length)); else - for (uint32_t i = 0; i < skeleton_count; i++) { - bone_database_skeleton* skeleton = &bone_data->skeleton[i]; - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &skeleton->name); - } - io_position_pop(s); + for (uint32_t i = 0; i < skeleton_count; i++) + bone_data->skeleton[i].name = s.read_string_null_terminated_offset( + s.read_offset_x()); + s.position_pop(); bone_data->is_x = is_x; bone_data->modern = true; bone_data->ready = true; } -static void bone_database_modern_write_inner(bone_database* bone_data, stream* s) { +static void bone_database_modern_write_inner(bone_database* bone_data, stream& s) { stream s_bone; - io_open(&s_bone); + s_bone.open(); uint32_t off; enrs e; enrs_entry ee; @@ -1091,30 +1066,30 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s } } - io_write_int32_t(&s_bone, 0); - io_write_int32_t(&s_bone, 0); - io_write_offset_pof_add(&s_bone, 0, 0x40, is_x, &pof); - io_write_offset_pof_add(&s_bone, 0, 0x40, is_x, &pof); - io_align_write(&s_bone, 0x10); + s_bone.write_int32_t(0); + s_bone.write_int32_t(0); + io_write_offset_pof_add(s_bone, 0, 0x40, is_x, &pof); + io_write_offset_pof_add(s_bone, 0, 0x40, is_x, &pof); + s_bone.align_write(0x10); - int64_t skeleton_offsets_offset = io_get_position(&s_bone); + int64_t skeleton_offsets_offset = s_bone.get_position(); if (!is_x) for (bone_database_skeleton& i : bone_data->skeleton) - io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); + io_write_offset_f2_pof_add(s_bone, 0, 0x40, &pof); else { for (bone_database_skeleton& i : bone_data->skeleton) - io_write_offset_x_pof_add(&s_bone, 0, &pof); - io_align_write(&s_bone, 0x10); + io_write_offset_x_pof_add(s_bone, 0, &pof); + s_bone.align_write(0x10); } - int64_t skeleton_name_offsets_offset = io_get_position(&s_bone); + int64_t skeleton_name_offsets_offset = s_bone.get_position(); if (!is_x) for (bone_database_skeleton& i : bone_data->skeleton) - io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); + io_write_offset_f2_pof_add(s_bone, 0, 0x40, &pof); else { for (bone_database_skeleton& i : bone_data->skeleton) - io_write_offset_x_pof_add(&s_bone, 0, &pof); - io_align_write(&s_bone, 0x10); + io_write_offset_x_pof_add(s_bone, 0, &pof); + s_bone.align_write(0x10); } bone_database_skeleton_header* skh = force_malloc_s(bone_database_skeleton_header, skeleton_count); @@ -1128,61 +1103,61 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s uint32_t object_bone_count = (uint32_t)skel->object_bone.size(); uint32_t motion_bone_count = (uint32_t)skel->motion_bone.size(); - skh[i].offset = io_get_position(&s_bone); - io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); - io_write_uint32_t(&s_bone, 0); - io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); - io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); - io_write_uint32_t(&s_bone, 0); - io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); - io_write_uint32_t(&s_bone, 0); - io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); - io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); - io_write(&s_bone, 0x14); + skh[i].offset = s_bone.get_position(); + io_write_offset_f2_pof_add(s_bone, 0, 0x40, &pof); + s_bone.write_uint32_t(0); + io_write_offset_f2_pof_add(s_bone, 0, 0x40, &pof); + io_write_offset_f2_pof_add(s_bone, 0, 0x40, &pof); + s_bone.write_uint32_t(0); + io_write_offset_f2_pof_add(s_bone, 0, 0x40, &pof); + s_bone.write_uint32_t(0); + io_write_offset_f2_pof_add(s_bone, 0, 0x40, &pof); + io_write_offset_f2_pof_add(s_bone, 0, 0x40, &pof); + s_bone.write(0x14); - skh[i].bones_offset = io_get_position(&s_bone); + skh[i].bones_offset = s_bone.get_position(); for (bone_database_bone& j : skel->bone) { - io_write(&s_bone, 0x08); - io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); + s_bone.write(0x08); + io_write_offset_f2_pof_add(s_bone, 0, 0x40, &pof); } - io_write(&s_bone, 0x08); - io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); - io_align_write(&s_bone, 0x10); + s_bone.write(0x08); + io_write_offset_f2_pof_add(s_bone, 0, 0x40, &pof); + s_bone.align_write(0x10); - skh[i].positions_offset = io_get_position(&s_bone); - io_write(&s_bone, sizeof(vec3) * position_count); - io_align_write(&s_bone, 0x10); + skh[i].positions_offset = s_bone.get_position(); + s_bone.write(sizeof(vec3) * position_count); + s_bone.align_write(0x10); - skh[i].unknown_value_offset = io_get_position(&s_bone); - io_write_float_t(&s_bone, 0.0f); + skh[i].unknown_value_offset = s_bone.get_position(); + s_bone.write_float_t(0.0f); - skh[i].object_bone_names_offset = io_get_position(&s_bone); + skh[i].object_bone_names_offset = s_bone.get_position(); for (std::string& j : skel->object_bone) - io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); + io_write_offset_f2_pof_add(s_bone, 0, 0x40, &pof); - skh[i].motion_bone_names_offset = io_get_position(&s_bone); + skh[i].motion_bone_names_offset = s_bone.get_position(); for (std::string& j : skel->motion_bone) - io_write_offset_f2_pof_add(&s_bone, 0, 0x40, &pof); + io_write_offset_f2_pof_add(s_bone, 0, 0x40, &pof); - skh[i].parent_indices_offset = io_get_position(&s_bone); - io_write(&s_bone, sizeof(uint16_t) * motion_bone_count); - io_align_write(&s_bone, 0x04); + skh[i].parent_indices_offset = s_bone.get_position(); + s_bone.write(sizeof(uint16_t) * motion_bone_count); + s_bone.align_write(0x04); } else { for (uint32_t i = 0; i < skeleton_count; i++) { - skh[i].offset = io_get_position(&s_bone); - io_write_offset_x_pof_add(&s_bone, 0, &pof); - io_write_uint32_t(&s_bone, 0); - io_write_offset_x_pof_add(&s_bone, 0, &pof); - io_write_offset_x_pof_add(&s_bone, 0, &pof); - io_write_uint32_t(&s_bone, 0); - io_write_offset_x_pof_add(&s_bone, 0, &pof); - io_write_uint32_t(&s_bone, 0); - io_write_offset_x_pof_add(&s_bone, 0, &pof); - io_write_offset_x_pof_add(&s_bone, 0, &pof); - io_write(&s_bone, 0x28); - io_align_write(&s_bone, 0x10); + skh[i].offset = s_bone.get_position(); + io_write_offset_x_pof_add(s_bone, 0, &pof); + s_bone.write_uint32_t(0); + io_write_offset_x_pof_add(s_bone, 0, &pof); + io_write_offset_x_pof_add(s_bone, 0, &pof); + s_bone.write_uint32_t(0); + io_write_offset_x_pof_add(s_bone, 0, &pof); + s_bone.write_uint32_t(0); + io_write_offset_x_pof_add(s_bone, 0, &pof); + io_write_offset_x_pof_add(s_bone, 0, &pof); + s_bone.write(0x28); + s_bone.align_write(0x10); } for (uint32_t i = 0; i < skeleton_count; i++) { @@ -1193,37 +1168,37 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s uint32_t object_bone_count = (uint32_t)skel->object_bone.size(); uint32_t motion_bone_count = (uint32_t)skel->motion_bone.size(); - skh[i].bones_offset = io_get_position(&s_bone); + skh[i].bones_offset = s_bone.get_position(); for (bone_database_bone& j : skel->bone) { - io_write(&s_bone, 0x08); - io_write_offset_x_pof_add(&s_bone, 0, &pof); + s_bone.write(0x08); + io_write_offset_x_pof_add(s_bone, 0, &pof); } - io_write(&s_bone, 0x08); - io_write_offset_x_pof_add(&s_bone, 0, &pof); - io_align_write(&s_bone, 0x10); + s_bone.write(0x08); + io_write_offset_x_pof_add(s_bone, 0, &pof); + s_bone.align_write(0x10); - skh[i].positions_offset = io_get_position(&s_bone); - io_write(&s_bone, sizeof(vec3) * position_count); - io_align_write(&s_bone, 0x10); + skh[i].positions_offset = s_bone.get_position(); + s_bone.write(&s_bone, sizeof(vec3) * position_count); + s_bone.align_write(0x10); - skh[i].unknown_value_offset = io_get_position(&s_bone); - io_write_float_t(&s_bone, 0.0f); - io_align_write(&s_bone, 0x10); + skh[i].unknown_value_offset = s_bone.get_position(); + s_bone.write_float_t(0.0f); + s_bone.align_write(0x10); - skh[i].object_bone_names_offset = io_get_position(&s_bone); + skh[i].object_bone_names_offset = s_bone.get_position(); for (std::string& j : skel->object_bone) - io_write_offset_x_pof_add(&s_bone, 0, &pof); - io_align_write(&s_bone, 0x10); + io_write_offset_x_pof_add(s_bone, 0, &pof); + s_bone.align_write(0x10); - skh[i].motion_bone_names_offset = io_get_position(&s_bone); + skh[i].motion_bone_names_offset = s_bone.get_position(); for (std::string& j : skel->motion_bone) - io_write_offset_x_pof_add(&s_bone, 0, &pof); - io_align_write(&s_bone, 0x10); + io_write_offset_x_pof_add(s_bone, 0, &pof); + s_bone.align_write(0x10); - skh[i].parent_indices_offset = io_get_position(&s_bone); - io_write(&s_bone, sizeof(uint16_t) * motion_bone_count); - io_align_write(&s_bone, 0x10); + skh[i].parent_indices_offset = s_bone.get_position(); + s_bone.write(sizeof(uint16_t) * motion_bone_count); + s_bone.align_write(0x10); } } @@ -1235,8 +1210,8 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s bone_database_skeleton* skel = &bone_data->skeleton[i]; if (bone_database_strings_push_back_check(strings, skel->name.c_str())) { - string_offsets.push_back(io_get_position(&s_bone)); - io_write_utf8_string_null_terminated(&s_bone, skel->name.c_str()); + string_offsets.push_back(s_bone.get_position()); + s_bone.write_utf8_string_null_terminated(skel->name.c_str()); } } @@ -1245,25 +1220,25 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s for (bone_database_bone& j : skel->bone) if (bone_database_strings_push_back_check(strings, j.name.c_str())) { - string_offsets.push_back(io_get_position(&s_bone)); - io_write_string_null_terminated(&s_bone, &j.name); + string_offsets.push_back(s_bone.get_position()); + s_bone.write_string_null_terminated(j.name); } if (bone_database_strings_push_back_check(strings, "End")) { - string_offsets.push_back(io_get_position(&s_bone)); - io_write_utf8_string_null_terminated(&s_bone, "End"); + string_offsets.push_back(s_bone.get_position()); + s_bone.write_utf8_string_null_terminated("End"); } for (std::string& j : skel->object_bone) if (bone_database_strings_push_back_check(strings, j.c_str())) { - string_offsets.push_back(io_get_position(&s_bone)); - io_write_string_null_terminated(&s_bone, &j); + string_offsets.push_back(s_bone.get_position()); + s_bone.write_string_null_terminated(j); } for (std::string& j : skel->motion_bone) if (bone_database_strings_push_back_check(strings, j.c_str())) { - string_offsets.push_back(io_get_position(&s_bone)); - io_write_string_null_terminated(&s_bone, &j); + string_offsets.push_back(s_bone.get_position()); + s_bone.write_string_null_terminated(j); } } @@ -1272,11 +1247,11 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s bone_database_skeleton* skel = &bone_data->skeleton[i]; if (bone_database_strings_push_back_check(strings, skel->name.c_str())) { - string_offsets.push_back(io_get_position(&s_bone)); - io_write_utf8_string_null_terminated(&s_bone, skel->name.c_str()); + string_offsets.push_back(s_bone.get_position()); + s_bone.write_utf8_string_null_terminated(skel->name.c_str()); } } - io_align_write(&s_bone, 0x10); + s_bone.align_write(0x10); for (uint32_t i = 0; i < skeleton_count; i++) { bone_database_skeleton* skel = &bone_data->skeleton[i]; @@ -1286,141 +1261,140 @@ static void bone_database_modern_write_inner(bone_database* bone_data, stream* s uint32_t object_bone_count = (uint32_t)skel->object_bone.size(); uint32_t motion_bone_count = (uint32_t)skel->motion_bone.size(); - io_position_push(&s_bone, skh[i].offset, SEEK_SET); + s_bone.position_push(skh[i].offset, SEEK_SET); if (!is_x) { - io_write_offset_f2(&s_bone, skh[i].bones_offset, 0x40); - io_write_uint32_t(&s_bone, position_count); - io_write_offset_f2(&s_bone, skh[i].positions_offset, 0x40); - io_write_offset_f2(&s_bone, skh[i].unknown_value_offset, 0x40); - io_write_uint32_t(&s_bone, object_bone_count); - io_write_offset_f2(&s_bone, skh[i].object_bone_names_offset, 0x40); - io_write_uint32_t(&s_bone, motion_bone_count); - io_write_offset_f2(&s_bone, skh[i].motion_bone_names_offset, 0x40); - io_write_offset_f2(&s_bone, skh[i].parent_indices_offset, 0x40); - io_write(&s_bone, 0x14); + s_bone.write_offset_f2(skh[i].bones_offset, 0x40); + s_bone.write_uint32_t(position_count); + s_bone.write_offset_f2(skh[i].positions_offset, 0x40); + s_bone.write_offset_f2(skh[i].unknown_value_offset, 0x40); + s_bone.write_uint32_t(object_bone_count); + s_bone.write_offset_f2(skh[i].object_bone_names_offset, 0x40); + s_bone.write_uint32_t(motion_bone_count); + s_bone.write_offset_f2(skh[i].motion_bone_names_offset, 0x40); + s_bone.write_offset_f2(skh[i].parent_indices_offset, 0x40); + s_bone.write(0x14); } else { - io_write_offset_x(&s_bone, skh[i].bones_offset); - io_write_uint32_t(&s_bone, position_count); - io_write_offset_x(&s_bone, skh[i].positions_offset); - io_write_offset_x(&s_bone, skh[i].unknown_value_offset); - io_write_uint32_t(&s_bone, object_bone_count); - io_write_offset_x(&s_bone, skh[i].object_bone_names_offset); - io_write_uint32_t(&s_bone, motion_bone_count); - io_write_offset_x(&s_bone, skh[i].motion_bone_names_offset); - io_write_offset_x(&s_bone, skh[i].parent_indices_offset); - io_write(&s_bone, 0x28); + s_bone.write_offset_x(skh[i].bones_offset); + s_bone.write_uint32_t(position_count); + s_bone.write_offset_x(skh[i].positions_offset); + s_bone.write_offset_x(skh[i].unknown_value_offset); + s_bone.write_uint32_t(object_bone_count); + s_bone.write_offset_x(skh[i].object_bone_names_offset); + s_bone.write_uint32_t(motion_bone_count); + s_bone.write_offset_x(skh[i].motion_bone_names_offset); + s_bone.write_offset_x(skh[i].parent_indices_offset); + s_bone.write(0x28); } - io_position_pop(&s_bone); + s_bone.position_pop(); - io_position_push(&s_bone, skh[i].bones_offset, SEEK_SET); + s_bone.position_push(skh[i].bones_offset, SEEK_SET); if (!is_x) for (bone_database_bone& j : skel->bone) { - io_write_uint8_t(&s_bone, (uint8_t)j.type); - io_write_uint8_t(&s_bone, j.has_parent ? 1 : 0); - io_write_uint8_t(&s_bone, j.parent); - io_write_uint8_t(&s_bone, j.pole_target); - io_write_uint8_t(&s_bone, j.mirror); - io_write_uint8_t(&s_bone, j.disable_mot_anim); - io_write(&s_bone, 0x02); - io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(strings, + s_bone.write_uint8_t((uint8_t)j.type); + s_bone.write_uint8_t(j.has_parent ? 1 : 0); + s_bone.write_uint8_t(j.parent); + s_bone.write_uint8_t(j.pole_target); + s_bone.write_uint8_t(j.mirror); + s_bone.write_uint8_t(j.disable_mot_anim); + s_bone.write(0x02); + s_bone.write_offset_f2(bone_database_strings_get_string_offset(strings, string_offsets, j.name.c_str()), 0x40); } else for (bone_database_bone& j : skel->bone) { - io_write_uint8_t(&s_bone, (uint8_t)j.type); - io_write_uint8_t(&s_bone, j.has_parent ? 1 : 0); - io_write_uint8_t(&s_bone, j.parent); - io_write_uint8_t(&s_bone, j.pole_target); - io_write_uint8_t(&s_bone, j.mirror); - io_write_uint8_t(&s_bone, j.disable_mot_anim); - io_write(&s_bone, 0x02); - io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(strings, + s_bone.write_uint8_t((uint8_t)j.type); + s_bone.write_uint8_t(j.has_parent ? 1 : 0); + s_bone.write_uint8_t(j.parent); + s_bone.write_uint8_t(j.pole_target); + s_bone.write_uint8_t(j.mirror); + s_bone.write_uint8_t(j.disable_mot_anim); + s_bone.write(&s_bone, 0x02); + s_bone.write_offset_x(bone_database_strings_get_string_offset(strings, string_offsets, j.name.c_str())); } if (!is_x) { - io_write_uint32_t(&s_bone, 0xFF); - io_write_uint32_t(&s_bone, 0xFF); - io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(strings, + s_bone.write_uint32_t(0xFF); + s_bone.write_uint32_t(0xFF); + s_bone.write_offset_f2(bone_database_strings_get_string_offset(strings, string_offsets, "End"), 0x40); } else { - - io_write_uint32_t(&s_bone, 0xFF); - io_write_uint32_t(&s_bone, 0xFF); - io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(strings, + s_bone.write_uint32_t(0xFF); + s_bone.write_uint32_t(0xFF); + s_bone.write_offset_x(bone_database_strings_get_string_offset(strings, string_offsets, "End")); } - io_position_pop(&s_bone); + s_bone.position_pop(); - io_position_push(&s_bone, skh[i].positions_offset, SEEK_SET); - io_write(&s_bone, skel->position.data(), sizeof(vec3)* position_count); - io_position_pop(&s_bone); + s_bone.position_push(skh[i].positions_offset, SEEK_SET); + s_bone.write(skel->position.data(), sizeof(vec3)* position_count); + s_bone.position_pop(); - io_position_push(&s_bone, skh[i].unknown_value_offset, SEEK_SET); - io_write_float_t(&s_bone, skel->heel_height); - io_position_pop(&s_bone); + s_bone.position_push(skh[i].unknown_value_offset, SEEK_SET); + s_bone.write_float_t(skel->heel_height); + s_bone.position_pop(); - io_position_push(&s_bone, skh[i].object_bone_names_offset, SEEK_SET); + s_bone.position_push(skh[i].object_bone_names_offset, SEEK_SET); if (!is_x) for (std::string& j : skel->object_bone) - io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(strings, + s_bone.write_offset_f2(bone_database_strings_get_string_offset(strings, string_offsets, j.c_str()), 0x40); else for (std::string& j : skel->object_bone) - io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(strings, + s_bone.write_offset_x(bone_database_strings_get_string_offset(strings, string_offsets, j.c_str())); - io_position_push(&s_bone, skh[i].motion_bone_names_offset, SEEK_SET); + s_bone.position_push(skh[i].motion_bone_names_offset, SEEK_SET); if (!is_x) for (std::string& j : skel->motion_bone) - io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(strings, + s_bone.write_offset_f2(bone_database_strings_get_string_offset(strings, string_offsets, j.c_str()), 0x40); else for (std::string& j : skel->motion_bone) - io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(strings, + s_bone.write_offset_x(bone_database_strings_get_string_offset(strings, string_offsets, j.c_str())); - io_position_pop(&s_bone); + s_bone.position_pop(); - io_position_push(&s_bone, skh[i].parent_indices_offset, SEEK_SET); - io_write(&s_bone, skel->parent_index.data(), sizeof(uint16_t) * motion_bone_count); - io_position_pop(&s_bone); + s_bone.position_push(skh[i].parent_indices_offset, SEEK_SET); + s_bone.write(skel->parent_index.data(), sizeof(uint16_t) * motion_bone_count); + s_bone.position_pop(); } - io_position_push(&s_bone, 0x00, SEEK_SET); - io_write_uint32_t(&s_bone, 0x09102720); - io_write_uint32_t(&s_bone, skeleton_count); - io_write_offset(&s_bone, skeleton_offsets_offset, 0x40, is_x); - io_write_offset(&s_bone, skeleton_name_offsets_offset, 0x40, is_x); - io_position_pop(&s_bone); + s_bone.position_push(0x00, SEEK_SET); + s_bone.write_uint32_t(0x09102720); + s_bone.write_uint32_t(skeleton_count); + s_bone.write_offset(skeleton_offsets_offset, 0x40, is_x); + s_bone.write_offset(skeleton_name_offsets_offset, 0x40, is_x); + s_bone.position_pop(); - io_position_push(&s_bone, skeleton_offsets_offset, SEEK_SET); + s_bone.position_push(skeleton_offsets_offset, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < skeleton_count; i++) - io_write_offset_f2(&s_bone, skh[i].offset, 0x40); + s_bone.write_offset_f2(skh[i].offset, 0x40); else for (uint32_t i = 0; i < skeleton_count; i++) - io_write_offset_x(&s_bone, skh[i].offset); - io_position_pop(&s_bone); + s_bone.write_offset_x(skh[i].offset); + s_bone.position_pop(); - io_position_push(&s_bone, skeleton_name_offsets_offset, SEEK_SET); + s_bone.position_push(skeleton_name_offsets_offset, SEEK_SET); if (!is_x) for (bone_database_skeleton& i : bone_data->skeleton) - io_write_offset_f2(&s_bone, bone_database_strings_get_string_offset(strings, + s_bone.write_offset_f2(bone_database_strings_get_string_offset(strings, string_offsets, i.name.c_str()), 0x40); else for (bone_database_skeleton& i : bone_data->skeleton) - io_write_offset_x(&s_bone, bone_database_strings_get_string_offset(strings, + s_bone.write_offset_x(bone_database_strings_get_string_offset(strings, string_offsets, i.name.c_str())); - io_position_pop(&s_bone); + s_bone.position_pop(); free(skh); f2_struct st; - io_align_write(&s_bone, 0x10); - io_copy(&s_bone, &st.data); - io_free(&s_bone); + s_bone.align_write(0x10); + s_bone.copy(st.data); + s_bone.close(); st.enrs = e; st.pof = pof; diff --git a/src/KKdLib/database/bone.hpp b/src/KKdLib/database/bone.hpp index 1e830b73..6f170fde 100644 --- a/src/KKdLib/database/bone.hpp +++ b/src/KKdLib/database/bone.hpp @@ -7,8 +7,8 @@ #include #include -#include "../default.h" -#include "../vec.h" +#include "../default.hpp" +#include "../vec.hpp" enum bone_database_bone_type { BONE_DATABASE_BONE_ROTATION = 0x00, diff --git a/src/KKdLib/database/item_table.cpp b/src/KKdLib/database/item_table.cpp index e0492b34..8e3fec4b 100644 --- a/src/KKdLib/database/item_table.cpp +++ b/src/KKdLib/database/item_table.cpp @@ -4,16 +4,14 @@ */ #include "item_table.hpp" -#include "../io/path.h" -#include "../io/stream.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" #include "../key_val.hpp" #include "../sort.hpp" -#include "../str_utils.h" +#include "../str_utils.hpp" -#define ITEM_TABLE_TEXT_BUF_SIZE 0x400 - -static void itm_table_read_inner(itm_table* itm_tbl, stream* s); -static void itm_table_write_inner(itm_table* itm_tbl, stream* s); +static void itm_table_read_inner(itm_table* itm_tbl, stream& s); +static void itm_table_write_inner(itm_table* itm_tbl, stream& s); static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t size); static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* size); @@ -32,10 +30,9 @@ void itm_table::read(const char* path) { char* path_bin = str_utils_add(path, ".txt"); if (path_check_file_exists(path_bin)) { stream s; - io_open(&s, path_bin, "rb"); + s.open(path_bin, "rb"); if (s.io.stream) - itm_table_read_inner(this, &s); - io_free(&s); + itm_table_read_inner(this, s); } free(path_bin); } @@ -47,10 +44,9 @@ void itm_table::read(const wchar_t* path) { wchar_t* path_bin = str_utils_add(path, L".txt"); if (path_check_file_exists(path_bin)) { stream s; - io_open(&s, path_bin, L"rb"); + s.open(path_bin, L"rb"); if (s.io.stream) - itm_table_read_inner(this, &s); - io_free(&s); + itm_table_read_inner(this, s); } free(path_bin); } @@ -60,9 +56,8 @@ void itm_table::read(const void* data, size_t size) { return; stream s; - io_open(&s, data, size); - itm_table_read_inner(this, &s); - io_free(&s); + s.open(data, size); + itm_table_read_inner(this, s); } void itm_table::write(const char* path) { @@ -71,10 +66,9 @@ void itm_table::write(const char* path) { char* path_bin = str_utils_add(path, ".txt"); stream s; - io_open(&s, path_bin, "wb"); + s.open(path_bin, "wb"); if (s.io.stream) - itm_table_write_inner(this, &s); - io_free(&s); + itm_table_write_inner(this, s); free(path_bin); } @@ -84,10 +78,9 @@ void itm_table::write(const wchar_t* path) { wchar_t* path_bin = str_utils_add(path, L".txt"); stream s; - io_open(&s, path_bin, L"wb"); + s.open(path_bin, L"wb"); if (s.io.stream) - itm_table_write_inner(this, &s); - io_free(&s); + itm_table_write_inner(this, s); free(path_bin); } @@ -96,10 +89,9 @@ void itm_table::write(void** data, size_t* size) { return; stream s; - io_open(&s); - itm_table_write_inner(this, &s); - io_copy(&s, data, size); - io_free(&s); + s.open(); + itm_table_write_inner(this, s); + s.copy(data, size); } bool itm_table::load_file(void* data, const char* path, const char* file, uint32_t hash) { @@ -121,7 +113,7 @@ const char* chara_index_get_auth_3d_name(chara_index chara_index) { if (chara_index < CHARA_MIKU || chara_index > CHARA_TETO) return 0; - const char* chara_names[] = { + static const char* chara_names[] = { "MIK", "RIN", "LEN", @@ -142,7 +134,7 @@ 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[] = { + static const char* chara_names[] = { "MIK", "RIN", "LEN", @@ -163,7 +155,7 @@ 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[] = { + static const char* chara_names[] = { "MIK", "RIN", "LEN", @@ -180,11 +172,35 @@ const char* chara_index_get_face_mot_name(chara_index chara_index) { return chara_names[chara_index]; } +chara_index chara_index_get_from_chara_name(const char* str) { + if (!str) + return CHARA_MAX; + + static const char* chara_names[] = { + "MIK", + "RIN", + "LEN", + "LUK", + "NER", + "HAK", + "KAI", + "MEI", + "SAK", + "TET", + "EXT", + }; + + for (int32_t i = CHARA_MIKU; i < CHARA_MAX; i++) + if (!str_utils_compare(str, chara_names[i])) + return (chara_index)i; + return CHARA_MAX; +} + 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[] = { + static const char* chara_names[] = { "MIKU", "RIN", "LEN", @@ -258,630 +274,507 @@ itm_table_dbgset::~itm_table_dbgset() { } -static void itm_table_read_inner(itm_table* itm_tbl, stream* s) { - void* itm_tbl_data = force_malloc(s->length); - io_read(s, itm_tbl_data, s->length); - itm_table_read_text(itm_tbl, itm_tbl_data, s->length); +static void itm_table_read_inner(itm_table* itm_tbl, stream& s) { + void* itm_tbl_data = force_malloc(s.length); + s.read(itm_tbl_data, s.length); + itm_table_read_text(itm_tbl, itm_tbl_data, s.length); free(itm_tbl_data); itm_tbl->ready = true; } -static void itm_table_write_inner(itm_table* itm_tbl, stream* s) { +static void itm_table_write_inner(itm_table* itm_tbl, stream& s) { void* itm_tbl_data = 0; size_t itm_tbl_data_length = 0; itm_table_write_text(itm_tbl, &itm_tbl_data, &itm_tbl_data_length); - io_write(s, itm_tbl_data, itm_tbl_data_length); + s.write(itm_tbl_data, itm_tbl_data_length); free(itm_tbl_data); } static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t size) { - char buf[ITEM_TABLE_TEXT_BUF_SIZE]; - int32_t count; - int32_t count1; - size_t len; - size_t len1; - size_t len2; - size_t len3; - size_t len4; - size_t off; - key_val kv; - kv.parse((uint8_t*)data, size); - key_val lkv; - - len = 3; - memcpy(buf, "cos", 3); - off = len; + kv.parse(data, size); itm_tbl->item.clear(); - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("cos", &lkv)) { + int32_t count; + if (kv.read("cos", "length", count)) { std::vector& vc = itm_tbl->cos; vc.resize(count); for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope(i)) + continue; + itm_table_cos* c = &vc[i]; - len1 = sprintf_s(buf + len, ITEM_TABLE_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + kv.read("id", c->id); - lkv.read_int32_t( - buf, off, ".id", 4, &c->id); - - len2 = 5; - memcpy(buf + len + len1, ".item", 5); - off = len + len1 + len2; - - if (off >= 0 && off < ITEM_TABLE_TEXT_BUF_SIZE) - buf[off] = 0; - key_val sub_local_key_val; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { + int32_t count; + if (kv.read("item", "length", count)) { std::vector& vci = c->item; - vci.resize(count1); - for (int32_t j = 0; j < count1; j++) { - len3 = sprintf_s(buf + len + len1 + len2, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); - off = len + len1 + len2 + len3; + vci.resize(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) + continue; - sub_local_key_val.read_int32_t( - buf, off, "", 1, &vci[j]); + kv.read(vci[j]); + kv.close_scope(); } + kv.close_scope(); } + kv.close_scope(); } + kv.close_scope(); } - len = 6; - memcpy(buf, "dbgset", 6); - off = len; - itm_tbl->dbgset.clear(); - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("dbgset", &lkv)) { + if (kv.read("dbgset", "length", count)) { std::vector& vd = itm_tbl->dbgset; vd.resize(count); for (int32_t i = 0; i < count; i++) { + if (!kv.open_scope(i)) + continue; + itm_table_dbgset* d = &vd[i]; - len1 = sprintf_s(buf + len, ITEM_TABLE_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; - - len2 = 5; - memcpy(buf + len + len1, ".item", 5); - off = len + len1 + len2; - - if (off >= 0 && off < ITEM_TABLE_TEXT_BUF_SIZE) - buf[off] = 0; - key_val sub_local_key_val; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { + int32_t count; + if (kv.read("item", "length", count)) { std::vector& vdi = d->item; - vdi.resize(count1); - for (int32_t j = 0; j < count1; j++) { - len3 = sprintf_s(buf + len + len1 + len2, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); - off = len + len1 + len2 + len3; + vdi.resize(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) + continue; - sub_local_key_val.read_int32_t( - buf, off, "", 1, &vdi[j]); + kv.read(vdi[j]); + kv.close_scope(); } + kv.close_scope(); } - off = len + len1; - lkv.read_string( - buf, off, ".name", 6, &d->name); + kv.read("name", d->name); + kv.close_scope(); } + kv.close_scope(); } - len = 4; - memcpy(buf, "item", 4); - off = len; - itm_tbl->item.clear(); - if (kv.read_int32_t(buf, off, ".length", 8, &count) - && kv.get_local_key_val("item", &lkv)) { + if (kv.read("item", "length", count)) { std::vector& vi = itm_tbl->item; vi.reserve(count); for (int32_t i = 0; i < count; i++) { - - len1 = sprintf_s(buf + len, ITEM_TABLE_TEXT_BUF_SIZE - len, ".%d", i); - off = len + len1; + if (!kv.open_scope(i)) + continue; itm_table_item itm; - if (!lkv.read_int32_t(buf, off, ".no", 4, &itm.no)) + if (!kv.read("no", itm.no)) { + kv.close_scope(); continue; + } - if (!lkv.read_int32_t( - buf, off, ".flag", 6, &itm.flag) - || !lkv.read_string( - buf, off, ".name", 6, &itm.name)) + if (!kv.read("flag", itm.flag) + || !kv.read("name", itm.name)) { + kv.close_scope(); continue; + } - len2 = 7; - memcpy(buf + len + len1, ".objset", 7); - off = len + len1 + len2; - - if (off >= 0 && off < ITEM_TABLE_TEXT_BUF_SIZE) - buf[off] = 0; - key_val sub_local_key_val; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { + int32_t count; + if (kv.read("objset", "length", count)) { std::vector& vio = itm.objset; - vio.resize(count1); - for (int32_t j = 0; j < count1; j++) { - len3 = sprintf_s(buf + len + len1 + len2, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2, ".%d", j); - off = len + len1 + len2 + len3; - - sub_local_key_val.read_string( - buf, off, "", 1, &vio[j]); - } - } - - off = len + len1; - if (!lkv.read_int32_t( - buf, off, ".type", 6, &itm.type) - || !lkv.read_int32_t( - buf, off, ".attr", 6, &itm.attr) - || !lkv.read_int32_t( - buf, off, ".des_id", 8, &itm.des_id) - || !lkv.read_int32_t( - buf, off, ".sub_id", 8, (int32_t*)&itm.sub_id)) - continue; - - len2 = 5; - memcpy(buf + len + len1, ".data", 5); - off = len + len1 + len2; - - len3 = 4; - memcpy(buf + len + len1 + len2, ".obj", 4); - off = len + len1 + len2 + len3; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { - std::vector& vido = itm.data.obj; - - vido.reserve(count1); - for (int32_t j = 0; j < count1; j++) { - - len4 = sprintf_s(buf + len + len1 + len2 + len3, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2 - len3, ".%d", j); - off = len + len1 + len2 + len3 + len4; - - itm_table_item_data_obj obj; - sub_local_key_val.read_int32_t( - buf, off, ".rpk", 5, (int32_t*)&obj.rpk); - sub_local_key_val.read_string( - buf, off, ".uid", 5, &obj.uid); - vido.push_back(obj); - } - } - - len3 = 4; - memcpy(buf + len + len1 + len2, ".ofs", 4); - off = len + len1 + len2 + len3; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { - std::vector& vido = itm.data.ofs; - - vido.reserve(count1); - for (int32_t j = 0; j < count1; j++) { - len4 = sprintf_s(buf + len + len1 + len2 + len3, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2 - len3, ".%d", j); - off = len + len1 + len2 + len3 + len4; - - itm_table_item_data_ofs ofs; - if (sub_local_key_val.read_int32_t( - buf, off, ".no", 4, &ofs.no) - && sub_local_key_val.read_int32_t( - buf, off, ".sub_id", 8, (int32_t*)&ofs.sub_id) - && sub_local_key_val.read_float_t( - buf, off, ".tx", 4, &ofs.position.x) - && sub_local_key_val.read_float_t( - buf, off, ".ty", 4, &ofs.position.y) - && sub_local_key_val.read_float_t( - buf, off, ".tz", 4, &ofs.position.z) - && sub_local_key_val.read_float_t( - buf, off, ".rx", 4, &ofs.rotation.x) - && sub_local_key_val.read_float_t( - buf, off, ".ry", 4, &ofs.rotation.y) - && sub_local_key_val.read_float_t( - buf, off, ".rz", 4, &ofs.rotation.z) - && sub_local_key_val.read_float_t( - buf, off, ".sx", 4, &ofs.scale.x) - && sub_local_key_val.read_float_t( - buf, off, ".sy", 4, &ofs.scale.y) - && sub_local_key_val.read_float_t( - buf, off, ".sz", 4, &ofs.scale.z)) - vido.push_back(ofs); - } - } - - len3 = 4; - memcpy(buf + len + len1 + len2, ".tex", 4); - off = len + len1 + len2 + len3; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { - std::vector& vidt = itm.data.tex; - - vidt.reserve(count1); - for (int32_t j = 0; j < count1; j++) { - len4 = sprintf_s(buf + len + len1 + len2 + len3, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2 - len3, ".%d", j); - off = len + len1 + len2 + len3 + len4; - - itm_table_item_data_tex tex; - sub_local_key_val.read_string( - buf, off, ".org", 5, &tex.org); - sub_local_key_val.read_string( - buf, off, ".chg", 5, &tex.chg); - vidt.push_back(tex); - } - } - - len3 = 4; - memcpy(buf + len + len1 + len2, ".col", 4); - off = len + len1 + len2 + len3; - if (lkv.read_int32_t(buf, off, ".length", 8, &count1) - && lkv.get_local_key_val(buf, &sub_local_key_val)) { - std::vector& vidc = itm.data.col; - - vidc.reserve(count1); - for (int32_t j = 0; j < count1; j++) { - len4 = sprintf_s(buf + len + len1 + len2 + len3, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2 - len3, ".%d", j); - off = len + len1 + len2 + len3 + len4; - - itm_table_item_data_col col; - sub_local_key_val.read_string( - buf, off, ".tex", 5, &col.tex); - sub_local_key_val.read_int32_t( - buf, off, ".flag", 6, &col.flag); - - if (~col.flag & 0x01) { - vidc.push_back(col); + vio.resize(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) continue; - } - sub_local_key_val.read_float_t( - buf, off, ".blend.0", 9, &col.col_tone.blend.x); - sub_local_key_val.read_float_t( - buf, off, ".blend.1", 9, &col.col_tone.blend.y); - sub_local_key_val.read_float_t( - buf, off, ".blend.2", 9, &col.col_tone.blend.z); - sub_local_key_val.read_float_t( - buf, off, ".offset.0", 10, &col.col_tone.offset.x); - sub_local_key_val.read_float_t( - buf, off, ".offset.1", 10, &col.col_tone.offset.y); - sub_local_key_val.read_float_t( - buf, off, ".offset.2", 10, &col.col_tone.offset.z); - sub_local_key_val.read_float_t( - buf, off, ".hue", 5, &col.col_tone.hue); - sub_local_key_val.read_float_t( - buf, off, ".saturation", 12, &col.col_tone.saturation); - sub_local_key_val.read_float_t( - buf, off, ".value", 7, &col.col_tone.value); - sub_local_key_val.read_float_t( - buf, off, ".contrast", 10, &col.col_tone.contrast); - sub_local_key_val.read_bool( - buf, off, ".inverse", 9, &col.col_tone.inverse); - vidc.push_back(col); + kv.read(vio[j]); + kv.close_scope(); } + kv.close_scope(); } - off = len + len1; - if (!lkv.read_int32_t( - buf, off, ".exclusion", 11, &itm.exclusion) - || !lkv.read_int32_t( - buf, off, ".point", 7, &itm.point) - || !lkv.read_int32_t( - buf, off, ".org_itm", 9, &itm.org_itm)) + int32_t sub_id = 0; + if (!kv.read("type", itm.type) + || !kv.read("attr", itm.attr) + || !kv.read("des_id", itm.des_id) + || !kv.read("sub_id", sub_id)) { + kv.close_scope(); continue; + } + itm.sub_id = (item_sub_id)sub_id; - lkv.read_bool( - buf, off, ".npr_flag", 10, &itm.npr_flag); - lkv.read_float_t( - buf, off, ".face_depth", 12, &itm.face_depth); + if (kv.open_scope("data")) { + int32_t count; + if (kv.read("obj", "length", count)) { + std::vector& vido = itm.data.obj; + + vido.reserve(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) + continue; + + itm_table_item_data_obj obj; + int32_t rpk = 0; + if (kv.read("rpk", rpk)) + obj.rpk = (item_id)rpk; + kv.read("uid", obj.uid); + vido.push_back(obj); + + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.read("ofs", "length", count)) { + std::vector& vido = itm.data.ofs; + + vido.reserve(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) + continue; + + itm_table_item_data_ofs ofs; + int32_t sub_id = 0; + if (kv.read("no", ofs.no) + && kv.read("sub_id", sub_id) + && kv.read("tx", ofs.position.x) + && kv.read("ty", ofs.position.y) + && kv.read("tz", ofs.position.z) + && kv.read("rx", ofs.rotation.x) + && kv.read("ry", ofs.rotation.y) + && kv.read("rz", ofs.rotation.z) + && kv.read("sx", ofs.scale.x) + && kv.read("sy", ofs.scale.y) + && kv.read("sz", ofs.scale.z)) { + ofs.sub_id = (item_sub_id)sub_id; + vido.push_back(ofs); + } + + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.read("tex", "length", count)) { + std::vector& vidt = itm.data.tex; + + vidt.reserve(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) + continue; + + itm_table_item_data_tex tex; + kv.read("org", tex.org); + kv.read("chg", tex.chg); + vidt.push_back(tex); + + kv.close_scope(); + } + kv.close_scope(); + } + + if (kv.read("col", "length", count)) { + std::vector& vidc = itm.data.col; + + vidc.reserve(count); + for (int32_t j = 0; j < count; j++) { + if (!kv.open_scope(j)) + continue; + + itm_table_item_data_col col; + kv.read("tex", col.tex); + kv.read("flag", col.flag); + + if (~col.flag & 0x01) { + vidc.push_back(col); + kv.close_scope(); + continue; + } + + kv.read("blend.0", col.col_tone.blend.x); + kv.read("blend.1", col.col_tone.blend.y); + kv.read("blend.2", col.col_tone.blend.z); + kv.read("offset.0", col.col_tone.offset.x); + kv.read("offset.1", col.col_tone.offset.y); + kv.read("offset.2", col.col_tone.offset.z); + kv.read("hue", col.col_tone.hue); + kv.read("saturation", col.col_tone.saturation); + kv.read("value", col.col_tone.value); + kv.read("contrast", col.col_tone.contrast); + kv.read("inverse", col.col_tone.inverse); + vidc.push_back(col); + + kv.close_scope(); + } + kv.close_scope(); + } + kv.close_scope(); + } + + if (!kv.read("exclusion", itm.exclusion) + || !kv.read("point", itm.point) + || !kv.read("org_itm", itm.org_itm)) { + kv.close_scope(); + continue; + } + + kv.read("npr_flag", itm.npr_flag); + kv.read("face_depth", itm.face_depth); vi.push_back(itm); + + kv.close_scope(); } + kv.close_scope(); } } static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* size) { - char buf[ITEM_TABLE_TEXT_BUF_SIZE]; - int32_t count; - int32_t count1; - size_t len; - size_t len1; - size_t len2; - size_t len3; - size_t len4; - size_t off; - stream s; - io_open(&s); + s.open(); + key_val_out kv; if (itm_tbl->cos.size() > 0) { - len = 3; - memcpy(buf, "cos", 3); - off = len; + kv.open_scope("cos"); std::vector& vc = itm_tbl->cos; - count = (int32_t)vc.size(); + int32_t count = (int32_t)vc.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); itm_table_cos* c = &vc[sort_index[i]]; - len1 = sprintf_s(buf + len, ITEM_TABLE_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; + kv.write(s, "id", c->id); - key_val::write_int32_t(&s, buf, off, ".id", 4, c->id); - - len2 = 5; - memcpy(buf + len + len1, ".item", 5); - off = len + len1 + len2; + kv.open_scope("item"); std::vector& vci = c->item; - count1 = (int32_t)vci.size(); + int32_t count = (int32_t)vci.size(); std::vector sort_index1; - key_val::get_lexicographic_order(&sort_index1, count1); - for (int32_t j = 0; j < count1; j++) { - len3 = sprintf_s(buf + len + len1 + len2, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index1[j]); - off = len + len1 + len2 + len3; - - key_val::write_int32_t(&s, - buf, off, "", 1, vci[sort_index1[j]]); + key_val_out::get_lexicographic_order(&sort_index1, count); + for (int32_t j = 0; j < count; j++) { + kv.open_scope(sort_index1[j]); + kv.write(s, vci[sort_index1[j]]); + kv.close_scope(); } - off = len + len1 + len2; - key_val::write_int32_t(&s, buf, off, ".length", 8, count1); + kv.write(s, "length", count); + kv.close_scope(); + + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (itm_tbl->dbgset.size() > 0) { - len = 6; - memcpy(buf, "dbgset", 6); - off = len; + kv.open_scope("dbgset"); std::vector& vd = itm_tbl->dbgset; - count = (int32_t)vd.size(); + int32_t count = (int32_t)vd.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + itm_table_dbgset* d = &vd[sort_index[i]]; - len1 = sprintf_s(buf + len, ITEM_TABLE_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; - - len2 = 5; - memcpy(buf + len + len1, ".item", 5); - off = len + len1 + len2; + kv.open_scope("item"); std::vector& vdi = d->item; - count1 = (int32_t)vdi.size(); + int32_t count = (int32_t)vdi.size(); std::vector sort_index1; - key_val::get_lexicographic_order(&sort_index1, count1); - for (int32_t j = 0; j < count1; j++) { - len3 = sprintf_s(buf + len + len1 + len2, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index1[j]); - off = len + len1 + len2 + len3; - - key_val::write_int32_t(&s, - buf, off, "", 1, vdi[sort_index1[j]]); + key_val_out::get_lexicographic_order(&sort_index1, count); + for (int32_t j = 0; j < count; j++) { + kv.open_scope(sort_index1[j]); + kv.write(s, vdi[sort_index1[j]]); + kv.close_scope(); } - off = len + len1 + len2; - key_val::write_int32_t(&s, buf, off, ".length", 8, count1); + kv.write(s, "length", count); + kv.write(s, "name", d->name); + kv.close_scope(); - off = len + len1; - key_val::write_string(&s, buf, off, ".name", 6, d->name); + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } if (itm_tbl->item.size() > 0) { - len = 4; - memcpy(buf, "item", 4); - off = len; + kv.open_scope("item"); std::vector& vi = itm_tbl->item; - count = (int32_t)vi.size(); + int32_t count = (int32_t)vi.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count); + key_val_out::get_lexicographic_order(&sort_index, count); for (int32_t i = 0; i < count; i++) { + kv.open_scope(sort_index[i]); + itm_table_item* itm = &vi[sort_index[i]]; + kv.write(s, "attr", itm->attr); - len1 = sprintf_s(buf + len, ITEM_TABLE_TEXT_BUF_SIZE - len, ".%d", sort_index[i]); - off = len + len1; + if (itm->data.col.size() || itm->data.obj.size() + || itm->data.ofs.size() || itm->data.tex.size()) { + kv.open_scope("data"); - key_val::write_int32_t(&s, buf, off, ".attr", 6, itm->attr); + if (itm->data.col.size()) { + kv.open_scope("col"); - len2 = 5; - memcpy(buf + len + len1, ".data", 5); - off = len + len1 + len2; + std::vector& vidc = itm->data.col; + int32_t count = (int32_t)vidc.size(); + std::vector sort_index; + key_val_out::get_lexicographic_order(&sort_index, count); + for (int32_t j = 0; j < count; j++) { + kv.open_scope(sort_index[j]); - if (itm->data.col.size()) { - len3 = 4; - memcpy(buf + len + len1 + len2, ".col", 4); - off = len + len1 + len2 + len3; + itm_table_item_data_col* col = &vidc[sort_index[j]]; + if (col->flag & 0x01) { + kv.write(s, "blend.0", col->col_tone.blend.x); + kv.write(s, "blend.1", col->col_tone.blend.y); + kv.write(s, "blend.2", col->col_tone.blend.z); + kv.write(s, "contrast", col->col_tone.contrast); + } - std::vector& vidc = itm->data.col; - count1 = (int32_t)vidc.size(); - std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count1); - for (int32_t j = 0; j < count1; j++) { - itm_table_item_data_col* col = &vidc[sort_index[j]]; + kv.write(s, "flag", col->flag); - len4 = sprintf_s(buf + len + len1 + len2 + len3, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2 - len3, ".%d", sort_index[j]); - off = len + len1 + len2 + len3 + len4; + if (col->flag & 0x01) { + kv.write(s, "hue", col->col_tone.hue); + kv.write(s, "inverse", col->col_tone.inverse ? 1 : 0); + kv.write(s, "offset.0", col->col_tone.offset.x); + kv.write(s, "offset.1", col->col_tone.offset.y); + kv.write(s, "offset.2", col->col_tone.offset.z); + kv.write(s, "saturation", col->col_tone.saturation); + } - if (col->flag & 0x01) { - key_val::write_float_t(&s, buf, off, ".blend.0", 9, col->col_tone.blend.x); - key_val::write_float_t(&s, buf, off, ".blend.1", 9, col->col_tone.blend.y); - key_val::write_float_t(&s, buf, off, ".blend.2", 9, col->col_tone.blend.z); - key_val::write_float_t(&s, buf, off, ".contrast", 10, col->col_tone.contrast); + kv.write(s, "tex", col->tex); + + if (col->flag & 0x01) + kv.write(s, "value", col->col_tone.value); + + kv.close_scope(); } - key_val::write_int32_t(&s, buf, off, ".flag", 6, col->flag); + kv.write(s, "length", count); + kv.close_scope(); + } - if (col->flag & 0x01) { - key_val::write_float_t(&s, buf, off, ".hue", 5, col->col_tone.hue); - key_val::write_int32_t(&s, buf, off, ".inverse", 9, col->col_tone.inverse ? 1 : 0); - key_val::write_float_t(&s, buf, off, ".offset.0", 10, col->col_tone.offset.x); - key_val::write_float_t(&s, buf, off, ".offset.1", 10, col->col_tone.offset.y); - key_val::write_float_t(&s, buf, off, ".offset.2", 10, col->col_tone.offset.z); - key_val::write_float_t(&s, buf, off, ".saturation", 12, col->col_tone.saturation); + if (itm->data.obj.size()) { + kv.open_scope("obj"); + + std::vector& vido = itm->data.obj; + int32_t count = (int32_t)vido.size(); + std::vector sort_index; + key_val_out::get_lexicographic_order(&sort_index, count); + for (int32_t j = 0; j < count; j++) { + kv.open_scope(sort_index[j]); + + itm_table_item_data_obj* obj = &vido[sort_index[j]]; + kv.write(s, "rpk", obj->rpk); + kv.write(s, "uid", obj->uid); + + kv.close_scope(); } - key_val::write_string(&s, buf, off, ".tex", 5, col->tex); - - if (col->flag & 0x01) - key_val::write_float_t(&s, buf, off, ".value", 7, col->col_tone.value); + kv.write(s, "length", count); + kv.close_scope(); } - off = len + len1 + len2 + len3; - key_val::write_int32_t(&s, buf, off, ".length", 8, count1); - } + if (itm->data.ofs.size()) { + kv.open_scope("ofs"); - if (itm->data.obj.size()) { - len3 = 4; - memcpy(buf + len + len1 + len2, ".obj", 4); - off = len + len1 + len2 + len3; + std::vector& vidof = itm->data.ofs; + int32_t count = (int32_t)vidof.size(); + std::vector sort_index; + key_val_out::get_lexicographic_order(&sort_index, count); + for (int32_t j = 0; j < count; j++) { + kv.open_scope(sort_index[j]); - std::vector& vido = itm->data.obj; - count1 = (int32_t)vido.size(); - std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count1); - for (int32_t j = 0; j < count1; j++) { - itm_table_item_data_obj* obj = &vido[sort_index[j]]; + itm_table_item_data_ofs* ofs = &vidof[sort_index[j]]; + kv.write(s, "no", ofs->no); + kv.write(s, "rx", ofs->rotation.x); + kv.write(s, "ry", ofs->rotation.y); + kv.write(s, "rz", ofs->rotation.z); + kv.write(s, "sub_id", ofs->sub_id); + kv.write(s, "sx", ofs->scale.x); + kv.write(s, "sy", ofs->scale.y); + kv.write(s, "sz", ofs->scale.z); + kv.write(s, "tx", ofs->position.x); + kv.write(s, "ty", ofs->position.y); + kv.write(s, "tz", ofs->position.z); - len4 = sprintf_s(buf + len + len1 + len2 + len3, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2 - len3, ".%d", sort_index[j]); - off = len + len1 + len2 + len3 + len4; + kv.close_scope(); + } - key_val::write_int32_t(&s, buf, off, ".rpk", 5, obj->rpk); - key_val::write_string(&s, buf, off, ".uid", 5, obj->uid); + kv.write(s, "length", count); + kv.close_scope(); } - off = len + len1 + len2 + len3; - key_val::write_int32_t(&s, buf, off, ".length", 8, count1); - } + if (itm->data.tex.size()) { + kv.open_scope("tex"); - if (itm->data.ofs.size()) { - len3 = 4; - memcpy(buf + len + len1 + len2, ".ofs", 4); - off = len + len1 + len2 + len3; + std::vector& vidt = itm->data.tex; + int32_t count = (int32_t)vidt.size(); + std::vector sort_index; + key_val_out::get_lexicographic_order(&sort_index, count); + for (int32_t j = 0; j < count; j++) { + kv.open_scope(sort_index[j]); - std::vector& vidof = itm->data.ofs; - count1 = (int32_t)vidof.size(); - std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count1); - for (int32_t j = 0; j < count1; j++) { - itm_table_item_data_ofs* ofs = &vidof[sort_index[j]]; + itm_table_item_data_tex* tex = &vidt[sort_index[j]]; + kv.write(s, "chg", tex->chg); + kv.write(s, "org", tex->org); - len4 = sprintf_s(buf + len + len1 + len2 + len3, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2 - len3, ".%d", sort_index[j]); - off = len + len1 + len2 + len3 + len4; + kv.close_scope(); + } - key_val::write_int32_t(&s, buf, off, ".no", 4, ofs->no); - key_val::write_float_t(&s, buf, off, ".rx", 4, ofs->rotation.x); - key_val::write_float_t(&s, buf, off, ".ry", 4, ofs->rotation.y); - key_val::write_float_t(&s, buf, off, ".rz", 4, ofs->rotation.z); - key_val::write_int32_t(&s, buf, off, ".sub_id", 8, ofs->sub_id); - key_val::write_float_t(&s, buf, off, ".sx", 4, ofs->scale.x); - key_val::write_float_t(&s, buf, off, ".sy", 4, ofs->scale.y); - key_val::write_float_t(&s, buf, off, ".sz", 4, ofs->scale.z); - key_val::write_float_t(&s, buf, off, ".tx", 4, ofs->position.x); - key_val::write_float_t(&s, buf, off, ".ty", 4, ofs->position.y); - key_val::write_float_t(&s, buf, off, ".tz", 4, ofs->position.z); + kv.write(s, "length", count); + kv.close_scope(); } - off = len + len1 + len2 + len3; - key_val::write_int32_t(&s, buf, off, ".length", 8, count1); + kv.close_scope(); } - if (itm->data.tex.size()) { - len3 = 4; - memcpy(buf + len + len1 + len2, ".tex", 4); - off = len + len1 + len2 + len3; - - std::vector& vidt = itm->data.tex; - count1 = (int32_t)vidt.size(); - std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count1); - for (int32_t j = 0; j < count1; j++) { - itm_table_item_data_tex* tex = &vidt[sort_index[j]]; - - len4 = sprintf_s(buf + len + len1 + len2 + len3, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2 - len3, ".%d", sort_index[j]); - off = len + len1 + len2 + len3 + len4; - - key_val::write_string(&s, buf, off, ".chg", 5, tex->chg); - key_val::write_string(&s, buf, off, ".org", 5, tex->org); - } - - off = len + len1 + len2 + len3; - key_val::write_int32_t(&s, buf, off, ".length", 8, count1); - } - - off = len + len1; - key_val::write_int32_t(&s, buf, off, ".des_id", 8, itm->des_id); - key_val::write_int32_t(&s, buf, off, ".exclusion", 11, itm->exclusion); - key_val::write_float_t(&s, buf, off, ".face_depth", 12, itm->face_depth); - key_val::write_int32_t(&s, buf, off, ".flag", 6, itm->flag); - key_val::write_string(&s, buf, off, ".name", 6, itm->name); - key_val::write_int32_t(&s, buf, off, ".no", 4, itm->no); - if (itm->npr_flag) - key_val::write_int32_t(&s, buf, off, ".npr_flag", 10, itm->npr_flag); + kv.write(s, "des_id", itm->des_id); + kv.write(s, "exclusion", itm->exclusion); + kv.write(s, "face_depth", itm->face_depth); + kv.write(s, "flag", itm->flag); + kv.write(s, "name", itm->name); + kv.write(s, "no", itm->no); + kv.write(s, "npr_flag", itm->npr_flag); if (itm->objset.size()) { - len2 = 7; - memcpy(buf + len + len1, ".objset", 7); - off = len + len1 + len2; - - if (off >= 0 && off < ITEM_TABLE_TEXT_BUF_SIZE) - buf[off] = 0; + kv.open_scope("objset"); std::vector& vio = itm->objset; - count1 = (int32_t)vio.size(); + int32_t count = (int32_t)vio.size(); std::vector sort_index; - key_val::get_lexicographic_order(&sort_index, count1); - for (int32_t j = 0; j < count1; j++) { - len3 = sprintf_s(buf + len + len1 + len2, - ITEM_TABLE_TEXT_BUF_SIZE - len - len1 - len2, ".%d", sort_index[j]); - off = len + len1 + len2 + len3; - - key_val::write_string(&s, buf, off, "", 1, vio[sort_index[j]]); + key_val_out::get_lexicographic_order(&sort_index, count); + for (int32_t j = 0; j < count; j++) { + kv.open_scope(sort_index[j]); + kv.write(s, vio[sort_index[j]]); + kv.close_scope(); } - off = len + len1 + len2; - key_val::write_int32_t(&s, buf, off, ".length", 8, count1); + kv.write(s, "length", count); + kv.close_scope(); } - off = len + len1; - key_val::write_int32_t(&s, buf, off, ".org_itm", 9, itm->org_itm); - key_val::write_int32_t(&s, buf, off, ".point", 7, itm->point); - key_val::write_int32_t(&s, buf, off, ".sub_id", 8, itm->sub_id); - key_val::write_int32_t(&s, buf, off, ".type", 6, itm->type); + kv.write(s, "org_itm", itm->org_itm); + kv.write(s, "point", itm->point); + kv.write(s, "sub_id", itm->sub_id); + kv.write(s, "type", itm->type); + + kv.close_scope(); } - off = len; - key_val::write_int32_t(&s, buf, off, ".length", 8, count); + kv.write(s, "length", count); + kv.close_scope(); } - io_copy(&s, data, size); - io_free(&s); + s.copy(data, size); } \ No newline at end of file diff --git a/src/KKdLib/database/item_table.hpp b/src/KKdLib/database/item_table.hpp index f0b5cd3d..887f0435 100644 --- a/src/KKdLib/database/item_table.hpp +++ b/src/KKdLib/database/item_table.hpp @@ -9,9 +9,9 @@ #include #include #include -#include "../default.h" -#include "../image.h" -#include "../vec.h" +#include "../default.hpp" +#include "../image.hpp" +#include "../vec.hpp" enum chara_index { CHARA_NONE = -1, @@ -196,4 +196,5 @@ struct itm_table { 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 chara_index chara_index_get_from_chara_name(const char* str); extern const char* chara_index_get_name(chara_index chara_index); diff --git a/src/KKdLib/database/motion.cpp b/src/KKdLib/database/motion.cpp index fd3c1199..ea9e9628 100644 --- a/src/KKdLib/database/motion.cpp +++ b/src/KKdLib/database/motion.cpp @@ -4,14 +4,14 @@ */ #include "motion.hpp" -#include "../io/path.h" -#include "../io/stream.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" #include "../farc.hpp" #include "../hash.hpp" -#include "../str_utils.h" +#include "../str_utils.hpp" -static void motion_database_read_inner(motion_database* mot_db, stream* s); -static void motion_database_write_inner(motion_database* mot_db, stream* s); +static void motion_database_read_inner(motion_database* mot_db, stream& s); +static void motion_database_write_inner(motion_database* mot_db, stream& s); motion_database::motion_database() : ready() { @@ -33,9 +33,8 @@ void motion_database::read(const char* path) { farc_file* ff = f.read_file("mot_db.bin"); if (ff) { stream s; - io_open(&s, ff->data, ff->size); - motion_database_read_inner(this, &s); - io_free(&s); + s.open(ff->data, ff->size); + motion_database_read_inner(this, s); } } free(path_farc); @@ -53,9 +52,8 @@ void motion_database::read(const wchar_t* path) { farc_file* ff = f.read_file("mot_db.bin"); if (ff) { stream s; - io_open(&s, ff->data, ff->size); - motion_database_read_inner(this, &s); - io_free(&s); + s.open(ff->data, ff->size); + motion_database_read_inner(this, s); } } free(path_farc); @@ -66,9 +64,8 @@ void motion_database::read(const void* data, size_t size) { return; stream s; - io_open(&s, data, size); - motion_database_read_inner(this, &s); - io_free(&s); + s.open(data, size); + motion_database_read_inner(this, s); } void motion_database::write(const char* path) { @@ -81,10 +78,9 @@ void motion_database::write(const char* path) { farc_file* ff = &f.files.back(); stream s; - io_open(&s); - motion_database_write_inner(this, &s); - io_copy(&s, &ff->data, &ff->size); - io_free(&s); + s.open(); + motion_database_write_inner(this, s); + s.copy(&ff->data, &ff->size); f.write(path, FARC_COMPRESS_FArC, false); } @@ -99,10 +95,9 @@ void motion_database::write(const wchar_t* path) { farc_file* ff = &f.files.back(); stream s; - io_open(&s); - motion_database_write_inner(this, &s); - io_copy(&s, &ff->data, &ff->size); - io_free(&s); + s.open(); + motion_database_write_inner(this, s); + s.copy(&ff->data, &ff->size); f.write(path, FARC_COMPRESS_FArC, false); } @@ -112,10 +107,9 @@ void motion_database::write(void** data, size_t* size) { return; stream s; - io_open(&s); - motion_database_write_inner(this, &s); - io_copy(&s, data, size); - io_free(&s); + s.open(); + motion_database_write_inner(this, s); + s.copy(data, size); } void motion_database::merge_mdata(motion_database* base_mot_db, @@ -360,172 +354,171 @@ motion_set_info::~motion_set_info() { } -static void motion_database_read_inner(motion_database* mot_db, stream* s) { - if (io_read_uint32_t(s) != 0x01) +static void motion_database_read_inner(motion_database* mot_db, stream& s) { + if (s.read_uint32_t() != 0x01) return; - uint32_t motion_sets_offset = io_read_uint32_t(s); - uint32_t motion_set_ids_offset = io_read_uint32_t(s); - uint32_t motion_set_count = io_read_uint32_t(s); - uint32_t bone_name_offsets_offset = io_read_uint32_t(s); - uint32_t bone_name_count = io_read_uint32_t(s); + uint32_t motion_sets_offset = s.read_uint32_t(); + uint32_t motion_set_ids_offset = s.read_uint32_t(); + uint32_t motion_set_count = s.read_uint32_t(); + uint32_t bone_name_offsets_offset = s.read_uint32_t(); + uint32_t bone_name_count = s.read_uint32_t(); mot_db->motion_set.resize(motion_set_count); - io_position_push(s, motion_sets_offset, SEEK_SET); + s.position_push(motion_sets_offset, SEEK_SET); for (uint32_t i = 0; i < motion_set_count; i++) { motion_set_info& set_info = mot_db->motion_set[i]; - uint32_t name_offset = io_read_uint32_t(s); - uint32_t motion_name_offsets_offset = io_read_uint32_t(s); - uint32_t motion_count = io_read_uint32_t(s); - uint32_t motion_ids_offset = io_read_uint32_t(s); + uint32_t name_offset = s.read_uint32_t(); + uint32_t motion_name_offsets_offset = s.read_uint32_t(); + uint32_t motion_count = s.read_uint32_t(); + uint32_t motion_ids_offset = s.read_uint32_t(); - io_read_string_null_terminated_offset(s, name_offset, &set_info.name); + set_info.name = s.read_string_null_terminated_offset(name_offset); set_info.name_hash = hash_string_murmurhash(&set_info.name); set_info.motion.resize(motion_count); - io_position_push(s, motion_name_offsets_offset, SEEK_SET); + s.position_push(motion_name_offsets_offset, SEEK_SET); for (uint32_t j = 0; j < motion_count; j++) { - io_read_string_null_terminated_offset(s, - io_read_uint32_t(s), &set_info.motion[j].name); + set_info.motion[j].name = s.read_string_null_terminated_offset(s.read_uint32_t()); set_info.motion[j].name_hash = hash_string_murmurhash(&set_info.motion[j].name); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, motion_ids_offset, SEEK_SET); + s.position_push(motion_ids_offset, SEEK_SET); for (uint32_t j = 0; j < motion_count; j++) - set_info.motion[j].id = io_read_uint32_t(s); - io_position_pop(s); + set_info.motion[j].id = s.read_uint32_t(); + s.position_pop(); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, motion_set_ids_offset, SEEK_SET); + s.position_push(motion_set_ids_offset, SEEK_SET); for (uint32_t i = 0; i < motion_set_count; i++) - mot_db->motion_set[i].id = io_read_uint32_t(s); - io_position_pop(s); + mot_db->motion_set[i].id = s.read_uint32_t(); + s.position_pop(); mot_db->bone_name.resize(bone_name_count); - io_position_push(s, bone_name_offsets_offset, SEEK_SET); + s.position_push(bone_name_offsets_offset, SEEK_SET); for (uint32_t i = 0; i < bone_name_count; i++) - io_read_string_null_terminated_offset(s, io_read_uint32_t(s), &mot_db->bone_name[i]); - io_position_pop(s); + mot_db->bone_name[i] = s.read_string_null_terminated_offset(s.read_uint32_t()); + s.position_pop(); mot_db->ready = true; } -static void motion_database_write_inner(motion_database* mot_db, stream* s) { - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_align_write(s, 0x40); +static void motion_database_write_inner(motion_database* mot_db, stream& s) { + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.align_write(0x40); size_t bone_name_count = mot_db->bone_name.size(); size_t motion_set_count = mot_db->motion_set.size(); - int64_t motion_sets_offset = io_get_position(s); - io_write(s, 0x10 * motion_set_count + 0x10); - io_align_write(s, 0x20); + int64_t motion_sets_offset = s.get_position(); + s.write(0x10 * motion_set_count + 0x10); + s.align_write(0x20); size_t size = 0; for (motion_set_info& i : mot_db->motion_set) size += i.name.size() + 1; - int64_t motion_set_name_offset = io_get_position(s); - io_write(s, size); + int64_t motion_set_name_offset = s.get_position(); + s.write(size); size = 0; for (motion_set_info& i : mot_db->motion_set) for (motion_info& j : i.motion) size += j.name.size() + 1; - int64_t motion_name_offset = io_get_position(s); - io_write(s, size); - io_align_write(s, 0x20); + int64_t motion_name_offset = s.get_position(); + s.write(size); + s.align_write(0x20); - int64_t motion_names_offset = io_get_position(s); + int64_t motion_names_offset = s.get_position(); size = 0; for (motion_set_info& i : mot_db->motion_set) size += 0x04 * i.motion.size(); - io_write(s, size); - io_align_write(s, 0x20); + s.write(size); + s.align_write(0x20); - int64_t motion_ids_offset = io_get_position(s); + int64_t motion_ids_offset = s.get_position(); for (motion_set_info& i : mot_db->motion_set) for (motion_info& j : i.motion) - io_write_uint32_t(s, j.id); - io_align_write(s, 0x20); + s.write_uint32_t(j.id); + s.align_write(0x20); - int64_t motion_set_ids_offset = io_get_position(s); + int64_t motion_set_ids_offset = s.get_position(); for (motion_set_info& i : mot_db->motion_set) - io_write_uint32_t(s, i.id); + s.write_uint32_t(i.id); - int64_t bone_name_offset = io_get_position(s); + int64_t bone_name_offset = s.get_position(); size = 0; for (std::string& i : mot_db->bone_name) size += i.size() + 1; - io_write(s, size); - io_align_write(s, 0x20); + s.write(size); + s.align_write(0x20); - io_position_push(s, motion_set_name_offset, SEEK_SET); + s.position_push(motion_set_name_offset, SEEK_SET); for (motion_set_info& i : mot_db->motion_set) - io_write_string_null_terminated(s, &i.name); - io_position_pop(s); + s.write_string_null_terminated(i.name); + s.position_pop(); - io_position_push(s, motion_name_offset, SEEK_SET); + s.position_push(motion_name_offset, SEEK_SET); for (motion_set_info& i : mot_db->motion_set) for (motion_info& j : i.motion) - io_write_string_null_terminated(s, &j.name); - io_position_pop(s); + s.write_string_null_terminated(j.name); + s.position_pop(); - io_position_push(s, bone_name_offset, SEEK_SET); + s.position_push(bone_name_offset, SEEK_SET); for (std::string& i : mot_db->bone_name) - io_write_string_null_terminated(s, &i); - io_position_pop(s); + s.write_string_null_terminated(i); + s.position_pop(); - int64_t bone_name_offsets_offset = io_get_position(s); - io_write(s, 0x04 * bone_name_count); - io_align_write(s, 0x20); + int64_t bone_name_offsets_offset = s.get_position(); + s.write(0x04 * bone_name_count); + s.align_write(0x20); - io_position_push(s, motion_names_offset, SEEK_SET); + s.position_push(motion_names_offset, SEEK_SET); for (motion_set_info& i : mot_db->motion_set) for (motion_info& j : i.motion) { - io_write_uint32_t(s, (uint32_t)motion_name_offset); + s.write_uint32_t((uint32_t)motion_name_offset); motion_name_offset += j.name.size() + 1; } - io_position_pop(s); + s.position_pop(); - io_position_push(s, motion_sets_offset, SEEK_SET); + s.position_push(motion_sets_offset, SEEK_SET); for (motion_set_info& i : mot_db->motion_set) { - io_write_uint32_t(s, (uint32_t)motion_set_name_offset); - io_write_uint32_t(s, (uint32_t)motion_names_offset); - io_write_uint32_t(s, (uint32_t)i.motion.size()); - io_write_uint32_t(s, (uint32_t)motion_ids_offset); + s.write_uint32_t((uint32_t)motion_set_name_offset); + s.write_uint32_t((uint32_t)motion_names_offset); + s.write_uint32_t((uint32_t)i.motion.size()); + s.write_uint32_t((uint32_t)motion_ids_offset); motion_set_name_offset += i.name.size() + 1; motion_names_offset += 0x04 * i.motion.size(); motion_ids_offset += 0x04 * i.motion.size(); } - io_write(s, 0x10); - io_position_pop(s); + s.write(0x10); + s.position_pop(); - io_position_push(s, bone_name_offsets_offset, SEEK_SET); + s.position_push(bone_name_offsets_offset, SEEK_SET); for (std::string& i : mot_db->bone_name) { - io_write_uint32_t(s, (uint32_t)bone_name_offset); + s.write_uint32_t((uint32_t)bone_name_offset); bone_name_offset += i.size() + 1; } - io_position_pop(s); + s.position_pop(); - io_position_push(s, 0x00, SEEK_SET); - io_write_uint32_t(s, 0x01); - io_write_uint32_t(s, (uint32_t)motion_sets_offset); - io_write_uint32_t(s, (uint32_t)motion_set_ids_offset); - io_write_uint32_t(s, (uint32_t)motion_set_count); - io_write_uint32_t(s, (uint32_t)bone_name_offsets_offset); - io_write_uint32_t(s, (uint32_t)bone_name_count); - io_position_pop(s); + s.position_push(0x00, SEEK_SET); + s.write_uint32_t(0x01); + s.write_uint32_t((uint32_t)motion_sets_offset); + s.write_uint32_t((uint32_t)motion_set_ids_offset); + s.write_uint32_t((uint32_t)motion_set_count); + s.write_uint32_t((uint32_t)bone_name_offsets_offset); + s.write_uint32_t((uint32_t)bone_name_count); + s.position_pop(); } diff --git a/src/KKdLib/database/motion.hpp b/src/KKdLib/database/motion.hpp index ca4bd45f..472ebbdf 100644 --- a/src/KKdLib/database/motion.hpp +++ b/src/KKdLib/database/motion.hpp @@ -7,7 +7,7 @@ #include #include -#include "../default.h" +#include "../default.hpp" struct motion_info { std::string name; diff --git a/src/KKdLib/database/object.cpp b/src/KKdLib/database/object.cpp index 759118f5..b8c233e3 100644 --- a/src/KKdLib/database/object.cpp +++ b/src/KKdLib/database/object.cpp @@ -5,16 +5,16 @@ #include "object.hpp" #include "../f2/struct.hpp" -#include "../io/path.h" -#include "../io/stream.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" #include "../hash.hpp" #include "../sort.hpp" -#include "../str_utils.h" +#include "../str_utils.hpp" -static void object_database_classic_read_inner(object_database* obj_db, stream* s); -static void object_database_classic_write_inner(object_database* obj_db, stream* s); -static void object_database_modern_read_inner(object_database* obj_db, stream* s, uint32_t header_length); -static void object_database_modern_write_inner(object_database* obj_db, stream* s); +static void object_database_classic_read_inner(object_database* obj_db, stream& s); +static void object_database_classic_write_inner(object_database* obj_db, stream& s); +static void object_database_modern_read_inner(object_database* obj_db, stream& s, uint32_t header_length); +static void object_database_modern_write_inner(object_database* obj_db, stream& s); static int64_t object_database_strings_get_string_offset(std::vector& vec, std::vector& vec_off, std::string& str); static void object_database_strings_push_back_check(std::vector& vec, std::string& str); @@ -45,17 +45,15 @@ void object_database::read(const char* path, bool modern) { char* path_bin = str_utils_add(path, ".bin"); if (path_check_file_exists(path_bin)) { stream s; - io_open(&s, path_bin, "rb"); + s.open(path_bin, "rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); - io_read(&s, data, s.length); + s.read(data, s.length); stream s_bin; - io_open(&s_bin, data, s.length); - object_database_classic_read_inner(this, &s_bin); - io_free(&s_bin); + s_bin.open(data, s.length); + object_database_classic_read_inner(this, s_bin); free(data); } - io_free(&s); } free(path_bin); } @@ -66,10 +64,9 @@ void object_database::read(const char* path, bool modern) { st.read(path_osi); if (st.header.signature == reverse_endianness_uint32_t('MOSI')) { stream s_mosi; - io_open(&s_mosi, &st.data); + s_mosi.open(st.data); s_mosi.is_big_endian = st.header.use_big_endian; - object_database_modern_read_inner(this, &s_mosi, st.header.length); - io_free(&s_mosi); + object_database_modern_read_inner(this, s_mosi, st.header.length); } } free(path_osi); @@ -84,17 +81,15 @@ void object_database::read(const wchar_t* path, bool 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"); + s.open(path_bin, L"rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); - io_read(&s, data, s.length); + s.read(data, s.length); stream s_bin; - io_open(&s_bin, data, s.length); - object_database_classic_read_inner(this, &s_bin); - io_free(&s_bin); + s_bin.open(data, s.length); + object_database_classic_read_inner(this, s_bin); free(data); } - io_free(&s); } free(path_bin); } @@ -105,10 +100,9 @@ void object_database::read(const wchar_t* path, bool modern) { st.read(path_osi); if (st.header.signature == reverse_endianness_uint32_t('MOSI')) { stream s_mosi; - io_open(&s_mosi, &st.data); + s_mosi.open(st.data); s_mosi.is_big_endian = st.header.use_big_endian; - object_database_modern_read_inner(this, &s_mosi, st.header.length); - io_free(&s_mosi); + object_database_modern_read_inner(this, s_mosi, st.header.length); } } free(path_osi); @@ -121,19 +115,17 @@ void object_database::read(const void* data, size_t size, bool modern) { if (!modern) { stream s; - io_open(&s, data, size); - object_database_classic_read_inner(this, &s); - io_free(&s); + s.open(data, size); + object_database_classic_read_inner(this, s); } else { f2_struct st; st.read(data, size); if (st.header.signature == reverse_endianness_uint32_t('MOSI')) { stream s_mosi; - io_open(&s_mosi, &st.data); + s_mosi.open(st.data); s_mosi.is_big_endian = st.header.use_big_endian; - object_database_modern_read_inner(this, &s_mosi, st.header.length); - io_free(&s_mosi); + object_database_modern_read_inner(this, s_mosi, st.header.length); } } } @@ -145,19 +137,17 @@ void object_database::write(const char* path) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); stream s; - io_open(&s, path_bin, "wb"); + s.open(path_bin, "wb"); if (s.io.stream) - object_database_classic_write_inner(this, &s); - io_free(&s); + object_database_classic_write_inner(this, s); free(path_bin); } else { char* path_osi = str_utils_add(path, ".osi"); stream s; - io_open(&s, path_osi, "wb"); + s.open(path_osi, "wb"); if (s.io.stream) - object_database_modern_write_inner(this, &s); - io_free(&s); + object_database_modern_write_inner(this, s); free(path_osi); } } @@ -169,19 +159,17 @@ void object_database::write(const wchar_t* path) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); stream s; - io_open(&s, path_bin, L"wb"); + s.open(path_bin, L"wb"); if (s.io.stream) - object_database_classic_write_inner(this, &s); - io_free(&s); + object_database_classic_write_inner(this, s); free(path_bin); } else { wchar_t* path_osi = str_utils_add(path, L".osi"); stream s; - io_open(&s, path_osi, L"wb"); + s.open(path_osi, L"wb"); if (s.io.stream) - object_database_modern_write_inner(this, &s); - io_free(&s); + object_database_modern_write_inner(this, s); free(path_osi); } } @@ -191,14 +179,13 @@ void object_database::write(void** data, size_t* size) { return; stream s; - io_open(&s); + s.open(); if (!modern) - object_database_classic_write_inner(this, &s); + object_database_classic_write_inner(this, s); else - object_database_modern_write_inner(this, &s); - io_align_write(&s, 0x10); - io_copy(&s, data, size); - io_free(&s); + object_database_modern_write_inner(this, s); + s.align_write(0x10); + s.copy(data, size); } void object_database::merge_mdata(object_database* base_obj_db, object_database* mdata_obj_db) { @@ -423,38 +410,34 @@ object_info_data::~object_info_data() { } -static void object_database_classic_read_inner(object_database* obj_db, stream* s) { - uint32_t object_set_count = io_read_uint32_t(s); - uint32_t max_object_set_id = io_read_uint32_t(s); - uint32_t object_sets_offset = io_read_uint32_t(s); - uint32_t object_count = io_read_uint32_t(s); - uint32_t objects_offset = io_read_uint32_t(s); +static void object_database_classic_read_inner(object_database* obj_db, stream& s) { + uint32_t object_set_count = s.read_uint32_t(); + uint32_t max_object_set_id = s.read_uint32_t(); + uint32_t object_sets_offset = s.read_uint32_t(); + uint32_t object_count = s.read_uint32_t(); + uint32_t objects_offset = s.read_uint32_t(); obj_db->object_set.resize(object_set_count); - io_position_push(s, object_sets_offset, SEEK_SET); + s.position_push(object_sets_offset, SEEK_SET); for (uint32_t i = 0; i < object_set_count; i++) { object_set_info* set_info = &obj_db->object_set[i]; - io_read_string_null_terminated_offset(s, - io_read_uint32_t(s), &set_info->name); + set_info->name = s.read_string_null_terminated_offset(s.read_uint32_t()); set_info->name_hash = hash_string_murmurhash(&set_info->name); - set_info->id = io_read_uint32_t(s); - io_read_string_null_terminated_offset(s, - io_read_uint32_t(s), &set_info->object_file_name); - io_read_string_null_terminated_offset(s, - io_read_uint32_t(s), &set_info->texture_file_name); - io_read_string_null_terminated_offset(s, - io_read_uint32_t(s), &set_info->archive_file_name); - io_read(s, 0x10); + set_info->id = s.read_uint32_t(); + set_info->object_file_name = s.read_string_null_terminated_offset(s.read_uint32_t()); + set_info->texture_file_name = s.read_string_null_terminated_offset(s.read_uint32_t()); + set_info->archive_file_name = s.read_string_null_terminated_offset(s.read_uint32_t()); + s.read(0x10); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, objects_offset, SEEK_SET); + s.position_push(objects_offset, SEEK_SET); for (uint32_t i = 0; i < object_count; i++) { object_info_data info; - info.id = io_read_uint16_t(s); - uint32_t set_id = io_read_uint16_t(s); - io_read_string_null_terminated_offset(s, io_read_uint32_t(s), &info.name); + info.id = s.read_uint16_t(); + uint32_t set_id = s.read_uint16_t(); + info.name = s.read_string_null_terminated_offset(s.read_uint32_t()); info.name_hash_fnv1a64m = hash_string_fnv1a64m(&info.name); info.name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info.name, true); info.name_hash_murmurhash = hash_string_murmurhash(&info.name); @@ -470,23 +453,23 @@ static void object_database_classic_read_inner(object_database* obj_db, stream* break; } } - io_position_pop(s); + s.position_pop(); obj_db->is_x = false; obj_db->modern = false; obj_db->ready = true; } -static void object_database_classic_write_inner(object_database* obj_db, stream* s) { - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_align_write(s, 0x20); +static void object_database_classic_write_inner(object_database* obj_db, stream& s) { + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.align_write(0x20); uint32_t object_set_count = (uint32_t)obj_db->object_set.size(); @@ -500,25 +483,25 @@ static void object_database_classic_write_inner(object_database* obj_db, stream* int64_t objects_offset = 0; if (string_offsets.size()) { for (object_set_info& i : obj_db->object_set) { - string_offsets.push_back(io_get_position(s)); - io_write_string_null_terminated(s, &i.name); - string_offsets.push_back(io_get_position(s)); - io_write_string_null_terminated(s, &i.object_file_name); - string_offsets.push_back(io_get_position(s)); - io_write_string_null_terminated(s, &i.texture_file_name); - string_offsets.push_back(io_get_position(s)); - io_write_string_null_terminated(s, &i.archive_file_name); + string_offsets.push_back(s.get_position()); + s.write_string_null_terminated(i.name); + string_offsets.push_back(s.get_position()); + s.write_string_null_terminated(i.object_file_name); + string_offsets.push_back(s.get_position()); + s.write_string_null_terminated(i.texture_file_name); + string_offsets.push_back(s.get_position()); + s.write_string_null_terminated(i.archive_file_name); } - io_align_write(s, 0x20); + s.align_write(0x20); - object_sets_offset = io_get_position(s); + object_sets_offset = s.get_position(); for (object_set_info& i : obj_db->object_set) { - io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]); - io_write_uint32_t(s, i.id); - io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]); - io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]); - io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]); - io_write(s, 0x10); + s.write_uint32_t((uint32_t)string_offsets[off_idx++]); + s.write_uint32_t(i.id); + s.write_uint32_t((uint32_t)string_offsets[off_idx++]); + s.write_uint32_t((uint32_t)string_offsets[off_idx++]); + s.write_uint32_t((uint32_t)string_offsets[off_idx++]); + s.write(0x10); if (max_object_set_id < i.id) max_object_set_id = i.id; object_count += (uint32_t)i.object.size(); @@ -529,93 +512,85 @@ static void object_database_classic_write_inner(object_database* obj_db, stream* for (object_set_info& i : obj_db->object_set) for (object_info_data& j : i.object) { - string_offsets.push_back(io_get_position(s)); - io_write_string_null_terminated(s, &j.name); + string_offsets.push_back(s.get_position()); + s.write_string_null_terminated(j.name); } - io_align_write(s, 0x20); + s.align_write(0x20); - objects_offset = io_get_position(s); + objects_offset = s.get_position(); off_idx = 0; for (object_set_info& i : obj_db->object_set) { uint16_t set_id = (uint16_t)i.id; for (object_info_data& j : i.object) { - io_write_uint16_t(s, (uint16_t)j.id); - io_write_uint16_t(s, set_id); - io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]); + s.write_uint16_t((uint16_t)j.id); + s.write_uint16_t(set_id); + s.write_uint32_t((uint32_t)string_offsets[off_idx++]); } } - io_align_write(s, 0x20); + s.align_write(0x20); } - io_position_push(s, 0x00, SEEK_SET); - io_write_uint32_t(s, object_set_count); - io_write_uint32_t(s, max_object_set_id); - io_write_uint32_t(s, (uint32_t)object_sets_offset); - io_write_uint32_t(s, object_count); - io_write_uint32_t(s, (uint32_t)objects_offset); - io_write(s, 0x08); - io_position_pop(s); + s.position_push(0x00, SEEK_SET); + s.write_uint32_t(object_set_count); + s.write_uint32_t(max_object_set_id); + s.write_uint32_t((uint32_t)object_sets_offset); + s.write_uint32_t(object_count); + s.write_uint32_t((uint32_t)objects_offset); + s.write(0x08); + s.position_pop(); } -static void object_database_modern_read_inner(object_database* obj_db, stream* s, uint32_t header_length) { +static void object_database_modern_read_inner(object_database* obj_db, stream& s, uint32_t header_length) { bool is_x = true; - io_set_position(s, 0x0C, SEEK_SET); - is_x &= io_read_uint32_t_stream_reverse_endianness(s) == 0; - io_set_position(s, 0x14, SEEK_SET); - is_x &= io_read_uint32_t_stream_reverse_endianness(s) == 0; + s.set_position(0x0C, SEEK_SET); + is_x &= s.read_uint32_t_reverse_endianness() == 0; + s.set_position(0x14, SEEK_SET); + is_x &= s.read_uint32_t_reverse_endianness() == 0; - io_set_position(s, 0x00, SEEK_SET); + s.set_position(0x00, SEEK_SET); - io_read_uint32_t_stream_reverse_endianness(s); - uint32_t object_set_count = io_read_uint32_t_stream_reverse_endianness(s); - uint32_t max_object_set_id = io_read_uint32_t_stream_reverse_endianness(s); - int64_t object_sets_offset = io_read_offset(s, header_length, is_x); - uint32_t object_count = io_read_uint32_t_stream_reverse_endianness(s); - int64_t objects_offset = io_read_offset(s, header_length, is_x); + s.read_uint32_t_reverse_endianness(); + uint32_t object_set_count = s.read_uint32_t_reverse_endianness(); + uint32_t max_object_set_id = s.read_uint32_t_reverse_endianness(); + int64_t object_sets_offset = s.read_offset(header_length, is_x); + uint32_t object_count = s.read_uint32_t_reverse_endianness(); + int64_t objects_offset = s.read_offset(header_length, is_x); obj_db->object_set.resize(object_set_count); - io_position_push(s, object_sets_offset, SEEK_SET); + s.position_push(object_sets_offset, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < object_set_count; i++) { object_set_info* set_info = &obj_db->object_set[i]; - io_read_string_null_terminated_offset(s, - io_read_offset_f2(s, header_length), &set_info->name); + set_info->name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length)); set_info->name_hash = hash_string_murmurhash(&set_info->name); - set_info->id = io_read_uint32_t_stream_reverse_endianness(s); - io_read_string_null_terminated_offset(s, - io_read_offset_f2(s, header_length), &set_info->object_file_name); - io_read_string_null_terminated_offset(s, - io_read_offset_f2(s, header_length), &set_info->texture_file_name); - io_read_string_null_terminated_offset(s, - io_read_offset_f2(s, header_length), &set_info->archive_file_name); - io_read(s, 0x10); + set_info->id = s.read_uint32_t_reverse_endianness(); + set_info->object_file_name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length)); + set_info->texture_file_name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length)); + set_info->archive_file_name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length)); + s.read(0x10); } else for (uint32_t i = 0; i < object_set_count; i++) { object_set_info* set_info = &obj_db->object_set[i]; - io_read_string_null_terminated_offset(s, - io_read_offset_x(s), &set_info->name); + set_info->name = s.read_string_null_terminated_offset(s.read_offset_x()); set_info->name_hash = hash_string_murmurhash(&set_info->name); - set_info->id = io_read_uint32_t_stream_reverse_endianness(s); - io_read_string_null_terminated_offset(s, - io_read_offset_x(s), &set_info->object_file_name); - io_read_string_null_terminated_offset(s, - io_read_offset_x(s), &set_info->texture_file_name); - io_read_string_null_terminated_offset(s, - io_read_offset_x(s), &set_info->archive_file_name); - io_read(s, 0x10); + set_info->id = s.read_uint32_t_reverse_endianness(); + set_info->object_file_name = s.read_string_null_terminated_offset(s.read_offset_x()); + set_info->texture_file_name = s.read_string_null_terminated_offset(s.read_offset_x()); + set_info->archive_file_name = s.read_string_null_terminated_offset(s.read_offset_x()); + s.read(0x10); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, objects_offset, SEEK_SET); + s.position_push(objects_offset, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < object_count; i++) { object_info_data info; - info.id = io_read_uint32_t_stream_reverse_endianness(s); - uint32_t set_id = io_read_uint32_t_stream_reverse_endianness(s); - io_read_string_null_terminated_offset(s, io_read_offset_f2(s, header_length), &info.name); + info.id = s.read_uint32_t_reverse_endianness(); + uint32_t set_id = s.read_uint32_t_reverse_endianness(); + info.name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length)); info.name_hash_fnv1a64m = hash_string_fnv1a64m(&info.name); info.name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info.name, true); info.name_hash_murmurhash = hash_string_murmurhash(&info.name); @@ -629,9 +604,9 @@ static void object_database_modern_read_inner(object_database* obj_db, stream* s else for (uint32_t i = 0; i < object_count; i++) { object_info_data info; - info.id = io_read_uint32_t_stream_reverse_endianness(s); - uint32_t set_id = io_read_uint32_t_stream_reverse_endianness(s); - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &info.name); + info.id = s.read_uint32_t_reverse_endianness(); + uint32_t set_id = s.read_uint32_t_reverse_endianness(); + info.name = s.read_string_null_terminated_offset(s.read_offset_x()); info.name_hash_fnv1a64m = hash_string_fnv1a64m(&info.name); info.name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info.name, true); info.name_hash_murmurhash = hash_string_murmurhash(&info.name); @@ -642,16 +617,16 @@ static void object_database_modern_read_inner(object_database* obj_db, stream* s break; } } - io_position_pop(s); + s.position_pop(); obj_db->is_x = is_x; obj_db->modern = true; obj_db->ready = true; } -static void object_database_modern_write_inner(object_database* obj_db, stream* s) { +static void object_database_modern_write_inner(object_database* obj_db, stream& s) { stream s_mosi; - io_open(&s_mosi); + s_mosi.open(); uint32_t off; enrs e; enrs_entry ee; @@ -708,21 +683,21 @@ static void object_database_modern_write_inner(object_database* obj_db, stream* off = align_val(off, 0x10); } - io_write_int32_t(&s_mosi, 0); - io_write_int32_t(&s_mosi, 0); - io_write_offset(&s_mosi, 0, 0, is_x); - io_write_int32_t(&s_mosi, 0); - io_write_offset(&s_mosi, 0, 0, is_x); - io_write(&s_mosi, 0x08); - io_align_write(&s_mosi, 0x10); + s_mosi.write_int32_t(0); + s_mosi.write_int32_t(0); + s_mosi.write_offset(0, 0, is_x); + s_mosi.write_int32_t(0); + s_mosi.write_offset(0, 0, is_x); + s_mosi.write(0x08); + s_mosi.align_write(0x10); - int64_t object_sets_offset = io_get_position(&s_mosi); - io_write(&s_mosi, object_set_count * (is_x ? 0x38ULL : 0x24ULL)); - io_align_write(&s_mosi, 0x10); + int64_t object_sets_offset = s_mosi.get_position(); + s_mosi.write(object_set_count * (is_x ? 0x38ULL : 0x24ULL)); + s_mosi.align_write(0x10); - int64_t objects_offset = io_get_position(&s_mosi); - io_write(&s_mosi, object_count * (is_x ? 0x10ULL : 0x0CULL)); - io_align_write(&s_mosi, 0x10); + int64_t objects_offset = s_mosi.get_position(); + s_mosi.write(object_count * (is_x ? 0x10ULL : 0x0CULL)); + s_mosi.align_write(0x10); std::vector strings; std::vector string_offsets; @@ -741,56 +716,56 @@ static void object_database_modern_write_inner(object_database* obj_db, stream* quicksort_string(strings.data(), strings.size()); string_offsets.reserve(strings.size()); for (std::string& i : strings) { - string_offsets.push_back(io_get_position(&s_mosi)); - io_write_string_null_terminated(&s_mosi, &i); + string_offsets.push_back(s_mosi.get_position()); + s_mosi.write_string_null_terminated(i); } - io_align_write(&s_mosi, 0x10); + s_mosi.align_write(0x10); - io_position_push(&s_mosi, 0x00, SEEK_SET); - io_write_uint32_t(&s_mosi, 0); - io_write_uint32_t(&s_mosi, object_set_count); - io_write_uint32_t(&s_mosi, 0); - io_write_offset_pof_add(&s_mosi, object_sets_offset, 0x20, is_x, &pof); - io_write_uint32_t(&s_mosi, object_count); - io_write_offset_pof_add(&s_mosi, objects_offset, 0x20, is_x, &pof); - io_write(&s_mosi, 0x08); - io_align_write(&s_mosi, 0x10); + s_mosi.position_push(0x00, SEEK_SET); + s_mosi.write_uint32_t(0); + s_mosi.write_uint32_t(object_set_count); + s_mosi.write_uint32_t(0); + io_write_offset_pof_add(s_mosi, object_sets_offset, 0x20, is_x, &pof); + s_mosi.write_uint32_t(object_count); + io_write_offset_pof_add(s_mosi, objects_offset, 0x20, is_x, &pof); + s_mosi.write(0x08); + s_mosi.align_write(0x10); if (!is_x) for (object_set_info& i : obj_db->object_set) { - io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + io_write_offset_f2_pof_add(s_mosi, object_database_strings_get_string_offset(strings, string_offsets, i.name), 0x20, &pof); - io_write_uint32_t(&s_mosi, i.id); - io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + s_mosi.write_uint32_t(i.id); + io_write_offset_f2_pof_add(s_mosi, object_database_strings_get_string_offset(strings, string_offsets, i.object_file_name), 0x20, &pof); - io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + io_write_offset_f2_pof_add(s_mosi, object_database_strings_get_string_offset(strings, string_offsets, i.texture_file_name), 0x20, &pof); - io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + io_write_offset_f2_pof_add(s_mosi, object_database_strings_get_string_offset(strings, string_offsets, i.archive_file_name), 0x20, &pof); - io_write(&s_mosi, 0x10); + s_mosi.write(0x10); } else for (object_set_info& i : obj_db->object_set) { - io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + io_write_offset_x_pof_add(s_mosi, object_database_strings_get_string_offset(strings, string_offsets, i.name), &pof); - io_write_uint32_t(&s_mosi, i.id); - io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + s_mosi.write_uint32_t(i.id); + io_write_offset_x_pof_add(s_mosi, object_database_strings_get_string_offset(strings, string_offsets, i.object_file_name), &pof); - io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + io_write_offset_x_pof_add(s_mosi, object_database_strings_get_string_offset(strings, string_offsets, i.texture_file_name), &pof); - io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + io_write_offset_x_pof_add(s_mosi, object_database_strings_get_string_offset(strings, string_offsets, i.archive_file_name), &pof); - io_write(&s_mosi, 0x10); + s_mosi.write(0x10); } - io_align_write(&s_mosi, 0x10); + s_mosi.align_write(0x10); if (!is_x) for (object_set_info& i : obj_db->object_set) { uint32_t set_id = i.id; for (object_info_data& j : i.object) { - io_write_uint32_t(&s_mosi, j.id); - io_write_uint32_t(&s_mosi, set_id); - io_write_offset_f2_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + s_mosi.write_uint32_t(j.id); + s_mosi.write_uint32_t(set_id); + io_write_offset_f2_pof_add(s_mosi, object_database_strings_get_string_offset(strings, string_offsets, j.name), 0x20, &pof); } } @@ -798,18 +773,18 @@ static void object_database_modern_write_inner(object_database* obj_db, stream* for (object_set_info& i : obj_db->object_set) { uint32_t set_id = i.id; for (object_info_data& j : i.object) { - io_write_uint32_t(&s_mosi, j.id); - io_write_uint32_t(&s_mosi, set_id); - io_write_offset_x_pof_add(&s_mosi, object_database_strings_get_string_offset(strings, + s_mosi.write_uint32_t(j.id); + s_mosi.write_uint32_t(set_id); + io_write_offset_x_pof_add(s_mosi, object_database_strings_get_string_offset(strings, string_offsets, j.name), &pof); } } - io_position_pop(&s_mosi); + s_mosi.position_pop(); f2_struct st; - io_align_write(&s_mosi, 0x10); - io_copy(&s_mosi, &st.data); - io_free(&s_mosi); + s_mosi.align_write(0x10); + s_mosi.copy(st.data); + s_mosi.close(); st.enrs = e; st.pof = pof; diff --git a/src/KKdLib/database/object.hpp b/src/KKdLib/database/object.hpp index d8c93b88..920dc268 100644 --- a/src/KKdLib/database/object.hpp +++ b/src/KKdLib/database/object.hpp @@ -7,7 +7,7 @@ #include #include -#include "../default.h" +#include "../default.hpp" struct object_info { uint32_t id; diff --git a/src/KKdLib/database/sprite.c b/src/KKdLib/database/sprite.cpp similarity index 72% rename from src/KKdLib/database/sprite.c rename to src/KKdLib/database/sprite.cpp index 057035c8..c8c8724f 100644 --- a/src/KKdLib/database/sprite.c +++ b/src/KKdLib/database/sprite.cpp @@ -3,4 +3,4 @@ GitHub/GitLab: korenkonder */ -#include "sprite.h" +#include "sprite.hpp" diff --git a/src/KKdLib/database/string_array.h b/src/KKdLib/database/sprite.hpp similarity index 73% rename from src/KKdLib/database/string_array.h rename to src/KKdLib/database/sprite.hpp index ae73750d..3b25d82b 100644 --- a/src/KKdLib/database/string_array.h +++ b/src/KKdLib/database/sprite.hpp @@ -5,4 +5,4 @@ #pragma once -#include "../default.h" +#include "../default.hpp" diff --git a/src/KKdLib/database/stage.cpp b/src/KKdLib/database/stage.cpp index 7a5f4c6d..eedef5eb 100644 --- a/src/KKdLib/database/stage.cpp +++ b/src/KKdLib/database/stage.cpp @@ -5,15 +5,15 @@ #include "stage.hpp" #include "../f2/struct.hpp" -#include "../io/path.h" -#include "../io/stream.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" #include "../hash.hpp" -#include "../str_utils.h" +#include "../str_utils.hpp" -static void stage_database_classic_read_inner(stage_database* stage_data, stream* s); -static void stage_database_classic_write_inner(stage_database* stage_data, stream* s); -static void stage_database_modern_read_inner(stage_database* stage_data, stream* s, uint32_t header_length); -static void stage_database_modern_write_inner(stage_database* stage_data, stream* s); +static void stage_database_classic_read_inner(stage_database* stage_data, stream& s); +static void stage_database_classic_write_inner(stage_database* stage_data, stream& s); +static void stage_database_modern_read_inner(stage_database* stage_data, stream& s, uint32_t header_length); +static void stage_database_modern_write_inner(stage_database* stage_data, stream& s); stage_data::stage_data() : id(), object_set_id(), lens_flare_texture(), lens_shaft_texture(), lens_ghost_texture(), unknown(), render_texture(), movie_texture(), reflect_type(), refract_enable(), @@ -57,17 +57,15 @@ void stage_database::read(const char* path, bool modern) { char* path_bin = str_utils_add(path, ".bin"); if (path_check_file_exists(path_bin)) { stream s; - io_open(&s, path_bin, "rb"); + s.open(path_bin, "rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); - io_read(&s, data, s.length); + s.read(data, s.length); stream s_bin; - io_open(&s_bin, data, s.length); - stage_database_classic_read_inner(this, &s_bin); - io_free(&s_bin); + s_bin.open(data, s.length); + stage_database_classic_read_inner(this, s_bin); free(data); } - io_free(&s); } free(path_bin); } @@ -78,10 +76,9 @@ void stage_database::read(const char* path, bool modern) { st.read(path_stg); if (st.header.signature == reverse_endianness_uint32_t('STGC')) { stream s_stgc; - io_open(&s_stgc, &st.data); + s_stgc.open(st.data); s_stgc.is_big_endian = st.header.use_big_endian; - stage_database_modern_read_inner(this, &s_stgc, st.header.length); - io_free(&s_stgc); + stage_database_modern_read_inner(this, s_stgc, st.header.length); } } free(path_stg); @@ -96,17 +93,15 @@ void stage_database::read(const wchar_t* path, bool 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"); + s.open(path_bin, L"rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); - io_read(&s, data, s.length); + s.read(data, s.length); stream s_bin; - io_open(&s_bin, data, s.length); - stage_database_classic_read_inner(this, &s_bin); - io_free(&s_bin); + s_bin.open(data, s.length); + stage_database_classic_read_inner(this, s_bin); free(data); } - io_free(&s); } free(path_bin); } @@ -117,10 +112,9 @@ void stage_database::read(const wchar_t* path, bool modern) { st.read(path_stg); if (st.header.signature == reverse_endianness_uint32_t('STGC')) { stream s_stgc; - io_open(&s_stgc, &st.data); + s_stgc.open(st.data); s_stgc.is_big_endian = st.header.use_big_endian; - stage_database_modern_read_inner(this, &s_stgc, st.header.length); - io_free(&s_stgc); + stage_database_modern_read_inner(this, s_stgc, st.header.length); } } free(path_stg); @@ -133,19 +127,17 @@ void stage_database::read(const void* data, size_t size, bool modern) { if (!modern) { stream s; - io_open(&s, data, size); - stage_database_classic_read_inner(this, &s); - io_free(&s); + s.open(data, size); + stage_database_classic_read_inner(this, s); } else { f2_struct st; st.read(data, size); if (st.header.signature == reverse_endianness_uint32_t('STGC')) { stream s_stgc; - io_open(&s_stgc, &st.data); + s_stgc.open(st.data); s_stgc.is_big_endian = st.header.use_big_endian; - stage_database_modern_read_inner(this, &s_stgc, st.header.length); - io_free(&s_stgc); + stage_database_modern_read_inner(this, s_stgc, st.header.length); } } } @@ -157,19 +149,17 @@ void stage_database::write(const char* path) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); stream s; - io_open(&s, path_bin, "wb"); + s.open(path_bin, "wb"); if (s.io.stream) - stage_database_classic_write_inner(this, &s); - io_free(&s); + stage_database_classic_write_inner(this, s); free(path_bin); } else { char* path_stg = str_utils_add(path, ".stg"); stream s; - io_open(&s, path_stg, "wb"); + s.open(path_stg, "wb"); if (s.io.stream) - stage_database_modern_write_inner(this, &s); - io_free(&s); + stage_database_modern_write_inner(this, s); free(path_stg); } } @@ -181,19 +171,17 @@ void stage_database::write(const wchar_t* path) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); stream s; - io_open(&s, path_bin, L"wb"); + s.open(path_bin, L"wb"); if (s.io.stream) - stage_database_classic_write_inner(this, &s); - io_free(&s); + stage_database_classic_write_inner(this, s); free(path_bin); } else { wchar_t* path_stg = str_utils_add(path, L".stg"); stream s; - io_open(&s, path_stg, L"wb"); + s.open(path_stg, L"wb"); if (s.io.stream) - stage_database_modern_write_inner(this, &s); - io_free(&s); + stage_database_modern_write_inner(this, s); free(path_stg); } } @@ -203,14 +191,13 @@ void stage_database::write(void** data, size_t* size) { return; stream s; - io_open(&s); + s.open(); if (!modern) - stage_database_classic_write_inner(this, &s); + stage_database_classic_write_inner(this, s); else - stage_database_modern_write_inner(this, &s); - io_align_write(&s, 0x10); - io_copy(&s, data, size); - io_free(&s); + stage_database_modern_write_inner(this, s); + s.align_write(0x10); + s.copy(data, size); } bool stage_database::load_file(void* data, const char* path, const char* file, uint32_t hash) { @@ -228,6 +215,14 @@ bool stage_database::load_file(void* data, const char* path, const char* file, u return stage_data->ready; } +int32_t stage_database::get_stage_index(const char* name) { + uint32_t name_hash = hash_utf8_murmurhash(name); + for (::stage_data& i : stage_data) + if (name_hash == i.name_hash) + return (int32_t)(&i - stage_data.data()); + return -1; +} + void stage_database::merge_mdata(stage_database* base_stage_data, stage_database* mdata_stage_data) { if (!base_stage_data || !mdata_stage_data || !base_stage_data->ready || !mdata_stage_data->ready) return; @@ -281,12 +276,12 @@ void stage_database::split_mdata(stage_database* base_stage_data, stage_database } -static void stage_database_classic_read_inner(stage_database* stage_data, stream* s) { - int32_t count = io_read_int32_t(s); - int32_t stages_offset = io_read_int32_t(s); - int32_t stage_effects_offset = io_read_int32_t(s); - int32_t auth3d_id_counts_offset = io_read_int32_t(s); - int32_t auth3d_ids_offsets_offset = io_read_int32_t(s); +static void stage_database_classic_read_inner(stage_database* stage_data, stream& s) { + int32_t count = s.read_int32_t(); + int32_t stages_offset = s.read_int32_t(); + int32_t stage_effects_offset = s.read_int32_t(); + int32_t auth3d_id_counts_offset = s.read_int32_t(); + int32_t auth3d_ids_offsets_offset = s.read_int32_t(); int32_t size = (stage_effects_offset - stages_offset) / count; stage_data->format = size == 104 ? STAGE_DATA_AC @@ -302,74 +297,74 @@ static void stage_database_classic_read_inner(stage_database* stage_data, stream stage_data->stage_data.resize(count); - io_position_push(s, stages_offset, SEEK_SET); + s.position_push(stages_offset, SEEK_SET); for (int32_t i = 0; i < count; i++) { ::stage_data* stage = &stage_data->stage_data[i]; stage->id = i; - io_read_string_null_terminated_offset(s, io_read_uint32_t(s), &stage->name); + stage->name = s.read_string_null_terminated_offset(s.read_uint32_t()); stage->name_hash = hash_string_murmurhash(&stage->name); - io_read_string_null_terminated_offset(s, io_read_uint32_t(s), &stage->auth_3d_name); - stage->object_set_id = (uint16_t)io_read_uint32_t(s); // Crutch to remove higher bits - stage->object_ground.id = io_read_uint16_t(s); - stage->object_ground.set_id = io_read_uint16_t(s); - stage->object_ring.id = io_read_uint16_t(s); - stage->object_ring.set_id = io_read_uint16_t(s); - stage->object_sky.id = io_read_uint16_t(s); - stage->object_sky.set_id = io_read_uint16_t(s); - stage->object_shadow.id = io_read_uint16_t(s); - stage->object_shadow.set_id = io_read_uint16_t(s); - stage->object_reflect.id = io_read_uint16_t(s); - stage->object_reflect.set_id = io_read_uint16_t(s); - stage->object_refract.id = io_read_uint16_t(s); - stage->object_refract.set_id = io_read_uint16_t(s); - stage->lens_flare_texture = io_read_uint32_t(s); - stage->lens_shaft_texture = io_read_uint32_t(s); - stage->lens_ghost_texture = io_read_uint32_t(s); - stage->lens_shaft_inv_scale = io_read_float_t(s); - stage->unknown = io_read_uint32_t(s); - stage->render_texture = io_read_uint32_t(s); + stage->auth_3d_name = s.read_string_null_terminated_offset(s.read_uint32_t()); + stage->object_set_id = (uint16_t)s.read_uint32_t(); // Crutch to remove higher bits + stage->object_ground.id = s.read_uint16_t(); + stage->object_ground.set_id = s.read_uint16_t(); + stage->object_ring.id = s.read_uint16_t(); + stage->object_ring.set_id = s.read_uint16_t(); + stage->object_sky.id = s.read_uint16_t(); + stage->object_sky.set_id = s.read_uint16_t(); + stage->object_shadow.id = s.read_uint16_t(); + stage->object_shadow.set_id = s.read_uint16_t(); + stage->object_reflect.id = s.read_uint16_t(); + stage->object_reflect.set_id = s.read_uint16_t(); + stage->object_refract.id = s.read_uint16_t(); + stage->object_refract.set_id = s.read_uint16_t(); + stage->lens_flare_texture = s.read_uint32_t(); + stage->lens_shaft_texture = s.read_uint32_t(); + stage->lens_ghost_texture = s.read_uint32_t(); + stage->lens_shaft_inv_scale = s.read_float_t(); + stage->unknown = s.read_uint32_t(); + stage->render_texture = s.read_uint32_t(); if (stage_data->format > STAGE_DATA_AC) - stage->movie_texture = io_read_uint32_t(s); + stage->movie_texture = s.read_uint32_t(); else stage->movie_texture = -1; - io_read_string_null_terminated_offset(s, io_read_uint32_t(s), &stage->collision_file_path); - stage->reflect_type = (stage_data_reflect_type)io_read_uint32_t(s); - stage->refract_enable = io_read_uint32_t(s) ? true : false; + stage->collision_file_path = s.read_string_null_terminated_offset(s.read_uint32_t()); + stage->reflect_type = (stage_data_reflect_type)s.read_uint32_t(); + stage->refract_enable = s.read_uint32_t() ? true : false; - int32_t reflect_offset = io_read_uint32_t(s); + int32_t reflect_offset = s.read_uint32_t(); if (reflect_offset) { - io_position_push(s, reflect_offset, SEEK_SET); + s.position_push(reflect_offset, SEEK_SET); stage->reflect = true; - stage->reflect_data.mode = (stage_data_reflect_resolution_mode)io_read_uint32_t(s); - stage->reflect_data.blur_num = io_read_uint32_t(s); - stage->reflect_data.blur_filter = (stage_data_blur_filter_mode)io_read_uint32_t(s); - io_position_pop(s); + stage->reflect_data.mode = (stage_data_reflect_resolution_mode)s.read_uint32_t(); + stage->reflect_data.blur_num = s.read_uint32_t(); + stage->reflect_data.blur_filter = (stage_data_blur_filter_mode)s.read_uint32_t(); + s.position_pop(); } else stage->reflect = false; - int32_t refract_offset = io_read_uint32_t(s); + int32_t refract_offset = s.read_uint32_t(); if (refract_offset) { - io_position_push(s, refract_offset, SEEK_SET); + s.position_push(refract_offset, SEEK_SET); stage->refract = true; - stage->refract_data.mode = (stage_data_refract_resolution_mode)io_read_uint32_t(s); - io_position_pop(s); + stage->refract_data.mode = (stage_data_refract_resolution_mode)s.read_uint32_t(); + s.position_pop(); } else stage->refract = false; if (stage_data->format > STAGE_DATA_F) - stage->flags = (stage_data_flags)io_read_uint32_t(s); + stage->flags = (stage_data_flags)s.read_uint32_t(); - stage->ring_rectangle_x = io_read_float_t(s); - stage->ring_rectangle_y = io_read_float_t(s); - stage->ring_rectangle_width = io_read_float_t(s); - stage->ring_rectangle_height = io_read_float_t(s); - stage->ring_height = io_read_float_t(s); - stage->ring_out_height = io_read_float_t(s); + stage->ring_rectangle_x = s.read_float_t(); + stage->ring_rectangle_y = s.read_float_t(); + stage->ring_rectangle_width = s.read_float_t(); + stage->ring_rectangle_height = s.read_float_t(); + stage->ring_height = s.read_float_t(); + stage->ring_out_height = s.read_float_t(); if (stage->object_ground.id == 0xFFFF) stage->object_ground.id = -1; @@ -401,152 +396,150 @@ static void stage_database_classic_read_inner(stage_database* stage_data, stream if (stage->object_refract.set_id == 0xFFFF) stage->object_refract.set_id = -1; } - io_position_pop(s); + s.position_pop(); - io_position_push(s, stage_effects_offset, SEEK_SET); + s.position_push(stage_effects_offset, SEEK_SET); for (int32_t i = 0; i < count; i++) { ::stage_data* stage = &stage_data->stage_data[i]; stage_effects* effects = &stage->effects; for (int32_t j = 0; j < 8; j++) - effects->field_0[j] = io_read_uint32_t(s); + effects->field_0[j] = s.read_uint32_t(); for (int32_t j = 0; j < 16; j++) - effects->field_20[j] = io_read_uint32_t(s); + effects->field_20[j] = s.read_uint32_t(); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, auth3d_id_counts_offset, SEEK_SET); + s.position_push(auth3d_id_counts_offset, SEEK_SET); for (int32_t i = 0; i < count; i++) { ::stage_data* stage = &stage_data->stage_data[i]; - stage->auth_3d_ids.resize(io_read_int32_t(s)); + stage->auth_3d_ids.resize(s.read_int32_t()); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, auth3d_ids_offsets_offset, SEEK_SET); + s.position_push(auth3d_ids_offsets_offset, SEEK_SET); for (int32_t i = 0; i < count; i++) { ::stage_data* stage = &stage_data->stage_data[i]; - uint32_t id = io_read_uint32_t(s); - uint32_t offset = io_read_uint32_t(s); + uint32_t id = s.read_uint32_t(); + uint32_t offset = s.read_uint32_t(); if (!offset) { stage->auth_3d_ids.clear(); stage->auth_3d_ids.shrink_to_fit(); continue; } - io_position_push(s, offset, SEEK_SET); + s.position_push(offset, SEEK_SET); int32_t auth_3d_count = (int32_t)stage->auth_3d_ids.size(); for (int32_t j = 0; j < auth_3d_count; j++) - if (io_read_int32_t(s) == -1) { + if (s.read_int32_t() == -1) { stage->auth_3d_ids.resize(j); stage->auth_3d_ids.shrink_to_fit(); break; } - io_position_pop(s); + s.position_pop(); if (stage->auth_3d_ids.size()) { - io_position_push(s, offset, SEEK_SET); + s.position_push(offset, SEEK_SET); for (int32_t& j : stage->auth_3d_ids) - j = io_read_int32_t(s); - io_position_pop(s); + j = s.read_int32_t(); + s.position_pop(); } } - io_position_pop(s); + s.position_pop(); stage_data->ready = true; stage_data->modern = false; stage_data->is_x = false; } -static void stage_database_classic_write_inner(stage_database* stage_data, stream* s) { +static void stage_database_classic_write_inner(stage_database* stage_data, stream& s) { } -static void stage_database_modern_read_inner(stage_database* stage_data, stream* s, uint32_t header_length) { +static void stage_database_modern_read_inner(stage_database* stage_data, stream& s, uint32_t header_length) { bool is_x = true; - io_set_position(s, 0x04, SEEK_SET); - is_x &= io_read_uint32_t_stream_reverse_endianness(s) == 0; + s.set_position(0x04, SEEK_SET); + is_x &= s.read_uint32_t_reverse_endianness() == 0; - io_set_position(s, 0x00, SEEK_SET); + s.set_position(0x00, SEEK_SET); - int32_t count = io_read_int32_t(s); - int64_t stages_offset = io_read_offset(s, header_length, is_x); + int32_t count = s.read_int32_t(); + int64_t stages_offset = s.read_offset(header_length, is_x); stage_data->stage_modern.resize(count); - io_position_push(s, stages_offset, SEEK_SET); + s.position_push(stages_offset, SEEK_SET); for (int32_t i = 0; i < count; i++) { stage_data_modern* stage = &stage_data->stage_modern[i]; - stage->hash = (uint32_t)io_read_uint64_t_stream_reverse_endianness(s); - io_read_string_null_terminated_offset(s, - io_read_offset(s, header_length, is_x), &stage->name); - io_read_string_null_terminated_offset(s, - io_read_offset(s, header_length, is_x), &stage->auth_3d_name); + stage->hash = (uint32_t)s.read_uint64_t_reverse_endianness(); + stage->name = s.read_string_null_terminated_offset(s.read_offset(header_length, is_x)); + stage->auth_3d_name = s.read_string_null_terminated_offset(s.read_offset(header_length, is_x)); stage->auth_3d_name_hash = hash_string_murmurhash(&stage->auth_3d_name); - stage->object_ground.set_id = io_read_uint32_t_stream_reverse_endianness(s); - stage->object_ground.id = io_read_uint32_t_stream_reverse_endianness(s); - stage->object_sky.id = io_read_uint32_t_stream_reverse_endianness(s); - stage->object_sky.set_id = io_read_uint32_t_stream_reverse_endianness(s); - stage->object_shadow.id = io_read_uint32_t_stream_reverse_endianness(s); - stage->object_shadow.set_id = io_read_uint32_t_stream_reverse_endianness(s); - stage->object_reflect.id = io_read_uint32_t_stream_reverse_endianness(s); - stage->object_reflect.set_id = io_read_uint32_t_stream_reverse_endianness(s); - stage->object_refract.id = io_read_uint32_t_stream_reverse_endianness(s); - stage->object_refract.set_id = io_read_uint32_t_stream_reverse_endianness(s); - stage->lens_shaft_inv_scale = io_read_float_t_stream_reverse_endianness(s); - stage->unknown = io_read_uint32_t_stream_reverse_endianness(s); - stage->render_texture = io_read_uint32_t_stream_reverse_endianness(s); - stage->render_texture_flag = io_read_uint32_t_stream_reverse_endianness(s); - stage->movie_texture = io_read_uint32_t_stream_reverse_endianness(s); - stage->movie_texture_flag = io_read_uint32_t_stream_reverse_endianness(s); - stage->field_04 = io_read_uint32_t_stream_reverse_endianness(s); - stage->field_04_flag = io_read_uint32_t_stream_reverse_endianness(s); - stage->field_05 = io_read_uint32_t_stream_reverse_endianness(s); - stage->field_05_flag = io_read_uint32_t_stream_reverse_endianness(s); - stage->field_06 = io_read_uint32_t_stream_reverse_endianness(s); - stage->field_06_flag = io_read_uint32_t_stream_reverse_endianness(s); - stage->field_07 = io_read_uint32_t_stream_reverse_endianness(s); - stage->field_07_flag = io_read_uint32_t_stream_reverse_endianness(s); - stage->field_08 = io_read_uint32_t_stream_reverse_endianness(s); - stage->field_09 = io_read_uint32_t_stream_reverse_endianness(s); - stage->field_10 = io_read_uint32_t_stream_reverse_endianness(s); + stage->object_ground.set_id = s.read_uint32_t_reverse_endianness(); + stage->object_ground.id = s.read_uint32_t_reverse_endianness(); + stage->object_sky.id = s.read_uint32_t_reverse_endianness(); + stage->object_sky.set_id = s.read_uint32_t_reverse_endianness(); + stage->object_shadow.id = s.read_uint32_t_reverse_endianness(); + stage->object_shadow.set_id = s.read_uint32_t_reverse_endianness(); + stage->object_reflect.id = s.read_uint32_t_reverse_endianness(); + stage->object_reflect.set_id = s.read_uint32_t_reverse_endianness(); + stage->object_refract.id = s.read_uint32_t_reverse_endianness(); + stage->object_refract.set_id = s.read_uint32_t_reverse_endianness(); + stage->lens_shaft_inv_scale = s.read_float_t_reverse_endianness(); + stage->unknown = s.read_uint32_t_reverse_endianness(); + stage->render_texture = s.read_uint32_t_reverse_endianness(); + stage->render_texture_flag = s.read_uint32_t_reverse_endianness(); + stage->movie_texture = s.read_uint32_t_reverse_endianness(); + stage->movie_texture_flag = s.read_uint32_t_reverse_endianness(); + stage->field_04 = s.read_uint32_t_reverse_endianness(); + stage->field_04_flag = s.read_uint32_t_reverse_endianness(); + stage->field_05 = s.read_uint32_t_reverse_endianness(); + stage->field_05_flag = s.read_uint32_t_reverse_endianness(); + stage->field_06 = s.read_uint32_t_reverse_endianness(); + stage->field_06_flag = s.read_uint32_t_reverse_endianness(); + stage->field_07 = s.read_uint32_t_reverse_endianness(); + stage->field_07_flag = s.read_uint32_t_reverse_endianness(); + stage->field_08 = s.read_uint32_t_reverse_endianness(); + stage->field_09 = s.read_uint32_t_reverse_endianness(); + stage->field_10 = s.read_uint32_t_reverse_endianness(); if (is_x) - io_read_uint32_t_stream_reverse_endianness(s); + s.read_uint32_t_reverse_endianness(); - stage->field_11 = io_read_offset(s, header_length, is_x); - stage->field_12 = io_read_offset(s, header_length, is_x); + stage->field_11 = s.read_offset(header_length, is_x); + stage->field_12 = s.read_offset(header_length, is_x); - stage->ring_rectangle_x = io_read_float_t_stream_reverse_endianness(s); - stage->ring_rectangle_y = io_read_float_t_stream_reverse_endianness(s); - stage->ring_rectangle_width = io_read_float_t_stream_reverse_endianness(s); - stage->ring_rectangle_height = io_read_float_t_stream_reverse_endianness(s); - stage->ring_height = io_read_float_t_stream_reverse_endianness(s); - stage->ring_out_height = io_read_float_t_stream_reverse_endianness(s); + stage->ring_rectangle_x = s.read_float_t_reverse_endianness(); + stage->ring_rectangle_y = s.read_float_t_reverse_endianness(); + stage->ring_rectangle_width = s.read_float_t_reverse_endianness(); + stage->ring_rectangle_height = s.read_float_t_reverse_endianness(); + stage->ring_height = s.read_float_t_reverse_endianness(); + stage->ring_out_height = s.read_float_t_reverse_endianness(); if (is_x) - stage->field_13 = io_read_uint32_t_stream_reverse_endianness(s); + stage->field_13 = s.read_uint32_t_reverse_endianness(); stage_effects* effects = &stage->effects; for (int32_t j = 0; j < 8; j++) - effects->field_0[j] = io_read_uint32_t_stream_reverse_endianness(s); + effects->field_0[j] = s.read_uint32_t_reverse_endianness(); for (int32_t j = 0; j < 16; j++) - effects->field_20[j] = io_read_uint32_t_stream_reverse_endianness(s); + effects->field_20[j] = s.read_uint32_t_reverse_endianness(); if (is_x) - io_read_uint32_t_stream_reverse_endianness(s); + s.read_uint32_t_reverse_endianness(); - int32_t auth3d_ids_count = io_read_int32_t_stream_reverse_endianness(s); - int64_t auth3d_ids_offset = io_read_offset(s, header_length, is_x); + int32_t auth3d_ids_count = s.read_int32_t_reverse_endianness(); + int64_t auth3d_ids_offset = s.read_offset(header_length, is_x); if (is_x) - io_read_uint32_t_stream_reverse_endianness(s); + s.read_uint32_t_reverse_endianness(); if (!auth3d_ids_offset) { stage->auth_3d_ids.clear(); @@ -554,23 +547,23 @@ static void stage_database_modern_read_inner(stage_database* stage_data, stream* continue; } - io_position_push(s, auth3d_ids_offset, SEEK_SET); + s.position_push(auth3d_ids_offset, SEEK_SET); for (int32_t j = 0; j < auth3d_ids_count; j++) - if (io_read_uint32_t(s) == hash_murmurhash_empty) { + if (s.read_uint32_t() == hash_murmurhash_empty) { stage->auth_3d_ids.resize(j); stage->auth_3d_ids.shrink_to_fit(); break; } - io_position_pop(s); + s.position_pop(); if (stage->auth_3d_ids.size()) { - io_position_push(s, auth3d_ids_offset, SEEK_SET); + s.position_push(auth3d_ids_offset, SEEK_SET); for (uint32_t& j : stage->auth_3d_ids) - j = io_read_int32_t(s); - io_position_pop(s); + j = s.read_int32_t(); + s.position_pop(); } } - io_position_pop(s); + s.position_pop(); stage_data->ready = true; stage_data->modern = true; @@ -578,7 +571,7 @@ static void stage_database_modern_read_inner(stage_database* stage_data, stream* stage_data->format = STAGE_DATA_UNK; } -static void stage_database_modern_write_inner(stage_database* stage_data, stream* s) { +static void stage_database_modern_write_inner(stage_database* stage_data, stream& s) { } diff --git a/src/KKdLib/database/stage.hpp b/src/KKdLib/database/stage.hpp index 294db526..aa503d04 100644 --- a/src/KKdLib/database/stage.hpp +++ b/src/KKdLib/database/stage.hpp @@ -7,7 +7,7 @@ #include #include -#include "../default.h" +#include "../default.hpp" #include "object.hpp" enum stage_data_format { @@ -166,6 +166,7 @@ struct stage_database { void write(const wchar_t* path); void write(void** data, size_t* size); + int32_t get_stage_index(const char* name); void merge_mdata(stage_database* base_stage_data, stage_database* mdata_stage_data); void split_mdata(stage_database* base_stage_data, stage_database* mdata_stage_data); diff --git a/src/KKdLib/database/string_array.c b/src/KKdLib/database/string_array.cpp similarity index 67% rename from src/KKdLib/database/string_array.c rename to src/KKdLib/database/string_array.cpp index 369e07b9..8cb62e17 100644 --- a/src/KKdLib/database/string_array.c +++ b/src/KKdLib/database/string_array.cpp @@ -3,4 +3,4 @@ GitHub/GitLab: korenkonder */ -#include "string_array.h" +#include "string_array.hpp" diff --git a/src/KKdLib/database/aet.h b/src/KKdLib/database/string_array.hpp similarity index 73% rename from src/KKdLib/database/aet.h rename to src/KKdLib/database/string_array.hpp index ae73750d..3b25d82b 100644 --- a/src/KKdLib/database/aet.h +++ b/src/KKdLib/database/string_array.hpp @@ -5,4 +5,4 @@ #pragma once -#include "../default.h" +#include "../default.hpp" diff --git a/src/KKdLib/database/texture.cpp b/src/KKdLib/database/texture.cpp index 7776745c..759ece44 100644 --- a/src/KKdLib/database/texture.cpp +++ b/src/KKdLib/database/texture.cpp @@ -5,16 +5,16 @@ #include "texture.hpp" #include "../f2/struct.hpp" -#include "../io/path.h" -#include "../io/stream.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" #include "../hash.hpp" #include "../sort.hpp" -#include "../str_utils.h" +#include "../str_utils.hpp" -static void texture_database_classic_read_inner(texture_database* tex_db, stream* s); -static void texture_database_classic_write_inner(texture_database* tex_db, stream* s); -static void texture_database_modern_read_inner(texture_database* tex_db, stream* s, uint32_t header_length); -static void texture_database_modern_write_inner(texture_database* tex_db, stream* s); +static void texture_database_classic_read_inner(texture_database* tex_db, stream& s); +static void texture_database_classic_write_inner(texture_database* tex_db, stream& s); +static void texture_database_modern_read_inner(texture_database* tex_db, stream& s, uint32_t header_length); +static void texture_database_modern_write_inner(texture_database* tex_db, stream& s); static int64_t texture_database_strings_get_string_offset(std::vector& vec, std::vector& vec_off, std::string& str); static void texture_database_strings_push_back_check(std::vector& vec, std::string& str); @@ -35,17 +35,15 @@ void texture_database::read(const char* path, bool modern) { char* path_bin = str_utils_add(path, ".bin"); if (path_check_file_exists(path_bin)) { stream s; - io_open(&s, path_bin, "rb"); + s.open(path_bin, "rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); - io_read(&s, data, s.length); + s.read(data, s.length); stream s_bin; - io_open(&s_bin, data, s.length); - texture_database_classic_read_inner(this, &s_bin); - io_free(&s_bin); + s_bin.open(data, s.length); + texture_database_classic_read_inner(this, s_bin); free(data); } - io_free(&s); } free(path_bin); } @@ -56,10 +54,9 @@ void texture_database::read(const char* path, bool modern) { st.read(path_txi); if (st.header.signature == reverse_endianness_uint32_t('MTXI')) { stream s_mtxi; - io_open(&s_mtxi, &st.data); + s_mtxi.open(st.data); s_mtxi.is_big_endian = st.header.use_big_endian; - texture_database_modern_read_inner(this, &s_mtxi, st.header.length); - io_free(&s_mtxi); + texture_database_modern_read_inner(this, s_mtxi, st.header.length); } } free(path_txi); @@ -74,17 +71,15 @@ void texture_database::read(const wchar_t* path, bool 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"); + s.open(path_bin, L"rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); - io_read(&s, data, s.length); + s.read(data, s.length); stream s_bin; - io_open(&s_bin, data, s.length); - texture_database_classic_read_inner(this, &s_bin); - io_free(&s_bin); + s_bin.open(data, s.length); + texture_database_classic_read_inner(this, s_bin); free(data); } - io_free(&s); } free(path_bin); } @@ -95,10 +90,9 @@ void texture_database::read(const wchar_t* path, bool modern) { st.read(path_txi); if (st.header.signature == reverse_endianness_uint32_t('MTXI')) { stream s_mtxi; - io_open(&s_mtxi, &st.data); + s_mtxi.open(st.data); s_mtxi.is_big_endian = st.header.use_big_endian; - texture_database_modern_read_inner(this, &s_mtxi, st.header.length); - io_free(&s_mtxi); + texture_database_modern_read_inner(this, s_mtxi, st.header.length); } } free(path_txi); @@ -111,19 +105,17 @@ void texture_database::read(const void* data, size_t size, bool modern) { if (!modern) { stream s; - io_open(&s, data, size); - texture_database_classic_read_inner(this, &s); - io_free(&s); + s.open(data, size); + texture_database_classic_read_inner(this, s); } else { f2_struct st; st.read(data, size); if (st.header.signature == reverse_endianness_uint32_t('MTXI')) { stream s_mtxi; - io_open(&s_mtxi, &st.data); + s_mtxi.open(st.data); s_mtxi.is_big_endian = st.header.use_big_endian; - texture_database_modern_read_inner(this, &s_mtxi, st.header.length); - io_free(&s_mtxi); + texture_database_modern_read_inner(this, s_mtxi, st.header.length); } } } @@ -135,19 +127,17 @@ void texture_database::write(const char* path) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); stream s; - io_open(&s, path_bin, "wb"); + s.open(path_bin, "wb"); if (s.io.stream) - texture_database_classic_write_inner(this, &s); - io_free(&s); + texture_database_classic_write_inner(this, s); free(path_bin); } else { char* path_txi = str_utils_add(path, ".txi"); stream s; - io_open(&s, path_txi, "wb"); + s.open(path_txi, "wb"); if (s.io.stream) - texture_database_modern_write_inner(this, &s); - io_free(&s); + texture_database_modern_write_inner(this, s); free(path_txi); } } @@ -159,19 +149,17 @@ void texture_database::write(const wchar_t* path) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); stream s; - io_open(&s, path_bin, L"wb"); + s.open(path_bin, L"wb"); if (s.io.stream) - texture_database_classic_write_inner(this, &s); - io_free(&s); + texture_database_classic_write_inner(this, s); free(path_bin); } else { wchar_t* path_txi = str_utils_add(path, L".txi"); stream s; - io_open(&s, path_txi, L"wb"); + s.open(path_txi, L"wb"); if (s.io.stream) - texture_database_modern_write_inner(this, &s); - io_free(&s); + texture_database_modern_write_inner(this, s); free(path_txi); } } @@ -181,14 +169,13 @@ void texture_database::write(void** data, size_t* size) { return; stream s; - io_open(&s); + s.open(); if (!modern) - texture_database_classic_write_inner(this, &s); + texture_database_classic_write_inner(this, s); else - texture_database_modern_write_inner(this, &s); - io_align_write(&s, 0x10); - io_copy(&s, data, size); - io_free(&s); + texture_database_modern_write_inner(this, s); + s.align_write(0x10); + s.copy(data, size); } void texture_database::merge_mdata(texture_database* base_tex_db, @@ -276,36 +263,36 @@ texture_info::~texture_info() { } -static void texture_database_classic_read_inner(texture_database* tex_db, stream* s) { - uint32_t textures_count = io_read_uint32_t(s); - uint32_t textures_offset = io_read_uint32_t(s); +static void texture_database_classic_read_inner(texture_database* tex_db, stream& s) { + uint32_t textures_count = s.read_uint32_t(); + uint32_t textures_offset = s.read_uint32_t(); tex_db->texture.resize(textures_count); - io_position_push(s, textures_offset, SEEK_SET); + s.position_push(textures_offset, SEEK_SET); for (uint32_t i = 0; i < textures_count; i++) { texture_info& info = tex_db->texture[i]; - info.id = io_read_uint32_t(s); - io_read_string_null_terminated_offset(s, io_read_uint32_t(s), &info.name); + info.id = s.read_uint32_t(); + info.name = s.read_string_null_terminated_offset(s.read_uint32_t()); info.name_hash = hash_string_murmurhash(&info.name); } - io_position_pop(s); + s.position_pop(); tex_db->is_x = false; tex_db->modern = false; tex_db->ready = true; } -static void texture_database_classic_write_inner(texture_database* tex_db, stream* s) { - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_write_uint32_t(s, 0x90669066); - io_align_write(s, 0x20); +static void texture_database_classic_write_inner(texture_database* tex_db, stream& s) { + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.write_uint32_t(0x90669066); + s.align_write(0x20); uint32_t textures_count = (uint32_t)tex_db->texture.size(); @@ -313,65 +300,65 @@ static void texture_database_classic_write_inner(texture_database* tex_db, strea string_offsets.reserve(textures_count); for (texture_info& i : tex_db->texture) { - string_offsets.push_back(io_get_position(s)); - io_write_string_null_terminated(s, &i.name); + string_offsets.push_back(s.get_position()); + s.write_string_null_terminated(i.name); } - io_align_write(s, 0x20); + s.align_write(0x20); - int64_t textures_offset = io_get_position(s); + int64_t textures_offset = s.get_position(); if (string_offsets.size()) { size_t off_idx = 0; for (texture_info& i : tex_db->texture) { - io_write_uint32_t(s, i.id); - io_write_uint32_t(s, (uint32_t)string_offsets[off_idx++]); + s.write_uint32_t(i.id); + s.write_uint32_t((uint32_t)string_offsets[off_idx++]); } } - io_align_write(s, 0x20); + s.align_write(0x20); - io_position_push(s, 0x00, SEEK_SET); - io_write_uint32_t(s, textures_count); - io_write_uint32_t(s, (uint32_t)textures_offset); - io_position_pop(s); + s.position_push(0x00, SEEK_SET); + s.write_uint32_t(textures_count); + s.write_uint32_t((uint32_t)textures_offset); + s.position_pop(); } -static void texture_database_modern_read_inner(texture_database* tex_db, stream* s, uint32_t header_length) { +static void texture_database_modern_read_inner(texture_database* tex_db, stream& s, uint32_t header_length) { bool is_x = true; - io_set_position(s, 0x04, SEEK_SET); - is_x &= io_read_uint32_t_stream_reverse_endianness(s) == 0; + s.set_position(0x04, SEEK_SET); + is_x &= s.read_uint32_t_reverse_endianness() == 0; - io_set_position(s, 0x00, SEEK_SET); + s.set_position(0x00, SEEK_SET); - uint32_t textures_count = io_read_uint32_t_stream_reverse_endianness(s); - int64_t textures_offset = io_read_offset(s, header_length, is_x); + uint32_t textures_count = s.read_uint32_t_reverse_endianness(); + int64_t textures_offset = s.read_offset(header_length, is_x); tex_db->texture.resize(textures_count); - io_position_push(s, textures_offset, SEEK_SET); + s.position_push(textures_offset, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < textures_count; i++) { texture_info& info = tex_db->texture[i]; - info.id = io_read_uint32_t_stream_reverse_endianness(s); - io_read_string_null_terminated_offset(s, io_read_offset_f2(s, header_length), &info.name); + info.id = s.read_uint32_t_reverse_endianness(); + info.name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length)); info.name_hash = hash_string_murmurhash(&info.name); } else for (uint32_t i = 0; i < textures_count; i++) { texture_info& info = tex_db->texture[i]; - info.id = io_read_uint32_t_stream_reverse_endianness(s); - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &info.name); + info.id = s.read_uint32_t_reverse_endianness(); + info.name = s.read_string_null_terminated_offset(s.read_offset_x()); info.name_hash = hash_string_murmurhash(&info.name); } - io_position_pop(s); + s.position_pop(); tex_db->is_x = is_x; tex_db->modern = true; tex_db->ready = true; } -static void texture_database_modern_write_inner(texture_database* tex_db, stream* s) { +static void texture_database_modern_write_inner(texture_database* tex_db, stream& s) { stream s_mtxi; - io_open(&s_mtxi); + s_mtxi.open(); uint32_t off; enrs e; enrs_entry ee; @@ -403,13 +390,13 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream textures_count--; } - io_write_int32_t(&s_mtxi, 0); - io_write_offset(&s_mtxi, 0, 0x20, is_x); - io_align_write(&s_mtxi, 0x10); + s_mtxi.write_int32_t(0); + s_mtxi.write_offset(0, 0x20, is_x); + s_mtxi.align_write(0x10); - int64_t textures_offset = io_get_position(&s_mtxi); - io_write(&s_mtxi, textures_count * (is_x ? 0x10ULL : 0x08ULL)); - io_align_write(&s_mtxi, 0x10); + int64_t textures_offset = s_mtxi.get_position(); + s_mtxi.write(textures_count * (is_x ? 0x10ULL : 0x08ULL)); + s_mtxi.align_write(0x10); std::vector strings; std::vector string_offsets; @@ -422,36 +409,36 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream quicksort_string(strings.data(), strings.size()); string_offsets.reserve(strings.size()); for (std::string& i : strings) { - string_offsets.push_back(io_get_position(&s_mtxi)); - io_write_string_null_terminated(&s_mtxi, &i); + string_offsets.push_back(s_mtxi.get_position()); + s_mtxi.write_string_null_terminated(i); } - io_align_write(&s_mtxi, 0x10); + s_mtxi.align_write(0x10); - io_position_push(&s_mtxi, 0x00, SEEK_SET); - io_write_uint32_t(&s_mtxi, textures_count); - io_write_offset_pof_add(&s_mtxi, textures_offset, 0x20, is_x, &pof); - io_align_write(&s_mtxi, 0x10); + s_mtxi.position_push(0x00, SEEK_SET); + s_mtxi.write_uint32_t(textures_count); + io_write_offset_pof_add(s_mtxi, textures_offset, 0x20, is_x, &pof); + s_mtxi.align_write(0x10); if (!is_x) for (texture_info& i : tex_db->texture) { - io_write_uint32_t(&s_mtxi, i.id); + s_mtxi.write_uint32_t(i.id); int64_t offset = texture_database_strings_get_string_offset(strings, string_offsets, i.name); - io_write_offset_f2_pof_add(&s_mtxi, offset, 0x20, &pof); + io_write_offset_f2_pof_add(s_mtxi, offset, 0x20, &pof); } else for (texture_info& i : tex_db->texture) { - io_write_uint32_t(&s_mtxi, i.id); + s_mtxi.write_uint32_t(i.id); int64_t offset = texture_database_strings_get_string_offset(strings, string_offsets, i.name); - io_write_offset_x_pof_add(&s_mtxi, offset, &pof); + io_write_offset_x_pof_add(s_mtxi, offset, &pof); } - io_position_pop(&s_mtxi); + s_mtxi.position_pop(); f2_struct st; - io_align_write(&s_mtxi, 0x10); - io_copy(&s_mtxi, &st.data); - io_free(&s_mtxi); + s_mtxi.align_write(0x10); + s_mtxi.copy(st.data); + s_mtxi.close(); st.enrs = e; st.pof = pof; diff --git a/src/KKdLib/database/texture.hpp b/src/KKdLib/database/texture.hpp index 9336f18d..6c9ca6a0 100644 --- a/src/KKdLib/database/texture.hpp +++ b/src/KKdLib/database/texture.hpp @@ -7,7 +7,7 @@ #include #include -#include "../default.h" +#include "../default.hpp" struct texture_info { std::string name; diff --git a/src/KKdLib/dds.c b/src/KKdLib/dds.cpp similarity index 77% rename from src/KKdLib/dds.c rename to src/KKdLib/dds.cpp index 88005c3c..9935f06e 100644 --- a/src/KKdLib/dds.c +++ b/src/KKdLib/dds.cpp @@ -3,9 +3,9 @@ GitHub/GitLab: korenkonder */ -#include "dds.h" -#include "io/stream.h" -#include "str_utils.h" +#include "dds.hpp" +#include "io/stream.hpp" +#include "str_utils.hpp" #pragma pack(push, 1) @@ -148,36 +148,48 @@ DDSCONST DDS_PIXELFORMAT DDSPF_A8 = static void dds_reverse_rgb(txp_format format, int64_t size, uint8_t* data); static bool dds_check_is_dxt1a(int64_t size, uint8_t* data); -dds* dds_init() { - dds* d = force_malloc_s(dds, 1); - return d; +dds::dds() : format(), width(), height(), mipmaps_count(), has_cube_map() { + } -void dds_read(dds* d, const char* path) { - if (!d || !path) +dds::~dds() { + for (void*& i : data) { + free(i); + i = 0; + } +} + +void dds::read( const char* path) { + if (!this || !path) return; wchar_t* path_buf = utf8_to_utf16(path); - dds_read(d, path_buf); + read(path_buf); free(path_buf); } -void dds_read(dds* d, const wchar_t* path) { - if (!d || !path) +void dds::read(const wchar_t* path) { + if (!this || !path) return; - vector_old_ptr_void_free(&d->data, 0); - memset(d, 0, sizeof(dds)); + format = (txp_format)0; + width = 0; + height = 0; + mipmaps_count = 0; + has_cube_map = 0; + data.clear(); + data.shrink_to_fit(); + wchar_t* path_dds = str_utils_add(path, L".dds"); stream s; - io_open(&s, path_dds, L"rb"); + s.open(path_dds, L"rb"); if (s.io.stream) { - if (io_read_uint32_t_reverse_endianness(&s, true) != DDS_MAGIC) + if (s.read_uint32_t_reverse_endianness(true) != DDS_MAGIC) goto End; DDS_HEADER dds_h; memset(&dds_h, 0, sizeof(DDS_HEADER)); - if (io_read(&s, &dds_h, sizeof(DDS_HEADER)) != sizeof(DDS_HEADER)) + if (s.read(&dds_h, sizeof(DDS_HEADER)) != sizeof(DDS_HEADER)) goto End; if (!((dds_h.flags & DDSD_CAPS) && (dds_h.flags & DDSD_HEIGHT) @@ -192,128 +204,126 @@ void dds_read(dds* d, const wchar_t* path) { bool reverse = false; if (!memcmp(&dds_h.ddspf, &DDSPF_A8, sizeof(DDS_PIXELFORMAT))) - d->format = TXP_A8; + format = TXP_A8; else if (!memcmp(&dds_h.ddspf, &DDSPF_R8G8B8, sizeof(DDS_PIXELFORMAT))) { - d->format = TXP_RGB8; + format = TXP_RGB8; reverse = true; } else if (!memcmp(&dds_h.ddspf, &DDSPF_B8G8R8, sizeof(DDS_PIXELFORMAT))) - d->format = TXP_RGB8; + format = TXP_RGB8; else if (!memcmp(&dds_h.ddspf, &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT))) { - d->format = TXP_RGBA8; + format = TXP_RGBA8; reverse = true; } else if (!memcmp(&dds_h.ddspf, &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT))) - d->format = TXP_RGBA8; + format = TXP_RGBA8; else if (!memcmp(&dds_h.ddspf, &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT))) { - d->format = TXP_RGB5; + format = TXP_RGB5; reverse = true; } else if (!memcmp(&dds_h.ddspf, &DDSPF_B5G6R5, sizeof(DDS_PIXELFORMAT))) - d->format = TXP_RGB5; + format = TXP_RGB5; else if (!memcmp(&dds_h.ddspf, &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT))) { - d->format = TXP_RGB5A1; + format = TXP_RGB5A1; reverse = true; } else if (!memcmp(&dds_h.ddspf, &DDSPF_A1B5G5R5, sizeof(DDS_PIXELFORMAT))) - d->format = TXP_A8; + format = TXP_A8; else if (!memcmp(&dds_h.ddspf, &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT))) { - d->format = TXP_RGBA4; + format = TXP_RGBA4; reverse = true; } else if (!memcmp(&dds_h.ddspf, &DDSPF_A4B4G4R4, sizeof(DDS_PIXELFORMAT))) - d->format = TXP_RGBA4; + format = TXP_RGBA4; else if (!memcmp(&dds_h.ddspf, &DDSPF_DXT1, sizeof(uint32_t) * 3)) - d->format = TXP_DXT1; + format = TXP_DXT1; else if (!memcmp(&dds_h.ddspf, &DDSPF_DXT3, sizeof(uint32_t) * 3)) - d->format = TXP_DXT3; + format = TXP_DXT3; else if (!memcmp(&dds_h.ddspf, &DDSPF_DXT5, sizeof(uint32_t) * 3)) - d->format = TXP_DXT5; + format = TXP_DXT5; else if (!memcmp(&dds_h.ddspf, &DDSPF_ATI1, sizeof(uint32_t) * 3)) - d->format = TXP_ATI1; + format = TXP_ATI1; else if (!memcmp(&dds_h.ddspf, &DDSPF_BC4_UNORM, sizeof(uint32_t) * 3)) - d->format = TXP_ATI1; + format = TXP_ATI1; else if (!memcmp(&dds_h.ddspf, &DDSPF_ATI2, sizeof(uint32_t) * 3)) - d->format = TXP_ATI2; + format = TXP_ATI2; else if (!memcmp(&dds_h.ddspf, &DDSPF_BC5_UNORM, sizeof(uint32_t) * 3)) - d->format = TXP_ATI2; + format = TXP_ATI2; else if (!memcmp(&dds_h.ddspf, &DDSPF_L8, sizeof(DDS_PIXELFORMAT))) - d->format = TXP_L8; + format = TXP_L8; else if (!memcmp(&dds_h.ddspf, &DDSPF_L8A8, sizeof(DDS_PIXELFORMAT))) { - d->format = TXP_L8A8; + format = TXP_L8A8; reverse = true; } else if (!memcmp(&dds_h.ddspf, &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT))) - d->format = TXP_L8A8; + format = TXP_L8A8; else goto End; - d->width = dds_h.width; - d->height = dds_h.height; - d->mipmaps_count = dds_h.flags & DDSD_MIPMAPCOUNT ? dds_h.mipMapCount : 1; - d->has_cube_map = dds_h.caps2 & DDS_cube_map ? true : false; - d->data = vector_old_ptr_empty(void); - vector_old_ptr_void_reserve(&d->data, d->has_cube_map ? d->mipmaps_count * 6ULL : d->mipmaps_count); + width = dds_h.width; + height = dds_h.height; + mipmaps_count = dds_h.flags & DDSD_MIPMAPCOUNT ? dds_h.mipMapCount : 1; + has_cube_map = dds_h.caps2 & DDS_cube_map ? true : false; + data.reserve(has_cube_map ? mipmaps_count * 6ULL : mipmaps_count); do - for (uint32_t i = 0; i < d->mipmaps_count; i++) { - uint32_t width = max(d->width >> i, 1); - uint32_t height = max(d->height >> i, 1); - uint32_t size = txp::get_size(d->format, - max(d->width >> i, 1), max(d->height >> i, 1)); + for (uint32_t i = 0; i < mipmaps_count; i++) { + uint32_t width = max(this->width >> i, 1); + uint32_t height = max(this->height >> i, 1); + uint32_t size = txp::get_size(format, + max(this->width >> i, 1), max(this->height >> i, 1)); void* data = force_malloc(size); - io_read(&s, data, size); + s.read(data, size); if (reverse) - dds_reverse_rgb(d->format, size, (uint8_t*)data); - else if (d->format == TXP_DXT1 && dds_check_is_dxt1a(size, (uint8_t*)data)) - d->format = TXP_DXT1a; - vector_old_ptr_void_push_back(&d->data, &data); + dds_reverse_rgb(format, size, (uint8_t*)data); + else if (format == TXP_DXT1 && dds_check_is_dxt1a(size, (uint8_t*)data)) + format = TXP_DXT1a; + this->data.push_back(data); } - while (d->has_cube_map && vector_old_length(d->data) / d->mipmaps_count < 6); + while (has_cube_map && data.size() / mipmaps_count < 6); } End: - io_free(&s); free(path_dds); } -void dds_write(dds* d, const char* path) { - if (!d || !path || vector_old_length(d->data) < 1) +void dds::write(const char* path) { + if (!this || !path || data.size() < 1) return; wchar_t* path_buf = utf8_to_utf16(path); - dds_write(d, path_buf); + write( path_buf); free(path_buf); } -void dds_write(dds* d, const wchar_t* path) { - if (!d || !path || vector_old_length(d->data) < 1) +void dds::write(const wchar_t* path) { + if (!this || !path || data.size() < 1) return; wchar_t* path_dds = str_utils_add(path, L".dds"); stream s; - io_open(&s, path_dds, L"wb"); + s.open(path_dds, L"wb"); if (s.io.stream) { DDS_HEADER dds_h; memset(&dds_h, 0, sizeof(DDS_HEADER)); dds_h.size = sizeof(DDS_HEADER); dds_h.flags = DDS_HEADER_FLAGS_TEXTURE | DDSD_LINEARSIZE; - if (d->mipmaps_count > 1) + if (mipmaps_count > 1) dds_h.flags |= DDSD_MIPMAPCOUNT; - dds_h.height = d->height; - dds_h.width = d->width; - dds_h.pitchOrLinearSize = txp::get_size(d->format, d->width, d->height); - dds_h.mipMapCount = d->mipmaps_count; + dds_h.height = height; + dds_h.width = width; + dds_h.pitchOrLinearSize = txp::get_size(format, width, height); + dds_h.mipMapCount = mipmaps_count; dds_h.caps |= DDS_SURFACE_FLAGS_TEXTURE; - if (d->has_cube_map) + if (has_cube_map) dds_h.caps |= DDS_SURFACE_FLAGS_cube_map; - if (d->mipmaps_count > 1) + if (mipmaps_count > 1) dds_h.caps |= DDS_SURFACE_FLAGS_MIPMAP; - if (d->has_cube_map) + if (has_cube_map) dds_h.caps2 |= DDS_cube_map_ALLFACES; - switch (d->format) { + switch (format) { case TXP_A8: dds_h.ddspf = DDSPF_A8; break; @@ -356,35 +366,26 @@ void dds_write(dds* d, const wchar_t* path) { break; } - io_write_uint32_t_reverse_endianness(&s, DDS_MAGIC, true); - io_write(&s, &dds_h, sizeof(DDS_HEADER)); + s.write_uint32_t_reverse_endianness(DDS_MAGIC, true); + s.write(&dds_h, sizeof(DDS_HEADER)); uint32_t index = 0; do - for (uint32_t i = 0; i < d->mipmaps_count; i++) { - uint32_t size = txp::get_size(d->format, - max(d->width >> i, 1), max(d->height >> i, 1)); + for (uint32_t i = 0; i < mipmaps_count; i++) { + uint32_t size = txp::get_size(format, + max(width >> i, 1), max(height >> i, 1)); void* data = force_malloc(size); - memcpy(data, d->data.begin[index], size); - dds_reverse_rgb(d->format, size, (uint8_t*)data); - io_write(&s, data, size); + memcpy(data, this->data[index], size); + dds_reverse_rgb(format, size, (uint8_t*)data); + s.write(data, size); free(data); index++; } - while (d->has_cube_map && index / d->mipmaps_count < 6); + while (has_cube_map && index / mipmaps_count < 6); } - io_free(&s); free(path_dds); } -void dds_dispose(dds* d) { - if (!d) - return; - - vector_old_ptr_void_free(&d->data, 0); - free(d); -} - static void dds_reverse_rgb(txp_format format, int64_t size, uint8_t* data) { uint8_t l, r, g, b, a; switch (format) { diff --git a/src/KKdLib/dds.h b/src/KKdLib/dds.h deleted file mode 100644 index 5f4d810e..00000000 --- a/src/KKdLib/dds.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "default.h" -#include "txp.hpp" -#include "vector.h" - -struct dds { - txp_format format; - uint32_t width; - uint32_t height; - uint32_t mipmaps_count; - bool has_cube_map; - vector_old_ptr_void data; -}; - -extern dds* dds_init(); -extern void dds_read(dds* d, const char* path); -extern void dds_read(dds* d, const wchar_t* path); -extern void dds_write(dds* d, const char* path); -extern void dds_write(dds* d, const wchar_t* path); -extern void dds_dispose(dds* d); diff --git a/src/KKdLib/dds.hpp b/src/KKdLib/dds.hpp new file mode 100644 index 00000000..ef83e401 --- /dev/null +++ b/src/KKdLib/dds.hpp @@ -0,0 +1,26 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "default.hpp" +#include "txp.hpp" + +struct dds { + txp_format format; + uint32_t width; + uint32_t height; + uint32_t mipmaps_count; + bool has_cube_map; + std::vector data; + + dds(); + ~dds(); + + void read(const char* path); + void read(const wchar_t* path); + void write(const char* path); + void write(const wchar_t* path); +}; diff --git a/src/KKdLib/default.c b/src/KKdLib/default.cpp similarity index 99% rename from src/KKdLib/default.c rename to src/KKdLib/default.cpp index 64079786..86de694b 100644 --- a/src/KKdLib/default.c +++ b/src/KKdLib/default.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "default.h" +#include "default.hpp" void* force_malloc(size_t size) { if (!size) diff --git a/src/KKdLib/default.h b/src/KKdLib/default.hpp similarity index 99% rename from src/KKdLib/default.h rename to src/KKdLib/default.hpp index c2cd9745..1681a787 100644 --- a/src/KKdLib/default.h +++ b/src/KKdLib/default.hpp @@ -6,7 +6,7 @@ #pragma once #define _USE_MATH_DEFINES -#include "types.h" +#include "types.hpp" #include #include #include diff --git a/src/KKdLib/deflate.c b/src/KKdLib/deflate.c deleted file mode 100644 index e14b7514..00000000 --- a/src/KKdLib/deflate.c +++ /dev/null @@ -1,153 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "deflate.h" -#include - -static size_t compress_static(struct libdeflate_compressor* c, void* src, size_t src_length, - void** dst, size_t* dst_length, int32_t compression_level, deflate_mode mode); -static size_t decompress_static(struct libdeflate_decompressor* d, void* src, size_t src_length, - void** dst, size_t* dst_length, deflate_mode mode); - -size_t deflate_compress(void* src, size_t src_length, void** dst, - size_t* dst_length, int32_t compression_level, deflate_mode mode) { - if (!src_length) - return -1; - else if (!src) - return -2; - else if (!dst) - return -3; - else if (!dst_length) - return -4; - else if (mode < DEFLATE_MODE_DEFLATE || mode > DEFLATE_MODE_ZLIB) - return -5; - - struct libdeflate_compressor* c = libdeflate_alloc_compressor(compression_level); - if (!c) - return -5; - - size_t result = compress_static(c, src, src_length, dst, dst_length, compression_level, mode); - libdeflate_free_compressor(c); - return result >= 0 ? result : result - 0x10; -} - -size_t deflate_decompress(void* src, size_t src_length, void** dst, - size_t* dst_length, deflate_mode mode) { - if (!src_length) - return -1; - else if (!src) - return -2; - else if (!dst) - return -3; - else if (!dst_length) - return -4; - else if (mode < DEFLATE_MODE_DEFLATE || mode > DEFLATE_MODE_ZLIB) - return -5; - - if (!*dst_length) - *dst_length = 1; - struct libdeflate_decompressor* d = libdeflate_alloc_decompressor(); - size_t result = decompress_static(d, src, src_length, dst, dst_length, mode); - libdeflate_free_decompressor(d); - return result >= 0 ? result : result - 0x10; -} - -static size_t compress_static(struct libdeflate_compressor* c, void* src, size_t src_length, - void** dst, size_t* dst_length, int32_t compression_level, deflate_mode mode) { - size_t dst_max_length; - switch (mode) { - case DEFLATE_MODE_GZIP: - dst_max_length = libdeflate_gzip_compress_bound(c, src_length); - break; - case DEFLATE_MODE_ZLIB: - dst_max_length = libdeflate_zlib_compress_bound(c, src_length); - break; - default: - dst_max_length = libdeflate_deflate_compress_bound(c, src_length); - break; - } - *dst = force_malloc(dst_max_length); - if (!*dst) - return -1; - - size_t dst_act_length; - switch (mode) { - case DEFLATE_MODE_GZIP: - dst_act_length = libdeflate_gzip_compress(c, src, src_length, *dst, dst_max_length); - break; - case DEFLATE_MODE_ZLIB: - dst_act_length = libdeflate_zlib_compress(c, src, src_length, *dst, dst_max_length); - break; - default: - dst_act_length = libdeflate_deflate_compress(c, src, src_length, *dst, dst_max_length); - break; - } - - if (dst_act_length == dst_max_length) { - *dst_length = dst_act_length; - return 0; - } - - void* temp = force_malloc(dst_act_length); - if (!temp) { - free(*dst); - return -2; - } - - memcpy(temp, *dst, dst_act_length); - free(*dst); - *dst = temp; - *dst_length = dst_act_length; - return 0; -} - -static size_t decompress_static(struct libdeflate_decompressor* d, void* src, size_t src_length, - void** dst, size_t* dst_length, deflate_mode mode) { - *dst = force_malloc(*dst_length); - if (!*dst) - return -1; - - size_t dst_act_length = 0; - enum libdeflate_result result; - switch (mode) { - case DEFLATE_MODE_GZIP: - result = libdeflate_gzip_decompress(d, src, src_length, *dst, *dst_length, &dst_act_length); - break; - case DEFLATE_MODE_ZLIB: - result = libdeflate_zlib_decompress(d, src, src_length, *dst, *dst_length, &dst_act_length); - break; - default: - result = libdeflate_deflate_decompress(d, src, src_length, *dst, *dst_length, &dst_act_length); - break; - } - - switch (result) { - case LIBDEFLATE_BAD_DATA: - free(*dst); - return -2; - break; - case LIBDEFLATE_INSUFFICIENT_SPACE: - free(*dst); - *dst_length *= 2; - decompress_static(d, src, src_length, dst, dst_length, mode); - break; - default: - if (dst_act_length >= *dst_length) - break; - - void* temp = force_malloc(dst_act_length); - if (!temp) { - free(*dst); - return -3; - } - - memcpy(temp, *dst, dst_act_length); - free(*dst); - *dst = temp; - *dst_length = dst_act_length; - break; - } - return 0; -} diff --git a/src/KKdLib/deflate.cpp b/src/KKdLib/deflate.cpp new file mode 100644 index 00000000..42d585d9 --- /dev/null +++ b/src/KKdLib/deflate.cpp @@ -0,0 +1,155 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "deflate.hpp" +#include + +namespace deflate { + static size_t compress_static(struct libdeflate_compressor* c, void* src, size_t src_length, + void** dst, size_t* dst_length, int32_t compression_level, mode mode); + static size_t decompress_static(struct libdeflate_decompressor* d, void* src, size_t src_length, + void** dst, size_t* dst_length, mode mode); + + size_t compress(void* src, size_t src_length, void** dst, + size_t* dst_length, int32_t compression_level, mode mode) { + if (!src_length) + return -1; + else if (!src) + return -2; + else if (!dst) + return -3; + else if (!dst_length) + return -4; + else if (mode < MODE_DEFLATE || mode > MODE_ZLIB) + return -5; + + struct libdeflate_compressor* c = libdeflate_alloc_compressor(compression_level); + if (!c) + return -5; + + size_t result = compress_static(c, src, src_length, dst, dst_length, compression_level, mode); + libdeflate_free_compressor(c); + return result >= 0 ? result : result - 0x10; + } + + size_t decompress(void* src, size_t src_length, void** dst, + size_t* dst_length, mode mode) { + if (!src_length) + return -1; + else if (!src) + return -2; + else if (!dst) + return -3; + else if (!dst_length) + return -4; + else if (mode < MODE_DEFLATE || mode > MODE_ZLIB) + return -5; + + if (!*dst_length) + *dst_length = 1; + struct libdeflate_decompressor* d = libdeflate_alloc_decompressor(); + size_t result = decompress_static(d, src, src_length, dst, dst_length, mode); + libdeflate_free_decompressor(d); + return result >= 0 ? result : result - 0x10; + } + + static size_t compress_static(struct libdeflate_compressor* c, void* src, size_t src_length, + void** dst, size_t* dst_length, int32_t compression_level, mode mode) { + size_t dst_max_length; + switch (mode) { + case MODE_GZIP: + dst_max_length = libdeflate_gzip_compress_bound(c, src_length); + break; + case MODE_ZLIB: + dst_max_length = libdeflate_zlib_compress_bound(c, src_length); + break; + default: + dst_max_length = libdeflate_deflate_compress_bound(c, src_length); + break; + } + *dst = force_malloc(dst_max_length); + if (!*dst) + return -1; + + size_t dst_act_length; + switch (mode) { + case MODE_GZIP: + dst_act_length = libdeflate_gzip_compress(c, src, src_length, *dst, dst_max_length); + break; + case MODE_ZLIB: + dst_act_length = libdeflate_zlib_compress(c, src, src_length, *dst, dst_max_length); + break; + default: + dst_act_length = libdeflate_deflate_compress(c, src, src_length, *dst, dst_max_length); + break; + } + + if (dst_act_length == dst_max_length) { + *dst_length = dst_act_length; + return 0; + } + + void* temp = force_malloc(dst_act_length); + if (!temp) { + free(*dst); + return -2; + } + + memcpy(temp, *dst, dst_act_length); + free(*dst); + *dst = temp; + *dst_length = dst_act_length; + return 0; + } + + static size_t decompress_static(struct libdeflate_decompressor* d, void* src, size_t src_length, + void** dst, size_t* dst_length, mode mode) { + *dst = force_malloc(*dst_length); + if (!*dst) + return -1; + + size_t dst_act_length = 0; + enum libdeflate_result result; + switch (mode) { + case MODE_GZIP: + result = libdeflate_gzip_decompress(d, src, src_length, *dst, *dst_length, &dst_act_length); + break; + case MODE_ZLIB: + result = libdeflate_zlib_decompress(d, src, src_length, *dst, *dst_length, &dst_act_length); + break; + default: + result = libdeflate_deflate_decompress(d, src, src_length, *dst, *dst_length, &dst_act_length); + break; + } + + switch (result) { + case LIBDEFLATE_BAD_DATA: + free(*dst); + return -2; + break; + case LIBDEFLATE_INSUFFICIENT_SPACE: + free(*dst); + *dst_length *= 2; + decompress_static(d, src, src_length, dst, dst_length, mode); + break; + default: + if (dst_act_length >= *dst_length) + break; + + void* temp = force_malloc(dst_act_length); + if (!temp) { + free(*dst); + return -3; + } + + memcpy(temp, *dst, dst_act_length); + free(*dst); + *dst = temp; + *dst_length = dst_act_length; + break; + } + return 0; + } +} diff --git a/src/KKdLib/deflate.h b/src/KKdLib/deflate.h deleted file mode 100644 index ec8fb1da..00000000 --- a/src/KKdLib/deflate.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "default.h" - -enum deflate_mode { - DEFLATE_MODE_DEFLATE = 0, - DEFLATE_MODE_GZIP = 1, - DEFLATE_MODE_ZLIB = 2, -}; - -extern size_t deflate_compress(void* src, size_t src_length, void** dst, - size_t* dst_length, int32_t compression_level, deflate_mode mode); -extern size_t deflate_decompress(void* src, size_t src_length, void** dst, - size_t* dst_length, deflate_mode mode); diff --git a/src/KKdLib/deflate.hpp b/src/KKdLib/deflate.hpp new file mode 100644 index 00000000..a5b64bd9 --- /dev/null +++ b/src/KKdLib/deflate.hpp @@ -0,0 +1,21 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "default.hpp" + +namespace deflate { + enum mode { + MODE_DEFLATE = 0, + MODE_GZIP = 1, + MODE_ZLIB = 2, + }; + + extern size_t compress(void* src, size_t src_length, void** dst, + size_t* dst_length, int32_t compression_level, mode mode); + extern size_t decompress(void* src, size_t src_length, void** dst, + size_t* dst_length, mode mode); +} diff --git a/src/KKdLib/divafile.c b/src/KKdLib/divafile.c deleted file mode 100644 index e742bf70..00000000 --- a/src/KKdLib/divafile.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "divafile.h" -#include "aes.h" -#include "str_utils.h" - -static const uint8_t key[] = { - 0x66, 0x69, 0x6C, 0x65, 0x20, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x20, 0x64, 0x65, 0x6E, 0x79 -}; - -void divafile_decrypt(const char* path) { - wchar_t* file_buf = utf8_to_utf16(path); - divafile_decrypt(file_buf); - free(file_buf); -} - -void divafile_decrypt(const wchar_t* path) { - wchar_t* file_temp = str_utils_add(path, L"_dec"); - stream s_enc; - io_open(&s_enc, path, L"rb"); - if (s_enc.io.stream) { - uint64_t signature = io_read_uint64_t(&s_enc); - if (signature == 0x454C494641564944) { - uint32_t stream_length = io_read_uint32_t(&s_enc); - uint32_t file_length = io_read_uint32_t(&s_enc); - void* data = force_malloc(stream_length); - io_read(&s_enc, data, stream_length); - - aes128_ctx ctx; - aes128_init_ctx(&ctx, key); - aes128_ecb_decrypt_buffer(&ctx, (uint8_t*)data, stream_length); - - stream s_dec; - io_open(&s_dec, file_temp, L"wb"); - io_write(&s_dec, data, min(file_length, stream_length)); - io_free(&s_dec); - free(data); - } - } - io_free(&s_enc); - free(file_temp); -} - -void divafile_decrypt(void* enc_data, void** dec_data, size_t* dec_size) { - if (!enc_data || !dec_data || !dec_size) - return; - - *dec_data = 0; - *dec_size = 0; - - size_t d = (size_t)enc_data; - - uint64_t signature = *(uint64_t*)d; - if (signature != 0x454C494641564944) - return; - - uint32_t stream_length = *(uint32_t*)(d + 8); - uint32_t file_length = *(uint32_t*)(d + 12); - void* data = force_malloc(stream_length); - memcpy(data, (void*)(d + 16), stream_length); - - aes128_ctx ctx; - aes128_init_ctx(&ctx, key); - aes128_ecb_decrypt_buffer(&ctx, (uint8_t*)data, stream_length); - - *dec_data = data; - *dec_size = file_length; -} - -void divafile_decrypt(stream* s) { - if (!s) - return; - - size_t pos = io_get_position(s); - uint64_t signature = io_read_uint64_t(s); - if (signature != 0x454C494641564944) { - io_set_position(s, pos, SEEK_SET); - return; - } - - uint32_t stream_length = io_read_uint32_t(s); - uint32_t file_length = io_read_uint32_t(s); - void* data = force_malloc(stream_length); - io_read(s, data, stream_length); - - aes128_ctx ctx; - aes128_init_ctx(&ctx, key); - aes128_ecb_decrypt_buffer(&ctx, (uint8_t*)data, stream_length); - - io_free(s); - io_open(s, data, file_length); - free(data); -} - -void divafile_encrypt(const char* path) { - wchar_t* file_buf = utf8_to_utf16(path); - divafile_encrypt(file_buf); - free(file_buf); -} - -void divafile_encrypt(const wchar_t* path) { - wchar_t* file_temp = str_utils_add(path, L"_enc"); - stream s_dec; - io_open(&s_dec, path, L"rb"); - if (s_dec.io.stream) { - size_t len = s_dec.length; - size_t len_align = align_val(len, 0x10); - - void* data = force_malloc(len_align); - io_read(&s_dec, data, len); - - aes128_ctx ctx; - aes128_init_ctx(&ctx, key); - aes128_ecb_encrypt_buffer(&ctx, (uint8_t*)data, len_align); - - stream s_enc; - io_open(&s_enc, file_temp, L"wb"); - io_write_uint64_t(&s_enc, 0x454C494641564944); - io_write_uint32_t(&s_enc, (uint32_t)len_align); - io_write_uint32_t(&s_enc, (uint32_t)len); - io_write(&s_enc, data, len_align); - io_free(&s_enc); - free(data); - } - io_free(&s_dec); - free(file_temp); -} - -void divafile_encrypt(void* dec_data, size_t dec_size, void** enc_data, size_t* enc_size) { - if (!dec_data || !dec_size || !enc_data || !enc_size) - return; - - size_t len = dec_size; - size_t len_align = align_val(len, 0x10); - - void* data = force_malloc(len_align + 0x10); - size_t d = (size_t)data; - memcpy((void*)(d + 16), dec_data, len); - - aes128_ctx ctx; - aes128_init_ctx(&ctx, key); - aes128_ecb_encrypt_buffer(&ctx, (uint8_t*)(d + 16), len_align); - - *(uint64_t*)d = 0x454C494641564944; - *(uint32_t*)(d + 8) = (uint32_t)len_align; - *(uint32_t*)(d + 12) = (uint32_t)len; - - *enc_data = data; - *enc_size = len_align + 0x10; -} diff --git a/src/KKdLib/divafile.cpp b/src/KKdLib/divafile.cpp new file mode 100644 index 00000000..2aa2d987 --- /dev/null +++ b/src/KKdLib/divafile.cpp @@ -0,0 +1,148 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "divafile.hpp" +#include "aes.hpp" +#include "str_utils.hpp" + +namespace divafile { + static const uint8_t key[] = { + 0x66, 0x69, 0x6C, 0x65, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x64, 0x65, 0x6E, 0x79 + }; + + void decrypt(const char* path) { + wchar_t* file_buf = utf8_to_utf16(path); + decrypt(file_buf); + free(file_buf); + } + + void decrypt(const wchar_t* path) { + wchar_t* file_temp = str_utils_add(path, L"_dec"); + stream s_enc; + s_enc.open(path, L"rb"); + if (s_enc.io.stream) { + uint64_t signature = s_enc.read_uint64_t(); + if (signature == 0x454C494641564944) { + uint32_t stream_length = s_enc.read_uint32_t(); + uint32_t file_length = s_enc.read_uint32_t(); + void* data = force_malloc(stream_length); + s_enc.read(data, stream_length); + + aes128_ctx ctx; + aes128_init_ctx(&ctx, key); + aes128_ecb_decrypt_buffer(&ctx, (uint8_t*)data, stream_length); + + stream s_dec; + s_dec.open(file_temp, L"wb"); + s_dec.write(data, min(file_length, stream_length)); + free(data); + } + } + free(file_temp); + } + + void decrypt(void* enc_data, void** dec_data, size_t* dec_size) { + if (!enc_data || !dec_data || !dec_size) + return; + + *dec_data = 0; + *dec_size = 0; + + size_t d = (size_t)enc_data; + + uint64_t signature = *(uint64_t*)d; + if (signature != 0x454C494641564944) + return; + + uint32_t stream_length = *(uint32_t*)(d + 8); + uint32_t file_length = *(uint32_t*)(d + 12); + void* data = force_malloc(stream_length); + memcpy(data, (void*)(d + 16), stream_length); + + aes128_ctx ctx; + aes128_init_ctx(&ctx, key); + aes128_ecb_decrypt_buffer(&ctx, (uint8_t*)data, stream_length); + + *dec_data = data; + *dec_size = file_length; + } + + void decrypt(stream& s) { + size_t pos = s.get_position(); + uint64_t signature = s.read_uint64_t(); + if (signature != 0x454C494641564944) { + s.set_position(pos, SEEK_SET); + return; + } + + uint32_t stream_length = s.read_uint32_t(); + uint32_t file_length = s.read_uint32_t(); + void* data = force_malloc(stream_length); + s.read(data, stream_length); + + aes128_ctx ctx; + aes128_init_ctx(&ctx, key); + aes128_ecb_decrypt_buffer(&ctx, (uint8_t*)data, stream_length); + + s.open(data, file_length); + free(data); + } + + void encrypt(const char* path) { + wchar_t* file_buf = utf8_to_utf16(path); + encrypt(file_buf); + free(file_buf); + } + + void encrypt(const wchar_t* path) { + wchar_t* file_temp = str_utils_add(path, L"_enc"); + stream s_dec; + s_dec.open(path, L"rb"); + if (s_dec.io.stream) { + size_t len = s_dec.length; + size_t len_align = align_val(len, 0x10); + + void* data = force_malloc(len_align); + s_dec.read(data, len); + + aes128_ctx ctx; + aes128_init_ctx(&ctx, key); + aes128_ecb_encrypt_buffer(&ctx, (uint8_t*)data, len_align); + + stream s_enc; + s_enc.open(file_temp, L"wb"); + s_enc.write_uint64_t(0x454C494641564944); + s_enc.write_uint32_t((uint32_t)len_align); + s_enc.write_uint32_t((uint32_t)len); + s_enc.write(data, len_align); + free(data); + } + free(file_temp); + } + + void encrypt(void* dec_data, size_t dec_size, void** enc_data, size_t* enc_size) { + if (!dec_data || !dec_size || !enc_data || !enc_size) + return; + + size_t len = dec_size; + size_t len_align = align_val(len, 0x10); + + void* data = force_malloc(len_align + 0x10); + size_t d = (size_t)data; + memcpy((void*)(d + 16), dec_data, len); + + aes128_ctx ctx; + aes128_init_ctx(&ctx, key); + aes128_ecb_encrypt_buffer(&ctx, (uint8_t*)(d + 16), len_align); + + *(uint64_t*)d = 0x454C494641564944; + *(uint32_t*)(d + 8) = (uint32_t)len_align; + *(uint32_t*)(d + 12) = (uint32_t)len; + + *enc_data = data; + *enc_size = len_align + 0x10; + } +} diff --git a/src/KKdLib/divafile.h b/src/KKdLib/divafile.h deleted file mode 100644 index bc197001..00000000 --- a/src/KKdLib/divafile.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "default.h" -#include "io/stream.h" - -extern void divafile_decrypt(const char* path); -extern void divafile_decrypt(const wchar_t* path); -extern void divafile_decrypt(void* enc_data, void** dec_data, size_t* dec_size); -extern void divafile_decrypt(stream* s); -extern void divafile_encrypt(const char* path); -extern void divafile_encrypt(const wchar_t* path); -extern void divafile_encrypt(void* dec_data, size_t dec_size, void** enc_data, size_t* enc_size); diff --git a/src/KKdLib/divafile.hpp b/src/KKdLib/divafile.hpp new file mode 100644 index 00000000..debe1ea3 --- /dev/null +++ b/src/KKdLib/divafile.hpp @@ -0,0 +1,19 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "default.hpp" +#include "io/stream.hpp" + +namespace divafile { + extern void decrypt(const char* path); + extern void decrypt(const wchar_t* path); + extern void decrypt(void* enc_data, void** dec_data, size_t* dec_size); + extern void decrypt(stream& s); + extern void encrypt(const char* path); + extern void encrypt(const wchar_t* path); + extern void encrypt(void* dec_data, size_t dec_size, void** enc_data, size_t* enc_size); +} diff --git a/src/KKdLib/dsc.cpp b/src/KKdLib/dsc.cpp index b1d4999b..39cbc6ed 100644 --- a/src/KKdLib/dsc.cpp +++ b/src/KKdLib/dsc.cpp @@ -7,7 +7,7 @@ #include "f2/struct.hpp" #include "hash.hpp" #include "sort.hpp" -#include "str_utils.h" +#include "str_utils.hpp" static const dsc_func dsc_ac101_func[] = { { 0, 0, "END" }, @@ -2932,15 +2932,14 @@ bool dsc::load_file(void* data, const char* path, const char* file, uint32_t has std::string s = path + std::string(file); stream dsc_s; - io_open(&dsc_s, s.c_str(), "rb"); + dsc_s.open(s.c_str(), "rb"); void* dsc_data = force_malloc(dsc_s.length); size_t dsc_length = dsc_s.length; - io_read(&dsc_s, dsc_data, dsc_length); + dsc_s.read(dsc_data, dsc_length); dsc* d = (dsc*)data; bool ret = d->parse(dsc_data, dsc_length, d->type); - io_free(&dsc_s); free(dsc_data); return ret; } diff --git a/src/KKdLib/dsc.hpp b/src/KKdLib/dsc.hpp index 3072f9d8..55cfeb46 100644 --- a/src/KKdLib/dsc.hpp +++ b/src/KKdLib/dsc.hpp @@ -6,7 +6,7 @@ #pragma once #include -#include "default.h" +#include "default.hpp" enum dsc_diff { DSC_DIFF_EASY = 0, diff --git a/src/KKdLib/enbaya.c b/src/KKdLib/enbaya.cpp similarity index 99% rename from src/KKdLib/enbaya.c rename to src/KKdLib/enbaya.cpp index 8f7fdae7..5907cc58 100644 --- a/src/KKdLib/enbaya.c +++ b/src/KKdLib/enbaya.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "enbaya.h" +#include "enbaya.hpp" static void enb_init(enb_play_head* play_head, enb_head* head); static void enb_copy_pointers(enb_play_head* play_head); diff --git a/src/KKdLib/enbaya.h b/src/KKdLib/enbaya.hpp similarity index 98% rename from src/KKdLib/enbaya.h rename to src/KKdLib/enbaya.hpp index 84dfa468..460bc8d1 100644 --- a/src/KKdLib/enbaya.h +++ b/src/KKdLib/enbaya.hpp @@ -5,10 +5,10 @@ #pragma once -#include "default.h" -#include "quat.h" +#include "default.hpp" +#include "quat.hpp" #include "quat_trans.h" -#include "vec.h" +#include "vec.hpp" struct enb_track { quat_trans qt[2]; diff --git a/src/KKdLib/f2/enrs.cpp b/src/KKdLib/f2/enrs.cpp index 1370bce5..31dacc5e 100644 --- a/src/KKdLib/f2/enrs.cpp +++ b/src/KKdLib/f2/enrs.cpp @@ -14,10 +14,10 @@ enum enrs_value_type { inline static bool enrs_length_get_size_type(uint32_t* length, size_t val); inline static bool enrs_length_get_size(uint32_t* length, size_t val); -static bool enrs_read_packed_value(stream* s, uint32_t* val); -static bool enrs_write_packed_value(stream* s, uint32_t val); -static bool enrs_read_packed_value_type(stream* s, uint32_t* val, enrs_type* type); -static bool enrs_write_packed_value_type(stream* s, uint32_t val, enrs_type type); +static bool enrs_read_packed_value(stream& s, uint32_t* val); +static bool enrs_write_packed_value(stream& s, uint32_t val); +static bool enrs_read_packed_value_type(stream& s, uint32_t* val, enrs_type* type); +static bool enrs_write_packed_value_type(stream& s, uint32_t val, enrs_type type); enrs_entry::enrs_entry(): offset(), count(), size(), repeat_count() { @@ -88,11 +88,8 @@ void enrs::apply(void* data) { } uint32_t enrs::length() { - uint32_t l; - uint32_t o; - - l = 0x10; - o = 0; + uint32_t l = 0x10; + uint32_t o = 0; for (enrs_entry& i : vec) { uint32_t offset = i.offset; i.count = (uint32_t)i.sub.size(); @@ -127,18 +124,16 @@ End: return l; } -void enrs::read(stream * s) { - size_t i, j, l; - +void enrs::read(stream& s) { vec.clear(); - io_read_uint32_t(s); - l = io_read_uint32_t(s); - io_read_uint32_t(s); - io_read_uint32_t(s); + s.read_uint32_t(); + size_t l = s.read_uint32_t(); + s.read_uint32_t(); + s.read_uint32_t(); vec.reserve(l); - for (i = 0; i < l; i++) { + for (size_t i = 0; i < l; i++) { enrs_entry entry; if (enrs_read_packed_value(s, &entry.offset) || enrs_read_packed_value(s, &entry.count) @@ -152,7 +147,7 @@ void enrs::read(stream * s) { } entry.sub.reserve(entry.count); - for (j = 0; j < entry.count; j++) { + for (size_t j = 0; j < entry.count; j++) { enrs_sub_entry sub_entry = {}; if (enrs_read_packed_value_type(s, &sub_entry.skip_bytes, &sub_entry.type) || enrs_read_packed_value(s, &sub_entry.repeat_count)) @@ -163,15 +158,13 @@ void enrs::read(stream * s) { } } -void enrs::write(stream* s) { - uint32_t o; - - o = 0; +void enrs::write(stream& s) { + uint32_t o = 0; size_t length = enrs::length(); - io_write_uint32_t(s, 0); - io_write_uint32_t(s, (uint32_t)vec.size()); - io_write_uint32_t(s, 0); - io_write_uint32_t(s, 0); + s.write_uint32_t(0); + s.write_uint32_t((uint32_t)vec.size()); + s.write_uint32_t(0); + s.write_uint32_t(0); for (enrs_entry& i : vec) { uint32_t offset = i.offset; i.count = (uint32_t)i.sub.size(); @@ -202,7 +195,7 @@ void enrs::write(stream* s) { } End: - io_align_write(s, 0x10); + s.align_write(0x10); } inline static bool enrs_length_get_size_type(uint32_t* length, size_t val) { @@ -218,15 +211,15 @@ inline static bool enrs_length_get_size(uint32_t* length, size_t val) { return val >= 0x40000000; } -static bool enrs_read_packed_value(stream* s, uint32_t* val) { - *val = io_read_uint8_t(s); +static bool enrs_read_packed_value(stream& s, uint32_t* val) { + *val = s.read_uint8_t(); enrs_value_type value = (enrs_value_type)((*val >> 6) & 0x3); *val &= 0x3F; if (value == ENRS_VALUE_INT32) - *val = (((((*val << 8) | io_read_uint8_t(s)) << 8) | io_read_uint8_t(s)) << 8) | io_read_uint8_t(s); + *val = (((((*val << 8) | s.read_uint8_t()) << 8) | s.read_uint8_t()) << 8) | s.read_uint8_t(); else if (value == ENRS_VALUE_INT16) - *val = (*val << 8) | io_read_uint8_t(s); + *val = (*val << 8) | s.read_uint8_t(); else if (value == ENRS_VALUE_INVALID) { *val = 0; return true; @@ -234,36 +227,36 @@ static bool enrs_read_packed_value(stream* s, uint32_t* val) { return false; } -static bool enrs_write_packed_value(stream* s, uint32_t val) { +static bool enrs_write_packed_value(stream& s, uint32_t val) { if (val < 0x40) - io_write_uint8_t(s, (uint8_t)((ENRS_VALUE_INT8 << 6) | (val & 0x3F))); + s.write_uint8_t((uint8_t)((ENRS_VALUE_INT8 << 6) | (val & 0x3F))); else if (val < 0x4000) { - io_write_uint8_t(s, (uint8_t)((ENRS_VALUE_INT16 << 6) | ((val >> 8) & 0x3F))); - io_write_uint8_t(s, (uint8_t)val); + s.write_uint8_t((uint8_t)((ENRS_VALUE_INT16 << 6) | ((val >> 8) & 0x3F))); + s.write_uint8_t((uint8_t)val); } else if (val < 0x40000000) { - io_write_uint8_t(s, (uint8_t)((ENRS_VALUE_INT32 << 6) | ((val >> 24) & 0x3F))); - io_write_uint8_t(s, (uint8_t)(val >> 16)); - io_write_uint8_t(s, (uint8_t)(val >> 8)); - io_write_uint8_t(s, (uint8_t)val); + s.write_uint8_t((uint8_t)((ENRS_VALUE_INT32 << 6) | ((val >> 24) & 0x3F))); + s.write_uint8_t((uint8_t)(val >> 16)); + s.write_uint8_t((uint8_t)(val >> 8)); + s.write_uint8_t((uint8_t)val); } else { - io_write_uint8_t(s, ENRS_VALUE_INVALID << 6); + s.write_uint8_t(ENRS_VALUE_INVALID << 6); return true; } return false; } -static bool enrs_read_packed_value_type(stream* s, uint32_t* val, enrs_type* type) { - *val = io_read_uint8_t(s); +static bool enrs_read_packed_value_type(stream& s, uint32_t* val, enrs_type* type) { + *val = s.read_uint8_t(); enrs_value_type value = (enrs_value_type)((*val >> 6) & 0x3); *type = (enrs_type)((*val >> 4) & 0x3); *val &= 0xF; if (value == ENRS_VALUE_INT32) - *val = (((((*val << 8) | io_read_uint8_t(s)) << 8) | io_read_uint8_t(s)) << 8) | io_read_uint8_t(s); + *val = (((((*val << 8) | s.read_uint8_t()) << 8) | s.read_uint8_t()) << 8) | s.read_uint8_t(); else if (value == ENRS_VALUE_INT16) - *val = (*val << 8) | io_read_uint8_t(s); + *val = (*val << 8) | s.read_uint8_t(); else if (value == ENRS_VALUE_INVALID) { *val = 0; return true; @@ -271,22 +264,22 @@ static bool enrs_read_packed_value_type(stream* s, uint32_t* val, enrs_type* typ return false; } -static bool enrs_write_packed_value_type(stream* s, uint32_t val, enrs_type type) { +static bool enrs_write_packed_value_type(stream& s, uint32_t val, enrs_type type) { uint8_t t = ((uint8_t)type & 0x3) << 4; if (val < 0x10) - io_write_uint8_t(s, (uint8_t)((ENRS_VALUE_INT8 << 6) | t | (val & 0xF))); + s.write_uint8_t((uint8_t)((ENRS_VALUE_INT8 << 6) | t | (val & 0xF))); else if (val < 0x1000) { - io_write_uint8_t(s, (uint8_t)((ENRS_VALUE_INT16 << 6) | t | ((val >> 8) & 0xF))); - io_write_uint8_t(s, (uint8_t)val); + s.write_uint8_t((uint8_t)((ENRS_VALUE_INT16 << 6) | t | ((val >> 8) & 0xF))); + s.write_uint8_t((uint8_t)val); } else if (val < 0x10000000) { - io_write_uint8_t(s, (uint8_t)((ENRS_VALUE_INT32 << 6) | t | ((val >> 24) & 0xF))); - io_write_uint8_t(s, (uint8_t)(val >> 16)); - io_write_uint8_t(s, (uint8_t)(val >> 8)); - io_write_uint8_t(s, (uint8_t)val); + s.write_uint8_t((uint8_t)((ENRS_VALUE_INT32 << 6) | t | ((val >> 24) & 0xF))); + s.write_uint8_t((uint8_t)(val >> 16)); + s.write_uint8_t((uint8_t)(val >> 8)); + s.write_uint8_t((uint8_t)val); } else { - io_write_uint8_t(s, ENRS_VALUE_INVALID << 6); + s.write_uint8_t(ENRS_VALUE_INVALID << 6); return true; } return false; diff --git a/src/KKdLib/f2/enrs.hpp b/src/KKdLib/f2/enrs.hpp index b5c6a5e2..aed551c0 100644 --- a/src/KKdLib/f2/enrs.hpp +++ b/src/KKdLib/f2/enrs.hpp @@ -6,8 +6,8 @@ #pragma once #include -#include "../default.h" -#include "../io/stream.h" +#include "../default.hpp" +#include "../io/stream.hpp" enum enrs_type { ENRS_WORD = 0x0, @@ -45,6 +45,6 @@ struct enrs { void apply(void* data); uint32_t length(); - void read(stream* s); - void write(stream* s); + void read(stream& s); + void write(stream& s); }; diff --git a/src/KKdLib/f2/header.c b/src/KKdLib/f2/header.cpp similarity index 62% rename from src/KKdLib/f2/header.c rename to src/KKdLib/f2/header.cpp index faddf1c5..193378ce 100644 --- a/src/KKdLib/f2/header.c +++ b/src/KKdLib/f2/header.cpp @@ -3,33 +3,33 @@ GitHub/GitLab: korenkonder */ -#include "header.h" +#include "header.hpp" -void f2_header_read(stream* s, f2_header* h) { +void f2_header_read(stream& s, f2_header* h) { memset(h, 0, sizeof(f2_header)); - switch (s->type) { + switch (s.type) { case STREAM_FILE: - if (!s->io.stream) + if (!s.io.stream) return; break; case STREAM_MEMORY: - if (!s->io.data.vec.begin) + if (!s.io.data.vec.size()) return; break; default: return; } - io_read(s, h, 0x20); + s.read(h, 0x20); if (h->length == 0x40) - io_read(s, (uint8_t*)h + 0x20, 0x20); + s.read((uint8_t*)h + 0x20, 0x20); } -void f2_header_write(stream* s, f2_header* h, bool extended) { - switch (s->type) { +void f2_header_write(stream& s, f2_header* h, bool extended) { + switch (s.type) { case STREAM_FILE: - if (!s->io.stream) + if (!s.io.stream) return; break; case STREAM_MEMORY: @@ -39,13 +39,13 @@ void f2_header_write(stream* s, f2_header* h, bool extended) { } h->length = extended ? 0x40 : 0x20; - io_write(s, h, h->length); + s.write(h, h->length); } -void f2_header_write_end_of_container(stream* s, uint32_t depth) { - switch (s->type) { +void f2_header_write_end_of_container(stream& s, uint32_t depth) { + switch (s.type) { case STREAM_FILE: - if (!s->io.stream) + if (!s.io.stream) return; break; case STREAM_MEMORY: diff --git a/src/KKdLib/f2/header.h b/src/KKdLib/f2/header.hpp similarity index 79% rename from src/KKdLib/f2/header.h rename to src/KKdLib/f2/header.hpp index d87063de..a9552529 100644 --- a/src/KKdLib/f2/header.h +++ b/src/KKdLib/f2/header.hpp @@ -5,8 +5,8 @@ #pragma once -#include "../default.h" -#include "../io/stream.h" +#include "../default.hpp" +#include "../io/stream.hpp" struct f2_header { union { @@ -34,6 +34,6 @@ struct f2_header { uint32_t unknown2[3]; // 0x34 }; -extern void f2_header_read(stream* s, f2_header* h); -extern void f2_header_write(stream* s, f2_header* h, bool extended); -extern void f2_header_write_end_of_container(stream* s, uint32_t depth); \ No newline at end of file +extern void f2_header_read(stream& s, f2_header* h); +extern void f2_header_write(stream& s, f2_header* h, bool extended); +extern void f2_header_write_end_of_container(stream& s, uint32_t depth); \ No newline at end of file diff --git a/src/KKdLib/f2/pof.cpp b/src/KKdLib/f2/pof.cpp index 0ced601e..16e1a271 100644 --- a/src/KKdLib/f2/pof.cpp +++ b/src/KKdLib/f2/pof.cpp @@ -13,8 +13,8 @@ enum pof_value_type { }; inline static bool pof_length_get_size(uint32_t* length, size_t val); -static size_t pof_read_offsets_count(stream* s); -inline static bool pof_write_packed_value(stream* s, size_t val); +static size_t pof_read_offsets_count(stream& s); +inline static bool pof_write_packed_value(stream& s, size_t val); pof::pof() { @@ -24,20 +24,17 @@ pof::~pof() { } -void pof::add(stream* s, int64_t offset) { - if (!s) - return; - - vec.push_back(io_get_position(s) + offset); +void pof::add(stream& s, int64_t offset) { + vec.push_back(s.get_position() + offset); } -void pof::read(stream* s, bool shift_x) { +void pof::read(stream& s, bool shift_x) { vec.clear(); size_t length = pof_read_offsets_count(s); uint8_t bit_shift = (uint8_t)(shift_x ? 3 : 2); - size_t l = io_read_uint32_t(s) - 4ULL; + size_t l = s.read_uint32_t() - 4ULL; vec.reserve(length); @@ -45,16 +42,16 @@ void pof::read(stream* s, bool shift_x) { size_t j = 0; size_t offset = 0; while (i < l) { - size_t v = io_read_uint8_t(s); + size_t v = s.read_uint8_t(); pof_value_type value = (pof_value_type)((v >> 6) & 0x03); v &= 0x3F; if (value == POF_VALUE_INT32) { - v = (((((v << 8) | io_read_uint8_t(s)) << 8) | io_read_uint8_t(s)) << 8) | io_read_uint8_t(s); + v = (((((v << 8) | s.read_uint8_t()) << 8) | s.read_uint8_t()) << 8) | s.read_uint8_t(); i += 3; } else if (value == POF_VALUE_INT16) { - v = (v << 8) | io_read_uint8_t(s); + v = (v << 8) | s.read_uint8_t(); i++; } else if (value == POF_VALUE_INVALID) @@ -67,16 +64,16 @@ void pof::read(stream* s, bool shift_x) { } } -void pof::write(stream* s, bool shift_x) { +void pof::write(stream& s, bool shift_x) { size_t j = 0; size_t o = 0; uint8_t bit_shift = (uint8_t)(shift_x ? 3 : 2); size_t v = ((size_t)1 << bit_shift) - 1; size_t l = length(shift_x); if (shift_x) - io_write_uint32_t(s, (uint32_t)l); + s.write_uint32_t((uint32_t)l); else - io_write_uint32_t(s, (uint32_t)align_val(l, 4)); + s.write_uint32_t((uint32_t)align_val(l, 4)); for (int64_t& i : vec) { o = i; @@ -94,9 +91,9 @@ void pof::write(stream* s, bool shift_x) { pof_write_packed_value(s, o >> bit_shift); } - size_t pos = io_get_position(s); + size_t pos = s.get_position(); for (size_t c = align_val(pos, 0x10) - pos; c > 0; c--) - io_write_uint8_t(s, 0); + s.write_uint8_t(0); } uint32_t pof::length(bool shift_x) { @@ -125,33 +122,33 @@ uint32_t pof::length(bool shift_x) { return l; } -inline void io_write_offset_pof_add(stream* s, int64_t val, +inline void io_write_offset_pof_add(stream& s, int64_t val, int32_t offset, bool is_x, pof* pof) { if (!is_x) { if (val) val += offset; pof->add(s, offset); - io_write_int32_t_stream_reverse_endianness(s, (int32_t)val); + s.write_int32_t_reverse_endianness((int32_t)val); } else { - io_align_write(s, 0x08); + s.align_write(0x08); pof->add(s, 0); - io_write_int64_t_stream_reverse_endianness(s, val); + s.write_int64_t_reverse_endianness(val); } } -inline void io_write_offset_f2_pof_add(stream* s, int64_t val, +inline void io_write_offset_f2_pof_add(stream& s, int64_t val, int32_t offset, pof* pof) { if (val) val += offset; pof->add(s, offset); - io_write_int32_t_stream_reverse_endianness(s, (int32_t)val); + s.write_int32_t_reverse_endianness((int32_t)val); } -inline void io_write_offset_x_pof_add(stream* s, int64_t val, pof* pof) { - io_align_write(s, 0x08); +inline void io_write_offset_x_pof_add(stream& s, int64_t val, pof* pof) { + s.align_write(0x08); pof->add(s, 0); - io_write_int64_t_stream_reverse_endianness(s, val); + s.write_int64_t_reverse_endianness(val); } inline static bool pof_length_get_size(uint32_t* length, size_t val) { @@ -159,24 +156,24 @@ inline static bool pof_length_get_size(uint32_t* length, size_t val) { return val >= 0x40000000; } -static size_t pof_read_offsets_count(stream* s) { - size_t pos = io_get_position(s); +static size_t pof_read_offsets_count(stream& s) { + size_t pos = s.get_position(); size_t i, j, l; pof_value_type val; - l = io_read_uint32_t(s) - 4ULL; + l = s.read_uint32_t() - 4ULL; i = 0; j = 0; while (i < l) { - val = (pof_value_type)((io_read_uint8_t(s) >> 6) & 0x03); + val = (pof_value_type)((s.read_uint8_t() >> 6) & 0x03); if (val == POF_VALUE_INT32) { - io_read_uint8_t(s); - io_read_uint8_t(s); - io_read_uint8_t(s); + s.read_uint8_t(); + s.read_uint8_t(); + s.read_uint8_t(); i += 3; } else if (val == POF_VALUE_INT16) { - io_read_uint8_t(s); + s.read_uint8_t(); i++; } else if (val != POF_VALUE_INT8) @@ -184,25 +181,25 @@ static size_t pof_read_offsets_count(stream* s) { i++; j++; } - io_set_position(s, pos, SEEK_SET); + s.set_position( pos, SEEK_SET); return j; } -static bool pof_write_packed_value(stream* s, size_t val) { +static bool pof_write_packed_value(stream& s, size_t val) { if (val < 0x40) - io_write_uint8_t(s, (uint8_t)((POF_VALUE_INT8 << 6) | (val & 0x3F))); + s.write_uint8_t((uint8_t)((POF_VALUE_INT8 << 6) | (val & 0x3F))); else if (val < 0x4000) { - io_write_uint8_t(s, (uint8_t)((POF_VALUE_INT16 << 6) | ((val >> 8) & 0x3F))); - io_write_uint8_t(s, (uint8_t)val); + s.write_uint8_t((uint8_t)((POF_VALUE_INT16 << 6) | ((val >> 8) & 0x3F))); + s.write_uint8_t((uint8_t)val); } else if (val < 0x40000000) { - io_write_uint8_t(s, (uint8_t)((POF_VALUE_INT32 << 6) | ((val >> 24) & 0x3F))); - io_write_uint8_t(s, (uint8_t)(val >> 16)); - io_write_uint8_t(s, (uint8_t)(val >> 8)); - io_write_uint8_t(s, (uint8_t)val); + s.write_uint8_t((uint8_t)((POF_VALUE_INT32 << 6) | ((val >> 24) & 0x3F))); + s.write_uint8_t((uint8_t)(val >> 16)); + s.write_uint8_t((uint8_t)(val >> 8)); + s.write_uint8_t((uint8_t)val); } else { - io_write_uint8_t(s, POF_VALUE_INVALID << 6); + s.write_uint8_t(POF_VALUE_INVALID << 6); return true; } return false; diff --git a/src/KKdLib/f2/pof.hpp b/src/KKdLib/f2/pof.hpp index 17d08410..d30e123f 100644 --- a/src/KKdLib/f2/pof.hpp +++ b/src/KKdLib/f2/pof.hpp @@ -6,8 +6,8 @@ #pragma once #include -#include "../default.h" -#include "../io/stream.h" +#include "../default.hpp" +#include "../io/stream.hpp" struct pof { std::vector vec; @@ -15,14 +15,14 @@ struct pof { pof(); ~pof(); - void add(stream* s, int64_t offset); - void read(stream* s, bool shift_x = false); - void write(stream* s, bool shift_x = false); + void add(stream& s, int64_t offset); + void read(stream& s, bool shift_x = false); + void write(stream& s, bool shift_x = false); uint32_t length(bool shift_x = false); }; -extern void io_write_offset_pof_add(stream* s, int64_t val, +extern void io_write_offset_pof_add(stream& s, int64_t val, int32_t offset, bool is_x, pof* pof); -extern void io_write_offset_f2_pof_add(stream* s, int64_t val, +extern void io_write_offset_f2_pof_add(stream& s, int64_t val, int32_t offset, pof* pof); -extern void io_write_offset_x_pof_add(stream* s, int64_t val, pof* pof); +extern void io_write_offset_x_pof_add(stream& s, int64_t val, pof* pof); diff --git a/src/KKdLib/f2/struct.cpp b/src/KKdLib/f2/struct.cpp index 87038fbf..a52d81e9 100644 --- a/src/KKdLib/f2/struct.cpp +++ b/src/KKdLib/f2/struct.cpp @@ -4,15 +4,15 @@ */ #include "struct.hpp" -#include "../io/path.h" -#include "../io/stream.h" -#include "../divafile.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" +#include "../divafile.hpp" -static void f2_struct_read_data(stream* s, f2_struct* st, f2_header* h); -static void f2_struct_write_inner(stream* s, f2_struct* st, uint32_t depth, bool use_depth, bool shift_x); +static void f2_struct_read_data(stream& s, f2_struct* st, f2_header* h); +static void f2_struct_write_inner(stream& s, f2_struct* st, uint32_t depth, bool use_depth, bool shift_x); static void f2_struct_get_length(f2_struct* s, bool shift_x); -static void f2_struct_write_pof(stream* s, pof* pof, uint32_t depth, bool shift_x); -static void f2_struct_write_enrs(stream* s, enrs* enrs, uint32_t depth); +static void f2_struct_write_pof(stream& s, pof* pof, uint32_t depth, bool shift_x); +static void f2_struct_write_enrs(stream& s, enrs* enrs, uint32_t depth); f2_struct::f2_struct() : header() { @@ -27,55 +27,9 @@ void f2_struct::read(const char* path) { return; stream s; - io_open(&s, path, "rb"); + s.open(path, "rb"); if (&s.io.stream) { - divafile_decrypt(&s); - - f2_header h; - f2_header_read(&s, &h); - f2_struct_read_data(&s, this, &h); - } - io_free(&s); -} - -void f2_struct::read(const wchar_t* path) { - if (!path) - return; - - stream s; - io_open(&s, path, L"rb"); - if (&s.io.stream) { - divafile_decrypt(&s); - - f2_header h; - f2_header_read(&s, &h); - f2_struct_read_data(&s, this, &h); - } - io_free(&s); -} - -void f2_struct::read(const void* data, size_t size) { - if (!data || !size) - return; - - stream s; - io_open(&s, data, size); - if (&s.io.data.data) { - divafile_decrypt(&s); - - f2_header h; - f2_header_read(&s, &h); - f2_struct_read_data(&s, this, &h); - } - io_free(&s); -} - -void f2_struct::read(stream* s) { - if (!s) - return; - - if (s->io.stream || s->io.data.data) { - divafile_decrypt(s); + divafile::decrypt(s); f2_header h; f2_header_read(s, &h); @@ -83,17 +37,57 @@ void f2_struct::read(stream* s) { } } +void f2_struct::read(const wchar_t* path) { + if (!path) + return; + + stream s; + s.open(path, L"rb"); + if (&s.io.stream) { + divafile::decrypt(s); + + f2_header h; + f2_header_read(s, &h); + f2_struct_read_data(s, this, &h); + } +} + +void f2_struct::read(const void* data, size_t size) { + if (!data || !size) + return; + + stream s; + s.open(data, size); + if (&s.io.data.data) { + divafile::decrypt(s); + + f2_header h; + f2_header_read(s, &h); + f2_struct_read_data(s, this, &h); + } +} + +void f2_struct::read(stream& s) { + if (s.io.check_null()) + return; + + divafile::decrypt(s); + + f2_header h; + f2_header_read(s, &h); + f2_struct_read_data(s, this, &h); +} + void f2_struct::write(const char* path, bool use_depth, bool shift_x) { if (!path) return; stream s; - io_open(&s, path, "wb"); + s.open(path, "wb"); if (s.io.stream) { f2_struct_get_length(this, shift_x); - f2_struct_write_inner(&s, this, 0, use_depth, shift_x); + f2_struct_write_inner(s, this, 0, use_depth, shift_x); } - io_free(&s); } void f2_struct::write(const wchar_t* path, bool use_depth, bool shift_x) { @@ -101,12 +95,11 @@ void f2_struct::write(const wchar_t* path, bool use_depth, bool shift_x) { return; stream s; - io_open(&s, path, L"wb"); + s.open(path, L"wb"); if (s.io.stream) { f2_struct_get_length(this, shift_x); - f2_struct_write_inner(&s, this, 0, use_depth, shift_x); + f2_struct_write_inner(s, this, 0, use_depth, shift_x); } - io_free(&s); } void f2_struct::write(void** data, size_t* size, bool use_depth, bool shift_x) { @@ -115,18 +108,17 @@ void f2_struct::write(void** data, size_t* size, bool use_depth, bool shift_x) { f2_struct_get_length(this, shift_x); stream s; - io_open(&s, 0, header.data_size + 0x40ULL); - f2_struct_write_inner(&s, this, 0, use_depth, shift_x); + s.open(0, header.data_size + 0x40ULL); + f2_struct_write_inner(s, this, 0, use_depth, shift_x); - io_copy(&s, data, size); - io_free(&s); + s.copy(data, size); } -void f2_struct::write(stream* s, bool use_depth, bool shift_x) { - if (!s) +void f2_struct::write(stream& s, bool use_depth, bool shift_x) { + if (s.io.check_null()) return; - if (s->io.stream || s->type == STREAM_MEMORY) { + if (s.io.stream || s.type == STREAM_MEMORY) { f2_struct_get_length(this, shift_x); f2_struct_write_inner(s, this, 0, use_depth, shift_x); } @@ -163,13 +155,13 @@ static void f2_struct_get_length(f2_struct* s, bool shift_x) { s->header.data_size = l; } -static void f2_struct_read_data(stream* s, f2_struct* st, f2_header* h) { +static void f2_struct_read_data(stream& s, f2_struct* st, f2_header* h) { uint32_t l = h->use_section_size ? h->section_size : h->data_size; uint32_t depth = h->depth; st->header = *h; if (l) { st->data.resize(l); - io_read(s, st->data.data(), l); + s.read(st->data.data(), l); } uint32_t sig; @@ -183,14 +175,14 @@ static void f2_struct_read_data(stream* s, f2_struct* st, f2_header* h) { if (sig == 'EOFC') break; else if (sig == 'ENRS') { - size_t pos = io_get_position(s); + size_t pos = s.get_position(); st->enrs.read(s); - io_set_position(s, pos + l, SEEK_SET); + s.set_position(pos + l, SEEK_SET); } else if ((sig & 0xFFFFFFF0) == 'POF0') { - size_t pos = io_get_position(s); + size_t pos = s.get_position(); st->pof.read(s, sig == 'POF1'); - io_set_position(s, pos + l, SEEK_SET); + s.set_position(pos + l, SEEK_SET); } else { st->sub_structs.push_back({}); @@ -199,7 +191,7 @@ static void f2_struct_read_data(stream* s, f2_struct* st, f2_header* h) { } } -static void f2_struct_write_inner(stream* s, f2_struct* st, uint32_t depth, bool use_depth, bool shift_x) { +static void f2_struct_write_inner(stream& s, f2_struct* st, uint32_t depth, bool use_depth, bool shift_x) { bool has_pof = st->pof.vec.size() > 0 ? true : false; bool has_enrs = st->enrs.vec.size() > 0 ? true : false; bool has_sub_structs = st->sub_structs.size() > 0 ? true : false; @@ -207,7 +199,7 @@ static void f2_struct_write_inner(stream* s, f2_struct* st, uint32_t depth, bool st->header.depth = use_depth ? depth : 0; f2_header_write(s, &st->header, st->header.length == 0x40); if (st->data.size()) - io_write(s, st->data.data(), st->data.size()); + s.write(st->data.data(), st->data.size()); if (has_enrs) f2_struct_write_enrs(s, &st->enrs, use_depth ? depth + 1 : 0); if (has_pof) @@ -221,7 +213,7 @@ static void f2_struct_write_inner(stream* s, f2_struct* st, uint32_t depth, bool f2_header_write_end_of_container(s, 0); } -static void f2_struct_write_pof(stream* s, pof* pof, uint32_t depth, bool shift_x) { +static void f2_struct_write_pof(stream& s, pof* pof, uint32_t depth, bool shift_x) { size_t len = pof->length(shift_x); f2_header h; memset(&h, 0, sizeof(f2_header)); @@ -234,7 +226,7 @@ static void f2_struct_write_pof(stream* s, pof* pof, uint32_t depth, bool shift_ pof->write(s, shift_x); } -static void f2_struct_write_enrs(stream* s, enrs* enrs, uint32_t depth) { +static void f2_struct_write_enrs(stream& s, enrs* enrs, uint32_t depth) { size_t len = enrs->length(); f2_header h; memset(&h, 0, sizeof(f2_header)); diff --git a/src/KKdLib/f2/struct.hpp b/src/KKdLib/f2/struct.hpp index b753a182..d60f406d 100644 --- a/src/KKdLib/f2/struct.hpp +++ b/src/KKdLib/f2/struct.hpp @@ -5,10 +5,9 @@ #pragma once -#include "../default.h" -#include "../vector.h" +#include "../default.hpp" #include "enrs.hpp" -#include "header.h" +#include "header.hpp" #include "pof.hpp" struct f2_struct; @@ -27,9 +26,9 @@ struct f2_struct { void read(const char* path); void read(const wchar_t* path); void read(const void* data, size_t size); - void read(stream* s); + void read(stream& s); void write(const char* path, bool use_depth = true, bool shift_x = false); void write(const wchar_t* path, bool use_depth = true, bool shift_x = false); void write(void** data, size_t* size, bool use_depth = true, bool shift_x = false); - void write(stream* s, bool use_depth = true, bool shift_x = false); + void write(stream& s, bool use_depth = true, bool shift_x = false); }; diff --git a/src/KKdLib/farc.cpp b/src/KKdLib/farc.cpp index d57324a0..746f74d0 100644 --- a/src/KKdLib/farc.cpp +++ b/src/KKdLib/farc.cpp @@ -4,11 +4,11 @@ */ #include "farc.hpp" -#include "io/path.h" -#include "aes.h" -#include "deflate.h" +#include "io/path.hpp" +#include "aes.hpp" +#include "deflate.hpp" #include "hash.hpp" -#include "str_utils.h" +#include "str_utils.hpp" static const uint8_t key[] = { 0x70, 0x72, 0x6F, 0x6A, 0x65, 0x63, 0x74, 0x5F, @@ -21,10 +21,10 @@ static const uint8_t key_ft[] = { }; static errno_t farc_get_files(farc* f); -static void farc_pack_files(farc* f, stream* s, farc_compress_mode mode, bool get_files); -static errno_t farc_read_header(farc* f, stream* s); -static void farc_unpack_files(farc* f, stream* s, bool save); -static void farc_unpack_file(farc* f, stream* s, farc_file* ff); +static void farc_pack_files(farc* f, stream& s, farc_compress_mode mode, bool get_files); +static errno_t farc_read_header(farc* f, stream& s); +static void farc_unpack_files(farc* f, stream& s, bool save); +static void farc_unpack_file(farc* f, stream& s, farc_file* ff); farc::farc() : flags(), ft() { signature = FARC_FArC; @@ -153,10 +153,9 @@ void farc::read(const wchar_t* path, bool unpack, bool save) { directory_path = directory_path.substr(0, dot - directory_path.c_str()); stream s; - io_open(&s, file_path.c_str(), "rb"); - if (s.io.stream && !farc_read_header(this, &s) && unpack) - farc_unpack_files(this, &s, save); - io_free(&s); + s.open(file_path.c_str(), "rb"); + if (s.io.stream && !farc_read_header(this, s) && unpack) + farc_unpack_files(this, s, save); } void farc::read(const void* data, size_t size, bool unpack) { @@ -170,10 +169,9 @@ void farc::read(const void* data, size_t size, bool unpack) { directory_path = {}; stream s; - io_open(&s, data, size); - if (!farc_read_header(this, &s) && unpack) - farc_unpack_files(this, &s, false); - io_free(&s); + s.open(data, size); + if (!farc_read_header(this, s) && unpack) + farc_unpack_files(this, s, false); } farc_file* farc::read_file(const char* name) { @@ -186,14 +184,13 @@ farc_file* farc::read_file(const char* name) { continue; if (!i.data && i.data_compressed) - deflate_decompress(i.data_compressed, i.size_compressed, - &i.data, &i.size, DEFLATE_MODE_GZIP); + deflate::decompress(i.data_compressed, i.size_compressed, + &i.data, &i.size, deflate::MODE_GZIP); else if (!i.data) { stream s; - io_open(&s, file_path.c_str(), "rb"); + s.open(file_path.c_str(), "rb"); if (s.io.stream) - farc_unpack_file(this, &s, &i); - io_free(&s); + farc_unpack_file(this, s, &i); } return &i; } @@ -210,14 +207,13 @@ farc_file* farc::read_file(const wchar_t* name) { continue; if (!i.data && i.data_compressed) - deflate_decompress(i.data_compressed, i.size_compressed, - &i.data, &i.size, DEFLATE_MODE_GZIP); + deflate::decompress(i.data_compressed, i.size_compressed, + &i.data, &i.size, deflate::MODE_GZIP); else if (!i.data) { stream s; - io_open(&s, file_path.c_str(), "rb"); + s.open(file_path.c_str(), "rb"); if (s.io.stream) - farc_unpack_file(this, &s, &i); - io_free(&s); + farc_unpack_file(this, s, &i); } return &i; } @@ -239,14 +235,13 @@ farc_file* farc::read_file(uint32_t hash) { continue; if (!i.data && i.data_compressed) - deflate_decompress(i.data_compressed, i.size_compressed, - &i.data, &i.size, DEFLATE_MODE_GZIP); + deflate::decompress(i.data_compressed, i.size_compressed, + &i.data, &i.size, deflate::MODE_GZIP); else if (!i.data) { stream s; - io_open(&s, file_path.c_str(), "rb"); + s.open(file_path.c_str(), "rb"); if (s.io.stream) - farc_unpack_file(this, &s, &i); - io_free(&s); + farc_unpack_file(this, s, &i); } return &i; } @@ -288,10 +283,9 @@ void farc::write(const wchar_t* path, farc_compress_mode mode, bool get_files) { if (!get_files || (get_files && !farc_get_files(this))) { stream s; - io_open(&s, file_path.c_str(), "wb"); + s.open(file_path.c_str(), "wb"); if (s.io.stream) - farc_pack_files(this, &s, mode, get_files); - io_free(&s); + farc_pack_files(this, s, mode, get_files); } } @@ -303,9 +297,8 @@ void farc::write(void** data, size_t* size, farc_compress_mode mode) { file_path = {}; stream s; - io_open(&s); - farc_pack_files(this, &s, mode, false); - io_free(&s); + s.open(); + farc_pack_files(this, s, mode, false); } bool farc::load_file(void* data, const char* path, const char* file, uint32_t hash) { @@ -343,7 +336,7 @@ static errno_t farc_get_files(farc* f) { return 0; } -static void farc_pack_files(farc* f, stream* s, farc_compress_mode mode, bool get_files) { +static void farc_pack_files(farc* f, stream& s, farc_compress_mode mode, bool get_files) { bool plain = false; for (farc_file& i : f->files) { char* ext = str_utils_get_extension(i.name.c_str()); @@ -401,7 +394,7 @@ static void farc_pack_files(farc* f, stream* s, farc_compress_mode mode, bool ge } size_t align = header_length + 8; - io_set_position(s, align_val(align, 0x10), SEEK_SET); + s.set_position(align_val(align, 0x10), SEEK_SET); size_t dir_len = f->directory_path.size(); aes128_ctx ctx; @@ -419,29 +412,29 @@ static void farc_pack_files(farc* f, stream* s, farc_compress_mode mode, bool ge temp[dir_len + 1 + i.name.size()] = '\0'; } - i.offset = io_get_position(s); + i.offset = s.get_position(); stream s_t; - io_open(&s_t, temp, "rb"); + s_t.open(temp, "rb"); if (!s_t.io.stream) { - io_free(&s_t); continue; } - io_set_position(&s_t, 0, SEEK_END); - size_t file_len = io_get_position(&s_t); - io_set_position(&s_t, 0, SEEK_SET); + s_t.set_position(0, SEEK_END); + size_t file_len = s_t.get_position(); + s_t.set_position(0, SEEK_SET); i.size = file_len; void* t = force_malloc(file_len); - io_read(&s_t, t, file_len); + s_t.read(t, file_len); if (mode == FARC_COMPRESS_FARC_AES || mode == FARC_COMPRESS_FARC_GZIP_AES) { void* t1; size_t t1_len; if (mode == FARC_COMPRESS_FARC_GZIP_AES) { - deflate_compress(t, file_len, &t1, &t1_len, f->compression_level, DEFLATE_MODE_GZIP); + deflate::compress(t, file_len, &t1, &t1_len, + f->compression_level, deflate::MODE_GZIP); free(t); } else { @@ -460,30 +453,30 @@ static void farc_pack_files(farc* f, stream* s, farc_compress_mode mode, bool ge aes128_ecb_encrypt_buffer(&ctx, (uint8_t*)t2, t2_len); - io_write(s, t2, t2_len); + s.write(t2, t2_len); i.size_compressed = t1_len; t = t2; } else if (mode == FARC_COMPRESS_FArC || mode == FARC_COMPRESS_FARC_GZIP) { void* t1; size_t t1_len; - deflate_compress(t, file_len, &t1, &t1_len, f->compression_level, DEFLATE_MODE_GZIP); + deflate::compress(t, file_len, &t1, &t1_len, + f->compression_level, deflate::MODE_GZIP); free(t); - io_write(s, t1, t1_len); + s.write(t1, t1_len); size_t a = align_val(t1_len, 0x10) - t1_len; for (size_t j = 0; j < a; j++) - io_write_uint8_t(s, 0x78); + s.write_uint8_t(0x78); i.size_compressed = t1_len; t = t1; } else { - io_write(s, t, file_len); + s.write(t, file_len); size_t a = align_val(file_len, 0x10) - file_len; for (size_t j = 0; j < a; j++) - io_write_uint8_t(s, 0x00); + s.write_uint8_t(0x00); } free(t); - io_free(&s_t); i.data = 0; i.data_changed = false; } @@ -491,7 +484,7 @@ static void farc_pack_files(farc* f, stream* s, farc_compress_mode mode, bool ge } else for (farc_file& i : f->files) { - i.offset = io_get_position(s); + i.offset = s.get_position(); size_t file_len = i.size; if (mode == FARC_COMPRESS_FARC_AES || mode == FARC_COMPRESS_FARC_GZIP_AES) { @@ -500,8 +493,8 @@ static void farc_pack_files(farc* f, stream* s, farc_compress_mode mode, bool ge if (mode == FARC_COMPRESS_FARC_GZIP_AES) { if (!i.data_compressed || i.data_changed) { free(i.data_compressed); - deflate_compress(i.data, file_len, &i.data_compressed, - &i.size_compressed, f->compression_level, DEFLATE_MODE_GZIP); + deflate::compress(i.data, file_len, &i.data_compressed, + &i.size_compressed, f->compression_level, deflate::MODE_GZIP); } t1 = i.data_compressed; t1_len = i.size_compressed; @@ -522,69 +515,69 @@ static void farc_pack_files(farc* f, stream* s, farc_compress_mode mode, bool ge aes128_ecb_encrypt_buffer(&ctx, (uint8_t*)t2, t2_len); - io_write(s, t2, t2_len); + s.write(t2, t2_len); free(t2); } else if (mode == FARC_COMPRESS_FArC || mode == FARC_COMPRESS_FARC_GZIP) { if (!i.data_compressed || i.data_changed) { free(i.data_compressed); - deflate_compress(i.data, file_len, &i.data_compressed, - &i.size_compressed, f->compression_level, DEFLATE_MODE_GZIP); + deflate::compress(i.data, file_len, &i.data_compressed, + &i.size_compressed, f->compression_level, deflate::MODE_GZIP); } - io_write(s, i.data_compressed, i.size_compressed); + s.write(i.data_compressed, i.size_compressed); size_t a = align_val(i.size_compressed, 0x10) - i.size_compressed; for (size_t j = 0; j < a; j++) - io_write_uint8_t(s, 0x78); + s.write_uint8_t(0x78); } else { free(i.data_compressed); - io_write(s, i.data, file_len); + s.write(i.data, file_len); size_t a = align_val(file_len, 0x10) - file_len; for (size_t j = 0; j < a; j++) - io_write_uint8_t(s, 0x00); + s.write_uint8_t(0x00); } i.data_changed = false; } - io_set_position(s, 0, SEEK_SET); + s.set_position(0, SEEK_SET); switch (mode) { case FARC_COMPRESS_FArc: default: - io_write_int32_t_reverse_endianness(s, FARC_FArc, true); - io_write_int32_t_reverse_endianness(s, (int32_t)header_length, true); - io_write_int32_t_reverse_endianness(s, 0x01, true); + s.write_int32_t_reverse_endianness(FARC_FArc, true); + s.write_int32_t_reverse_endianness((int32_t)header_length, true); + s.write_int32_t_reverse_endianness(0x01, true); break; case FARC_COMPRESS_FArC: - io_write_int32_t_reverse_endianness(s, FARC_FArC, true); - io_write_int32_t_reverse_endianness(s, (int32_t)header_length, true); - io_write_int32_t_reverse_endianness(s, 0x01, true); + s.write_int32_t_reverse_endianness(FARC_FArC, true); + s.write_int32_t_reverse_endianness((int32_t)header_length, true); + s.write_int32_t_reverse_endianness(0x01, true); break; case FARC_COMPRESS_FARC: case FARC_COMPRESS_FARC_GZIP: case FARC_COMPRESS_FARC_AES: case FARC_COMPRESS_FARC_GZIP_AES: - io_write_int32_t_reverse_endianness(s, FARC_FARC, true); - io_write_int32_t_reverse_endianness(s, (int32_t)header_length, true); - io_write_int32_t_reverse_endianness(s, f->flags, true); - io_write_int32_t_reverse_endianness(s, 0x00, true); - io_write_int32_t_reverse_endianness(s, 0x40, true); - io_write_int32_t_reverse_endianness(s, 0x00, true); - io_write_int32_t_reverse_endianness(s, 0x00, true); + s.write_int32_t_reverse_endianness(FARC_FARC, true); + s.write_int32_t_reverse_endianness((int32_t)header_length, true); + s.write_int32_t_reverse_endianness(f->flags, true); + s.write_int32_t_reverse_endianness(0x00, true); + s.write_int32_t_reverse_endianness(0x40, true); + s.write_int32_t_reverse_endianness(0x00, true); + s.write_int32_t_reverse_endianness(0x00, true); break; } if (mode == FARC_COMPRESS_FArc) for (farc_file& i : f->files) { - io_write_string_null_terminated(s, &i.name); - io_write_int32_t_reverse_endianness(s, (int32_t)i.offset, true); - io_write_int32_t_reverse_endianness(s, (int32_t)i.size, true); + s.write_string_null_terminated(i.name); + s.write_int32_t_reverse_endianness((int32_t)i.offset, true); + s.write_int32_t_reverse_endianness((int32_t)i.size, true); } else for (farc_file& i : f->files) { - io_write_string_null_terminated(s, &i.name); - io_write_int32_t_reverse_endianness(s, (int32_t)i.offset, true); - io_write_int32_t_reverse_endianness(s, (int32_t)i.size_compressed, true); - io_write_int32_t_reverse_endianness(s, (int32_t)i.size, true); + s.write_string_null_terminated(i.name); + s.write_int32_t_reverse_endianness((int32_t)i.offset, true); + s.write_int32_t_reverse_endianness((int32_t)i.size_compressed, true); + s.write_int32_t_reverse_endianness((int32_t)i.size, true); } align = align_val(align, 0x10) - align; @@ -593,38 +586,38 @@ static void farc_pack_files(farc* f, stream* s, farc_compress_mode mode, bool ge 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - io_write(s, padding, align); + s.write(padding, align); } else { uint8_t padding[] = { 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, }; - io_write(s, padding, align); + s.write(padding, align); } } -static errno_t farc_read_header(farc* f, stream* s) { - if (!f || !s) +static errno_t farc_read_header(farc* f, stream& s) { + if (!f || s.io.check_null()) return -1; - io_set_position(s, 0, SEEK_SET); - f->signature = (farc_signature)io_read_int32_t_reverse_endianness(s, true); + s.set_position(0, SEEK_SET); + f->signature = (farc_signature)s.read_int32_t_reverse_endianness(true); if (f->signature != FARC_FArc && f->signature != FARC_FArC && f->signature != FARC_FARC) return -2; f->ft = false; - int32_t header_length = io_read_int32_t_reverse_endianness(s, true); + int32_t header_length = s.read_int32_t_reverse_endianness(true); if (f->signature == FARC_FARC) { - f->flags = (farc_flags)io_read_int32_t_reverse_endianness(s, true); - io_read_int32_t(s); - int32_t farc_mode = io_read_int32_t_reverse_endianness(s, true); + f->flags = (farc_flags)s.read_int32_t_reverse_endianness(true); + s.read_int32_t(); + int32_t farc_mode = s.read_int32_t_reverse_endianness(true); f->ft = (f->flags & FARC_AES) && (farc_mode & (farc_mode - 1)); if (f->ft) { header_length -= 0x08; - io_set_position(s, -0x04, SEEK_CUR); + s.set_position(-0x04, SEEK_CUR); } else header_length -= 0x0C; @@ -638,7 +631,7 @@ static errno_t farc_read_header(farc* f, stream* s) { int32_t length = 0; dt = d_t = force_malloc_s(uint8_t, header_length); - io_read(s, d_t, header_length); + s.read(d_t, header_length); if (f->ft) { aes128_ctx ctx; aes128_init_ctx_iv(&ctx, key_ft, dt); @@ -710,8 +703,8 @@ static errno_t farc_read_header(farc* f, stream* s) { return 0; } -static void farc_unpack_files(farc* f, stream* s, bool save) { - if (!f || !s) +static void farc_unpack_files(farc* f, stream& s, bool save) { + if (!f || s.io.check_null()) return; for (farc_file& i : f->files) @@ -744,39 +737,38 @@ static void farc_unpack_files(farc* f, stream* s, bool save) { if (i.data) { stream temp_s; - io_open(&temp_s, temp_path, "wb"); + temp_s.open(temp_path, "wb"); if (temp_s.io.stream) - io_write(&temp_s, i.data, i.size); - io_free(&temp_s); + temp_s.write(i.data, i.size); free(i.data); } } free(temp_path); } -static void farc_unpack_file(farc* f, stream* s, farc_file* ff) { - if (!f || !s) +static void farc_unpack_file(farc* f, stream& s, farc_file* ff) { + if (!f || s.io.check_null()) return; if (ff->data) free(ff->data); - io_set_position(s, ff->offset, SEEK_SET); + s.set_position(ff->offset, SEEK_SET); if (f->signature != FARC_FARC) { if (f->signature != FARC_FArC) { ff->data_compressed = 0; ff->data = force_malloc(ff->size); - io_read(s, ff->data, ff->size); + s.read(ff->data, ff->size); } else if (ff->data_compressed) - deflate_decompress(ff->data_compressed, ff->size_compressed, - &ff->data, &ff->size, DEFLATE_MODE_GZIP); + deflate::decompress(ff->data_compressed, ff->size_compressed, + &ff->data, &ff->size, deflate::MODE_GZIP); else { ff->data_compressed = force_malloc(ff->size_compressed); - io_read(s, ff->data_compressed, ff->size_compressed); - deflate_decompress(ff->data_compressed, ff->size_compressed, - &ff->data, &ff->size, DEFLATE_MODE_GZIP); + s.read(ff->data_compressed, ff->size_compressed); + deflate::decompress(ff->data_compressed, ff->size_compressed, + &ff->data, &ff->size, deflate::MODE_GZIP); } } else { @@ -785,15 +777,15 @@ static void farc_unpack_file(farc* f, stream* s, farc_file* ff) { if (!aes && !gzip) { ff->data_compressed = 0; ff->data = force_malloc(ff->size); - io_read(s, ff->data, ff->size); + s.read(ff->data, ff->size); } else if (ff->data_compressed) - deflate_decompress(ff->data_compressed, ff->size_compressed, - &ff->data, &ff->size, DEFLATE_MODE_GZIP); + deflate::decompress(ff->data_compressed, ff->size_compressed, + &ff->data, &ff->size, deflate::MODE_GZIP); else { size_t temp_s = aes ? align_val(ff->size_compressed, 0x10) : ff->size_compressed; void* temp = force_malloc(temp_s); - io_read(s, temp, temp_s); + s.read(temp, temp_s); void* t = temp; if (aes) @@ -820,8 +812,8 @@ static void farc_unpack_file(farc* f, stream* s, farc_file* ff) { else { ff->data_compressed = force_malloc(ff->size_compressed); memcpy(ff->data_compressed, t, ff->size_compressed); - deflate_decompress(ff->data_compressed, ff->size_compressed, - &ff->data, &ff->size, DEFLATE_MODE_GZIP); + deflate::decompress(ff->data_compressed, ff->size_compressed, + &ff->data, &ff->size, deflate::MODE_GZIP); } free(temp); } diff --git a/src/KKdLib/farc.hpp b/src/KKdLib/farc.hpp index cee84a63..614634fb 100644 --- a/src/KKdLib/farc.hpp +++ b/src/KKdLib/farc.hpp @@ -7,8 +7,8 @@ #include #include -#include "default.h" -#include "io/stream.h" +#include "default.hpp" +#include "io/stream.hpp" enum farc_signature { FARC_FArc = 'FArc', diff --git a/src/KKdLib/half_t.c b/src/KKdLib/half_t.cpp similarity index 95% rename from src/KKdLib/half_t.c rename to src/KKdLib/half_t.cpp index cffe8038..30b44768 100644 --- a/src/KKdLib/half_t.c +++ b/src/KKdLib/half_t.cpp @@ -3,12 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "half_t.h" - -vector_old_func(half_t) -vector_old_ptr_func(half_t) - -// Crutch for vector_old_func definition +#include "half_t.hpp" inline half_t load_reverse_endianness_half_t(void* ptr) { return (half_t)_byteswap_ushort(*(uint16_t*)ptr); diff --git a/src/KKdLib/half_t.h b/src/KKdLib/half_t.hpp similarity index 90% rename from src/KKdLib/half_t.h rename to src/KKdLib/half_t.hpp index 7c18dc08..23615f27 100644 --- a/src/KKdLib/half_t.h +++ b/src/KKdLib/half_t.hpp @@ -5,8 +5,7 @@ #pragma once -#include "default.h" -#include "vector.h" +#include "default.hpp" #define FLOAT16_NAN ((half_t)0x7FFF) #define FLOAT16_POSITIVE_NAN ((half_t)0x7FFF) @@ -21,9 +20,6 @@ typedef unsigned short half_t; -vector_old(half_t) -vector_old_ptr(half_t) - extern half_t load_reverse_endianness_half_t(void* ptr); extern void store_reverse_endianness_half_t(half_t value, void* ptr); extern half_t reverse_endianness_half_t(half_t value); diff --git a/src/KKdLib/hash.cpp b/src/KKdLib/hash.cpp index 4f6a5154..b16d0f13 100644 --- a/src/KKdLib/hash.cpp +++ b/src/KKdLib/hash.cpp @@ -78,10 +78,6 @@ inline uint64_t hash_utf16_fnv1a64m(const wchar_t* data, bool make_upper) { return hash; } -inline uint64_t hash_string_fnv1a64m(const string* data, bool make_upper) { - return hash_fnv1a64m(string_data(data), data->length, make_upper); -} - inline uint64_t hash_string_fnv1a64m(const std::string* data, bool make_upper) { return hash_fnv1a64m(data->c_str(), data->size(), make_upper); } @@ -230,10 +226,6 @@ inline uint32_t hash_utf16_murmurhash(const wchar_t* data, uint32_t seed, bool u return hash; } -inline uint32_t hash_string_murmurhash(const string* data, uint32_t seed, bool upper) { - return hash_murmurhash(string_data(data), data->length, seed, upper); -} - inline uint32_t hash_string_murmurhash(const std::string* data, uint32_t seed, bool upper) { return hash_murmurhash(data->c_str(), data->size(), seed, upper); } @@ -268,10 +260,6 @@ inline uint16_t hash_utf16_crc16_ccitt(const wchar_t* data, bool make_upper) { return hash; } -inline uint16_t hash_string_crc16_ccitt(const string* data, bool make_upper) { - return hash_crc16_ccitt(string_data(data), data->length, make_upper); -} - inline uint16_t hash_string_crc16_ccitt(const std::string* data, bool make_upper) { return hash_crc16_ccitt(data->c_str(), data->size(), make_upper); } diff --git a/src/KKdLib/hash.hpp b/src/KKdLib/hash.hpp index 10d86de1..d61c5e14 100644 --- a/src/KKdLib/hash.hpp +++ b/src/KKdLib/hash.hpp @@ -6,8 +6,7 @@ #pragma once #include -#include "default.h" -#include "string.h" +#include "default.hpp" extern const uint64_t hash_fnv1a64m_empty; extern const uint32_t hash_murmurhash_empty; @@ -16,15 +15,12 @@ extern const uint32_t hash_crc16_ccitt_empty; extern uint64_t hash_fnv1a64m(const void* data, size_t size, bool make_upper = false); extern uint64_t hash_utf8_fnv1a64m(const char* data, bool make_upper = false); extern uint64_t hash_utf16_fnv1a64m(const wchar_t* data, bool make_upper = false); -extern uint64_t hash_string_fnv1a64m(const string* data, bool make_upper = false); extern uint64_t hash_string_fnv1a64m(const std::string* data, bool make_upper = false); extern uint32_t hash_murmurhash(const void* data, size_t size, uint32_t seed = 0, bool upper = false, bool big_endian = false); extern uint32_t hash_utf8_murmurhash(const char* data, uint32_t seed = 0, bool upper = false); extern uint32_t hash_utf16_murmurhash(const wchar_t* data, uint32_t seed = 0, bool upper = false); -extern uint32_t hash_string_murmurhash(const string* data, uint32_t seed = 0, bool upper = false); extern uint32_t hash_string_murmurhash(const std::string* data, uint32_t seed = 0, bool upper = false); extern uint16_t hash_crc16_ccitt(const void* data, size_t size, bool make_upper = false); extern uint16_t hash_utf8_crc16_ccitt(const char* data, bool make_upper = false); extern uint16_t hash_utf16_crc16_ccitt(const wchar_t* data, bool make_upper = false); -extern uint16_t hash_string_crc16_ccitt(const string* data, bool make_upper = false); extern uint16_t hash_string_crc16_ccitt(const std::string* data, bool make_upper = false); diff --git a/src/KKdLib/image.c b/src/KKdLib/image.cpp similarity index 99% rename from src/KKdLib/image.c rename to src/KKdLib/image.cpp index 1fb50b86..e8b13d03 100644 --- a/src/KKdLib/image.c +++ b/src/KKdLib/image.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "image.h" +#include "image.hpp" ; static rgb565 rgb565_apply_color_tone(rgb565 col, color_tone* col_tone); static void rgb_to_ycc(vec3& rgb, vec3& ycc); diff --git a/src/KKdLib/image.h b/src/KKdLib/image.hpp similarity index 95% rename from src/KKdLib/image.h rename to src/KKdLib/image.hpp index 5f7c8406..9d9734e9 100644 --- a/src/KKdLib/image.h +++ b/src/KKdLib/image.hpp @@ -5,8 +5,8 @@ #pragma once -#include "default.h" -#include "vec.h" +#include "default.hpp" +#include "vec.hpp" struct color_tone { vec3 blend; diff --git a/src/KKdLib/interpolation.h b/src/KKdLib/interpolation.h index 0c8aa248..4ecbf233 100644 --- a/src/KKdLib/interpolation.h +++ b/src/KKdLib/interpolation.h @@ -5,8 +5,8 @@ #pragma once -#include "default.h" -#include "vec.h" +#include "default.hpp" +#include "vec.hpp" extern float_t interpolate_linear_value(float_t p1, float_t p2, float_t f1, float_t f2, float_t f); extern void interpolate_linear_value_vec2(vec2* p1, vec2* p2, vec2* f1, vec2* f2, vec2* f, vec2* value); diff --git a/src/KKdLib/io/json.cpp b/src/KKdLib/io/json.cpp index 472e6ce0..a471d4b4 100644 --- a/src/KKdLib/io/json.cpp +++ b/src/KKdLib/io/json.cpp @@ -13,36 +13,36 @@ struct io_json_read_buffer { int32_t length; }; -static int32_t io_json_read_char(stream* s, io_json_read_buffer* buf); -static void io_json_seek(stream* s, io_json_read_buffer* buf, int64_t offset); -static void io_json_seek_one(stream* s, io_json_read_buffer* buf); -static void io_json_read_inner(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); -static void io_json_read_digit(stream* s, io_json_read_buffer* buf, int32_t* c, char** dig_buf, char* dig_buf_end); -static void io_json_read_float(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); +static int32_t io_json_read_char(stream& s, io_json_read_buffer* buf); +static void io_json_seek(stream& s, io_json_read_buffer* buf, int64_t offset); +static void io_json_seek_one(stream& s, io_json_read_buffer* buf); +static void io_json_read_inner(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); +static void io_json_read_digit(stream& s, io_json_read_buffer* buf, int32_t* c, char** dig_buf, char* dig_buf_end); +static void io_json_read_float(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); static uint8_t io_json_read_string_hex(int32_t c); -static char* io_json_read_string_inner(stream* s, io_json_read_buffer* buf, msgpack* msg, int32_t* c); -static void io_json_read_string(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); -static void io_json_read_map(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); -static void io_json_read_array(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); -static void io_json_read_bool(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); -static void io_json_read_null(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); -static void io_json_write_inner(stream* s, msgpack* msg, size_t tabs); -static void io_json_write_null(stream* s); -static void io_json_write_bool(stream* s, bool val); -static void io_json_write_int8_t(stream* s, int8_t val); -static void io_json_write_uint8_t(stream* s, uint8_t val); -static void io_json_write_int16_t(stream* s, int16_t val); -static void io_json_write_uint16_t(stream* s, uint16_t val); -static void io_json_write_int32_t(stream* s, int32_t val); -static void io_json_write_uint32_t(stream* s, uint32_t val); -static void io_json_write_int64_t(stream* s, int64_t val); -static void io_json_write_uint64_t(stream* s, uint64_t val); -static void io_json_write_float_t(stream* s, float_t val); -static void io_json_write_double_t(stream* s, double_t val); -static void io_json_write_string(stream* s, std::string* val); +static char* io_json_read_string_inner(stream& s, io_json_read_buffer* buf, msgpack* msg, int32_t* c); +static void io_json_read_string(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); +static void io_json_read_map(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); +static void io_json_read_array(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); +static void io_json_read_bool(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); +static void io_json_read_null(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c); +static void io_json_write_inner(stream& s, msgpack* msg, size_t tabs); +static void io_json_write_null(stream& s); +static void io_json_write_bool(stream& s, bool val); +static void io_json_write_int8_t(stream& s, int8_t val); +static void io_json_write_uint8_t(stream& s, uint8_t val); +static void io_json_write_int16_t(stream& s, int16_t val); +static void io_json_write_uint16_t(stream& s, uint16_t val); +static void io_json_write_int32_t(stream& s, int32_t val); +static void io_json_write_uint32_t(stream& s, uint32_t val); +static void io_json_write_int64_t(stream& s, int64_t val); +static void io_json_write_uint64_t(stream& s, uint64_t val); +static void io_json_write_float_t(stream& s, float_t val); +static void io_json_write_double_t(stream& s, double_t val); +static void io_json_write_string(stream& s, std::string* val); -void io_json_read(stream* s, msgpack* msg) { - if (!msg || !s->io.stream) +void io_json_read(stream& s, msgpack* msg) { + if (!msg || !s.io.stream) return; io_json_read_buffer buf; @@ -56,11 +56,11 @@ void io_json_read(stream* s, msgpack* msg) { #define CHECK_WHITESPACE(c) (c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09) -static int32_t io_json_read_char(stream* s, io_json_read_buffer* buf) { +static int32_t io_json_read_char(stream& s, io_json_read_buffer* buf) { if (buf->length == 0) { buf->first = 1; buf->data[0] = buf->data[IO_JSON_READ_BUF_SIZE - 1]; - buf->length = (int32_t)io_read(s, &buf->data[0x01], IO_JSON_READ_BUF_SIZE - 1); + buf->length = (int32_t)s.read(&buf->data[0x01], IO_JSON_READ_BUF_SIZE - 1); } if (buf->length < 1) @@ -72,21 +72,21 @@ static int32_t io_json_read_char(stream* s, io_json_read_buffer* buf) { return c; } -static void io_json_seek(stream* s, io_json_read_buffer* buf, int64_t offset) { +static void io_json_seek(stream& s, io_json_read_buffer* buf, int64_t offset) { if (buf->first < offset || offset >= buf->length - 1LL) { - int64_t pos = io_get_position(s) - buf->length - offset; + int64_t pos = s.get_position() - buf->length - offset; int64_t off = pos % IO_JSON_READ_BUF_SIZE; pos -= off; if (pos > 1) { - io_set_position(s, pos, SEEK_SET); + s.set_position(pos, SEEK_SET); buf->first = (int32_t)off; - buf->length = (int32_t)io_read(s, &buf->data[0x00], IO_JSON_READ_BUF_SIZE); + buf->length = (int32_t)s.read(&buf->data[0x00], IO_JSON_READ_BUF_SIZE); } else { - io_set_position(s, pos, SEEK_SET); + s.set_position(pos, SEEK_SET); buf->first = (int32_t)(off + 1); buf->data[0] = 0; - buf->length = (int32_t)io_read(s, &buf->data[0x01], IO_JSON_READ_BUF_SIZE - 1); + buf->length = (int32_t)s.read(&buf->data[0x01], IO_JSON_READ_BUF_SIZE - 1); } buf->length -= (int32_t)off; } @@ -96,12 +96,12 @@ static void io_json_seek(stream* s, io_json_read_buffer* buf, int64_t offset) { } } -inline static void io_json_seek_one(stream* s, io_json_read_buffer* buf) { +inline static void io_json_seek_one(stream& s, io_json_read_buffer* buf) { buf->first--; buf->length++; } -static void io_json_read_inner(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { +static void io_json_read_inner(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { *msg = msgpack(name); while (*c != EOF) { if (CHECK_WHITESPACE(*c)) @@ -139,7 +139,7 @@ static void io_json_read_inner(stream* s, io_json_read_buffer* buf, const char* } } -inline static void io_json_read_digit(stream* s, io_json_read_buffer* buf, int32_t* c, char** dig_buf, char* dig_buf_end) { +inline static void io_json_read_digit(stream& s, io_json_read_buffer* buf, int32_t* c, char** dig_buf, char* dig_buf_end) { char* b = *dig_buf; while (isdigit(*c) && b < dig_buf_end) { *b++ = *c; @@ -149,7 +149,7 @@ inline static void io_json_read_digit(stream* s, io_json_read_buffer* buf, int32 *dig_buf = b; } -static void io_json_read_float(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { +static void io_json_read_float(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { char dig_buf[0x100]; char* t_buf = dig_buf; char* buf_end = dig_buf + 0x100; @@ -250,11 +250,11 @@ inline static uint8_t io_json_read_string_hex(int32_t c) { return 0; } -static char* io_json_read_string_inner(stream* s, io_json_read_buffer* buf, msgpack* msg, int32_t* c) { +static char* io_json_read_string_inner(stream& s, io_json_read_buffer* buf, msgpack* msg, int32_t* c) { if (*c != '"') return 0; - int64_t pos = io_get_position(s) - buf->length; + int64_t pos = s.get_position() - buf->length; size_t len = 0; while (*c != EOF) { *c = io_json_read_char(s, buf); @@ -307,7 +307,7 @@ static char* io_json_read_string_inner(stream* s, io_json_read_buffer* buf, msgp } if (*c == EOF) return 0; - int64_t pos_end = io_get_position(s) - buf->length; + int64_t pos_end = s.get_position() - buf->length; io_json_seek(s, buf, pos_end - pos); char* temp = force_malloc_s(char, len + 1); @@ -374,13 +374,13 @@ static char* io_json_read_string_inner(stream* s, io_json_read_buffer* buf, msgp return temp; } -inline static void io_json_read_string(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { +inline static void io_json_read_string(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { char* temp = io_json_read_string_inner(s, buf, msg, c); *msg = msgpack(name, temp); free(temp); } -inline static void io_json_read_skip_whitespace(stream* s, io_json_read_buffer* buf, int32_t* c) { +inline static void io_json_read_skip_whitespace(stream& s, io_json_read_buffer* buf, int32_t* c) { while ((*c = io_json_read_char(s, buf)) != EOF) { if (CHECK_WHITESPACE(*c)) continue; @@ -388,7 +388,7 @@ inline static void io_json_read_skip_whitespace(stream* s, io_json_read_buffer* } } -static void io_json_read_map(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { +static void io_json_read_map(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { size_t i = 0; msgpack m; msgpack_array map; @@ -426,7 +426,7 @@ static void io_json_read_map(stream* s, io_json_read_buffer* buf, const char* na *msg = msgpack(name, false, map); } -static void io_json_read_array(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { +static void io_json_read_array(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { size_t i = 0; msgpack m; msgpack_array array; @@ -452,7 +452,7 @@ static void io_json_read_array(stream* s, io_json_read_buffer* buf, const char* *msg = msgpack(name, true, array); } -inline static void io_json_read_bool(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { +inline static void io_json_read_bool(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { if (*c != 't') { if ((*c = io_json_read_char(s, buf)) == EOF || *c != 'a') return; @@ -475,7 +475,7 @@ inline static void io_json_read_bool(stream* s, io_json_read_buffer* buf, const } } -inline static void io_json_read_null(stream* s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { +inline static void io_json_read_null(stream& s, io_json_read_buffer* buf, const char* name, msgpack* msg, int32_t* c) { if ((*c = io_json_read_char(s, buf)) == EOF || *c != 'u') return; if ((*c = io_json_read_char(s, buf)) == EOF || *c != 'l') @@ -486,20 +486,20 @@ inline static void io_json_read_null(stream* s, io_json_read_buffer* buf, const *msg = msgpack(name); } -void io_json_write(stream* s, msgpack* msg) { - if (!s->io.stream || !msg) +void io_json_write(stream& s, msgpack* msg) { + if (!s.io.stream || !msg) return; io_json_write_inner(s, msg, 0); } -void io_json_write_inner(stream* s, msgpack* msg, size_t tabs) { +void io_json_write_inner(stream& s, msgpack* msg, size_t tabs) { for (size_t i = 0; i < tabs; i++) - io_write(s, " ", 2); + s.write(" ", 2); if (msg->name.size()) { io_json_write_string(s, &msg->name); - io_write(s, ": ", 2); + s.write(": ", 2); } switch (msg->type) { @@ -544,110 +544,110 @@ void io_json_write_inner(stream* s, msgpack* msg, size_t tabs) { break; case MSGPACK_ARRAY: { msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); - io_write(s, "[\n", 2); + s.write("[\n", 2); for (msgpack& i : *ptr) { io_json_write_inner(s, &i, tabs + 1); if (&i + 1 != ptr->data() + ptr->size()) - io_write_char(s, ','); - io_write_char(s, '\n'); + s.write_char(','); + s.write_char('\n'); } for (size_t i = 0; i < tabs; i++) - io_write(s, " ", 2); - io_write_char(s, ']'); + s.write(" ", 2); + s.write_char(']'); } break; case MSGPACK_MAP: { msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); - io_write(s, "{\n", 2); + s.write("{\n", 2); for (msgpack& i : *ptr) { io_json_write_inner(s, &i, tabs + 1); if (&i + 1 != ptr->data() + ptr->size()) - io_write_char(s, ','); - io_write_char(s, '\n'); + s.write_char(','); + s.write_char('\n'); } for (size_t i = 0; i < tabs; i++) - io_write(s, " ", 2); - io_write_char(s, '}'); + s.write(" ", 2); + s.write_char('}'); } break; } } -inline static void io_json_write_null(stream* s) { - io_write(s, "null", 4); +inline static void io_json_write_null(stream& s) { + s.write("null", 4); } -inline static void io_json_write_bool(stream* s, bool val) { +inline static void io_json_write_bool(stream& s, bool val) { if (val) - io_write(s, "true", 4); + s.write("true", 4); else - io_write(s, "false", 4); + s.write("false", 4); } -inline static void io_json_write_int8_t(stream* s, int8_t val) { +inline static void io_json_write_int8_t(stream& s, int8_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%hhi", val); - io_write(s, temp, len); + s.write(temp, len); } -inline static void io_json_write_uint8_t(stream* s, uint8_t val) { +inline static void io_json_write_uint8_t(stream& s, uint8_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%hhu", val); - io_write(s, temp, len); + s.write(temp, len); } -inline static void io_json_write_int16_t(stream* s, int16_t val) { +inline static void io_json_write_int16_t(stream& s, int16_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%hi", val); - io_write(s, temp, len); + s.write(temp, len); } -inline static void io_json_write_uint16_t(stream* s, uint16_t val) { +inline static void io_json_write_uint16_t(stream& s, uint16_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%hu", val); - io_write(s, temp, len); + s.write(temp, len); } -inline static void io_json_write_int32_t(stream* s, int32_t val) { +inline static void io_json_write_int32_t(stream& s, int32_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%i", val); - io_write(s, temp, len); + s.write(temp, len); } -inline static void io_json_write_uint32_t(stream* s, uint32_t val) { +inline static void io_json_write_uint32_t(stream& s, uint32_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%u", val); - io_write(s, temp, len); + s.write(temp, len); } -inline static void io_json_write_int64_t(stream* s, int64_t val) { +inline static void io_json_write_int64_t(stream& s, int64_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%lli", val); - io_write(s, temp, len); + s.write(temp, len); } -inline static void io_json_write_uint64_t(stream* s, uint64_t val) { +inline static void io_json_write_uint64_t(stream& s, uint64_t val) { char temp[0x20]; size_t len = sprintf_s(temp, 0x20, "%llu", val); - io_write(s, temp, len); + s.write(temp, len); } -inline static void io_json_write_float_t(stream* s, float_t val) { +inline static void io_json_write_float_t(stream& s, float_t val) { char temp[0x40]; size_t len = sprintf_s(temp, 0x40, "%.15lg", (double_t)val); - io_write(s, temp, len); + s.write(temp, len); } -inline static void io_json_write_double_t(stream* s, double_t val) { +inline static void io_json_write_double_t(stream& s, double_t val) { char temp[0x40]; size_t len = sprintf_s(temp, 0x40, "%.15lg", val); - io_write(s, temp, len); + s.write(temp, len); } -inline static void io_json_write_string(stream* s, std::string* val) { - io_write_char(s, '\"'); +inline static void io_json_write_string(stream& s, std::string* val) { + s.write_char('\"'); const char* str = val->c_str(); size_t len = val->size(); for (size_t i = len; i; i--, str++) @@ -679,38 +679,38 @@ inline static void io_json_write_string(stream* s, std::string* val) { case 0x1D: case 0x1E: case 0x1F: { - io_write(s, "\\u", 2); + s.write("\\u", 2); char t[5]; size_t len = sprintf_s(t, 5, "%04x", (wchar_t)*str); - io_write(s, t, len); + s.write(t, len); } break; case 0x08: - io_write(s, "\\b", 2); + s.write("\\b", 2); break; case 0x09: - io_write(s, "\\t", 2); + s.write("\\t", 2); break; case 0x0A: - io_write(s, "\\n", 2); + s.write("\\n", 2); break; case 0x0C: - io_write(s, "\\f", 2); + s.write("\\f", 2); break; case 0x0D: - io_write(s, "\\r", 2); + s.write("\\r", 2); break; case 0x22: - io_write(s, "\\\"", 2); + s.write("\\\"", 2); break; case 0x5C: - io_write(s, "\\\\", 2); + s.write("\\\\", 2); break; case 0x2F: - io_write(s, "\\/", 2); + s.write("\\/", 2); break; default: - io_write_char(s, *str); + s.write_char(*str); } - io_write_char(s, '\"'); + s.write_char('\"'); } diff --git a/src/KKdLib/io/json.hpp b/src/KKdLib/io/json.hpp index bdaed444..59a3f779 100644 --- a/src/KKdLib/io/json.hpp +++ b/src/KKdLib/io/json.hpp @@ -5,9 +5,9 @@ #pragma once -#include "../default.h" +#include "../default.hpp" #include "../msgpack.hpp" -#include "stream.h" +#include "stream.hpp" -extern void io_json_read(stream* s, msgpack* msg); -extern void io_json_write(stream* s, msgpack* msg); +extern void io_json_read(stream& s, msgpack* msg); +extern void io_json_write(stream& s, msgpack* msg); diff --git a/src/KKdLib/io/msgpack.cpp b/src/KKdLib/io/msgpack.cpp index 191e2653..3c4c868b 100644 --- a/src/KKdLib/io/msgpack.cpp +++ b/src/KKdLib/io/msgpack.cpp @@ -5,33 +5,33 @@ #include "msgpack.hpp" -static void io_msgpack_read_inner(stream* s, const char* name, msgpack* msg); -static void io_msgpack_read_string(stream* s, const char* name, msgpack* msg, size_t length); -static void io_msgpack_read_array(stream* s, const char* name, msgpack* msg, size_t length); -static void io_msgpack_read_map(stream* s, const char* name, msgpack* msg, size_t length); -static void io_msgpack_write_inner(stream* s, msgpack* msg); -static void io_msgpack_write_null(stream* s); -static void io_msgpack_write_bool(stream* s, bool val); -static void io_msgpack_write_int8_t(stream* s, int8_t val); -static void io_msgpack_write_uint8_t(stream* s, uint8_t val); -static void io_msgpack_write_int16_t(stream* s, int16_t val); -static void io_msgpack_write_uint16_t(stream* s, uint16_t val); -static void io_msgpack_write_int32_t(stream* s, int32_t val); -static void io_msgpack_write_uint32_t(stream* s, uint32_t val); -static void io_msgpack_write_int64_t(stream* s, int64_t val); -static void io_msgpack_write_uint64_t(stream* s, uint64_t val); -static void io_msgpack_write_float_t(stream* s, float_t val); -static void io_msgpack_write_double_t(stream* s, double_t val); -static void io_msgpack_write_string(stream* s, std::string* val); -static void io_msgpack_write_array(stream* s, size_t val); -static void io_msgpack_write_map(stream* s, size_t val); +static void io_msgpack_read_inner(stream& s, const char* name, msgpack* msg); +static void io_msgpack_read_string(stream& s, const char* name, msgpack* msg, size_t length); +static void io_msgpack_read_array(stream& s, const char* name, msgpack* msg, size_t length); +static void io_msgpack_read_map(stream& s, const char* name, msgpack* msg, size_t length); +static void io_msgpack_write_inner(stream& s, msgpack* msg); +static void io_msgpack_write_null(stream& s); +static void io_msgpack_write_bool(stream& s, bool val); +static void io_msgpack_write_int8_t(stream& s, int8_t val); +static void io_msgpack_write_uint8_t(stream& s, uint8_t val); +static void io_msgpack_write_int16_t(stream& s, int16_t val); +static void io_msgpack_write_uint16_t(stream& s, uint16_t val); +static void io_msgpack_write_int32_t(stream& s, int32_t val); +static void io_msgpack_write_uint32_t(stream& s, uint32_t val); +static void io_msgpack_write_int64_t(stream& s, int64_t val); +static void io_msgpack_write_uint64_t(stream& s, uint64_t val); +static void io_msgpack_write_float_t(stream& s, float_t val); +static void io_msgpack_write_double_t(stream& s, double_t val); +static void io_msgpack_write_string(stream& s, std::string& val); +static void io_msgpack_write_array(stream& s, size_t val); +static void io_msgpack_write_map(stream& s, size_t val); -void io_msgpack_read(stream* s, msgpack* msg) { +void io_msgpack_read(stream& s, msgpack* msg) { io_msgpack_read_inner(s, 0, msg); } -static void io_msgpack_read_inner(stream* s, const char* name, msgpack* msg) { - uint8_t type = io_read_uint8_t(s); +static void io_msgpack_read_inner(stream& s, const char* name, msgpack* msg) { + uint8_t type = s.read_uint8_t(); *msg = msgpack(name); switch (type >> 4) { @@ -71,106 +71,106 @@ static void io_msgpack_read_inner(stream* s, const char* name, msgpack* msg) { *msg = msgpack(name, true); break; case 0xC4: - io_set_position(s, io_read_uint8_t(s), SEEK_CUR); + s.set_position(s.read_uint8_t(), SEEK_CUR); break; case 0xC5: - io_set_position(s, io_read_uint16_t_reverse_endianness(s, true), SEEK_CUR); + s.set_position(s.read_uint16_t_reverse_endianness(true), SEEK_CUR); break; case 0xC6: - io_set_position(s, io_read_uint32_t_reverse_endianness(s, true), SEEK_CUR); + s.set_position(s.read_uint32_t_reverse_endianness(true), SEEK_CUR); break; case 0xC7: - io_set_position(s, io_read_uint8_t(s) + 1ULL, SEEK_CUR); + s.set_position(s.read_uint8_t() + 1ULL, SEEK_CUR); break; case 0xC8: - io_set_position(s, io_read_uint16_t_reverse_endianness(s, true) + 1ULL, SEEK_CUR); + s.set_position(s.read_uint16_t_reverse_endianness(true) + 1ULL, SEEK_CUR); break; case 0xC9: - io_set_position(s, io_read_uint32_t_reverse_endianness(s, true) + 1ULL, SEEK_CUR); + s.set_position(s.read_uint32_t_reverse_endianness(true) + 1ULL, SEEK_CUR); break; case 0xCA: - *msg = msgpack(name, io_read_float_t_reverse_endianness(s, true)); + *msg = msgpack(name, s.read_float_t_reverse_endianness(true)); break; case 0xCB: - *msg = msgpack(name, io_read_double_t_reverse_endianness(s, true)); + *msg = msgpack(name, s.read_double_t_reverse_endianness(true)); break; case 0xCC: - *msg = msgpack(name, io_read_uint8_t(s)); + *msg = msgpack(name, s.read_uint8_t()); break; case 0xCD: - *msg = msgpack(name, io_read_uint16_t_reverse_endianness(s, true)); + *msg = msgpack(name, s.read_uint16_t_reverse_endianness(true)); break; case 0xCE: - *msg = msgpack(name, io_read_uint32_t_reverse_endianness(s, true)); + *msg = msgpack(name, s.read_uint32_t_reverse_endianness(true)); break; case 0xCF: - *msg = msgpack(name, io_read_uint64_t_reverse_endianness(s, true)); + *msg = msgpack(name, s.read_uint64_t_reverse_endianness(true)); break; case 0xD0: - *msg = msgpack(name, io_read_int8_t(s)); + *msg = msgpack(name, s.read_int8_t()); break; case 0xD1: - *msg = msgpack(name, io_read_int16_t_reverse_endianness(s, true)); + *msg = msgpack(name, s.read_int16_t_reverse_endianness(true)); break; case 0xD2: - *msg = msgpack(name, io_read_int32_t_reverse_endianness(s, true)); + *msg = msgpack(name, s.read_int32_t_reverse_endianness(true)); break; case 0xD3: - *msg = msgpack(name, io_read_int64_t_reverse_endianness(s, true)); + *msg = msgpack(name, s.read_int64_t_reverse_endianness(true)); break; case 0xD4: - io_set_position(s, 2, SEEK_CUR); + s.set_position(2, SEEK_CUR); break; case 0xD5: - io_set_position(s, 3, SEEK_CUR); + s.set_position(3, SEEK_CUR); break; case 0xD6: - io_set_position(s, 5, SEEK_CUR); + s.set_position(5, SEEK_CUR); break; case 0xD7: - io_set_position(s, 9, SEEK_CUR); + s.set_position(9, SEEK_CUR); break; case 0xD8: - io_set_position(s, 17, SEEK_CUR); + s.set_position(17, SEEK_CUR); break; case 0xD9: - io_msgpack_read_string(s, name, msg, io_read_uint8_t(s)); + io_msgpack_read_string(s, name, msg, s.read_uint8_t()); break; case 0xDA: - io_msgpack_read_string(s, name, msg, io_read_uint16_t_reverse_endianness(s, true)); + io_msgpack_read_string(s, name, msg, s.read_uint16_t_reverse_endianness(true)); break; case 0xDB: - io_msgpack_read_string(s, name, msg, io_read_uint32_t_reverse_endianness(s, true)); + io_msgpack_read_string(s, name, msg, s.read_uint32_t_reverse_endianness(true)); break; case 0xDC: - io_msgpack_read_array(s, name, msg, io_read_uint16_t_reverse_endianness(s, true)); + io_msgpack_read_array(s, name, msg, s.read_uint16_t_reverse_endianness(true)); break; case 0xDD: - io_msgpack_read_array(s, name, msg, io_read_uint32_t_reverse_endianness(s, true)); + io_msgpack_read_array(s, name, msg, s.read_uint32_t_reverse_endianness(true)); break; case 0xDE: - io_msgpack_read_map(s, name, msg, io_read_uint16_t_reverse_endianness(s, true)); + io_msgpack_read_map(s, name, msg, s.read_uint16_t_reverse_endianness(true)); break; case 0xDF: - io_msgpack_read_map(s, name, msg, io_read_uint16_t_reverse_endianness(s, true)); + io_msgpack_read_map(s, name, msg, s.read_uint16_t_reverse_endianness(true)); break; } } -inline static void io_msgpack_read_string(stream* s, const char* name, msgpack* msg, size_t length) { +inline static void io_msgpack_read_string(stream& s, const char* name, msgpack* msg, size_t length) { std::string str; - io_read_string(s, &str, length); + str = s.read_string(length); *msg = msgpack(name, &str); } -inline static void io_msgpack_read_array(stream* s, const char* name, msgpack* msg, size_t length) { +inline static void io_msgpack_read_array(stream& s, const char* name, msgpack* msg, size_t length) { *msg = msgpack(name, true, length); msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); for (size_t i = 0; i < length; i++) io_msgpack_read_inner(s, 0, &ptr->data()[i]); } -inline static void io_msgpack_read_map(stream* s, const char* name, msgpack* msg, size_t length) { +inline static void io_msgpack_read_map(stream& s, const char* name, msgpack* msg, size_t length) { *msg = msgpack(name, false, length); msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); for (size_t i = 0; i < length; i++) { @@ -185,16 +185,16 @@ inline static void io_msgpack_read_map(stream* s, const char* name, msgpack* msg } } -void io_msgpack_write(stream* s, msgpack* msg) { - if (!s->io.stream || !msg) +void io_msgpack_write(stream& s, msgpack* msg) { + if (!s.io.stream || !msg) return; io_msgpack_write_inner(s, msg); } -static void io_msgpack_write_inner(stream* s, msgpack* msg) { +static void io_msgpack_write_inner(stream& s, msgpack* msg) { if (msg->name.size()) - io_msgpack_write_string(s, &msg->name); + io_msgpack_write_string(s, msg->name); switch (msg->type) { case MSGPACK_NULL: @@ -234,7 +234,7 @@ static void io_msgpack_write_inner(stream* s, msgpack* msg) { io_msgpack_write_double_t(s, *MSGPACK_SELECT_PTR(double_t, msg)); break; case MSGPACK_STRING: - io_msgpack_write_string(s, MSGPACK_SELECT_PTR(std::string, msg)); + io_msgpack_write_string(s, *MSGPACK_SELECT_PTR(std::string, msg)); break; case MSGPACK_ARRAY: { msgpack_array* ptr = MSGPACK_SELECT_PTR(msgpack_array, msg); @@ -251,166 +251,166 @@ static void io_msgpack_write_inner(stream* s, msgpack* msg) { } } -inline static void io_msgpack_write_null(stream* s) { - io_write_uint8_t(s, 0xC0); +inline static void io_msgpack_write_null(stream& s) { + s.write_uint8_t(0xC0); } -inline static void io_msgpack_write_bool(stream* s, bool val) { - io_write_uint8_t(s, val ? 0xC3 : 0xC2); +inline static void io_msgpack_write_bool(stream& s, bool val) { + s.write_uint8_t(val ? 0xC3 : 0xC2); } -inline static void io_msgpack_write_int8_t(stream* s, int8_t val) { +inline static void io_msgpack_write_int8_t(stream& s, int8_t val) { if (val < -0x20) - io_write_uint8_t(s, 0xD0); - io_write_int8_t(s, val); + s.write_uint8_t(0xD0); + s.write_int8_t(val); } -inline static void io_msgpack_write_uint8_t(stream* s, uint8_t val) { +inline static void io_msgpack_write_uint8_t(stream& s, uint8_t val) { if (val >= 0x80) - io_write_uint8_t(s, 0xCC); - io_write_uint8_t(s, val); + s.write_uint8_t(0xCC); + s.write_uint8_t(val); } -inline static void io_msgpack_write_int16_t(stream* s, int16_t val) { +inline static void io_msgpack_write_int16_t(stream& s, int16_t val) { if ((int8_t)val == val) io_msgpack_write_int8_t(s, (int8_t)val); else if ((uint8_t)val == val) io_msgpack_write_uint8_t(s, (uint8_t)val); else { - io_write_uint8_t(s, 0xD1); - io_write_int16_t_reverse_endianness(s, val, true); + s.write_uint8_t(0xD1); + s.write_int16_t_reverse_endianness(val, true); } } -inline static void io_msgpack_write_uint16_t(stream* s, uint16_t val) { +inline static void io_msgpack_write_uint16_t(stream& s, uint16_t val) { if ((uint8_t)val == val) io_msgpack_write_uint8_t(s, (uint8_t)val); else { - io_write_uint8_t(s, 0xCD); - io_write_uint16_t_reverse_endianness(s, val, true); + s.write_uint8_t(0xCD); + s.write_uint16_t_reverse_endianness(val, true); } } -inline static void io_msgpack_write_int32_t(stream* s, int32_t val) { +inline static void io_msgpack_write_int32_t(stream& s, int32_t val) { if ((int16_t)val == val) io_msgpack_write_int16_t(s, (int16_t)val); else if ((uint16_t)val == val) io_msgpack_write_uint16_t(s, (uint16_t)val); else { - io_write_uint8_t(s, 0xD2); - io_write_int32_t_reverse_endianness(s, val, true); + s.write_uint8_t(0xD2); + s.write_int32_t_reverse_endianness(val, true); } } -inline static void io_msgpack_write_uint32_t(stream* s, uint32_t val) { +inline static void io_msgpack_write_uint32_t(stream& s, uint32_t val) { if ((uint16_t)val == val) io_msgpack_write_uint16_t(s, (uint16_t)val); else { - io_write_uint8_t(s, 0xCE); - io_write_uint32_t_reverse_endianness(s, val, true); + s.write_uint8_t(0xCE); + s.write_uint32_t_reverse_endianness(val, true); } } -inline static void io_msgpack_write_int64_t(stream* s, int64_t val) { +inline static void io_msgpack_write_int64_t(stream& s, int64_t val) { if ((int32_t)val == val) io_msgpack_write_int32_t(s, (int32_t)val); else if ((uint32_t)val == val) io_msgpack_write_uint32_t(s, (uint32_t)val); else { - io_write_uint8_t(s, 0xD3); - io_write_int64_t_reverse_endianness(s, val, true); + s.write_uint8_t(0xD3); + s.write_int64_t_reverse_endianness(val, true); } } -inline static void io_msgpack_write_uint64_t(stream* s, uint64_t val) { +inline static void io_msgpack_write_uint64_t(stream& s, uint64_t val) { if ((uint32_t)val == val) io_msgpack_write_uint32_t(s, (uint32_t)val); else { - io_write_uint8_t(s, 0xCF); - io_write_uint64_t_reverse_endianness(s, val, true); + s.write_uint8_t(0xCF); + s.write_uint64_t_reverse_endianness(val, true); } } -inline static void io_msgpack_write_float_t(stream* s, float_t val) { +inline static void io_msgpack_write_float_t(stream& s, float_t val) { if (val == -0.0f) { - io_write_uint8_t(s, 0xCA); - io_write_float_t_reverse_endianness(s, -0.0f, true); + s.write_uint8_t(0xCA); + s.write_float_t_reverse_endianness(-0.0f, true); } else if ((int64_t)val == val) io_msgpack_write_int64_t(s, (int64_t)val); else { - io_write_uint8_t(s, 0xCA); - io_write_float_t_reverse_endianness(s, val, true); + s.write_uint8_t(0xCA); + s.write_float_t_reverse_endianness(val, true); } } -inline static void io_msgpack_write_double_t(stream* s, double_t val) { +inline static void io_msgpack_write_double_t(stream& s, double_t val) { if (val == -0.0) { - io_write_uint8_t(s, 0xCA); - io_write_float_t_reverse_endianness(s, -0.0f, true); + s.write_uint8_t(0xCA); + s.write_float_t_reverse_endianness(-0.0f, true); } else if ((int64_t)val == val) io_msgpack_write_int64_t(s, (int64_t)val); else if ((float_t)val == val) io_msgpack_write_float_t(s, (float_t)val); else { - io_write_uint8_t(s, 0xCB); - io_write_double_t_reverse_endianness(s, val, true); + s.write_uint8_t(0xCB); + s.write_double_t_reverse_endianness(val, true); } } -inline static void io_msgpack_write_string(stream* s, std::string* val) { - if (!val) { +inline static void io_msgpack_write_string(stream& s, std::string& val) { + if (val.size()) { io_msgpack_write_null(s); return; } - size_t len = val->size(); + size_t len = val.size(); if (len < 0x20) - io_write_uint8_t(s, 0xA0 | (len & 0x1F)); + s.write_uint8_t(0xA0 | (len & 0x1F)); else if (len < 0x100) { - io_write_uint8_t(s, 0xD9); - io_write_uint8_t(s, (uint8_t)len); + s.write_uint8_t(0xD9); + s.write_uint8_t((uint8_t)len); } else if (len < 0x10000) { - io_write_uint8_t(s, 0xDA); - io_write_uint16_t_reverse_endianness(s, (uint16_t)len, true); + s.write_uint8_t(0xDA); + s.write_uint16_t_reverse_endianness((uint16_t)len, true); } else { - io_write_uint8_t(s, 0xDB); - io_write_uint32_t_reverse_endianness(s, (uint32_t)len, true); + s.write_uint8_t(0xDB); + s.write_uint32_t_reverse_endianness((uint32_t)len, true); } - io_write(s, val->c_str(), len); + s.write(val.c_str(), len); } -inline static void io_msgpack_write_array(stream* s, size_t val) { +inline static void io_msgpack_write_array(stream& s, size_t val) { size_t len = val; if (!len) io_msgpack_write_null(s); else if (len < 0x10) - io_write_uint8_t(s, 0x90 | (len & 0x0F)); + s.write_uint8_t(0x90 | (len & 0x0F)); else if (len < 0x10000) { - io_write_uint8_t(s, 0xDC); - io_write_uint16_t_reverse_endianness(s, (uint16_t)len, true); + s.write_uint8_t(0xDC); + s.write_uint16_t_reverse_endianness((uint16_t)len, true); } else { - io_write_uint8_t(s, 0xDD); - io_write_uint32_t_reverse_endianness(s, (uint32_t)len, true); + s.write_uint8_t(0xDD); + s.write_uint32_t_reverse_endianness((uint32_t)len, true); } } -inline static void io_msgpack_write_map(stream* s, size_t val) { +inline static void io_msgpack_write_map(stream& s, size_t val) { size_t len = val; if (!len) io_msgpack_write_null(s); else if (len < 0x10) - io_write_uint8_t(s, 0x80 | (len & 0x0F)); + s.write_uint8_t(0x80 | (len & 0x0F)); else if (len < 0x10000) { - io_write_uint8_t(s, 0xDE); - io_write_uint16_t_reverse_endianness(s, (uint16_t)len, true); + s.write_uint8_t(0xDE); + s.write_uint16_t_reverse_endianness((uint16_t)len, true); } else { - io_write_uint8_t(s, 0xDF); - io_write_uint32_t_reverse_endianness(s, (uint32_t)len, true); + s.write_uint8_t(0xDF); + s.write_uint32_t_reverse_endianness((uint32_t)len, true); } } diff --git a/src/KKdLib/io/msgpack.hpp b/src/KKdLib/io/msgpack.hpp index fd4f2009..19a98b9a 100644 --- a/src/KKdLib/io/msgpack.hpp +++ b/src/KKdLib/io/msgpack.hpp @@ -5,9 +5,9 @@ #pragma once -#include "../default.h" +#include "../default.hpp" #include "../msgpack.hpp" -#include "stream.h" +#include "stream.hpp" -extern void io_msgpack_read(stream* s, msgpack* msg); -extern void io_msgpack_write(stream* s, msgpack* msg); +extern void io_msgpack_read(stream& s, msgpack* msg); +extern void io_msgpack_write(stream& s, msgpack* msg); diff --git a/src/KKdLib/io/path.c b/src/KKdLib/io/path.cpp similarity index 99% rename from src/KKdLib/io/path.c rename to src/KKdLib/io/path.cpp index 3356825a..3bacb1f1 100644 --- a/src/KKdLib/io/path.c +++ b/src/KKdLib/io/path.cpp @@ -3,8 +3,8 @@ GitHub/GitLab: korenkonder */ -#include "path.h" -#include "../str_utils.h" +#include "path.hpp" +#include "../str_utils.hpp" bool path_check_path_exists(const char* path) { wchar_t* path_temp = utf8_to_utf16(path); diff --git a/src/KKdLib/io/path.h b/src/KKdLib/io/path.hpp similarity index 97% rename from src/KKdLib/io/path.h rename to src/KKdLib/io/path.hpp index fb44a94a..4e61ccc3 100644 --- a/src/KKdLib/io/path.h +++ b/src/KKdLib/io/path.hpp @@ -7,7 +7,7 @@ #include #include -#include "../default.h" +#include "../default.hpp" extern bool path_check_path_exists(const char* path); extern bool path_check_path_exists(const wchar_t* path); diff --git a/src/KKdLib/io/stream.c b/src/KKdLib/io/stream.c deleted file mode 100644 index 46bb0059..00000000 --- a/src/KKdLib/io/stream.c +++ /dev/null @@ -1,744 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "stream.h" -#include - -void io_open(stream* s) { - memset(s, 0, sizeof(stream)); - s->type = STREAM_MEMORY; - s->length = 0; -} - -void io_open(stream* s, const char* path, const char* mode) { - memset(s, 0, sizeof(stream)); - if (!path || !mode) - return; - - wchar_t* temp_path = utf8_to_utf16(path); - wchar_t* temp_mode = utf8_to_utf16((char*)mode); - s->io.stream = _wfsopen(temp_path, temp_mode, _SH_DENYNO); - s->type = s->io.stream ? ferror(s->io.stream) ? STREAM_NONE : STREAM_FILE : STREAM_NONE; - s->position_stack = vector_old_empty(int64_t); - io_get_length(s); - free(temp_path); - free(temp_mode); -} - -void io_open(stream* s, const wchar_t* path, const wchar_t* mode) { - memset(s, 0, sizeof(stream)); - if (!path || !mode) - return; - - s->io.stream = _wfsopen(path, mode, _SH_DENYNO); - s->type = s->io.stream ? ferror(s->io.stream) ? STREAM_NONE : STREAM_FILE : STREAM_NONE; - s->position_stack = vector_old_empty(int64_t); - io_get_length(s); -} - -void io_open(stream* s, const void* data, size_t size) { - memset(s, 0, sizeof(stream)); - if (!data || !size) { - s->type = STREAM_MEMORY; - s->length = 0; - return; - } - - s->io.data.vec = vector_old_empty(uint8_t); - vector_old_uint8_t_reserve(&s->io.data.vec, size); - if (s->io.data.vec.begin && data) - memcpy(s->io.data.vec.begin, data, size); - s->io.data.data = s->io.data.vec.begin; - s->io.data.vec.end = s->io.data.vec.begin + size; - s->type = STREAM_MEMORY; - s->position_stack = vector_old_empty(int64_t); - s->length = size; -} - -void io_open(stream* s, std::vector* data) { - memset(s, 0, sizeof(stream)); - if (!data) { - s->type = STREAM_MEMORY; - s->length = 0; - return; - } - - s->io.data.vec = vector_old_empty(uint8_t); - vector_old_uint8_t_reserve(&s->io.data.vec, data->size()); - if (s->io.data.vec.begin && data->size()) - memcpy(s->io.data.vec.begin, data->data(), data->size()); - s->io.data.data = s->io.data.vec.begin; - s->io.data.vec.end = s->io.data.vec.begin + data->size(); - s->type = STREAM_MEMORY; - s->position_stack = vector_old_empty(int64_t); - s->length = data->size(); -} - -void io_copy(stream* s, void** data, size_t* size) { - if (!s || !data || !size || s->type != STREAM_MEMORY) - return; - - *size = vector_old_length(s->io.data.vec); - *data = force_malloc(*size); - memcpy(*data, s->io.data.vec.begin, *size); -} - -void io_copy(stream* s, std::vector* data) { - if (!s || !data || s->type != STREAM_MEMORY) - return; - - size_t length = vector_old_length(s->io.data.vec); - data->resize(length); - memcpy(data->data(), s->io.data.vec.begin, length); -} - -void io_align_read(stream* s, int64_t align) { - int64_t position; - switch (s->type) { - case STREAM_FILE: - position = _ftelli64(s->io.stream); - break; - case STREAM_MEMORY: - position = s->io.data.data - s->io.data.vec.begin; - break; - default: - return; - } - - int64_t capacity; - int64_t temp_align = align - position % align; - if (align != temp_align) - switch (s->type) { - case STREAM_FILE: - _fseeki64(s->io.stream, position + temp_align, 0); - break; - case STREAM_MEMORY: - capacity = s->io.data.vec.end - s->io.data.data; - if (capacity < temp_align) { - vector_old_uint8_t_reserve(&s->io.data.vec, temp_align); - memset(s->io.data.vec.begin + position, 0, temp_align); - } - s->io.data.data = s->io.data.vec.begin + position + temp_align; - if (s->io.data.vec.end < s->io.data.data) - s->io.data.vec.end = s->io.data.data; - break; - } -} - -void io_align_write(stream* s, int64_t align) { - int64_t position; - switch (s->type) { - case STREAM_FILE: - position = _ftelli64(s->io.stream); - break; - case STREAM_MEMORY: - position = s->io.data.data - s->io.data.vec.begin; - break; - default: - return; - } - - int64_t capacity; - int64_t temp_align = align - position % align; - if (align != temp_align) - switch (s->type) { - case STREAM_FILE: { - memset(s->buf, 0, min(sizeof(s->buf), temp_align)); - int64_t i = temp_align; - while (i >= sizeof(s->buf)) { - fwrite(s->buf, 1, sizeof(s->buf), s->io.stream); - i -= sizeof(s->buf); - } - - if (i > 0) - fwrite(s->buf, 1, i, s->io.stream); - } break; - case STREAM_MEMORY: - capacity = s->io.data.vec.end - s->io.data.data; - if (capacity < temp_align) { - vector_old_uint8_t_reserve(&s->io.data.vec, temp_align); - memset(s->io.data.vec.begin + position, 0, temp_align); - } - s->io.data.data = s->io.data.vec.begin + position + temp_align; - if (s->io.data.vec.end < s->io.data.data) - s->io.data.vec.end = s->io.data.data; - break; - } -} - -int io_flush(stream* s) { - switch (s->type) { - case STREAM_FILE: - return fflush(s->io.stream); - case STREAM_MEMORY: - return 0; - default: - return 0; - } -} - -inline int64_t io_get_length(stream* s) { - switch (s->type) { - case STREAM_FILE: - if (s->io.stream) { - size_t temp = _ftelli64(s->io.stream); - _fseeki64(s->io.stream, 0, SEEK_END); - s->length = _ftelli64(s->io.stream); - _fseeki64(s->io.stream, temp, SEEK_SET); - } - else - s->length = 0; - break; - case STREAM_MEMORY: - s->length = vector_old_length(s->io.data.vec); - break; - default: - s->length = 0; - break; - } - return s->length; -} - -inline int64_t io_get_position(stream* s) { - switch (s->type) { - case STREAM_FILE: - return _ftelli64(s->io.stream); - case STREAM_MEMORY: - return s->io.data.data - s->io.data.vec.begin; - default: - return EOF; - } -} - -int32_t io_set_position(stream* s, int64_t pos, int32_t seek) { - int64_t capacity; - switch (s->type) { - case STREAM_FILE: - return _fseeki64(s->io.stream, pos, seek); - case STREAM_MEMORY: - switch (seek) { - case SEEK_SET: - if (pos < 0) - return EOF; - - capacity = vector_old_capacity(s->io.data.vec); - if (capacity < pos) - vector_old_uint8_t_reserve(&s->io.data.vec, pos - capacity); - - s->io.data.data = s->io.data.vec.begin + pos; - if (s->io.data.data > s->io.data.vec.end) { - capacity = s->io.data.data - s->io.data.vec.end; - memset(s->io.data.vec.end, 0, capacity); - s->io.data.vec.end += capacity; - } - return 0; - case SEEK_CUR: - if (pos > 0) { - capacity = s->io.data.vec.capacity_end - s->io.data.data; - if (capacity < pos) { - vector_old_uint8_t_reserve(&s->io.data.vec, pos - capacity); - s->io.data.vec.end = s->io.data.vec.capacity_end; - s->io.data.data = s->io.data.vec.capacity_end; - } - else - s->io.data.data += pos; - } - else if (pos < 0) { - capacity = s->io.data.data - s->io.data.vec.begin; - if (capacity < -pos) - return EOF; - else - s->io.data.data += pos; - } - return 0; - case SEEK_END: - if (pos < 0) - return EOF; - - capacity = vector_old_length(s->io.data.vec); - if (capacity < pos) - return EOF; - - s->io.data.data = s->io.data.vec.end - pos; - return 0; - } - return EOF; - default: - return EOF; - } -} - -inline int32_t io_position_push(stream* s, int64_t pos, int32_t seek) { - *vector_old_int64_t_reserve_back(&s->position_stack) = io_get_position(s); - return io_set_position(s, pos, seek); -} - -inline void io_position_pop(stream* s) { - if (vector_old_length(s->position_stack) < 1) - return; - - int64_t position = s->position_stack.end[-1]; - vector_old_int64_t_pop_back(&s->position_stack, 0); - io_set_position(s, position, SEEK_SET); - io_flush(s); -} - -inline int64_t io_read(stream* s, int64_t count) { - return io_read(s, (void*)0, count); -} - -int64_t io_read(stream* s, void* buf, int64_t count) { - int64_t capacity; - switch (s->type) { - case STREAM_FILE: - if (!buf) { - int64_t act_count = 0; - while (count > 0) { - act_count += fread(s->buf, 1, min(count, sizeof(s->buf)), s->io.stream); - count -= sizeof(s->buf); - } - return act_count; - } - else - return fread(buf, 1, count, s->io.stream); - case STREAM_MEMORY: - if (s->io.data.data >= s->io.data.vec.end) - return EOF; - - capacity = s->io.data.vec.end - s->io.data.data; - if (capacity >= count) - capacity = count; - if (buf) - memcpy(buf, s->io.data.data, capacity); - s->io.data.data += capacity; - return capacity; - default: - return EOF; - } -} - -inline int64_t io_write(stream* s, int64_t count) { - return io_write(s, (void*)0, count); -} - -int64_t io_write(stream* s, void* buf, int64_t count) { - int64_t capacity; - switch (s->type) { - case STREAM_FILE: - if (!buf) { - memset(s->buf, 0, sizeof(s->buf)); - int64_t act_count = 0; - while (count > 0) { - act_count += fwrite(s->buf, 1, min(count, sizeof(s->buf)), s->io.stream); - count -= sizeof(s->buf); - } - return act_count; - } - else - return fwrite(buf, 1, count, s->io.stream); - case STREAM_MEMORY: - capacity = s->io.data.vec.capacity_end - s->io.data.data; - if (capacity < count) { - int64_t pos = s->io.data.data - s->io.data.vec.begin; - vector_old_uint8_t_reserve(&s->io.data.vec, count + capacity); - s->io.data.data = s->io.data.vec.begin + pos; - } - if (buf) - memcpy(s->io.data.data, buf, count); - else - memset(s->io.data.data, 0, count); - s->io.data.data += count; - if (s->io.data.vec.end < s->io.data.data) - s->io.data.vec.end = s->io.data.data; - return count; - default: - return EOF; - } -} - -inline int64_t io_write(stream* s, const void* buf, int64_t count) { - return io_write(s, (void*)buf, count); -} - -int32_t io_read_char(stream* s) { - switch (s->type) { - case STREAM_FILE: - return fgetc(s->io.stream); - case STREAM_MEMORY: - if (s->io.data.data >= s->io.data.vec.end) - return EOF; - return *s->io.data.data++; - default: - return EOF; - } -} - -int32_t io_write_char(stream* s, char c) { - int64_t capacity; - switch (s->type) { - case STREAM_FILE: - return fputc(c, s->io.stream); - case STREAM_MEMORY: - capacity = s->io.data.vec.capacity_end - s->io.data.data; - if (capacity < 1) { - int64_t pos = s->io.data.data - s->io.data.vec.begin; - vector_old_uint8_t_reserve(&s->io.data.vec, 1 - capacity); - s->io.data.data = s->io.data.vec.begin + pos; - } - *s->io.data.data++ = c; - if (s->io.data.vec.end < s->io.data.data) - s->io.data.vec.end = s->io.data.data; - return 0; - default: - return EOF; - } -} - -inline int8_t io_read_int8_t(stream* s) { - int32_t c = io_read_char(s); - if (c != EOF) - return (int8_t)c; - return 0; -} - -inline uint8_t io_read_uint8_t(stream* s) { - int32_t c = io_read_char(s); - if (c != EOF) - return (uint8_t)c; - return 0; -} - -inline void io_write_int8_t(stream* s, int8_t val) { - io_write_char(s, (char)val); -} - -inline void io_write_uint8_t(stream* s, uint8_t val) { - io_write_char(s, (char)val); -} - -inline void io_read_string(stream* s, string* str, size_t length) { - string_init_length(str, length); - char* temp = string_data(str); - io_read(s, temp, length); - temp[length] = 0; -} - -inline void io_read_string(stream* s, std::string* str, size_t length) { - char* temp = force_malloc_s(char, length + 1); - io_read(s, temp, length); - temp[length] = 0; - *str = std::string(temp, length); - free(temp); -} - -inline void io_read_wstring(stream* s, wstring* str, size_t length) { - wstring_init_length(str, length); - wchar_t* temp = wstring_data(str); - io_read(s, temp, sizeof(wchar_t) * length); - temp[length] = 0; -} - -inline void io_read_wstring(stream* s, std::wstring* str, size_t length) { - wchar_t* temp = force_malloc_s(wchar_t, length + 1); - io_read(s, temp, sizeof(wchar_t) * length); - temp[length] = 0; - *str = std::wstring(temp, length); - free(temp); -} - -inline void io_read_string_null_terminated(stream* s, string* str) { - int64_t offset = io_get_position(s); - int64_t length = 0; - char* temp = io_read_utf8_string_null_terminated_offset_length(s, offset, &length); - string_init_length(str, temp, length); - free(temp); -} - -inline void io_read_string_null_terminated(stream* s, std::string* str) { - int64_t offset = io_get_position(s); - int64_t length = 0; - char* temp = io_read_utf8_string_null_terminated_offset_length(s, offset, &length); - *str = std::string(temp, length); - free(temp); -} - -inline void io_read_wstring_null_terminated(stream* s, wstring* str) { - int64_t offset = io_get_position(s); - int64_t length = 0; - wchar_t* temp = io_read_utf16_string_null_terminated_offset_length(s, offset, &length); - wstring_init_length(str, temp, length); - free(temp); -} - -inline void io_read_wstring_null_terminated(stream* s, std::wstring* str) { - int64_t offset = io_get_position(s); - int64_t length = 0; - wchar_t* temp = io_read_utf16_string_null_terminated_offset_length(s, offset, &length); - *str = std::wstring(temp, length); - free(temp); -} - -inline void io_read_string_null_terminated_offset(stream* s, - int64_t offset, string* str) { - if (offset) { - int64_t length = 0; - char* temp = io_read_utf8_string_null_terminated_offset_length(s, offset, &length); - string_init_length(str, temp, length); - free(temp); - } - else - *str = string_empty; -} - -inline void io_read_string_null_terminated_offset(stream* s, - int64_t offset, std::string* str) { - if (offset) { - int64_t length = 0; - char* temp = io_read_utf8_string_null_terminated_offset_length(s, offset, &length); - *str = std::string(temp, length); - free(temp); - } - else - *str = {}; -} - -inline void io_read_wstring_null_terminated_offset(stream* s, - int64_t offset, wstring* str) { - if (offset) { - int64_t length = 0; - wchar_t* temp = io_read_utf16_string_null_terminated_offset_length(s, offset, &length); - wstring_init_length(str, temp, length); - free(temp); - } - else - *str = wstring_empty; -} - -inline void io_read_wstring_null_terminated_offset(stream* s, - int64_t offset, std::wstring* str) { - if (offset) { - int64_t length = 0; - wchar_t* temp = io_read_utf16_string_null_terminated_offset_length(s, offset, &length); - *str = std::wstring(temp, length); - free(temp); - } - else - *str = std::wstring(); -} - -inline char* io_read_utf8_string_null_terminated(stream* s) { - int64_t offset = io_get_position(s); - int64_t length = 0; - return io_read_utf8_string_null_terminated_offset_length(s, offset, &length); -} - -inline wchar_t* io_read_utf16_string_null_terminated(stream* s) { - int64_t offset = io_get_position(s); - int64_t length = 0; - return io_read_utf16_string_null_terminated_offset_length(s, offset, &length); -} - -inline char* io_read_utf8_string_null_terminated_length(stream* s, int64_t* length) { - int64_t offset = io_get_position(s); - return io_read_utf8_string_null_terminated_offset_length(s, offset, length); -} - -inline wchar_t* io_read_utf16_string_null_terminated_length(stream* s, int64_t* length) { - int64_t offset = io_get_position(s); - return io_read_utf16_string_null_terminated_offset_length(s, offset, length); -} - -inline char* io_read_utf8_string_null_terminated_offset(stream* s, int64_t offset) { - int64_t length = 0; - return io_read_utf8_string_null_terminated_offset_length(s, offset, &length); -} - -inline wchar_t* io_read_utf16_string_null_terminated_offset(stream* s, int64_t offset) { - int64_t length = 0; - return io_read_utf16_string_null_terminated_offset_length(s, offset, &length); -} - -char* io_read_utf8_string_null_terminated_offset_length(stream* s, int64_t offset, int64_t* length) { - io_position_push(s, offset, SEEK_SET); - - size_t name_length = 0; - int32_t c; - while ((c = io_read_char(s)) != EOF && c != 0) - name_length++; - - if (name_length == 0) { - io_position_pop(s); - *length = 0; - return 0; - } - - char* str = force_malloc_s(char, name_length + 1); - io_set_position(s, offset, SEEK_SET); - io_read(s, str, name_length); - str[name_length] = 0; - - io_position_pop(s); - *length = name_length; - return str; -} - -wchar_t* io_read_utf16_string_null_terminated_offset_length(stream* s, int64_t offset, int64_t* length) { - io_position_push(s, offset, SEEK_SET); - - size_t name_length = 0; - int32_t c0, c1; - while ((c0 = io_read_char(s)) != EOF - && (c1 = io_read_char(s)) != EOF - && (((c0 & 0xFF) | ((c1 & 0xFF) << 8)) != 0)) - name_length++; - - if (name_length == 0) { - io_position_pop(s); - *length = 0; - return 0; - } - - wchar_t* str = force_malloc_s(wchar_t, name_length + 1); - io_set_position(s, offset, SEEK_SET); - io_read(s, str, sizeof(wchar_t) * name_length); - str[name_length] = 0; - - io_position_pop(s); - *length = name_length; - return str; -} - -inline void io_write_string(stream* s, string* str) { - io_write(s, string_data(str), str->length); -} - -inline void io_write_string(stream* s, std::string* str) { - io_write(s, str->c_str(), str->size()); -} - -inline void io_write_wstring(stream* s, wstring* str) { - io_write(s, wstring_data(str), sizeof(wchar_t) * str->length); -} - -inline void io_write_wstring(stream* s, std::wstring* str) { - io_write(s, str->c_str(), sizeof(wchar_t) * str->size()); -} - -inline void io_write_string_null_terminated(stream* s, string* str) { - io_write(s, string_data(str), str->length); - io_write_uint8_t(s, 0); -} - -inline void io_write_string_null_terminated(stream* s, std::string* str) { - io_write(s, str->c_str(), str->size()); - io_write_uint8_t(s, 0); -} - -inline void io_write_wstring_null_terminated(stream* s, wstring* str) { - io_write(s, wstring_data(str), sizeof(wchar_t) * str->length); - io_write_uint16_t(s, 0); -} - -inline void io_write_wstring_null_terminated(stream* s, std::wstring* str) { - io_write(s, str->c_str(), sizeof(wchar_t) * str->size()); - io_write_uint16_t(s, 0); -} - -inline void io_write_utf8_string(stream* s, const char* str) { - io_write(s, str, utf8_length(str)); -} - -inline void io_write_utf16_string(stream* s, const wchar_t* str) { - io_write(s, str, sizeof(wchar_t) * utf16_length(str)); -} - -inline void io_write_utf8_string_null_terminated(stream* s, const char* str) { - io_write(s, str, utf8_length(str)); - io_write_uint8_t(s, 0); -} - -inline void io_write_utf16_string_null_terminated(stream* s, const wchar_t* str) { - io_write(s, str, sizeof(wchar_t) * utf16_length(str)); - io_write_uint16_t(s, 0); -} - -inline int64_t io_read_offset(stream* s, int32_t offset, bool is_x) { - int64_t val; - if (!is_x) { - val = io_read_int32_t_stream_reverse_endianness(s); - if (val) - val -= offset; - } - else { - io_align_read(s, 0x08); - val = io_read_int64_t_stream_reverse_endianness(s); - } - return val; -} - -inline int64_t io_read_offset_f2(stream* s, int32_t offset) { - int64_t val = io_read_int32_t_stream_reverse_endianness(s); - if (val) - val -= offset; - return val; -} - -inline int64_t io_read_offset_x(stream* s) { - io_align_read(s, 0x08); - int64_t val = io_read_int64_t_stream_reverse_endianness(s); - return val; -} - -inline void io_write_offset(stream* s, int64_t val, int32_t offset, bool is_x) { - if (!is_x) { - if (val) - val += offset; - io_write_int32_t_stream_reverse_endianness(s, (int32_t)val); - } - else { - io_align_write(s, 0x08); - io_write_int64_t_stream_reverse_endianness(s, val); - } -} - -inline void io_write_offset_f2(stream* s, int64_t val, int32_t offset) { - if (val) - val += offset; - io_write_int32_t_stream_reverse_endianness(s, (int32_t)val); -} - -inline void io_write_offset_x(stream* s, int64_t val) { - io_align_write(s, 0x08); - io_write_int64_t_stream_reverse_endianness(s, val); -} - -void io_free(stream* s) { - if (!s) - return; - - switch (s->type) { - case STREAM_FILE: - if (s->io.stream) { - fflush(s->io.stream); - fclose(s->io.stream); - } - break; - case STREAM_MEMORY: - vector_old_uint8_t_free(&s->io.data.vec, 0); - break; - } - vector_old_int64_t_free(&s->position_stack, 0); - memset(s, 0, sizeof(stream)); -} - -io_read_write_func(int16_t) -io_read_write_func(uint16_t) -io_read_write_func(int32_t) -io_read_write_func(uint32_t) -io_read_write_func(int64_t) -io_read_write_func(uint64_t) -io_read_write_func(float_t) -io_read_write_func(double_t) -io_read_write_func(half_t) diff --git a/src/KKdLib/io/stream.cpp b/src/KKdLib/io/stream.cpp new file mode 100644 index 00000000..c7234716 --- /dev/null +++ b/src/KKdLib/io/stream.cpp @@ -0,0 +1,1107 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "stream.hpp" +#include + + +stream::io::io() : stream(), data() { + +} + +stream::io::~io() { + +} + +bool stream::io::check_null() { + return !stream && !data.vec.size(); +} + +bool stream::io::check_not_null() { + return stream || data.vec.size(); +} + +void stream::io::close() { + if (stream) { + fflush(stream); + fclose(stream); + stream = 0; + } + + data.vec.clear(); + data.vec.shrink_to_fit(); + data.data = data.vec.begin(); +} + +stream::stream() : buf(), length(), type(), is_big_endian() { + +} + +stream::~stream() { + close(); +} + +void stream::open() { + close(); + + type = STREAM_MEMORY; + length = 0; +} + +void stream::open(const char* path, const char* mode) { + close(); + + if (!path || !mode) + return; + + wchar_t* temp_path = utf8_to_utf16(path); + wchar_t* temp_mode = utf8_to_utf16((char*)mode); + io.stream = _wfsopen(temp_path, temp_mode, _SH_DENYNO); + type = io.stream && !ferror(io.stream) ? STREAM_FILE : STREAM_NONE; + get_length(); + free(temp_path); + free(temp_mode); +} + +void stream::open(const wchar_t* path, const wchar_t* mode) { + close(); + + if (!path || !mode) + return; + + io.stream = _wfsopen(path, mode, _SH_DENYNO); + type = io.stream && !ferror(io.stream) ? STREAM_FILE : STREAM_NONE; + get_length(); +} + +void stream::open(const void* data, size_t size) { + close(); + + if (!data || !size) { + type = STREAM_MEMORY; + length = 0; + return; + } + + io.data.vec = {}; + io.data.vec.resize(size); + if (io.data.vec.data() && data) + memcpy(io.data.vec.data(), data, size); + io.data.data = io.data.vec.begin(); + type = STREAM_MEMORY; + length = size; +} + +void stream::open(std::vector& data) { + close(); + + if (!data.size()) { + type = STREAM_MEMORY; + length = 0; + return; + } + + io.data.vec = data; + io.data.data = io.data.vec.begin(); + type = STREAM_MEMORY; + length = data.size(); +} + +void stream::copy(void** data, size_t* size) { + if (!this || !data || !size || type != STREAM_MEMORY) + return; + + *size = io.data.vec.size(); + *data = force_malloc(*size); + memcpy(*data, io.data.vec.data(), *size); +} + +void stream::copy(std::vector& data) { + if (!this || type != STREAM_MEMORY) + return; + + size_t length = io.data.vec.size(); + data.resize(length); + memcpy(data.data(), io.data.vec.data(), length); +} + +int stream::flush() { + switch (type) { + case STREAM_FILE: + return fflush(io.stream); + case STREAM_MEMORY: + return 0; + default: + return 0; + } +} + +void stream::close() { + if (!this) + return; + + memset(buf, 0, sizeof(buf)); + io.close(); + length = 0; + type = STREAM_NONE; + is_big_endian = false; + position_stack.clear(); + position_stack.shrink_to_fit(); +} + +int64_t stream::get_length() { + switch (type) { + case STREAM_FILE: + if (io.stream) { + size_t temp = _ftelli64(io.stream); + _fseeki64(io.stream, 0, SEEK_END); + length = _ftelli64(io.stream); + _fseeki64(io.stream, temp, SEEK_SET); + } + else + length = 0; + break; + case STREAM_MEMORY: + length = io.data.vec.size(); + break; + default: + length = 0; + break; + } + return length; +} + +int64_t stream::get_position() { + switch (type) { + case STREAM_FILE: + return _ftelli64(io.stream); + case STREAM_MEMORY: + return io.data.data - io.data.vec.begin(); + default: + return EOF; + } +} + +int32_t stream::set_position(int64_t pos, int32_t seek) { + switch (type) { + case STREAM_FILE: + return _fseeki64(io.stream, pos, seek); + case STREAM_MEMORY: + switch (seek) { + case SEEK_SET: { + if (pos < 0) + return EOF; + + if (io.data.vec.size() < (size_t)pos) { + size_t size = io.data.vec.size(); + io.data.vec.resize(pos); + memset(io.data.vec.data() + size, 0, pos - size); + } + io.data.data = io.data.vec.begin() + pos; + } return 0; + case SEEK_CUR: { + if (pos > 0) { + size_t _pos = io.data.data - io.data.vec.begin(); + if (io.data.vec.size() < (size_t)(_pos + pos)) { + size_t size = io.data.vec.size(); + io.data.vec.resize(_pos + pos); + memset(io.data.vec.data() + size, 0, _pos + pos - size); + io.data.data = io.data.vec.begin() + _pos; + } + io.data.data += pos; + } + else if (pos < 0) { + if (io.data.data - io.data.vec.begin() < -pos) + return EOF; + else + io.data.data += pos; + } + } return 0; + case SEEK_END: { + if (pos < 0) + break; + + if (io.data.vec.size() < (size_t)pos) + break; + + io.data.data = io.data.vec.end() - pos; + } return 0; + } + } + return EOF; +} + +int32_t stream::position_push(int64_t pos, int32_t seek) { + position_stack.push_back(get_position()); + return set_position(pos, seek); +} + +void stream::position_pop() { + if (position_stack.size() < 1) + return; + + int64_t position = position_stack.back(); + position_stack.pop_back(); + set_position(position, SEEK_SET); + flush(); +} + +void stream::align_read(int64_t align) { + int64_t position; + switch (type) { + case STREAM_FILE: + position = _ftelli64(io.stream); + break; + case STREAM_MEMORY: + position = io.data.data - io.data.vec.begin(); + break; + default: + return; + } + + size_t temp_align = align - position % align; + if (align != temp_align) + switch (type) { + case STREAM_FILE: + _fseeki64(io.stream, position + temp_align, 0); + break; + case STREAM_MEMORY: { + size_t pos = io.data.data - io.data.vec.begin(); + if (io.data.vec.size() < (size_t)(pos + temp_align)) { + size_t size = io.data.vec.size(); + io.data.vec.resize(pos + temp_align); + io.data.data = io.data.vec.begin() + pos; + memset(io.data.data._Ptr, 0, temp_align); + } + io.data.data += temp_align; + } break; + } +} + +void stream::align_write(int64_t align) { + int64_t position; + switch (type) { + case STREAM_FILE: + position = _ftelli64(io.stream); + break; + case STREAM_MEMORY: + position = io.data.data - io.data.vec.begin(); + break; + default: + return; + } + + size_t temp_align = align - position % align; + if (align != temp_align) + switch (type) { + case STREAM_FILE: { + memset(buf, 0, min(sizeof(buf), temp_align)); + size_t i = temp_align; + while (i >= sizeof(buf)) { + fwrite(buf, 1, sizeof(buf), io.stream); + i -= sizeof(buf); + } + + if (i > 0) + fwrite(buf, 1, i, io.stream); + } break; + case STREAM_MEMORY: { + size_t pos = io.data.data - io.data.vec.begin(); + if (io.data.vec.size() < (size_t)(pos + temp_align)) { + size_t size = io.data.vec.size(); + io.data.vec.resize(pos + temp_align); + io.data.data = io.data.vec.begin() + pos; + memset(io.data.data._Ptr, 0, temp_align); + } + io.data.data += temp_align; + } break; + } +} + +int64_t stream::read(int64_t count) { + return read((void*)0, count); +} + +int64_t stream::read(void* buf, int64_t count) { + switch (type) { + case STREAM_FILE: + if (!buf) { + int64_t act_count = 0; + while (count > 0) { + act_count += fread(this->buf, 1, min(count, sizeof(this->buf)), io.stream); + count -= sizeof(this->buf); + } + return act_count; + } + else + return fread(buf, 1, count, io.stream); + case STREAM_MEMORY: { + if (io.data.data >= io.data.vec.end()) + return EOF; + + size_t _count = io.data.vec.end() - io.data.data; + if (_count >= (size_t)count) + _count = count; + if (buf) + memcpy(buf, io.data.data._Ptr, _count); + io.data.data += _count; + return _count; + } + default: + return EOF; + } +} + +int64_t stream::write(int64_t count) { + return write(0, count); +} + +int64_t stream::write(const void* buf, int64_t count) { + switch (type) { + case STREAM_FILE: + if (!buf) { + memset(this->buf, 0, sizeof(this->buf)); + int64_t act_count = 0; + while (count > 0) { + act_count += fwrite(this->buf, 1, min(count, sizeof(this->buf)), io.stream); + count -= sizeof(this->buf); + } + return act_count; + } + else + return fwrite(buf, 1, count, io.stream); + case STREAM_MEMORY: { + size_t pos = io.data.data - io.data.vec.begin(); + if (io.data.vec.size() < (size_t)(pos + count)) { + size_t size = io.data.vec.size(); + io.data.vec.resize(pos + count); + io.data.data = io.data.vec.begin() + pos; + } + if (buf) + memcpy(io.data.data._Ptr, buf, count); + else + memset(io.data.data._Ptr, 0, count); + io.data.data += count; + return count; + } + default: + return EOF; + } +} + +int32_t stream::read_char() { + switch (type) { + case STREAM_FILE: + return fgetc(io.stream); + case STREAM_MEMORY: + if (io.data.data >= io.data.vec.end()) + return EOF; + return *(io.data.data++)._Ptr; + default: + return EOF; + } +} + +int32_t stream::write_char(char c) { + switch (type) { + case STREAM_FILE: + return fputc(c, io.stream); + case STREAM_MEMORY: { + size_t pos = io.data.data - io.data.vec.begin(); + if (io.data.vec.size() < (size_t)(pos + 1)) { + size_t size = io.data.vec.size(); + io.data.vec.resize(pos + 1); + io.data.data = io.data.vec.begin() + pos; + } + *(io.data.data++)._Ptr = c; + return 0; + } + default: + return EOF; + } +} + +int8_t stream::read_int8_t() { + int32_t c = read_char(); + if (c != EOF) + return (int8_t)c; + return 0; +} + +uint8_t stream::read_uint8_t() { + int32_t c = read_char(); + if (c != EOF) + return (uint8_t)c; + return 0; +} + +void stream::write_int8_t(int8_t val) { + stream::write_char((char)val); +} + +void stream::write_uint8_t(uint8_t val) { + stream::write_char((char)val); +} + +std::string stream::read_string(size_t length) { + char* temp = force_malloc_s(char, length + 1); + read(temp, length); + temp[length] = 0; + std::string str = std::string(temp, length); + free(temp); + return str; +} + +std::wstring stream::read_wstring(size_t length) { + wchar_t* temp = force_malloc_s(wchar_t, length + 1); + read(temp, sizeof(wchar_t) * length); + temp[length] = 0; + std::wstring str = std::wstring(temp, length); + free(temp); + return str; +} + +std::string stream::read_string_null_terminated() { + int64_t offset = get_position(); + int64_t length = 0; + char* temp = read_utf8_string_null_terminated_offset_length(offset, &length); + std::string str = std::string(temp, length); + free(temp); + return str; +} + +std::wstring stream::read_wstring_null_terminated() { + int64_t offset = get_position(); + int64_t length = 0; + wchar_t* temp = read_utf16_string_null_terminated_offset_length(offset, &length); + std::wstring str = std::wstring(temp, length); + free(temp); + return str; +} + +std::string stream::read_string_null_terminated_offset(int64_t offset) { + if (offset) { + int64_t length = 0; + char* temp = read_utf8_string_null_terminated_offset_length(offset, &length); + std::string str = std::string(temp, length); + free(temp); + return str; + } + else { + std::string str = {}; + return str; + } +} + +std::wstring stream::read_wstring_null_terminated_offset(int64_t offset) { + if (offset) { + int64_t length = 0; + wchar_t* temp = read_utf16_string_null_terminated_offset_length(offset, &length); + std::wstring str = std::wstring(temp, length); + free(temp); + return str; + } + else { + std::wstring str = {}; + return str; + } +} + +char* stream::read_utf8_string_null_terminated() { + int64_t offset = get_position(); + int64_t length = 0; + return read_utf8_string_null_terminated_offset_length(offset, &length); +} + +wchar_t* stream::read_utf16_string_null_terminated() { + int64_t offset = get_position(); + int64_t length = 0; + return read_utf16_string_null_terminated_offset_length( offset, &length); +} + +char* stream::read_utf8_string_null_terminated_length(int64_t* length) { + int64_t offset = get_position(); + return read_utf8_string_null_terminated_offset_length(offset, length); +} + +wchar_t* stream::read_utf16_string_null_terminated_length(int64_t* length) { + int64_t offset = get_position(); + return read_utf16_string_null_terminated_offset_length(offset, length); +} + +char* stream::read_utf8_string_null_terminated_offset(int64_t offset) { + int64_t length = 0; + return read_utf8_string_null_terminated_offset_length(offset, &length); +} + +wchar_t* stream::read_utf16_string_null_terminated_offset(int64_t offset) { + int64_t length = 0; + return read_utf16_string_null_terminated_offset_length(offset, &length); +} + +char* stream::read_utf8_string_null_terminated_offset_length(int64_t offset, int64_t* length) { + position_push(offset, SEEK_SET); + + size_t name_length = 0; + int32_t c; + while ((c = read_char()) != EOF && c != 0) + name_length++; + + if (name_length == 0) { + position_pop(); + *length = 0; + return 0; + } + + char* str = force_malloc_s(char, name_length + 1); + set_position(offset, SEEK_SET); + read(str, name_length); + str[name_length] = 0; + + position_pop(); + *length = name_length; + return str; +} + +wchar_t* stream::read_utf16_string_null_terminated_offset_length(int64_t offset, int64_t* length) { + position_push(offset, SEEK_SET); + + size_t name_length = 0; + int32_t c0, c1; + while ((c0 = read_char()) != EOF && (c1 = read_char()) != EOF + && (((c0 & 0xFF) | ((c1 & 0xFF) << 8)) != 0)) + name_length++; + + if (name_length == 0) { + position_pop(); + *length = 0; + return 0; + } + + wchar_t* str = force_malloc_s(wchar_t, name_length + 1); + set_position(offset, SEEK_SET); + read(str, sizeof(wchar_t) * name_length); + str[name_length] = 0; + + position_pop(); + *length = name_length; + return str; +} + +int16_t stream::read_int16_t() { + read(buf, sizeof(int16_t)); + return *(int16_t*)buf; +} + +int16_t stream::read_int16_t_reverse_endianness() { + read(buf, sizeof(int16_t)); + int16_t val; + if (is_big_endian) + val = load_reverse_endianness_int16_t(buf); + else + val = *(int16_t*)buf; + return val; +} + +int16_t stream::read_int16_t_reverse_endianness(bool big_endian) { + read(buf, sizeof(int16_t)); + int16_t val; + if (big_endian) + val = load_reverse_endianness_int16_t(buf); + else + val = *(int16_t*)buf; + return val; +} + +void stream::write_int16_t(int16_t val) { + *(int16_t*)buf = val; + write(buf, sizeof(int16_t)); +} + +void stream::write_int16_t_reverse_endianness(int16_t val) { + if (is_big_endian) + store_reverse_endianness_int16_t(val, buf); + else + *(int16_t*)buf = val; + write(buf, sizeof(int16_t)); +} + +void stream::write_int16_t_reverse_endianness(int16_t val, bool big_endian) { + if (big_endian) + store_reverse_endianness_int16_t(val, buf); + else + *(int16_t*)buf = val; + write(buf, sizeof(int16_t)); +} + +uint16_t stream::read_uint16_t() { + read(buf, sizeof(uint16_t)); + return *(uint16_t*)buf; +} + +uint16_t stream::read_uint16_t_reverse_endianness() { + read(buf, sizeof(uint16_t)); + uint16_t val; + if (is_big_endian) + val = load_reverse_endianness_uint16_t(buf); + else + val = *(uint16_t*)buf; + return val; +} + +uint16_t stream::read_uint16_t_reverse_endianness(bool big_endian) { + read(buf, sizeof(uint16_t)); + uint16_t val; + if (big_endian) + val = load_reverse_endianness_uint16_t(buf); + else + val = *(uint16_t*)buf; + return val; +} + +void stream::write_uint16_t(uint16_t val) { + *(uint16_t*)buf = val; + write(buf, sizeof(uint16_t)); +} + +void stream::write_uint16_t_reverse_endianness(uint16_t val) { + if (is_big_endian) + store_reverse_endianness_uint16_t(val, buf); + else + *(uint16_t*)buf = val; + write(buf, sizeof(uint16_t)); +} + +void stream::write_uint16_t_reverse_endianness(uint16_t val, bool big_endian) { + if (big_endian) + store_reverse_endianness_uint16_t(val, buf); + else + *(uint16_t*)buf = val; + write(buf, sizeof(uint16_t)); +} + +int32_t stream::read_int32_t() { + read(buf, sizeof(int32_t)); + return *(int32_t*)buf; +} + +int32_t stream::read_int32_t_reverse_endianness() { + read(buf, sizeof(int32_t)); + int32_t val; + if (is_big_endian) + val = load_reverse_endianness_int32_t(buf); + else + val = *(int32_t*)buf; + return val; +} + +int32_t stream::read_int32_t_reverse_endianness(bool big_endian) { + read(buf, sizeof(int32_t)); + int32_t val; + if (big_endian) + val = load_reverse_endianness_int32_t(buf); + else + val = *(int32_t*)buf; + return val; +} + +void stream::write_int32_t(int32_t val) { + *(int32_t*)buf = val; + write(buf, sizeof(int32_t)); +} + +void stream::write_int32_t_reverse_endianness(int32_t val) { + if (is_big_endian) + store_reverse_endianness_int32_t(val, buf); + else + *(int32_t*)buf = val; + write(buf, sizeof(int32_t)); +} + +void stream::write_int32_t_reverse_endianness(int32_t val, bool big_endian) { + if (big_endian) + store_reverse_endianness_int32_t(val, buf); + else + *(int32_t*)buf = val; + write(buf, sizeof(int32_t)); +} + +uint32_t stream::read_uint32_t() { + read(buf, sizeof(uint32_t)); + return *(uint32_t*)buf; +} + +uint32_t stream::read_uint32_t_reverse_endianness() { + read(buf, sizeof(uint32_t)); + uint32_t val; + if (is_big_endian) + val = load_reverse_endianness_uint32_t(buf); + else + val = *(uint32_t*)buf; + return val; +} + +uint32_t stream::read_uint32_t_reverse_endianness(bool big_endian) { + read(buf, sizeof(uint32_t)); + uint32_t val; + if (big_endian) + val = load_reverse_endianness_uint32_t(buf); + else + val = *(uint32_t*)buf; + return val; +} + +void stream::write_uint32_t(uint32_t val) { + *(uint32_t*)buf = val; + write(buf, sizeof(uint32_t)); +} + +void stream::write_uint32_t_reverse_endianness(uint32_t val) { + if (is_big_endian) + store_reverse_endianness_uint32_t(val, buf); + else + *(uint32_t*)buf = val; + write(buf, sizeof(uint32_t)); +} + +void stream::write_uint32_t_reverse_endianness(uint32_t val, bool big_endian) { + if (big_endian) + store_reverse_endianness_uint32_t(val, buf); + else + *(uint32_t*)buf = val; + write(buf, sizeof(uint32_t)); +} + +int64_t stream::read_int64_t() { + read(buf, sizeof(int64_t)); + return *(int64_t*)buf; +} + +int64_t stream::read_int64_t_reverse_endianness() { + read(buf, sizeof(int64_t)); + int64_t val; + if (is_big_endian) + val = load_reverse_endianness_int64_t(buf); + else + val = *(int64_t*)buf; + return val; +} + +int64_t stream::read_int64_t_reverse_endianness(bool big_endian) { + read(buf, sizeof(int64_t)); + int64_t val; + if (big_endian) + val = load_reverse_endianness_int64_t(buf); + else + val = *(int64_t*)buf; + return val; +} + +void stream::write_int64_t(int64_t val) { + *(int64_t*)buf = val; + write(buf, sizeof(int64_t)); +} + +void stream::write_int64_t_reverse_endianness(int64_t val) { + if (is_big_endian) + store_reverse_endianness_int64_t(val, buf); + else + *(int64_t*)buf = val; + write(buf, sizeof(int64_t)); +} + +void stream::write_int64_t_reverse_endianness(int64_t val, bool big_endian) { + if (big_endian) + store_reverse_endianness_int64_t(val, buf); + else + *(int64_t*)buf = val; + write(buf, sizeof(int64_t)); +} + +uint64_t stream::read_uint64_t() { + read(buf, sizeof(uint64_t)); + return *(uint64_t*)buf; +} + +uint64_t stream::read_uint64_t_reverse_endianness() { + read(buf, sizeof(uint64_t)); + uint64_t val; + if (is_big_endian) + val = load_reverse_endianness_uint64_t(buf); + else + val = *(uint64_t*)buf; + return val; +} + +uint64_t stream::read_uint64_t_reverse_endianness(bool big_endian) { + read(buf, sizeof(uint64_t)); + uint64_t val; + if (big_endian) + val = load_reverse_endianness_uint64_t(buf); + else + val = *(uint64_t*)buf; + return val; +} + +void stream::write_uint64_t(uint64_t val) { + *(uint64_t*)buf = val; + write(buf, sizeof(uint64_t)); +} + +void stream::write_uint64_t_reverse_endianness(uint64_t val) { + if (is_big_endian) + store_reverse_endianness_uint64_t(val, buf); + else + *(uint64_t*)buf = val; + write(buf, sizeof(uint64_t)); +} + +void stream::write_uint64_t_reverse_endianness(uint64_t val, bool big_endian) { + if (big_endian) + store_reverse_endianness_uint64_t(val, buf); + else + *(uint64_t*)buf = val; + write(buf, sizeof(uint64_t)); +} + +half_t stream::read_half_t() { + read(buf, sizeof(half_t)); + return *(half_t*)buf; +} + +half_t stream::read_half_t_reverse_endianness() { + read(buf, sizeof(half_t)); + half_t val; + if (is_big_endian) + val = load_reverse_endianness_half_t(buf); + else + val = *(half_t*)buf; + return val; +} + +half_t stream::read_half_t_reverse_endianness(bool big_endian) { + read(buf, sizeof(half_t)); + half_t val; + if (big_endian) + val = load_reverse_endianness_half_t(buf); + else + val = *(half_t*)buf; + return val; +} + +void stream::write_half_t(half_t val) { + *(half_t*)buf = val; + write(buf, sizeof(half_t)); +} + +void stream::write_half_t_reverse_endianness(half_t val) { + if (is_big_endian) + store_reverse_endianness_half_t(val, buf); + else + *(half_t*)buf = val; + write(buf, sizeof(half_t)); +} + +void stream::write_half_t_reverse_endianness(half_t val, bool big_endian) { + if (big_endian) + store_reverse_endianness_half_t(val, buf); + else + *(half_t*)buf = val; + write(buf, sizeof(half_t)); +} + +float_t stream::read_float_t() { + read(buf, sizeof(float_t)); + return *(float_t*)buf; +} + +float_t stream::read_float_t_reverse_endianness() { + read(buf, sizeof(float_t)); + float_t val; + if (is_big_endian) + val = load_reverse_endianness_float_t(buf); + else + val = *(float_t*)buf; + return val; +} + +float_t stream::read_float_t_reverse_endianness(bool big_endian) { + read(buf, sizeof(float_t)); + float_t val; + if (big_endian) + val = load_reverse_endianness_float_t(buf); + else + val = *(float_t*)buf; + return val; +} + +void stream::write_float_t(float_t val) { + *(float_t*)buf = val; + write(buf, sizeof(float_t)); +} + +void stream::write_float_t_reverse_endianness(float_t val) { + if (is_big_endian) + store_reverse_endianness_float_t(val, buf); + else + *(float_t*)buf = val; + write(buf, sizeof(float_t)); +} + +void stream::write_float_t_reverse_endianness(float_t val, bool big_endian) { + if (big_endian) + store_reverse_endianness_float_t(val, buf); + else + *(float_t*)buf = val; + write(buf, sizeof(float_t)); +} + +double_t stream::read_double_t() { + read(buf, sizeof(double_t)); + return *(double_t*)buf; +} + +double_t stream::read_double_t_reverse_endianness() { + read(buf, sizeof(double_t)); + double_t val; + if (is_big_endian) + val = load_reverse_endianness_double_t(buf); + else + val = *(double_t*)buf; + return val; +} + +double_t stream::read_double_t_reverse_endianness(bool big_endian) { + read(buf, sizeof(double_t)); + double_t val; + if (big_endian) + val = load_reverse_endianness_double_t(buf); + else + val = *(double_t*)buf; + return val; +} + +void stream::write_double_t(double_t val) { + *(double_t*)buf = val; + write(buf, sizeof(double_t)); +} + +void stream::write_double_t_reverse_endianness(double_t val) { + if (is_big_endian) + store_reverse_endianness_double_t(val, buf); + else + *(double_t*)buf = val; + write(buf, sizeof(double_t)); +} + +void stream::write_double_t_reverse_endianness(double_t val, bool big_endian) { + if (big_endian) + store_reverse_endianness_double_t(val, buf); + else + *(double_t*)buf = val; + write(buf, sizeof(double_t)); +} + +void stream::write_string(std::string& str) { + write(str.c_str(), str.size()); +} + +void stream::write_string(std::string&& str) { + write_string(*(std::string*)&str); +} + +void stream::write_wstring(std::wstring& str) { + write(str.c_str(), sizeof(wchar_t) * str.size()); +} + +void stream::write_wstring(std::wstring&& str) { + write_wstring(*(std::wstring*)&str); +} + +void stream::write_string_null_terminated(std::string& str) { + write(str.c_str(), str.size()); + write_uint8_t(0); +} + +void stream::write_string_null_terminated(std::string&& str) { + write_string_null_terminated(*(std::string*)&str); +} + +void stream::write_wstring_null_terminated(std::wstring& str) { + write(str.c_str(), sizeof(wchar_t) * str.size()); + write_uint16_t(0); +} + +void stream::write_wstring_null_terminated(std::wstring&& str) { + write_wstring_null_terminated(*(std::wstring*)&str); +} + +void stream::write_utf8_string(const char* str) { + write(str, utf8_length(str)); +} + +void stream::write_utf16_string(const wchar_t* str) { + write(str, sizeof(wchar_t) * utf16_length(str)); +} + +void stream::write_utf8_string_null_terminated(const char* str) { + write(str, utf8_length(str)); + write_uint8_t(0); +} + +void stream::write_utf16_string_null_terminated(const wchar_t* str) { + write(str, sizeof(wchar_t) * utf16_length(str)); + write_uint16_t(0); +} + +int64_t stream::read_offset(int32_t offset, bool is_x) { + int64_t val; + if (!is_x) { + val = read_int32_t_reverse_endianness(); + if (val) + val -= offset; + } + else { + align_read(0x08); + val = read_int64_t_reverse_endianness(); + } + return val; +} + +int64_t stream::read_offset_f2(int32_t offset) { + int64_t val = read_int32_t_reverse_endianness(); + if (val) + val -= offset; + return val; +} + +int64_t stream::read_offset_x() { + align_read(0x08); + int64_t val = read_int64_t_reverse_endianness(); + return val; +} + +void stream::write_offset(int64_t val, int32_t offset, bool is_x) { + if (!is_x) { + if (val) + val += offset; + write_int32_t_reverse_endianness((int32_t)val); + } + else { + align_write(0x08); + write_int64_t_reverse_endianness(val); + } +} + +void stream::write_offset_f2(int64_t val, int32_t offset) { + if (val) + val += offset; + write_int32_t_reverse_endianness((int32_t)val); +} + +void stream::write_offset_x(int64_t val) { + align_write(0x08); + write_int64_t_reverse_endianness(val); +} diff --git a/src/KKdLib/io/stream.h b/src/KKdLib/io/stream.h deleted file mode 100644 index 3003a219..00000000 --- a/src/KKdLib/io/stream.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include -#include -#include "../default.h" -#include "../string.h" -#include "../half_t.h" -#include "../vector.h" - -enum stream_type { - STREAM_NONE = 0, - STREAM_FILE, - STREAM_MEMORY, -}; - -struct stream { - uint8_t buf[0x100]; - union io { - FILE* stream; - struct data { - uint8_t* data; - vector_old_uint8_t vec; - } data; - } io; - int64_t length; - stream_type type; - bool is_big_endian; - vector_old_int64_t position_stack; -}; - -extern void io_open(stream* s); -extern void io_open(stream* s, const char* path, const char* mode); -extern void io_open(stream* s, const wchar_t* path, const wchar_t* mode); -extern void io_open(stream* s, const void* data, size_t size); -extern void io_open(stream* s, std::vector* data); -extern void io_copy(stream* s, void** data, size_t* size); -extern void io_copy(stream* s, std::vector* data); -extern void io_align_read(stream* s, int64_t align); -extern void io_align_write(stream* s, int64_t align); -extern int io_flush(stream* s); -extern int64_t io_get_length(stream* s); -extern int64_t io_get_position(stream* s); -extern int32_t io_set_position(stream* s, int64_t pos, int32_t seek); -extern int32_t io_position_push(stream* s, int64_t pos, int32_t seek); -extern void io_position_pop(stream* s); -extern int64_t io_read(stream* s, int64_t count); -extern int64_t io_read(stream* s, void* buf, int64_t count); -extern int64_t io_write(stream* s, int64_t count); -extern int64_t io_write(stream* s, void* buf, int64_t count); -extern int64_t io_write(stream* s, const void* buf, int64_t count); -extern int32_t io_read_char(stream* s); -extern int32_t io_write_char(stream* s, char c); - -extern int8_t io_read_int8_t(stream* s); -extern uint8_t io_read_uint8_t(stream* s); -extern void io_write_int8_t(stream* s, int8_t val); -extern void io_write_uint8_t(stream* s, uint8_t val); - -extern void io_read_string(stream* s, string* str, size_t length); -extern void io_read_string(stream* s, std::string* str, size_t length); -extern void io_read_wstring(stream* s, wstring* str, size_t length); -extern void io_read_wstring(stream* s, std::wstring* str, size_t length); -extern void io_read_string_null_terminated(stream* s, string* str); -extern void io_read_string_null_terminated(stream* s, std::string* str); -extern void io_read_wstring_null_terminated(stream* s, wstring* str); -extern void io_read_wstring_null_terminated(stream* s, std::wstring* str); -extern void io_read_string_null_terminated_offset(stream* s, int64_t offset, string* str); -extern void io_read_string_null_terminated_offset(stream* s, int64_t offset, std::string* str); -extern void io_read_wstring_null_terminated_offset(stream* s, int64_t offset, wstring* str); -extern void io_read_wstring_null_terminated_offset(stream* s, int64_t offset, std::wstring* str); -extern char* io_read_utf8_string_null_terminated(stream* s); -extern wchar_t* io_read_utf16_string_null_terminated(stream* s); -extern char* io_read_utf8_string_null_terminated_length(stream* s, int64_t* length); -extern wchar_t* io_read_utf16_string_null_terminated_length(stream* s, int64_t* length); -extern char* io_read_utf8_string_null_terminated_offset(stream* s, int64_t offset); -extern wchar_t* io_read_utf16_string_null_terminated_offset(stream* s, int64_t offset); -extern char* io_read_utf8_string_null_terminated_offset_length(stream* s, int64_t offset, int64_t* length); -extern wchar_t* io_read_utf16_string_null_terminated_offset_length(stream* s, int64_t offset, int64_t* length); -extern void io_write_string(stream* s, string* str); -extern void io_write_string(stream* s, std::string* str); -extern void io_write_wstring(stream* s, wstring* str); -extern void io_write_wstring(stream* s, std::wstring* str); -extern void io_write_string_null_terminated(stream* s, string* str); -extern void io_write_string_null_terminated(stream* s, std::string* str); -extern void io_write_wstring_null_terminated(stream* s, wstring* str); -extern void io_write_wstring_null_terminated(stream* s, std::wstring* str); -extern void io_write_utf8_string(stream* s, const char* str); -extern void io_write_utf16_string(stream* s, const wchar_t* str); -extern void io_write_utf8_string_null_terminated(stream* s, const char* str); -extern void io_write_utf16_string_null_terminated(stream* s, const wchar_t* str); -extern int64_t io_read_offset(stream* s, int32_t offset, bool is_x); -extern int64_t io_read_offset_f2(stream* s, int32_t offset); -extern int64_t io_read_offset_x(stream* s); -extern void io_write_offset(stream* s, int64_t val, int32_t offset, bool is_x); -extern void io_write_offset_f2(stream* s, int64_t val, int32_t offset); -extern void io_write_offset_x(stream* s, int64_t val); -extern void io_free(stream* s); - -#define io_read_write(t) \ -extern t io_read_##t(stream* s); \ -extern t io_read_##t##_stream_reverse_endianness(stream* s); \ -extern t io_read_##t##_reverse_endianness(stream* s, bool big_endian); \ -extern void io_write_##t(stream* s, t val); \ -extern void io_write_##t##_stream_reverse_endianness(stream* s, t val); \ -extern void io_write_##t##_reverse_endianness(stream* s, t val, bool big_endian); - -#define io_read_write_func(t) \ -t io_read_##t(stream* s) { \ - io_read(s, s->buf, sizeof(t)); \ - return *(t*)s->buf; \ -} \ -\ -t io_read_##t##_stream_reverse_endianness(stream* s) { \ - io_read(s, s->buf, sizeof(t)); \ - t val; \ - if (s->is_big_endian) \ - val = load_reverse_endianness_##t(s->buf); \ - else \ - val = *(t*)s->buf; \ - return val; \ -}\ -\ -t io_read_##t##_reverse_endianness(stream* s, bool big_endian) { \ - io_read(s, s->buf, sizeof(t)); \ - t val; \ - if (big_endian) \ - val = load_reverse_endianness_##t(s->buf); \ - else \ - val = *(t*)s->buf; \ - return val; \ -}\ -\ -void io_write_##t(stream* s, t val) { \ - *(t*)s->buf = val; \ - io_write(s, s->buf, sizeof(t)); \ -} \ -\ -void io_write_##t##_stream_reverse_endianness(stream* s, t val) { \ - if (s->is_big_endian) \ - store_reverse_endianness_##t(val, s->buf); \ - else \ - *(t*)s->buf = val; \ - io_write(s, s->buf, sizeof(t)); \ -} \ -\ -void io_write_##t##_reverse_endianness(stream* s, t val, bool big_endian) { \ - if (big_endian) \ - store_reverse_endianness_##t(val, s->buf); \ - else \ - *(t*)s->buf = val; \ - io_write(s, s->buf, sizeof(t)); \ -} - -io_read_write(int16_t) -io_read_write(uint16_t) -io_read_write(int32_t) -io_read_write(uint32_t) -io_read_write(int64_t) -io_read_write(uint64_t) -io_read_write(float_t) -io_read_write(double_t) -io_read_write(half_t) diff --git a/src/KKdLib/io/stream.hpp b/src/KKdLib/io/stream.hpp new file mode 100644 index 00000000..7217c602 --- /dev/null +++ b/src/KKdLib/io/stream.hpp @@ -0,0 +1,171 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include +#include +#include "../default.hpp" +#include "../half_t.hpp" + +enum stream_type { + STREAM_NONE = 0, + STREAM_FILE, + STREAM_MEMORY, +}; + +struct stream { + + uint8_t buf[0x100]; + struct io { + FILE* stream; + struct data { + std::vector::iterator data; + std::vector vec; + } data; + + io(); + ~io(); + + bool check_null(); + bool check_not_null(); + void close(); + } io; + int64_t length; + stream_type type; + bool is_big_endian; + std::vector position_stack; + + stream(); + ~stream(); + + void open(); + void open(const char* path, const char* mode); + void open(const wchar_t* path, const wchar_t* mode); + void open(const void* data, size_t size); + void open(std::vector& data); + void copy(void** data, size_t* size); + void copy(std::vector& data); + int flush(); + void close(); + + int64_t get_length(); + int64_t get_position(); + int32_t set_position(int64_t pos, int32_t seek); + int32_t position_push(int64_t pos, int32_t seek); + void position_pop(); + + void align_read(int64_t align); + void align_write(int64_t align); + int64_t read(int64_t count); + int64_t read(void* buf, int64_t count); + int64_t write(int64_t count); + int64_t write(const void* buf, int64_t count); + int32_t read_char(); + int32_t write_char(char c); + + int8_t read_int8_t(); + uint8_t read_uint8_t(); + void write_int8_t(int8_t val); + void write_uint8_t(uint8_t val); + + int16_t read_int16_t(); + int16_t read_int16_t_reverse_endianness(); + int16_t read_int16_t_reverse_endianness(bool big_endian); + void write_int16_t(int16_t val); + void write_int16_t_reverse_endianness(int16_t val); + void write_int16_t_reverse_endianness(int16_t val, bool big_endian); + + uint16_t read_uint16_t(); + uint16_t read_uint16_t_reverse_endianness(); + uint16_t read_uint16_t_reverse_endianness(bool big_endian); + void write_uint16_t(uint16_t val); + void write_uint16_t_reverse_endianness(uint16_t val); + void write_uint16_t_reverse_endianness(uint16_t val, bool big_endian); + + int32_t read_int32_t(); + int32_t read_int32_t_reverse_endianness(); + int32_t read_int32_t_reverse_endianness(bool big_endian); + void write_int32_t(int32_t val); + void write_int32_t_reverse_endianness(int32_t val); + void write_int32_t_reverse_endianness(int32_t val, bool big_endian); + + uint32_t read_uint32_t(); + uint32_t read_uint32_t_reverse_endianness(); + uint32_t read_uint32_t_reverse_endianness(bool big_endian); + void write_uint32_t(uint32_t val); + void write_uint32_t_reverse_endianness(uint32_t val); + void write_uint32_t_reverse_endianness(uint32_t val, bool big_endian); + + int64_t read_int64_t(); + int64_t read_int64_t_reverse_endianness(); + int64_t read_int64_t_reverse_endianness(bool big_endian); + void write_int64_t(int64_t val); + void write_int64_t_reverse_endianness(int64_t val); + void write_int64_t_reverse_endianness(int64_t val, bool big_endian); + + uint64_t read_uint64_t(); + uint64_t read_uint64_t_reverse_endianness(); + uint64_t read_uint64_t_reverse_endianness(bool big_endian); + void write_uint64_t(uint64_t val); + void write_uint64_t_reverse_endianness(uint64_t val); + void write_uint64_t_reverse_endianness(uint64_t val, bool big_endian); + + half_t read_half_t(); + half_t read_half_t_reverse_endianness(); + half_t read_half_t_reverse_endianness(bool big_endian); + void write_half_t(half_t val); + void write_half_t_reverse_endianness(half_t val); + void write_half_t_reverse_endianness(half_t val, bool big_endian); + + float_t read_float_t(); + float_t read_float_t_reverse_endianness(); + float_t read_float_t_reverse_endianness(bool big_endian); + void write_float_t(float_t val); + void write_float_t_reverse_endianness(float_t val); + void write_float_t_reverse_endianness(float_t val, bool big_endian); + + double_t read_double_t(); + double_t read_double_t_reverse_endianness(); + double_t read_double_t_reverse_endianness(bool big_endian); + void write_double_t(double_t val); + void write_double_t_reverse_endianness(double_t val); + void write_double_t_reverse_endianness(double_t val, bool big_endian); + + std::string read_string(size_t length); + std::wstring read_wstring(size_t length); + std::string read_string_null_terminated(); + std::wstring read_wstring_null_terminated(); + std::string read_string_null_terminated_offset(int64_t offset); + std::wstring read_wstring_null_terminated_offset(int64_t offset); + char* read_utf8_string_null_terminated(); + wchar_t* read_utf16_string_null_terminated(); + char* read_utf8_string_null_terminated_length(int64_t* length); + wchar_t* read_utf16_string_null_terminated_length(int64_t* length); + char* read_utf8_string_null_terminated_offset(int64_t offset); + wchar_t* read_utf16_string_null_terminated_offset(int64_t offset); + char* read_utf8_string_null_terminated_offset_length(int64_t offset, int64_t* length); + wchar_t* read_utf16_string_null_terminated_offset_length(int64_t offset, int64_t* length); + + void write_string(std::string& str); + void write_string(std::string&& str); + void write_wstring(std::wstring& str); + void write_wstring(std::wstring&& str); + void write_string_null_terminated(std::string& str); + void write_string_null_terminated(std::string&& str); + void write_wstring_null_terminated(std::wstring& str); + void write_wstring_null_terminated(std::wstring&& str); + void write_utf8_string(const char* str); + void write_utf16_string(const wchar_t* str); + void write_utf8_string_null_terminated(const char* str); + void write_utf16_string_null_terminated(const wchar_t* str); + + int64_t read_offset(int32_t offset, bool is_x); + int64_t read_offset_f2(int32_t offset); + int64_t read_offset_x(); + void write_offset(int64_t val, int32_t offset, bool is_x); + void write_offset_f2(int64_t val, int32_t offset); + void write_offset_x(int64_t val); +}; diff --git a/src/KKdLib/key_val.cpp b/src/KKdLib/key_val.cpp index 1e0630a9..1a2d3433 100644 --- a/src/KKdLib/key_val.cpp +++ b/src/KKdLib/key_val.cpp @@ -4,14 +4,44 @@ */ #include "key_val.hpp" -#include "io/path.h" +#include "io/path.hpp" #include "hash.hpp" -#include "str_utils.h" +#include "str_utils.hpp" -static int64_t key_val_get_key_index(key_val* kv, char* str, size_t length); +static int64_t key_val_get_key_index(key_val* kv, std::string& str); +static int64_t key_val_get_key_index(key_val* kv, std::string&& str); static void key_val_sort(key_val* kv); -key_val::key_val() : buf() { +key_val_hash_index_pair::key_val_hash_index_pair() { + hash = hash_fnv1a64m_empty; + index = 0; +} + +key_val_hash_index_pair::key_val_hash_index_pair(uint64_t hash, size_t index) : hash(hash), index(index) { + +} + +key_val_scope::key_val_scope() : index(), count() { + +} + +key_val_scope::~key_val_scope() { + +} + +key_val_pair::key_val_pair() : str(), length() { + +} + +key_val_pair::key_val_pair(const char* str, size_t length) : str(str), length(length) { + +} + +key_val_pair::~key_val_pair() { + +} + +key_val::key_val() : curr_scope(), buf() { } @@ -19,19 +49,26 @@ key_val::~key_val() { free(buf); } +void key_val::close_scope() { + if (scope.size() <= 1) + return; + + scope.pop_back(); + curr_scope = &scope[scope.size() - 1]; +} + void key_val::file_read(const char* path) { if (!path || !path_check_file_exists(path)) return; stream s; - io_open(&s, path, "rb"); + s.open(path, "rb"); if (s.io.stream) { char* d = force_malloc_s(char, s.length); - io_read(&s, d, s.length); + s.read(d, s.length); parse((uint8_t*)d, s.length); free(d); } - io_free(&s); } void key_val::file_read(const wchar_t* path) { @@ -39,84 +76,141 @@ void key_val::file_read(const wchar_t* path) { return; stream s; - io_open(&s, path, L"rb"); + s.open(path, L"rb"); if (s.io.stream) { char* d = force_malloc_s(char, s.length); - io_read(&s, d, s.length); + s.read(d, s.length); parse((uint8_t*)d, s.length); free(d); } - io_free(&s); } -bool key_val::get_local_key_val(const char* str, key_val* lkv) { - lkv->buf = 0; - lkv->key.clear(); - lkv->key_len.clear(); - lkv->val.clear(); - lkv->key_hash.clear(); - lkv->key_index.clear(); +bool key_val::has_key(const char* str) { + size_t offset = curr_scope->key.size(); + if (offset) + offset++; - if (!str) - return false; + const char* s = str; + size_t s_len = utf8_length(str); - char** first = 0; - char** last = 0; - size_t str_length = utf8_length(str); + key_val_pair* i = key.data() + curr_scope->index; + size_t j = curr_scope->count; + int32_t res = 0; + for (; j; i++, j--) { + if (i->length > offset && s_len <= i->length - offset + && !(res = memcmp(s, i->str + offset, s_len))) + return true; + else if (res < 0) + return false; + } + return false; +} - char** i = key.data(); - size_t* i_len = key_len.data(); - size_t j = key.size(); - for (; j; i++, i_len++, j--) - if (str_length <= *i_len && !memcmp(str, (char*)*i, str_length)) { +bool key_val::has_key(std::string& str) { + size_t offset = curr_scope->key.size(); + if (offset) + offset++; + + const char* s = str.c_str(); + size_t s_len = str.size(); + + key_val_pair* i = key.data() + curr_scope->index; + size_t j = curr_scope->count; + int32_t res = 0; + for (; j; i++, j--) { + if (i->length > offset && s_len <= i->length - offset + && !(res = memcmp(s, i->str + offset, s_len))) + return true; + else if (res < 0) + return false; + } + return false; +} + +bool key_val::open_scope(std::string& str) { + if (!str.size()) { + scope.push_back(*curr_scope); + curr_scope = &scope[scope.size() - 1]; + return true; + } + + ssize_t offset = curr_scope->key.size(); + if (offset) + offset++; + + key_val_pair* first = 0; + key_val_pair* last = 0; + const char* s = str.c_str(); + ssize_t s_len = str.size(); + + key_val_pair* i = key.data() + curr_scope->index; + size_t j = curr_scope->count; + int32_t res = 0; + for (; j; i++, j--) { + if (i->length > offset && s_len <= i->length - offset + && !(res = memcmp(s, i->str + offset, s_len))) { if (!first) first = i; last = i + 1; } else if (first) break; + else if (res < 0) + return false; + } if (!first) return false; - size_t index = first - key.data(); - size_t count = last - first; - lkv->key = std::vector(key.begin() + index, key.begin() + index + count); - lkv->key_len = std::vector(key_len.begin() + index, key_len.begin() + index + count); - lkv->val = std::vector(val.begin() + index, val.begin() + index + count); - lkv->val_len = std::vector(val_len.begin() + index, val_len.begin() + index + count); + scope.push_back({}); + curr_scope = &scope[scope.size() - 1]; + curr_scope->key = curr_scope[-1].key.size() ? curr_scope[-1].key + '.' + str : str; + curr_scope->index = first - key.data(); + curr_scope->count = last - first; - key_val_sort(lkv); + key_val_sort(this); return true; } -bool key_val::has_key(const char* str) { - size_t str_length = utf8_length(str); - - char** i = key.data(); - size_t* i_len = key_len.data(); - size_t j = key.size(); - for (; j; i++, i_len++, j--) { - size_t len = min(str_length, *i_len); - if (len && str_length <= *i_len && !memcmp(str, *i, len)) - return true; - } - return false; +bool key_val::open_scope(std::string&& key) { + return open_scope(*(std::string*)&key); } -void key_val::parse(void* data, size_t size) { +bool key_val::open_scope(int32_t i) { + char buf[0x100]; + size_t len = sprintf_s(buf, sizeof(buf), "%d", i); + return open_scope(std::string(buf, len)); +} + +bool key_val::open_scope(uint32_t i) { + char buf[0x100]; + size_t len = sprintf_s(buf, sizeof(buf), "%u", i); + return open_scope(std::string(buf, len)); +} + +bool key_val::open_scope(const char* fmt, ...) { + char buf[0x200]; + va_list args; + va_start(args, fmt); + size_t len = vsprintf_s(buf, sizeof(buf), fmt, args); + va_end(args); + return open_scope(std::string(buf, len)); +} + +void key_val::parse(const void* data, size_t size) { if (!data || !size) return; + curr_scope = 0; + scope.clear(); + char** lines; size_t count; if (!str_utils_text_file_parse(data, size, &buf, &lines, &count)) return; key.reserve(count); - key_len.reserve(count); val.reserve(count); - val_len.reserve(count); for (size_t i = 0, j = 0; i < count; i++) { char* s = lines[i]; @@ -138,139 +232,521 @@ void key_val::parse(void* data, size_t size) { uint64_t key_hash = hash_fnv1a64m(key_str_data, key_length); - key.push_back(key_str_data); - key_len.push_back(key_length); - val.push_back(val_str_data); - val_len.push_back(val_length); + key.push_back({ key_str_data, key_length }); + val.push_back({ val_str_data, val_length }); j++; } + + scope.resize(1); + curr_scope = &scope[0]; + curr_scope->key = {}; + curr_scope->index = 0; + curr_scope->count = key.size(); + key_val_sort(this); free(lines) } -bool key_val::read_bool(char* buf, size_t offset, - const char* str_add, size_t str_add_len, bool* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - int64_t index = key_val_get_key_index(this, buf, offset); - buf[offset - (str_add_len - 1)] = 0; +bool key_val::read(bool& value) { + int64_t index = curr_scope->index; if (index == -1) { - *value = false; + value = false; return false; } - *value = atoi(val[index]) ? true : false; + value = atoi(val[index].str) ? true : false; return true; } -bool key_val::read_float_t(char* buf, size_t offset, - const char* str_add, size_t str_add_len, float_t* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - int64_t index = key_val_get_key_index(this, buf, offset); - buf[offset - (str_add_len - 1)] = 0; +bool key_val::read(float_t& value) { + int64_t index = curr_scope->index; if (index == -1) { - *value = 0.0f; + value = 0.0f; return false; } - *value = (float_t)atof(val[index]); + value = (float_t)atof(val[index].str); return true; } -bool key_val::read_int32_t(char* buf, size_t offset, - const char* str_add, size_t str_add_len, int32_t* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - int64_t index = key_val_get_key_index(this, buf, offset); - buf[offset - (str_add_len - 1)] = 0; +bool key_val::read(int32_t& value) { + int64_t index = curr_scope->index; if (index == -1) { - *value = 0; + value = 0; return false; } - *value = atoi(val[index]); + value = atoi(val[index].str); return true; } -bool key_val::read_uint32_t(char* buf, size_t offset, - const char* str_add, size_t str_add_len, uint32_t* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - int64_t index = key_val_get_key_index(this, buf, offset); - buf[offset - (str_add_len - 1)] = 0; +bool key_val::read(uint32_t& value) { + int64_t index = curr_scope->index; if (index == -1) { - *value = 0; + value = 0; return false; } - *value = atoi(val[index]); + value = (uint32_t)atoll(val[index].str); return true; } -bool key_val::read_string(char* buf, size_t offset, - const char* str_add, size_t str_add_len, string* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - int64_t index = key_val_get_key_index(this, buf, offset); - buf[offset - (str_add_len - 1)] = 0; +bool key_val::read(const char*& value) { + int64_t index = curr_scope->index; if (index == -1) { - *value = string_empty; + value = 0; return false; } - string_init_length(value, val[index], val_len[index]); + value = val[index].str; return true; } -bool key_val::read_string(char* buf, size_t offset, - const char* str_add, size_t str_add_len, std::string* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - int64_t index = key_val_get_key_index(this, buf, offset); - buf[offset - (str_add_len - 1)] = 0; +bool key_val::read(std::string& value) { + int64_t index = curr_scope->index; if (index == -1) { - *value = {}; + value = {}; return false; } - *value = std::string(val[index], val_len[index]); + value = std::string(val[index].str, val[index].length); return true; } -bool key_val::read_string(char* buf, size_t offset, - const char* str_add, size_t str_add_len, const char** value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; +bool key_val::read(vec3& value) { + read("x", value.x); + read("y", value.y); + read("z", value.z); + return true; +} - int64_t index = key_val_get_key_index(this, buf, offset); - buf[offset - (str_add_len - 1)] = 0; +bool key_val::read(std::string& key, bool& value) { + int64_t index = key_val_get_key_index(this, + curr_scope->key.size() ? curr_scope->key + '.' + key : key); if (index == -1) { - *value = 0; + value = false; return false; } - *value = val[index]; + value = atoi(val[index].str) ? true : false; return true; } -bool key_val::read_vec3(char* buf, size_t offset, - const char* str_add, size_t str_add_len, vec3* value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; +bool key_val::read(std::string&& key, bool& value) { + return read(*(std::string*)&key, value); +} - key_val lkv; - if (!get_local_key_val(buf, &lkv)) { - memset(value, 0, sizeof(vec3)); +bool key_val::read(std::string& key, float_t& value) { + int64_t index = key_val_get_key_index(this, + curr_scope->key.size() ? curr_scope->key + '.' + key : key); + if (index == -1) { + value = 0.0f; return false; } - - lkv.read_float_t(buf, offset, ".x", 3, &value->x); - lkv.read_float_t(buf, offset, ".y", 3, &value->y); - lkv.read_float_t(buf, offset, ".z", 3, &value->z); + value = (float_t)atof(val[index].str); return true; } -void key_val::get_lexicographic_order(std::vector* vec, int32_t length) { +bool key_val::read(std::string&& key, float_t& value) { + return read(*(std::string*)&key, value); +} + +bool key_val::read(std::string& key, int32_t& value) { + int64_t index = key_val_get_key_index(this, + curr_scope->key.size() ? curr_scope->key + '.' + key : key); + if (index == -1) { + value = 0; + return false; + } + value = atoi(val[index].str); + return true; +} + +bool key_val::read(std::string&& key, int32_t& value) { + return read(*(std::string*)&key, value); +} + +bool key_val::read(std::string& key, uint32_t& value) { + int64_t index = key_val_get_key_index(this, + curr_scope->key.size() ? curr_scope->key + '.' + key : key); + if (index == -1) { + value = 0; + return false; + } + value = (uint32_t)atoll(val[index].str); + return true; +} + +bool key_val::read(std::string&& key, uint32_t& value) { + return read(*(std::string*)&key, value); +} + +bool key_val::read(std::string& key, const char*& value) { + int64_t index = key_val_get_key_index(this, + curr_scope->key.size() ? curr_scope->key + '.' + key : key); + if (index == -1) { + value = 0; + return false; + } + value = val[index].str; + return true; +} + +bool key_val::read(std::string&& key, const char*& value) { + return read(*(std::string*)&key, value); +} + +bool key_val::read(std::string& key, std::string& value) { + int64_t index = key_val_get_key_index(this, + curr_scope->key.size() ? curr_scope->key + '.' + key : key); + if (index == -1) { + value = {}; + return false; + } + value = std::string(val[index].str, val[index].length); + return true; +} + +bool key_val::read(std::string&& key, std::string& value) { + return read(*(std::string*)&key, value); +} + +bool key_val::read(std::string& key, vec3& value) { + if (open_scope(key)) { + read("x", value.x); + read("y", value.y); + read("z", value.z); + close_scope(); + return true; + } + return false; +} + +bool key_val::read(std::string&& key, vec3& value) { + return read(*(std::string*)&key, value); +} + +bool key_val::read(std::string& key0, std::string& key1, bool& value) { + if (!open_scope(key0)) { + value = false; + return false; + } + + if (read(key1, value)) + return true; + + close_scope(); + return false; +} + +bool key_val::read(std::string&& key0, std::string&& key1, bool& value) { + return read(*(std::string*)&key0, *(std::string*)&key1, value); +} + +bool key_val::read(std::string& key0, std::string& key1, float_t& value) { + if (!open_scope(key0)) { + value = 0.0f; + return false; + } + + if (read(key1, value)) + return true; + + close_scope(); + return false; +} + +bool key_val::read(std::string&& key0, std::string&& key1, float_t& value) { + return read(*(std::string*)&key0, *(std::string*)&key1, value); +} + +bool key_val::read(std::string& key0, std::string& key1, int32_t& value) { + if (!open_scope(key0)) { + value = 0; + return false; + } + + if (read(key1, value)) + return true; + + close_scope(); + return false; +} + +bool key_val::read(std::string&& key0, std::string&& key1, int32_t& value) { + return read(*(std::string*)&key0, *(std::string*)&key1, value); +} + +bool key_val::read(std::string& key0, std::string& key1, uint32_t& value) { + if (!open_scope(key0)) { + value = 0; + return false; + } + + if (read(key1, value)) + return true; + + close_scope(); + return false; +} + +bool key_val::read(std::string&& key0, std::string&& key1, uint32_t& value) { + return read(*(std::string*)&key0, *(std::string*)&key1, value); +} + +bool key_val::read(std::string& key0, std::string& key1, const char*& value) { + if (!open_scope(key0)) { + value = {}; + return false; + } + + if (read(key1, value)) + return true; + + close_scope(); + return false; +} + +bool key_val::read(std::string&& key0, std::string&& key1, const char*& value) { + return read(*(std::string*)&key0, *(std::string*)&key1, value); +} + +bool key_val::read(std::string& key0, std::string& key1, std::string& value) { + if (!open_scope(key0)) { + value = {}; + return false; + } + + if (read(key1, value)) + return true; + + close_scope(); + return false; +} + +bool key_val::read(std::string&& key0, std::string&& key1, std::string& value) { + return read(*(std::string*)&key0, *(std::string*)&key1, value); +} + +bool key_val::read(std::string& key0, std::string& key1, vec3& value) { + if (!open_scope(key0)) { + value = vec3_null; + return false; + } + + if (read(key1, value)) + return true; + + close_scope(); + return false; +} + +bool key_val::read(std::string&& key0, std::string&& key1, vec3& value) { + return read(*(std::string*)&key0, *(std::string*)&key1, value); +} + +bool key_val::load_file(void* data, const char* path, const char* file, uint32_t hash) { + std::string s = path + std::string(file); + + key_val* kv = (key_val*)data; + kv->file_read(s.c_str()); + + return kv->buf ? true : false; +} + +key_val_out::key_val_out() : curr_scope() { + +} + +key_val_out::~key_val_out() { + +} + +void key_val_out::close_scope() { + if (scope.size() <= 1) + return; + + scope.pop_back(); + curr_scope = &scope[scope.size() - 1]; +} + +void key_val_out::open_scope(std::string& str) { + if (!str.size()) { + scope.push_back(*curr_scope); + curr_scope = &scope[scope.size() - 1]; + return; + } + + scope.push_back(curr_scope->size() ? *curr_scope + '.' + str : str); + curr_scope = &scope[scope.size() - 1]; +} + +void key_val_out::open_scope(std::string&& key) { + open_scope(*(std::string*)&key); +} + +void key_val_out::open_scope(int32_t i) { + char buf[0x100]; + size_t len = sprintf_s(buf, sizeof(buf), "%d", i); + open_scope(std::string(buf, len)); +} + +void key_val_out::open_scope(uint32_t i) { + char buf[0x100]; + size_t len = sprintf_s(buf, sizeof(buf), "%u", i); + open_scope(std::string(buf, len)); +} + +void key_val_out::write(stream& s, bool value) { + if (!value) + return; + + s.write_string(*curr_scope); + s.write("=1\n", 3); +} + +void key_val_out::write(stream& s, float_t value) { + char val_buf[0x100]; + sprintf_s(val_buf, 0x100, "%g", value); + + s.write_string(*curr_scope); + s.write_char('='); + s.write_utf8_string(val_buf); + s.write_char('\n'); +} + +void key_val_out::write(stream& s, int32_t value) { + char val_buf[0x100]; + sprintf_s(val_buf, 0x100, "%d", value); + + s.write_string(*curr_scope); + s.write_char('='); + s.write_utf8_string(val_buf); + s.write_char('\n'); +} + +void key_val_out::write(stream& s, uint32_t value) { + char val_buf[0x100]; + sprintf_s(val_buf, 0x100, "%u", value); + + s.write_string(*curr_scope); + s.write_char('='); + s.write_utf8_string(val_buf); + s.write_char('\n'); +} + +void key_val_out::write(stream& s, const char* value) { + s.write_string(*curr_scope); + s.write_char('='); + s.write_utf8_string(value); + s.write_char('\n'); +} + +void key_val_out::write(stream& s, std::string& value) { + s.write_string(*curr_scope); + s.write_char('='); + s.write_string(value); + s.write_char('\n'); +} + +void key_val_out::write(stream& s, vec3& value) { + write(s, "x", value.x); + write(s, "y", value.y); + write(s, "z", value.z); +} + +void key_val_out::write(stream& s, vec3&& value) { + write(s, *(vec3*)&value); +} + +void key_val_out::write(stream& s, std::string& key, bool value) { + if (!value) + return; + + s.write_string(curr_scope->size() ? *curr_scope + '.' + key : key); + s.write("=1\n", 3); +} + +void key_val_out::write(stream& s, std::string&& key, bool value) { + write(s, *(std::string*)&key, value); +} + +void key_val_out::write(stream& s, std::string& key, float_t value) { + char val_buf[0x100]; + sprintf_s(val_buf, 0x100, "%g", value); + + s.write_string(curr_scope->size() ? *curr_scope + '.' + key : key); + s.write_char('='); + s.write_utf8_string(val_buf); + s.write_char('\n'); +} + +void key_val_out::write(stream& s, std::string&& key, float_t value) { + write(s, *(std::string*)&key, value); +} + +void key_val_out::write(stream& s, std::string& key, int32_t value) { + char val_buf[0x100]; + sprintf_s(val_buf, 0x100, "%d", value); + + s.write_string(curr_scope->size() ? *curr_scope + '.' + key : key); + s.write_char('='); + s.write_utf8_string(val_buf); + s.write_char('\n'); +} + +void key_val_out::write(stream& s, std::string&& key, int32_t value) { + write(s, *(std::string*)&key, value); +} + +void key_val_out::write(stream& s, std::string& key, uint32_t value) { + char val_buf[0x100]; + sprintf_s(val_buf, 0x100, "%u", value); + + s.write_string(curr_scope->size() ? *curr_scope + '.' + key : key); + s.write_char('='); + s.write_utf8_string(val_buf); + s.write_char('\n'); +} + +void key_val_out::write(stream& s, std::string&& key, uint32_t value) { + write(s, *(std::string*)&key, value); +} + +void key_val_out::write(stream& s, std::string& key, const char* value) { + s.write_string(curr_scope->size() ? *curr_scope + '.' + key : key); + s.write_char('='); + s.write_utf8_string(value); + s.write_char('\n'); +} + +void key_val_out::write(stream& s, std::string&& key, const char* value) { + write(s, *(std::string*)&key, value); +} + +void key_val_out::write(stream& s, std::string& key, std::string& value) { + s.write_string(curr_scope->size() ? *curr_scope + '.' + key : key); + s.write_char('='); + s.write_string(value); + s.write_char('\n'); +} + +void key_val_out::write(stream& s, std::string&& key, std::string& value) { + write(s, *(std::string*)&key, value); +} + +void key_val_out::write(stream& s, std::string& key, vec3& value) { + write(s, "x", value.x); + write(s, "y", value.y); + write(s, "z", value.z); +} + +void key_val_out::write(stream& s, std::string&& key, vec3& value) { + write(s, *(std::string*)&key, value); +} + +void key_val_out::write(stream& s, std::string& key, vec3&& value) { + write(s, key, *(vec3*)&value); +} + +void key_val_out::write(stream& s, std::string&& key, vec3&& value) { + write(s, *(std::string*)&key, *(vec3*)&value); +} + +void key_val_out::get_lexicographic_order(std::vector* vec, int32_t length) { vec->clear(); int32_t i, j, m; @@ -326,129 +802,19 @@ 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) { - std::string s = path + std::string(file); +static int64_t key_val_get_key_index(key_val* kv, std::string& str) { + key_val_scope* curr_scope = kv->curr_scope; - key_val* kv = (key_val*)data; - kv->file_read(s.c_str()); - - return kv->buf ? true : false; -} - -void key_val::write_bool(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, bool value) { - if (!value) - return; - - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - io_write_utf8_string(s, buf); - io_write(s, "=1\n", 3); -} - -void key_val::write_float_t(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, float_t value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - char val_buf[0x100]; - sprintf_s(val_buf, 0x100, "%g", value); - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write_utf8_string(s, val_buf); - io_write_char(s, '\n'); -} - -void key_val::write_int32_t(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, int32_t value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - char val_buf[0x100]; - sprintf_s(val_buf, 0x100, "%d", value); - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write_utf8_string(s, val_buf); - io_write_char(s, '\n'); -} - -void key_val::write_uint32_t(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, uint32_t value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - char val_buf[0x100]; - sprintf_s(val_buf, 0x100, "%u", value); - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write_utf8_string(s, val_buf); - io_write_char(s, '\n'); -} - -void key_val::write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, string& value) { - if (!string_data(&value)) - return; - - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write(s, string_data(&value), value.length); - io_write_char(s, '\n'); -} - -void key_val::write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, std::string& value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write(s, value.c_str(), value.size()); - io_write_char(s, '\n'); -} - -void key_val::write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, const char* value) { - if (!value) - return; - - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - io_write_utf8_string(s, buf); - io_write_char(s, '='); - io_write_utf8_string(s, value); - io_write_char(s, '\n'); -} - -void key_val::write_vec3(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, vec3& value) { - memcpy(buf + offset, str_add, str_add_len); - offset += str_add_len - 1; - - write_float_t(s, buf, offset, ".x", 3, value.x); - write_float_t(s, buf, offset, ".y", 3, value.y); - write_float_t(s, buf, offset, ".z", 3, value.z); -} - -static int64_t key_val_get_key_index(key_val* kv, char* str, size_t length) { - if (kv->key_hash.size() < 1) + if (curr_scope->key_hash_index.size() < 1) return -1; - uint64_t hash = hash_fnv1a64m(str, length); + uint64_t hash = hash_string_fnv1a64m(&str); - std::vector::iterator key = kv->key_hash.begin(); - size_t len = kv->key.size(); + std::vector::iterator key = curr_scope->key_hash_index.begin(); + size_t len = curr_scope->count; size_t temp; while (len > 0) { - if (hash < key[temp = len / 2]) + if (hash < key[temp = len / 2].hash) len = temp; else { key += temp + 1; @@ -456,86 +822,82 @@ static int64_t key_val_get_key_index(key_val* kv, char* str, size_t length) { } } - if (key - kv->key_hash.begin() == 0) - if (key[0] == hash) - return kv->key_index[key - kv->key_hash.begin()]; + if (key - curr_scope->key_hash_index.begin() == 0) + if (key[0].hash == hash) + return key[0].index; else return -1; - else if (key[-1] == hash) - return kv->key_index[key - kv->key_hash.begin() - 1]; - else if (key == kv->key_hash.end()) + else if (key[-1].hash == hash) + return key[-1].index; + else if (key == curr_scope->key_hash_index.end()) return -1; - else if (key[0] == hash) - return kv->key_index[key - kv->key_hash.begin()]; + else if (key[0].hash == hash) + return key[0].index; return -1; } -#define RADIX_BASE 8 +static int64_t key_val_get_key_index(key_val* kv, std::string&& str) { + return key_val_get_key_index(kv, *(std::string*)&str); +} + +#define RADIX_BASE 4 #define RADIX (1 << RADIX_BASE) static void key_val_sort(key_val* kv) { - size_t count = kv->key.size(); + if (!kv->key.size()) + return; - kv->key_hash.resize(count); - kv->key_index.resize(count); + key_val_scope* curr_scope = kv->curr_scope; - char** key = kv->key.data(); - size_t* key_len = kv->key_len.data(); - uint64_t* key_hash = kv->key_hash.data(); - size_t* key_index = kv->key_index.data(); + size_t index = curr_scope->index; + size_t count = curr_scope->count; + + curr_scope->key_hash_index.resize(count); + + key_val_pair* key = kv->key.data() + index; + key_val_hash_index_pair* key_hash_index = curr_scope->key_hash_index.data(); for (size_t i = 0; i < count; i++) { - *key_index++ = i; - *key_hash++ = hash_fnv1a64m((uint8_t*)*key++, *key_len++); + key_hash_index->index = index + i; + key_hash_index->hash = hash_fnv1a64m(key->str, key->length); + key++; + key_hash_index++; } if (count < 2) return; - uint64_t* o_key_hash = (uint64_t*)force_malloc_s(uint64_t, count); - size_t* o_key_index = (size_t*)force_malloc_s(size_t, count); + key_val_hash_index_pair* o_key_hash_index = new key_val_hash_index_pair[count]; size_t* c = (size_t*)force_malloc_s(size_t, (1 << 8)); - uint64_t* arr_key_hash = kv->key_hash.data(); - size_t* arr_key_index = kv->key_index.data(); - uint64_t* org_arr = arr_key_hash; + key_val_hash_index_pair* arr_key_hash_index = curr_scope->key_hash_index.data(); + key_val_hash_index_pair* org_arr = arr_key_hash_index; for (size_t shift = 0, s = 0; shift < sizeof(uint64_t) * 8 / RADIX_BASE; shift++, s += RADIX_BASE) { memset(c, 0, sizeof(size_t) * RADIX); for (size_t i = 0; i < count; i++) - c[(arr_key_hash[i] >> s) & (RADIX - 1)]++; + c[(arr_key_hash_index[i].hash >> s) & (RADIX - 1)]++; for (size_t i = 1; i < RADIX; i++) c[i] += c[i - 1]; for (int64_t i = count - 1; i >= 0; i--) { - size_t index = --c[(arr_key_hash[i] >> s) & (RADIX - 1)]; - o_key_hash[index] = arr_key_hash[i]; - o_key_index[index] = arr_key_index[i]; + size_t index = --c[(arr_key_hash_index[i].hash >> s) & (RADIX - 1)]; + o_key_hash_index[index] = arr_key_hash_index[i]; } - uint64_t* t_key_hash = arr_key_hash; - arr_key_hash = o_key_hash; - o_key_hash = t_key_hash; - - size_t* t_key_index = arr_key_index; - arr_key_index = o_key_index; - o_key_index = t_key_index; + key_val_hash_index_pair* t_key_hash = arr_key_hash_index; + arr_key_hash_index = o_key_hash_index; + o_key_hash_index = t_key_hash; } - if (org_arr == o_key_hash) { - uint64_t* t_key_hash = arr_key_hash; - arr_key_hash = o_key_hash; - o_key_hash = t_key_hash; + if (org_arr == o_key_hash_index) { + key_val_hash_index_pair* t_key_hash_index = arr_key_hash_index; + arr_key_hash_index = o_key_hash_index; + o_key_hash_index = t_key_hash_index; - size_t* t_key_index = arr_key_index; - arr_key_index = o_key_index; - o_key_index = t_key_index; - - memmove(arr_key_hash, o_key_hash, sizeof(uint64_t) * count); - memmove(arr_key_index, o_key_index, sizeof(size_t) * count); + memmove(arr_key_hash_index, o_key_hash_index, sizeof(key_val_hash_index_pair) * count); } - free(o_key_hash); - free(o_key_index); + delete[] o_key_hash_index; free(c); } diff --git a/src/KKdLib/key_val.hpp b/src/KKdLib/key_val.hpp index c4239ad1..2a13274e 100644 --- a/src/KKdLib/key_val.hpp +++ b/src/KKdLib/key_val.hpp @@ -7,54 +7,135 @@ #include #include -#include "default.h" -#include "io/stream.h" -#include "vec.h" -#include "vector.h" +#include "default.hpp" +#include "io/stream.hpp" +#include "vec.hpp" + +struct key_val_hash_index_pair { + uint64_t hash; + size_t index; + + key_val_hash_index_pair(); + key_val_hash_index_pair(uint64_t hash, size_t index); +}; + +struct key_val_scope { + std::string key; + size_t index; + size_t count; + + std::vector key_hash_index; + + key_val_scope(); + ~key_val_scope(); +}; + +struct key_val_pair { + const char* str; + size_t length; + + key_val_pair(); + key_val_pair(const char* str, size_t length); + ~key_val_pair(); +}; struct key_val { - std::vector key; - std::vector key_len; - std::vector val; - std::vector val_len; + key_val_scope* curr_scope; + std::vector scope; + + std::vector key; + std::vector val; char* buf; - std::vector key_hash; - std::vector key_index; key_val(); ~key_val(); + void close_scope(); void file_read(const char* path); void file_read(const wchar_t* path); - bool get_local_key_val(const char* str, key_val* lkv); bool has_key(const char* str); - void parse(void* data, size_t size); - bool read_bool(char* buf, size_t offset, const char* str_add, size_t str_add_len, bool* value); - bool read_float_t(char* buf, size_t offset, const char* str_add, size_t str_add_len, float_t* value); - bool read_int32_t(char* buf, size_t offset, const char* str_add, size_t str_add_len, int32_t* value); - bool read_uint32_t(char* buf, size_t offset, const char* str_add, size_t str_add_len, uint32_t* value); - bool read_string(char* buf, size_t offset, const char* str_add, size_t str_add_len, string* value); - bool read_string(char* buf, size_t offset, const char* str_add, size_t str_add_len, std::string* value); - bool read_string(char* buf, size_t offset, const char* str_add, size_t str_add_len, const char** value); - bool read_vec3(char* buf, size_t offset, const char* str_add, size_t str_add_len, vec3* value); + bool has_key(std::string& str); + bool open_scope(std::string& str); + bool open_scope(std::string&& str); + bool open_scope(int32_t i); + bool open_scope(uint32_t i); + bool open_scope(const char* fmt, ...); + void parse(const void* data, size_t size); + bool read(bool& value); + bool read(float_t& value); + bool read(int32_t& value); + bool read(uint32_t& value); + bool read(const char*& value); + bool read(std::string& value); + bool read(vec3& value); + bool read(std::string& key, bool& value); + bool read(std::string&& key, bool& value); + bool read(std::string& key, float_t& value); + bool read(std::string&& key, float_t& value); + bool read(std::string& key, int32_t& value); + bool read(std::string&& key, int32_t& value); + bool read(std::string& key, uint32_t& value); + bool read(std::string&& key, uint32_t& value); + bool read(std::string& key, const char*& value); + bool read(std::string&& key, const char*& value); + bool read(std::string& key, std::string& value); + bool read(std::string&& key, std::string& value); + bool read(std::string& key, vec3& value); + bool read(std::string&& key, vec3& value); + bool read(std::string& key0, std::string& key1, bool& value); + bool read(std::string&& key0, std::string&& key1, bool& value); + bool read(std::string& key0, std::string& key1, float_t& value); + bool read(std::string&& key0, std::string&& key1, float_t& value); + bool read(std::string& key0, std::string& key1, int32_t& value); + bool read(std::string&& key0, std::string&& key1, int32_t& value); + bool read(std::string& key0, std::string& key1, uint32_t& value); + bool read(std::string&& key0, std::string&& key1, uint32_t& value); + bool read(std::string& key0, std::string& key1, const char*& value); + bool read(std::string&& key0, std::string&& key1, const char*& value); + bool read(std::string& key0, std::string& key1, std::string& value); + bool read(std::string&& key0, std::string&& key1, std::string& value); + bool read(std::string& key0, std::string& key1, vec3& value); + bool read(std::string&& key0, std::string&& key1, vec3& value); + + static bool load_file(void* data, const char* path, const char* file, uint32_t hash); +}; + +struct key_val_out { + std::string* curr_scope; + std::vector scope; + + key_val_out(); + ~key_val_out(); + + void close_scope(); + void open_scope(std::string& str); + void open_scope(std::string&& str); + void open_scope(int32_t i); + void open_scope(uint32_t i); + void write(stream& s, bool value); + void write(stream& s, float_t value); + void write(stream& s, int32_t value); + void write(stream& s, uint32_t value); + void write(stream& s, const char* value); + void write(stream& s, std::string& value); + void write(stream& s, vec3& value); + void write(stream& s, vec3&& value); + void write(stream& s, std::string& key, bool value); + void write(stream& s, std::string&& key, bool value); + void write(stream& s, std::string& key, float_t value); + void write(stream& s, std::string&& key, float_t value); + void write(stream& s, std::string& key, int32_t value); + void write(stream& s, std::string&& key, int32_t value); + void write(stream& s, std::string& key, uint32_t value); + void write(stream& s, std::string&& key, uint32_t value); + void write(stream& s, std::string& key, const char* value); + void write(stream& s, std::string&& key, const char* value); + void write(stream& s, std::string& key, std::string& value); + void write(stream& s, std::string&& key, std::string& value); + void write(stream& s, std::string& key, vec3& value); + void write(stream& s, std::string&& key, vec3& value); + void write(stream& s, std::string& key, vec3&& value); + void write(stream& s, std::string&& key, vec3&& value); static void get_lexicographic_order(std::vector* vec, int32_t length); - static bool load_file(void* data, const char* path, const char* file, uint32_t hash); - static void write_bool(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, bool value); - static void write_float_t(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, float_t value); - static void write_int32_t(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, int32_t value); - static void write_uint32_t(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, uint32_t value); - static void write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, string& value); - static void write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, std::string& value); - static void write_string(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, const char* value); - static void write_vec3(stream* s, char* buf, - size_t offset, const char* str_add, size_t str_add_len, vec3& value); - }; diff --git a/src/KKdLib/kf.c b/src/KKdLib/kf.cpp similarity index 99% rename from src/KKdLib/kf.c rename to src/KKdLib/kf.cpp index 24be5cdc..0f58210f 100644 --- a/src/KKdLib/kf.c +++ b/src/KKdLib/kf.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "kf.h" +#include "kf.hpp" void kft_check(void* src_key, kf_type src_type, void* dst_key, kf_type* dst_type) { switch (src_type) { diff --git a/src/KKdLib/kf.h b/src/KKdLib/kf.hpp similarity index 96% rename from src/KKdLib/kf.h rename to src/KKdLib/kf.hpp index 190ee15c..e66658de 100644 --- a/src/KKdLib/kf.h +++ b/src/KKdLib/kf.hpp @@ -5,7 +5,7 @@ #pragma once -#include "default.h" +#include "default.hpp" enum kf_type { KEY_FRAME_TYPE_0 = 0, diff --git a/src/KKdLib/light_param/face.cpp b/src/KKdLib/light_param/face.cpp index 5c01ee74..ad6c8132 100644 --- a/src/KKdLib/light_param/face.cpp +++ b/src/KKdLib/light_param/face.cpp @@ -4,15 +4,15 @@ */ #include "face.hpp" -#include "../io/path.h" -#include "../io/stream.h" -#include "../str_utils.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" +#include "../str_utils.hpp" -static void light_param_face_read_inner(light_param_face* face, stream* s); -static void light_param_face_write_inner(light_param_face* face, stream* s); +static void light_param_face_read_inner(light_param_face* face, stream& s); +static void light_param_face_write_inner(light_param_face* face, stream& s); static const char* light_param_face_read_line(char* buf, int32_t size, const char* src); -static void light_param_face_write_int32_t(stream* s, char* buf, size_t buf_size, int32_t value); -static void light_param_face_write_float_t(stream* s, char* buf, size_t buf_size, float_t value); +static void light_param_face_write_int32_t(stream& s, char* buf, size_t buf_size, int32_t value); +static void light_param_face_write_float_t(stream& s, char* buf, size_t buf_size, float_t value); light_param_face::light_param_face() : ready(), offset(), scale(), position(), direction() { @@ -22,10 +22,9 @@ void light_param_face::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); if (path_check_file_exists(path_txt)) { stream s; - io_open(&s, path_txt, "rb"); + s.open(path_txt, "rb"); if (s.io.stream) - light_param_face_read_inner(this, &s); - io_free(&s); + light_param_face_read_inner(this, s); } free(path_txt); } @@ -34,19 +33,17 @@ void light_param_face::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); if (path_check_file_exists(path_txt)) { stream s; - io_open(&s, path_txt, L"rb"); + s.open(path_txt, L"rb"); if (s.io.stream) - light_param_face_read_inner(this, &s); - io_free(&s); + light_param_face_read_inner(this, s); } free(path_txt); } void light_param_face::read(const void* data, size_t size) { stream s; - io_open(&s, data, size); - light_param_face_read_inner(this, &s); - io_free(&s); + s.open(data, size); + light_param_face_read_inner(this, s); } void light_param_face::write(const char* path) { @@ -55,10 +52,9 @@ void light_param_face::write(const char* path) { char* path_txt = str_utils_add(path, ".txt"); stream s; - io_open(&s, path_txt, "wb"); + s.open(path_txt, "wb"); if (s.io.stream) - light_param_face_write_inner(this, &s); - io_free(&s); + light_param_face_write_inner(this, s); free(path_txt); } @@ -68,10 +64,9 @@ void light_param_face::write(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); stream s; - io_open(&s, path_txt, L"wb"); + s.open(path_txt, L"wb"); if (s.io.stream) - light_param_face_write_inner(this, &s); - io_free(&s); + light_param_face_write_inner(this, s); free(path_txt); } @@ -80,10 +75,9 @@ void light_param_face::write(void** data, size_t* size) { return; stream s; - io_open(&s); - light_param_face_write_inner(this, &s); - io_copy(&s, data, size); - io_free(&s); + s.open(); + light_param_face_write_inner(this, s); + s.copy(data, size); } light_param_face::~light_param_face() { @@ -105,10 +99,10 @@ bool light_param_face::load_file(void* data, const char* path, const char* file, return face->ready; } -static void light_param_face_read_inner(light_param_face* face, stream* s) { - char* data = force_malloc_s(char, s->length + 1); - io_read(s, data, s->length); - data[s->length] = 0; +static void light_param_face_read_inner(light_param_face* face, stream& s) { + char* data = force_malloc_s(char, s.length + 1); + s.read(data, s.length); + data[s.length] = 0; char buf[0x100]; const char* d = data; @@ -144,33 +138,33 @@ End: free(data); } -static void light_param_face_write_inner(light_param_face* face, stream* s) { +static void light_param_face_write_inner(light_param_face* face, stream& s) { char buf[0x100]; - io_write(s, "offset", 6); + s.write("offset", 6); light_param_face_write_float_t(s, buf, sizeof(buf), face->offset); - io_write_char(s, '\n'); + s.write_char('\n'); - io_write(s, "scale", 5); + s.write("scale", 5); light_param_face_write_float_t(s, buf, sizeof(buf), face->scale); - io_write_char(s, '\n'); + s.write_char('\n'); vec3* position = &face->position; - io_write(s, "position", 8); + s.write("position", 8); light_param_face_write_float_t(s, buf, sizeof(buf), position->x); light_param_face_write_float_t(s, buf, sizeof(buf), position->y); light_param_face_write_float_t(s, buf, sizeof(buf), position->z); - io_write_char(s, '\n'); + s.write_char('\n'); vec3* direction = &face->direction; - io_write(s, "direction", 9); + s.write("direction", 9); light_param_face_write_float_t(s, buf, sizeof(buf), direction->x); light_param_face_write_float_t(s, buf, sizeof(buf), direction->y); light_param_face_write_float_t(s, buf, sizeof(buf), direction->z); - io_write_char(s, '\n'); + s.write_char('\n'); - io_write(s, "EOF", 3); - io_write_char(s, '\n'); + s.write("EOF", 3); + s.write_char('\n'); } static const char* light_param_face_read_line(char* buf, int32_t size, const char* src) { @@ -200,12 +194,12 @@ static const char* light_param_face_read_line(char* buf, int32_t size, const cha return src; } -inline static void light_param_face_write_int32_t(stream* s, char* buf, size_t buf_size, int32_t value) { +inline static void light_param_face_write_int32_t(stream& s, char* buf, size_t buf_size, int32_t value) { sprintf_s(buf, buf_size, " %d", value); - io_write_utf8_string(s, buf); + s.write_utf8_string(buf); } -inline static void light_param_face_write_float_t(stream* s, char* buf, size_t buf_size, float_t value) { +inline static void light_param_face_write_float_t(stream& s, char* buf, size_t buf_size, float_t value) { sprintf_s(buf, buf_size, " %g", value); - io_write_utf8_string(s, buf); + s.write_utf8_string(buf); } diff --git a/src/KKdLib/light_param/face.hpp b/src/KKdLib/light_param/face.hpp index 0d692cbb..3d992dea 100644 --- a/src/KKdLib/light_param/face.hpp +++ b/src/KKdLib/light_param/face.hpp @@ -5,8 +5,8 @@ #pragma once -#include "../default.h" -#include "../vec.h" +#include "../default.hpp" +#include "../vec.hpp" struct light_param_face { bool ready; diff --git a/src/KKdLib/light_param/fog.cpp b/src/KKdLib/light_param/fog.cpp index 16bddeac..90d0bd80 100644 --- a/src/KKdLib/light_param/fog.cpp +++ b/src/KKdLib/light_param/fog.cpp @@ -4,15 +4,15 @@ */ #include "fog.hpp" -#include "../io/path.h" -#include "../io/stream.h" -#include "../str_utils.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" +#include "../str_utils.hpp" -static void light_param_fog_read_inner(light_param_fog* fog, stream* s); -static void light_param_fog_write_inner(light_param_fog* fog, stream* s); +static void light_param_fog_read_inner(light_param_fog* fog, stream& s); +static void light_param_fog_write_inner(light_param_fog* fog, stream& s); static const char* light_param_fog_read_line(char* buf, int32_t size, const char* src); -static void light_param_fog_write_int32_t(stream* s, char* buf, size_t buf_size, int32_t value); -static void light_param_fog_write_float_t(stream* s, char* buf, size_t buf_size, float_t value); +static void light_param_fog_write_int32_t(stream& s, char* buf, size_t buf_size, int32_t value); +static void light_param_fog_write_float_t(stream& s, char* buf, size_t buf_size, float_t value); light_param_fog::light_param_fog() : ready() { @@ -26,10 +26,9 @@ void light_param_fog::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); if (path_check_file_exists(path_txt)) { stream s; - io_open(&s, path_txt, "rb"); + s.open(path_txt, "rb"); if (s.io.stream) - light_param_fog_read_inner(this, &s); - io_free(&s); + light_param_fog_read_inner(this, s); } free(path_txt); } @@ -38,19 +37,17 @@ void light_param_fog::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); if (path_check_file_exists(path_txt)) { stream s; - io_open(&s, path_txt, L"rb"); + s.open(path_txt, L"rb"); if (s.io.stream) - light_param_fog_read_inner(this, &s); - io_free(&s); + light_param_fog_read_inner(this, s); } free(path_txt); } void light_param_fog::read(const void* data, size_t size) { stream s; - io_open(&s, data, size); - light_param_fog_read_inner(this, &s); - io_free(&s); + s.open(data, size); + light_param_fog_read_inner(this, s); } void light_param_fog::write(const char* path) { @@ -59,10 +56,9 @@ void light_param_fog::write(const char* path) { char* path_txt = str_utils_add(path, ".txt"); stream s; - io_open(&s, path_txt, "wb"); + s.open(path_txt, "wb"); if (s.io.stream) - light_param_fog_write_inner(this, &s); - io_free(&s); + light_param_fog_write_inner(this, s); free(path_txt); } @@ -72,10 +68,9 @@ void light_param_fog::write(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); stream s; - io_open(&s, path_txt, L"wb"); + s.open(path_txt, L"wb"); if (s.io.stream) - light_param_fog_write_inner(this, &s); - io_free(&s); + light_param_fog_write_inner(this, s); free(path_txt); } @@ -84,10 +79,9 @@ void light_param_fog::write(void** data, size_t* size) { return; stream s; - io_open(&s); - light_param_fog_write_inner(this, &s); - io_copy(&s, data, size); - io_free(&s); + s.open(); + light_param_fog_write_inner(this, s); + s.copy(data, size); } bool light_param_fog::load_file(void* data, const char* path, const char* file, uint32_t hash) { @@ -114,10 +108,10 @@ light_param_fog_group::~light_param_fog_group() { } -static void light_param_fog_read_inner(light_param_fog* fog, stream* s) { - char* data = force_malloc_s(char, s->length + 1); - io_read(s, data, s->length); - data[s->length] = 0; +static void light_param_fog_read_inner(light_param_fog* fog, stream& s) { + char* data = force_malloc_s(char, s.length + 1); + s.read(data, s.length); + data[s.length] = 0; char buf[0x100]; const char* d = data; @@ -191,51 +185,51 @@ End: free(data); } -static void light_param_fog_write_inner(light_param_fog* fog, stream* s) { +static void light_param_fog_write_inner(light_param_fog* fog, stream& s) { char buf[0x100]; for (int32_t i = FOG_DEPTH; i < FOG_MAX; i++) { light_param_fog_group* group = &fog->group[i]; - io_write(s, "group_start", 11); + s.write("group_start", 11); light_param_fog_write_int32_t(s, buf, sizeof(buf), i); - io_write_char(s, '\n'); + s.write_char('\n'); if (group->has_type) { - io_write(s, "type", 4); + s.write("type", 4); light_param_fog_write_int32_t(s, buf, sizeof(buf), (int32_t)group->type); - io_write_char(s, '\n'); + s.write_char('\n'); } if (group->has_density) { - io_write(s, "density", 7); + s.write("density", 7); light_param_fog_write_float_t(s, buf, sizeof(buf), group->density); - io_write_char(s, '\n'); + s.write_char('\n'); } if (group->has_linear) { - io_write(s, "linear", 6); + s.write("linear", 6); light_param_fog_write_float_t(s, buf, sizeof(buf), group->linear_start); light_param_fog_write_float_t(s, buf, sizeof(buf), group->linear_end); - io_write_char(s, '\n'); + s.write_char('\n'); } if (group->has_color) { vec4u* color = &group->color; - io_write(s, "color", 5); + s.write("color", 5); light_param_fog_write_float_t(s, buf, sizeof(buf), color->x); light_param_fog_write_float_t(s, buf, sizeof(buf), color->y); light_param_fog_write_float_t(s, buf, sizeof(buf), color->z); light_param_fog_write_float_t(s, buf, sizeof(buf), color->w); - io_write_char(s, '\n'); + s.write_char('\n'); } - io_write(s, "group_end", 9); + s.write("group_end", 9); light_param_fog_write_int32_t(s, buf, sizeof(buf), i); - io_write_char(s, '\n'); + s.write_char('\n'); } - io_write(s, "EOF", 3); - io_write_char(s, '\n'); + s.write("EOF", 3); + s.write_char('\n'); } static const char* light_param_fog_read_line(char* buf, int32_t size, const char* src) { @@ -265,12 +259,12 @@ static const char* light_param_fog_read_line(char* buf, int32_t size, const char return src; } -inline static void light_param_fog_write_int32_t(stream* s, char* buf, size_t buf_size, int32_t value) { +inline static void light_param_fog_write_int32_t(stream& s, char* buf, size_t buf_size, int32_t value) { sprintf_s(buf, buf_size, " %d", value); - io_write_utf8_string(s, buf); + s.write_utf8_string(buf); } -inline static void light_param_fog_write_float_t(stream* s, char* buf, size_t buf_size, float_t value) { +inline static void light_param_fog_write_float_t(stream& s, char* buf, size_t buf_size, float_t value) { sprintf_s(buf, buf_size, " %#.6g", value); - io_write_utf8_string(s, buf); + s.write_utf8_string(buf); } diff --git a/src/KKdLib/light_param/fog.hpp b/src/KKdLib/light_param/fog.hpp index b587c7cd..1ba5a5ec 100644 --- a/src/KKdLib/light_param/fog.hpp +++ b/src/KKdLib/light_param/fog.hpp @@ -5,8 +5,8 @@ #pragma once -#include "../default.h" -#include "../vec.h" +#include "../default.hpp" +#include "../vec.hpp" enum fog_id { FOG_DEPTH = 0x00, diff --git a/src/KKdLib/light_param/glow.cpp b/src/KKdLib/light_param/glow.cpp index fc02f9ce..5a076fdd 100644 --- a/src/KKdLib/light_param/glow.cpp +++ b/src/KKdLib/light_param/glow.cpp @@ -4,15 +4,15 @@ */ #include "glow.hpp" -#include "../io/path.h" -#include "../io/stream.h" -#include "../str_utils.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" +#include "../str_utils.hpp" -static void light_param_glow_read_inner(light_param_glow* glow, stream* s); -static void light_param_glow_write_inner(light_param_glow* glow, stream* s); +static void light_param_glow_read_inner(light_param_glow* glow, stream& s); +static void light_param_glow_write_inner(light_param_glow* glow, stream& s); static const char* light_param_glow_read_line(char* buf, int32_t size, const char* src); -static void light_param_glow_write_int32_t(stream* s, char* buf, size_t buf_size, int32_t value); -static void light_param_glow_write_float_t(stream* s, char* buf, size_t buf_size, float_t value); +static void light_param_glow_write_int32_t(stream& s, char* buf, size_t buf_size, int32_t value); +static void light_param_glow_write_float_t(stream& s, char* buf, size_t buf_size, float_t value); light_param_glow::light_param_glow() : ready(), has_exposure(), exposure(), has_gamma(), gamma(), has_saturate_power(), saturate_power(), has_saturate_coef(), saturate_coef(), has_flare(), flare(), @@ -30,10 +30,9 @@ void light_param_glow::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); if (path_check_file_exists(path_txt)) { stream s; - io_open(&s, path_txt, "rb"); + s.open(path_txt, "rb"); if (s.io.stream) - light_param_glow_read_inner(this, &s); - io_free(&s); + light_param_glow_read_inner(this, s); } free(path_txt); } @@ -42,19 +41,17 @@ void light_param_glow::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); if (path_check_file_exists(path_txt)) { stream s; - io_open(&s, path_txt, L"rb"); + s.open(path_txt, L"rb"); if (s.io.stream) - light_param_glow_read_inner(this, &s); - io_free(&s); + light_param_glow_read_inner(this, s); } free(path_txt); } void light_param_glow::read(const void* data, size_t size) { stream s; - io_open(&s, data, size); - light_param_glow_read_inner(this, &s); - io_free(&s); + s.open(data, size); + light_param_glow_read_inner(this, s); } void light_param_glow::write(const char* path) { @@ -63,10 +60,9 @@ void light_param_glow::write(const char* path) { char* path_txt = str_utils_add(path, ".txt"); stream s; - io_open(&s, path_txt, "wb"); + s.open(path_txt, "wb"); if (s.io.stream) - light_param_glow_write_inner(this, &s); - io_free(&s); + light_param_glow_write_inner(this, s); free(path_txt); } @@ -76,10 +72,9 @@ void light_param_glow::write(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); stream s; - io_open(&s, path_txt, L"wb"); + s.open(path_txt, L"wb"); if (s.io.stream) - light_param_glow_write_inner(this, &s); - io_free(&s); + light_param_glow_write_inner(this, s); free(path_txt); } @@ -88,10 +83,9 @@ void light_param_glow::write(void** data, size_t* size) { return; stream s; - io_open(&s); - light_param_glow_write_inner(this, &s); - io_copy(&s, data, size); - io_free(&s); + s.open(); + light_param_glow_write_inner(this, s); + s.copy(data, size); } bool light_param_glow::load_file(void* data, const char* path, const char* file, uint32_t hash) { @@ -109,10 +103,10 @@ bool light_param_glow::load_file(void* data, const char* path, const char* file, return glow->ready; } -static void light_param_glow_read_inner(light_param_glow* glow, stream* s) { - char* data = force_malloc_s(char, s->length + 1); - io_read(s, data, s->length); - data[s->length] = 0; +static void light_param_glow_read_inner(light_param_glow* glow, stream& s) { + char* data = force_malloc_s(char, s.length + 1); + s.read(data, s.length); + data[s.length] = 0; char buf[0x100]; const char* d = data; @@ -208,99 +202,99 @@ End: free(data); } -static void light_param_glow_write_inner(light_param_glow* glow, stream* s) { +static void light_param_glow_write_inner(light_param_glow* glow, stream& s) { char buf[0x100]; if (glow->has_exposure) { - io_write(s, "exposure", 8); + s.write("exposure", 8); light_param_glow_write_float_t(s, buf, sizeof(buf), glow->exposure); - io_write_char(s, '\n'); + s.write_char('\n'); } if (glow->has_gamma) { - io_write(s, "gamma", 5); + s.write("gamma", 5); light_param_glow_write_float_t(s, buf, sizeof(buf), glow->gamma); - io_write_char(s, '\n'); + s.write_char('\n'); } if (glow->has_saturate_power) { - io_write(s, "saturate_power", 14); + s.write("saturate_power", 14); light_param_glow_write_int32_t(s, buf, sizeof(buf), glow->saturate_power); - io_write_char(s, '\n'); + s.write_char('\n'); } if (glow->has_saturate_coef) { - io_write(s, "saturate_coef", 13); + s.write("saturate_coef", 13); light_param_glow_write_float_t(s, buf, sizeof(buf), glow->saturate_coef); - io_write_char(s, '\n'); + s.write_char('\n'); } if (glow->has_flare) { vec3* flare = &glow->flare; - io_write(s, "flare", 5); + s.write("flare", 5); light_param_glow_write_float_t(s, buf, sizeof(buf), flare->x); light_param_glow_write_float_t(s, buf, sizeof(buf), flare->y); light_param_glow_write_float_t(s, buf, sizeof(buf), flare->z); - io_write_char(s, '\n'); + s.write_char('\n'); } if (glow->has_sigma) { vec3* sigma = &glow->sigma; - io_write(s, "sigma", 5); + s.write("sigma", 5); light_param_glow_write_float_t(s, buf, sizeof(buf), sigma->x); light_param_glow_write_float_t(s, buf, sizeof(buf), sigma->y); light_param_glow_write_float_t(s, buf, sizeof(buf), sigma->z); - io_write_char(s, '\n'); + s.write_char('\n'); } if (glow->has_intensity) { vec3* intensity = &glow->intensity; - io_write(s, "intensity", 9); + s.write("intensity", 9); light_param_glow_write_float_t(s, buf, sizeof(buf), intensity->x); light_param_glow_write_float_t(s, buf, sizeof(buf), intensity->y); light_param_glow_write_float_t(s, buf, sizeof(buf), intensity->z); - io_write_char(s, '\n'); + s.write_char('\n'); } if (glow->has_auto_exposure) { - io_write(s, "exposure", 8); + s.write("exposure", 8); light_param_glow_write_int32_t(s, buf, sizeof(buf), glow->auto_exposure ? 1 : 0); - io_write_char(s, '\n'); + s.write_char('\n'); } if (glow->has_tone_map_method) { - io_write(s, "tone_map_method", 15); + s.write("tone_map_method", 15); light_param_glow_write_int32_t(s, buf, sizeof(buf), (int32_t)glow->tone_map_method); - io_write_char(s, '\n'); + s.write_char('\n'); } if (glow->has_fade_color) { vec4u* fade_color = &glow->fade_color; int32_t blend_func = glow->fade_color_blend_func; - io_write(s, "fade_color", 10); + s.write("fade_color", 10); light_param_glow_write_float_t(s, buf, sizeof(buf), fade_color->x); light_param_glow_write_float_t(s, buf, sizeof(buf), fade_color->y); light_param_glow_write_float_t(s, buf, sizeof(buf), fade_color->z); light_param_glow_write_float_t(s, buf, sizeof(buf), fade_color->w); light_param_glow_write_int32_t(s, buf, sizeof(buf), blend_func); - io_write_char(s, '\n'); + s.write_char('\n'); } if (glow->has_tone_transform) { vec3* start = &glow->tone_transform_start; vec3* end = &glow->tone_transform_end; - io_write(s, "tone_transform", 14); + s.write("tone_transform", 14); light_param_glow_write_float_t(s, buf, sizeof(buf), start->x); light_param_glow_write_float_t(s, buf, sizeof(buf), start->y); light_param_glow_write_float_t(s, buf, sizeof(buf), start->z); light_param_glow_write_float_t(s, buf, sizeof(buf), end->x); light_param_glow_write_float_t(s, buf, sizeof(buf), end->y); light_param_glow_write_float_t(s, buf, sizeof(buf), end->z); - io_write_char(s, '\n'); + s.write_char('\n'); } - io_write(s, "EOF", 3); - io_write_char(s, '\n'); + s.write("EOF", 3); + s.write_char('\n'); } static const char* light_param_glow_read_line(char* buf, int32_t size, const char* src) { @@ -330,12 +324,12 @@ static const char* light_param_glow_read_line(char* buf, int32_t size, const cha return src; } -inline static void light_param_glow_write_int32_t(stream* s, char* buf, size_t buf_size, int32_t value) { +inline static void light_param_glow_write_int32_t(stream& s, char* buf, size_t buf_size, int32_t value) { sprintf_s(buf, buf_size, " %d", value); - io_write_utf8_string(s, buf); + s.write_utf8_string(buf); } -inline static void light_param_glow_write_float_t(stream* s, char* buf, size_t buf_size, float_t value) { +inline static void light_param_glow_write_float_t(stream& s, char* buf, size_t buf_size, float_t value) { sprintf_s(buf, buf_size, " %#.6g", value); - io_write_utf8_string(s, buf); + s.write_utf8_string(buf); } diff --git a/src/KKdLib/light_param/glow.hpp b/src/KKdLib/light_param/glow.hpp index f1be1a00..66d15277 100644 --- a/src/KKdLib/light_param/glow.hpp +++ b/src/KKdLib/light_param/glow.hpp @@ -5,8 +5,8 @@ #pragma once -#include "../default.h" -#include "../vec.h" +#include "../default.hpp" +#include "../vec.hpp" enum tone_map_method { TONE_MAP_YCC_EXPONENT = 0, diff --git a/src/KKdLib/light_param/ibl.cpp b/src/KKdLib/light_param/ibl.cpp index feea4f20..a0f09310 100644 --- a/src/KKdLib/light_param/ibl.cpp +++ b/src/KKdLib/light_param/ibl.cpp @@ -4,11 +4,11 @@ */ #include "ibl.hpp" -#include "../io/path.h" -#include "../io/stream.h" -#include "../str_utils.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" +#include "../str_utils.hpp" -static void light_param_ibl_read_inner(light_param_ibl* ibl, stream* s); +static void light_param_ibl_read_inner(light_param_ibl* ibl, stream& s); static const char* light_param_ibl_read_line(char* buf, int32_t size, const char* src); static void light_param_ibl_specular_generate_mipmaps(light_param_ibl_specular* specular); static void light_param_ibl_specular_generate_mipmap(float_t* src, float_t* dst, size_t size); @@ -25,10 +25,9 @@ void light_param_ibl::read(const char* path) { char* path_ibl = str_utils_add(path, ".ibl"); if (path_check_file_exists(path_ibl)) { stream s; - io_open(&s, path_ibl, "rb"); + s.open(path_ibl, "rb"); if (s.io.stream) - light_param_ibl_read_inner(this, &s); - io_free(&s); + light_param_ibl_read_inner(this, s); } free(path_ibl); } @@ -37,19 +36,17 @@ void light_param_ibl::read(const wchar_t* path) { wchar_t* path_ibl = str_utils_add(path, L".ibl"); if (path_check_file_exists(path_ibl)) { stream s; - io_open(&s, path_ibl, L"rb"); + s.open(path_ibl, L"rb"); if (s.io.stream) - light_param_ibl_read_inner(this, &s); - io_free(&s); + light_param_ibl_read_inner(this, s); } free(path_ibl); } void light_param_ibl::read(const void* data, size_t size) { stream s; - io_open(&s, data, size); - light_param_ibl_read_inner(this, &s); - io_free(&s); + s.open(data, size); + light_param_ibl_read_inner(this, s); } bool light_param_ibl::load_file(void* data, const char* path, const char* file, uint32_t hash) { @@ -83,10 +80,10 @@ light_param_ibl_specular::~light_param_ibl_specular() { } -static void light_param_ibl_read_inner(light_param_ibl* ibl, stream* s) { - char* data = force_malloc_s(char, s->length + 1); - io_read(s, data, s->length); - data[s->length] = 0; +static void light_param_ibl_read_inner(light_param_ibl* ibl, stream& s) { + char* data = force_malloc_s(char, s.length + 1); + s.read(data, s.length); + data[s.length] = 0; char buf[0x100]; const char* d = light_param_ibl_read_line(buf, sizeof(buf), data); diff --git a/src/KKdLib/light_param/ibl.hpp b/src/KKdLib/light_param/ibl.hpp index b89ef077..a473dd95 100644 --- a/src/KKdLib/light_param/ibl.hpp +++ b/src/KKdLib/light_param/ibl.hpp @@ -6,10 +6,10 @@ #pragma once #include -#include "../default.h" -#include "../half_t.h" -#include "../mat.h" -#include "../vec.h" +#include "../default.hpp" +#include "../half_t.hpp" +#include "../mat.hpp" +#include "../vec.hpp" struct light_param_ibl_diffuse { std::vector data; diff --git a/src/KKdLib/light_param/light.cpp b/src/KKdLib/light_param/light.cpp index 98c53e78..368d23a4 100644 --- a/src/KKdLib/light_param/light.cpp +++ b/src/KKdLib/light_param/light.cpp @@ -4,15 +4,15 @@ */ #include "light.hpp" -#include "../io/path.h" -#include "../io/stream.h" -#include "../str_utils.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" +#include "../str_utils.hpp" -static void light_param_light_read_inner(light_param_light* light, stream* s); -static void light_param_light_write_inner(light_param_light* light, stream* s); +static void light_param_light_read_inner(light_param_light* light, stream& s); +static void light_param_light_write_inner(light_param_light* light, stream& s); static const char* light_param_light_read_line(char* buf, int32_t size, const char* src); -static void light_param_light_write_int32_t(stream* s, char* buf, size_t buf_size, int32_t value); -static void light_param_light_write_float_t(stream* s, char* buf, size_t buf_size, float_t value); +static void light_param_light_write_int32_t(stream& s, char* buf, size_t buf_size, int32_t value); +static void light_param_light_write_float_t(stream& s, char* buf, size_t buf_size, float_t value); light_param_light::light_param_light() : ready() { @@ -26,10 +26,9 @@ void light_param_light::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); if (path_check_file_exists(path_txt)) { stream s; - io_open(&s, path_txt, "rb"); + s.open(path_txt, "rb"); if (s.io.stream) - light_param_light_read_inner(this, &s); - io_free(&s); + light_param_light_read_inner(this, s); } free(path_txt); } @@ -38,19 +37,17 @@ void light_param_light::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); if (path_check_file_exists(path_txt)) { stream s; - io_open(&s, path_txt, L"rb"); + s.open(path_txt, L"rb"); if (s.io.stream) - light_param_light_read_inner(this, &s); - io_free(&s); + light_param_light_read_inner(this, s); } free(path_txt); } void light_param_light::read(const void* data, size_t size) { stream s; - io_open(&s, data, size); - light_param_light_read_inner(this, &s); - io_free(&s); + s.open(data, size); + light_param_light_read_inner(this, s); } void light_param_light::write(const char* path) { @@ -59,10 +56,9 @@ void light_param_light::write(const char* path) { char* path_txt = str_utils_add(path, ".txt"); stream s; - io_open(&s, path_txt, "wb"); + s.open(path_txt, "wb"); if (s.io.stream) - light_param_light_write_inner(this, &s); - io_free(&s); + light_param_light_write_inner(this, s); free(path_txt); } @@ -72,10 +68,9 @@ void light_param_light::write(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); stream s; - io_open(&s, path_txt, L"wb"); + s.open(path_txt, L"wb"); if (s.io.stream) - light_param_light_write_inner(this, &s); - io_free(&s); + light_param_light_write_inner(this, s); free(path_txt); } @@ -84,10 +79,9 @@ void light_param_light::write(void** data, size_t* size) { return; stream s; - io_open(&s); - light_param_light_write_inner(this, &s); - io_copy(&s, data, size); - io_free(&s); + s.open(); + light_param_light_write_inner(this, s); + s.copy(data, size); } bool light_param_light::load_file(void* data, const char* path, const char* file, uint32_t hash) { @@ -124,10 +118,10 @@ light_param_light_group::~light_param_light_group() { } -static void light_param_light_read_inner(light_param_light* light, stream* s) { - char* data = force_malloc_s(char, s->length + 1); - io_read(s, data, s->length); - data[s->length] = 0; +static void light_param_light_read_inner(light_param_light* light, stream& s) { + char* data = force_malloc_s(char, s.length + 1); + s.read(data, s.length); + data[s.length] = 0; char buf[0x100]; const char* d = data; @@ -288,130 +282,130 @@ End: free(data); } -static void light_param_light_write_inner(light_param_light* light, stream* s) { +static void light_param_light_write_inner(light_param_light* light, stream& s) { char buf[0x100]; for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++) { light_param_light_group* group = &light->group[i]; - io_write(s, "group_start", 11); + s.write("group_start", 11); light_param_light_write_int32_t(s, buf, sizeof(buf), i); - io_write_char(s, '\n'); + s.write_char('\n'); for (int32_t j = LIGHT_CHARA; j < LIGHT_MAX; j++) { light_param_light_data* light = &group->data[j]; - io_write(s, "id_start", 8); + s.write("id_start", 8); light_param_light_write_int32_t(s, buf, sizeof(buf), j); - io_write_char(s, '\n'); + s.write_char('\n'); if (light->has_type) { - io_write(s, "type", 4); + s.write("type", 4); light_param_light_write_int32_t(s, buf, sizeof(buf), (int32_t)light->type); - io_write_char(s, '\n'); + s.write_char('\n'); } if (light->has_ambient) { vec4u* ambient = &light->ambient; - io_write(s, "ambient", 7); + s.write("ambient", 7); light_param_light_write_float_t(s, buf, sizeof(buf), ambient->x); light_param_light_write_float_t(s, buf, sizeof(buf), ambient->y); light_param_light_write_float_t(s, buf, sizeof(buf), ambient->z); light_param_light_write_float_t(s, buf, sizeof(buf), ambient->w); - io_write_char(s, '\n'); + s.write_char('\n'); } if (light->has_diffuse) { vec4u* diffuse = &light->diffuse; - io_write(s, "diffuse", 7); + s.write("diffuse", 7); light_param_light_write_float_t(s, buf, sizeof(buf), diffuse->x); light_param_light_write_float_t(s, buf, sizeof(buf), diffuse->y); light_param_light_write_float_t(s, buf, sizeof(buf), diffuse->z); light_param_light_write_float_t(s, buf, sizeof(buf), diffuse->w); - io_write_char(s, '\n'); + s.write_char('\n'); } if (light->has_specular) { vec4u* specular = &light->specular; - io_write(s, "specular", 8); + s.write("specular", 8); light_param_light_write_float_t(s, buf, sizeof(buf), specular->x); light_param_light_write_float_t(s, buf, sizeof(buf), specular->y); light_param_light_write_float_t(s, buf, sizeof(buf), specular->z); light_param_light_write_float_t(s, buf, sizeof(buf), specular->w); - io_write_char(s, '\n'); + s.write_char('\n'); } if (light->has_position) { vec3* position = &light->position; - io_write(s, "position", 8); + s.write("position", 8); light_param_light_write_float_t(s, buf, sizeof(buf), position->x); light_param_light_write_float_t(s, buf, sizeof(buf), position->y); light_param_light_write_float_t(s, buf, sizeof(buf), position->z); light_param_light_write_float_t(s, buf, sizeof(buf), 0.0f); - io_write_char(s, '\n'); + s.write_char('\n'); } if (light->has_spot_direction) { vec3* spot_direction = &light->spot_direction; - io_write(s, "spot_direction", 14); + s.write("spot_direction", 14); light_param_light_write_float_t(s, buf, sizeof(buf), spot_direction->x); light_param_light_write_float_t(s, buf, sizeof(buf), spot_direction->y); light_param_light_write_float_t(s, buf, sizeof(buf), spot_direction->z); - io_write_char(s, '\n'); + s.write_char('\n'); } if (light->has_spot_exponent) { float_t spot_exponent = light->spot_exponent; - io_write(s, "spot_exponent", 13); + s.write("spot_exponent", 13); light_param_light_write_float_t(s, buf, sizeof(buf), spot_exponent); - io_write_char(s, '\n'); + s.write_char('\n'); } if (light->has_spot_cutoff) { float_t spot_cutoff = light->spot_cutoff; - io_write(s, "spot_cutoff", 11); + s.write("spot_cutoff", 11); light_param_light_write_float_t(s, buf, sizeof(buf), spot_cutoff); - io_write_char(s, '\n'); + s.write_char('\n'); } if (light->has_attenuation) { vec3* attenuation = &light->attenuation; - io_write(s, "attenuation", 11); + s.write("attenuation", 11); light_param_light_write_float_t(s, buf, sizeof(buf), attenuation->x); light_param_light_write_float_t(s, buf, sizeof(buf), attenuation->y); light_param_light_write_float_t(s, buf, sizeof(buf), attenuation->z); - io_write_char(s, '\n'); + s.write_char('\n'); } if (light->has_clip_plane) { bool* clip_plane = light->clip_plane; - io_write(s, "clipplane", 10); + s.write("clipplane", 10); light_param_light_write_int32_t(s, buf, sizeof(buf), clip_plane[0] ? 1 : 0); light_param_light_write_int32_t(s, buf, sizeof(buf), clip_plane[1] ? 1 : 0); light_param_light_write_int32_t(s, buf, sizeof(buf), clip_plane[2] ? 1 : 0); light_param_light_write_int32_t(s, buf, sizeof(buf), clip_plane[3] ? 1 : 0); - io_write_char(s, '\n'); + s.write_char('\n'); } if (light->has_tone_curve) { vec3* tone_curve = &light->tone_curve; - io_write(s, "tonecurve", 10); + s.write("tonecurve", 10); light_param_light_write_float_t(s, buf, sizeof(buf), tone_curve->x); light_param_light_write_float_t(s, buf, sizeof(buf), tone_curve->y); light_param_light_write_float_t(s, buf, sizeof(buf), tone_curve->z); - io_write_char(s, '\n'); + s.write_char('\n'); } - io_write(s, "id_end", 6); + s.write("id_end", 6); light_param_light_write_int32_t(s, buf, sizeof(buf), j); - io_write_char(s, '\n'); + s.write_char('\n'); } - io_write(s, "group_end", 9); + s.write("group_end", 9); light_param_light_write_int32_t(s, buf, sizeof(buf), i); - io_write_char(s, '\n'); + s.write_char('\n'); } - io_write(s, "EOF", 3); - io_write_char(s, '\n'); + s.write("EOF", 3); + s.write_char('\n'); } static const char* light_param_light_read_line(char* buf, int32_t size, const char* src) { @@ -441,12 +435,12 @@ static const char* light_param_light_read_line(char* buf, int32_t size, const ch return src; } -inline static void light_param_light_write_int32_t(stream* s, char* buf, size_t buf_size, int32_t value) { +inline static void light_param_light_write_int32_t(stream& s, char* buf, size_t buf_size, int32_t value) { sprintf_s(buf, buf_size, " %d", value); - io_write_utf8_string(s, buf); + s.write_utf8_string(buf); } -inline static void light_param_light_write_float_t(stream* s, char* buf, size_t buf_size, float_t value) { +inline static void light_param_light_write_float_t(stream& s, char* buf, size_t buf_size, float_t value) { sprintf_s(buf, buf_size, " %#.6g", value); - io_write_utf8_string(s, buf); + s.write_utf8_string(buf); } diff --git a/src/KKdLib/light_param/light.hpp b/src/KKdLib/light_param/light.hpp index ce795f4c..128ebfbb 100644 --- a/src/KKdLib/light_param/light.hpp +++ b/src/KKdLib/light_param/light.hpp @@ -5,8 +5,8 @@ #pragma once -#include "../default.h" -#include "../vec.h" +#include "../default.hpp" +#include "../vec.hpp" enum light_id { LIGHT_CHARA = 0x00, diff --git a/src/KKdLib/light_param/wind.cpp b/src/KKdLib/light_param/wind.cpp index 33ba316a..e027beb3 100644 --- a/src/KKdLib/light_param/wind.cpp +++ b/src/KKdLib/light_param/wind.cpp @@ -4,15 +4,15 @@ */ #include "wind.hpp" -#include "../io/path.h" -#include "../io/stream.h" -#include "../str_utils.h" +#include "../io/path.hpp" +#include "../io/stream.hpp" +#include "../str_utils.hpp" -static void light_param_wind_read_inner(light_param_wind* wind, stream* s); -static void light_param_wind_write_inner(light_param_wind* wind, stream* s); +static void light_param_wind_read_inner(light_param_wind* wind, stream& s); +static void light_param_wind_write_inner(light_param_wind* wind, stream& s); static const char* light_param_wind_read_line(char* buf, int32_t size, const char* src); -static void light_param_wind_write_int32_t(stream* s, char* buf, size_t buf_size, int32_t value); -static void light_param_wind_write_float_t(stream* s, char* buf, size_t buf_size, float_t value); +static void light_param_wind_write_int32_t(stream& s, char* buf, size_t buf_size, int32_t value); +static void light_param_wind_write_float_t(stream& s, char* buf, size_t buf_size, float_t value); light_param_wind::light_param_wind() : ready(), has_scale(), scale(), has_cycle(), cycle(), has_rot(), rot_y(), rot_z(), has_bias(), bias(), has_spc(), spc() { @@ -27,10 +27,9 @@ void light_param_wind::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); if (path_check_file_exists(path_txt)) { stream s; - io_open(&s, path_txt, "rb"); + s.open(path_txt, "rb"); if (s.io.stream) - light_param_wind_read_inner(this, &s); - io_free(&s); + light_param_wind_read_inner(this, s); } free(path_txt); } @@ -39,19 +38,17 @@ void light_param_wind::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); if (path_check_file_exists(path_txt)) { stream s; - io_open(&s, path_txt, L"rb"); + s.open(path_txt, L"rb"); if (s.io.stream) - light_param_wind_read_inner(this, &s); - io_free(&s); + light_param_wind_read_inner(this, s); } free(path_txt); } void light_param_wind::read(const void* data, size_t size) { stream s; - io_open(&s, data, size); - light_param_wind_read_inner(this, &s); - io_free(&s); + s.open(data, size); + light_param_wind_read_inner(this, s); } void light_param_wind::write(const char* path) { @@ -60,10 +57,9 @@ void light_param_wind::write(const char* path) { char* path_txt = str_utils_add(path, ".txt"); stream s; - io_open(&s, path_txt, "wb"); + s.open(path_txt, "wb"); if (s.io.stream) - light_param_wind_write_inner(this, &s); - io_free(&s); + light_param_wind_write_inner(this, s); free(path_txt); } @@ -73,10 +69,9 @@ void light_param_wind::write(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); stream s; - io_open(&s, path_txt, L"wb"); + s.open(path_txt, L"wb"); if (s.io.stream) - light_param_wind_write_inner(this, &s); - io_free(&s); + light_param_wind_write_inner(this, s); free(path_txt); } @@ -85,10 +80,9 @@ void light_param_wind::write(void** data, size_t* size) { return; stream s; - io_open(&s); - light_param_wind_write_inner(this, &s); - io_copy(&s, data, size); - io_free(&s); + s.open(); + light_param_wind_write_inner(this, s); + s.copy(data, size); } bool light_param_wind::load_file(void* data, const char* path, const char* file, uint32_t hash) { @@ -114,10 +108,10 @@ light_param_wind_spc::~light_param_wind_spc() { } -static void light_param_wind_read_inner(light_param_wind* wind, stream* s) { - char* data = force_malloc_s(char, s->length + 1); - io_read(s, data, s->length); - data[s->length] = 0; +static void light_param_wind_read_inner(light_param_wind* wind, stream& s) { + char* data = force_malloc_s(char, s.length + 1); + s.read(data, s.length); + data[s.length] = 0; char buf[0x100]; const char* d = data; @@ -170,41 +164,41 @@ End: free(data); } -static void light_param_wind_write_inner(light_param_wind* wind, stream* s) { +static void light_param_wind_write_inner(light_param_wind* wind, stream& s) { char buf[0x100]; if (wind->has_scale) { - io_write(s, "scale", 5); + s.write("scale", 5); light_param_wind_write_float_t(s, buf, sizeof(buf), wind->scale); - io_write_char(s, '\n'); + s.write_char('\n'); } if (wind->has_cycle) { - io_write(s, "cycle", 5); + s.write("cycle", 5); light_param_wind_write_float_t(s, buf, sizeof(buf), wind->cycle); - io_write_char(s, '\n'); + s.write_char('\n'); } if (wind->has_rot) { - io_write(s, "rot", 3); + s.write("rot", 3); light_param_wind_write_float_t(s, buf, sizeof(buf), wind->rot_y); light_param_wind_write_float_t(s, buf, sizeof(buf), wind->rot_z); - io_write_char(s, '\n'); + s.write_char('\n'); } if (wind->has_bias) { - io_write(s, "bias", 4); + s.write("bias", 4); light_param_wind_write_float_t(s, buf, sizeof(buf), wind->bias); - io_write_char(s, '\n'); + s.write_char('\n'); } for (int32_t i = 0; i < 16; i++) if (wind->has_spc[i]) { - io_write(s, "spc", 3); + s.write("spc", 3); light_param_wind_write_int32_t(s, buf, sizeof(buf), i); light_param_wind_write_float_t(s, buf, sizeof(buf), wind->spc[i].cos); light_param_wind_write_float_t(s, buf, sizeof(buf), wind->spc[i].sin); - io_write_char(s, '\n'); + s.write_char('\n'); } } @@ -235,12 +229,12 @@ static const char* light_param_wind_read_line(char* buf, int32_t size, const cha return src; } -inline static void light_param_wind_write_int32_t(stream* s, char* buf, size_t buf_size, int32_t value) { +inline static void light_param_wind_write_int32_t(stream& s, char* buf, size_t buf_size, int32_t value) { sprintf_s(buf, buf_size, " %d", value); - io_write_utf8_string(s, buf); + s.write_utf8_string(buf); } -inline static void light_param_wind_write_float_t(stream* s, char* buf, size_t buf_size, float_t value) { +inline static void light_param_wind_write_float_t(stream& s, char* buf, size_t buf_size, float_t value) { sprintf_s(buf, buf_size, " %g", value); - io_write_utf8_string(s, buf); + s.write_utf8_string(buf); } diff --git a/src/KKdLib/light_param/wind.hpp b/src/KKdLib/light_param/wind.hpp index 8a306912..37f25714 100644 --- a/src/KKdLib/light_param/wind.hpp +++ b/src/KKdLib/light_param/wind.hpp @@ -5,8 +5,8 @@ #pragma once -#include "../default.h" -#include "../vec.h" +#include "../default.hpp" +#include "../vec.hpp" struct light_param_wind_spc { float_t cos; diff --git a/src/KKdLib/mat.c b/src/KKdLib/mat.cpp similarity index 99% rename from src/KKdLib/mat.c rename to src/KKdLib/mat.cpp index 666df0d2..652172f8 100644 --- a/src/KKdLib/mat.c +++ b/src/KKdLib/mat.cpp @@ -4,7 +4,7 @@ Matrix Inverse algo: https://github.com/niswegmann/small-matrix-inverse */ -#include "mat.h" +#include "mat.hpp" const mat3 mat3_identity = { { 1.0f, 0.0f, 0.0f }, @@ -46,13 +46,6 @@ const mat4u mat4u_null = { { 0.0f, 0.0f, 0.0f, 0.0f }, }; -vector_old_func(mat3) -vector_old_func(mat4) -vector_old_ptr_func(mat3) -vector_old_ptr_func(mat4) - -// Crutch for vector_old_func definition - inline void mat3_add(const mat3* x, const mat3* y, mat3* z) { __m128 xt; __m128 yt; diff --git a/src/KKdLib/mat.h b/src/KKdLib/mat.hpp similarity index 98% rename from src/KKdLib/mat.h rename to src/KKdLib/mat.hpp index 7908aaa4..08d493b3 100644 --- a/src/KKdLib/mat.h +++ b/src/KKdLib/mat.hpp @@ -5,9 +5,9 @@ #pragma once -#include "default.h" -#include "vec.h" -#include "quat.h" +#include "default.hpp" +#include "vec.hpp" +#include "quat.hpp" struct mat3 { vec3 row0; @@ -43,11 +43,6 @@ extern const mat4 mat4_null; extern const mat4u mat4u_identity; extern const mat4u mat4u_null; -vector_old(mat3) -vector_old(mat4) -vector_old_ptr(mat3) -vector_old_ptr(mat4) - extern void mat3_add(const mat3* x, const mat3* y, mat3* z); extern void mat3_sub(const mat3* x, const mat3* y, mat3* z); extern void mat3_mult(const mat3* x, const mat3* y, mat3* z); diff --git a/src/KKdLib/mot.cpp b/src/KKdLib/mot.cpp index f064ffa7..95d36351 100644 --- a/src/KKdLib/mot.cpp +++ b/src/KKdLib/mot.cpp @@ -5,11 +5,12 @@ #include "mot.hpp" #include "f2/struct.hpp" -#include "io/path.h" -#include "io/stream.h" -#include "half_t.h" +#include "io/path.hpp" +#include "io/stream.hpp" +#include "interpolation.h" +#include "half_t.hpp" #include "hash.hpp" -#include "str_utils.h" +#include "str_utils.hpp" struct mot_header_classic { uint32_t key_set_count_offset; @@ -29,10 +30,10 @@ struct mot_header_modern { int32_t bone_info_count; }; -static void mot_classic_read_inner(mot_set* ms, stream* s); -static void mot_classic_write_inner(mot_set* ms, stream* s); -static void mot_modern_read_inner(mot_set* ms, stream* s); -static void mot_modern_write_inner(mot_set* ms, stream* s); +static void mot_classic_read_inner(mot_set* ms, stream& s); +static void mot_classic_write_inner(mot_set* ms, stream& s); +static void mot_modern_read_inner(mot_set* ms, stream& s); +static void mot_modern_write_inner(mot_set* ms, stream& s); mot_bone_info::mot_bone_info() : index() { @@ -72,13 +73,12 @@ void mot_set::pack_file(void** data, size_t* size) { return; stream s; - io_open(&s); + s.open(); if (!modern) - mot_classic_write_inner(this, &s); + mot_classic_write_inner(this, s); else - mot_modern_write_inner(this, &s); - io_copy(&s, data, size); - io_free(&s); + mot_modern_write_inner(this, s); + s.copy(data, size); } void mot_set::unpack_file(const void* data, size_t size, bool modern) { @@ -86,18 +86,236 @@ void mot_set::unpack_file(const void* data, size_t size, bool modern) { return; stream s; - io_open(&s, data, size); + s.open(data, size); if (!modern) - mot_classic_read_inner(this, &s); + mot_classic_read_inner(this, s); else - mot_modern_read_inner(this, &s); - io_free(&s); + mot_modern_read_inner(this, s); } -static void mot_classic_read_inner(mot_set* ms, stream* s) { +inline static float_t interpolate_mot_value(float_t p1, float_t p2, + float_t t1, float_t t2, float_t f1, float_t f2, float_t f) { + float_t df = f - f1; + float_t t = df / (f2 - f1); + float_t t_1 = t - 1.0f; + return (t_1 * t1 + t * t2) * t_1 * df + (t * 2.0f - 3.0f) * (t * t) * (p1 - p2) + p1; +} + +inline static void interpolate_mot_reverse_value(float_t* arr, size_t length, + float_t* t1, float_t* t2, size_t f1, size_t f2, size_t f) { + *t2 = 0.0f; + + if (!arr || length < 2 || f - f1 + 1 >= length || f < 1 || f < f1 || f + 2 > f2) + return; + + float_t df_1 = (float_t)(f - f1); + float_t df_2 = (float_t)(f - f1 + 1); + float_t _t1 = df_1 / (float_t)(f2 - f1); + float_t _t2 = df_2 / (float_t)(f2 - f1); + float_t t1_1 = _t1 - 1.0f; + float_t t2_1 = _t2 - 1.0f; + + float_t t1_t2_1 = arr[f] - arr[f1] - (_t1 * 2.0f - 3.0f) * (_t1 * _t1) * (arr[f1] - arr[f2]); + float_t t1_t2_2 = arr[f + 1] - arr[f1] - (_t2 * 2.0f - 3.0f) * (_t2 * _t2) * (arr[f1] - arr[f2]); + t1_t2_1 /= df_1 * t1_1; + t1_t2_2 /= df_2 * t2_1; + + *t1 = (t1_t2_1 * _t2 - t1_t2_2 * _t1) / (_t1 - _t2); + *t2 = (-t1_t2_1 * t2_1 + t1_t2_2 * t1_1) / (_t1 - _t2); +} + +inline static void mot_set_add_key(uint16_t frame, float_t v, float_t t, + std::vector& frames, std::vector& values) { + frames.push_back(frame); + values.push_back(v); + values.push_back(t); +} + +inline static float_t mot_set_add_key(bool has_error, float_t* a, int32_t frame, + size_t i, float_t t1, float_t t2, float_t t2_old, + std::vector& frames, std::vector& values) { + if (has_error) { + float_t _t2 = t2_old; + for (size_t j = 0; j < i; j++) { + mot_set_add_key((uint16_t)(frame + j), a[j], _t2, frames, values); + _t2 = 0.0f; + mot_set_add_key((uint16_t)(frame + j), a[j], 0.0f, frames, values); + } + return 0.0f; + } + else { + mot_set_add_key((uint16_t)frame, a[0], t2_old, frames, values); + if (t2_old == 0.0f) + mot_set_add_key((uint16_t)frame, a[0], t2_old, frames, values); + if (t1 != t2_old) { + mot_set_add_key((uint16_t)frame, a[0], t1, frames, values); + if (t1 == 0.0f) + mot_set_add_key((uint16_t)frame, a[0], t1, frames, values); + } + return t2; + } +} + +mot_key_set_type mot_set::fit_keys_into_curve(std::vector& values_src, + std::vector& frames, std::vector& values) { + size_t count = values_src.size(); + if (!count) + return MOT_KEY_SET_NONE; + else if (count == 1) { + if (values_src[0] != 0.0f) { + values.push_back(values_src[0]); + return MOT_KEY_SET_STATIC; + } + else + return MOT_KEY_SET_NONE; + } + else { + uint32_t val = *(uint32_t*)&values_src.data()[0]; + uint32_t* arr = (uint32_t*)&values_src.data()[1]; + for (size_t i = count - 1; i; i--) + if (val != *arr++) + break; + + if (arr == (uint32_t*)(values_src.data() + count)) + if (values_src[0] != 0.0f) { + values.push_back(values_src[0]); + return MOT_KEY_SET_STATIC; + } + else + return MOT_KEY_SET_NONE; + } + + int32_t start_time = 0; + int32_t end_time = (int32_t)(count - 1); + + float_t* arr = values_src.data(); + + const float_t reverse_bias = 0.0001f; + const int32_t reverse_min_count = 4; + + float_t* a = arr; + size_t left_count = count; + int32_t frame = start_time; + int32_t prev_frame = start_time; + float_t t2_old = 0.0f; + while (left_count > 0) { + if (left_count < reverse_min_count) { + if (left_count > 1) + t2_old = mot_set_add_key(true, a, frame, left_count - 1, 0.0f, 0.0f, t2_old, frames, values); + break; + } + + size_t i = 0; + size_t i_prev = 0; + float_t t1 = 0.0f; + float_t t2 = 0.0f; + float_t t1_prev = 0.0f; + float_t t2_prev = 0.0f; + bool has_prev_succeded = false; + bool has_error = false; + bool has_prev_error = false; + + int32_t c = 0; + for (i = reverse_min_count - 1, i_prev = i; i < left_count; i++) { + double_t tt1 = 0.0; + double_t tt2 = 0.0; + for (size_t j = 1; j < i; j++) { + float_t _t1 = 0.0f; + float_t _t2 = 0.0f; + interpolate_mot_reverse_value(a, left_count, &_t1, &_t2, 0, i, j); + tt1 += _t1; + tt2 += _t2; + } + t1 = (float_t)(tt1 / (double_t)(i - 2)); + t2 = (float_t)(tt2 / (double_t)(i - 2)); + + has_error = false; + for (size_t j = 1; j < i - 1; j++) { + float_t val = interpolate_mot_value(a[0], a[i], t1, t2, 0.0f, (float_t)i, (float_t)j); + if (fabsf(val - a[j]) > reverse_bias) { + has_error = true; + break; + } + } + + if (!has_error) { + i_prev = i; + t1_prev = t1; + t2_prev = t2; + has_prev_succeded = true; + has_prev_error = has_error; + if (i < left_count) + continue; + } + + if (has_prev_succeded) { + i = i_prev; + t1 = t1_prev; + t2 = t2_prev; + has_error = has_prev_error; + } + + if (!has_error) + c = (int32_t)i; + else + c = 1; + + t2_old = mot_set_add_key(has_error, a, frame, c, t1, t2, t2_old, frames, values); + has_prev_succeded = false; + break; + + if (!has_error) { + i_prev = i; + t1_prev = t1; + t2_prev = t2; + has_prev_succeded = true; + has_prev_error = has_error; + if (i < left_count) + continue; + } + break; + } + + if (has_prev_succeded) { + t2_old = mot_set_add_key(has_error, a, frame, c, t1_prev, t2_prev, t2_old, frames, values); + c = (int32_t)i; + } + + prev_frame = frame; + frame += c; + a += c; + left_count -= c; + } + + mot_set_add_key((uint16_t)(start_time + (count - 1)), arr[count - 1], t2_old, frames, values); + if (t2_old != 0.0f) + mot_set_add_key((uint16_t)(start_time + (count - 1)), arr[count - 1], 0.0f, frames, values); + + + count = values.size() / 2; + arr = values.data(); + for (size_t i = count; i; i--) + if (*arr++ != 0.0f) + break; + + if (arr != values.data() + count) + return MOT_KEY_SET_HERMITE_TANGENT; + + float_t* arr_src = values.data(); + float_t* arr_dst = values.data(); + for (size_t i = count; i; i--) { + *arr_dst = *arr_src; + arr_src++; + arr_dst += 2; + } + values.resize(count); + return MOT_KEY_SET_HERMITE; +} + +static void mot_classic_read_inner(mot_set* ms, stream& s) { size_t count = 0; - while (io_read_uint64_t(s) != 0) { - io_read_uint64_t(s); + while (s.read_uint64_t() != 0) { + s.read_uint64_t(); count++; } @@ -107,45 +325,45 @@ static void mot_classic_read_inner(mot_set* ms, stream* s) { ms->is_x = false; } - io_set_position(s, 0x00, SEEK_SET); + s.set_position(0x00, SEEK_SET); ms->vec.resize(count); mot_header_classic* mh = force_malloc_s(mot_header_classic, count); for (size_t i = 0; i < count; i++) { - mh[i].key_set_count_offset = io_read_uint32_t(s); - mh[i].key_set_types_offset = io_read_uint32_t(s); - mh[i].key_set_offset = io_read_uint32_t(s); - mh[i].bone_info_offset = io_read_uint32_t(s); + mh[i].key_set_count_offset = s.read_uint32_t(); + mh[i].key_set_types_offset = s.read_uint32_t(); + mh[i].key_set_offset = s.read_uint32_t(); + mh[i].bone_info_offset = s.read_uint32_t(); } for (size_t i = 0; i < count; i++) { mot_data* m = &ms->vec[i]; - io_set_position(s, mh[i].bone_info_offset, SEEK_SET); + s.set_position(mh[i].bone_info_offset, SEEK_SET); m->bone_info_count = 0; - io_read_uint16_t(s); + s.read_uint16_t(); do m->bone_info_count++; - while (io_read_uint16_t(s) != 0 && io_get_position(s) < s->length); + while (s.read_uint16_t() != 0 && s.get_position() < s.length); - io_set_position(s, mh[i].bone_info_offset, SEEK_SET); + s.set_position(mh[i].bone_info_offset, SEEK_SET); m->bone_info.resize(m->bone_info_count); for (size_t j = 0; j < m->bone_info_count; j++) - m->bone_info[j].index = io_read_uint16_t(s); + m->bone_info[j].index = s.read_uint16_t(); - io_set_position(s, mh[i].key_set_count_offset, SEEK_SET); - m->info = io_read_uint16_t(s); - m->frame_count = io_read_uint16_t(s); + s.set_position(mh[i].key_set_count_offset, SEEK_SET); + m->info = s.read_uint16_t(); + m->frame_count = s.read_uint16_t(); m->key_set.resize(m->key_set_count); - io_set_position(s, mh[i].key_set_types_offset, SEEK_SET); + s.set_position(mh[i].key_set_types_offset, SEEK_SET); for (int32_t j = 0, b = 0; j < m->key_set_count; j++) { if (j % 8 == 0) - b = io_read_uint16_t(s); + b = s.read_uint16_t(); m->key_set[j].type = (mot_key_set_type)((b >> (j % 8 * 2)) & 0x03); } - io_set_position(s, mh[i].key_set_offset, SEEK_SET); + s.set_position(mh[i].key_set_offset, SEEK_SET); for (int32_t j = 0; j < m->key_set_count; j++) { mot_key_set_data* mks = &m->key_set[j]; if (mks->type == MOT_KEY_SET_NONE) { @@ -157,11 +375,11 @@ static void mot_classic_read_inner(mot_set* ms, stream* s) { mks->keys_count = 1; mks->frames.resize(0); mks->values.resize(1); - mks->values[0] = io_read_float_t(s); + mks->values[0] = s.read_float_t(); } else { bool has_tangents = mks->type != MOT_KEY_SET_HERMITE; - uint16_t keys_count = io_read_uint16_t(s); + uint16_t keys_count = s.read_uint16_t(); mks->keys_count = keys_count; mks->frames.resize(keys_count); @@ -169,17 +387,17 @@ static void mot_classic_read_inner(mot_set* ms, stream* s) { uint16_t* frames = mks->frames.data(); for (int32_t k = 0; k < keys_count; k++) - *frames++ = io_read_uint16_t(s); - io_align_read(s, 0x04); + *frames++ = s.read_uint16_t(); + s.align_read(0x04); float_t* values = mks->values.data(); if (!has_tangents) for (int32_t k = 0; k < keys_count; k++) - *values++ = io_read_float_t(s); + *values++ = s.read_float_t(); else for (int32_t k = 0; k < keys_count; k++) { - *values++ = io_read_float_t(s); - *values++ = io_read_float_t(s); + *values++ = s.read_float_t(); + *values++ = s.read_float_t(); } } } @@ -191,81 +409,82 @@ static void mot_classic_read_inner(mot_set* ms, stream* s) { ms->is_x = false; } -static void mot_classic_write_inner(mot_set* ms, stream* s) { +static void mot_classic_write_inner(mot_set* ms, stream& s) { size_t count = ms->vec.size(); - io_set_position(s, count * 0x10 + 0x10, SEEK_SET); + s.set_position(count * 0x10 + 0x10, SEEK_SET); mot_header_classic* mh = force_malloc_s(mot_header_classic, count); for (size_t i = 0; i < count; i++) { mot_data* m = &ms->vec[i]; - mh[i].key_set_count_offset = (uint32_t)io_get_position(s); - io_write_uint16_t(s, m->info); - io_write_uint16_t(s, m->frame_count); + mh[i].key_set_count_offset = (uint32_t)s.get_position(); + s.write_uint16_t(m->info); + s.write_uint16_t(m->frame_count); - mh[i].key_set_types_offset = (uint32_t)io_get_position(s); + mh[i].key_set_types_offset = (uint32_t)s.get_position(); uint16_t key_set_type_buf = 0; for (int32_t j = 0; j < m->key_set_count; j++) { - key_set_type_buf |= ((uint16_t)m->key_set[j].type & 0x03) << (j % 8 * 2); + mot_key_set_type type = m->key_set[j].type; + if (type == MOT_KEY_SET_STATIC && m->key_set[j].values[0] == 0.0f) + type = MOT_KEY_SET_NONE; + + key_set_type_buf |= ((uint16_t)type & 0x03) << (j % 8 * 2); if (j % 8 == 7) { - io_write_uint16_t(s, key_set_type_buf); + s.write_uint16_t(key_set_type_buf); key_set_type_buf = 0; } } if (m->key_set_count % 8 != 0) - io_write_uint16_t(s, key_set_type_buf); - io_align_write(s, 0x04); + s.write_uint16_t(key_set_type_buf); + s.align_write(0x04); - mh[i].key_set_offset = (uint32_t)io_get_position(s); + mh[i].key_set_offset = (uint32_t)s.get_position(); for (int32_t j = 0; j < m->key_set_count; j++) { mot_key_set_data* mks = &m->key_set[j]; - if (mks->type == MOT_KEY_SET_STATIC) - io_write_float_t(s, mks->values[0]); - else { + if (mks->type == MOT_KEY_SET_STATIC) { + if (mks->values[0] != 0.0f) + s.write_float_t(mks->values[0]); + } + else if (mks->type != MOT_KEY_SET_NONE) { bool has_tangents = mks->type != MOT_KEY_SET_HERMITE; uint16_t keys_count = mks->keys_count; - io_write_uint16_t(s, keys_count); + s.write_uint16_t(keys_count); uint16_t* frames = mks->frames.data(); - for (int32_t k = 0; k < keys_count; k++) - io_write_uint16_t(s, *frames++); - io_align_write(s, 0x04); + s.write(frames, sizeof(uint16_t) * keys_count); + s.align_write(0x04); float_t* values = mks->values.data(); if (!has_tangents) - for (int32_t k = 0; k < keys_count; k++) - io_write_float_t(s, *values++); + s.write(values, sizeof(float_t) * keys_count); else - for (int32_t k = 0; k < keys_count; k++) { - io_write_float_t(s, *values++); - io_write_float_t(s, *values++); - } + s.write(values, sizeof(float_t) * keys_count * 2); } } - io_align_write(s, 0x04); + s.align_write(0x04); - mh[i].bone_info_offset = (uint32_t)io_get_position(s); + mh[i].bone_info_offset = (uint32_t)s.get_position(); if (m->bone_info_count) for (int32_t j = 0; j < m->bone_info_count; j++) - io_write_uint16_t(s, m->bone_info[j].index); + s.write_uint16_t(m->bone_info[j].index); else - io_write_uint16_t(s, 0x00); - io_write_uint16_t(s, 0x00); + s.write_uint16_t(0x00); + s.write_uint16_t(0x00); } - io_align_write(s, 0x10); + s.align_write(0x10); - io_set_position(s, 0x00, SEEK_SET); + s.set_position(0x00, SEEK_SET); for (size_t i = 0; i < count; i++) { - io_write_uint32_t(s, mh[i].key_set_count_offset); - io_write_uint32_t(s, mh[i].key_set_types_offset); - io_write_uint32_t(s, mh[i].key_set_offset); - io_write_uint32_t(s, mh[i].bone_info_offset); + s.write_uint32_t(mh[i].key_set_count_offset); + s.write_uint32_t(mh[i].key_set_types_offset); + s.write_uint32_t(mh[i].key_set_offset); + s.write_uint32_t(mh[i].bone_info_offset); } free(mh); } -static void mot_modern_read_inner(mot_set* ms, stream* s) { +static void mot_modern_read_inner(mot_set* ms, stream& s) { bool ret = false; f2_struct st; st.read(s); @@ -276,73 +495,73 @@ static void mot_modern_read_inner(mot_set* ms, stream* s) { } stream s_motc; - io_open(&s_motc, &st.data); + s_motc.open(st.data); s_motc.is_big_endian = st.header.use_big_endian; - io_set_position(&s_motc, 0x0C, SEEK_SET); - bool is_x = io_read_uint32_t_stream_reverse_endianness(&s_motc) == 0; + s_motc.set_position(0x0C, SEEK_SET); + bool is_x = s_motc.read_uint32_t_reverse_endianness() == 0; - io_set_position(&s_motc, 0x00, SEEK_SET); + s_motc.set_position(0x00, SEEK_SET); ms->vec.resize(1); mot_header_modern mh; memset(&mh, 0, sizeof(mot_header_modern)); if (!is_x) { - mh.hash = (uint32_t)io_read_uint64_t_stream_reverse_endianness(&s_motc); - mh.name_offset = io_read_offset_f2(&s_motc, st.header.length); - mh.key_set_count_offset = io_read_offset_f2(&s_motc, st.header.length); - mh.key_set_types_offset = io_read_offset_f2(&s_motc, st.header.length); - mh.key_set_offset = io_read_offset_f2(&s_motc, st.header.length); - mh.bone_info_offset = io_read_offset_f2(&s_motc, st.header.length); - mh.bone_hash_offset = io_read_offset_f2(&s_motc, st.header.length); - mh.bone_info_count = io_read_int32_t_stream_reverse_endianness(&s_motc); + mh.hash = (uint32_t)s_motc.read_uint64_t_reverse_endianness(); + mh.name_offset = s_motc.read_offset_f2(st.header.length); + mh.key_set_count_offset = s_motc.read_offset_f2(st.header.length); + mh.key_set_types_offset = s_motc.read_offset_f2(st.header.length); + mh.key_set_offset = s_motc.read_offset_f2(st.header.length); + mh.bone_info_offset = s_motc.read_offset_f2(st.header.length); + mh.bone_hash_offset = s_motc.read_offset_f2(st.header.length); + mh.bone_info_count = s_motc.read_int32_t_reverse_endianness(); } else { - mh.hash = (uint32_t)io_read_uint64_t_stream_reverse_endianness(&s_motc); - mh.name_offset = io_read_offset_x(&s_motc); - mh.key_set_count_offset = io_read_offset_x(&s_motc); - mh.key_set_types_offset = io_read_offset_x(&s_motc); - mh.key_set_offset = io_read_offset_x(&s_motc); - mh.bone_info_offset = io_read_offset_x(&s_motc); - mh.bone_hash_offset = io_read_offset_x(&s_motc); - mh.bone_info_count = io_read_int32_t_stream_reverse_endianness(&s_motc); + mh.hash = (uint32_t)s_motc.read_uint64_t_reverse_endianness(); + mh.name_offset = s_motc.read_offset_x(); + mh.key_set_count_offset = s_motc.read_offset_x(); + mh.key_set_types_offset = s_motc.read_offset_x(); + mh.key_set_offset = s_motc.read_offset_x(); + mh.bone_info_offset = s_motc.read_offset_x(); + mh.bone_hash_offset = s_motc.read_offset_x(); + mh.bone_info_count = s_motc.read_int32_t_reverse_endianness(); } 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 = s_motc.read_uint16_t_reverse_endianness(); + m->div_count = s_motc.read_uint8_t(); - io_read_string_null_terminated_offset(&s_motc, mh.name_offset, &m->name); + m->name = s_motc.read_string_null_terminated_offset(mh.name_offset); - io_set_position(&s_motc, mh.bone_info_offset, SEEK_SET); + s_motc.set_position(mh.bone_info_offset, SEEK_SET); m->bone_info_count = mh.bone_info_count; m->bone_info.resize(m->bone_info_count); if (!is_x) for (size_t j = 0; j < mh.bone_info_count; j++) - io_read_string_null_terminated_offset(&s_motc, - io_read_offset_f2(&s_motc, st.header.length), &m->bone_info[j].name); + m->bone_info[j].name = s_motc.read_string_null_terminated_offset( + s_motc.read_offset_f2(st.header.length)); else for (size_t j = 0; j < mh.bone_info_count; j++) - io_read_string_null_terminated_offset(&s_motc, - io_read_offset_x(&s_motc), &m->bone_info[j].name); + m->bone_info[j].name = s_motc.read_string_null_terminated_offset( + s_motc.read_offset_x()); - io_set_position(&s_motc, mh.bone_hash_offset, SEEK_SET); + s_motc.set_position(mh.bone_hash_offset, SEEK_SET); for (size_t j = 0; j < mh.bone_info_count; j++) - io_read_uint64_t_stream_reverse_endianness(&s_motc); + s_motc.read_uint64_t_reverse_endianness(); - io_set_position(&s_motc, mh.key_set_count_offset, SEEK_SET); - m->info = io_read_uint16_t_stream_reverse_endianness(&s_motc); - m->frame_count = io_read_uint16_t_stream_reverse_endianness(&s_motc); + s_motc.set_position(mh.key_set_count_offset, SEEK_SET); + m->info = s_motc.read_uint16_t_reverse_endianness(); + m->frame_count = s_motc.read_uint16_t_reverse_endianness(); m->key_set.resize(m->key_set_count); - io_set_position(&s_motc, mh.key_set_types_offset, SEEK_SET); + s_motc.set_position(mh.key_set_types_offset, SEEK_SET); for (int32_t j = 0, b = 0; j < m->key_set_count; j++) { if (j % 8 == 0) - b = io_read_uint16_t_stream_reverse_endianness(&s_motc); + b = s_motc.read_uint16_t_reverse_endianness(); m->key_set[j].type = (mot_key_set_type)((b >> (j % 8 * 2)) & 0x03); } - io_set_position(&s_motc, mh.key_set_offset, SEEK_SET); + s_motc.set_position(mh.key_set_offset, SEEK_SET); for (int32_t j = 0; j < m->key_set_count; j++) { mot_key_set_data* mks = &m->key_set[j]; if (mks->type == MOT_KEY_SET_NONE) { @@ -354,13 +573,13 @@ static void mot_modern_read_inner(mot_set* ms, stream* s) { mks->keys_count = 1; mks->frames.resize(0); mks->values.resize(1); - mks->values[0] = io_read_float_t_stream_reverse_endianness(&s_motc); + mks->values[0] = s_motc.read_float_t_reverse_endianness(); } else { bool has_tangents = mks->type != MOT_KEY_SET_HERMITE; - uint16_t keys_count = io_read_uint16_t_stream_reverse_endianness(s); + uint16_t keys_count = s_motc.read_uint16_t_reverse_endianness(); mot_key_set_data_type data_type - = (mot_key_set_data_type)io_read_uint16_t_stream_reverse_endianness(&s_motc); + = (mot_key_set_data_type)s_motc.read_uint16_t_reverse_endianness(); mks->keys_count = keys_count; mks->data_type = data_type; @@ -371,37 +590,35 @@ static void mot_modern_read_inner(mot_set* ms, stream* s) { if (has_tangents) { float_t* values = &mks->values[1]; for (int32_t k = 0; k < keys_count; k++, values += step) - *values = io_read_float_t_stream_reverse_endianness(&s_motc); + *values = s_motc.read_float_t_reverse_endianness(); } float_t* values = mks->values.data(); if (data_type == MOT_KEY_SET_DATA_F16) for (int32_t k = 0; k < keys_count; k++, values += step) - *values = half_to_float(io_read_half_t_stream_reverse_endianness(&s_motc)); + *values = half_to_float(s_motc.read_half_t_reverse_endianness()); else for (int32_t k = 0; k < keys_count; k++, values += step) - *values = io_read_float_t_stream_reverse_endianness(&s_motc); - io_align_read(&s_motc, 0x04); + *values = s_motc.read_float_t_reverse_endianness(); + s_motc.align_read(0x04); int16_t* frames = (int16_t*)mks->frames.data(); for (int32_t k = 0; k < keys_count; k++) - *frames++ = io_read_int16_t_stream_reverse_endianness(&s_motc); - io_align_read(&s_motc, 0x04); + *frames++ = s_motc.read_int16_t_reverse_endianness(); + s_motc.align_read(0x04); } } m->murmurhash = st.header.murmurhash; - io_free(&s_motc); - ms->ready = true; ms->modern = true; ms->is_x = is_x; } -static void mot_modern_write_inner(mot_set* ms, stream* s) { +static void mot_modern_write_inner(mot_set* ms, stream& s) { stream s_motc; - io_open(&s_motc); + s_motc.open(); uint32_t o; enrs e; enrs_entry ee; @@ -443,10 +660,12 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { for (int32_t j = 0; j < m->key_set_count; j++) { mot_key_set_data* mks = &m->key_set[j]; if (mks->type == MOT_KEY_SET_STATIC) { - ee = { o, 1, 4, 1 }; - ee.append(0, 1, ENRS_DWORD); - e.vec.push_back(ee); - o = 4; + if (mks->values[0] != 0.0f) { + ee = { o, 1, 4, 1 }; + ee.append(0, 1, ENRS_DWORD); + e.vec.push_back(ee); + o = 4; + } } else if (mks->type != MOT_KEY_SET_NONE) { bool has_tangents = mks->type != MOT_KEY_SET_HERMITE; @@ -505,159 +724,165 @@ static void mot_modern_write_inner(mot_set* ms, stream* s) { o = m->bone_info_count * 8; if (!ms->is_x) { - io_write_uint64_t(&s_motc, 0); - io_write_offset_f2_pof_add(&s_motc, 0, 0x40, &pof); - io_write_offset_f2_pof_add(&s_motc, 0, 0x40, &pof); - io_write_offset_f2_pof_add(&s_motc, 0, 0x40, &pof); - io_write_offset_f2_pof_add(&s_motc, 0, 0x40, &pof); - io_write_offset_f2_pof_add(&s_motc, 0, 0x40, &pof); - io_write_offset_f2_pof_add(&s_motc, 0, 0x40, &pof); - io_write_int32_t(&s_motc, 0); - io_write_int32_t(&s_motc, 0); + s_motc.write_uint64_t(0); + io_write_offset_f2_pof_add(s_motc, 0, 0x40, &pof); + io_write_offset_f2_pof_add(s_motc, 0, 0x40, &pof); + io_write_offset_f2_pof_add(s_motc, 0, 0x40, &pof); + io_write_offset_f2_pof_add(s_motc, 0, 0x40, &pof); + io_write_offset_f2_pof_add(s_motc, 0, 0x40, &pof); + io_write_offset_f2_pof_add(s_motc, 0, 0x40, &pof); + s_motc.write_int32_t(0); + s_motc.write_int32_t(0); } else { - io_write_uint64_t(&s_motc, 0); - io_write_offset_x_pof_add(&s_motc, 0, &pof); - io_write_offset_x_pof_add(&s_motc, 0, &pof); - io_write_offset_x_pof_add(&s_motc, 0, &pof); - io_write_offset_x_pof_add(&s_motc, 0, &pof); - io_write_offset_x_pof_add(&s_motc, 0, &pof); - io_write_offset_x_pof_add(&s_motc, 0, &pof); - io_write_int32_t(&s_motc, 0); + s_motc.write_uint64_t(0); + io_write_offset_x_pof_add(s_motc, 0, &pof); + io_write_offset_x_pof_add(s_motc, 0, &pof); + io_write_offset_x_pof_add(s_motc, 0, &pof); + io_write_offset_x_pof_add(s_motc, 0, &pof); + io_write_offset_x_pof_add(s_motc, 0, &pof); + io_write_offset_x_pof_add(s_motc, 0, &pof); + s_motc.write_int32_t(0); } - io_write_uint16_t(&s_motc, 0); - io_write_uint8_t(&s_motc, 0); - io_align_write(&s_motc, 0x10); + s_motc.write_uint16_t(0); + s_motc.write_uint8_t(0); + s_motc.align_write(0x10); mh.hash = hash_string_murmurhash(&m->name); - mh.key_set_count_offset = io_get_position(&s_motc); - io_write_uint16_t(&s_motc, m->info); - io_write_uint16_t(&s_motc, m->frame_count); + mh.key_set_count_offset = s_motc.get_position(); + s_motc.write_uint16_t(m->info); + s_motc.write_uint16_t(m->frame_count); - mh.key_set_types_offset = io_get_position(&s_motc); + mh.key_set_types_offset = s_motc.get_position(); uint16_t key_set_type_buf = 0; for (int32_t j = 0; j < m->key_set_count; j++) { - key_set_type_buf |= ((uint16_t)m->key_set[j].type & 0x03) << (j % 8 * 2); + mot_key_set_type type = m->key_set[j].type; + if (type == MOT_KEY_SET_STATIC && m->key_set[j].values[0] == 0.0f) + type = MOT_KEY_SET_NONE; + + key_set_type_buf |= ((uint16_t)type & 0x03) << (j % 8 * 2); if (j % 8 == 7) { - io_write_uint16_t(&s_motc, key_set_type_buf); + s_motc.write_uint16_t(key_set_type_buf); key_set_type_buf = 0; } } if (m->key_set_count % 8 != 0) - io_write_uint16_t(&s_motc, key_set_type_buf); - io_align_write(&s_motc, 0x04); + s_motc.write_uint16_t(key_set_type_buf); + s_motc.align_write(0x04); - mh.key_set_offset = io_get_position(&s_motc); + mh.key_set_offset = s_motc.get_position(); for (int32_t j = 0; j < m->key_set_count; j++) { mot_key_set_data* mks = &m->key_set[j]; - if (mks->type == MOT_KEY_SET_STATIC) - io_write_float_t(&s_motc, mks->values[0]); + if (mks->type == MOT_KEY_SET_STATIC) { + if (mks->values[0] != 0.0f) + s.write_float_t(mks->values[0]); + } else if (mks->type != MOT_KEY_SET_NONE) { bool has_tangents = mks->type != MOT_KEY_SET_HERMITE; uint16_t keys_count = mks->keys_count; mot_key_set_data_type data_type = mks->data_type; - io_write_uint16_t(&s_motc, keys_count); - io_write_uint16_t(&s_motc, (uint16_t)data_type); + s_motc.write_uint16_t(keys_count); + s_motc.write_uint16_t((uint16_t)data_type); uint8_t step = has_tangents ? 2 : 1; if (has_tangents) { float_t* values = &mks->values[1]; for (int32_t k = 0; k < keys_count; k++, values += step) - io_write_float_t(&s_motc, *values); + s_motc.write_float_t(*values); } float_t* values = mks->values.data(); if (data_type == MOT_KEY_SET_DATA_F16) for (int32_t k = 0; k < keys_count; k++, values += step) - io_write_half_t(&s_motc, float_to_half(*values)); + s_motc.write_half_t(float_to_half(*values)); else for (int32_t k = 0; k < keys_count; k++, values += step) - io_write_float_t(&s_motc, *values); - io_align_write(&s_motc, 0x04); + s_motc.write_float_t(*values); + s_motc.align_write(0x04); int16_t* frames = (int16_t*)mks->frames.data(); for (int32_t k = 0; k < keys_count; k++) - io_write_int16_t(&s_motc, *frames++); - io_align_write(&s_motc, 0x04); + s_motc.write_int16_t(*frames++); + s_motc.align_write(0x04); } } - io_align_write(&s_motc, 0x10); + s_motc.align_write(0x10); size_t* bone_info_offsets = force_malloc_s(size_t, m->bone_info_count); - mh.bone_info_offset = io_get_position(&s_motc); + mh.bone_info_offset = s_motc.get_position(); if (!ms->is_x) for (int32_t j = 0; j < m->bone_info_count; j++) - io_write_offset_f2_pof_add(&s_motc, 0, 0x40, &pof); + io_write_offset_f2_pof_add(s_motc, 0, 0x40, &pof); else for (int32_t j = 0; j < m->bone_info_count; j++) - io_write_offset_x_pof_add(&s_motc, 0, &pof); - io_align_write(&s_motc, 0x10); + io_write_offset_x_pof_add(s_motc, 0, &pof); + s_motc.align_write(0x10); - mh.bone_hash_offset = io_get_position(&s_motc); + mh.bone_hash_offset = s_motc.get_position(); for (int32_t j = 0; j < m->bone_info_count; j++) - io_write_uint64_t(&s_motc, hash_string_murmurhash(&m->bone_info[j].name)); - io_align_write(&s_motc, 0x10); + s_motc.write_uint64_t(hash_string_murmurhash(&m->bone_info[j].name)); + s_motc.align_write(0x10); - mh.name_offset = io_get_position(&s_motc); - io_write_string_null_terminated(&s_motc, &m->name); + mh.name_offset = s_motc.get_position(); + s_motc.write_string_null_terminated(m->name); for (int32_t j = 0; j < m->bone_info_count; j++) { - bone_info_offsets[j] = io_get_position(&s_motc); - io_write_string_null_terminated(&s_motc, &m->bone_info[j].name); + bone_info_offsets[j] = s_motc.get_position(); + s_motc.write_string_null_terminated(m->bone_info[j].name); } - io_align_write(&s_motc, 0x10); + s_motc.align_write(0x10); - io_set_position(&s_motc, mh.bone_info_offset, SEEK_SET); + s_motc.set_position(mh.bone_info_offset, SEEK_SET); mh.bone_info_count = m->bone_info_count; if (!ms->is_x) for (int32_t j = 0; j < m->bone_info_count; j++) - io_write_offset_f2(&s_motc, bone_info_offsets[j], 0x40); + s_motc.write_offset_f2(bone_info_offsets[j], 0x40); else for (int32_t j = 0; j < m->bone_info_count; j++) - io_write_offset_x(&s_motc, bone_info_offsets[j]); + s_motc.write_offset_x(bone_info_offsets[j]); free(bone_info_offsets); - io_set_position(&s_motc, 0x00, SEEK_SET); + s_motc.set_position(0x00, SEEK_SET); if (!ms->is_x) { - io_write_uint64_t(&s_motc, (uint64_t)mh.hash); - io_write_offset_f2(&s_motc, mh.name_offset, 0x40); - io_write_offset_f2(&s_motc, mh.key_set_count_offset, 0x40); - io_write_offset_f2(&s_motc, mh.key_set_types_offset, 0x40); - io_write_offset_f2(&s_motc, mh.key_set_offset, 0x40); - io_write_offset_f2(&s_motc, mh.bone_info_offset, 0x40); - io_write_offset_f2(&s_motc, mh.bone_hash_offset, 0x40); - io_write_int32_t(&s_motc, mh.bone_info_count); + s_motc.write_uint64_t((uint64_t)mh.hash); + s_motc.write_offset_f2(mh.name_offset, 0x40); + s_motc.write_offset_f2(mh.key_set_count_offset, 0x40); + s_motc.write_offset_f2(mh.key_set_types_offset, 0x40); + s_motc.write_offset_f2(mh.key_set_offset, 0x40); + s_motc.write_offset_f2(mh.bone_info_offset, 0x40); + s_motc.write_offset_f2(mh.bone_hash_offset, 0x40); + s_motc.write_int32_t(mh.bone_info_count); } else { - io_write_uint64_t(&s_motc, (uint64_t)mh.hash); - io_write_offset_x(&s_motc, mh.name_offset); - io_write_offset_x(&s_motc, mh.key_set_count_offset); - io_write_offset_x(&s_motc, mh.key_set_types_offset); - io_write_offset_x(&s_motc, mh.key_set_offset); - io_write_offset_x(&s_motc, mh.bone_info_offset); - io_write_offset_x(&s_motc, mh.bone_hash_offset); - io_write_int32_t(&s_motc, mh.bone_info_count); + s_motc.write_uint64_t((uint64_t)mh.hash); + s_motc.write_offset_x(mh.name_offset); + s_motc.write_offset_x(mh.key_set_count_offset); + s_motc.write_offset_x(mh.key_set_types_offset); + s_motc.write_offset_x(mh.key_set_offset); + s_motc.write_offset_x(mh.bone_info_offset); + s_motc.write_offset_x(mh.bone_hash_offset); + s_motc.write_int32_t(mh.bone_info_count); } if (m->div_frames > 0) { - io_write_uint16_t(&s_motc, m->div_frames); - io_write_uint8_t(&s_motc, m->div_count); + s_motc.write_uint16_t(m->div_frames); + s_motc.write_uint8_t(m->div_count); } else { - io_write_uint16_t(&s_motc, 0); - io_write_uint8_t(&s_motc, 0); + s_motc.write_uint16_t(0); + s_motc.write_uint8_t(0); } murmurhash = m->murmurhash; } f2_struct st; - io_align_write(&s_motc, 0x10); - io_copy(&s_motc, &st.data); - io_free(&s_motc); + s_motc.align_write(0x10); + s_motc.copy(st.data); + s_motc.close(); st.enrs = e; st.pof = pof; diff --git a/src/KKdLib/mot.hpp b/src/KKdLib/mot.hpp index d2dab167..855e210c 100644 --- a/src/KKdLib/mot.hpp +++ b/src/KKdLib/mot.hpp @@ -7,8 +7,8 @@ #include #include -#include "default.h" -#include "vec.h" +#include "default.hpp" +#include "vec.hpp" enum mot_key_set_type { MOT_KEY_SET_NONE = 0x00, @@ -77,4 +77,7 @@ struct mot_set { void pack_file(void** data, size_t* size); void unpack_file(const void* data, size_t size, bool modern); + + static mot_key_set_type fit_keys_into_curve(std::vector& values_src, + std::vector& frames, std::vector& values); }; diff --git a/src/KKdLib/msgpack.cpp b/src/KKdLib/msgpack.cpp index 5525752f..32f7e80e 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(const msgpack& m) : type(), data() { if (this == &m) return; @@ -105,7 +105,7 @@ msgpack::msgpack(const msgpack& m) { name = m.name; } -msgpack::msgpack(const char* name, bool array, size_t length) { +msgpack::msgpack(const char* name, bool array, size_t length) : data() { 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) { ptr->resize(length); } -msgpack::msgpack(const char* name, bool array, msgpack_array& val) { +msgpack::msgpack(const char* name, bool array, msgpack_array& val) : data() { 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) { *ptr = val; } -msgpack::msgpack(const char* name) { +msgpack::msgpack(const char* name) : data() { type = MSGPACK_NULL; if (name) this->name = std::string(name); } -msgpack::msgpack(const char* name, bool val) { +msgpack::msgpack(const char* name, bool val) : data() { type = MSGPACK_BOOL; MSGPACK_ALLOCATE_PTR(bool, this); if (name) @@ -142,7 +142,7 @@ msgpack::msgpack(const char* name, bool val) { *ptr = val; } -msgpack::msgpack(const char* name, int8_t val) { +msgpack::msgpack(const char* name, int8_t val) : data() { type = MSGPACK_INT8; MSGPACK_ALLOCATE_PTR(int8_t, this); if (name) @@ -152,7 +152,7 @@ msgpack::msgpack(const char* name, int8_t val) { *ptr = val; } -msgpack::msgpack(const char* name, uint8_t val) { +msgpack::msgpack(const char* name, uint8_t val) : data() { type = MSGPACK_UINT8; MSGPACK_ALLOCATE_PTR(uint8_t, this); if (name) @@ -162,7 +162,7 @@ msgpack::msgpack(const char* name, uint8_t val) { *ptr = val; } -msgpack::msgpack(const char* name, int16_t val) { +msgpack::msgpack(const char* name, int16_t val) : data() { type = MSGPACK_INT16; MSGPACK_ALLOCATE_PTR(int16_t, this); if (name) @@ -172,7 +172,7 @@ msgpack::msgpack(const char* name, int16_t val) { *ptr = val; } -msgpack::msgpack(const char* name, uint16_t val) { +msgpack::msgpack(const char* name, uint16_t val) : data() { type = MSGPACK_UINT16; MSGPACK_ALLOCATE_PTR(uint16_t, this); if (name) @@ -182,7 +182,7 @@ msgpack::msgpack(const char* name, uint16_t val) { *ptr = val; } -msgpack::msgpack(const char* name, int32_t val) { +msgpack::msgpack(const char* name, int32_t val) : data() { type = MSGPACK_INT32; MSGPACK_ALLOCATE_PTR(int32_t, this); if (name) @@ -192,7 +192,7 @@ msgpack::msgpack(const char* name, int32_t val) { *ptr = val; } -msgpack::msgpack(const char* name, uint32_t val) { +msgpack::msgpack(const char* name, uint32_t val) : data() { type = MSGPACK_UINT32; MSGPACK_ALLOCATE_PTR(uint32_t, this); if (name) @@ -202,7 +202,7 @@ msgpack::msgpack(const char* name, uint32_t val) { *ptr = val; } -msgpack::msgpack(const char* name, int64_t val) { +msgpack::msgpack(const char* name, int64_t val) : data() { type = MSGPACK_INT64; MSGPACK_ALLOCATE_PTR(int64_t, this); if (name) @@ -212,7 +212,7 @@ msgpack::msgpack(const char* name, int64_t val) { *ptr = val; } -msgpack::msgpack(const char* name, uint64_t val) { +msgpack::msgpack(const char* name, uint64_t val) : data() { type = MSGPACK_UINT64; MSGPACK_ALLOCATE_PTR(uint64_t, this); if (name) @@ -222,7 +222,7 @@ msgpack::msgpack(const char* name, uint64_t val) { *ptr = val; } -msgpack::msgpack(const char* name, float_t val) { +msgpack::msgpack(const char* name, float_t val) : data() { type = MSGPACK_FLOAT; MSGPACK_ALLOCATE_PTR(float_t, this); if (name) @@ -232,7 +232,7 @@ msgpack::msgpack(const char* name, float_t val) { *ptr = val; } -msgpack::msgpack(const char* name, double_t val) { +msgpack::msgpack(const char* name, double_t val) : data() { type = MSGPACK_DOUBLE; MSGPACK_ALLOCATE_PTR(double_t, this); if (name) @@ -242,7 +242,7 @@ msgpack::msgpack(const char* name, double_t val) { *ptr = val; } -msgpack::msgpack(const char* name, const char* val) { +msgpack::msgpack(const char* name, const char* val) : data() { type = MSGPACK_STRING; MSGPACK_ALLOCATE_PTR(std::string, this); if (name) @@ -253,7 +253,7 @@ msgpack::msgpack(const char* name, const char* val) { *ptr = std::string(val); } -msgpack::msgpack(const char* name, const wchar_t* val) { +msgpack::msgpack(const char* name, const wchar_t* val) : data() { char* temp = utf16_to_utf8(val); type = MSGPACK_STRING; MSGPACK_ALLOCATE_PTR(std::string, this); @@ -266,43 +266,19 @@ msgpack::msgpack(const char* name, const wchar_t* val) { free(temp); } -msgpack::msgpack(const char* name, string* val) { +msgpack::msgpack(const char* name, std::string& val) : data() { type = MSGPACK_STRING; MSGPACK_ALLOCATE_PTR(std::string, this); if (name) this->name = std::string(name); std::string* ptr = MSGPACK_SELECT_PTR(std::string, this); *ptr = {}; - if (val) - *ptr = std::string(string_data(val), val->length); + if (val.size()) + *ptr = val; } -msgpack::msgpack(const char* name, std::string* val) { - type = MSGPACK_STRING; - MSGPACK_ALLOCATE_PTR(std::string, this); - if (name) - this->name = std::string(name); - std::string* ptr = MSGPACK_SELECT_PTR(std::string, this); - *ptr = {}; - if (val) - *ptr = *val; -} - -msgpack::msgpack(const char* name, wstring* val) { - char* temp = utf16_to_utf8(wstring_data(val)); - type = MSGPACK_STRING; - MSGPACK_ALLOCATE_PTR(std::string, this); - if (name) - this->name = std::string(name); - std::string* ptr = MSGPACK_SELECT_PTR(std::string, this); - *ptr = {}; - if (temp) - *ptr = std::string(temp); - free(temp) -} - -msgpack::msgpack(const char* name, std::wstring* val) { - char* temp = utf16_to_utf8(val->c_str()); +msgpack::msgpack(const char* name, std::wstring& val) : data() { + char* temp = utf16_to_utf8(val.c_str()); type = MSGPACK_STRING; MSGPACK_ALLOCATE_PTR(std::string, this); if (name) @@ -786,9 +762,9 @@ wchar_t* msgpack::read_utf16_string(const char* name) { return 0; } -void msgpack::read_string(const char* name, string* str) { +void msgpack::read_string(const char* name, std::string& str) { if (!this) { - *str = string_empty; + str = {}; return; } @@ -796,15 +772,15 @@ void msgpack::read_string(const char* name, string* str) { if (m && m->type == MSGPACK_STRING) { std::string* ptr = MSGPACK_SELECT_PTR(std::string, m); - string_init_length(str, ptr->c_str(), ptr->size()); + str = *ptr; } else - *str = string_empty; + str = {}; } -void msgpack::read_string(const char* name, wstring* str) { +void msgpack::read_string(const char* name, std::wstring& str) { if (!this) { - *str = wstring_empty; + str = {}; return; } @@ -813,11 +789,11 @@ void msgpack::read_string(const char* name, wstring* str) { if (m && m->type == MSGPACK_STRING) { std::string* ptr = MSGPACK_SELECT_PTR(std::string, m); wchar_t* temp = utf8_to_utf16(ptr->c_str()); - wstring_init(str, temp); + str = temp; free(temp); } else - *str = wstring_empty; + str = {}; } msgpack& msgpack::operator=(const msgpack& m) { diff --git a/src/KKdLib/msgpack.hpp b/src/KKdLib/msgpack.hpp index a0482db0..b68f3cf5 100644 --- a/src/KKdLib/msgpack.hpp +++ b/src/KKdLib/msgpack.hpp @@ -7,8 +7,7 @@ #include #include -#include "default.h" -#include "string.h" +#include "default.hpp" enum msgpack_type : uint32_t { MSGPACK_NONE = 0, @@ -65,10 +64,8 @@ struct msgpack { msgpack(const char* name, double_t val); msgpack(const char* name, const char* val); msgpack(const char* name, const wchar_t* val); - msgpack(const char* name, string* val); - msgpack(const char* name, std::string* val); - msgpack(const char* name, wstring* val); - msgpack(const char* name, std::wstring* val); + msgpack(const char* name, std::string& val); + msgpack(const char* name, std::wstring& val); ~msgpack(); bool check_null(); @@ -94,10 +91,8 @@ struct msgpack { double_t read_double_t(const char* name); char* read_utf8_string(const char* name); wchar_t* read_utf16_string(const char* name); - void read_string(const char* name, string* str); - void read_string(const char* name, std::string* str); - void read_string(const char* name, wstring* str); - void read_string(const char* name, std::wstring* str); + void read_string(const char* name, std::string& str); + void read_string(const char* name, std::wstring& str); msgpack& operator=(const msgpack& m); }; diff --git a/src/KKdLib/obj.cpp b/src/KKdLib/obj.cpp index 06a3fef8..744bba64 100644 --- a/src/KKdLib/obj.cpp +++ b/src/KKdLib/obj.cpp @@ -6,12 +6,12 @@ #include "obj.hpp" #include #include "f2/struct.hpp" -#include "io/path.h" -#include "io/stream.h" -#include "half_t.h" +#include "io/path.hpp" +#include "io/stream.hpp" +#include "half_t.hpp" #include "hash.hpp" #include "sort.hpp" -#include "str_utils.h" +#include "str_utils.hpp" enum obj_vertex_format_file { OBJ_VERTEX_FORMAT_FILE_POSITION = 0x00000001, @@ -115,122 +115,122 @@ static bool obj_material_texture_enrs_table_initialized; static void obj_material_texture_enrs_table_init(); static void obj_material_texture_enrs_table_free(void); -static void obj_set_classic_read_inner(obj_set* os, stream* s); -static void obj_set_classic_write_inner(obj_set* os, stream* s); -static void obj_classic_read_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh); -static void obj_classic_write_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh); -static void obj_classic_read_model(obj* obj, stream* s, int64_t base_offset); -static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset); -static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset); -static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset); +static void obj_set_classic_read_inner(obj_set* os, stream& s); +static void obj_set_classic_write_inner(obj_set* os, stream& s); +static void obj_classic_read_index(obj* obj, stream& s, obj_sub_mesh* sub_mesh); +static void obj_classic_write_index(obj* obj, stream& s, obj_sub_mesh* sub_mesh); +static void obj_classic_read_model(obj* obj, stream& s, int64_t base_offset); +static void obj_classic_write_model(obj* obj, stream& s, int64_t base_offset); +static void obj_classic_read_skin(obj* obj, stream& s, int64_t base_offset); +static void obj_classic_write_skin(obj* obj, stream& s, int64_t base_offset); static void obj_classic_read_skin_block_cloth(obj_skin_block_cloth* b, - stream* s, char** str); + stream& s, char** str); static void obj_classic_write_skin_block_cloth(obj_skin_block_cloth* b, - stream* s, std::vector& strings, std::vector& string_offsets, + stream& s, std::vector& strings, std::vector& string_offsets, int64_t* field_18_offset, int64_t* field_1C_offset, int64_t* field_20_offset, int64_t* field_24_offset, int64_t* field_28_offset); static void obj_classic_read_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, - stream* s, char** str); + stream& s, char** str); static void obj_classic_write_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, - stream* s, std::vector& strings, std::vector& string_offsets); + stream& s, std::vector& strings, std::vector& string_offsets); static void obj_classic_read_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, - stream* s, char** str); + stream& s, char** str); static void obj_classic_write_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, - stream* s, std::vector& strings, std::vector& string_offsets); + stream& s, std::vector& strings, std::vector& string_offsets); static void obj_classic_read_skin_block_constraint(obj_skin_block_constraint* b, - stream* s, char** str); + stream& s, char** str); static void obj_classic_write_skin_block_constraint(obj_skin_block_constraint* b, - stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names, int64_t* offsets); + stream& s, std::vector& strings, std::vector& string_offsets, char** bone_names, int64_t* offsets); static void obj_classic_read_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, - stream* s, char** str); + stream& s, char** str); static void obj_classic_write_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, - stream* s, std::vector& strings, std::vector& string_offsets); + stream& s, std::vector& strings, std::vector& string_offsets); static void obj_classic_read_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, - stream* s, char** str); + stream& s, char** str); static void obj_classic_write_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, - stream* s, std::vector& strings, std::vector& string_offsets); + stream& s, std::vector& strings, std::vector& string_offsets); static void obj_classic_read_skin_block_expression(obj_skin_block_expression* b, - stream* s, char** str); + stream& s, char** str); static void obj_classic_write_skin_block_expression(obj_skin_block_expression* b, - stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names); + stream& s, std::vector& strings, std::vector& string_offsets, char** bone_names); static void obj_classic_read_skin_block_motion(obj_skin_block_motion* b, - stream* s, char** str); + stream& s, char** str); static void obj_classic_write_skin_block_motion(obj_skin_block_motion* b, - stream* s, std::vector& strings, std::vector& string_offsets, + stream& s, std::vector& strings, std::vector& string_offsets, char** bone_names, int64_t* bone_names_offset, int64_t* bone_matrices_offset); static void obj_classic_read_skin_block_node(obj_skin_block_node* b, - stream* s, char** str); + stream& s, char** str); static void obj_classic_write_skin_block_node(obj_skin_block_node* b, - stream* s, std::vector& strings, std::vector& string_offsets); + stream& s, std::vector& strings, std::vector& string_offsets); static void obj_classic_read_skin_block_osage(obj_skin_block_osage* b, - stream* s, char** str); + 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* vertex, obj_mesh* mesh, + 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* vertex, 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, obj_mesh* mesh, +static void obj_classic_write_vertex(obj* obj, stream& s, int64_t* vertex, 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, +static void obj_set_modern_read_inner(obj_set* os, stream& s); +static void obj_set_modern_write_inner(obj_set* os, stream& s); +static void obj_modern_read_index(obj* obj, stream& s, obj_sub_mesh* sub_mesh); -static void obj_modern_write_index(obj* obj, stream* s, bool is_x, +static void obj_modern_write_index(obj* obj, stream& s, bool is_x, obj_sub_mesh* sub_mesh, f2_struct* ovtx); -static void obj_modern_read_model(obj* obj, stream* s, int64_t base_offset, +static void obj_modern_read_model(obj* obj, stream& s, int64_t base_offset, uint32_t header_length, bool is_x, stream* s_oidx, stream* s_ovtx); -static void obj_modern_write_model(obj* obj, stream* s, +static void obj_modern_write_model(obj* obj, stream& s, int64_t base_offset, bool is_x, f2_struct* omdl); -static void obj_modern_read_skin(obj* obj, stream* s, int64_t base_offset, +static void obj_modern_read_skin(obj* obj, stream& s, int64_t base_offset, uint32_t header_length, bool is_x); -static void obj_modern_write_skin(obj* obj, stream* s, +static void obj_modern_write_skin(obj* obj, stream& s, int64_t base_offset, bool is_x, f2_struct* oskn); static void obj_modern_read_skin_block_cloth(obj_skin_block_cloth* b, - stream* s, uint32_t header_length, char** str, bool is_x); + stream& s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_cloth(obj_skin_block_cloth* b, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x, + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x, int64_t* field_18_offset, int64_t* field_1C_offset, int64_t* field_20_offset, int64_t* field_24_offset, int64_t* field_28_offset); static void obj_modern_read_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, - stream* s, uint32_t header_length, char** str, bool is_x); + stream& s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x); + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x); static void obj_modern_read_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, - stream* s, uint32_t header_length, char** str, bool is_x); + stream& s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x); + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x); static void obj_modern_read_skin_block_constraint(obj_skin_block_constraint* b, - stream* s, uint32_t header_length, char** str, bool is_x); + stream& s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_constraint(obj_skin_block_constraint* b, - stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names, + stream& s, std::vector& strings, std::vector& string_offsets, char** bone_names, bool is_x, int64_t* offsets); static void obj_modern_read_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, - stream* s, uint32_t header_length, char** str, bool is_x); + stream& s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x); + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x); static void obj_modern_read_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, - stream* s, uint32_t header_length, char** str, bool is_x); + stream& s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x); + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x); static void obj_modern_read_skin_block_expression(obj_skin_block_expression* b, - stream* s, uint32_t header_length, char** str, bool is_x); + stream& s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_expression(obj_skin_block_expression* b, - stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names, bool is_x); + stream& s, std::vector& strings, std::vector& string_offsets, char** bone_names, bool is_x); static void obj_modern_read_skin_block_motion(obj_skin_block_motion* b, - stream* s, uint32_t header_length, char** str, bool is_x); + stream& s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_motion(obj_skin_block_motion* b, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x, + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x, char** bone_names, int64_t* bone_names_offset, int64_t* bone_matrices_offset); static void obj_modern_read_skin_block_node(obj_skin_block_node* b, - stream* s, uint32_t header_length, char** str, bool is_x); + stream& s, uint32_t header_length, char** str, bool is_x); static void obj_modern_write_skin_block_node(obj_skin_block_node* b, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x); + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x); static void obj_modern_read_skin_block_osage(obj_skin_block_osage* b, - stream* s, uint32_t header_length, char** str, bool is_x); + 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* vertex, obj_mesh* mesh, + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x); +static void obj_modern_read_vertex(obj* obj, stream& s, int64_t* vertex, 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, +static void obj_modern_write_vertex(obj* obj, stream& s, bool is_x, int64_t* vertex, 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); @@ -274,7 +274,7 @@ obj_set::~obj_set() { 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[j].name); free(obj->skin.bones); for (uint32_t j = 0; j < obj->skin.ex_data.blocks_count; j++) { @@ -282,13 +282,13 @@ obj_set::~obj_set() { switch (block->type) { case OBJ_SKIN_BLOCK_CLOTH: { obj_skin_block_cloth* cloth = &block->cloth; - string_free(&cloth->mesh_name); - string_free(&cloth->backface_mesh_name); + free(cloth->mesh_name); + free(cloth->backface_mesh_name); for (uint32_t k = 0; k < cloth->count; k++) { obj_skin_block_cloth_field_1C* sub = &cloth->field_1C[k]; for (uint32_t l = 0; l < 4; l++) - string_free(&sub->sub_data[l].bone_name); + free(sub->sub_data[l].bone_name); } free(cloth->field_1C); free(cloth->field_20); @@ -298,19 +298,19 @@ obj_set::~obj_set() { case OBJ_SKIN_BLOCK_CONSTRAINT: { obj_skin_block_constraint* constraint = &block->constraint; obj_skin_block_node_free(&constraint->base); - string_free(&constraint->source_node_name); + free(constraint->source_node_name); } break; case OBJ_SKIN_BLOCK_EXPRESSION: { obj_skin_block_expression* expression = &block->expression; obj_skin_block_node_free(&expression->base); for (uint32_t k = 0; k < 9; k++) - string_free(&expression->expressions[k]); + free(expression->expressions[k]); } break; case OBJ_SKIN_BLOCK_MOTION: { obj_skin_block_motion* motion = &block->motion; obj_skin_block_node_free(&motion->base); if (is_x) - string_free(&motion->name); + free(motion->name); free(motion->nodes); } break; case OBJ_SKIN_BLOCK_OSAGE: { @@ -341,7 +341,7 @@ obj_set::~obj_set() { } free(obj->mesh_array); free(obj->material_array); - string_free(&obj->name); + free(obj->name); } free(obj_data); free(tex_id_data); @@ -352,36 +352,33 @@ void obj_set::pack_file(void** data, size_t* size) { return; stream s; - io_open(&s); + s.open(); if (!modern) - obj_set_classic_write_inner(this, &s); + obj_set_classic_write_inner(this, s); else - obj_set_modern_write_inner(this, &s); - io_align_write(&s, 0x10); - io_copy(&s, data, size); - io_free(&s); + obj_set_modern_write_inner(this, s); + s.align_write(0x10); + s.copy(data, size); } -void obj_set::unpack_file(void* data, size_t size, bool modern) { +void obj_set::unpack_file(const void* data, size_t size, bool modern) { if (!data || !size) return; stream s; - io_open(&s, data, size); + s.open(data, size); if (!modern) - obj_set_classic_read_inner(this, &s); + obj_set_classic_read_inner(this, s); else - obj_set_modern_read_inner(this, &s); - io_free(&s); + obj_set_modern_read_inner(this, s); } static void obj_material_texture_enrs_table_init() { if (!obj_material_texture_enrs_table_initialized) { stream s; - io_open(&s, (void*)&obj_material_texture_enrs_table_bin, + s.open((void*)&obj_material_texture_enrs_table_bin, sizeof(obj_material_texture_enrs_table_bin)); - obj_material_texture_enrs_table.read(&s); - io_free(&s); + obj_material_texture_enrs_table.read(s); atexit(obj_material_texture_enrs_table_free); obj_material_texture_enrs_table_initialized = true; } @@ -393,8 +390,8 @@ static void obj_material_texture_enrs_table_free(void) { obj_material_texture_enrs_table_initialized = false; } -static void obj_set_classic_read_inner(obj_set* os, stream* s) { - uint32_t version = io_read_uint32_t(s); +static void obj_set_classic_read_inner(obj_set* os, stream& s) { + uint32_t version = s.read_uint32_t(); if (version != 0x05062500) { os->is_x = false; os->modern = false; @@ -403,16 +400,16 @@ static void obj_set_classic_read_inner(obj_set* os, stream* 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); + os->obj_num = s.read_int32_t(); + osh.last_obj_id = s.read_int32_t(); + osh.obj_data = s.read_int32_t(); + osh.obj_skin_data = s.read_int32_t(); + osh.obj_name_data = s.read_int32_t(); + osh.obj_id_data = s.read_int32_t(); + osh.tex_id_data = s.read_int32_t(); + os->tex_id_num = s.read_int32_t(); + os->reserved[0] = s.read_uint32_t(); + os->reserved[1] = s.read_uint32_t(); uint32_t count = os->obj_num; os->obj_data = force_malloc_s(obj, os->obj_num); @@ -420,25 +417,25 @@ static void obj_set_classic_read_inner(obj_set* os, stream* s) { 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); + s.set_position(osh.obj_data, SEEK_SET); for (uint32_t i = 0; i < count; i++) - obj_datas[i] = io_read_int32_t(s); + obj_datas[i] = s.read_int32_t(); } 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); + s.set_position(osh.obj_skin_data, SEEK_SET); for (uint32_t i = 0; i < count; i++) - obj_skin_datas[i] = io_read_int32_t(s); + obj_skin_datas[i] = s.read_int32_t(); } 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); + s.set_position(osh.obj_name_data, SEEK_SET); for (uint32_t i = 0; i < count; i++) - obj_name_datas[i] = io_read_int32_t(s); + obj_name_datas[i] = s.read_int32_t(); } if (osh.obj_data) { @@ -451,23 +448,23 @@ static void obj_set_classic_read_inner(obj_set* os, stream* s) { obj_classic_read_skin(obj, s, obj_skin_datas[i]); if (osh.obj_name_data && obj_name_datas[i]) { - io_read_string_null_terminated_offset(s, obj_name_datas[i], &obj->name); - obj->hash = hash_string_murmurhash(&obj->name); + obj->name = s.read_utf8_string_null_terminated_offset(obj_name_datas[i]); + obj->hash = hash_utf8_murmurhash(obj->name); } else obj->hash = hash_murmurhash_empty; } - io_set_position(s, osh.obj_id_data, SEEK_SET); + s.set_position(osh.obj_id_data, SEEK_SET); for (uint32_t i = 0; i < count; i++) - os->obj_data[i].id = io_read_uint32_t(s); + os->obj_data[i].id = s.read_uint32_t(); } 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); + s.set_position(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); + os->tex_id_data[i] = s.read_uint32_t(); } free(obj_datas); @@ -479,76 +476,76 @@ static void obj_set_classic_read_inner(obj_set* os, stream* s) { os->ready = true; } -static void obj_set_classic_write_inner(obj_set* os, stream* s) { - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_align_write(s, 0x10); +static void obj_set_classic_write_inner(obj_set* os, stream& s) { + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.align_write(0x10); obj_set_header osh = {}; osh.last_obj_id = -1; uint32_t count = os->obj_num; - osh.obj_data = io_get_position(s); + osh.obj_data = s.get_position(); for (uint32_t i = 0; i < count; i++) - io_write_int32_t(s, 0); - io_align_write(s, 0x10); + s.write_int32_t(0); + s.align_write(0x10); int32_t* obj_datas = force_malloc_s(int32_t, count); for (uint32_t i = 0; i < count; i++) { - obj_datas[i] = (int32_t)io_get_position(s); + obj_datas[i] = (int32_t)s.get_position(); obj_classic_write_model(&os->obj_data[i], s, obj_datas[i]); } - io_align_write(s, 0x10); + s.align_write(0x10); - io_position_push(s, osh.obj_data, SEEK_SET); + s.position_push(osh.obj_data, SEEK_SET); for (uint32_t i = 0; i < count; i++) - io_write_int32_t(s, (int32_t)obj_datas[i]); - io_position_pop(s); + s.write_int32_t((int32_t)obj_datas[i]); + s.position_pop(); free(obj_datas); - osh.obj_id_data = io_get_position(s); + osh.obj_id_data = s.get_position(); for (uint32_t i = 0; i < count; i++) { int32_t object_id = os->obj_data[i].id; - io_write_uint32_t(s, object_id); + s.write_uint32_t(object_id); if (osh.last_obj_id < object_id) osh.last_obj_id = object_id; } - io_align_write(s, 0x10); + s.align_write(0x10); int32_t* obj_name_datas = force_malloc_s(int32_t, count); for (uint32_t i = 0; i < count; i++) { - obj_name_datas[i] = (int32_t)io_get_position(s); - io_write_string_null_terminated(s, &os->obj_data[i].name); + obj_name_datas[i] = (int32_t)s.get_position(); + s.write_utf8_string_null_terminated(os->obj_data[i].name); } - io_align_write(s, 0x10); + s.align_write(0x10); - osh.obj_name_data = io_get_position(s); + osh.obj_name_data = s.get_position(); for (uint32_t i = 0; i < count; i++) - io_write_int32_t(s, obj_name_datas[i]); - io_align_write(s, 0x10); + s.write_int32_t(obj_name_datas[i]); + s.align_write(0x10); free(obj_name_datas); - osh.tex_id_data = io_get_position(s); + osh.tex_id_data = s.get_position(); 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); + s.write_uint32_t(os->tex_id_data[i]); + s.align_write(0x10); - osh.obj_skin_data = io_get_position(s); + osh.obj_skin_data = s.get_position(); for (uint32_t i = 0; i < count; i++) - io_write_int32_t(s, 0); - io_align_write(s, 0x10); + s.write_int32_t(0); + s.align_write(0x10); int32_t* obj_skin_datas = force_malloc_s(int32_t, count); for (uint32_t i = 0; i < count; i++) { @@ -557,33 +554,33 @@ static void obj_set_classic_write_inner(obj_set* os, stream* s) { continue; } - obj_skin_datas[i] = (int32_t)io_get_position(s); + obj_skin_datas[i] = (int32_t)s.get_position(); obj_classic_write_skin(&os->obj_data[i], s, obj_skin_datas[i]); } - io_align_write(s, 0x10); + s.align_write(0x10); - io_position_push(s, osh.obj_skin_data, SEEK_SET); + s.position_push(osh.obj_skin_data, SEEK_SET); for (uint32_t i = 0; i < count; i++) - io_write_int32_t(s, obj_skin_datas[i]); - io_position_pop(s); + s.write_int32_t(obj_skin_datas[i]); + s.position_pop(); free(obj_skin_datas); - io_position_push(s, 0x00, SEEK_SET); - 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); + s.position_push(0x00, SEEK_SET); + s.write_uint32_t(0x05062500); + s.write_int32_t(os->obj_num); + s.write_uint32_t(osh.last_obj_id); + s.write_int32_t((int32_t)osh.obj_data); + s.write_int32_t((int32_t)osh.obj_skin_data); + s.write_int32_t((int32_t)osh.obj_name_data); + s.write_int32_t((int32_t)osh.obj_id_data); + s.write_int32_t((int32_t)osh.tex_id_data); + s.write_int32_t(os->tex_id_num); + s.write_uint32_t(os->reserved[0]); + s.write_uint32_t(os->reserved[1]); + s.position_pop(); } -static void obj_classic_read_index(obj* obj, stream* s, +static void obj_classic_read_index(obj* obj, stream& s, obj_sub_mesh* sub_mesh) { bool tri_strip = sub_mesh->primitive_type == OBJ_PRIMITIVE_TRIANGLE_STRIP; uint32_t indices_count = sub_mesh->indices_count; @@ -591,103 +588,103 @@ static void obj_classic_read_index(obj* obj, stream* s, switch (sub_mesh->index_format) { case OBJ_INDEX_U8: for (uint32_t i = 0; i < indices_count; i++) { - uint8_t idx = io_read_uint8_t(s); + uint8_t idx = s.read_uint8_t(); indices[i] = tri_strip && idx == 0xFF ? 0xFFFFFFFF : idx; } break; case OBJ_INDEX_U16: for (uint32_t i = 0; i < indices_count; i++) { - uint16_t idx = io_read_uint16_t(s); + uint16_t idx = s.read_uint16_t(); indices[i] = tri_strip && idx == 0xFFFF ? 0xFFFFFFFF : idx; } break; case OBJ_INDEX_U32: for (uint32_t i = 0; i < indices_count; i++) - indices[i] = io_read_uint32_t(s); + indices[i] = s.read_uint32_t(); break; } sub_mesh->indices = indices; } -static void obj_classic_write_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh) { +static void obj_classic_write_index(obj* obj, stream& s, obj_sub_mesh* sub_mesh) { uint32_t* indices = sub_mesh->indices; uint32_t indices_count = sub_mesh->indices_count; switch (sub_mesh->index_format) { case OBJ_INDEX_U8: for (uint32_t i = 0; i < indices_count; i++) - io_write_uint8_t(s, (uint8_t)indices[i]); + s.write_uint8_t((uint8_t)indices[i]); break; case OBJ_INDEX_U16: for (uint32_t i = 0; i < indices_count; i++) - io_write_uint16_t(s, (uint16_t)indices[i]); + s.write_uint16_t((uint16_t)indices[i]); break; case OBJ_INDEX_U32: for (uint32_t i = 0; i < indices_count; i++) - io_write_uint32_t(s, indices[i]); + s.write_uint32_t(indices[i]); break; } - io_align_write(s, 0x04); + s.align_write(0x04); } -static void obj_classic_read_model(obj* obj, stream* s, int64_t base_offset) { +static void obj_classic_read_model(obj* obj, stream& s, int64_t base_offset) { const size_t mesh_size = 0xD8; const size_t sub_mesh_size = 0x5C; - io_set_position(s, base_offset, SEEK_SET); + s.set_position(base_offset, SEEK_SET); 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->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); + s.read_uint32_t(); // version + s.read_uint32_t(); // flags + obj->bounding_sphere.center.x = s.read_float_t(); + obj->bounding_sphere.center.y = s.read_float_t(); + obj->bounding_sphere.center.z = s.read_float_t(); + obj->bounding_sphere.radius = s.read_float_t(); + obj->num_mesh = s.read_int32_t(); + oh.mesh_array = s.read_int32_t(); + obj->num_material = s.read_int32_t(); + oh.material_array = s.read_int32_t(); + obj->reserved[0] = s.read_uint32_t(); + obj->reserved[1] = s.read_uint32_t(); + obj->reserved[2] = s.read_uint32_t(); + obj->reserved[3] = s.read_uint32_t(); + obj->reserved[4] = s.read_uint32_t(); + obj->reserved[5] = s.read_uint32_t(); + obj->reserved[6] = s.read_uint32_t(); + obj->reserved[7] = s.read_uint32_t(); + obj->reserved[8] = s.read_uint32_t(); + obj->reserved[9] = s.read_uint32_t(); 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.mesh_array + mesh_size * i, SEEK_SET); + s.set_position(base_offset + oh.mesh_array + mesh_size * i, SEEK_SET); 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->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); + mesh->flags = s.read_uint32_t(); + mesh->bounding_sphere.center.x = s.read_float_t(); + mesh->bounding_sphere.center.y = s.read_float_t(); + mesh->bounding_sphere.center.z = s.read_float_t(); + mesh->bounding_sphere.radius = s.read_float_t(); + mesh->num_submesh = s.read_int32_t(); + mh.submesh_array = s.read_int32_t(); + mh.format = (obj_vertex_format_file)s.read_uint32_t(); + mh.size_vertex = s.read_int32_t(); + mh.num_vertex = s.read_int32_t(); for (uint32_t j = 0; j < 20; j++) - mh.vertex[j] = io_read_int32_t(s); + mh.vertex[j] = s.read_int32_t(); - 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->attrib.w = s.read_uint32_t(); + mh.vertex_flags = s.read_uint32_t(); + mesh->reserved[0] = s.read_uint32_t(); + mesh->reserved[1] = s.read_uint32_t(); + mesh->reserved[2] = s.read_uint32_t(); + mesh->reserved[3] = s.read_uint32_t(); + mesh->reserved[4] = s.read_uint32_t(); + mesh->reserved[5] = s.read_uint32_t(); + s.read(&mesh->name, sizeof(mesh->name)); mesh->name[sizeof(mesh->name) - 1] = 0; if (mh.submesh_array) { @@ -695,38 +692,38 @@ static void obj_classic_read_model(obj* obj, stream* s, int64_t base_offset) { 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.submesh_array + sub_mesh_size * j, SEEK_SET); + s.set_position(base_offset + mh.submesh_array + sub_mesh_size * j, SEEK_SET); 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->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); - sub_mesh->primitive_type = (obj_primitive_type)io_read_uint32_t(s); - 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->attrib.w = io_read_uint32_t(s); + sub_mesh->flags = s.read_uint32_t(); + sub_mesh->bounding_sphere.center.x = s.read_float_t(); + sub_mesh->bounding_sphere.center.y = s.read_float_t(); + sub_mesh->bounding_sphere.center.z = s.read_float_t(); + sub_mesh->bounding_sphere.radius = s.read_float_t(); + sub_mesh->material_index = s.read_uint32_t(); + s.read(&sub_mesh->uv_index, 0x08); + sub_mesh->bone_indices_count = s.read_int32_t(); + smh.bone_indices_offset = s.read_int32_t(); + sub_mesh->bones_per_vertex = s.read_uint32_t(); + sub_mesh->primitive_type = (obj_primitive_type)s.read_uint32_t(); + sub_mesh->index_format = (obj_index_format)s.read_uint32_t(); + sub_mesh->indices_count = s.read_int32_t(); + smh.indices_offset = s.read_int32_t(); + sub_mesh->attrib.w = s.read_uint32_t(); 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; sub_mesh->bounding_box.size.z = sub_mesh->bounding_sphere.radius * 2.0f; - io_read(s, 0, 0x18); - sub_mesh->indices_offset = io_read_uint32_t(s); + s.read(0, 0x18); + sub_mesh->indices_offset = s.read_uint32_t(); if (sub_mesh->bones_per_vertex == 4 && smh.bone_indices_offset) { sub_mesh->bone_indices = force_malloc_s(uint16_t, sub_mesh->bone_indices_count); - io_set_position(s, base_offset + smh.bone_indices_offset, SEEK_SET); - io_read(s, sub_mesh->bone_indices, sub_mesh->bone_indices_count * sizeof(uint16_t)); + s.set_position(base_offset + smh.bone_indices_offset, SEEK_SET); + s.read(sub_mesh->bone_indices, sub_mesh->bone_indices_count * sizeof(uint16_t)); } - io_set_position(s, base_offset + smh.indices_offset, SEEK_SET); + s.set_position(base_offset + smh.indices_offset, SEEK_SET); obj_classic_read_index(obj, s, sub_mesh); } } @@ -737,64 +734,64 @@ static void obj_classic_read_model(obj* obj, stream* s, int64_t base_offset) { } if (oh.material_array > 0) { - io_set_position(s, base_offset + oh.material_array, SEEK_SET); + s.set_position(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)); + s.read(obj->material_array, obj->num_material * sizeof(obj_material_data)); } } -static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset) { +static void obj_classic_write_model(obj* obj, stream& s, int64_t base_offset) { const size_t mesh_size = 0xD8; const size_t sub_mesh_size = 0x5C; - io_write_uint32_t(s, 0); - io_write_uint32_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_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_write_uint32_t(s, 0); - io_align_write(s, 0x10); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_float_t(0); + s.write_float_t(0); + s.write_float_t(0); + s.write_float_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.align_write(0x10); obj_header oh = {}; if (obj->num_mesh) { - oh.mesh_array = io_get_position(s) - base_offset; + oh.mesh_array = s.get_position() - base_offset; 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); - io_write_float_t(s, 0.0f); - io_write_float_t(s, 0.0f); - io_write_float_t(s, 0.0f); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_uint32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); + s.write(0x04); + s.write_float_t(0.0f); + s.write_float_t(0.0f); + s.write_float_t(0.0f); + s.write_float_t(0.0f); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_uint32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); for (uint32_t j = 0; j < 20; j++) - io_write_int32_t(s, 0); + s.write_int32_t(0); - io_write_int32_t(s, 0); - io_write_uint32_t(s, 0); - io_write(s, 0x18); - io_write(s, sizeof(mesh->name)); + s.write_int32_t(0); + s.write_uint32_t(0); + s.write(0x18); + s.write(sizeof(mesh->name)); } for (uint32_t i = 0; i < obj->num_mesh; i++) { @@ -802,25 +799,25 @@ static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset) { obj_mesh_header* mh = &mhs[i]; if (mesh->num_submesh) { - mh->submesh_array = io_get_position(s) - base_offset; + mh->submesh_array = s.get_position() - 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); - io_write_float_t(s, 0.0f); - io_write_float_t(s, 0.0f); - io_write_uint32_t(s, 0); - io_write(s, 0x08); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_uint32_t(s, 0); - io_write_uint32_t(s, 0); - io_write_uint32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_uint32_t(s, 0); - io_write(s, 0x18); - io_write_uint32_t(s, 0); + s.write(0x04); + s.write_float_t(0.0f); + s.write_float_t(0.0f); + s.write_float_t(0.0f); + s.write_float_t(0.0f); + s.write_uint32_t(0); + s.write(0x08); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_uint32_t(0); + s.write(0x18); + s.write_uint32_t(0); } } @@ -832,113 +829,113 @@ static void obj_classic_write_model(obj* obj, stream* s, int64_t base_offset) { 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)); - io_align_write(s, 0x04); + smh.bone_indices_offset = s.get_position() - base_offset; + s.write(sub_mesh->bone_indices, sub_mesh->bone_indices_count * sizeof(uint16_t)); + s.align_write(0x04); } - smh.indices_offset = io_get_position(s) - base_offset; + smh.indices_offset = s.get_position() - base_offset; obj_classic_write_index(obj, s, sub_mesh); - 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->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); - io_write_uint32_t(s, sub_mesh->primitive_type); - 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->attrib.w); - io_write(s, 0x18); - io_write_uint32_t(s, sub_mesh->indices_offset); - io_position_pop(s); + s.position_push(base_offset + mh->submesh_array + sub_mesh_size * j, SEEK_SET); + s.write_uint32_t(sub_mesh->flags); + s.write_float_t(sub_mesh->bounding_sphere.center.x); + s.write_float_t(sub_mesh->bounding_sphere.center.y); + s.write_float_t(sub_mesh->bounding_sphere.center.z); + s.write_float_t(sub_mesh->bounding_sphere.radius); + s.write_uint32_t(sub_mesh->material_index); + s.write(&sub_mesh->uv_index, 0x08); + s.write_int32_t(sub_mesh->bone_indices_count); + s.write_int32_t((int32_t)smh.bone_indices_offset); + s.write_uint32_t(sub_mesh->bones_per_vertex); + s.write_uint32_t(sub_mesh->primitive_type); + s.write_uint32_t(sub_mesh->index_format); + s.write_int32_t(sub_mesh->indices_count); + s.write_int32_t((int32_t)smh.indices_offset); + s.write_uint32_t(sub_mesh->attrib.w); + s.write(0x18); + s.write_uint32_t(sub_mesh->indices_offset); + s.position_pop(); } } - io_position_push(s, base_offset + oh.mesh_array, SEEK_SET); + s.position_push(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_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->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); + s.write_uint32_t(mesh->flags); + s.write_float_t(mesh->bounding_sphere.center.x); + s.write_float_t(mesh->bounding_sphere.center.y); + s.write_float_t(mesh->bounding_sphere.center.z); + s.write_float_t(mesh->bounding_sphere.radius); + s.write_int32_t(mesh->num_submesh); + s.write_int32_t((int32_t)mh->submesh_array); + s.write_uint32_t(mh->format); + s.write_int32_t(mh->size_vertex); + s.write_int32_t(mh->num_vertex); for (uint32_t j = 0; j < 20; j++) - io_write_int32_t(s, (int32_t)mh->vertex[j]); + s.write_int32_t((int32_t)mh->vertex[j]); - 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'); + s.write_uint32_t(mesh->attrib.w); + s.write_uint32_t(mh->vertex_flags); + s.write_uint32_t(mesh->reserved[0]); + s.write_uint32_t(mesh->reserved[1]); + s.write_uint32_t(mesh->reserved[2]); + s.write_uint32_t(mesh->reserved[3]); + s.write_uint32_t(mesh->reserved[4]); + s.write_uint32_t(mesh->reserved[5]); + s.write(&mesh->name, sizeof(mesh->name) - 1); + s.write_char('\0'); } - io_position_pop(s); + s.position_pop(); free(mhs); } 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)); + oh.material_array = s.get_position() - base_offset; + s.write(obj->material_array, obj->num_material * sizeof(obj_material_data)); } - io_align_write(s, 0x10); + s.align_write(0x10); - io_position_push(s, base_offset, SEEK_SET); - io_write_uint32_t(s, 0x10000); - io_write_uint32_t(s, 0x00); - 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->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); + s.position_push(base_offset, SEEK_SET); + s.write_uint32_t(0x10000); + s.write_uint32_t(0x00); + s.write_float_t(obj->bounding_sphere.center.x); + s.write_float_t(obj->bounding_sphere.center.y); + s.write_float_t(obj->bounding_sphere.center.z); + s.write_float_t(obj->bounding_sphere.radius); + s.write_int32_t(obj->num_mesh); + s.write_int32_t((int32_t)oh.mesh_array); + s.write_int32_t(obj->num_material); + s.write_int32_t((int32_t)oh.material_array); + s.write_uint32_t(obj->reserved[0]); + s.write_uint32_t(obj->reserved[1]); + s.write_uint32_t(obj->reserved[2]); + s.write_uint32_t(obj->reserved[3]); + s.write_uint32_t(obj->reserved[4]); + s.write_uint32_t(obj->reserved[5]); + s.write_uint32_t(obj->reserved[6]); + s.write_uint32_t(obj->reserved[7]); + s.write_uint32_t(obj->reserved[8]); + s.write_uint32_t(obj->reserved[9]); + s.position_pop(); } -static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset) { +static void obj_classic_read_skin(obj* obj, stream& s, int64_t base_offset) { obj_skin* sk = &obj->skin; obj->skin_init = true; - io_set_position(s, base_offset, SEEK_SET); + s.set_position(base_offset, SEEK_SET); 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); - sh.ex_data_offset = io_read_int32_t(s); - sk->bones_count = io_read_int32_t(s); - sh.bone_parent_ids_offset = io_read_int32_t(s); - io_read(s, 0, 0x0C); + sh.bone_ids_offset = s.read_int32_t(); + sh.bone_matrices_offset = s.read_int32_t(); + sh.bone_names_offset = s.read_int32_t(); + sh.ex_data_offset = s.read_int32_t(); + sk->bones_count = s.read_int32_t(); + sh.bone_parent_ids_offset = s.read_int32_t(); + s.read(0, 0x0C); if (sh.bone_ids_offset) { sk->bones = force_malloc_s(obj_skin_bone, sk->bones_count); @@ -946,48 +943,48 @@ static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset) { int32_t* bone_names_offsets = 0; if (sh.bone_names_offset) { bone_names_offsets = force_malloc_s(int32_t, sk->bones_count); - io_set_position(s, sh.bone_names_offset, SEEK_SET); + s.set_position(sh.bone_names_offset, SEEK_SET); for (uint32_t i = 0; i < sk->bones_count; i++) - bone_names_offsets[i] = io_read_int32_t(s); + bone_names_offsets[i] = s.read_int32_t(); } if (sh.bone_ids_offset) { - io_set_position(s, sh.bone_ids_offset, SEEK_SET); + s.set_position(sh.bone_ids_offset, SEEK_SET); for (uint32_t i = 0; i < sk->bones_count; i++) - sk->bones[i].id = io_read_uint32_t(s); + sk->bones[i].id = s.read_uint32_t(); if (sh.bone_matrices_offset) { - io_set_position(s, sh.bone_matrices_offset, SEEK_SET); + s.set_position(sh.bone_matrices_offset, SEEK_SET); for (uint32_t i = 0; i < sk->bones_count; i++) { mat4u& mat = sk->bones[i].inv_bind_pose_mat; - mat.row0.x = io_read_float_t(s); - mat.row1.x = io_read_float_t(s); - mat.row2.x = io_read_float_t(s); - mat.row3.x = io_read_float_t(s); - mat.row0.y = io_read_float_t(s); - mat.row1.y = io_read_float_t(s); - mat.row2.y = io_read_float_t(s); - mat.row3.y = io_read_float_t(s); - mat.row0.z = io_read_float_t(s); - mat.row1.z = io_read_float_t(s); - mat.row2.z = io_read_float_t(s); - mat.row3.z = io_read_float_t(s); - mat.row0.w = io_read_float_t(s); - mat.row1.w = io_read_float_t(s); - mat.row2.w = io_read_float_t(s); - mat.row3.w = io_read_float_t(s); + mat.row0.x = s.read_float_t(); + mat.row1.x = s.read_float_t(); + mat.row2.x = s.read_float_t(); + mat.row3.x = s.read_float_t(); + mat.row0.y = s.read_float_t(); + mat.row1.y = s.read_float_t(); + mat.row2.y = s.read_float_t(); + mat.row3.y = s.read_float_t(); + mat.row0.z = s.read_float_t(); + mat.row1.z = s.read_float_t(); + mat.row2.z = s.read_float_t(); + mat.row3.z = s.read_float_t(); + mat.row0.w = s.read_float_t(); + mat.row1.w = s.read_float_t(); + mat.row2.w = s.read_float_t(); + mat.row3.w = s.read_float_t(); } } if (sh.bone_names_offset) for (uint32_t i = 0; i < sk->bones_count; i++) - io_read_string_null_terminated_offset(s, - bone_names_offsets[i], &sk->bones[i].name); + sk->bones[i].name = s.read_utf8_string_null_terminated_offset( + bone_names_offsets[i]); if (sh.bone_parent_ids_offset) { - io_set_position(s, sh.bone_parent_ids_offset, SEEK_SET); + s.set_position(sh.bone_parent_ids_offset, SEEK_SET); for (uint32_t i = 0; i < sk->bones_count; i++) - sk->bones[i].parent = io_read_uint32_t(s); + sk->bones[i].parent = s.read_uint32_t(); } } free(bone_names_offsets); @@ -996,42 +993,40 @@ static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset) { if (sh.ex_data_offset) { obj_skin_ex_data* ex = &sk->ex_data; sk->ex_data_init = true; - io_set_position(s, sh.ex_data_offset, SEEK_SET); + s.set_position(sh.ex_data_offset, SEEK_SET); 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); - exh.osage_nodes_offset = io_read_int32_t(s); - exh.osage_names_offset = io_read_int32_t(s); - exh.blocks_offset = io_read_int32_t(s); - 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_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); + exh.osage_count = s.read_int32_t(); + ex->osage_nodes_count = s.read_int32_t(); + s.read(0, 0x04); + exh.osage_nodes_offset = s.read_int32_t(); + exh.osage_names_offset = s.read_int32_t(); + exh.blocks_offset = s.read_int32_t(); + exh.bone_names_count = s.read_int32_t(); + exh.bone_names_offset = s.read_int32_t(); + exh.osage_sibling_infos_offset = s.read_int32_t(); + exh.cloth_count = s.read_uint32_t(); + ex->reserved[0] = s.read_uint32_t(); + ex->reserved[1] = s.read_uint32_t(); + ex->reserved[2] = s.read_uint32_t(); + ex->reserved[3] = s.read_uint32_t(); + ex->reserved[4] = s.read_uint32_t(); + ex->reserved[5] = s.read_uint32_t(); + ex->reserved[6] = s.read_uint32_t(); if (exh.bone_names_offset) { std::vector bone_names; bone_names.reserve(exh.bone_names_count); int32_t* strings_offsets = force_malloc_s(int32_t, exh.bone_names_count); - io_set_position(s, exh.bone_names_offset, SEEK_SET); + s.set_position(exh.bone_names_offset, SEEK_SET); for (uint32_t i = 0; i < exh.bone_names_count; i++) - strings_offsets[i] = io_read_int32_t(s); + strings_offsets[i] = s.read_int32_t(); size_t buf_size = 0; for (uint32_t i = 0; i < exh.bone_names_count; i++) { - if (strings_offsets[i]) { - std::string str; - io_read_string_null_terminated_offset(s, strings_offsets[i], &str); - bone_names.push_back(str); - } + if (strings_offsets[i]) + bone_names.push_back(s.read_string_null_terminated_offset( + strings_offsets[i])); else bone_names.push_back({}); buf_size += bone_names.back().size() + 1; @@ -1068,38 +1063,37 @@ static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset) { if (exh.osage_nodes_offset) { ex->osage_nodes = force_malloc_s(obj_skin_osage_node, ex->osage_nodes_count); - io_set_position(s, exh.osage_nodes_offset, SEEK_SET); + s.set_position(exh.osage_nodes_offset, SEEK_SET); for (uint32_t i = 0; i < ex->osage_nodes_count; i++) { obj_skin_osage_node* osage_node = &ex->osage_nodes[i]; - osage_node->name_index = io_read_uint32_t(s); - osage_node->length = io_read_float_t(s); - io_read(s, 0, 0x04); + osage_node->name_index = s.read_uint32_t(); + osage_node->length = s.read_float_t(); + s.read(0, 0x04); } } if (exh.blocks_offset) { ex->blocks_count = 0; - io_set_position(s, exh.blocks_offset, SEEK_SET); - while (io_read_int32_t(s)) { - io_read(s, 0, 0x04); + s.set_position(exh.blocks_offset, SEEK_SET); + while (s.read_int32_t()) { + s.read(0, 0x04); ex->blocks_count++; } obj_skin_block_header* bhs = force_malloc_s(obj_skin_block_header, ex->blocks_count); - io_set_position(s, exh.blocks_offset, SEEK_SET); + s.set_position(exh.blocks_offset, SEEK_SET); for (uint32_t i = 0; i < ex->blocks_count; i++) { - bhs[i].block_signature_offset = io_read_int32_t(s); - bhs[i].block_offset = io_read_int32_t(s); + bhs[i].block_signature_offset = s.read_int32_t(); + bhs[i].block_offset = s.read_int32_t(); } 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]; - std::string block_signature; - io_read_string_null_terminated_offset(s, - bhs[i].block_signature_offset, &block_signature); + std::string block_signature = s.read_string_null_terminated_offset( + bhs[i].block_signature_offset); if (block_signature.size() != 3) continue; @@ -1107,31 +1101,31 @@ static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset) { switch (signature) { case 'CLS\0': block->type = OBJ_SKIN_BLOCK_CLOTH; - io_set_position(s, bhs[i].block_offset, SEEK_SET); + s.set_position(bhs[i].block_offset, SEEK_SET); obj_classic_read_skin_block_cloth(&block->cloth, s, bone_names); break; case 'CNS\0': block->type = OBJ_SKIN_BLOCK_CONSTRAINT; - io_set_position(s, bhs[i].block_offset, SEEK_SET); + s.set_position(bhs[i].block_offset, SEEK_SET); obj_classic_read_skin_block_constraint(&block->constraint, s, bone_names); break; case 'EXP\0': block->type = OBJ_SKIN_BLOCK_EXPRESSION; - io_set_position(s, bhs[i].block_offset, SEEK_SET); + s.set_position(bhs[i].block_offset, SEEK_SET); obj_classic_read_skin_block_expression(&block->expression, s, bone_names); break; case 'MOT\0': block->type = OBJ_SKIN_BLOCK_MOTION; - io_set_position(s, bhs[i].block_offset, SEEK_SET); + s.set_position(bhs[i].block_offset, SEEK_SET); obj_classic_read_skin_block_motion(&block->motion, s, bone_names); break; case 'OSG\0': block->type = OBJ_SKIN_BLOCK_OSAGE; - io_set_position(s, bhs[i].block_offset, SEEK_SET); + s.set_position(bhs[i].block_offset, SEEK_SET); obj_classic_read_skin_block_osage(&block->osage, s, bone_names); break; @@ -1142,23 +1136,23 @@ static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset) { if (exh.osage_sibling_infos_offset) { ex->osage_sibling_infos_count = 0; - io_set_position(s, exh.osage_sibling_infos_offset, SEEK_SET); - while (io_read_uint32_t(s)) { - io_read(s, 0, 0x08); + s.set_position(exh.osage_sibling_infos_offset, SEEK_SET); + while (s.read_uint32_t()) { + s.read(0, 0x08); ex->osage_sibling_infos_count++; } obj_skin_osage_sibling_info* osis = force_malloc_s( obj_skin_osage_sibling_info, ex->osage_sibling_infos_count); ex->osage_sibling_infos = osis; - io_set_position(s, exh.osage_sibling_infos_offset, SEEK_SET); + s.set_position(exh.osage_sibling_infos_offset, SEEK_SET); for (uint32_t i = 0; i < ex->osage_sibling_infos_count; i++) { - osis[i].name_index = io_read_uint32_t(s); - osis[i].sibling_name_index = io_read_uint32_t(s); - osis[i].max_distance = io_read_float_t(s); + osis[i].name_index = s.read_uint32_t(); + osis[i].sibling_name_index = s.read_uint32_t(); + osis[i].max_distance = s.read_float_t(); } - io_set_position(s, exh.osage_sibling_infos_offset, SEEK_SET); + s.set_position(exh.osage_sibling_infos_offset, SEEK_SET); } for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -1184,61 +1178,61 @@ static void obj_classic_read_skin(obj* obj, stream* s, int64_t base_offset) { } } -static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { +static void obj_classic_write_skin(obj* obj, stream& s, int64_t base_offset) { obj_skin* sk = &obj->skin; obj_skin_header sh = {}; - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write(s, 0x0C); - io_align_write(s, 0x10); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write(0x0C); + s.align_write(0x10); std::vector strings; std::vector string_offsets; std::vector bone_names; if (sk->bones) { - sh.bone_ids_offset = io_get_position(s); + sh.bone_ids_offset = s.get_position(); for (uint32_t i = 0; i < sk->bones_count; i++) - io_write_int32_t(s, sk->bones[i].id); - io_align_write(s, 0x10); + s.write_int32_t(sk->bones[i].id); + s.align_write(0x10); - sh.bone_parent_ids_offset = io_get_position(s); + sh.bone_parent_ids_offset = s.get_position(); for (uint32_t i = 0; i < sk->bones_count; i++) - io_write_int32_t(s, sk->bones[i].parent); - io_align_write(s, 0x10); + s.write_int32_t(sk->bones[i].parent); + s.align_write(0x10); - sh.bone_names_offset = io_get_position(s); + sh.bone_names_offset = s.get_position(); for (uint32_t i = 0; i < sk->bones_count; i++) { - io_write_int32_t(s, 0); - obj_skin_strings_push_back_check(strings, string_data(&sk->bones[i].name)); + s.write_int32_t(0); + obj_skin_strings_push_back_check(strings, sk->bones[i].name); } - io_align_write(s, 0x10); + s.align_write(0x10); - sh.bone_matrices_offset = io_get_position(s); + sh.bone_matrices_offset = s.get_position(); for (uint32_t i = 0; i < sk->bones_count; i++) { mat4u& mat = sk->bones[i].inv_bind_pose_mat; - io_write_float_t(s, mat.row0.x); - io_write_float_t(s, mat.row1.x); - io_write_float_t(s, mat.row2.x); - io_write_float_t(s, mat.row3.x); - io_write_float_t(s, mat.row0.y); - io_write_float_t(s, mat.row1.y); - io_write_float_t(s, mat.row2.y); - io_write_float_t(s, mat.row3.y); - io_write_float_t(s, mat.row0.z); - io_write_float_t(s, mat.row1.z); - io_write_float_t(s, mat.row2.z); - io_write_float_t(s, mat.row3.z); - io_write_float_t(s, mat.row0.w); - io_write_float_t(s, mat.row1.w); - io_write_float_t(s, mat.row2.w); - io_write_float_t(s, mat.row3.w); + s.write_float_t(mat.row0.x); + s.write_float_t(mat.row1.x); + s.write_float_t(mat.row2.x); + s.write_float_t(mat.row3.x); + s.write_float_t(mat.row0.y); + s.write_float_t(mat.row1.y); + s.write_float_t(mat.row2.y); + s.write_float_t(mat.row3.y); + s.write_float_t(mat.row0.z); + s.write_float_t(mat.row1.z); + s.write_float_t(mat.row2.z); + s.write_float_t(mat.row3.z); + s.write_float_t(mat.row0.w); + s.write_float_t(mat.row1.w); + s.write_float_t(mat.row2.w); + s.write_float_t(mat.row3.w); } - io_align_write(s, 0x10); + s.align_write(0x10); } obj_skin_block_header* bhs = 0; @@ -1255,39 +1249,39 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { if (sk->ex_data_init) { obj_skin_ex_data* ex = &sk->ex_data; - sh.ex_data_offset = io_get_position(s); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write(s, 0x04); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write(s, 0x1C); - io_align_write(s, 0x10); + sh.ex_data_offset = s.get_position(); + s.write_int32_t(0); + s.write_int32_t(0); + s.write(0x04); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write(0x1C); + s.align_write(0x10); if (ex->osage_nodes_count) { - exh.osage_nodes_offset = io_get_position(s); + exh.osage_nodes_offset = s.get_position(); for (uint32_t i = 0; i < ex->osage_nodes_count; i++) { - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); } - io_align_write(s, 0x10); + s.align_write(0x10); - exh.osage_sibling_infos_offset = io_get_position(s); + exh.osage_sibling_infos_offset = s.get_position(); for (uint32_t i = 0; i < ex->osage_sibling_infos_count; i++) { - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); } - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_align_write(s, 0x10); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.align_write(0x10); } exh.cloth_count = 0; @@ -1301,13 +1295,13 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { } if (exh.osage_count || exh.cloth_count) { - exh.osage_names_offset = io_get_position(s); + exh.osage_names_offset = s.get_position(); for (uint32_t i = 0; i < exh.osage_count; i++) - io_write_int32_t(s, 0); + s.write_int32_t(0); for (uint32_t i = 0; i < exh.cloth_count; i++) - io_write_int32_t(s, 0); - io_align_write(s, 0x10); + s.write_int32_t(0); + s.align_write(0x10); } char** bone_names_ptr = ex->bone_names; @@ -1316,40 +1310,36 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { switch (block->type) { case OBJ_SKIN_BLOCK_CLOTH: { obj_skin_block_cloth* cloth = &block->cloth; - obj_skin_strings_push_back_check(strings, string_data(&cloth->mesh_name)); - obj_skin_strings_push_back_check(strings, string_data(&cloth->backface_mesh_name)); + obj_skin_strings_push_back_check(strings, cloth->mesh_name); + obj_skin_strings_push_back_check(strings, cloth->backface_mesh_name); for (uint32_t k = 0; k < cloth->count; k++) { obj_skin_block_cloth_field_1C* sub = &cloth->field_1C[k]; for (uint32_t l = 0; l < 4; l++) - obj_skin_strings_push_back_check(strings, - string_data(&sub->sub_data[l].bone_name)); + obj_skin_strings_push_back_check(strings, sub->sub_data[l].bone_name); } obj_skin_strings_push_back_check(strings, "CLS"); } break; case OBJ_SKIN_BLOCK_CONSTRAINT: { obj_skin_block_constraint* constraint = &block->constraint; - obj_skin_strings_push_back_check(strings, string_data(&constraint->base.parent_name)); + obj_skin_strings_push_back_check(strings, constraint->base.parent_name); obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, constraint->name_index); - obj_skin_strings_push_back_check(strings, string_data(&constraint->source_node_name)); + obj_skin_strings_push_back_check(strings, constraint->source_node_name); switch (constraint->type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: obj_skin_strings_push_back_check(strings, "Orientation"); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: obj_skin_strings_push_back_check(strings, "Direction"); - obj_skin_strings_push_back_check(strings, - string_data(&constraint->direction.up_vector.name)); + obj_skin_strings_push_back_check(strings, constraint->direction.up_vector.name); break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: obj_skin_strings_push_back_check(strings, "Position"); - obj_skin_strings_push_back_check(strings, - string_data(&constraint->position.up_vector.name)); + obj_skin_strings_push_back_check(strings, constraint->position.up_vector.name); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: obj_skin_strings_push_back_check(strings, "Distance"); - obj_skin_strings_push_back_check(strings, - string_data(&constraint->distance.up_vector.name)); + obj_skin_strings_push_back_check(strings, constraint->distance.up_vector.name); break; } obj_skin_strings_push_back_check(strings, "CNS"); @@ -1360,8 +1350,8 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { case OBJ_SKIN_BLOCK_EXPRESSION: { obj_skin_block_expression* expression = &block->expression; for (uint32_t j = 0; j < expression->expressions_count; j++) - obj_skin_strings_push_back_check(strings, string_data(&expression->expressions[j])); - obj_skin_strings_push_back_check(strings, string_data(&expression->base.parent_name)); + obj_skin_strings_push_back_check(strings, expression->expressions[j]); + obj_skin_strings_push_back_check(strings, expression->base.parent_name); obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, expression->name_index); obj_skin_strings_push_back_check(strings, "EXP"); @@ -1371,21 +1361,21 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { } break; case OBJ_SKIN_BLOCK_MOTION: { obj_skin_block_motion* motion = &block->motion; - obj_skin_strings_push_back_check(strings, string_data(&motion->base.parent_name)); - obj_skin_strings_push_back_check(strings, string_data(&motion->name)); + obj_skin_strings_push_back_check(strings, motion->base.parent_name); + obj_skin_strings_push_back_check(strings, motion->name); for (uint32_t j = 0; j < motion->nodes_count; j++) obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, motion->nodes[j].name_index); obj_skin_strings_push_back_check(strings, "MOT"); - obj_skin_strings_push_back_check(bone_names, string_data(&motion->name)); + obj_skin_strings_push_back_check(bone_names, motion->name); for (uint32_t j = 0; j < motion->nodes_count; j++) obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, motion->nodes[j].name_index); } break; case OBJ_SKIN_BLOCK_OSAGE: { obj_skin_block_osage* osage = &block->osage; - obj_skin_strings_push_back_check(strings, string_data(&osage->base.parent_name)); + obj_skin_strings_push_back_check(strings, osage->base.parent_name); obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, osage->name_index); obj_skin_strings_push_back_check_by_index(strings, @@ -1448,26 +1438,26 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { bone_names_ptr, osage->name_index); if (osage->root_init) - obj_skin_strings_push_back_check(strings, string_data(&osage->root.name)); + obj_skin_strings_push_back_check(strings, osage->root.name); } break; } } exh.bone_names_count = (int32_t)bone_names.size(); - exh.bone_names_offset = io_get_position(s); + exh.bone_names_offset = s.get_position(); for (std::string& i : bone_names) - io_write_int32_t(s, 0); - io_align_write(s, 0x10); + s.write_int32_t(0); + s.align_write(0x10); if (ex->blocks_count > 0) { - exh.blocks_offset = io_get_position(s); + exh.blocks_offset = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); + s.write_int32_t(0); + s.write_int32_t(0); } - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_align_write(s, 0x10); + s.write_int32_t(0); + s.write_int32_t(0); + s.align_write(0x10); bhs = force_malloc_s(obj_skin_block_header, ex->blocks_count); for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -1479,71 +1469,71 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { if (osage->root_init) { obj_skin_osage_root_node* root = &osage->root; if (root->coli) { - io_write(s, 0x28LL * root->coli_count); - io_align_write(s, 0x10); + s.write(0x28LL * root->coli_count); + s.align_write(0x10); } - io_write(s, 0x38); - io_align_write(s, 0x10); + s.write(0x38); + s.align_write(0x10); } - bhs[i].block_offset = io_get_position(s); - io_write(s, 0x28); - io_write(s, 0x14); - io_write(s, 0x14); + bhs[i].block_offset = s.get_position(); + s.write(0x28); + s.write(0x14); + s.write(0x14); } - io_align_write(s, 0x10); + s.align_write(0x10); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_EXPRESSION) continue; - bhs[i].block_offset = io_get_position(s); - io_write(s, 0x28); - io_write(s, 0x2C); + bhs[i].block_offset = s.get_position(); + s.write(0x28); + s.write(0x2C); } - io_align_write(s, 0x10); + s.align_write(0x10); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; - bhs[i].block_offset = io_get_position(s); - io_write(s, 0x34); + bhs[i].block_offset = s.get_position(); + s.write(0x34); } - io_align_write(s, 0x10); + s.align_write(0x10); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CONSTRAINT) continue; - bhs[i].block_offset = io_get_position(s); - io_write(s, 0x28); - io_write(s, 0x10); + bhs[i].block_offset = s.get_position(); + s.write(0x28); + s.write(0x10); switch (block->constraint.type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - io_write(s, 0x0C); + s.write(0x0C); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: - io_write(s, 0x24); - io_write(s, 0x18); + s.write(0x24); + s.write(0x18); break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: - io_write(s, 0x24); - io_write(s, 0x14); - io_write(s, 0x14); + s.write(0x24); + s.write(0x14); + s.write(0x14); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: - io_write(s, 0x24); - io_write(s, 0x04); - io_write(s, 0x14); - io_write(s, 0x14); + s.write(0x24); + s.write(0x04); + s.write(0x14); + s.write(0x14); break; } } - io_align_write(s, 0x10); + s.align_write(0x10); int32_t motion_block_count = 0; for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -1551,52 +1541,52 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; - bhs[i].block_offset = io_get_position(s); - io_write(s, 0x28); - io_write(s, 0x10); + bhs[i].block_offset = s.get_position(); + s.write(0x28); + s.write(0x10); motion_block_count++; } - io_align_write(s, 0x10); + s.align_write(0x10); if (exh.osage_count) { - osage_block_node = io_get_position(s); + osage_block_node = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_OSAGE) continue; obj_skin_block_osage* osage = &block->osage; - io_write(s, osage->nodes_count * (sizeof(uint32_t) + sizeof(float_t) * 4)); + s.write(osage->nodes_count * (sizeof(uint32_t) + sizeof(float_t) * 4)); } - io_align_write(s, 0x10); + s.align_write(0x10); } if (motion_block_count) { - motion_block_node_mats = io_get_position(s); + motion_block_node_mats = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; obj_skin_block_motion* motion = &block->motion; - io_write(s, motion->nodes_count * sizeof(mat4)); + s.write(motion->nodes_count * sizeof(mat4)); } - io_align_write(s, 0x10); + s.align_write(0x10); - motion_block_node_name_offset = io_get_position(s); + motion_block_node_name_offset = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; obj_skin_block_motion* motion = &block->motion; - io_write(s, motion->nodes_count * sizeof(uint32_t)); + s.write(motion->nodes_count * sizeof(uint32_t)); } - io_align_write(s, 0x10); + s.align_write(0x10); } if (exh.cloth_count) { - field_18 = io_get_position(s); + field_18 = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) @@ -1605,54 +1595,54 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { obj_skin_block_cloth* cloth = &block->cloth; for (uint32_t j = 0; j < 32; j++) if (cloth->field_10 & (1 << j)) - io_write(s, sizeof(mat4)); + s.write(sizeof(mat4)); } - io_align_write(s, 0x10); + s.align_write(0x10); - field_1C = io_get_position(s); + field_1C = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; obj_skin_block_cloth* cloth = &block->cloth; - io_write(s, (10 * sizeof(int32_t) + s.write((10 * sizeof(int32_t) + 4 * (sizeof(int32_t) + 3 * sizeof(int32_t))) * cloth->count); } - io_align_write(s, 0x10); + s.align_write(0x10); - field_20 = io_get_position(s); + field_20 = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; obj_skin_block_cloth* cloth = &block->cloth; - io_write(s, 10 * (11 * sizeof(int32_t)) * cloth->count); + s.write(10 * (11 * sizeof(int32_t)) * cloth->count); } - io_align_write(s, 0x10); + s.align_write(0x10); - field_24 = io_get_position(s); + field_24 = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; obj_skin_block_cloth* cloth = &block->cloth; - io_write(s, sizeof(uint16_t) + cloth->field_24_count * sizeof(uint16_t)); + s.write(sizeof(uint16_t) + cloth->field_24_count * sizeof(uint16_t)); } - io_align_write(s, 0x10); + s.align_write(0x10); - field_28 = io_get_position(s); + field_28 = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; obj_skin_block_cloth* cloth = &block->cloth; - io_write(s, sizeof(uint16_t) + cloth->field_28_count * sizeof(uint16_t)); + s.write(sizeof(uint16_t) + cloth->field_28_count * sizeof(uint16_t)); } - io_align_write(s, 0x10); + s.align_write(0x10); } } } @@ -1661,11 +1651,11 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { quicksort_string(strings.data(), strings.size()); string_offsets.reserve(strings.size()); for (std::string& i : strings) { - string_offsets.push_back(io_get_position(s)); - io_write_string_null_terminated(s, &i); + string_offsets.push_back(s.get_position()); + s.write_string_null_terminated(i); } } - io_align_write(s, 0x10); + s.align_write(0x10); std::vector osage_names; if (sk->ex_data_init) { @@ -1683,10 +1673,10 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; - io_position_push(s, bhs[i].block_offset, SEEK_SET); + s.position_push(bhs[i].block_offset, SEEK_SET); obj_classic_write_skin_block_cloth(&block->cloth, s, strings, string_offsets, &field_18, &field_1C, &field_20, &field_24, &field_28); - io_position_pop(s); + s.position_pop(); } int64_t constraint_type_name_offsets[4]; @@ -1705,10 +1695,10 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { if (block->type != OBJ_SKIN_BLOCK_CONSTRAINT) continue; - io_position_push(s, bhs[i].block_offset, SEEK_SET); + s.position_push(bhs[i].block_offset, SEEK_SET); obj_classic_write_skin_block_constraint(&block->constraint, s, strings, string_offsets, bone_names_ptr, constraint_type_name_offsets); - io_position_pop(s); + s.position_pop(); } for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -1716,10 +1706,10 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { if (block->type != OBJ_SKIN_BLOCK_EXPRESSION) continue; - io_position_push(s, bhs[i].block_offset, SEEK_SET); + s.position_push(bhs[i].block_offset, SEEK_SET); obj_classic_write_skin_block_expression(&block->expression, s, strings, string_offsets, bone_names_ptr); - io_position_pop(s); + s.position_pop(); } for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -1727,11 +1717,11 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; - io_position_push(s, bhs[i].block_offset, SEEK_SET); + s.position_push(bhs[i].block_offset, SEEK_SET); obj_classic_write_skin_block_motion(&block->motion, s, strings, string_offsets, bone_names_ptr, &motion_block_node_name_offset, &motion_block_node_mats); - io_position_pop(s); + s.position_pop(); } for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -1739,17 +1729,17 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { if (block->type != OBJ_SKIN_BLOCK_OSAGE) continue; - io_position_push(s, bhs[i].block_offset, SEEK_SET); + s.position_push(bhs[i].block_offset, SEEK_SET); obj_classic_write_skin_block_osage(&block->osage, s, strings, string_offsets, &osage_block_node); - io_position_pop(s); + s.position_pop(); } for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type == OBJ_SKIN_BLOCK_CLOTH) { obj_skin_block_cloth* cloth = &block->cloth; - obj_skin_strings_push_back_check(osage_names, string_data(&cloth->mesh_name)); + obj_skin_strings_push_back_check(osage_names, cloth->mesh_name); } else if (block->type == OBJ_SKIN_BLOCK_OSAGE) { obj_skin_block_osage* osage = &block->osage; @@ -1758,389 +1748,389 @@ static void obj_classic_write_skin(obj* obj, stream* s, int64_t base_offset) { } } - io_position_push(s, exh.blocks_offset, SEEK_SET); + s.position_push(exh.blocks_offset, SEEK_SET); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; switch (block->type) { case OBJ_SKIN_BLOCK_CLOTH: - io_write_int32_t(s, (int32_t)cls_offset); - io_write_int32_t(s, (int32_t)bhs[i].block_offset); + s.write_int32_t((int32_t)cls_offset); + s.write_int32_t((int32_t)bhs[i].block_offset); break; case OBJ_SKIN_BLOCK_CONSTRAINT: - io_write_int32_t(s, (int32_t)cns_offset); - io_write_int32_t(s, (int32_t)bhs[i].block_offset); + s.write_int32_t((int32_t)cns_offset); + s.write_int32_t((int32_t)bhs[i].block_offset); break; case OBJ_SKIN_BLOCK_EXPRESSION: - io_write_int32_t(s, (int32_t)exp_offset); - io_write_int32_t(s, (int32_t)bhs[i].block_offset); + s.write_int32_t((int32_t)exp_offset); + s.write_int32_t((int32_t)bhs[i].block_offset); break; case OBJ_SKIN_BLOCK_MOTION: - io_write_int32_t(s, (int32_t)mot_offset); - io_write_int32_t(s, (int32_t)bhs[i].block_offset); + s.write_int32_t((int32_t)mot_offset); + s.write_int32_t((int32_t)bhs[i].block_offset); break; case OBJ_SKIN_BLOCK_OSAGE: - io_write_int32_t(s, (int32_t)osg_offset); - io_write_int32_t(s, (int32_t)bhs[i].block_offset); + s.write_int32_t((int32_t)osg_offset); + s.write_int32_t((int32_t)bhs[i].block_offset); break; default: - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); + s.write_int32_t(0); + s.write_int32_t(0); break; } } - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_position_pop(s); + s.write_int32_t(0); + s.write_int32_t(0); + s.position_pop(); free(bhs); } } if (sk->bones) { - io_position_push(s, sh.bone_names_offset, SEEK_SET); + s.position_push(sh.bone_names_offset, SEEK_SET); for (uint32_t i = 0; i < sk->bones_count; i++) { - size_t str_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&sk->bones[i].name)); - io_write_int32_t(s, (int32_t)str_offset); + size_t str_offset = obj_skin_strings_get_string_offset( + strings, string_offsets, sk->bones[i].name); + s.write_int32_t((int32_t)str_offset); } - io_position_pop(s); + s.position_pop(); } if (sk->ex_data_init) { obj_skin_ex_data* ex = &sk->ex_data; if (ex->blocks_count > 0) { - io_position_push(s, exh.bone_names_offset, SEEK_SET); + s.position_push(exh.bone_names_offset, SEEK_SET); for (std::string& i : bone_names) { size_t str_offset = obj_skin_strings_get_string_offset(strings, string_offsets, i.c_str()); - io_write_int32_t(s, (int32_t)str_offset); + s.write_int32_t((int32_t)str_offset); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, exh.osage_nodes_offset, SEEK_SET); + s.position_push(exh.osage_nodes_offset, SEEK_SET); for (uint32_t i = 0; i < ex->osage_nodes_count; i++) { obj_skin_osage_node* osage_node = &ex->osage_nodes[i]; - io_write_uint32_t(s, osage_node->name_index); - io_write_float_t(s, osage_node->length); - io_write_uint32_t(s, osage_node->name_index & 0x7FFF); + s.write_uint32_t(osage_node->name_index); + s.write_float_t(osage_node->length); + s.write_uint32_t(osage_node->name_index & 0x7FFF); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, exh.osage_sibling_infos_offset, SEEK_SET); + s.position_push(exh.osage_sibling_infos_offset, SEEK_SET); for (uint32_t i = 0; i < ex->osage_sibling_infos_count; i++) { obj_skin_osage_sibling_info* osage_sibling_info = &ex->osage_sibling_infos[i]; - io_write_uint32_t(s, osage_sibling_info->name_index); - io_write_uint32_t(s, osage_sibling_info->sibling_name_index); - io_write_float_t(s, osage_sibling_info->max_distance); + s.write_uint32_t(osage_sibling_info->name_index); + s.write_uint32_t(osage_sibling_info->sibling_name_index); + s.write_float_t(osage_sibling_info->max_distance); } - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_position_pop(s); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.position_pop(); exh.osage_count = (int32_t)osage_names.size(); exh.osage_count -= exh.cloth_count; - io_position_push(s, exh.osage_names_offset, SEEK_SET); + s.position_push(exh.osage_names_offset, SEEK_SET); for (std::string& i : osage_names) { size_t str_offset = obj_skin_strings_get_string_offset(strings, string_offsets, i.c_str()); - io_write_int32_t(s, (int32_t)str_offset); + s.write_int32_t((int32_t)str_offset); } - io_position_pop(s); + s.position_pop(); } - io_position_push(s, sh.ex_data_offset, SEEK_SET); - io_write_int32_t(s, exh.osage_count); - io_write_int32_t(s, ex->osage_nodes_count); - io_write(s, 0x04); - io_write_uint32_t(s, (uint32_t)exh.osage_nodes_offset); - io_write_uint32_t(s, (uint32_t)exh.osage_names_offset); - io_write_uint32_t(s, (uint32_t)exh.blocks_offset); - io_write_int32_t(s, exh.bone_names_count); - io_write_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->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); + s.position_push(sh.ex_data_offset, SEEK_SET); + s.write_int32_t(exh.osage_count); + s.write_int32_t(ex->osage_nodes_count); + s.write(0x04); + s.write_uint32_t((uint32_t)exh.osage_nodes_offset); + s.write_uint32_t((uint32_t)exh.osage_names_offset); + s.write_uint32_t((uint32_t)exh.blocks_offset); + s.write_int32_t(exh.bone_names_count); + s.write_uint32_t((uint32_t)exh.bone_names_offset); + s.write_uint32_t((uint32_t)exh.osage_sibling_infos_offset); + s.write_int32_t(exh.cloth_count); + s.write_uint32_t((uint32_t)ex->reserved[0]); + s.write_uint32_t((uint32_t)ex->reserved[1]); + s.write_uint32_t((uint32_t)ex->reserved[2]); + s.write_uint32_t((uint32_t)ex->reserved[3]); + s.write_uint32_t((uint32_t)ex->reserved[4]); + s.write_uint32_t((uint32_t)ex->reserved[5]); + s.write_uint32_t((uint32_t)ex->reserved[6]); + s.position_pop(); } - io_position_push(s, base_offset, SEEK_SET); - io_write_int32_t(s, (int32_t)sh.bone_ids_offset); - io_write_int32_t(s, (int32_t)sh.bone_matrices_offset); - io_write_int32_t(s, (int32_t)sh.bone_names_offset); - io_write_int32_t(s, (int32_t)sh.ex_data_offset); - io_write_int32_t(s, sk->bones_count); - io_write_int32_t(s, (int32_t)sh.bone_parent_ids_offset); - io_write(s, 0x0C); - io_position_pop(s); + s.position_push(base_offset, SEEK_SET); + s.write_int32_t((int32_t)sh.bone_ids_offset); + s.write_int32_t((int32_t)sh.bone_matrices_offset); + s.write_int32_t((int32_t)sh.bone_names_offset); + s.write_int32_t((int32_t)sh.ex_data_offset); + s.write_int32_t(sk->bones_count); + s.write_int32_t((int32_t)sh.bone_parent_ids_offset); + s.write(0x0C); + s.position_pop(); } static void obj_classic_read_skin_block_cloth(obj_skin_block_cloth* b, - stream* s, char** str) { - int32_t mesh_name_offset = io_read_int32_t(s); - int32_t backface_mesh_name_offset = io_read_int32_t(s); - b->field_8 = io_read_int32_t(s); - b->count = io_read_int32_t(s); - b->field_10 = io_read_int32_t(s); - b->field_14 = io_read_int32_t(s); - int32_t field_18_offset = io_read_int32_t(s); - int32_t field_1C_offset = io_read_int32_t(s); - int32_t field_20_offset = io_read_int32_t(s); - int32_t field_24_offset = io_read_int32_t(s); - int32_t field_28_offset = io_read_int32_t(s); - b->field_2C = io_read_uint32_t(s); - b->field_30 = io_read_uint32_t(s); + stream& s, char** str) { + int32_t mesh_name_offset = s.read_int32_t(); + int32_t backface_mesh_name_offset = s.read_int32_t(); + b->field_8 = s.read_int32_t(); + b->count = s.read_int32_t(); + b->field_10 = s.read_int32_t(); + b->field_14 = s.read_int32_t(); + int32_t field_18_offset = s.read_int32_t(); + int32_t field_1C_offset = s.read_int32_t(); + int32_t field_20_offset = s.read_int32_t(); + int32_t field_24_offset = s.read_int32_t(); + int32_t field_28_offset = s.read_int32_t(); + b->field_2C = s.read_uint32_t(); + b->field_30 = s.read_uint32_t(); - io_read_string_null_terminated_offset(s, mesh_name_offset, &b->mesh_name); - io_read_string_null_terminated_offset(s, backface_mesh_name_offset, &b->backface_mesh_name); + b->mesh_name = s.read_utf8_string_null_terminated_offset(mesh_name_offset); + b->backface_mesh_name = s.read_utf8_string_null_terminated_offset(backface_mesh_name_offset); if (field_18_offset) { - io_position_push(s, field_18_offset, SEEK_SET); + s.position_push(field_18_offset, SEEK_SET); for (uint32_t i = 0; i < 32; i++) { if (~b->field_10 & (1 << i)) continue; mat4 mat; - mat.row0.x = io_read_float_t(s); - mat.row0.y = io_read_float_t(s); - mat.row0.z = io_read_float_t(s); - mat.row0.w = io_read_float_t(s); - mat.row1.x = io_read_float_t(s); - mat.row1.y = io_read_float_t(s); - mat.row1.z = io_read_float_t(s); - mat.row1.w = io_read_float_t(s); - mat.row2.x = io_read_float_t(s); - mat.row2.y = io_read_float_t(s); - mat.row2.z = io_read_float_t(s); - mat.row2.w = io_read_float_t(s); - mat.row3.x = io_read_float_t(s); - mat.row3.y = io_read_float_t(s); - mat.row3.z = io_read_float_t(s); - mat.row3.w = io_read_float_t(s); + mat.row0.x = s.read_float_t(); + mat.row0.y = s.read_float_t(); + mat.row0.z = s.read_float_t(); + mat.row0.w = s.read_float_t(); + mat.row1.x = s.read_float_t(); + mat.row1.y = s.read_float_t(); + mat.row1.z = s.read_float_t(); + mat.row1.w = s.read_float_t(); + mat.row2.x = s.read_float_t(); + mat.row2.y = s.read_float_t(); + mat.row2.z = s.read_float_t(); + mat.row2.w = s.read_float_t(); + mat.row3.x = s.read_float_t(); + mat.row3.y = s.read_float_t(); + mat.row3.z = s.read_float_t(); + mat.row3.w = s.read_float_t(); mat4_transpose(&mat, &mat); b->field_18[i] = mat; } - io_position_pop(s); + s.position_pop(); } if (field_1C_offset) { - io_position_push(s, field_1C_offset, SEEK_SET); + s.position_push(field_1C_offset, SEEK_SET); b->field_1C = force_malloc_s(obj_skin_block_cloth_field_1C, b->count); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_1C* f = &b->field_1C[i]; - f->field_0 = io_read_float_t(s); - f->field_4 = io_read_float_t(s); - f->field_8 = io_read_float_t(s); - f->field_C = io_read_float_t(s); - f->field_10 = io_read_float_t(s); - f->field_14 = io_read_float_t(s); - f->field_18 = io_read_float_t(s); - f->field_1C = io_read_uint32_t(s); - f->field_20 = io_read_uint32_t(s); - f->field_24 = io_read_uint32_t(s); + f->field_0 = s.read_float_t(); + f->field_4 = s.read_float_t(); + f->field_8 = s.read_float_t(); + f->field_C = s.read_float_t(); + f->field_10 = s.read_float_t(); + f->field_14 = s.read_float_t(); + f->field_18 = s.read_float_t(); + f->field_1C = s.read_uint32_t(); + f->field_20 = s.read_uint32_t(); + f->field_24 = s.read_uint32_t(); for (uint32_t j = 0; j < 4; j++) obj_classic_read_skin_block_cloth_field_1C_sub(&f->sub_data[j], s, str); } - io_position_pop(s); + s.position_pop(); } if (field_20_offset) { - io_position_push(s, field_20_offset, SEEK_SET); + s.position_push(field_20_offset, SEEK_SET); b->field_20 = force_malloc_s(obj_skin_block_cloth_field_20, b->count); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_20* f = &b->field_20[i]; for (uint32_t j = 0; j < 10; j++) obj_classic_read_skin_block_cloth_field_20_sub(&f->sub_data[j], s, str); } - io_position_pop(s); + s.position_pop(); } if (field_24_offset) { - io_position_push(s, field_24_offset, SEEK_SET); - b->field_24_count = io_read_uint16_t_stream_reverse_endianness(s); + s.position_push(field_24_offset, SEEK_SET); + b->field_24_count = s.read_uint16_t_reverse_endianness(); b->field_24 = force_malloc_s(uint16_t, b->field_24_count); - io_read(s, b->field_24, b->field_24_count * sizeof(uint16_t)); - io_position_pop(s); + s.read(b->field_24, b->field_24_count * sizeof(uint16_t)); + s.position_pop(); } if (field_28_offset) { - io_position_push(s, field_28_offset, SEEK_SET); - b->field_28_count = io_read_uint16_t_stream_reverse_endianness(s); + s.position_push(field_28_offset, SEEK_SET); + b->field_28_count = s.read_uint16_t_reverse_endianness(); b->field_28 = force_malloc_s(uint16_t, b->field_28_count); - io_read(s, b->field_28, b->field_28_count * sizeof(uint16_t)); - io_position_pop(s); + s.read(b->field_28, b->field_28_count * sizeof(uint16_t)); + s.position_pop(); } } static void obj_classic_write_skin_block_cloth(obj_skin_block_cloth* b, - stream* s, std::vector& strings, std::vector& string_offsets, + stream& s, std::vector& strings, std::vector& string_offsets, int64_t* field_18_offset, int64_t* field_1C_offset, int64_t* field_20_offset, int64_t* field_24_offset, int64_t* field_28_offset) { int64_t mesh_name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->mesh_name)); + string_offsets, b->mesh_name); int64_t backface_mesh_name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->backface_mesh_name)); + string_offsets, b->backface_mesh_name); - io_write_int32_t(s, (int32_t)mesh_name_offset); - io_write_int32_t(s, (int32_t)backface_mesh_name_offset); - io_write_int32_t(s, b->field_8); - io_write_int32_t(s, b->count); - io_write_int32_t(s, b->field_10); - io_write_int32_t(s, b->field_14); - io_write_int32_t(s, (int32_t)*field_18_offset); - io_write_int32_t(s, (int32_t)*field_1C_offset); - io_write_int32_t(s, (int32_t)*field_20_offset); - io_write_int32_t(s, (int32_t)*field_24_offset); - io_write_int32_t(s, (int32_t)*field_28_offset); - io_write_uint32_t(s, b->field_2C); - io_write_uint32_t(s, b->field_30); + s.write_int32_t((int32_t)mesh_name_offset); + s.write_int32_t((int32_t)backface_mesh_name_offset); + s.write_int32_t(b->field_8); + s.write_int32_t(b->count); + s.write_int32_t(b->field_10); + s.write_int32_t(b->field_14); + s.write_int32_t((int32_t)*field_18_offset); + s.write_int32_t((int32_t)*field_1C_offset); + s.write_int32_t((int32_t)*field_20_offset); + s.write_int32_t((int32_t)*field_24_offset); + s.write_int32_t((int32_t)*field_28_offset); + s.write_uint32_t(b->field_2C); + s.write_uint32_t(b->field_30); if (b->field_10) { - io_position_push(s, *field_18_offset, SEEK_SET); + s.position_push(*field_18_offset, SEEK_SET); for (uint32_t i = 0; i < 32; i++) { if (~b->field_10 & (1 << i)) continue; mat4u& mat = b->field_18[i]; - io_write_float_t(s, mat.row0.x); - io_write_float_t(s, mat.row1.x); - io_write_float_t(s, mat.row2.x); - io_write_float_t(s, mat.row3.x); - io_write_float_t(s, mat.row0.y); - io_write_float_t(s, mat.row1.y); - io_write_float_t(s, mat.row2.y); - io_write_float_t(s, mat.row3.y); - io_write_float_t(s, mat.row0.z); - io_write_float_t(s, mat.row1.z); - io_write_float_t(s, mat.row2.z); - io_write_float_t(s, mat.row3.z); - io_write_float_t(s, mat.row0.w); - io_write_float_t(s, mat.row1.w); - io_write_float_t(s, mat.row2.w); - io_write_float_t(s, mat.row3.w); + s.write_float_t(mat.row0.x); + s.write_float_t(mat.row1.x); + s.write_float_t(mat.row2.x); + s.write_float_t(mat.row3.x); + s.write_float_t(mat.row0.y); + s.write_float_t(mat.row1.y); + s.write_float_t(mat.row2.y); + s.write_float_t(mat.row3.y); + s.write_float_t(mat.row0.z); + s.write_float_t(mat.row1.z); + s.write_float_t(mat.row2.z); + s.write_float_t(mat.row3.z); + s.write_float_t(mat.row0.w); + s.write_float_t(mat.row1.w); + s.write_float_t(mat.row2.w); + s.write_float_t(mat.row3.w); *field_18_offset += sizeof(mat4); } - io_position_pop(s); + s.position_pop(); } if (b->field_1C) { - io_position_push(s, *field_1C_offset, SEEK_SET); + s.position_push(*field_1C_offset, SEEK_SET); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_1C* f = &b->field_1C[i]; - io_write_float_t(s, f->field_0); - io_write_float_t(s, f->field_4); - io_write_float_t(s, f->field_8); - io_write_float_t(s, f->field_C); - io_write_float_t(s, f->field_10); - io_write_float_t(s, f->field_14); - io_write_float_t(s, f->field_18); - io_write_uint32_t(s, f->field_1C); - io_write_uint32_t(s, f->field_20); - io_write_uint32_t(s, f->field_24); + s.write_float_t(f->field_0); + s.write_float_t(f->field_4); + s.write_float_t(f->field_8); + s.write_float_t(f->field_C); + s.write_float_t(f->field_10); + s.write_float_t(f->field_14); + s.write_float_t(f->field_18); + s.write_uint32_t(f->field_1C); + s.write_uint32_t(f->field_20); + s.write_uint32_t(f->field_24); for (uint32_t j = 0; j < 4; j++) obj_classic_write_skin_block_cloth_field_1C_sub(&f->sub_data[j], s, strings, string_offsets); } - io_position_pop(s); + s.position_pop(); *field_1C_offset += (10 * sizeof(int32_t) + 4 * (sizeof(int32_t) + 3 * sizeof(int32_t))) * b->count; } if (b->field_20) { - io_position_push(s, *field_20_offset, SEEK_SET); + s.position_push(*field_20_offset, SEEK_SET); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_20* f = &b->field_20[i]; for (uint32_t j = 0; j < 10; j++) obj_classic_write_skin_block_cloth_field_20_sub(&f->sub_data[j], s, strings, string_offsets); } - io_position_pop(s); + s.position_pop(); *field_20_offset += 10 * (11 * sizeof(int32_t)) * b->count; } if (b->field_24) { - io_position_push(s, *field_24_offset, SEEK_SET); - io_write_uint16_t(s, (uint16_t)b->field_24_count); - io_write(s, b->field_24, b->field_24_count * sizeof(uint16_t)); - io_position_pop(s); + s.position_push(*field_24_offset, SEEK_SET); + s.write_uint16_t((uint16_t)b->field_24_count); + s.write(b->field_24, b->field_24_count * sizeof(uint16_t)); + s.position_pop(); *field_28_offset += sizeof(uint16_t) + b->field_24_count * sizeof(uint16_t); } if (b->field_28) { - io_position_push(s, *field_28_offset, SEEK_SET); - io_write_uint16_t(s, (uint16_t)b->field_28_count); - io_write(s, b->field_28, b->field_28_count * sizeof(uint16_t)); - io_position_pop(s); + s.position_push(*field_28_offset, SEEK_SET); + s.write_uint16_t((uint16_t)b->field_28_count); + s.write(b->field_28, b->field_28_count * sizeof(uint16_t)); + s.position_pop(); *field_28_offset += sizeof(uint16_t) + b->field_28_count * sizeof(uint16_t); } } static void obj_classic_read_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, - stream* s, char** str) { - int32_t bone_name_offset = io_read_int32_t(s); - io_read_string_null_terminated_offset(s, bone_name_offset, &sub->bone_name); - sub->weight = io_read_float_t(s); - sub->matrix_index = io_read_uint32_t(s); - sub->field_C = io_read_uint32_t(s); + stream& s, char** str) { + int32_t bone_name_offset = s.read_int32_t(); + sub->bone_name = s.read_utf8_string_null_terminated_offset(bone_name_offset); + sub->weight = s.read_float_t(); + sub->matrix_index = s.read_uint32_t(); + sub->field_C = s.read_uint32_t(); } static void obj_classic_write_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, - stream* s, std::vector& strings, std::vector& string_offsets) { + stream& s, std::vector& strings, std::vector& string_offsets) { int64_t bone_name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&sub->bone_name)); - io_write_int32_t(s, (int32_t)bone_name_offset); - io_write_float_t(s, sub->weight); - io_write_uint32_t(s, sub->matrix_index); - io_write_uint32_t(s, sub->field_C); + string_offsets, sub->bone_name); + s.write_int32_t((int32_t)bone_name_offset); + s.write_float_t(sub->weight); + s.write_uint32_t(sub->matrix_index); + s.write_uint32_t(sub->field_C); } static void obj_classic_read_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, - stream* s, char** str) { - sub->field_0 = io_read_uint32_t(s); - sub->field_4 = io_read_float_t(s); - sub->field_8 = io_read_float_t(s); - sub->field_C = io_read_float_t(s); - sub->field_10 = io_read_float_t(s); - sub->field_14 = io_read_float_t(s); - sub->field_18 = io_read_float_t(s); - sub->field_1C = io_read_float_t(s); - sub->field_20 = io_read_float_t(s); - sub->field_24 = io_read_float_t(s); - sub->field_28 = io_read_float_t(s); + stream& s, char** str) { + sub->field_0 = s.read_uint32_t(); + sub->field_4 = s.read_float_t(); + sub->field_8 = s.read_float_t(); + sub->field_C = s.read_float_t(); + sub->field_10 = s.read_float_t(); + sub->field_14 = s.read_float_t(); + sub->field_18 = s.read_float_t(); + sub->field_1C = s.read_float_t(); + sub->field_20 = s.read_float_t(); + sub->field_24 = s.read_float_t(); + sub->field_28 = s.read_float_t(); } static void obj_classic_write_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, - stream* s, std::vector& strings, std::vector& string_offsets) { - io_write_uint32_t(s, sub->field_0); - io_write_float_t(s, sub->field_4); - io_write_float_t(s, sub->field_8); - io_write_float_t(s, sub->field_C); - io_write_float_t(s, sub->field_10); - io_write_float_t(s, sub->field_14); - io_write_float_t(s, sub->field_18); - io_write_float_t(s, sub->field_1C); - io_write_float_t(s, sub->field_20); - io_write_float_t(s, sub->field_24); - io_write_float_t(s, sub->field_28); + stream& s, std::vector& strings, std::vector& string_offsets) { + s.write_uint32_t(sub->field_0); + s.write_float_t(sub->field_4); + s.write_float_t(sub->field_8); + s.write_float_t(sub->field_C); + s.write_float_t(sub->field_10); + s.write_float_t(sub->field_14); + s.write_float_t(sub->field_18); + s.write_float_t(sub->field_1C); + s.write_float_t(sub->field_20); + s.write_float_t(sub->field_24); + s.write_float_t(sub->field_28); } static void obj_classic_read_skin_block_constraint(obj_skin_block_constraint* b, - stream* s, char** str) { + stream& s, char** str) { obj_classic_read_skin_block_node(&b->base, s, str); - int32_t type_offset = io_read_int32_t(s); - char* type = io_read_utf8_string_null_terminated_offset(s, type_offset); + int32_t type_offset = s.read_int32_t(); + char* type = s.read_utf8_string_null_terminated_offset(type_offset); - int32_t name_offset = io_read_int32_t(s); - char* name = io_read_utf8_string_null_terminated_offset(s, name_offset); + int32_t name_offset = s.read_int32_t(); + char* name = s.read_utf8_string_null_terminated_offset(name_offset); b->name_index = 0; for (char** i = str; *i; i++) @@ -2150,27 +2140,27 @@ static void obj_classic_read_skin_block_constraint(obj_skin_block_constraint* b, } free(name); - b->coupling = (obj_skin_block_constraint_coupling)io_read_int32_t(s); + b->coupling = (obj_skin_block_constraint_coupling)s.read_int32_t(); - int32_t source_node_name_offset = io_read_int32_t(s); - io_read_string_null_terminated_offset(s, source_node_name_offset, &b->source_node_name); + int32_t source_node_name_offset = s.read_int32_t(); + b->source_node_name = s.read_utf8_string_null_terminated_offset(source_node_name_offset); if (!str_utils_compare(type, "Orientation")) { b->type = OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION; - b->orientation.offset.x = io_read_float_t(s); - b->orientation.offset.y = io_read_float_t(s); - b->orientation.offset.z = io_read_float_t(s); + b->orientation.offset.x = s.read_float_t(); + b->orientation.offset.y = s.read_float_t(); + b->orientation.offset.z = s.read_float_t(); } else if (!str_utils_compare(type, "Direction")) { b->type = OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION; obj_classic_read_skin_block_constraint_up_vector_old(&b->direction.up_vector, s, str); - b->direction.align_axis.x = io_read_float_t(s); - b->direction.align_axis.y = io_read_float_t(s); - b->direction.align_axis.z = io_read_float_t(s); - b->direction.target_offset.x = io_read_float_t(s); - b->direction.target_offset.y = io_read_float_t(s); - b->direction.target_offset.z = io_read_float_t(s); + b->direction.align_axis.x = s.read_float_t(); + b->direction.align_axis.y = s.read_float_t(); + b->direction.align_axis.z = s.read_float_t(); + b->direction.target_offset.x = s.read_float_t(); + b->direction.target_offset.y = s.read_float_t(); + b->direction.target_offset.z = s.read_float_t(); } else if (!str_utils_compare(type, "Position")) { b->type = OBJ_SKIN_BLOCK_CONSTRAINT_POSITION; @@ -2185,7 +2175,7 @@ static void obj_classic_read_skin_block_constraint(obj_skin_block_constraint* b, b->type = OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE; obj_classic_read_skin_block_constraint_up_vector_old(&b->distance.up_vector, s, str); - b->distance.distance = io_read_float_t(s); + b->distance.distance = s.read_float_t(); obj_classic_read_skin_block_constraint_attach_point(&b->distance.constrained_object, s, str); obj_classic_read_skin_block_constraint_attach_point(&b->distance.constraining_object, @@ -2197,7 +2187,7 @@ static void obj_classic_read_skin_block_constraint(obj_skin_block_constraint* b, } static void obj_classic_write_skin_block_constraint(obj_skin_block_constraint* b, - stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names, int64_t* offsets) { + stream& s, std::vector& strings, std::vector& string_offsets, char** bone_names, int64_t* offsets) { obj_classic_write_skin_block_node(&b->base, s, strings, string_offsets); int64_t type_offset = 0; @@ -2215,33 +2205,33 @@ static void obj_classic_write_skin_block_constraint(obj_skin_block_constraint* b type_offset = offsets[3]; break; } - io_write_int32_t(s, (int32_t)type_offset); + s.write_int32_t((int32_t)type_offset); int64_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, string_offsets, bone_names, b->name_index); - io_write_int32_t(s, (int32_t)name_offset); + s.write_int32_t((int32_t)name_offset); - io_write_int32_t(s, b->coupling); + s.write_int32_t(b->coupling); int64_t source_node_name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->source_node_name)); - io_write_int32_t(s, (int32_t)source_node_name_offset); + string_offsets, b->source_node_name); + s.write_int32_t((int32_t)source_node_name_offset); switch (b->type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - io_write_float_t(s, b->orientation.offset.x); - io_write_float_t(s, b->orientation.offset.y); - io_write_float_t(s, b->orientation.offset.z); + s.write_float_t(b->orientation.offset.x); + s.write_float_t(b->orientation.offset.y); + s.write_float_t(b->orientation.offset.z); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: obj_classic_write_skin_block_constraint_up_vector_old(&b->direction.up_vector, s, strings, string_offsets); - io_write_float_t(s, b->direction.align_axis.x); - io_write_float_t(s, b->direction.align_axis.y); - io_write_float_t(s, b->direction.align_axis.z); - io_write_float_t(s, b->direction.target_offset.x); - io_write_float_t(s, b->direction.target_offset.y); - io_write_float_t(s, b->direction.target_offset.z); + s.write_float_t(b->direction.align_axis.x); + s.write_float_t(b->direction.align_axis.y); + s.write_float_t(b->direction.align_axis.z); + s.write_float_t(b->direction.target_offset.x); + s.write_float_t(b->direction.target_offset.y); + s.write_float_t(b->direction.target_offset.z); break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: obj_classic_write_skin_block_constraint_up_vector_old(&b->position.up_vector, @@ -2254,7 +2244,7 @@ static void obj_classic_write_skin_block_constraint(obj_skin_block_constraint* b case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: obj_classic_write_skin_block_constraint_up_vector_old(&b->distance.up_vector, s, strings, string_offsets); - io_write_float_t(s, b->distance.distance); + s.write_float_t(b->distance.distance); obj_classic_write_skin_block_constraint_attach_point(&b->distance.constrained_object, s, strings, string_offsets); obj_classic_write_skin_block_constraint_attach_point(&b->distance.constraining_object, @@ -2264,60 +2254,60 @@ static void obj_classic_write_skin_block_constraint(obj_skin_block_constraint* b } static void obj_classic_read_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, - stream* s, char** str) { - ap->affected_by_orientation = io_read_int32_t(s) != 0; - ap->affected_by_scaling = io_read_int32_t(s) != 0; - ap->offset.x = io_read_float_t(s); - ap->offset.y = io_read_float_t(s); - ap->offset.z = io_read_float_t(s); + stream& s, char** str) { + ap->affected_by_orientation = s.read_int32_t() != 0; + ap->affected_by_scaling = s.read_int32_t() != 0; + ap->offset.x = s.read_float_t(); + ap->offset.y = s.read_float_t(); + ap->offset.z = s.read_float_t(); } static void obj_classic_write_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, - stream* s, std::vector& strings, std::vector& string_offsets) { - io_write_int32_t(s, ap->affected_by_orientation ? 1 : 0); - io_write_int32_t(s, ap->affected_by_scaling ? 1 : 0); - io_write_float_t(s, ap->offset.x); - io_write_float_t(s, ap->offset.y); - io_write_float_t(s, ap->offset.z); + stream& s, std::vector& strings, std::vector& string_offsets) { + s.write_int32_t(ap->affected_by_orientation ? 1 : 0); + s.write_int32_t(ap->affected_by_scaling ? 1 : 0); + s.write_float_t(ap->offset.x); + s.write_float_t(ap->offset.y); + s.write_float_t(ap->offset.z); } static void obj_classic_read_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, - stream* s, char** str) { - up->active = io_read_int32_t(s) != 0; - up->roll = io_read_float_t(s); - up->affected_axis.x = io_read_float_t(s); - up->affected_axis.y = io_read_float_t(s); - up->affected_axis.z = io_read_float_t(s); - up->point_at.x = io_read_float_t(s); - up->point_at.y = io_read_float_t(s); - up->point_at.z = io_read_float_t(s); + stream& s, char** str) { + up->active = s.read_int32_t() != 0; + up->roll = s.read_float_t(); + up->affected_axis.x = s.read_float_t(); + up->affected_axis.y = s.read_float_t(); + up->affected_axis.z = s.read_float_t(); + up->point_at.x = s.read_float_t(); + up->point_at.y = s.read_float_t(); + up->point_at.z = s.read_float_t(); - int32_t name_offset = io_read_int32_t(s); - io_read_string_null_terminated_offset(s, name_offset, &up->name); + int32_t name_offset = s.read_int32_t(); + up->name = s.read_utf8_string_null_terminated_offset(name_offset); } static void obj_classic_write_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, - stream* s, std::vector& strings, std::vector& string_offsets) { - io_write_int32_t(s, up->active ? 1 : 0); - io_write_float_t(s, up->roll); - io_write_float_t(s, up->affected_axis.x); - io_write_float_t(s, up->affected_axis.y); - io_write_float_t(s, up->affected_axis.z); - io_write_float_t(s, up->point_at.x); - io_write_float_t(s, up->point_at.y); - io_write_float_t(s, up->point_at.z); + stream& s, std::vector& strings, std::vector& string_offsets) { + s.write_int32_t(up->active ? 1 : 0); + s.write_float_t(up->roll); + s.write_float_t(up->affected_axis.x); + s.write_float_t(up->affected_axis.y); + s.write_float_t(up->affected_axis.z); + s.write_float_t(up->point_at.x); + s.write_float_t(up->point_at.y); + s.write_float_t(up->point_at.z); int64_t name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&up->name)); - io_write_int32_t(s, (int32_t)name_offset); + string_offsets, up->name); + s.write_int32_t((int32_t)name_offset); } static void obj_classic_read_skin_block_expression(obj_skin_block_expression* b, - stream* s, char** str) { + stream& s, char** str) { obj_classic_read_skin_block_node(&b->base, s, str); - int32_t name_offset = io_read_int32_t(s); - char* name = io_read_utf8_string_null_terminated_offset(s, name_offset); + int32_t name_offset = s.read_int32_t(); + char* name = s.read_utf8_string_null_terminated_offset(name_offset); b->name_index = 0; for (char** i = str; *i; i++) @@ -2327,47 +2317,47 @@ static void obj_classic_read_skin_block_expression(obj_skin_block_expression* b, } free(name); - b->expressions_count = io_read_int32_t(s); + b->expressions_count = s.read_int32_t(); b->expressions_count = min(b->expressions_count, 9); for (uint32_t i = 0; i < b->expressions_count; i++) { - int32_t expression_offset = io_read_int32_t(s); + int32_t expression_offset = s.read_int32_t(); if (expression_offset) - io_read_string_null_terminated_offset(s, expression_offset, &b->expressions[i]); + b->expressions[i] = s.read_utf8_string_null_terminated_offset(expression_offset); } for (uint32_t i = b->expressions_count; i < 9; i++) - b->expressions[i] = string_empty; + b->expressions[i] = 0; } static void obj_classic_write_skin_block_expression(obj_skin_block_expression* b, - stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names) { + stream& s, std::vector& strings, std::vector& string_offsets, char** bone_names) { obj_classic_write_skin_block_node(&b->base, s, strings, string_offsets); int64_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, string_offsets, bone_names, b->name_index); - io_write_int32_t(s, (int32_t)name_offset); + s.write_int32_t((int32_t)name_offset); - io_write_int32_t(s, min(b->expressions_count, 9)); + s.write_int32_t(min(b->expressions_count, 9)); for (uint32_t i = 0; i < b->expressions_count && i < 9; i++) { int64_t expression_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->expressions[i])); - io_write_int32_t(s, (int32_t)expression_offset); + string_offsets, b->expressions[i]); + s.write_int32_t((int32_t)expression_offset); } for (uint32_t i = b->expressions_count; i < 9; i++) - io_write_int32_t(s, 0); + s.write_int32_t(0); } static void obj_classic_read_skin_block_motion(obj_skin_block_motion* b, - stream* s, char** str) { + stream& s, char** str) { obj_classic_read_skin_block_node(&b->base, s, str); - int32_t name_offset = io_read_int32_t(s); - b->nodes_count = io_read_int32_t(s); - int32_t bone_names_offset = io_read_int32_t(s); - int32_t bone_matrices_offset = io_read_int32_t(s); + int32_t name_offset = s.read_int32_t(); + b->nodes_count = s.read_int32_t(); + int32_t bone_names_offset = s.read_int32_t(); + int32_t bone_matrices_offset = s.read_int32_t(); - char* name = io_read_utf8_string_null_terminated_offset(s, name_offset); + char* name = s.read_utf8_string_null_terminated_offset(name_offset); b->name_index = 0; for (char** i = str; *i; i++) @@ -2385,125 +2375,125 @@ static void obj_classic_read_skin_block_motion(obj_skin_block_motion* b, b->nodes = force_malloc_s(obj_skin_motion_node, b->nodes_count); if (bone_names_offset) { - io_position_push(s, bone_names_offset, SEEK_SET); + s.position_push(bone_names_offset, SEEK_SET); for (uint32_t i = 0; i < b->nodes_count; i++) - b->nodes[i].name_index = io_read_uint32_t(s); - io_position_pop(s); + b->nodes[i].name_index = s.read_uint32_t(); + s.position_pop(); } if (bone_matrices_offset) { - io_position_push(s, bone_matrices_offset, SEEK_SET); + s.position_push(bone_matrices_offset, SEEK_SET); for (uint32_t i = 0; i < b->nodes_count; i++) { mat4u& mat = b->nodes[i].transformation; - mat.row0.x = io_read_float_t(s); - mat.row1.x = io_read_float_t(s); - mat.row2.x = io_read_float_t(s); - mat.row3.x = io_read_float_t(s); - mat.row0.y = io_read_float_t(s); - mat.row1.y = io_read_float_t(s); - mat.row2.y = io_read_float_t(s); - mat.row3.y = io_read_float_t(s); - mat.row0.z = io_read_float_t(s); - mat.row1.z = io_read_float_t(s); - mat.row2.z = io_read_float_t(s); - mat.row3.z = io_read_float_t(s); - mat.row0.w = io_read_float_t(s); - mat.row1.w = io_read_float_t(s); - mat.row2.w = io_read_float_t(s); - mat.row3.w = io_read_float_t(s); + mat.row0.x = s.read_float_t(); + mat.row1.x = s.read_float_t(); + mat.row2.x = s.read_float_t(); + mat.row3.x = s.read_float_t(); + mat.row0.y = s.read_float_t(); + mat.row1.y = s.read_float_t(); + mat.row2.y = s.read_float_t(); + mat.row3.y = s.read_float_t(); + mat.row0.z = s.read_float_t(); + mat.row1.z = s.read_float_t(); + mat.row2.z = s.read_float_t(); + mat.row3.z = s.read_float_t(); + mat.row0.w = s.read_float_t(); + mat.row1.w = s.read_float_t(); + mat.row2.w = s.read_float_t(); + mat.row3.w = s.read_float_t(); } - io_position_pop(s); + s.position_pop(); } } static void obj_classic_write_skin_block_motion(obj_skin_block_motion* b, - stream* s, std::vector& strings, std::vector& string_offsets, + stream& s, std::vector& strings, std::vector& string_offsets, char** bone_names, int64_t* bone_names_offset, int64_t* bone_matrices_offset) { obj_classic_write_skin_block_node(&b->base, s, strings, string_offsets); int64_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, string_offsets, bone_names, b->name_index); - io_write_int32_t(s, (int32_t)name_offset); - io_write_int32_t(s, b->nodes_count); - io_write_int32_t(s, (int32_t)*bone_names_offset); - io_write_int32_t(s, (int32_t)*bone_matrices_offset); + s.write_int32_t((int32_t)name_offset); + s.write_int32_t(b->nodes_count); + s.write_int32_t((int32_t)*bone_names_offset); + s.write_int32_t((int32_t)*bone_matrices_offset); if (b->nodes) { - io_position_push(s, *bone_names_offset, SEEK_SET); + s.position_push(*bone_names_offset, SEEK_SET); for (uint32_t i = 0; i < b->nodes_count; i++) - io_write_uint32_t(s, b->nodes[i].name_index); - io_position_pop(s); + s.write_uint32_t(b->nodes[i].name_index); + s.position_pop(); *bone_names_offset += b->nodes_count * sizeof(uint32_t); - io_position_push(s, *bone_matrices_offset, SEEK_SET); + s.position_push(*bone_matrices_offset, SEEK_SET); for (uint32_t i = 0; i < b->nodes_count; i++) { mat4u& mat = b->nodes[i].transformation; - io_write_float_t(s, mat.row0.x); - io_write_float_t(s, mat.row1.x); - io_write_float_t(s, mat.row2.x); - io_write_float_t(s, mat.row3.x); - io_write_float_t(s, mat.row0.y); - io_write_float_t(s, mat.row1.y); - io_write_float_t(s, mat.row2.y); - io_write_float_t(s, mat.row3.y); - io_write_float_t(s, mat.row0.z); - io_write_float_t(s, mat.row1.z); - io_write_float_t(s, mat.row2.z); - io_write_float_t(s, mat.row3.z); - io_write_float_t(s, mat.row0.w); - io_write_float_t(s, mat.row1.w); - io_write_float_t(s, mat.row2.w); - io_write_float_t(s, mat.row3.w); + s.write_float_t(mat.row0.x); + s.write_float_t(mat.row1.x); + s.write_float_t(mat.row2.x); + s.write_float_t(mat.row3.x); + s.write_float_t(mat.row0.y); + s.write_float_t(mat.row1.y); + s.write_float_t(mat.row2.y); + s.write_float_t(mat.row3.y); + s.write_float_t(mat.row0.z); + s.write_float_t(mat.row1.z); + s.write_float_t(mat.row2.z); + s.write_float_t(mat.row3.z); + s.write_float_t(mat.row0.w); + s.write_float_t(mat.row1.w); + s.write_float_t(mat.row2.w); + s.write_float_t(mat.row3.w); } - io_position_pop(s); + s.position_pop(); *bone_matrices_offset += b->nodes_count * sizeof(mat4); } } static void obj_classic_read_skin_block_node(obj_skin_block_node* b, - stream* s, char** str) { - int32_t parent_name_offset = io_read_int32_t(s); - io_read_string_null_terminated_offset(s, parent_name_offset, &b->parent_name); + stream& s, char** str) { + int32_t parent_name_offset = s.read_int32_t(); + b->parent_name = s.read_utf8_string_null_terminated_offset(parent_name_offset); - b->position.x = io_read_float_t(s); - b->position.y = io_read_float_t(s); - b->position.z = io_read_float_t(s); - b->rotation.x = io_read_float_t(s); - b->rotation.y = io_read_float_t(s); - b->rotation.z = io_read_float_t(s); - b->scale.x = io_read_float_t(s); - b->scale.y = io_read_float_t(s); - b->scale.z = io_read_float_t(s); + b->position.x = s.read_float_t(); + b->position.y = s.read_float_t(); + b->position.z = s.read_float_t(); + b->rotation.x = s.read_float_t(); + b->rotation.y = s.read_float_t(); + b->rotation.z = s.read_float_t(); + b->scale.x = s.read_float_t(); + b->scale.y = s.read_float_t(); + b->scale.z = s.read_float_t(); } static void obj_classic_write_skin_block_node(obj_skin_block_node* b, - stream* s, std::vector& strings, std::vector& string_offsets) { + stream& s, std::vector& strings, std::vector& string_offsets) { int64_t parent_name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->parent_name)); - io_write_int32_t(s, (int32_t)parent_name_offset); + string_offsets, b->parent_name); + s.write_int32_t((int32_t)parent_name_offset); - io_write_float_t(s, b->position.x); - io_write_float_t(s, b->position.y); - io_write_float_t(s, b->position.z); - io_write_float_t(s, b->rotation.x); - io_write_float_t(s, b->rotation.y); - io_write_float_t(s, b->rotation.z); - io_write_float_t(s, b->scale.x); - io_write_float_t(s, b->scale.y); - io_write_float_t(s, b->scale.z); + s.write_float_t(b->position.x); + s.write_float_t(b->position.y); + s.write_float_t(b->position.z); + s.write_float_t(b->rotation.x); + s.write_float_t(b->rotation.y); + s.write_float_t(b->rotation.z); + s.write_float_t(b->scale.x); + s.write_float_t(b->scale.y); + s.write_float_t(b->scale.z); } static void obj_classic_read_skin_block_osage(obj_skin_block_osage* b, - stream* s, char** str) { + stream& s, char** str) { obj_classic_read_skin_block_node(&b->base, s, str); - b->start_index = io_read_int32_t(s); - b->count = io_read_int32_t(s); - b->external_name_index = io_read_uint32_t(s); - b->name_index = io_read_uint32_t(s); + b->start_index = s.read_int32_t(); + b->count = s.read_int32_t(); + b->external_name_index = s.read_uint32_t(); + b->name_index = s.read_uint32_t(); - int32_t offset = io_read_int32_t(s); - io_read(s, 0, 0x14); + int32_t offset = s.read_int32_t(); + s.read(0, 0x14); b->nodes = 0; @@ -2513,139 +2503,139 @@ static void obj_classic_read_skin_block_osage(obj_skin_block_osage* b, b->nodes_count = b->count; b->nodes = force_malloc_s(obj_skin_osage_node, b->count); - io_position_push(s, offset, SEEK_SET); - if (~io_read_uint32_t(s) & 0x8000) { + s.position_push(offset, SEEK_SET); + if (~s.read_uint32_t() & 0x8000) { obj_skin_osage_root_node* root = &b->root; root->coli = 0; root->coli_count = 0; - root->unk0 = io_read_int32_t(s); - root->force = io_read_float_t(s); - root->force_gain = io_read_float_t(s); - root->air_res = io_read_float_t(s); - root->rot_y = io_read_float_t(s); - root->rot_z = io_read_float_t(s); - root->hinge_y = io_read_float_t(s); - root->hinge_z = io_read_float_t(s); - io_read_string_null_terminated(s, &root->name); - int32_t coli_offset = io_read_int32_t(s); - root->coli_r = io_read_float_t(s); - root->friction = io_read_float_t(s); - root->wind_afc = io_read_float_t(s); - root->unk44 = io_read_int32_t(s); + root->unk0 = s.read_int32_t(); + root->force = s.read_float_t(); + root->force_gain = s.read_float_t(); + root->air_res = s.read_float_t(); + root->rot_y = s.read_float_t(); + root->rot_z = s.read_float_t(); + root->hinge_y = s.read_float_t(); + root->hinge_z = s.read_float_t(); + root->name = s.read_utf8_string_null_terminated(); + int32_t coli_offset = s.read_int32_t(); + root->coli_r = s.read_float_t(); + root->friction = s.read_float_t(); + root->wind_afc = s.read_float_t(); + root->unk44 = s.read_int32_t(); if (coli_offset) { - io_set_position(s, coli_offset, SEEK_SET); + s.set_position(coli_offset, SEEK_SET); int32_t coli_count = 0; - while (io_read_int32_t(s)) { - io_read(s, 44); + while (s.read_int32_t()) { + s.read(44); coli_count++; } root->coli = force_malloc_s(obj_skin_osage_root_coli, coli_count); root->coli_count = coli_count; - io_set_position(s, coli_offset, SEEK_SET); + s.set_position(coli_offset, SEEK_SET); for (int32_t i = 0; i < root->coli_count; i++) { obj_skin_osage_root_coli* coli = &root->coli[i]; - coli->type = (obj_skin_osage_root_coli_type)io_read_int32_t(s); - coli->bone0_index = io_read_int32_t(s); - coli->bone1_index = io_read_int32_t(s); - coli->radius = io_read_float_t(s); - coli->bone0_pos.x = io_read_float_t(s); - coli->bone0_pos.y = io_read_float_t(s); - coli->bone0_pos.z = io_read_float_t(s); - coli->bone1_pos.x = io_read_float_t(s); - coli->bone1_pos.y = io_read_float_t(s); - coli->bone1_pos.z = io_read_float_t(s); + coli->type = (obj_skin_osage_root_coli_type)s.read_int32_t(); + coli->bone0_index = s.read_int32_t(); + coli->bone1_index = s.read_int32_t(); + coli->radius = s.read_float_t(); + coli->bone0_pos.x = s.read_float_t(); + coli->bone0_pos.y = s.read_float_t(); + coli->bone0_pos.z = s.read_float_t(); + coli->bone1_pos.x = s.read_float_t(); + coli->bone1_pos.y = s.read_float_t(); + coli->bone1_pos.z = s.read_float_t(); } } b->root_init = true; } else { - io_set_position(s, offset, SEEK_SET); + s.set_position(offset, SEEK_SET); for (uint32_t i = 0; i < b->nodes_count; i++) { obj_skin_osage_node* node = &b->nodes[i]; - node->name_index = io_read_uint32_t(s); - node->length = io_read_float_t(s); - node->rotation.x = io_read_float_t(s); - node->rotation.y = io_read_float_t(s); - node->rotation.z = io_read_float_t(s); + node->name_index = s.read_uint32_t(); + node->length = s.read_float_t(); + node->rotation.x = s.read_float_t(); + node->rotation.y = s.read_float_t(); + node->rotation.z = s.read_float_t(); } b->root_init = false; } - io_position_pop(s); + s.position_pop(); } 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) { + stream& s, std::vector& strings, std::vector& string_offsets, int64_t* nodes_offset) { int32_t nodes_offset_i32 = (int32_t)*nodes_offset; if (b->root_init) { - nodes_offset_i32 = (int32_t)io_get_position(s); + nodes_offset_i32 = (int32_t)s.get_position(); obj_skin_osage_root_node* root = &b->root; int32_t coli_offset = 0; if (root->coli) { - coli_offset = (int32_t)io_get_position(s); + coli_offset = (int32_t)s.get_position(); for (int32_t i = 0; i < root->coli_count; i++) { obj_skin_osage_root_coli* coli = &root->coli[i]; - io_write_int32_t(s, coli->type); - io_write_int32_t(s, coli->bone0_index); - io_write_int32_t(s, coli->bone1_index); - io_write_float_t(s, coli->radius); - io_write_float_t(s, coli->bone0_pos.x); - io_write_float_t(s, coli->bone0_pos.y); - io_write_float_t(s, coli->bone0_pos.z); - io_write_float_t(s, coli->bone1_pos.x); - io_write_float_t(s, coli->bone1_pos.y); - io_write_float_t(s, coli->bone1_pos.z); + s.write_int32_t(coli->type); + s.write_int32_t(coli->bone0_index); + s.write_int32_t(coli->bone1_index); + s.write_float_t(coli->radius); + s.write_float_t(coli->bone0_pos.x); + s.write_float_t(coli->bone0_pos.y); + s.write_float_t(coli->bone0_pos.z); + s.write_float_t(coli->bone1_pos.x); + s.write_float_t(coli->bone1_pos.y); + s.write_float_t(coli->bone1_pos.z); } - io_align_write(s, 0x10); + s.align_write(0x10); } - io_write_int32_t(s, root->unk0); - io_write_float_t(s, root->force); - io_write_float_t(s, root->force_gain); - io_write_float_t(s, root->air_res); - io_write_float_t(s, root->rot_y); - io_write_float_t(s, root->rot_z); - io_write_float_t(s, root->hinge_y); - io_write_float_t(s, root->hinge_z); - io_write_string_null_terminated(s, &root->name); - io_write_int32_t(s, coli_offset); - io_write_float_t(s, root->coli_r); - io_write_float_t(s, root->friction); - io_write_float_t(s, root->wind_afc); - io_write_int32_t(s, root->unk44); - io_write(s, 0x08); + s.write_int32_t(root->unk0); + s.write_float_t(root->force); + s.write_float_t(root->force_gain); + s.write_float_t(root->air_res); + s.write_float_t(root->rot_y); + s.write_float_t(root->rot_z); + s.write_float_t(root->hinge_y); + s.write_float_t(root->hinge_z); + s.write_utf8_string_null_terminated(root->name); + s.write_int32_t(coli_offset); + s.write_float_t(root->coli_r); + s.write_float_t(root->friction); + s.write_float_t(root->wind_afc); + s.write_int32_t(root->unk44); + s.write(0x08); } obj_classic_write_skin_block_node(&b->base, s, strings, string_offsets); - io_write_int32_t(s, b->start_index); - io_write_int32_t(s, b->count); - io_write_uint32_t(s, b->external_name_index); - io_write_uint32_t(s, b->name_index); + s.write_int32_t(b->start_index); + s.write_int32_t(b->count); + s.write_uint32_t(b->external_name_index); + s.write_uint32_t(b->name_index); - io_write_int32_t(s, nodes_offset_i32); - io_write(s, 0x14); + s.write_int32_t(nodes_offset_i32); + s.write(0x14); if (!b->root_init && b->nodes) { - io_position_push(s, *nodes_offset, SEEK_SET); + s.position_push(*nodes_offset, SEEK_SET); for (uint32_t i = 0; i < b->nodes_count; i++) { obj_skin_osage_node* node = &b->nodes[i]; - io_write_uint32_t(s, node->name_index); - io_write_float_t(s, node->length); - io_write_float_t(s, node->rotation.x); - io_write_float_t(s, node->rotation.y); - io_write_float_t(s, node->rotation.z); + s.write_uint32_t(node->name_index); + s.write_float_t(node->length); + s.write_float_t(node->rotation.x); + s.write_float_t(node->rotation.y); + s.write_float_t(node->rotation.z); } - io_position_pop(s); + s.position_pop(); *nodes_offset += b->nodes_count * (sizeof(uint32_t) + sizeof(float_t) * 4); } } -static void obj_classic_read_vertex(obj* obj, stream* s, int64_t* vertex, obj_mesh* mesh, +static void obj_classic_read_vertex(obj* obj, stream& s, int64_t* vertex, 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) @@ -2693,99 +2683,99 @@ static void obj_classic_read_vertex(obj* obj, stream* s, int64_t* vertex, obj_me if (~vertex_format_file & attribute) continue; - io_set_position(s, base_offset + vertex[i], SEEK_SET); + s.set_position(base_offset + vertex[i], SEEK_SET); switch (attribute) { 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); + vtx[j].position.x = s.read_float_t(); + vtx[j].position.y = s.read_float_t(); + vtx[j].position.z = s.read_float_t(); } break; 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); + vtx[j].normal.x = s.read_float_t(); + vtx[j].normal.y = s.read_float_t(); + vtx[j].normal.z = s.read_float_t(); } break; 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); + vtx[j].tangent.x = s.read_float_t(); + vtx[j].tangent.y = s.read_float_t(); + vtx[j].tangent.z = s.read_float_t(); + vtx[j].tangent.w = s.read_float_t(); } break; 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); + vtx[j].binormal.x = s.read_float_t(); + vtx[j].binormal.y = s.read_float_t(); + vtx[j].binormal.z = s.read_float_t(); } break; 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); + vtx[j].texcoord0.x = s.read_float_t(); + vtx[j].texcoord0.y = s.read_float_t(); } break; 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); + vtx[j].texcoord1.x = s.read_float_t(); + vtx[j].texcoord1.y = s.read_float_t(); } break; 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); + vtx[j].texcoord2.x = s.read_float_t(); + vtx[j].texcoord2.y = s.read_float_t(); } break; 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); + vtx[j].texcoord3.x = s.read_float_t(); + vtx[j].texcoord3.y = s.read_float_t(); } break; 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); + vtx[j].color0.x = s.read_float_t(); + vtx[j].color0.y = s.read_float_t(); + vtx[j].color0.z = s.read_float_t(); + vtx[j].color0.w = s.read_float_t(); } break; 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); + vtx[j].color1.x = s.read_float_t(); + vtx[j].color1.y = s.read_float_t(); + vtx[j].color1.z = s.read_float_t(); + vtx[j].color1.w = s.read_float_t(); } break; 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); + vtx[j].bone_weight.x = s.read_float_t(); + vtx[j].bone_weight.y = s.read_float_t(); + vtx[j].bone_weight.z = s.read_float_t(); + vtx[j].bone_weight.w = s.read_float_t(); } break; 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); + vtx[j].bone_index.x = (int32_t)s.read_float_t(); + vtx[j].bone_index.y = (int32_t)s.read_float_t(); + vtx[j].bone_index.z = (int32_t)s.read_float_t(); + vtx[j].bone_index.w = (int32_t)s.read_float_t(); } break; 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); - vtx[j].unknown.w = io_read_float_t(s); + vtx[j].unknown.x = s.read_float_t(); + vtx[j].unknown.y = s.read_float_t(); + vtx[j].unknown.z = s.read_float_t(); + vtx[j].unknown.w = s.read_float_t(); } break; } @@ -2795,7 +2785,7 @@ static void obj_classic_read_vertex(obj* obj, stream* s, int64_t* vertex, obj_me mesh->vertex_format = vertex_format; } -static void obj_classic_write_vertex(obj* obj, stream* s, int64_t* vertex, obj_mesh* mesh, +static void obj_classic_write_vertex(obj* obj, stream& s, int64_t* vertex, 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 _num_vertex = mesh->num_vertex; @@ -2867,136 +2857,136 @@ static void obj_classic_write_vertex(obj* obj, stream* s, int64_t* vertex, obj_m *size_vertex = _size_vertex; if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_POSITION) { - vertex[0] = io_get_position(s) - base_offset; + vertex[0] = s.get_position() - 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); + s.write_float_t(vtx[i].position.x); + s.write_float_t(vtx[i].position.y); + s.write_float_t(vtx[i].position.z); } } if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_NORMAL) { - vertex[1] = io_get_position(s) - base_offset; + vertex[1] = s.get_position() - 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); + s.write_float_t(vtx[i].normal.x); + s.write_float_t(vtx[i].normal.y); + s.write_float_t(vtx[i].normal.z); } } if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TANGENT) { - vertex[2] = io_get_position(s) - base_offset; + vertex[2] = s.get_position() - 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); - io_write_float_t(s, vtx[i].tangent.w); + s.write_float_t(vtx[i].tangent.x); + s.write_float_t(vtx[i].tangent.y); + s.write_float_t(vtx[i].tangent.z); + s.write_float_t(vtx[i].tangent.w); } } if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_BINORMAL) { - vertex[3] = io_get_position(s) - base_offset; + vertex[3] = s.get_position() - 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); + s.write_float_t(vtx[i].binormal.x); + s.write_float_t(vtx[i].binormal.y); + s.write_float_t(vtx[i].binormal.z); } } if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TEXCOORD0) { - vertex[4] = io_get_position(s) - base_offset; + vertex[4] = s.get_position() - 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); + s.write_float_t(vtx[i].texcoord0.x); + s.write_float_t(vtx[i].texcoord0.y); } } if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_BONE_WEIGHT) { - vertex[10] = io_get_position(s) - base_offset; + vertex[10] = s.get_position() - 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); - io_write_float_t(s, vtx[i].bone_weight.w); + s.write_float_t(vtx[i].bone_weight.x); + s.write_float_t(vtx[i].bone_weight.y); + s.write_float_t(vtx[i].bone_weight.z); + s.write_float_t(vtx[i].bone_weight.w); } } if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_BONE_INDEX) { - vertex[11] = io_get_position(s) - base_offset; + vertex[11] = s.get_position() - 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); - io_write_float_t(s, (float_t)vtx[i].bone_index.w); + s.write_float_t((float_t)vtx[i].bone_index.x); + s.write_float_t((float_t)vtx[i].bone_index.y); + s.write_float_t((float_t)vtx[i].bone_index.z); + s.write_float_t((float_t)vtx[i].bone_index.w); } } if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TEXCOORD1) { - vertex[5] = io_get_position(s) - base_offset; + vertex[5] = s.get_position() - 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); + s.write_float_t(vtx[i].texcoord1.x); + s.write_float_t(vtx[i].texcoord1.y); } } if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TEXCOORD2) { - vertex[6] = io_get_position(s) - base_offset; + vertex[6] = s.get_position() - 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); + s.write_float_t(vtx[i].texcoord2.x); + s.write_float_t(vtx[i].texcoord2.y); } } if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_TEXCOORD3) { - vertex[7] = io_get_position(s) - base_offset; + vertex[7] = s.get_position() - 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); + s.write_float_t(vtx[i].texcoord3.x); + s.write_float_t(vtx[i].texcoord3.y); } } if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_COLOR0) { - vertex[8] = io_get_position(s) - base_offset; + vertex[8] = s.get_position() - 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); - io_write_float_t(s, vtx[i].color0.w); + s.write_float_t(vtx[i].color0.x); + s.write_float_t(vtx[i].color0.y); + s.write_float_t(vtx[i].color0.z); + s.write_float_t(vtx[i].color0.w); } } if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_COLOR1) { - vertex[9] = io_get_position(s) - base_offset; + vertex[9] = s.get_position() - 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); - io_write_float_t(s, vtx[i].color1.w); + s.write_float_t(vtx[i].color1.x); + s.write_float_t(vtx[i].color1.y); + s.write_float_t(vtx[i].color1.z); + s.write_float_t(vtx[i].color1.w); } } if (_vertex_format_file & OBJ_VERTEX_FORMAT_FILE_UNKNOWN) { - vertex[12] = io_get_position(s) - base_offset; + vertex[12] = s.get_position() - 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); - io_write_float_t(s, vtx[i].unknown.w); + s.write_float_t(vtx[i].unknown.x); + s.write_float_t(vtx[i].unknown.y); + s.write_float_t(vtx[i].unknown.z); + s.write_float_t(vtx[i].unknown.w); } } } -static void obj_set_modern_read_inner(obj_set* os, stream* s) { +static void obj_set_modern_read_inner(obj_set* os, stream& s) { f2_struct st; st.read(s); if (st.header.signature != reverse_endianness_uint32_t('MOSD') || !st.data.size()) return; stream s_mosd; - io_open(&s_mosd, &st.data); + s_mosd.open(st.data); s_mosd.is_big_endian = st.header.use_big_endian; - uint32_t version = io_read_uint32_t_stream_reverse_endianness(&s_mosd); + uint32_t version = s_mosd.read_uint32_t_reverse_endianness(); if (version != 0x05062501) { os->is_x = false; os->modern = false; @@ -3005,42 +2995,42 @@ static void obj_set_modern_read_inner(obj_set* os, stream* s) { } bool is_x = true; - io_set_position(&s_mosd, 0x0C, SEEK_SET); - is_x &= io_read_uint32_t_stream_reverse_endianness(&s_mosd) == 0; - io_set_position(&s_mosd, 0x14, SEEK_SET); - is_x &= io_read_uint32_t_stream_reverse_endianness(&s_mosd) == 0; - io_set_position(&s_mosd, 0x1C, SEEK_SET); - is_x &= io_read_uint32_t_stream_reverse_endianness(&s_mosd) == 0; - io_set_position(&s_mosd, 0x24, SEEK_SET); - is_x &= io_read_uint32_t_stream_reverse_endianness(&s_mosd) == 0; - io_set_position(&s_mosd, 0x2C, SEEK_SET); - is_x &= io_read_uint32_t_stream_reverse_endianness(&s_mosd) == 0; + s_mosd.set_position(0x0C, SEEK_SET); + is_x &= s_mosd.read_uint32_t_reverse_endianness() == 0; + s_mosd.set_position(0x14, SEEK_SET); + is_x &= s_mosd.read_uint32_t_reverse_endianness() == 0; + s_mosd.set_position(0x1C, SEEK_SET); + is_x &= s_mosd.read_uint32_t_reverse_endianness() == 0; + s_mosd.set_position(0x24, SEEK_SET); + is_x &= s_mosd.read_uint32_t_reverse_endianness() == 0; + s_mosd.set_position(0x2C, SEEK_SET); + is_x &= s_mosd.read_uint32_t_reverse_endianness() == 0; - io_set_position(&s_mosd, 0x04, SEEK_SET); + s_mosd.set_position(0x04, SEEK_SET); obj_set_header osh = {}; if (!is_x) { - 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); + os->obj_num = s_mosd.read_int32_t_reverse_endianness(); + osh.last_obj_id = s_mosd.read_int32_t_reverse_endianness(); + osh.obj_data = s_mosd.read_offset_f2(st.header.length); + osh.obj_skin_data = s_mosd.read_offset_f2(st.header.length); + osh.obj_name_data = s_mosd.read_offset_f2(st.header.length); + osh.obj_id_data = s_mosd.read_offset_f2(st.header.length); + osh.tex_id_data = s_mosd.read_offset_f2(st.header.length); + os->tex_id_num = s_mosd.read_int32_t_reverse_endianness(); + os->reserved[0] = s_mosd.read_uint32_t_reverse_endianness(); + os->reserved[1] = s_mosd.read_uint32_t_reverse_endianness(); } else { - 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->obj_num = s_mosd.read_int32_t_reverse_endianness(); + osh.last_obj_id = s_mosd.read_int32_t_reverse_endianness(); + osh.obj_data = s_mosd.read_offset_x(); + osh.obj_skin_data = s_mosd.read_offset_x(); + osh.obj_name_data = s_mosd.read_offset_x(); + osh.obj_id_data = s_mosd.read_offset_x(); + osh.tex_id_data = s_mosd.read_offset_x(); + os->tex_id_num = s_mosd.read_int32_t_reverse_endianness(); + os->reserved[0] = s_mosd.read_uint32_t_reverse_endianness(); + os->reserved[1] = s_mosd.read_uint32_t_reverse_endianness(); } os->obj_data = force_malloc_s(obj, os->obj_num); @@ -3048,55 +3038,54 @@ static void obj_set_modern_read_inner(obj_set* os, stream* s) { 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); + s_mosd.set_position(osh.obj_data, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < os->obj_num; i++) - obj_datas[i] = io_read_offset_f2(&s_mosd, st.header.length); + obj_datas[i] = s_mosd.read_offset_f2(st.header.length); else for (uint32_t i = 0; i < os->obj_num; i++) - obj_datas[i] = io_read_offset_x(&s_mosd); + obj_datas[i] = s_mosd.read_offset_x(); } 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); + s_mosd.set_position(osh.obj_skin_data, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < os->obj_num; i++) - obj_skin_datas[i] = io_read_offset_f2(&s_mosd, st.header.length); + obj_skin_datas[i] = s_mosd.read_offset_f2(st.header.length); else for (uint32_t i = 0; i < os->obj_num; i++) - obj_skin_datas[i] = io_read_offset_x(&s_mosd); + obj_skin_datas[i] = s_mosd.read_offset_x(); } 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); + s_mosd.set_position(osh.obj_name_data, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < os->obj_num; i++) - obj_name_datas[i] = io_read_offset_f2(&s_mosd, st.header.length); + obj_name_datas[i] = s_mosd.read_offset_f2(st.header.length); else for (uint32_t i = 0; i < os->obj_num; i++) - obj_name_datas[i] = io_read_offset_x(&s_mosd); + obj_name_datas[i] = s_mosd.read_offset_x(); } 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, - obj_name_datas[i], &obj->name); - obj->hash = hash_string_murmurhash(&obj->name); + obj->name = s_mosd.read_utf8_string_null_terminated_offset(obj_name_datas[i]); + obj->hash = hash_utf8_murmurhash(obj->name); } else obj->hash = hash_murmurhash_empty; } if (osh.obj_id_data) { - io_set_position(&s_mosd, osh.obj_id_data, SEEK_SET); + s_mosd.set_position(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); + os->obj_data[i].id = s_mosd.read_uint32_t_reverse_endianness(); } free(obj_datas); @@ -3104,10 +3093,10 @@ static void obj_set_modern_read_inner(obj_set* os, stream* s) { free(obj_name_datas); if (osh.tex_id_data) { - io_set_position(&s_mosd, osh.tex_id_data, SEEK_SET); + s_mosd.set_position(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); + os->tex_id_data[i] = s_mosd.read_uint32_t_reverse_endianness(); } int32_t omdl_index = 0; @@ -3133,52 +3122,43 @@ static void obj_set_modern_read_inner(obj_set* os, stream* s) { stream* s_oidx_ptr = 0; stream* s_ovtx_ptr = 0; if (oskn) { - io_open(&s_oskn, &oskn->data); + s_oskn.open(oskn->data); s_oskn.is_big_endian = oskn->header.use_big_endian; s_oskn_ptr = &s_oskn; } if (oidx) { - io_open(&s_oidx, &oidx->data); + s_oidx.open(oidx->data); s_oidx.is_big_endian = oidx->header.use_big_endian; s_oidx_ptr = &s_oidx; } if (ovtx) { - io_open(&s_ovtx, &ovtx->data); + s_ovtx.open(ovtx->data); s_ovtx.is_big_endian = ovtx->header.use_big_endian; s_ovtx_ptr = &s_ovtx; } obj* obj = &os->obj_data[omdl_index]; stream s_omdl; - io_open(&s_omdl, &i.data); + s_omdl.open(i.data); s_omdl.is_big_endian = i.header.use_big_endian; - obj_modern_read_model(obj, &s_omdl, 0, i.header.length, is_x, s_oidx_ptr, s_ovtx_ptr); - io_free(&s_omdl); + obj_modern_read_model(obj, s_omdl, 0, i.header.length, is_x, s_oidx_ptr, s_ovtx_ptr); + s_omdl.close(); if (s_oskn_ptr) - obj_modern_read_skin(obj, s_oskn_ptr, 0, oskn->header.length, is_x); - - if (s_oskn_ptr) - io_free(&s_oskn); - if (s_oidx_ptr) - io_free(&s_oidx); - if (s_ovtx_ptr) - io_free(&s_ovtx); + obj_modern_read_skin(obj, *s_oskn_ptr, 0, oskn->header.length, is_x); omdl_index++; } - io_free(&s_mosd); - os->is_x = is_x; os->modern = true; os->ready = true; } -static void obj_set_modern_write_inner(obj_set* os, stream* s) { +static void obj_set_modern_write_inner(obj_set* os, stream& s) { stream s_mosd; - io_open(&s_mosd); + s_mosd.open(); uint32_t off; enrs e; enrs_entry ee; @@ -3246,115 +3226,115 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { off = align_val(off, 0x10); if (!is_x) { - io_write_int32_t(&s_mosd, 0); - io_write_int32_t(&s_mosd, 0); - io_write_int32_t(&s_mosd, 0); - io_write_offset_f2_pof_add(&s_mosd, 0, 0x20, &pof); - io_write_offset_f2_pof_add(&s_mosd, 0, 0x20, &pof); - io_write_offset_f2_pof_add(&s_mosd, 0, 0x20, &pof); - io_write_offset_f2_pof_add(&s_mosd, 0, 0x20, &pof); - io_write_offset_f2_pof_add(&s_mosd, 0, 0x20, &pof); - io_write_int32_t(&s_mosd, 0); - io_write_int32_t(&s_mosd, 0); - io_write_int32_t(&s_mosd, 0); + s_mosd.write_int32_t(0); + s_mosd.write_int32_t(0); + s_mosd.write_int32_t(0); + io_write_offset_f2_pof_add(s_mosd, 0, 0x20, &pof); + io_write_offset_f2_pof_add(s_mosd, 0, 0x20, &pof); + io_write_offset_f2_pof_add(s_mosd, 0, 0x20, &pof); + io_write_offset_f2_pof_add(s_mosd, 0, 0x20, &pof); + io_write_offset_f2_pof_add(s_mosd, 0, 0x20, &pof); + s_mosd.write_int32_t(0); + s_mosd.write_int32_t(0); + s_mosd.write_int32_t(0); } else { - io_write_int32_t(&s_mosd, 0); - io_write_int32_t(&s_mosd, 0); - io_write_int32_t(&s_mosd, 0); - io_write_offset_x_pof_add(&s_mosd, 0, &pof); - io_write_offset_x_pof_add(&s_mosd, 0, &pof); - io_write_offset_x_pof_add(&s_mosd, 0, &pof); - io_write_offset_x_pof_add(&s_mosd, 0, &pof); - io_write_offset_x_pof_add(&s_mosd, 0, &pof); - io_write_int32_t(&s_mosd, 0); - io_write_int32_t(&s_mosd, 0); - io_write_int32_t(&s_mosd, 0); - io_align_write(&s_mosd, 0x10); + s_mosd.write_int32_t(0); + s_mosd.write_int32_t(0); + s_mosd.write_int32_t(0); + io_write_offset_x_pof_add(s_mosd, 0, &pof); + io_write_offset_x_pof_add(s_mosd, 0, &pof); + io_write_offset_x_pof_add(s_mosd, 0, &pof); + io_write_offset_x_pof_add(s_mosd, 0, &pof); + io_write_offset_x_pof_add(s_mosd, 0, &pof); + s_mosd.write_int32_t(0); + s_mosd.write_int32_t(0); + s_mosd.write_int32_t(0); + s_mosd.align_write(0x10); } - osh.obj_data = io_get_position(&s_mosd); + osh.obj_data = s_mosd.get_position(); if (!is_x) for (uint32_t i = 0; i < count; i++) - io_write_offset_f2(&s_mosd, 0, 0x20); + s_mosd.write_offset_f2(0, 0x20); else for (uint32_t i = 0; i < count; i++) - io_write_offset_x(&s_mosd, 0); - io_align_write(&s_mosd, 0x10); + s_mosd.write_offset_x(0); + s_mosd.align_write(0x10); - osh.obj_skin_data = io_get_position(&s_mosd); + osh.obj_skin_data = s_mosd.get_position(); if (!is_x) for (uint32_t i = 0; i < count; i++) - io_write_offset_f2(&s_mosd, 0, 0x20); + s_mosd.write_offset_f2(0, 0x20); else for (uint32_t i = 0; i < count; i++) - io_write_offset_x(&s_mosd, 0); - io_align_write(&s_mosd, 0x10); + s_mosd.write_offset_x(0); + s_mosd.align_write(0x10); - osh.obj_name_data = io_get_position(&s_mosd); + osh.obj_name_data = s_mosd.get_position(); if (!is_x) for (uint32_t i = 0; i < count; i++) - io_write_offset_f2_pof_add(&s_mosd, 0, 0x20, &pof); + io_write_offset_f2_pof_add(s_mosd, 0, 0x20, &pof); else for (uint32_t i = 0; i < count; i++) - io_write_offset_x_pof_add(&s_mosd, 0, &pof); - io_align_write(&s_mosd, 0x10); + io_write_offset_x_pof_add(s_mosd, 0, &pof); + s_mosd.align_write(0x10); - osh.obj_id_data = io_get_position(&s_mosd); + osh.obj_id_data = s_mosd.get_position(); for (uint32_t i = 0; i < count; i++) - io_write_uint32_t(&s_mosd, os->obj_data[i].id); - io_align_write(&s_mosd, 0x10); + s_mosd.write_uint32_t(os->obj_data[i].id); + s_mosd.align_write(0x10); - osh.tex_id_data = io_get_position(&s_mosd); + osh.tex_id_data = s_mosd.get_position(); 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); + s_mosd.write_uint32_t(os->tex_id_data[i]); + s_mosd.align_write(0x10); int64_t* obj_name_datas = force_malloc_s(int64_t, count); for (uint32_t i = 0; i < count; i++) { - obj_name_datas[i] = (int32_t)io_get_position(&s_mosd); - io_write_string_null_terminated(&s_mosd, &os->obj_data[i].name); + obj_name_datas[i] = (int32_t)s_mosd.get_position(); + s_mosd.write_utf8_string_null_terminated(os->obj_data[i].name); } - io_align_write(&s_mosd, 0x10); + s_mosd.align_write(0x10); - io_position_push(&s_mosd, osh.obj_name_data, SEEK_SET); + s_mosd.position_push(osh.obj_name_data, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < count; i++) - io_write_offset_f2(&s_mosd, obj_name_datas[i], 0x20); + s_mosd.write_offset_f2(obj_name_datas[i], 0x20); else for (uint32_t i = 0; i < count; i++) - io_write_offset_x(&s_mosd, obj_name_datas[i]); - io_position_pop(&s_mosd); + s_mosd.write_offset_x(obj_name_datas[i]); + s_mosd.position_pop(); free(obj_name_datas); - io_position_push(&s_mosd, 0x00, SEEK_SET); + s_mosd.position_push(0x00, SEEK_SET); if (!is_x) { - 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.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]); + s_mosd.write_uint32_t(0x05062501); + s_mosd.write_int32_t(os->obj_num); + s_mosd.write_int32_t(-1); + s_mosd.write_offset_f2(osh.obj_data, 0x20); + s_mosd.write_offset_f2(osh.obj_skin_data, 0x20); + s_mosd.write_offset_f2(osh.obj_name_data, 0x20); + s_mosd.write_offset_f2(osh.obj_id_data, 0x20); + s_mosd.write_offset_f2(osh.tex_id_data, 0x20); + s_mosd.write_int32_t(os->tex_id_num); + s_mosd.write_uint32_t(os->reserved[0]); + s_mosd.write_uint32_t(os->reserved[1]); } else { - 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.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]); + s_mosd.write_uint32_t(0x05062501); + s_mosd.write_int32_t(os->obj_num); + s_mosd.write_int32_t(-1); + s_mosd.write_offset_x(osh.obj_data); + s_mosd.write_offset_x(osh.obj_skin_data); + s_mosd.write_offset_x(osh.obj_name_data); + s_mosd.write_offset_x(osh.obj_id_data); + s_mosd.write_offset_x(osh.tex_id_data); + s_mosd.write_int32_t(os->tex_id_num); + s_mosd.write_uint32_t(os->reserved[0]); + s_mosd.write_uint32_t(os->reserved[1]); } - io_position_pop(&s_mosd); + s_mosd.position_pop(); f2_struct st; for (uint32_t i = 0; i < count; i++) { @@ -3364,20 +3344,20 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { f2_struct* omdl = &st.sub_structs.back(); stream s_omdl; - io_open(&s_omdl); + s_omdl.open(); if (obj->skin_init) { st.sub_structs.push_back({}); f2_struct* oskn = &st.sub_structs.back(); stream s_oskn; - io_open(&s_oskn); + s_oskn.open(); - obj_modern_write_skin(obj, &s_oskn, 0, is_x, oskn); + obj_modern_write_skin(obj, s_oskn, 0, is_x, oskn); - io_align_write(&s_oskn, 0x10); - io_copy(&s_oskn, &oskn->data); - io_free(&s_oskn); + s_oskn.align_write(0x10); + s_oskn.copy(oskn->data); + s_oskn.close(); oskn->header.signature = reverse_endianness_uint32_t('OSKN'); oskn->header.length = 0x20; @@ -3385,11 +3365,11 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { oskn->header.use_section_size = true; } - obj_modern_write_model(obj, &s_omdl, 0, is_x, omdl); + obj_modern_write_model(obj, s_omdl, 0, is_x, omdl); - io_align_write(&s_omdl, 0x10); - io_copy(&s_omdl, &omdl->data); - io_free(&s_omdl); + s_omdl.align_write(0x10); + s_omdl.copy(omdl->data); + s_omdl.close(); omdl->header.signature = reverse_endianness_uint32_t('OMDL'); omdl->header.length = 0x20; @@ -3397,9 +3377,9 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { omdl->header.use_section_size = true; } - io_align_write(&s_mosd, 0x10); - io_copy(&s_mosd, &st.data); - io_free(&s_mosd); + s_mosd.align_write(0x10); + s_mosd.copy(st.data); + s_mosd.close(); st.enrs = e; st.pof = pof; @@ -3412,31 +3392,31 @@ static void obj_set_modern_write_inner(obj_set* os, stream* s) { st.write(s, true, os->is_x); } -static void obj_modern_read_index(obj* obj, stream* s, obj_sub_mesh* sub_mesh) { +static void obj_modern_read_index(obj* obj, stream& s, obj_sub_mesh* sub_mesh) { bool tri_strip = sub_mesh->primitive_type == OBJ_PRIMITIVE_TRIANGLE_STRIP; uint32_t* indices = force_malloc_s(uint32_t, sub_mesh->indices_count); switch (sub_mesh->index_format) { case OBJ_INDEX_U8: for (uint32_t i = 0; i < sub_mesh->indices_count; i++) { - uint8_t idx = io_read_uint8_t(s); + uint8_t idx = s.read_uint8_t(); indices[i] = tri_strip && idx == 0xFF ? 0xFFFFFFFF : idx; } break; case OBJ_INDEX_U16: for (uint32_t i = 0; i < sub_mesh->indices_count; i++) { - uint16_t idx = io_read_uint16_t_stream_reverse_endianness(s); + uint16_t idx = s.read_uint16_t_reverse_endianness(); indices[i] = tri_strip && idx == 0xFFFF ? 0xFFFFFFFF : idx; } break; case OBJ_INDEX_U32: for (uint32_t i = 0; i < sub_mesh->indices_count; i++) - indices[i] = io_read_uint32_t_stream_reverse_endianness(s); + indices[i] = s.read_uint32_t_reverse_endianness(); break; } sub_mesh->indices = indices; } -static void obj_modern_write_index(obj* obj, stream* s, bool is_x, +static void obj_modern_write_index(obj* obj, stream& s, bool is_x, obj_sub_mesh* sub_mesh, f2_struct* oidx) { int32_t size = 1; enrs_type type = ENRS_INVALID; @@ -3479,74 +3459,74 @@ static void obj_modern_write_index(obj* obj, stream* s, bool is_x, switch (sub_mesh->index_format) { case OBJ_INDEX_U8: for (uint32_t i = 0; i < _indices_count; i++) - io_write_uint8_t(s, (uint8_t)indices[i]); + s.write_uint8_t((uint8_t)indices[i]); break; case OBJ_INDEX_U16: for (uint32_t i = 0; i < _indices_count; i++) - io_write_uint16_t(s, (uint16_t)indices[i]); + s.write_uint16_t((uint16_t)indices[i]); break; case OBJ_INDEX_U32: for (uint32_t i = 0; i < _indices_count; i++) - io_write_uint32_t(s, indices[i]); + s.write_uint32_t(indices[i]); break; } - io_align_write(s, 0x04); + s.align_write(0x04); } -static void obj_modern_read_model(obj* obj, stream* s, int64_t base_offset, +static void obj_modern_read_model(obj* obj, stream& s, int64_t base_offset, uint32_t header_length, bool is_x, stream* s_oidx, stream* s_ovtx) { const size_t mesh_size = is_x ? 0x130 : 0xD8; const size_t sub_mesh_size = is_x ? 0x80 : 0x70; - io_set_position(s, base_offset, SEEK_SET); + s.set_position(base_offset, SEEK_SET); obj_header oh = {}; if (!is_x) { - 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->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); + s.read_uint32_t(); // version + s.read_uint32_t(); // flags + obj->bounding_sphere.center.x = s.read_float_t_reverse_endianness(); + obj->bounding_sphere.center.y = s.read_float_t_reverse_endianness(); + obj->bounding_sphere.center.z = s.read_float_t_reverse_endianness(); + obj->bounding_sphere.radius = s.read_float_t_reverse_endianness(); + obj->num_mesh = s.read_int32_t_reverse_endianness(); + oh.mesh_array = s.read_offset_f2(header_length); + obj->num_material = s.read_int32_t_reverse_endianness(); + oh.material_array = s.read_offset_f2(header_length); + obj->reserved[0] = s.read_uint32_t_reverse_endianness(); + obj->reserved[1] = s.read_uint32_t_reverse_endianness(); + obj->reserved[2] = s.read_uint32_t_reverse_endianness(); + obj->reserved[3] = s.read_uint32_t_reverse_endianness(); + obj->reserved[4] = s.read_uint32_t_reverse_endianness(); + obj->reserved[5] = s.read_uint32_t_reverse_endianness(); + obj->reserved[6] = s.read_uint32_t_reverse_endianness(); + obj->reserved[7] = s.read_uint32_t_reverse_endianness(); + obj->reserved[8] = s.read_uint32_t_reverse_endianness(); + obj->reserved[9] = s.read_uint32_t_reverse_endianness(); } else { - 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.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); + s.read_uint32_t(); // version + s.read_uint32_t(); // flags + obj->num_mesh = s.read_int32_t_reverse_endianness(); + obj->num_material = s.read_int32_t_reverse_endianness(); + obj->bounding_sphere.center.x = s.read_float_t_reverse_endianness(); + obj->bounding_sphere.center.y = s.read_float_t_reverse_endianness(); + obj->bounding_sphere.center.z = s.read_float_t_reverse_endianness(); + obj->bounding_sphere.radius = s.read_float_t_reverse_endianness(); + oh.mesh_array = s.read_offset_x(); + oh.material_array = s.read_offset_x(); + s.read(0, 0x10); + obj->flags = s.read_uint8_t(); + s.read(0, 0x07); + obj->reserved[0] = s.read_uint32_t_reverse_endianness(); + obj->reserved[1] = s.read_uint32_t_reverse_endianness(); + obj->reserved[2] = s.read_uint32_t_reverse_endianness(); + obj->reserved[3] = s.read_uint32_t_reverse_endianness(); + obj->reserved[4] = s.read_uint32_t_reverse_endianness(); + obj->reserved[5] = s.read_uint32_t_reverse_endianness(); + obj->reserved[6] = s.read_uint32_t_reverse_endianness(); + obj->reserved[7] = s.read_uint32_t_reverse_endianness(); + obj->reserved[8] = s.read_uint32_t_reverse_endianness(); + obj->reserved[9] = s.read_uint32_t_reverse_endianness(); } if (oh.mesh_array > 0) { @@ -3554,36 +3534,36 @@ static void obj_modern_read_model(obj* obj, stream* s, int64_t base_offset, for (uint32_t i = 0; i < obj->num_mesh; i++) { obj_mesh* mesh = &obj->mesh_array[i]; - io_set_position(s, base_offset + oh.mesh_array + mesh_size * i, SEEK_SET); + s.set_position(base_offset + oh.mesh_array + mesh_size * i, SEEK_SET); 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->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); + mesh->flags = s.read_uint32_t_reverse_endianness(); + mesh->bounding_sphere.center.x = s.read_float_t_reverse_endianness(); + mesh->bounding_sphere.center.y = s.read_float_t_reverse_endianness(); + mesh->bounding_sphere.center.z = s.read_float_t_reverse_endianness(); + mesh->bounding_sphere.radius = s.read_float_t_reverse_endianness(); + mesh->num_submesh = s.read_int32_t_reverse_endianness(); + mh.submesh_array = s.read_offset(header_length, is_x); + mh.format = (obj_vertex_format_file)s.read_uint32_t_reverse_endianness(); + mh.size_vertex = s.read_int32_t_reverse_endianness(); + mh.num_vertex = s.read_int32_t_reverse_endianness(); if (!is_x) for (uint32_t j = 0; j < 20; j++) - mh.vertex[j] = io_read_offset_f2(s, 0); + mh.vertex[j] = s.read_offset_f2(0); else for (uint32_t j = 0; j < 20; j++) - mh.vertex[j] = io_read_offset_x(s); + mh.vertex[j] = s.read_offset_x(); - 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->attrib.w = s.read_uint32_t_reverse_endianness(); + mh.vertex_flags = s.read_uint32_t_reverse_endianness(); + mesh->reserved[0] = s.read_uint32_t_reverse_endianness(); + mesh->reserved[1] = s.read_uint32_t_reverse_endianness(); + mesh->reserved[2] = s.read_uint32_t_reverse_endianness(); + mesh->reserved[3] = s.read_uint32_t_reverse_endianness(); + mesh->reserved[4] = s.read_uint32_t_reverse_endianness(); + mesh->reserved[5] = s.read_uint32_t_reverse_endianness(); + s.read(&mesh->name, sizeof(mesh->name)); mesh->name[sizeof(mesh->name) - 1] = 0; if (mh.submesh_array) { @@ -3591,54 +3571,54 @@ static void obj_modern_read_model(obj* obj, stream* s, int64_t base_offset, 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.submesh_array + sub_mesh_size * j, SEEK_SET); + s.set_position(base_offset + mh.submesh_array + sub_mesh_size * j, SEEK_SET); 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->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); - sub_mesh->primitive_type = (obj_primitive_type)io_read_uint32_t_stream_reverse_endianness(s); - 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->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); - sub_mesh->bounding_box.center.z = io_read_float_t_stream_reverse_endianness(s); - sub_mesh->bounding_box.size.x = io_read_float_t_stream_reverse_endianness(s); - sub_mesh->bounding_box.size.y = io_read_float_t_stream_reverse_endianness(s); - sub_mesh->bounding_box.size.z = io_read_float_t_stream_reverse_endianness(s); - io_read(s, 0, 0x04); - sub_mesh->indices_offset = io_read_uint32_t_stream_reverse_endianness(s); + sub_mesh->flags = s.read_uint32_t_reverse_endianness(); + sub_mesh->bounding_sphere.center.x = s.read_float_t_reverse_endianness(); + sub_mesh->bounding_sphere.center.y = s.read_float_t_reverse_endianness(); + sub_mesh->bounding_sphere.center.z = s.read_float_t_reverse_endianness(); + sub_mesh->bounding_sphere.radius = s.read_float_t_reverse_endianness(); + sub_mesh->material_index = s.read_uint32_t_reverse_endianness(); + s.read(&sub_mesh->uv_index, 0x08); + sub_mesh->bone_indices_count = s.read_int32_t_reverse_endianness(); + smh.bone_indices_offset = s.read_offset(header_length, is_x); + sub_mesh->bones_per_vertex = s.read_uint32_t_reverse_endianness(); + sub_mesh->primitive_type = (obj_primitive_type)s.read_uint32_t_reverse_endianness(); + sub_mesh->index_format = (obj_index_format)s.read_uint32_t_reverse_endianness(); + sub_mesh->indices_count = s.read_int32_t_reverse_endianness(); + smh.indices_offset = s.read_offset(0, is_x); + sub_mesh->attrib.w = s.read_uint32_t_reverse_endianness(); + s.read(0, 0x10); + sub_mesh->bounding_box.center.x = s.read_float_t_reverse_endianness(); + sub_mesh->bounding_box.center.y = s.read_float_t_reverse_endianness(); + sub_mesh->bounding_box.center.z = s.read_float_t_reverse_endianness(); + sub_mesh->bounding_box.size.x = s.read_float_t_reverse_endianness(); + sub_mesh->bounding_box.size.y = s.read_float_t_reverse_endianness(); + sub_mesh->bounding_box.size.z = s.read_float_t_reverse_endianness(); + s.read(0, 0x04); + sub_mesh->indices_offset = s.read_uint32_t_reverse_endianness(); if (is_x) - io_read(s, 0, 0x04); + s.read(0, 0x04); if (sub_mesh->bones_per_vertex == 4 && smh.bone_indices_offset) { sub_mesh->bone_indices = force_malloc_s(uint16_t, sub_mesh->bone_indices_count); - io_set_position(s, base_offset + smh.bone_indices_offset, SEEK_SET); - io_read(s, sub_mesh->bone_indices, sub_mesh->bone_indices_count * sizeof(uint16_t)); - if (s->is_big_endian) { + s.set_position(base_offset + smh.bone_indices_offset, SEEK_SET); + s.read(sub_mesh->bone_indices, sub_mesh->bone_indices_count * sizeof(uint16_t)); + if (s.is_big_endian) { uint16_t* bone_indices = sub_mesh->bone_indices; for (uint32_t k = 0; k < sub_mesh->bone_indices_count; k++) bone_indices[k] = reverse_endianness_uint16_t(bone_indices[k]); } } - io_set_position(s_oidx, smh.indices_offset, SEEK_SET); - obj_modern_read_index(obj, s_oidx, sub_mesh); + s_oidx->set_position(smh.indices_offset, SEEK_SET); + obj_modern_read_index(obj, *s_oidx, sub_mesh); } } - obj_modern_read_vertex(obj, s_ovtx, mh.vertex, mesh, + obj_modern_read_vertex(obj, *s_ovtx, mh.vertex, mesh, mh.vertex_flags, mh.num_vertex, mh.size_vertex); } } @@ -3646,16 +3626,16 @@ static void obj_modern_read_model(obj* obj, stream* s, int64_t base_offset, if (oh.material_array > 0) { obj_material_texture_enrs_table_init(); - io_set_position(s, base_offset + oh.material_array, SEEK_SET); + s.set_position(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) + s.read(obj->material_array, obj->num_material * sizeof(obj_material_data)); + if (s.is_big_endian) for (uint32_t i = 0; i < obj->num_material; i++) obj_material_texture_enrs_table.apply(&obj->material_array[i]); } } -static void obj_modern_write_model(obj* obj, stream* s, +static void obj_modern_write_model(obj* obj, stream& s, int64_t base_offset, bool is_x, f2_struct* omdl) { const size_t mesh_size = is_x ? 0x130 : 0xD8; const size_t sub_mesh_size = is_x ? 0x80 : 0x70; @@ -3667,8 +3647,8 @@ static void obj_modern_write_model(obj* obj, stream* s, stream s_oidx; stream s_ovtx; - io_open(&s_oidx); - io_open(&s_ovtx); + s_oidx.open(); + s_ovtx.open(); uint32_t off; enrs e; @@ -3787,84 +3767,84 @@ static void obj_modern_write_model(obj* obj, stream* s, } if (!is_x) { - io_write_uint32_t(s, 0); - io_write_uint32_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write_int32_t(s, 0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_float_t(0); + s.write_float_t(0); + s.write_float_t(0); + s.write_float_t(0); + s.write_int32_t(0); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write_int32_t(s, 0); + s.write_int32_t(0); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - 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); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); } else { - io_write_uint32_t(s, 0); - io_write_uint32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_float_t(0); + s.write_float_t(0); + s.write_float_t(0); + s.write_float_t(0); io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x10); - io_write_uint8_t(s, 0); - io_write(s, 0x07); - 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); + s.write(0x10); + s.write_uint8_t(0); + s.write(0x07); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); } - io_align_write(s, 0x10); + s.align_write(0x10); if (obj->num_mesh) { - oh.mesh_array = io_get_position(s) - base_offset; + oh.mesh_array = s.get_position() - base_offset; 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); - io_write_float_t(s, 0.0f); - io_write_float_t(s, 0.0f); - io_write_float_t(s, 0.0f); - io_write_int32_t(s, 0); + s.write(0x04); + s.write_float_t(0.0f); + s.write_float_t(0.0f); + s.write_float_t(0.0f); + s.write_float_t(0.0f); + s.write_int32_t(0); io_write_offset_pof_add(s, 0, 0x20, is_x, &pof); - io_write_uint32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); + s.write_uint32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); if (!is_x) for (uint32_t j = 0; j < 20; j++) - io_write_offset_f2(s, 0, 0); + s.write_offset_f2(0, 0); else for (uint32_t j = 0; j < 20; j++) - io_write_offset_x(s, 0); + s.write_offset_x(0); - io_write_int32_t(s, 0); - io_write_uint32_t(s, 0); - io_write(s, 0x18); - io_write(s, sizeof(mesh->name)); + s.write_int32_t(0); + s.write_uint32_t(0); + s.write(0x18); + s.write(sizeof(mesh->name)); } for (uint32_t i = 0; i < obj->num_mesh; i++) { @@ -3873,39 +3853,39 @@ static void obj_modern_write_model(obj* obj, stream* s, mh->format = OBJ_VERTEX_FORMAT_FILE_MODERN_STORAGE; if (mesh->num_submesh) { - mh->submesh_array = io_get_position(s) - base_offset; + mh->submesh_array = s.get_position() - 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); - io_write_float_t(s, 0.0f); - io_write_float_t(s, 0.0f); - io_write_uint32_t(s, 0); - io_write(s, 0x08); - io_write_int32_t(s, 0); + s.write(0x04); + s.write_float_t(0.0f); + s.write_float_t(0.0f); + s.write_float_t(0.0f); + s.write_float_t(0.0f); + s.write_uint32_t(0); + s.write(0x08); + s.write_int32_t(0); io_write_offset_pof_add(s, 0, 0x20, is_x, &pof); - io_write_uint32_t(s, 0); - io_write_uint32_t(s, 0); - io_write_uint32_t(s, 0); - io_write_int32_t(s, 0); - io_write_offset(s, 0, 0, is_x); - io_write_uint32_t(s, 0); - io_write(s, 0x10); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write_float_t(s, 0); - io_write(s, 0x04); - io_write_uint32_t(s, 0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_int32_t(0); + s.write_offset(0, 0, is_x); + s.write_uint32_t(0); + s.write(0x10); + s.write_float_t(0); + s.write_float_t(0); + s.write_float_t(0); + s.write_float_t(0); + s.write_float_t(0); + s.write_float_t(0); + s.write(0x04); + s.write_uint32_t(0); if (is_x) - io_write(s, 0x04); + s.write(0x04); } } - obj_modern_write_vertex(obj, &s_ovtx, is_x, mh->vertex, mesh, + obj_modern_write_vertex(obj, s_ovtx, is_x, mh->vertex, mesh, &mh->vertex_flags, &mh->num_vertex, &mh->size_vertex, ovtx); } @@ -3922,16 +3902,16 @@ static void obj_modern_write_model(obj* obj, stream* s, obj_sub_mesh_header* smh = &smhs[j]; 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)); + smh->bone_indices_offset = s.get_position() - base_offset; + s.write(sub_mesh->bone_indices, sub_mesh->bone_indices_count * sizeof(uint16_t)); } - smh->indices_offset = io_get_position(&s_oidx); - obj_modern_write_index(obj, &s_oidx, is_x, sub_mesh, oidx); + smh->indices_offset = s_oidx.get_position(); + obj_modern_write_index(obj, s_oidx, is_x, sub_mesh, oidx); } } } - io_align_write(s, is_x ? 0x10 : 0x04); + s.align_write(is_x ? 0x10 : 0x04); for (uint32_t i = 0; i < obj->num_mesh; i++) { obj_mesh* mesh = &obj->mesh_array[i]; @@ -3939,33 +3919,33 @@ static void obj_modern_write_model(obj* obj, stream* s, obj_sub_mesh_header* smhs = smhss[i]; if (mesh->num_submesh) { - io_position_push(s, base_offset + mh->submesh_array, SEEK_SET); + s.position_push(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_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->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); - io_write_uint32_t(s, sub_mesh->primitive_type); - 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->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); - io_write_float_t(s, sub_mesh->bounding_box.center.z); - io_write_float_t(s, sub_mesh->bounding_box.size.x); - io_write_float_t(s, sub_mesh->bounding_box.size.y); - io_write_float_t(s, sub_mesh->bounding_box.size.z); + s.write_uint32_t(sub_mesh->flags); + s.write_float_t(sub_mesh->bounding_sphere.center.x); + s.write_float_t(sub_mesh->bounding_sphere.center.y); + s.write_float_t(sub_mesh->bounding_sphere.center.z); + s.write_float_t(sub_mesh->bounding_sphere.radius); + s.write_uint32_t(sub_mesh->material_index); + s.write(&sub_mesh->uv_index, 0x08); + s.write_int32_t(sub_mesh->bone_indices_count); + s.write_offset(smh->bone_indices_offset, 0x20, is_x); + s.write_uint32_t(sub_mesh->bones_per_vertex); + s.write_uint32_t(sub_mesh->primitive_type); + s.write_uint32_t(sub_mesh->index_format); + s.write_int32_t(sub_mesh->indices_count); + s.write_offset(smh->indices_offset, 0, is_x); + s.write_uint32_t(sub_mesh->attrib.w); + s.write(0x10); + s.write_float_t(sub_mesh->bounding_box.center.x); + s.write_float_t(sub_mesh->bounding_box.center.y); + s.write_float_t(sub_mesh->bounding_box.center.z); + s.write_float_t(sub_mesh->bounding_box.size.x); + s.write_float_t(sub_mesh->bounding_box.size.y); + s.write_float_t(sub_mesh->bounding_box.size.z); uint32_t index_max = 0; for (uint32_t k = 0; k < sub_mesh->indices_count; k++) @@ -3974,138 +3954,138 @@ static void obj_modern_write_model(obj* obj, stream* s, switch (sub_mesh->index_format) { case OBJ_INDEX_U8: - io_write_uint32_t(s, index_max << 24); + s.write_uint32_t(index_max << 24); break; case OBJ_INDEX_U16: - io_write_uint32_t(s, index_max << 16); + s.write_uint32_t(index_max << 16); break; case OBJ_INDEX_U32: - io_write_uint32_t(s, index_max); + s.write_uint32_t(index_max); break; } - io_write_uint32_t(s, sub_mesh->indices_offset); + s.write_uint32_t(sub_mesh->indices_offset); if (is_x) - io_write(s, 0x04); + s.write(0x04); } - io_position_pop(s); + s.position_pop(); } free(smhs); } - io_position_push(s, base_offset + oh.mesh_array, SEEK_SET); + s.position_push(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_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->num_submesh); + s.write_uint32_t(mesh->flags); + s.write_float_t(mesh->bounding_sphere.center.x); + s.write_float_t(mesh->bounding_sphere.center.y); + s.write_float_t(mesh->bounding_sphere.center.z); + s.write_float_t(mesh->bounding_sphere.radius); + s.write_int32_t(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); + s.write_offset(mh->submesh_array, 0, is_x); + s.write_uint32_t(mh->format); + s.write_int32_t(mh->size_vertex); + s.write_int32_t(mh->num_vertex); if (!is_x) for (uint32_t j = 0; j < 20; j++) - io_write_offset_f2(s, mh->vertex[j], 0); + s.write_offset_f2(mh->vertex[j], 0); else for (uint32_t j = 0; j < 20; j++) - io_write_offset_x(s, mh->vertex[j]); + s.write_offset_x(mh->vertex[j]); - 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'); + s.write_uint32_t(mesh->attrib.w); + s.write_uint32_t(mh->vertex_flags); + s.write_uint32_t(mesh->reserved[0]); + s.write_uint32_t(mesh->reserved[1]); + s.write_uint32_t(mesh->reserved[2]); + s.write_uint32_t(mesh->reserved[3]); + s.write_uint32_t(mesh->reserved[4]); + s.write_uint32_t(mesh->reserved[5]); + s.write(&mesh->name, sizeof(mesh->name) - 1); + s.write_char('\0'); } - io_position_pop(s); + s.position_pop(); free(mhs); free(smhss); } if (obj->material_array) { - oh.material_array = io_get_position(s) - base_offset; + oh.material_array = s.get_position() - base_offset; for (uint32_t i = 0; i < obj->num_material; i++) - io_write(s, &obj->material_array[i], sizeof(obj_material_data)); + s.write(&obj->material_array[i], sizeof(obj_material_data)); } - io_align_write(s, 0x10); + s.align_write(0x10); - io_position_push(s, base_offset, SEEK_SET); + s.position_push(base_offset, SEEK_SET); if (!is_x) { - 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->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]); + s.write_uint32_t(0x10000); // version + s.write_uint32_t(0x00); // flags + s.write_float_t(obj->bounding_sphere.center.x); + s.write_float_t(obj->bounding_sphere.center.y); + s.write_float_t(obj->bounding_sphere.center.z); + s.write_float_t(obj->bounding_sphere.radius); + s.write_int32_t(obj->num_mesh); + s.write_offset_f2(oh.mesh_array, 0x20); + s.write_int32_t(obj->num_material); + s.write_offset_f2(oh.material_array, 0x20); + s.write_uint32_t(obj->reserved[0]); + s.write_uint32_t(obj->reserved[1]); + s.write_uint32_t(obj->reserved[2]); + s.write_uint32_t(obj->reserved[3]); + s.write_uint32_t(obj->reserved[4]); + s.write_uint32_t(obj->reserved[5]); + s.write_uint32_t(obj->reserved[6]); + s.write_uint32_t(obj->reserved[7]); + s.write_uint32_t(obj->reserved[8]); + s.write_uint32_t(obj->reserved[9]); } else { - 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.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]); + s.write_uint32_t(0x10000); // version + s.write_uint32_t(0x00); // flags + s.write_int32_t(obj->num_mesh); + s.write_int32_t(obj->num_material); + s.write_float_t(obj->bounding_sphere.center.x); + s.write_float_t(obj->bounding_sphere.center.y); + s.write_float_t(obj->bounding_sphere.center.z); + s.write_float_t(obj->bounding_sphere.radius); + s.write_offset_x(oh.mesh_array); + s.write_offset_x(oh.material_array); + s.write(0x10); + s.write_uint8_t(obj->flags); + s.write(0x07); + s.write_uint32_t(obj->reserved[0]); + s.write_uint32_t(obj->reserved[1]); + s.write_uint32_t(obj->reserved[2]); + s.write_uint32_t(obj->reserved[3]); + s.write_uint32_t(obj->reserved[4]); + s.write_uint32_t(obj->reserved[5]); + s.write_uint32_t(obj->reserved[6]); + s.write_uint32_t(obj->reserved[7]); + s.write_uint32_t(obj->reserved[8]); + s.write_uint32_t(obj->reserved[9]); } - io_position_pop(s); + s.position_pop(); omdl->enrs = e; omdl->pof = pof; - io_align_write(&s_oidx, 0x10); - io_copy(&s_oidx, &oidx->data); - io_free(&s_oidx); + s_oidx.align_write(0x10); + s_oidx.copy(oidx->data); + s_oidx.close(); oidx->header.signature = reverse_endianness_uint32_t('OIDX'); oidx->header.length = 0x20; oidx->header.use_big_endian = false; oidx->header.use_section_size = true; - io_align_write(&s_ovtx, 0x10); - io_copy(&s_ovtx, &ovtx->data); - io_free(&s_ovtx); + s_ovtx.align_write(0x10); + s_ovtx.copy(ovtx->data); + s_ovtx.close(); ovtx->header.signature = reverse_endianness_uint32_t('OVTX'); ovtx->header.length = 0x20; @@ -4113,30 +4093,30 @@ static void obj_modern_write_model(obj* obj, stream* s, ovtx->header.use_section_size = true; } -static void obj_modern_read_skin(obj* obj, stream* s, int64_t base_offset, +static void obj_modern_read_skin(obj* obj, stream& s, int64_t base_offset, uint32_t header_length, bool is_x) { obj_skin* sk = &obj->skin; obj->skin_init = true; - io_set_position(s, base_offset, SEEK_SET); + s.set_position(base_offset, SEEK_SET); 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); - sh.bone_names_offset = io_read_offset_f2(s, header_length); - sh.ex_data_offset = io_read_offset_f2(s, header_length); - sk->bones_count = io_read_int32_t_stream_reverse_endianness(s); - sh.bone_parent_ids_offset = io_read_offset_f2(s, header_length); - io_read(s, 0, 0x0C); + sh.bone_ids_offset = s.read_offset_f2(header_length); + sh.bone_matrices_offset = s.read_offset_f2(header_length); + sh.bone_names_offset = s.read_offset_f2(header_length); + sh.ex_data_offset = s.read_offset_f2(header_length); + sk->bones_count = s.read_int32_t_reverse_endianness(); + sh.bone_parent_ids_offset = s.read_offset_f2(header_length); + s.read(0, 0x0C); } else { - sh.bone_ids_offset = io_read_offset_x(s); - sh.bone_matrices_offset = io_read_offset_x(s); - sh.bone_names_offset = io_read_offset_x(s); - sh.ex_data_offset = io_read_offset_x(s); - sk->bones_count = io_read_int32_t_stream_reverse_endianness(s); - sh.bone_parent_ids_offset = io_read_offset_x(s); - io_read(s, 0, 0x18); + sh.bone_ids_offset = s.read_offset_x(); + sh.bone_matrices_offset = s.read_offset_x(); + sh.bone_names_offset = s.read_offset_x(); + sh.ex_data_offset = s.read_offset_x(); + sk->bones_count = s.read_int32_t_reverse_endianness(); + sh.bone_parent_ids_offset = s.read_offset_x(); + s.read(0, 0x18); } if (sh.bone_ids_offset) { @@ -4145,52 +4125,52 @@ static void obj_modern_read_skin(obj* obj, stream* s, int64_t base_offset, int64_t* bone_names_offsets = 0; if (sh.bone_names_offset) { bone_names_offsets = force_malloc_s(int64_t, sk->bones_count); - io_set_position(s, sh.bone_names_offset, SEEK_SET); + s.set_position(sh.bone_names_offset, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < sk->bones_count; i++) - bone_names_offsets[i] = io_read_offset_f2(s, header_length); + bone_names_offsets[i] = s.read_offset_f2(header_length); else for (uint32_t i = 0; i < sk->bones_count; i++) - bone_names_offsets[i] = io_read_offset_x(s); + bone_names_offsets[i] = s.read_offset_x(); } if (sh.bone_ids_offset) { - io_set_position(s, sh.bone_ids_offset, SEEK_SET); + s.set_position(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); + sk->bones[i].id = s.read_uint32_t_reverse_endianness(); if (sh.bone_matrices_offset) { - io_set_position(s, sh.bone_matrices_offset, SEEK_SET); + s.set_position(sh.bone_matrices_offset, SEEK_SET); for (uint32_t i = 0; i < sk->bones_count; i++) { mat4u& mat = sk->bones[i].inv_bind_pose_mat; - mat.row0.x = io_read_float_t_stream_reverse_endianness(s); - mat.row1.x = io_read_float_t_stream_reverse_endianness(s); - mat.row2.x = io_read_float_t_stream_reverse_endianness(s); - mat.row3.x = io_read_float_t_stream_reverse_endianness(s); - mat.row0.y = io_read_float_t_stream_reverse_endianness(s); - mat.row1.y = io_read_float_t_stream_reverse_endianness(s); - mat.row2.y = io_read_float_t_stream_reverse_endianness(s); - mat.row3.y = io_read_float_t_stream_reverse_endianness(s); - mat.row0.z = io_read_float_t_stream_reverse_endianness(s); - mat.row1.z = io_read_float_t_stream_reverse_endianness(s); - mat.row2.z = io_read_float_t_stream_reverse_endianness(s); - mat.row3.z = io_read_float_t_stream_reverse_endianness(s); - mat.row0.w = io_read_float_t_stream_reverse_endianness(s); - mat.row1.w = io_read_float_t_stream_reverse_endianness(s); - mat.row2.w = io_read_float_t_stream_reverse_endianness(s); - mat.row3.w = io_read_float_t_stream_reverse_endianness(s); + mat.row0.x = s.read_float_t_reverse_endianness(); + mat.row1.x = s.read_float_t_reverse_endianness(); + mat.row2.x = s.read_float_t_reverse_endianness(); + mat.row3.x = s.read_float_t_reverse_endianness(); + mat.row0.y = s.read_float_t_reverse_endianness(); + mat.row1.y = s.read_float_t_reverse_endianness(); + mat.row2.y = s.read_float_t_reverse_endianness(); + mat.row3.y = s.read_float_t_reverse_endianness(); + mat.row0.z = s.read_float_t_reverse_endianness(); + mat.row1.z = s.read_float_t_reverse_endianness(); + mat.row2.z = s.read_float_t_reverse_endianness(); + mat.row3.z = s.read_float_t_reverse_endianness(); + mat.row0.w = s.read_float_t_reverse_endianness(); + mat.row1.w = s.read_float_t_reverse_endianness(); + mat.row2.w = s.read_float_t_reverse_endianness(); + mat.row3.w = s.read_float_t_reverse_endianness(); } } if (sh.bone_names_offset) for (uint32_t i = 0; i < sk->bones_count; i++) - io_read_string_null_terminated_offset(s, - bone_names_offsets[i], &sk->bones[i].name); + sk->bones[i].name = s.read_utf8_string_null_terminated_offset( + bone_names_offsets[i]); if (sh.bone_parent_ids_offset) { - io_set_position(s, sh.bone_parent_ids_offset, SEEK_SET); + s.set_position(sh.bone_parent_ids_offset, SEEK_SET); for (uint32_t i = 0; i < sk->bones_count; i++) - sk->bones[i].parent = io_read_uint32_t_stream_reverse_endianness(s); + sk->bones[i].parent = s.read_uint32_t_reverse_endianness(); } } free(bone_names_offsets); @@ -4199,63 +4179,61 @@ static void obj_modern_read_skin(obj* obj, stream* s, int64_t base_offset, if (sh.ex_data_offset) { obj_skin_ex_data* ex = &sk->ex_data; sk->ex_data_init = true; - io_set_position(s, sh.ex_data_offset, SEEK_SET); + s.set_position(sh.ex_data_offset, SEEK_SET); 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); - io_read(s, 0, 0x04); - exh.osage_nodes_offset = io_read_offset_f2(s, header_length); - exh.osage_names_offset = io_read_offset_f2(s, header_length); - exh.blocks_offset = io_read_offset_f2(s, header_length); - exh.bone_names_count = io_read_int32_t_stream_reverse_endianness(s); - 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->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); + exh.osage_count = s.read_int32_t_reverse_endianness(); + ex->osage_nodes_count = s.read_int32_t_reverse_endianness(); + s.read(0, 0x04); + exh.osage_nodes_offset = s.read_offset_f2(header_length); + exh.osage_names_offset = s.read_offset_f2(header_length); + exh.blocks_offset = s.read_offset_f2(header_length); + exh.bone_names_count = s.read_int32_t_reverse_endianness(); + exh.bone_names_offset = s.read_offset_f2(header_length); + exh.osage_sibling_infos_offset = s.read_offset_f2(header_length); + exh.cloth_count = s.read_int32_t_reverse_endianness(); + ex->reserved[0] = s.read_offset_f2(header_length); + ex->reserved[1] = s.read_offset_f2(header_length); + ex->reserved[2] = s.read_offset_f2(header_length); + ex->reserved[3] = s.read_offset_f2(header_length); + ex->reserved[4] = s.read_offset_f2(header_length); + ex->reserved[5] = s.read_offset_f2(header_length); + ex->reserved[6] = s.read_offset_f2(header_length); } else { - exh.osage_count = io_read_int32_t_stream_reverse_endianness(s); - ex->osage_nodes_count = io_read_int32_t_stream_reverse_endianness(s); - io_read(s, 0, 0x08); - exh.osage_nodes_offset = io_read_offset_x(s); - exh.osage_names_offset = io_read_offset_x(s); - exh.blocks_offset = io_read_offset_x(s); - exh.bone_names_count = io_read_int32_t_stream_reverse_endianness(s); - 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->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); + exh.osage_count = s.read_int32_t_reverse_endianness(); + ex->osage_nodes_count = s.read_int32_t_reverse_endianness(); + s.read(0, 0x08); + exh.osage_nodes_offset = s.read_offset_x(); + exh.osage_names_offset = s.read_offset_x(); + exh.blocks_offset = s.read_offset_x(); + exh.bone_names_count = s.read_int32_t_reverse_endianness(); + exh.bone_names_offset = s.read_offset_x(); + exh.osage_sibling_infos_offset = s.read_offset_x(); + exh.cloth_count = s.read_int32_t_reverse_endianness(); + ex->reserved[0] = s.read_offset_x(); + ex->reserved[1] = s.read_offset_x(); + ex->reserved[2] = s.read_offset_x(); + ex->reserved[3] = s.read_offset_x(); + ex->reserved[4] = s.read_offset_x(); + ex->reserved[5] = s.read_offset_x(); + ex->reserved[6] = s.read_offset_x(); } if (exh.bone_names_offset) { std::vector bone_names; bone_names.reserve(exh.bone_names_count); int32_t* strings_offsets = force_malloc_s(int32_t, exh.bone_names_count); - io_set_position(s, exh.bone_names_offset, SEEK_SET); + s.set_position(exh.bone_names_offset, SEEK_SET); for (uint32_t i = 0; i < exh.bone_names_count; i++) - strings_offsets[i] = io_read_int32_t(s); + strings_offsets[i] = s.read_int32_t(); size_t buf_size = 0; for (uint32_t i = 0; i < exh.bone_names_count; i++) { - if (strings_offsets[i]) { - std::string str; - io_read_string_null_terminated_offset(s, strings_offsets[i], &str); - bone_names.push_back(str); - } + if (strings_offsets[i]) + bone_names.push_back(s.read_string_null_terminated_offset( + strings_offsets[i])); else bone_names.push_back({}); buf_size += bone_names.back().size() + 1; @@ -4292,50 +4270,49 @@ static void obj_modern_read_skin(obj* obj, stream* s, int64_t base_offset, if (exh.osage_nodes_offset) { ex->osage_nodes = force_malloc_s(obj_skin_osage_node, ex->osage_nodes_count); - io_set_position(s, exh.osage_nodes_offset, SEEK_SET); + s.set_position(exh.osage_nodes_offset, SEEK_SET); for (uint32_t i = 0; i < ex->osage_nodes_count; i++) { obj_skin_osage_node* osage_node = &ex->osage_nodes[i]; - osage_node->name_index = io_read_uint32_t_stream_reverse_endianness(s); - osage_node->length = io_read_float_t_stream_reverse_endianness(s); - io_read(s, 0, 0x04); + osage_node->name_index = s.read_uint32_t_reverse_endianness(); + osage_node->length = s.read_float_t_reverse_endianness(); + s.read(0, 0x04); } } if (exh.blocks_offset) { ex->blocks_count = 0; - io_set_position(s, exh.blocks_offset, SEEK_SET); + s.set_position(exh.blocks_offset, SEEK_SET); if (!is_x) - while (io_read_int32_t(s)) { - io_read(s, 0, 0x04); + while (s.read_int32_t()) { + s.read(0, 0x04); ex->blocks_count++; } else - while (io_read_int64_t(s)) { - io_read(s, 0, 0x08); + while (s.read_int64_t()) { + s.read(0, 0x08); ex->blocks_count++; } obj_skin_block_header* bhs = force_malloc_s(obj_skin_block_header, ex->blocks_count); - io_set_position(s, exh.blocks_offset, SEEK_SET); + s.set_position(exh.blocks_offset, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < ex->blocks_count; i++) { - bhs[i].block_signature_offset = io_read_offset_f2(s, header_length); - bhs[i].block_offset = io_read_offset_f2(s, header_length); + bhs[i].block_signature_offset = s.read_offset_f2(header_length); + bhs[i].block_offset = s.read_offset_f2(header_length); } else for (uint32_t i = 0; i < ex->blocks_count; i++) { - bhs[i].block_signature_offset = io_read_offset_x(s); - bhs[i].block_offset = io_read_offset_x(s); + bhs[i].block_signature_offset = s.read_offset_x(); + bhs[i].block_offset = s.read_offset_x(); } 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]; - std::string block_signature; - io_read_string_null_terminated_offset(s, - bhs[i].block_signature_offset, &block_signature); + std::string block_signature = s.read_string_null_terminated_offset( + bhs[i].block_signature_offset); if (block_signature.size() != 3) continue; @@ -4343,31 +4320,31 @@ static void obj_modern_read_skin(obj* obj, stream* s, int64_t base_offset, switch (signature) { case 'CLS\0': block->type = OBJ_SKIN_BLOCK_CLOTH; - io_set_position(s, bhs[i].block_offset, SEEK_SET); + s.set_position(bhs[i].block_offset, SEEK_SET); obj_modern_read_skin_block_cloth(&block->cloth, s, header_length, bone_names, is_x); break; case 'CNS\0': block->type = OBJ_SKIN_BLOCK_CONSTRAINT; - io_set_position(s, bhs[i].block_offset, SEEK_SET); + s.set_position(bhs[i].block_offset, SEEK_SET); obj_modern_read_skin_block_constraint(&block->constraint, s, header_length, bone_names, is_x); break; case 'EXP\0': block->type = OBJ_SKIN_BLOCK_EXPRESSION; - io_set_position(s, bhs[i].block_offset, SEEK_SET); + s.set_position(bhs[i].block_offset, SEEK_SET); obj_modern_read_skin_block_expression(&block->expression, s, header_length, bone_names, is_x); break; case 'MOT\0': block->type = OBJ_SKIN_BLOCK_MOTION; - io_set_position(s, bhs[i].block_offset, SEEK_SET); + s.set_position(bhs[i].block_offset, SEEK_SET); obj_modern_read_skin_block_motion(&block->motion, s, header_length, bone_names, is_x); break; case 'OSG\0': block->type = OBJ_SKIN_BLOCK_OSAGE; - io_set_position(s, bhs[i].block_offset, SEEK_SET); + s.set_position(bhs[i].block_offset, SEEK_SET); obj_modern_read_skin_block_osage(&block->osage, s, header_length, bone_names, is_x); break; @@ -4380,28 +4357,28 @@ static void obj_modern_read_skin(obj* obj, stream* s, int64_t base_offset, if (exh.osage_sibling_infos_offset) { ex->osage_sibling_infos_count = 0; - io_set_position(s, exh.osage_sibling_infos_offset, SEEK_SET); - while (io_read_uint32_t(s)) { - io_read(s, 0, 0x08); + s.set_position(exh.osage_sibling_infos_offset, SEEK_SET); + while (s.read_uint32_t()) { + s.read(0, 0x08); ex->osage_sibling_infos_count++; } obj_skin_osage_sibling_info* osis = force_malloc_s( obj_skin_osage_sibling_info, ex->osage_sibling_infos_count); ex->osage_sibling_infos = osis; - io_set_position(s, exh.blocks_offset, SEEK_SET); + s.set_position(exh.blocks_offset, SEEK_SET); for (uint32_t i = 0; i < ex->osage_sibling_infos_count; i++) { - osis[i].name_index = io_read_uint32_t_stream_reverse_endianness(s); - osis[i].sibling_name_index = io_read_uint32_t_stream_reverse_endianness(s); - osis[i].max_distance = io_read_float_t_stream_reverse_endianness(s); + osis[i].name_index = s.read_uint32_t_reverse_endianness(); + osis[i].sibling_name_index = s.read_uint32_t_reverse_endianness(); + osis[i].max_distance = s.read_float_t_reverse_endianness(); } - io_set_position(s, exh.osage_sibling_infos_offset, SEEK_SET); + s.set_position(exh.osage_sibling_infos_offset, SEEK_SET); } } } -static void obj_modern_write_skin(obj* obj, stream* s, +static void obj_modern_write_skin(obj* obj, stream& s, int64_t base_offset, bool is_x, f2_struct* oskn) { obj_skin* sk = &obj->skin; @@ -4496,41 +4473,37 @@ static void obj_modern_write_skin(obj* obj, stream* s, switch (block->type) { case OBJ_SKIN_BLOCK_CLOTH: { obj_skin_block_cloth* cloth = &block->cloth; - obj_skin_strings_push_back_check(strings, string_data(&cloth->mesh_name)); - obj_skin_strings_push_back_check(strings, string_data(&cloth->backface_mesh_name)); + obj_skin_strings_push_back_check(strings, cloth->mesh_name); + obj_skin_strings_push_back_check(strings, cloth->backface_mesh_name); for (uint32_t k = 0; k < cloth->count; k++) { obj_skin_block_cloth_field_1C* sub = &cloth->field_1C[k]; for (uint32_t l = 0; l < 4; l++) - obj_skin_strings_push_back_check(strings, - string_data(&sub->sub_data[l].bone_name)); + obj_skin_strings_push_back_check(strings, sub->sub_data[l].bone_name); } obj_skin_strings_push_back_check(strings, "CLS"); } break; case OBJ_SKIN_BLOCK_CONSTRAINT: { obj_skin_block_constraint* constraint = &block->constraint; - obj_skin_strings_push_back_check(strings, string_data(&constraint->base.parent_name)); + obj_skin_strings_push_back_check(strings, constraint->base.parent_name); obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, constraint->name_index); - obj_skin_strings_push_back_check(strings, string_data(&constraint->source_node_name)); + obj_skin_strings_push_back_check(strings, constraint->source_node_name); switch (constraint->type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: obj_skin_strings_push_back_check(strings, "Orientation"); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: obj_skin_strings_push_back_check(strings, "Direction"); - obj_skin_strings_push_back_check(strings, - string_data(&constraint->direction.up_vector.name)); + obj_skin_strings_push_back_check(strings, constraint->direction.up_vector.name); break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: obj_skin_strings_push_back_check(strings, "Position"); - obj_skin_strings_push_back_check(strings, - string_data(&constraint->position.up_vector.name)); + obj_skin_strings_push_back_check(strings, constraint->position.up_vector.name); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: obj_skin_strings_push_back_check(strings, "Distance"); - obj_skin_strings_push_back_check(strings, - string_data(&constraint->distance.up_vector.name)); + obj_skin_strings_push_back_check(strings, constraint->distance.up_vector.name); break; } obj_skin_strings_push_back_check(strings, "CNS"); @@ -4541,8 +4514,8 @@ static void obj_modern_write_skin(obj* obj, stream* s, case OBJ_SKIN_BLOCK_EXPRESSION: { obj_skin_block_expression* expression = &block->expression; for (uint32_t j = 0; j < expression->expressions_count; j++) - obj_skin_strings_push_back_check(strings, string_data(&expression->expressions[j])); - obj_skin_strings_push_back_check(strings, string_data(&expression->base.parent_name)); + obj_skin_strings_push_back_check(strings, expression->expressions[j]); + obj_skin_strings_push_back_check(strings, expression->base.parent_name); obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, expression->name_index); obj_skin_strings_push_back_check(strings, "EXP"); @@ -4552,22 +4525,22 @@ static void obj_modern_write_skin(obj* obj, stream* s, } break; case OBJ_SKIN_BLOCK_MOTION: { obj_skin_block_motion* motion = &block->motion; - obj_skin_strings_push_back_check(strings, string_data(&motion->base.parent_name)); - obj_skin_strings_push_back_check(strings, string_data(&motion->name)); + obj_skin_strings_push_back_check(strings, motion->base.parent_name); + obj_skin_strings_push_back_check(strings, motion->name); for (uint32_t j = 0; j < motion->nodes_count; j++) obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, motion->nodes[j].name_index); obj_skin_strings_push_back_check(strings, "MOT"); if (!is_x) - obj_skin_strings_push_back_check(bone_names, string_data(&motion->name)); + obj_skin_strings_push_back_check(bone_names, motion->name); for (uint32_t j = 0; j < motion->nodes_count; j++) obj_skin_strings_push_back_check_by_index(bone_names, bone_names_ptr, motion->nodes[j].name_index); } break; case OBJ_SKIN_BLOCK_OSAGE: { obj_skin_block_osage* osage = &block->osage; - obj_skin_strings_push_back_check(strings, string_data(&osage->base.parent_name)); + obj_skin_strings_push_back_check(strings, osage->base.parent_name); obj_skin_strings_push_back_check_by_index(strings, bone_names_ptr, osage->name_index); obj_skin_strings_push_back_check_by_index(strings, @@ -4984,83 +4957,83 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write_int32_t(s, 0); + s.write_int32_t(0); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x0C); + s.write(0x0C); } else { io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); - io_write_int32_t(s, 0); + s.write_int32_t(0); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x18); + s.write(0x18); } - io_align_write(s, 0x10); + s.align_write(0x10); if (sk->bones_count) { - sh.bone_ids_offset = io_get_position(s); + sh.bone_ids_offset = s.get_position(); for (uint32_t i = 0; i < sk->bones_count; i++) - io_write_int32_t(s, sk->bones[i].id); - io_align_write(s, 0x10); + s.write_int32_t(sk->bones[i].id); + s.align_write(0x10); - sh.bone_parent_ids_offset = io_get_position(s); + sh.bone_parent_ids_offset = s.get_position(); for (uint32_t i = 0; i < sk->bones_count; i++) - io_write_int32_t(s, sk->bones[i].parent); - io_align_write(s, 0x10); + s.write_int32_t(sk->bones[i].parent); + s.align_write(0x10); - sh.bone_names_offset = io_get_position(s); + sh.bone_names_offset = s.get_position(); if (!is_x) for (uint32_t i = 0; i < sk->bones_count; i++) { io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - obj_skin_strings_push_back_check(strings, string_data(&sk->bones[i].name)); + obj_skin_strings_push_back_check(strings, sk->bones[i].name); } else for (uint32_t i = 0; i < sk->bones_count; i++) { io_write_offset_x_pof_add(s, 0, &pof); - obj_skin_strings_push_back_check(strings, string_data(&sk->bones[i].name)); + obj_skin_strings_push_back_check(strings, sk->bones[i].name); } - io_align_write(s, 0x10); + s.align_write(0x10); - sh.bone_matrices_offset = io_get_position(s); + sh.bone_matrices_offset = s.get_position(); for (uint32_t i = 0; i < sk->bones_count; i++) { mat4u& mat = sk->bones[i].inv_bind_pose_mat; - io_write_float_t(s, mat.row0.x); - io_write_float_t(s, mat.row1.x); - io_write_float_t(s, mat.row2.x); - io_write_float_t(s, mat.row3.x); - io_write_float_t(s, mat.row0.y); - io_write_float_t(s, mat.row1.y); - io_write_float_t(s, mat.row2.y); - io_write_float_t(s, mat.row3.y); - io_write_float_t(s, mat.row0.z); - io_write_float_t(s, mat.row1.z); - io_write_float_t(s, mat.row2.z); - io_write_float_t(s, mat.row3.z); - io_write_float_t(s, mat.row0.w); - io_write_float_t(s, mat.row1.w); - io_write_float_t(s, mat.row2.w); - io_write_float_t(s, mat.row3.w); + s.write_float_t(mat.row0.x); + s.write_float_t(mat.row1.x); + s.write_float_t(mat.row2.x); + s.write_float_t(mat.row3.x); + s.write_float_t(mat.row0.y); + s.write_float_t(mat.row1.y); + s.write_float_t(mat.row2.y); + s.write_float_t(mat.row3.y); + s.write_float_t(mat.row0.z); + s.write_float_t(mat.row1.z); + s.write_float_t(mat.row2.z); + s.write_float_t(mat.row3.z); + s.write_float_t(mat.row0.w); + s.write_float_t(mat.row1.w); + s.write_float_t(mat.row2.w); + s.write_float_t(mat.row3.w); } - io_align_write(s, 0x10); + s.align_write(0x10); } if (sk->ex_data_init) { obj_skin_ex_data* ex = &sk->ex_data; - sh.ex_data_offset = io_get_position(s); + sh.ex_data_offset = s.get_position(); if (!is_x) { - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write(s, 0x04); + s.write_int32_t(0); + s.write_int32_t(0); + s.write(0x04); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write_int32_t(s, 0); + s.write_int32_t(0); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write_int32_t(s, 0); + s.write_int32_t(0); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); @@ -5070,16 +5043,16 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_offset_f2_pof_add(s, 0, 0x20, &pof); } else { - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write(s, 0x08); + s.write_int32_t(0); + s.write_int32_t(0); + s.write(0x08); io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); - io_write_int32_t(s, 0); + s.write_int32_t(0); io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); - io_write_int32_t(s, 0); + s.write_int32_t(0); io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); @@ -5088,31 +5061,31 @@ static void obj_modern_write_skin(obj* obj, stream* s, io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); } - io_align_write(s, 0x10); + s.align_write(0x10); if (ex->osage_nodes_count) { - exh.osage_nodes_offset = io_get_position(s); + exh.osage_nodes_offset = s.get_position(); for (uint32_t i = 0; i < ex->osage_nodes_count; i++) { - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); } - io_align_write(s, 0x10); + s.align_write(0x10); - exh.osage_sibling_infos_offset = io_get_position(s); + exh.osage_sibling_infos_offset = s.get_position(); for (uint32_t i = 0; i < ex->osage_sibling_infos_count; i++) { - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); } - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_align_write(s, 0x10); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.align_write(0x10); } if (exh.osage_count || exh.cloth_count) { - exh.osage_names_offset = io_get_position(s); + exh.osage_names_offset = s.get_position(); if (!is_x) { for (uint32_t i = 0; i < exh.osage_count; i++) io_write_offset_f2_pof_add(s, 0, 0x20, &pof); @@ -5127,37 +5100,37 @@ static void obj_modern_write_skin(obj* obj, stream* s, for (uint32_t i = 0; i < exh.cloth_count; i++) io_write_offset_x_pof_add(s, 0, &pof); } - io_align_write(s, 0x10); + s.align_write(0x10); } - exh.bone_names_offset = io_get_position(s); + exh.bone_names_offset = s.get_position(); if (!is_x) for (std::string& i : bone_names) io_write_offset_f2_pof_add(s, 0, 0x20, &pof); else for (std::string& i : bone_names) io_write_offset_x_pof_add(s, 0, &pof); - io_align_write(s, 0x10); + s.align_write(0x10); if (ex->blocks_count > 0) { - exh.blocks_offset = io_get_position(s); + exh.blocks_offset = s.get_position(); if (!is_x) { for (uint32_t i = 0; i < ex->blocks_count; i++) { io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); } - io_write_offset_f2(s, 0, 0x20); - io_write_offset_f2(s, 0, 0x20); + s.write_offset_f2(0, 0x20); + s.write_offset_f2(0, 0x20); } else { for (uint32_t i = 0; i < ex->blocks_count; i++) { io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); } - io_write_offset_x(s, 0); - io_write_offset_x(s, 0); + s.write_offset_x(0); + s.write_offset_x(0); } - io_align_write(s, 0x10); + s.align_write(0x10); bhs = force_malloc_s(obj_skin_block_header, ex->blocks_count); if (!is_x) @@ -5166,10 +5139,10 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (block->type != OBJ_SKIN_BLOCK_OSAGE) continue; - bhs[i].block_offset = io_get_position(s); + bhs[i].block_offset = s.get_position(); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x24); - io_write(s, 0x24); + s.write(0x24); + s.write(0x24); } else for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -5179,18 +5152,18 @@ static void obj_modern_write_skin(obj* obj, stream* s, obj_skin_block_osage* osage = &block->osage; - bhs[i].block_offset = io_get_position(s); + bhs[i].block_offset = s.get_position(); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x28); - if (osage->motion_node_name.length) { - io_write(s, 0x18); + s.write(0x28); + if (osage->motion_node_name) { + s.write(0x18); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x18); + s.write(0x18); } else - io_write(s, 0x38); + s.write(0x38); } - io_align_write(s, 0x10); + s.align_write(0x10); if (!is_x) for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -5200,17 +5173,17 @@ static void obj_modern_write_skin(obj* obj, stream* s, obj_skin_block_expression* expression = &block->expression; - bhs[i].block_offset = io_get_position(s); + bhs[i].block_offset = s.get_position(); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x24); + s.write(0x24); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x04); + s.write(0x04); for (uint32_t j = 0; j < expression->expressions_count && j < 9; j++) io_write_offset_f2_pof_add(s, 0, 0x20, &pof); for (uint32_t j = expression->expressions_count; j < 9; j++) - io_write(s, 0x04); + s.write(0x04); } else for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -5219,19 +5192,19 @@ static void obj_modern_write_skin(obj* obj, stream* s, continue; obj_skin_block_expression* expression = &block->expression; - bhs[i].block_offset = io_get_position(s); + bhs[i].block_offset = s.get_position(); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x28); + s.write(0x28); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x08); + s.write(0x08); for (uint32_t j = 0; j < expression->expressions_count && j < 9; j++) io_write_offset_x_pof_add(s, 0, &pof); for (uint32_t j = expression->expressions_count; j < 9; j++) - io_write(s, 0x08); + s.write(0x08); } - io_align_write(s, 0x10); + s.align_write(0x10); if (!is_x) for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -5241,34 +5214,34 @@ static void obj_modern_write_skin(obj* obj, stream* s, obj_skin_block_cloth* cloth = &block->cloth; - bhs[i].block_offset = io_get_position(s); + bhs[i].block_offset = s.get_position(); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x10); + s.write(0x10); if (cloth->field_10) io_write_offset_f2_pof_add(s, 0, 0x20, &pof); else - io_write(s, 0x04); + s.write(0x04); if (cloth->count) { io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); } else - io_write(s, 0x08); + s.write(0x08); if (cloth->field_24_count) io_write_offset_f2_pof_add(s, 0, 0x20, &pof); else - io_write(s, 0x04); + s.write(0x04); if (cloth->field_28_count) io_write_offset_f2_pof_add(s, 0, 0x20, &pof); else - io_write(s, 0x04); + s.write(0x04); - io_write(s, 0x08); + s.write(0x08); } else for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -5278,36 +5251,36 @@ static void obj_modern_write_skin(obj* obj, stream* s, obj_skin_block_cloth* cloth = &block->cloth; - bhs[i].block_offset = io_get_position(s); + bhs[i].block_offset = s.get_position(); io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x10); + s.write(0x10); if (cloth->field_10) io_write_offset_x_pof_add(s, 0, &pof); else - io_write(s, 0x08); + s.write(0x08); if (cloth->count) { io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); } else - io_write(s, 0x10); + s.write(0x10); if (cloth->field_24_count) io_write_offset_x_pof_add(s, 0, &pof); else - io_write(s, 0x08); + s.write(0x08); if (cloth->field_28_count) io_write_offset_x_pof_add(s, 0, &pof); else - io_write(s, 0x08); + s.write(0x08); - io_write(s, 0x10); + s.write(0x10); } - io_align_write(s, 0x10); + s.align_write(0x10); if (!is_x) for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -5315,34 +5288,34 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (block->type != OBJ_SKIN_BLOCK_CONSTRAINT) continue; - bhs[i].block_offset = io_get_position(s); + bhs[i].block_offset = s.get_position(); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x24); + s.write(0x24); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x04); + s.write(0x04); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); switch (block->constraint.type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - io_write(s, 0x0C); + s.write(0x0C); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: - io_write(s, 0x20); + s.write(0x20); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x18); + s.write(0x18); break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: - io_write(s, 0x20); + s.write(0x20); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x14); - io_write(s, 0x14); + s.write(0x14); + s.write(0x14); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: - io_write(s, 0x20); + s.write(0x20); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x04); - io_write(s, 0x14); - io_write(s, 0x14); + s.write(0x04); + s.write(0x14); + s.write(0x14); break; } } @@ -5352,40 +5325,40 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (block->type != OBJ_SKIN_BLOCK_CONSTRAINT) continue; - bhs[i].block_offset = io_get_position(s); + bhs[i].block_offset = s.get_position(); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x28); + s.write(0x28); io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x08); + s.write(0x08); io_write_offset_x_pof_add(s, 0, &pof); switch (block->constraint.type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - io_write(s, 0x0C); - io_write(s, 0x04); + s.write(0x0C); + s.write(0x04); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: - io_write(s, 0x20); + s.write(0x20); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x18); + s.write(0x18); break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: - io_write(s, 0x20); + s.write(0x20); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x14); - io_write(s, 0x14); + s.write(0x14); + s.write(0x14); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: - io_write(s, 0x20); + s.write(0x20); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x04); - io_write(s, 0x14); - io_write(s, 0x14); - io_write(s, 0x04); + s.write(0x04); + s.write(0x14); + s.write(0x14); + s.write(0x04); break; } } - io_align_write(s, 0x10); + s.align_write(0x10); if (!is_x) for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -5393,11 +5366,11 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; - bhs[i].block_offset = io_get_position(s); + bhs[i].block_offset = s.get_position(); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x24); + s.write(0x24); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); - io_write(s, 0x04); + s.write(0x04); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); io_write_offset_f2_pof_add(s, 0, 0x20, &pof); } @@ -5407,42 +5380,42 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; - bhs[i].block_offset = io_get_position(s); + bhs[i].block_offset = s.get_position(); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x28); + s.write(0x28); io_write_offset_x_pof_add(s, 0, &pof); - io_write(s, 0x08); + s.write(0x08); io_write_offset_x_pof_add(s, 0, &pof); io_write_offset_x_pof_add(s, 0, &pof); } - io_align_write(s, 0x10); + s.align_write(0x10); if (motion_count) { - motion_block_node_mats = io_get_position(s); + motion_block_node_mats = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; obj_skin_block_motion* motion = &block->motion; - io_write(s, motion->nodes_count * sizeof(mat4)); + s.write(motion->nodes_count * sizeof(mat4)); } - io_align_write(s, 0x10); + s.align_write(0x10); - motion_block_node_name_offset = io_get_position(s); + motion_block_node_name_offset = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; obj_skin_block_motion* motion = &block->motion; - io_write(s, motion->nodes_count * sizeof(uint32_t)); + s.write(motion->nodes_count * sizeof(uint32_t)); } - io_align_write(s, 0x10); + s.align_write(0x10); } if (exh.cloth_count) { - field_18 = io_get_position(s); + field_18 = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) @@ -5451,11 +5424,11 @@ static void obj_modern_write_skin(obj* obj, stream* s, obj_skin_block_cloth* cloth = &block->cloth; for (uint32_t j = 0; j < 32; j++) if (cloth->field_10 & (1 << j)) - io_write(s, sizeof(mat4)); + s.write(sizeof(mat4)); } - io_align_write(s, 0x10); + s.align_write(0x10); - field_1C = io_get_position(s); + field_1C = s.get_position(); if (!is_x) for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; @@ -5463,7 +5436,7 @@ static void obj_modern_write_skin(obj* obj, stream* s, continue; obj_skin_block_cloth* cloth = &block->cloth; - io_write(s, (10 * sizeof(int32_t) + s.write((10 * sizeof(int32_t) + 4 * (sizeof(int32_t) + 3 * sizeof(int32_t))) * cloth->count); } else @@ -5473,43 +5446,43 @@ static void obj_modern_write_skin(obj* obj, stream* s, continue; obj_skin_block_cloth* cloth = &block->cloth; - io_write(s, (10 * sizeof(int32_t) + 4 * (sizeof(int64_t) + s.write((10 * sizeof(int32_t) + 4 * (sizeof(int64_t) + 4 * sizeof(int32_t))) * cloth->count); } - io_align_write(s, 0x10); + s.align_write(0x10); - field_20 = io_get_position(s); + field_20 = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; obj_skin_block_cloth* cloth = &block->cloth; - io_write(s, 10 * (11 * sizeof(int32_t)) * cloth->count); + s.write(10 * (11 * sizeof(int32_t)) * cloth->count); } - io_align_write(s, 0x10); + s.align_write(0x10); - field_24 = io_get_position(s); + field_24 = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; obj_skin_block_cloth* cloth = &block->cloth; - io_write(s, sizeof(uint16_t) + cloth->field_24_count * sizeof(uint16_t)); + s.write(sizeof(uint16_t) + cloth->field_24_count * sizeof(uint16_t)); } - io_align_write(s, 0x10); + s.align_write(0x10); - field_28 = io_get_position(s); + field_28 = s.get_position(); for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; obj_skin_block_cloth* cloth = &block->cloth; - io_write(s, sizeof(uint16_t) + cloth->field_28_count * sizeof(uint16_t)); + s.write(sizeof(uint16_t) + cloth->field_28_count * sizeof(uint16_t)); } - io_align_write(s, 0x10); + s.align_write(0x10); } } } @@ -5518,11 +5491,11 @@ static void obj_modern_write_skin(obj* obj, stream* s, quicksort_string(strings.data(), strings.size()); string_offsets.reserve(strings.size()); for (std::string& i : strings) { - string_offsets.push_back(io_get_position(s)); - io_write_string_null_terminated(s, &i); + string_offsets.push_back(s.get_position()); + s.write_string_null_terminated(i); } } - io_align_write(s, 0x10); + s.align_write(0x10); std::vector osage_names; if (sk->ex_data_init) { @@ -5540,10 +5513,10 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (block->type != OBJ_SKIN_BLOCK_CLOTH) continue; - io_position_push(s, bhs[i].block_offset, SEEK_SET); + s.position_push(bhs[i].block_offset, SEEK_SET); obj_modern_write_skin_block_cloth(&block->cloth, s, strings, string_offsets, is_x, &field_18, &field_1C, &field_20, &field_24, &field_28); - io_position_pop(s); + s.position_pop(); } int64_t constraint_type_name_offsets[4]; @@ -5562,10 +5535,10 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (block->type != OBJ_SKIN_BLOCK_CONSTRAINT) continue; - io_position_push(s, bhs[i].block_offset, SEEK_SET); + s.position_push(bhs[i].block_offset, SEEK_SET); obj_modern_write_skin_block_constraint(&block->constraint, s, strings, string_offsets, bone_names_ptr, is_x, constraint_type_name_offsets); - io_position_pop(s); + s.position_pop(); } for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -5573,10 +5546,10 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (block->type != OBJ_SKIN_BLOCK_EXPRESSION) continue; - io_position_push(s, bhs[i].block_offset, SEEK_SET); + s.position_push(bhs[i].block_offset, SEEK_SET); obj_modern_write_skin_block_expression(&block->expression, s, strings, string_offsets, bone_names_ptr, is_x); - io_position_pop(s); + s.position_pop(); } for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -5584,11 +5557,11 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (block->type != OBJ_SKIN_BLOCK_MOTION) continue; - io_position_push(s, bhs[i].block_offset, SEEK_SET); + s.position_push(bhs[i].block_offset, SEEK_SET); obj_modern_write_skin_block_motion(&block->motion, s, strings, string_offsets, is_x, bone_names_ptr, &motion_block_node_name_offset, &motion_block_node_mats); - io_position_pop(s); + s.position_pop(); } for (uint32_t i = 0; i < ex->blocks_count; i++) { @@ -5596,17 +5569,17 @@ static void obj_modern_write_skin(obj* obj, stream* s, if (block->type != OBJ_SKIN_BLOCK_OSAGE) continue; - io_position_push(s, bhs[i].block_offset, SEEK_SET); + s.position_push(bhs[i].block_offset, SEEK_SET); obj_modern_write_skin_block_osage(&block->osage, s, strings, string_offsets, is_x); - io_position_pop(s); + s.position_pop(); } for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; if (block->type == OBJ_SKIN_BLOCK_CLOTH) { obj_skin_block_cloth* cloth = &block->cloth; - obj_skin_strings_push_back_check(osage_names, string_data(&cloth->mesh_name)); + obj_skin_strings_push_back_check(osage_names, cloth->mesh_name); } else if (block->type == OBJ_SKIN_BLOCK_OSAGE) { obj_skin_block_osage* osage = &block->osage; @@ -5615,297 +5588,297 @@ static void obj_modern_write_skin(obj* obj, stream* s, } } - io_position_push(s, exh.blocks_offset, SEEK_SET); + s.position_push(exh.blocks_offset, SEEK_SET); if (!is_x) { for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; switch (block->type) { case OBJ_SKIN_BLOCK_CLOTH: - io_write_offset_f2(s, cls_offset, 0x20); - io_write_offset_f2(s, bhs[i].block_offset, 0x20); + s.write_offset_f2(cls_offset, 0x20); + s.write_offset_f2(bhs[i].block_offset, 0x20); break; case OBJ_SKIN_BLOCK_CONSTRAINT: - io_write_offset_f2(s, cns_offset, 0x20); - io_write_offset_f2(s, bhs[i].block_offset, 0x20); + s.write_offset_f2(cns_offset, 0x20); + s.write_offset_f2(bhs[i].block_offset, 0x20); break; case OBJ_SKIN_BLOCK_EXPRESSION: - io_write_offset_f2(s, exp_offset, 0x20); - io_write_offset_f2(s, bhs[i].block_offset, 0x20); + s.write_offset_f2(exp_offset, 0x20); + s.write_offset_f2(bhs[i].block_offset, 0x20); break; case OBJ_SKIN_BLOCK_MOTION: - io_write_offset_f2(s, mot_offset, 0x20); - io_write_offset_f2(s, bhs[i].block_offset, 0x20); + s.write_offset_f2(mot_offset, 0x20); + s.write_offset_f2(bhs[i].block_offset, 0x20); break; case OBJ_SKIN_BLOCK_OSAGE: - io_write_offset_f2(s, osg_offset, 0x20); - io_write_offset_f2(s, bhs[i].block_offset, 0x20); + s.write_offset_f2(osg_offset, 0x20); + s.write_offset_f2(bhs[i].block_offset, 0x20); break; default: - io_write_offset_f2(s, 0, 0); - io_write_offset_f2(s, 0, 0); + s.write_offset_f2(0, 0); + s.write_offset_f2(0, 0); break; } } - io_write_offset_f2(s, 0, 0); - io_write_offset_f2(s, 0, 0); + s.write_offset_f2(0, 0); + s.write_offset_f2(0, 0); } else { for (uint32_t i = 0; i < ex->blocks_count; i++) { obj_skin_block* block = &ex->blocks[i]; switch (block->type) { case OBJ_SKIN_BLOCK_CLOTH: - io_write_offset_x(s, cls_offset); - io_write_offset_x(s, bhs[i].block_offset); + s.write_offset_x(cls_offset); + s.write_offset_x(bhs[i].block_offset); break; case OBJ_SKIN_BLOCK_CONSTRAINT: - io_write_offset_x(s, cns_offset); - io_write_offset_x(s, bhs[i].block_offset); + s.write_offset_x(cns_offset); + s.write_offset_x(bhs[i].block_offset); break; case OBJ_SKIN_BLOCK_EXPRESSION: - io_write_offset_x(s, exp_offset); - io_write_offset_x(s, bhs[i].block_offset); + s.write_offset_x(exp_offset); + s.write_offset_x(bhs[i].block_offset); break; case OBJ_SKIN_BLOCK_MOTION: - io_write_offset_x(s, mot_offset); - io_write_offset_x(s, bhs[i].block_offset); + s.write_offset_x(mot_offset); + s.write_offset_x(bhs[i].block_offset); break; case OBJ_SKIN_BLOCK_OSAGE: - io_write_offset_x(s, osg_offset); - io_write_offset_x(s, bhs[i].block_offset); + s.write_offset_x(osg_offset); + s.write_offset_x(bhs[i].block_offset); break; default: - io_write_offset_x(s, 0); - io_write_offset_x(s, 0); + s.write_offset_x(0); + s.write_offset_x(0); break; } } - io_write_offset_x(s, 0); - io_write_offset_x(s, 0); + s.write_offset_x(0); + s.write_offset_x(0); } - io_position_pop(s); + s.position_pop(); free(bhs); } } if (sk->bones) { - io_position_push(s, sh.bone_names_offset, SEEK_SET); + s.position_push(sh.bone_names_offset, SEEK_SET); if (!is_x) for (uint32_t i = 0; i < sk->bones_count; i++) { size_t str_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&sk->bones[i].name)); - io_write_offset_f2(s, str_offset, 0x20); + string_offsets, sk->bones[i].name); + s.write_offset_f2(str_offset, 0x20); } else for (uint32_t i = 0; i < sk->bones_count; i++) { size_t str_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&sk->bones[i].name)); - io_write_offset_x(s, str_offset); + string_offsets, sk->bones[i].name); + s.write_offset_x(str_offset); } - io_position_pop(s); + s.position_pop(); } if (sk->ex_data_init) { obj_skin_ex_data* ex = &sk->ex_data; if (ex->blocks_count > 0) { - io_position_push(s, exh.bone_names_offset, SEEK_SET); + s.position_push(exh.bone_names_offset, SEEK_SET); if (!is_x) for (std::string& i : bone_names) { size_t str_offset = obj_skin_strings_get_string_offset(strings, string_offsets, i.c_str()); - io_write_offset_f2(s, str_offset, 0x20); + s.write_offset_f2(str_offset, 0x20); } else for (std::string& i : bone_names) { size_t str_offset = obj_skin_strings_get_string_offset(strings, string_offsets, i.c_str()); - io_write_offset_x(s, str_offset); + s.write_offset_x(str_offset); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, exh.osage_nodes_offset, SEEK_SET); + s.position_push(exh.osage_nodes_offset, SEEK_SET); for (uint32_t i = 0; i < ex->osage_nodes_count; i++) { obj_skin_osage_node* osage_node = &ex->osage_nodes[i]; - io_write_uint32_t(s, osage_node->name_index); - io_write_float_t(s, osage_node->length); - io_write_uint32_t(s, 0); + s.write_uint32_t(osage_node->name_index); + s.write_float_t(osage_node->length); + s.write_uint32_t(0); } - io_position_pop(s); + s.position_pop(); - io_position_push(s, exh.osage_sibling_infos_offset, SEEK_SET); + s.position_push(exh.osage_sibling_infos_offset, SEEK_SET); for (uint32_t i = 0; i < ex->osage_sibling_infos_count; i++) { obj_skin_osage_sibling_info* osage_sibling_info = &ex->osage_sibling_infos[i]; - io_write_uint32_t(s, osage_sibling_info->name_index); - io_write_uint32_t(s, osage_sibling_info->sibling_name_index); - io_write_float_t(s, osage_sibling_info->max_distance); + s.write_uint32_t(osage_sibling_info->name_index); + s.write_uint32_t(osage_sibling_info->sibling_name_index); + s.write_float_t(osage_sibling_info->max_distance); } - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_write_int32_t(s, 0); - io_position_pop(s); + s.write_int32_t(0); + s.write_int32_t(0); + s.write_int32_t(0); + s.position_pop(); exh.osage_count = (int32_t)osage_names.size(); exh.osage_count -= exh.cloth_count; - io_position_push(s, exh.osage_names_offset, SEEK_SET); + s.position_push(exh.osage_names_offset, SEEK_SET); if (!is_x) for (std::string& i : osage_names) { size_t str_offset = obj_skin_strings_get_string_offset(strings, string_offsets, i.c_str()); - io_write_offset_f2(s, str_offset, 0x20); + s.write_offset_f2(str_offset, 0x20); } else for (std::string& i : osage_names) { size_t str_offset = obj_skin_strings_get_string_offset(strings, string_offsets, i.c_str()); - io_write_offset_x(s, str_offset); + s.write_offset_x(str_offset); } - io_position_pop(s); + s.position_pop(); } - io_position_push(s, sh.ex_data_offset, SEEK_SET); + s.position_push(sh.ex_data_offset, SEEK_SET); if (!is_x) { - io_write_int32_t(s, exh.osage_count); - io_write_int32_t(s, ex->osage_nodes_count); - io_write(s, 0x04); - io_write_offset_f2(s, exh.osage_nodes_offset, 0x20); - io_write_offset_f2(s, exh.osage_names_offset, 0x20); - io_write_offset_f2(s, exh.blocks_offset, 0x20); - io_write_int32_t(s, exh.bone_names_count); - 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->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); + s.write_int32_t(exh.osage_count); + s.write_int32_t(ex->osage_nodes_count); + s.write(0x04); + s.write_offset_f2(exh.osage_nodes_offset, 0x20); + s.write_offset_f2(exh.osage_names_offset, 0x20); + s.write_offset_f2(exh.blocks_offset, 0x20); + s.write_int32_t(exh.bone_names_count); + s.write_offset_f2(exh.bone_names_offset, 0x20); + s.write_offset_f2(exh.osage_sibling_infos_offset, 0x20); + s.write_int32_t(exh.cloth_count); + s.write_offset_f2(ex->reserved[0], 0x20); + s.write_offset_f2(ex->reserved[1], 0x20); + s.write_offset_f2(ex->reserved[2], 0x20); + s.write_offset_f2(ex->reserved[3], 0x20); + s.write_offset_f2(ex->reserved[4], 0x20); + s.write_offset_f2(ex->reserved[5], 0x20); + s.write_offset_f2(ex->reserved[6], 0x20); } else { - io_write_int32_t(s, exh.osage_count); - io_write_int32_t(s, ex->osage_nodes_count); - io_write(s, 0x08); - io_write_offset_x(s, exh.osage_nodes_offset); - io_write_offset_x(s, exh.osage_names_offset); - io_write_offset_x(s, exh.blocks_offset); - io_write_int32_t(s, exh.bone_names_count); - 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->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]); + s.write_int32_t(exh.osage_count); + s.write_int32_t(ex->osage_nodes_count); + s.write(0x08); + s.write_offset_x(exh.osage_nodes_offset); + s.write_offset_x(exh.osage_names_offset); + s.write_offset_x(exh.blocks_offset); + s.write_int32_t(exh.bone_names_count); + s.write_offset_x(exh.bone_names_offset); + s.write_offset_x(exh.osage_sibling_infos_offset); + s.write_int32_t(exh.cloth_count); + s.write_offset_x(ex->reserved[0]); + s.write_offset_x(ex->reserved[1]); + s.write_offset_x(ex->reserved[2]); + s.write_offset_x(ex->reserved[3]); + s.write_offset_x(ex->reserved[4]); + s.write_offset_x(ex->reserved[5]); + s.write_offset_x(ex->reserved[6]); } - io_position_pop(s); + s.position_pop(); } - io_position_push(s, base_offset, SEEK_SET); + s.position_push(base_offset, SEEK_SET); if (!is_x) { - io_write_offset_f2(s, sh.bone_ids_offset, 0x20); - io_write_offset_f2(s, sh.bone_matrices_offset, 0x20); - io_write_offset_f2(s, sh.bone_names_offset, 0x20); - io_write_offset_f2(s, sh.ex_data_offset, 0x20); - io_write_int32_t(s, sk->bones_count); - io_write_offset_f2(s, sh.bone_parent_ids_offset, 0x20); - io_write(s, 0x0C); + s.write_offset_f2(sh.bone_ids_offset, 0x20); + s.write_offset_f2(sh.bone_matrices_offset, 0x20); + s.write_offset_f2(sh.bone_names_offset, 0x20); + s.write_offset_f2(sh.ex_data_offset, 0x20); + s.write_int32_t(sk->bones_count); + s.write_offset_f2(sh.bone_parent_ids_offset, 0x20); + s.write(0x0C); } else { - io_write_offset_x(s, sh.bone_ids_offset); - io_write_offset_x(s, sh.bone_matrices_offset); - io_write_offset_x(s, sh.bone_names_offset); - io_write_offset_x(s, sh.ex_data_offset); - io_write_int32_t(s, sk->bones_count); - io_write_offset_x(s, sh.bone_parent_ids_offset); - io_write(s, 0x18); + s.write_offset_x(sh.bone_ids_offset); + s.write_offset_x(sh.bone_matrices_offset); + s.write_offset_x(sh.bone_names_offset); + s.write_offset_x(sh.ex_data_offset); + s.write_int32_t(sk->bones_count); + s.write_offset_x(sh.bone_parent_ids_offset); + s.write(0x18); } - io_position_pop(s); + s.position_pop(); oskn->enrs = e; oskn->pof = pof; } static void obj_modern_read_skin_block_cloth(obj_skin_block_cloth* b, - stream* s, uint32_t header_length, char** str, bool is_x) { - int64_t mesh_name_offset = io_read_offset(s, header_length, is_x); - io_read_string_null_terminated_offset(s, mesh_name_offset, &b->mesh_name); + stream& s, uint32_t header_length, char** str, bool is_x) { + int64_t mesh_name_offset = s.read_offset(header_length, is_x); + b->mesh_name = s.read_utf8_string_null_terminated_offset(mesh_name_offset); - int64_t backface_mesh_name_offset = io_read_offset(s, header_length, is_x); - io_read_string_null_terminated_offset(s, backface_mesh_name_offset, &b->backface_mesh_name); + int64_t backface_mesh_name_offset = s.read_offset(header_length, is_x); + b->backface_mesh_name = s.read_utf8_string_null_terminated_offset(backface_mesh_name_offset); - b->field_8 = io_read_int32_t_stream_reverse_endianness(s); - b->count = io_read_int32_t_stream_reverse_endianness(s); - b->field_10 = io_read_int32_t_stream_reverse_endianness(s); - b->field_14 = io_read_int32_t_stream_reverse_endianness(s); - int64_t field_18_offset = io_read_offset(s, header_length, is_x); - int64_t field_1C_offset = io_read_offset(s, header_length, is_x); + b->field_8 = s.read_int32_t_reverse_endianness(); + b->count = s.read_int32_t_reverse_endianness(); + b->field_10 = s.read_int32_t_reverse_endianness(); + b->field_14 = s.read_int32_t_reverse_endianness(); + int64_t field_18_offset = s.read_offset(header_length, is_x); + int64_t field_1C_offset = s.read_offset(header_length, is_x); b->field_1C = 0; b->field_20 = 0; b->field_24 = 0; b->field_28 = 0; - int64_t field_20_offset = io_read_offset(s, header_length, is_x); - int64_t field_24_offset = io_read_offset(s, header_length, is_x); - int64_t field_28_offset = io_read_offset(s, header_length, is_x); - b->field_2C = io_read_uint32_t_stream_reverse_endianness(s); - b->field_30 = io_read_uint32_t_stream_reverse_endianness(s); + int64_t field_20_offset = s.read_offset(header_length, is_x); + int64_t field_24_offset = s.read_offset(header_length, is_x); + int64_t field_28_offset = s.read_offset(header_length, is_x); + b->field_2C = s.read_uint32_t_reverse_endianness(); + b->field_30 = s.read_uint32_t_reverse_endianness(); if (field_18_offset) { - io_position_push(s, field_18_offset, SEEK_SET); + s.position_push(field_18_offset, SEEK_SET); for (uint32_t i = 0; i < 32; i++) { if (~b->field_10 & (1 << i)) continue; mat4u& mat = b->field_18[i]; - mat.row0.x = io_read_float_t_stream_reverse_endianness(s); - mat.row1.x = io_read_float_t_stream_reverse_endianness(s); - mat.row2.x = io_read_float_t_stream_reverse_endianness(s); - mat.row3.x = io_read_float_t_stream_reverse_endianness(s); - mat.row0.y = io_read_float_t_stream_reverse_endianness(s); - mat.row1.y = io_read_float_t_stream_reverse_endianness(s); - mat.row2.y = io_read_float_t_stream_reverse_endianness(s); - mat.row3.y = io_read_float_t_stream_reverse_endianness(s); - mat.row0.z = io_read_float_t_stream_reverse_endianness(s); - mat.row1.z = io_read_float_t_stream_reverse_endianness(s); - mat.row2.z = io_read_float_t_stream_reverse_endianness(s); - mat.row3.z = io_read_float_t_stream_reverse_endianness(s); - mat.row0.w = io_read_float_t_stream_reverse_endianness(s); - mat.row1.w = io_read_float_t_stream_reverse_endianness(s); - mat.row2.w = io_read_float_t_stream_reverse_endianness(s); - mat.row3.w = io_read_float_t_stream_reverse_endianness(s); + mat.row0.x = s.read_float_t_reverse_endianness(); + mat.row1.x = s.read_float_t_reverse_endianness(); + mat.row2.x = s.read_float_t_reverse_endianness(); + mat.row3.x = s.read_float_t_reverse_endianness(); + mat.row0.y = s.read_float_t_reverse_endianness(); + mat.row1.y = s.read_float_t_reverse_endianness(); + mat.row2.y = s.read_float_t_reverse_endianness(); + mat.row3.y = s.read_float_t_reverse_endianness(); + mat.row0.z = s.read_float_t_reverse_endianness(); + mat.row1.z = s.read_float_t_reverse_endianness(); + mat.row2.z = s.read_float_t_reverse_endianness(); + mat.row3.z = s.read_float_t_reverse_endianness(); + mat.row0.w = s.read_float_t_reverse_endianness(); + mat.row1.w = s.read_float_t_reverse_endianness(); + mat.row2.w = s.read_float_t_reverse_endianness(); + mat.row3.w = s.read_float_t_reverse_endianness(); } - io_position_pop(s); + s.position_pop(); } if (field_1C_offset) { - io_position_push(s, field_1C_offset, SEEK_SET); + s.position_push(field_1C_offset, SEEK_SET); b->field_1C = force_malloc_s(obj_skin_block_cloth_field_1C, b->count); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_1C* f = &b->field_1C[i]; - f->field_0 = io_read_float_t_stream_reverse_endianness(s); - f->field_4 = io_read_float_t_stream_reverse_endianness(s); - f->field_8 = io_read_float_t_stream_reverse_endianness(s); - f->field_C = io_read_float_t_stream_reverse_endianness(s); - f->field_10 = io_read_float_t_stream_reverse_endianness(s); - f->field_14 = io_read_float_t_stream_reverse_endianness(s); - f->field_18 = io_read_float_t_stream_reverse_endianness(s); - f->field_1C = io_read_uint32_t_stream_reverse_endianness(s); - f->field_20 = io_read_uint32_t_stream_reverse_endianness(s); - f->field_24 = io_read_uint32_t_stream_reverse_endianness(s); + f->field_0 = s.read_float_t_reverse_endianness(); + f->field_4 = s.read_float_t_reverse_endianness(); + f->field_8 = s.read_float_t_reverse_endianness(); + f->field_C = s.read_float_t_reverse_endianness(); + f->field_10 = s.read_float_t_reverse_endianness(); + f->field_14 = s.read_float_t_reverse_endianness(); + f->field_18 = s.read_float_t_reverse_endianness(); + f->field_1C = s.read_uint32_t_reverse_endianness(); + f->field_20 = s.read_uint32_t_reverse_endianness(); + f->field_24 = s.read_uint32_t_reverse_endianness(); for (uint32_t j = 0; j < 4; j++) obj_modern_read_skin_block_cloth_field_1C_sub(&f->sub_data[j], s, header_length, str, is_x); } - io_position_pop(s); + s.position_pop(); } if (field_20_offset) { - io_position_push(s, field_20_offset, SEEK_SET); + s.position_push(field_20_offset, SEEK_SET); b->field_20 = force_malloc_s(obj_skin_block_cloth_field_20, b->count); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_20* f = &b->field_20[i]; @@ -5913,125 +5886,125 @@ static void obj_modern_read_skin_block_cloth(obj_skin_block_cloth* b, obj_modern_read_skin_block_cloth_field_20_sub(&f->sub_data[j], s, header_length, str, is_x); } - io_position_pop(s); + s.position_pop(); } if (field_24_offset) { - io_position_push(s, field_24_offset, SEEK_SET); - b->field_24_count = io_read_uint16_t_stream_reverse_endianness(s); + s.position_push(field_24_offset, SEEK_SET); + b->field_24_count = s.read_uint16_t_reverse_endianness(); b->field_24 = force_malloc_s(uint16_t, b->field_24_count); - io_read(s, b->field_24, b->field_24_count * sizeof(uint16_t)); - if (s->is_big_endian) { + s.read(b->field_24, b->field_24_count * sizeof(uint16_t)); + if (s.is_big_endian) { uint16_t* field_24 = b->field_24; for (int32_t i = 0; i < b->field_24_count; i++) field_24[i] = reverse_endianness_uint16_t(field_24[i]); } - io_position_pop(s); + s.position_pop(); } if (field_28_offset) { - io_position_push(s, field_28_offset, SEEK_SET); - b->field_28_count = io_read_uint16_t_stream_reverse_endianness(s); + s.position_push(field_28_offset, SEEK_SET); + b->field_28_count = s.read_uint16_t_reverse_endianness(); b->field_28 = force_malloc_s(uint16_t, b->field_28_count); - io_read(s, b->field_28, b->field_28_count * sizeof(uint16_t)); - if (s->is_big_endian) { + s.read(b->field_28, b->field_28_count * sizeof(uint16_t)); + if (s.is_big_endian) { uint16_t* field_28 = b->field_28; for (int32_t i = 0; i < b->field_28_count; i++) field_28[i] = reverse_endianness_uint16_t(field_28[i]); } - io_position_pop(s); + s.position_pop(); } } static void obj_modern_write_skin_block_cloth(obj_skin_block_cloth* b, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x, + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x, int64_t* field_18_offset, int64_t* field_1C_offset, int64_t* field_20_offset, int64_t* field_24_offset, int64_t* field_28_offset) { int64_t mesh_name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->mesh_name)); + string_offsets, b->mesh_name); int64_t backface_mesh_name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->backface_mesh_name)); + string_offsets, b->backface_mesh_name); if (!is_x) { - io_write_offset_f2(s, mesh_name_offset, 0x20); - io_write_offset_f2(s, backface_mesh_name_offset, 0x20); - io_write_int32_t(s, b->field_8); - io_write_int32_t(s, b->count); - io_write_int32_t(s, b->field_10); - io_write_int32_t(s, b->field_14); - io_write_offset_f2(s, b->field_10 ? *field_18_offset : 0, 0x20); - io_write_offset_f2(s, b->field_1C ? *field_1C_offset : 0, 0x20); - io_write_offset_f2(s, b->field_20 ? *field_20_offset : 0, 0x20); - io_write_offset_f2(s, b->field_24 ? *field_24_offset : 0, 0x20); - io_write_offset_f2(s, b->field_28 ? *field_28_offset : 0, 0x20); - io_write_uint32_t(s, b->field_2C); - io_write_uint32_t(s, b->field_30); + s.write_offset_f2(mesh_name_offset, 0x20); + s.write_offset_f2(backface_mesh_name_offset, 0x20); + s.write_int32_t(b->field_8); + s.write_int32_t(b->count); + s.write_int32_t(b->field_10); + s.write_int32_t(b->field_14); + s.write_offset_f2(b->field_10 ? *field_18_offset : 0, 0x20); + s.write_offset_f2(b->field_1C ? *field_1C_offset : 0, 0x20); + s.write_offset_f2(b->field_20 ? *field_20_offset : 0, 0x20); + s.write_offset_f2(b->field_24 ? *field_24_offset : 0, 0x20); + s.write_offset_f2(b->field_28 ? *field_28_offset : 0, 0x20); + s.write_uint32_t(b->field_2C); + s.write_uint32_t(b->field_30); } else { - io_write_offset_x(s, mesh_name_offset); - io_write_offset_x(s, backface_mesh_name_offset); - io_write_int32_t(s, b->field_8); - io_write_int32_t(s, b->count); - io_write_int32_t(s, b->field_10); - io_write_int32_t(s, b->field_14); - io_write_offset_x(s, b->field_10 ? *field_18_offset : 0); - io_write_offset_x(s, b->field_1C ? *field_1C_offset : 0); - io_write_offset_x(s, b->field_20 ? *field_20_offset : 0); - io_write_offset_x(s, b->field_24 ? *field_24_offset : 0); - io_write_offset_x(s, b->field_28 ? *field_28_offset : 0); - io_write_uint32_t(s, b->field_2C); - io_write_uint32_t(s, b->field_30); + s.write_offset_x(mesh_name_offset); + s.write_offset_x(backface_mesh_name_offset); + s.write_int32_t(b->field_8); + s.write_int32_t(b->count); + s.write_int32_t(b->field_10); + s.write_int32_t(b->field_14); + s.write_offset_x(b->field_10 ? *field_18_offset : 0); + s.write_offset_x(b->field_1C ? *field_1C_offset : 0); + s.write_offset_x(b->field_20 ? *field_20_offset : 0); + s.write_offset_x(b->field_24 ? *field_24_offset : 0); + s.write_offset_x(b->field_28 ? *field_28_offset : 0); + s.write_uint32_t(b->field_2C); + s.write_uint32_t(b->field_30); } if (b->field_10) { - io_position_push(s, *field_18_offset, SEEK_SET); + s.position_push(*field_18_offset, SEEK_SET); for (uint32_t i = 0; i < 32; i++) { if (~b->field_10 & (1 << i)) continue; mat4u& mat = b->field_18[i]; - io_write_float_t(s, mat.row0.x); - io_write_float_t(s, mat.row1.x); - io_write_float_t(s, mat.row2.x); - io_write_float_t(s, mat.row3.x); - io_write_float_t(s, mat.row0.y); - io_write_float_t(s, mat.row1.y); - io_write_float_t(s, mat.row2.y); - io_write_float_t(s, mat.row3.y); - io_write_float_t(s, mat.row0.z); - io_write_float_t(s, mat.row1.z); - io_write_float_t(s, mat.row2.z); - io_write_float_t(s, mat.row3.z); - io_write_float_t(s, mat.row0.w); - io_write_float_t(s, mat.row1.w); - io_write_float_t(s, mat.row2.w); - io_write_float_t(s, mat.row3.w); + s.write_float_t(mat.row0.x); + s.write_float_t(mat.row1.x); + s.write_float_t(mat.row2.x); + s.write_float_t(mat.row3.x); + s.write_float_t(mat.row0.y); + s.write_float_t(mat.row1.y); + s.write_float_t(mat.row2.y); + s.write_float_t(mat.row3.y); + s.write_float_t(mat.row0.z); + s.write_float_t(mat.row1.z); + s.write_float_t(mat.row2.z); + s.write_float_t(mat.row3.z); + s.write_float_t(mat.row0.w); + s.write_float_t(mat.row1.w); + s.write_float_t(mat.row2.w); + s.write_float_t(mat.row3.w); *field_18_offset += sizeof(mat4); } - io_position_pop(s); + s.position_pop(); } if (b->field_1C) { - io_position_push(s, *field_1C_offset, SEEK_SET); + s.position_push(*field_1C_offset, SEEK_SET); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_1C* f = &b->field_1C[i]; - io_write_float_t(s, f->field_0); - io_write_float_t(s, f->field_4); - io_write_float_t(s, f->field_8); - io_write_float_t(s, f->field_C); - io_write_float_t(s, f->field_10); - io_write_float_t(s, f->field_14); - io_write_float_t(s, f->field_18); - io_write_uint32_t(s, f->field_1C); - io_write_uint32_t(s, f->field_20); - io_write_uint32_t(s, f->field_24); + s.write_float_t(f->field_0); + s.write_float_t(f->field_4); + s.write_float_t(f->field_8); + s.write_float_t(f->field_C); + s.write_float_t(f->field_10); + s.write_float_t(f->field_14); + s.write_float_t(f->field_18); + s.write_uint32_t(f->field_1C); + s.write_uint32_t(f->field_20); + s.write_uint32_t(f->field_24); for (uint32_t j = 0; j < 4; j++) obj_modern_write_skin_block_cloth_field_1C_sub(&f->sub_data[j], s, strings, string_offsets, is_x); } - io_position_pop(s); + s.position_pop(); if (!is_x) *field_1C_offset += (10 * sizeof(int32_t) + 4 * (sizeof(int64_t) + 4 * sizeof(int32_t))) * b->count; @@ -6041,96 +6014,96 @@ static void obj_modern_write_skin_block_cloth(obj_skin_block_cloth* b, } if (b->field_20) { - io_position_push(s, *field_20_offset, SEEK_SET); + s.position_push(*field_20_offset, SEEK_SET); for (uint32_t i = 0; i < b->count; i++) { obj_skin_block_cloth_field_20* f = &b->field_20[i]; for (uint32_t j = 0; j < 10; j++) obj_modern_write_skin_block_cloth_field_20_sub(&f->sub_data[j], s, strings, string_offsets, is_x); } - io_position_pop(s); + s.position_pop(); *field_20_offset += 10 * (11 * sizeof(int32_t)) * b->count; } if (b->field_24) { - io_position_push(s, *field_24_offset, SEEK_SET); - io_write_uint16_t(s, (uint16_t)b->field_24_count); - io_write(s, b->field_24, b->field_24_count * sizeof(uint16_t)); - io_position_pop(s); + s.position_push(*field_24_offset, SEEK_SET); + s.write_uint16_t((uint16_t)b->field_24_count); + s.write(b->field_24, b->field_24_count * sizeof(uint16_t)); + s.position_pop(); *field_28_offset += sizeof(uint16_t) + b->field_24_count * sizeof(uint16_t); } if (b->field_28) { - io_position_push(s, *field_28_offset, SEEK_SET); - io_write_uint16_t(s, (uint16_t)b->field_28_count); - io_write(s, b->field_28, b->field_28_count * sizeof(uint16_t)); - io_position_pop(s); + s.position_push(*field_28_offset, SEEK_SET); + s.write_uint16_t((uint16_t)b->field_28_count); + s.write(b->field_28, b->field_28_count * sizeof(uint16_t)); + s.position_pop(); *field_28_offset += sizeof(uint16_t) + b->field_28_count * sizeof(uint16_t); } } static void obj_modern_read_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, - stream* s, uint32_t header_length, char** str, bool is_x) { - int64_t bone_name_offset = io_read_offset(s, header_length, is_x); - io_read_string_null_terminated_offset(s, bone_name_offset, &sub->bone_name); - sub->weight = io_read_float_t_stream_reverse_endianness(s); - sub->matrix_index = io_read_uint32_t_stream_reverse_endianness(s); - sub->field_C = io_read_uint32_t_stream_reverse_endianness(s); + stream& s, uint32_t header_length, char** str, bool is_x) { + int64_t bone_name_offset = s.read_offset(header_length, is_x); + sub->bone_name = s.read_utf8_string_null_terminated_offset(bone_name_offset); + sub->weight = s.read_float_t_reverse_endianness(); + sub->matrix_index = s.read_uint32_t_reverse_endianness(); + sub->field_C = s.read_uint32_t_reverse_endianness(); if (is_x) - io_read(s, 0, 0x04); + s.read(0, 0x04); } static void obj_modern_write_skin_block_cloth_field_1C_sub(obj_skin_block_cloth_field_1C_sub* sub, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x) { + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x) { int64_t bone_name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&sub->bone_name)); - io_write_offset(s, bone_name_offset, 0x20, is_x); - io_write_float_t(s, sub->weight); - io_write_uint32_t(s, sub->matrix_index); - io_write_uint32_t(s, sub->field_C); + string_offsets, sub->bone_name); + s.write_offset(bone_name_offset, 0x20, is_x); + s.write_float_t(sub->weight); + s.write_uint32_t(sub->matrix_index); + s.write_uint32_t(sub->field_C); if (is_x) - io_write(s, 0x04); + s.write(0x04); } static void obj_modern_read_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, - stream* s, uint32_t header_length, char** str, bool is_x) { - sub->field_0 = io_read_uint32_t_stream_reverse_endianness(s); - sub->field_4 = io_read_float_t_stream_reverse_endianness(s); - sub->field_8 = io_read_float_t_stream_reverse_endianness(s); - sub->field_C = io_read_float_t_stream_reverse_endianness(s); - sub->field_10 = io_read_float_t_stream_reverse_endianness(s); - sub->field_14 = io_read_float_t_stream_reverse_endianness(s); - sub->field_18 = io_read_float_t_stream_reverse_endianness(s); - sub->field_1C = io_read_float_t_stream_reverse_endianness(s); - sub->field_20 = io_read_float_t_stream_reverse_endianness(s); - sub->field_24 = io_read_float_t_stream_reverse_endianness(s); - sub->field_28 = io_read_float_t_stream_reverse_endianness(s); + stream& s, uint32_t header_length, char** str, bool is_x) { + sub->field_0 = s.read_uint32_t_reverse_endianness(); + sub->field_4 = s.read_float_t_reverse_endianness(); + sub->field_8 = s.read_float_t_reverse_endianness(); + sub->field_C = s.read_float_t_reverse_endianness(); + sub->field_10 = s.read_float_t_reverse_endianness(); + sub->field_14 = s.read_float_t_reverse_endianness(); + sub->field_18 = s.read_float_t_reverse_endianness(); + sub->field_1C = s.read_float_t_reverse_endianness(); + sub->field_20 = s.read_float_t_reverse_endianness(); + sub->field_24 = s.read_float_t_reverse_endianness(); + sub->field_28 = s.read_float_t_reverse_endianness(); } static void obj_modern_write_skin_block_cloth_field_20_sub(obj_skin_block_cloth_field_20_sub* sub, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x) { - io_write_uint32_t(s, sub->field_0); - io_write_float_t(s, sub->field_4); - io_write_float_t(s, sub->field_8); - io_write_float_t(s, sub->field_C); - io_write_float_t(s, sub->field_10); - io_write_float_t(s, sub->field_14); - io_write_float_t(s, sub->field_18); - io_write_float_t(s, sub->field_1C); - io_write_float_t(s, sub->field_20); - io_write_float_t(s, sub->field_24); - io_write_float_t(s, sub->field_28); + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x) { + s.write_uint32_t(sub->field_0); + s.write_float_t(sub->field_4); + s.write_float_t(sub->field_8); + s.write_float_t(sub->field_C); + s.write_float_t(sub->field_10); + s.write_float_t(sub->field_14); + s.write_float_t(sub->field_18); + s.write_float_t(sub->field_1C); + s.write_float_t(sub->field_20); + s.write_float_t(sub->field_24); + s.write_float_t(sub->field_28); } static void obj_modern_read_skin_block_constraint(obj_skin_block_constraint* b, - stream* s, uint32_t header_length, char** str, bool is_x) { + stream& s, uint32_t header_length, char** str, bool is_x) { obj_modern_read_skin_block_node(&b->base, s, header_length, str, is_x); - int64_t type_offset = io_read_offset(s, header_length, is_x); - char* type = io_read_utf8_string_null_terminated_offset(s, type_offset); + int64_t type_offset = s.read_offset(header_length, is_x); + char* type = s.read_utf8_string_null_terminated_offset(type_offset); - int64_t name_offset = io_read_offset(s, header_length, is_x); - char* name = io_read_utf8_string_null_terminated_offset(s, name_offset); + int64_t name_offset = s.read_offset(header_length, is_x); + char* name = s.read_utf8_string_null_terminated_offset(name_offset); b->name_index = 0; for (char** i = str; *i; i++) @@ -6140,27 +6113,27 @@ static void obj_modern_read_skin_block_constraint(obj_skin_block_constraint* b, } free(name); - b->coupling = (obj_skin_block_constraint_coupling)io_read_int32_t_stream_reverse_endianness(s); + b->coupling = (obj_skin_block_constraint_coupling)s.read_int32_t_reverse_endianness(); - int64_t source_node_name_offset = io_read_offset(s, header_length, is_x); - io_read_string_null_terminated_offset(s, source_node_name_offset, &b->source_node_name); + int64_t source_node_name_offset = s.read_offset(header_length, is_x); + b->source_node_name = s.read_utf8_string_null_terminated_offset(source_node_name_offset); if (!str_utils_compare(type, "Orientation")) { b->type = OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION; - b->orientation.offset.x = io_read_float_t_stream_reverse_endianness(s); - b->orientation.offset.y = io_read_float_t_stream_reverse_endianness(s); - b->orientation.offset.z = io_read_float_t_stream_reverse_endianness(s); + b->orientation.offset.x = s.read_float_t_reverse_endianness(); + b->orientation.offset.y = s.read_float_t_reverse_endianness(); + b->orientation.offset.z = s.read_float_t_reverse_endianness(); } else if (!str_utils_compare(type, "Direction")) { b->type = OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION; obj_modern_read_skin_block_constraint_up_vector_old(&b->direction.up_vector, s, header_length, str, is_x); - b->direction.align_axis.x = io_read_float_t_stream_reverse_endianness(s); - b->direction.align_axis.y = io_read_float_t_stream_reverse_endianness(s); - b->direction.align_axis.z = io_read_float_t_stream_reverse_endianness(s); - b->direction.target_offset.x = io_read_float_t_stream_reverse_endianness(s); - b->direction.target_offset.y = io_read_float_t_stream_reverse_endianness(s); - b->direction.target_offset.z = io_read_float_t_stream_reverse_endianness(s); + b->direction.align_axis.x = s.read_float_t_reverse_endianness(); + b->direction.align_axis.y = s.read_float_t_reverse_endianness(); + b->direction.align_axis.z = s.read_float_t_reverse_endianness(); + b->direction.target_offset.x = s.read_float_t_reverse_endianness(); + b->direction.target_offset.y = s.read_float_t_reverse_endianness(); + b->direction.target_offset.z = s.read_float_t_reverse_endianness(); } else if (!str_utils_compare(type, "Position")) { b->type = OBJ_SKIN_BLOCK_CONSTRAINT_POSITION; @@ -6175,7 +6148,7 @@ static void obj_modern_read_skin_block_constraint(obj_skin_block_constraint* b, b->type = OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE; obj_modern_read_skin_block_constraint_up_vector_old(&b->distance.up_vector, s, header_length, str, is_x); - b->distance.distance = io_read_float_t_stream_reverse_endianness(s); + b->distance.distance = s.read_float_t_reverse_endianness(); obj_modern_read_skin_block_constraint_attach_point(&b->distance.constrained_object, s, header_length, str, is_x); obj_modern_read_skin_block_constraint_attach_point(&b->distance.constraining_object, @@ -6187,7 +6160,7 @@ static void obj_modern_read_skin_block_constraint(obj_skin_block_constraint* b, } static void obj_modern_write_skin_block_constraint(obj_skin_block_constraint* b, - stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names, + stream& s, std::vector& strings, std::vector& string_offsets, char** bone_names, bool is_x, int64_t* offsets) { obj_modern_write_skin_block_node(&b->base, s, strings, string_offsets, is_x); @@ -6206,33 +6179,33 @@ static void obj_modern_write_skin_block_constraint(obj_skin_block_constraint* b, type_offset = offsets[3]; break; } - io_write_offset(s, type_offset, 0x20, is_x); + s.write_offset(type_offset, 0x20, is_x); int64_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, string_offsets, bone_names, b->name_index); - io_write_offset(s, name_offset, 0x20, is_x); + s.write_offset(name_offset, 0x20, is_x); - io_write_int32_t(s, b->coupling); + s.write_int32_t(b->coupling); int64_t source_node_name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->source_node_name)); - io_write_offset(s, source_node_name_offset, 0x20, is_x); + string_offsets, b->source_node_name); + s.write_offset(source_node_name_offset, 0x20, is_x); switch (b->type) { case OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION: - io_write_float_t(s, b->orientation.offset.x); - io_write_float_t(s, b->orientation.offset.y); - io_write_float_t(s, b->orientation.offset.z); + s.write_float_t(b->orientation.offset.x); + s.write_float_t(b->orientation.offset.y); + s.write_float_t(b->orientation.offset.z); break; case OBJ_SKIN_BLOCK_CONSTRAINT_DIRECTION: obj_modern_write_skin_block_constraint_up_vector_old(&b->direction.up_vector, s, strings, string_offsets, is_x); - io_write_float_t(s, b->direction.align_axis.x); - io_write_float_t(s, b->direction.align_axis.y); - io_write_float_t(s, b->direction.align_axis.z); - io_write_float_t(s, b->direction.target_offset.x); - io_write_float_t(s, b->direction.target_offset.y); - io_write_float_t(s, b->direction.target_offset.z); + s.write_float_t(b->direction.align_axis.x); + s.write_float_t(b->direction.align_axis.y); + s.write_float_t(b->direction.align_axis.z); + s.write_float_t(b->direction.target_offset.x); + s.write_float_t(b->direction.target_offset.y); + s.write_float_t(b->direction.target_offset.z); break; case OBJ_SKIN_BLOCK_CONSTRAINT_POSITION: obj_modern_write_skin_block_constraint_up_vector_old(&b->position.up_vector, @@ -6245,7 +6218,7 @@ static void obj_modern_write_skin_block_constraint(obj_skin_block_constraint* b, case OBJ_SKIN_BLOCK_CONSTRAINT_DISTANCE: obj_modern_write_skin_block_constraint_up_vector_old(&b->distance.up_vector, s, strings, string_offsets, is_x); - io_write_float_t(s, b->distance.distance); + s.write_float_t(b->distance.distance); obj_modern_write_skin_block_constraint_attach_point(&b->distance.constrained_object, s, strings, string_offsets, is_x); obj_modern_write_skin_block_constraint_attach_point(&b->distance.constraining_object, @@ -6255,60 +6228,60 @@ static void obj_modern_write_skin_block_constraint(obj_skin_block_constraint* b, } static void obj_modern_read_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, - stream* s, uint32_t header_length, char** str, bool is_x) { - ap->affected_by_orientation = io_read_int32_t_stream_reverse_endianness(s) != 0; - ap->affected_by_scaling = io_read_int32_t_stream_reverse_endianness(s) != 0; - ap->offset.x = io_read_float_t_stream_reverse_endianness(s); - ap->offset.y = io_read_float_t_stream_reverse_endianness(s); - ap->offset.z = io_read_float_t_stream_reverse_endianness(s); + stream& s, uint32_t header_length, char** str, bool is_x) { + ap->affected_by_orientation = s.read_int32_t_reverse_endianness() != 0; + ap->affected_by_scaling = s.read_int32_t_reverse_endianness() != 0; + ap->offset.x = s.read_float_t_reverse_endianness(); + ap->offset.y = s.read_float_t_reverse_endianness(); + ap->offset.z = s.read_float_t_reverse_endianness(); } static void obj_modern_write_skin_block_constraint_attach_point(obj_skin_block_constraint_attach_point* ap, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x) { - io_write_int32_t(s, ap->affected_by_orientation ? 1 : 0); - io_write_int32_t(s, ap->affected_by_scaling ? 1 : 0); - io_write_float_t(s, ap->offset.x); - io_write_float_t(s, ap->offset.y); - io_write_float_t(s, ap->offset.z); + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x) { + s.write_int32_t(ap->affected_by_orientation ? 1 : 0); + s.write_int32_t(ap->affected_by_scaling ? 1 : 0); + s.write_float_t(ap->offset.x); + s.write_float_t(ap->offset.y); + s.write_float_t(ap->offset.z); } static void obj_modern_read_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, - stream* s, uint32_t header_length, char** str, bool is_x) { - up->active = io_read_int32_t_stream_reverse_endianness(s) != 0; - up->roll = io_read_float_t_stream_reverse_endianness(s); - up->affected_axis.x = io_read_float_t_stream_reverse_endianness(s); - up->affected_axis.y = io_read_float_t_stream_reverse_endianness(s); - up->affected_axis.z = io_read_float_t_stream_reverse_endianness(s); - up->point_at.x = io_read_float_t_stream_reverse_endianness(s); - up->point_at.y = io_read_float_t_stream_reverse_endianness(s); - up->point_at.z = io_read_float_t_stream_reverse_endianness(s); + stream& s, uint32_t header_length, char** str, bool is_x) { + up->active = s.read_int32_t_reverse_endianness() != 0; + up->roll = s.read_float_t_reverse_endianness(); + up->affected_axis.x = s.read_float_t_reverse_endianness(); + up->affected_axis.y = s.read_float_t_reverse_endianness(); + up->affected_axis.z = s.read_float_t_reverse_endianness(); + up->point_at.x = s.read_float_t_reverse_endianness(); + up->point_at.y = s.read_float_t_reverse_endianness(); + up->point_at.z = s.read_float_t_reverse_endianness(); - int64_t name_offset = io_read_offset(s, header_length, is_x); - io_read_string_null_terminated_offset(s, name_offset, &up->name); + int64_t name_offset = s.read_offset(header_length, is_x); + up->name = s.read_utf8_string_null_terminated_offset(name_offset); } static void obj_modern_write_skin_block_constraint_up_vector_old(obj_skin_block_constraint_up_vector* up, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x) { - io_write_int32_t(s, up->active ? 1 : 0); - io_write_float_t(s, up->roll); - io_write_float_t(s, up->affected_axis.x); - io_write_float_t(s, up->affected_axis.y); - io_write_float_t(s, up->affected_axis.z); - io_write_float_t(s, up->point_at.x); - io_write_float_t(s, up->point_at.y); - io_write_float_t(s, up->point_at.z); + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x) { + s.write_int32_t(up->active ? 1 : 0); + s.write_float_t(up->roll); + s.write_float_t(up->affected_axis.x); + s.write_float_t(up->affected_axis.y); + s.write_float_t(up->affected_axis.z); + s.write_float_t(up->point_at.x); + s.write_float_t(up->point_at.y); + s.write_float_t(up->point_at.z); int64_t name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&up->name)); - io_write_offset(s, name_offset, 0x20, is_x); + string_offsets, up->name); + s.write_offset(name_offset, 0x20, is_x); } static void obj_modern_read_skin_block_expression(obj_skin_block_expression* b, - stream* s, uint32_t header_length, char** str, bool is_x) { + stream& s, uint32_t header_length, char** str, bool is_x) { obj_modern_read_skin_block_node(&b->base, s, header_length, str, is_x); - int64_t name_offset = io_read_offset(s, header_length, is_x); - char* name = io_read_utf8_string_null_terminated_offset(s, name_offset); + int64_t name_offset = s.read_offset(header_length, is_x); + char* name = s.read_utf8_string_null_terminated_offset(name_offset); b->name_index = 0; for (char** i = str; *i; i++) @@ -6318,68 +6291,68 @@ static void obj_modern_read_skin_block_expression(obj_skin_block_expression* b, } free(name); - b->expressions_count = io_read_int32_t_stream_reverse_endianness(s); + b->expressions_count = s.read_int32_t_reverse_endianness(); b->expressions_count = min(b->expressions_count, 9); if (!is_x) for (uint32_t i = 0; i < b->expressions_count; i++) { - int64_t expression_offset = io_read_offset_f2(s, header_length); + int64_t expression_offset = s.read_offset_f2(header_length); if (expression_offset) - io_read_string_null_terminated_offset(s, expression_offset, &b->expressions[i]); + b->expressions[i] = s.read_utf8_string_null_terminated_offset(expression_offset); } else for (uint32_t i = 0; i < b->expressions_count; i++) { - int64_t expression_offset = io_read_offset_x(s); + int64_t expression_offset = s.read_offset_x(); if (expression_offset) - io_read_string_null_terminated_offset(s, expression_offset, &b->expressions[i]); + b->expressions[i] = s.read_utf8_string_null_terminated_offset(expression_offset); } for (uint32_t i = b->expressions_count; i < 9; i++) - b->expressions[i] = string_empty; + b->expressions[i] = 0; } static void obj_modern_write_skin_block_expression(obj_skin_block_expression* b, - stream* s, std::vector& strings, std::vector& string_offsets, char** bone_names, bool is_x) { + stream& s, std::vector& strings, std::vector& string_offsets, char** bone_names, bool is_x) { obj_modern_write_skin_block_node(&b->base, s, strings, string_offsets, is_x); int64_t name_offset = obj_skin_strings_get_string_offset_by_index(strings, string_offsets, bone_names, b->name_index); - io_write_offset(s, name_offset, 0x20, is_x); + s.write_offset(name_offset, 0x20, is_x); - io_write_int32_t(s, min(b->expressions_count, 9)); + s.write_int32_t(min(b->expressions_count, 9)); if (!is_x) { for (uint32_t i = 0; i < b->expressions_count && i < 9; i++) { int64_t expression_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->expressions[i])); - io_write_offset_f2(s, (int32_t)expression_offset, 0x20); + string_offsets, b->expressions[i]); + s.write_offset_f2((int32_t)expression_offset, 0x20); } for (uint32_t i = b->expressions_count; i < 9; i++) - io_write_offset_f2(s, 0, 0x20); + s.write_offset_f2(0, 0x20); } else { for (uint32_t i = 0; i < b->expressions_count && i < 9; i++) { int64_t expression_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->expressions[i])); - io_write_offset_x(s, expression_offset); + string_offsets, b->expressions[i]); + s.write_offset_x(expression_offset); } for (uint32_t i = b->expressions_count; i < 9; i++) - io_write_offset_x(s, 0); + s.write_offset_x(0); } } static void obj_modern_read_skin_block_motion(obj_skin_block_motion* b, - stream* s, uint32_t header_length, char** str, bool is_x) { + stream& s, uint32_t header_length, char** str, bool is_x) { obj_modern_read_skin_block_node(&b->base, s, header_length, str, is_x); - int64_t name_offset = io_read_offset(s, header_length, is_x); - b->nodes_count = io_read_int32_t_stream_reverse_endianness(s); - int64_t bone_names_offset = io_read_offset(s, header_length, is_x); - int64_t bone_matrices_offset = io_read_offset(s, header_length, is_x); + int64_t name_offset = s.read_offset(header_length, is_x); + b->nodes_count = s.read_int32_t_reverse_endianness(); + int64_t bone_names_offset = s.read_offset(header_length, is_x); + int64_t bone_matrices_offset = s.read_offset(header_length, is_x); if (!is_x) { b->name_index = 0; - char* name = io_read_utf8_string_null_terminated_offset(s, name_offset); + char* name = s.read_utf8_string_null_terminated_offset(name_offset); for (char** i = str; *i; i++) if (!str_utils_compare(name, *i)) { b->name_index = 0x8000 | (int32_t)(i - str); @@ -6388,7 +6361,7 @@ static void obj_modern_read_skin_block_motion(obj_skin_block_motion* b, free(name); } else - io_read_string_null_terminated_offset(s, name_offset, &b->name); + b->name = s.read_utf8_string_null_terminated_offset(name_offset); b->nodes = 0; @@ -6398,39 +6371,39 @@ static void obj_modern_read_skin_block_motion(obj_skin_block_motion* b, b->nodes = force_malloc_s(obj_skin_motion_node, b->nodes_count); if (bone_names_offset) { - io_position_push(s, bone_names_offset, SEEK_SET); + s.position_push(bone_names_offset, SEEK_SET); for (uint32_t i = 0; i < b->nodes_count; i++) - b->nodes[i].name_index = io_read_uint32_t_stream_reverse_endianness(s); - io_position_pop(s); + b->nodes[i].name_index = s.read_uint32_t_reverse_endianness(); + s.position_pop(); } if (bone_matrices_offset) { - io_position_push(s, bone_matrices_offset, SEEK_SET); + s.position_push(bone_matrices_offset, SEEK_SET); for (uint32_t i = 0; i < b->nodes_count; i++) { mat4u& mat = b->nodes[i].transformation; - mat.row0.x = io_read_float_t_stream_reverse_endianness(s); - mat.row1.x = io_read_float_t_stream_reverse_endianness(s); - mat.row2.x = io_read_float_t_stream_reverse_endianness(s); - mat.row3.x = io_read_float_t_stream_reverse_endianness(s); - mat.row0.y = io_read_float_t_stream_reverse_endianness(s); - mat.row1.y = io_read_float_t_stream_reverse_endianness(s); - mat.row2.y = io_read_float_t_stream_reverse_endianness(s); - mat.row3.y = io_read_float_t_stream_reverse_endianness(s); - mat.row0.z = io_read_float_t_stream_reverse_endianness(s); - mat.row1.z = io_read_float_t_stream_reverse_endianness(s); - mat.row2.z = io_read_float_t_stream_reverse_endianness(s); - mat.row3.z = io_read_float_t_stream_reverse_endianness(s); - mat.row0.w = io_read_float_t_stream_reverse_endianness(s); - mat.row1.w = io_read_float_t_stream_reverse_endianness(s); - mat.row2.w = io_read_float_t_stream_reverse_endianness(s); - mat.row3.w = io_read_float_t_stream_reverse_endianness(s); + mat.row0.x = s.read_float_t_reverse_endianness(); + mat.row1.x = s.read_float_t_reverse_endianness(); + mat.row2.x = s.read_float_t_reverse_endianness(); + mat.row3.x = s.read_float_t_reverse_endianness(); + mat.row0.y = s.read_float_t_reverse_endianness(); + mat.row1.y = s.read_float_t_reverse_endianness(); + mat.row2.y = s.read_float_t_reverse_endianness(); + mat.row3.y = s.read_float_t_reverse_endianness(); + mat.row0.z = s.read_float_t_reverse_endianness(); + mat.row1.z = s.read_float_t_reverse_endianness(); + mat.row2.z = s.read_float_t_reverse_endianness(); + mat.row3.z = s.read_float_t_reverse_endianness(); + mat.row0.w = s.read_float_t_reverse_endianness(); + mat.row1.w = s.read_float_t_reverse_endianness(); + mat.row2.w = s.read_float_t_reverse_endianness(); + mat.row3.w = s.read_float_t_reverse_endianness(); } - io_position_pop(s); + s.position_pop(); } } static void obj_modern_write_skin_block_motion(obj_skin_block_motion* b, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x, + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x, char** bone_names, int64_t* bone_names_offset, int64_t* bone_matrices_offset) { obj_modern_write_skin_block_node(&b->base, s, strings, string_offsets, is_x); @@ -6440,97 +6413,97 @@ static void obj_modern_write_skin_block_motion(obj_skin_block_motion* b, string_offsets, bone_names, b->name_index); else name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->name)); - io_write_offset(s, name_offset, 0x20, is_x); - io_write_int32_t(s, b->nodes_count); - io_write_offset(s, b->nodes ? *bone_names_offset : 0, 0x20, is_x); - io_write_offset(s, b->nodes ? *bone_matrices_offset : 0, 0x20, is_x); + string_offsets, b->name); + s.write_offset(name_offset, 0x20, is_x); + s.write_int32_t(b->nodes_count); + s.write_offset(b->nodes ? *bone_names_offset : 0, 0x20, is_x); + s.write_offset(b->nodes ? *bone_matrices_offset : 0, 0x20, is_x); if (b->nodes) { - io_position_push(s, *bone_names_offset, SEEK_SET); + s.position_push(*bone_names_offset, SEEK_SET); for (uint32_t i = 0; i < b->nodes_count; i++) - io_write_uint32_t(s, b->nodes[i].name_index); - io_position_pop(s); + s.write_uint32_t(b->nodes[i].name_index); + s.position_pop(); *bone_names_offset += b->nodes_count * sizeof(uint32_t); - io_position_push(s, *bone_matrices_offset, SEEK_SET); + s.position_push(*bone_matrices_offset, SEEK_SET); for (uint32_t i = 0; i < b->nodes_count; i++) { mat4u& mat = b->nodes[i].transformation; - io_write_float_t(s, mat.row0.x); - io_write_float_t(s, mat.row1.x); - io_write_float_t(s, mat.row2.x); - io_write_float_t(s, mat.row3.x); - io_write_float_t(s, mat.row0.y); - io_write_float_t(s, mat.row1.y); - io_write_float_t(s, mat.row2.y); - io_write_float_t(s, mat.row3.y); - io_write_float_t(s, mat.row0.z); - io_write_float_t(s, mat.row1.z); - io_write_float_t(s, mat.row2.z); - io_write_float_t(s, mat.row3.z); - io_write_float_t(s, mat.row0.w); - io_write_float_t(s, mat.row1.w); - io_write_float_t(s, mat.row2.w); - io_write_float_t(s, mat.row3.w); + s.write_float_t(mat.row0.x); + s.write_float_t(mat.row1.x); + s.write_float_t(mat.row2.x); + s.write_float_t(mat.row3.x); + s.write_float_t(mat.row0.y); + s.write_float_t(mat.row1.y); + s.write_float_t(mat.row2.y); + s.write_float_t(mat.row3.y); + s.write_float_t(mat.row0.z); + s.write_float_t(mat.row1.z); + s.write_float_t(mat.row2.z); + s.write_float_t(mat.row3.z); + s.write_float_t(mat.row0.w); + s.write_float_t(mat.row1.w); + s.write_float_t(mat.row2.w); + s.write_float_t(mat.row3.w); } - io_position_pop(s); + s.position_pop(); *bone_matrices_offset += b->nodes_count * sizeof(mat4); } } static void obj_modern_read_skin_block_node(obj_skin_block_node* b, - stream* s, uint32_t header_length, char** str, bool is_x) { - int64_t parent_name = io_read_offset(s, header_length, is_x); - io_read_string_null_terminated_offset(s, parent_name, &b->parent_name); + stream& s, uint32_t header_length, char** str, bool is_x) { + int64_t parent_name = s.read_offset(header_length, is_x); + b->parent_name = s.read_utf8_string_null_terminated_offset(parent_name); - b->position.x = io_read_float_t_stream_reverse_endianness(s); - b->position.y = io_read_float_t_stream_reverse_endianness(s); - b->position.z = io_read_float_t_stream_reverse_endianness(s); - b->rotation.x = io_read_float_t_stream_reverse_endianness(s); - b->rotation.y = io_read_float_t_stream_reverse_endianness(s); - b->rotation.z = io_read_float_t_stream_reverse_endianness(s); - b->scale.x = io_read_float_t_stream_reverse_endianness(s); - b->scale.y = io_read_float_t_stream_reverse_endianness(s); - b->scale.z = io_read_float_t_stream_reverse_endianness(s); + b->position.x = s.read_float_t_reverse_endianness(); + b->position.y = s.read_float_t_reverse_endianness(); + b->position.z = s.read_float_t_reverse_endianness(); + b->rotation.x = s.read_float_t_reverse_endianness(); + b->rotation.y = s.read_float_t_reverse_endianness(); + b->rotation.z = s.read_float_t_reverse_endianness(); + b->scale.x = s.read_float_t_reverse_endianness(); + b->scale.y = s.read_float_t_reverse_endianness(); + b->scale.z = s.read_float_t_reverse_endianness(); if (is_x) - io_read(s, 0, 0x04); + s.read(0, 0x04); } static void obj_modern_write_skin_block_node(obj_skin_block_node* b, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x) { + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x) { int64_t parent_name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->parent_name)); - io_write_offset(s, parent_name_offset, 0x20, is_x); + string_offsets, b->parent_name); + s.write_offset(parent_name_offset, 0x20, is_x); - io_write_float_t(s, b->position.x); - io_write_float_t(s, b->position.y); - io_write_float_t(s, b->position.z); - io_write_float_t(s, b->rotation.x); - io_write_float_t(s, b->rotation.y); - io_write_float_t(s, b->rotation.z); - io_write_float_t(s, b->scale.x); - io_write_float_t(s, b->scale.y); - io_write_float_t(s, b->scale.z); + s.write_float_t(b->position.x); + s.write_float_t(b->position.y); + s.write_float_t(b->position.z); + s.write_float_t(b->rotation.x); + s.write_float_t(b->rotation.y); + s.write_float_t(b->rotation.z); + s.write_float_t(b->scale.x); + s.write_float_t(b->scale.y); + s.write_float_t(b->scale.z); if (is_x) - io_write(s, 0x04); + s.write(0x04); } static void obj_modern_read_skin_block_osage(obj_skin_block_osage* b, - stream* s, uint32_t header_length, char** str, bool is_x) { + stream& s, uint32_t header_length, char** str, bool is_x) { obj_modern_read_skin_block_node(&b->base, s, header_length, str, is_x); - b->start_index = io_read_int32_t_stream_reverse_endianness(s); - b->count = io_read_int32_t_stream_reverse_endianness(s); - b->external_name_index = io_read_uint32_t_stream_reverse_endianness(s); - b->name_index = io_read_uint32_t_stream_reverse_endianness(s); + b->start_index = s.read_int32_t_reverse_endianness(); + b->count = s.read_int32_t_reverse_endianness(); + b->external_name_index = s.read_uint32_t_reverse_endianness(); + b->name_index = s.read_uint32_t_reverse_endianness(); if (!is_x) - io_read(s, 0, 0x14); + s.read(0, 0x14); else { - io_read(s, 0, 0x08); - int64_t motion_node_name_offset = io_read_offset_x(s); - io_read_string_null_terminated_offset(s, motion_node_name_offset, &b->motion_node_name); - io_read(s, 0, 0x18); + s.read(0, 0x08); + int64_t motion_node_name_offset = s.read_offset_x(); + b->motion_node_name = s.read_utf8_string_null_terminated_offset(motion_node_name_offset); + s.read(0, 0x18); } b->nodes = 0; @@ -6538,26 +6511,26 @@ static void obj_modern_read_skin_block_osage(obj_skin_block_osage* b, } static void obj_modern_write_skin_block_osage(obj_skin_block_osage* b, - stream* s, std::vector& strings, std::vector& string_offsets, bool is_x) { + stream& s, std::vector& strings, std::vector& string_offsets, bool is_x) { obj_modern_write_skin_block_node(&b->base, s, strings, string_offsets, is_x); - io_write_int32_t(s, b->start_index); - io_write_int32_t(s, b->count); - io_write_uint32_t(s, b->external_name_index); - io_write_uint32_t(s, b->name_index); + s.write_int32_t(b->start_index); + s.write_int32_t(b->count); + s.write_uint32_t(b->external_name_index); + s.write_uint32_t(b->name_index); if (!is_x) - io_write(s, 0x14); + s.write(0x14); else { - io_write(s, 0x08); + s.write(0x08); int64_t motion_node_name_offset = obj_skin_strings_get_string_offset(strings, - string_offsets, string_data(&b->motion_node_name)); - io_write_offset_x(s, motion_node_name_offset); - io_write(s, 0x18); + string_offsets, b->motion_node_name); + s.write_offset_x(motion_node_name_offset); + s.write(0x18); } } -static void obj_modern_read_vertex(obj* obj, stream* s, int64_t* vertex, obj_mesh* mesh, +static void obj_modern_read_vertex(obj* obj, stream& s, int64_t* vertex, 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 @@ -6578,78 +6551,78 @@ static void obj_modern_read_vertex(obj* obj, stream* s, int64_t* vertex, obj_mes bool has_tangents = false; 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); + s.set_position(vtx_offset + (int64_t)size_vertex * i, SEEK_SET); vec3 position; - position.x = io_read_float_t_stream_reverse_endianness(s); - position.y = io_read_float_t_stream_reverse_endianness(s); - position.z = io_read_float_t_stream_reverse_endianness(s); + position.x = s.read_float_t_reverse_endianness(); + position.y = s.read_float_t_reverse_endianness(); + position.z = s.read_float_t_reverse_endianness(); vtx[i].position = position; vec3 normal; - normal.x = (float_t)io_read_int16_t_stream_reverse_endianness(s); - normal.y = (float_t)io_read_int16_t_stream_reverse_endianness(s); - normal.z = (float_t)io_read_int16_t_stream_reverse_endianness(s); - io_read(s, 0, 0x02); + normal.x = (float_t)s.read_int16_t_reverse_endianness(); + normal.y = (float_t)s.read_int16_t_reverse_endianness(); + normal.z = (float_t)s.read_int16_t_reverse_endianness(); + s.read(0, 0x02); vec3_div_min_max_scalar(normal, -32768.0f, 32767.0f, vtx[i].normal); vec4 tangent; - tangent.x = (float_t)io_read_int16_t_stream_reverse_endianness(s); - tangent.y = (float_t)io_read_int16_t_stream_reverse_endianness(s); - tangent.z = (float_t)io_read_int16_t_stream_reverse_endianness(s); - tangent.w = (float_t)io_read_int16_t_stream_reverse_endianness(s); + tangent.x = (float_t)s.read_int16_t_reverse_endianness(); + tangent.y = (float_t)s.read_int16_t_reverse_endianness(); + tangent.z = (float_t)s.read_int16_t_reverse_endianness(); + tangent.w = (float_t)s.read_int16_t_reverse_endianness(); vec4_div_min_max_scalar(tangent, -32768.0f, 32767.0f, tangent); vtx[i].tangent = tangent; vec2h texcoord0; - texcoord0.x = io_read_half_t_stream_reverse_endianness(s); - texcoord0.y = io_read_half_t_stream_reverse_endianness(s); + texcoord0.x = s.read_half_t_reverse_endianness(); + texcoord0.y = s.read_half_t_reverse_endianness(); vec2h_to_vec2(texcoord0, vtx[i].texcoord0); vec2h texcoord1; - texcoord1.x = io_read_half_t_stream_reverse_endianness(s); - texcoord1.y = io_read_half_t_stream_reverse_endianness(s); + texcoord1.x = s.read_half_t_reverse_endianness(); + texcoord1.y = s.read_half_t_reverse_endianness(); vec2h_to_vec2(texcoord1, vtx[i].texcoord1); 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); + texcoord2.x = s.read_half_t_reverse_endianness(); + texcoord2.y = s.read_half_t_reverse_endianness(); vec2h_to_vec2(texcoord2, vtx[i].texcoord2); } 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); + texcoord2.x = s.read_half_t_reverse_endianness(); + texcoord2.y = s.read_half_t_reverse_endianness(); vec2h_to_vec2(texcoord2, vtx[i].texcoord2); vec2h texcoord3; - texcoord3.x = io_read_half_t_stream_reverse_endianness(s); - texcoord3.y = io_read_half_t_stream_reverse_endianness(s); + texcoord3.x = s.read_half_t_reverse_endianness(); + texcoord3.y = s.read_half_t_reverse_endianness(); vec2h_to_vec2(texcoord3, vtx[i].texcoord3); } vec4h color; - color.x = io_read_half_t_stream_reverse_endianness(s); - color.y = io_read_half_t_stream_reverse_endianness(s); - color.z = io_read_half_t_stream_reverse_endianness(s); - color.w = io_read_half_t_stream_reverse_endianness(s); + color.x = s.read_half_t_reverse_endianness(); + color.y = s.read_half_t_reverse_endianness(); + color.z = s.read_half_t_reverse_endianness(); + color.w = s.read_half_t_reverse_endianness(); vec4h_to_vec4(color, vtx[i].color0); 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); - bone_weight.z = (float_t)io_read_int16_t_stream_reverse_endianness(s); - bone_weight.w = (float_t)io_read_int16_t_stream_reverse_endianness(s); + bone_weight.x = (float_t)s.read_int16_t_reverse_endianness(); + bone_weight.y = (float_t)s.read_int16_t_reverse_endianness(); + bone_weight.z = (float_t)s.read_int16_t_reverse_endianness(); + bone_weight.w = (float_t)s.read_int16_t_reverse_endianness(); vec4_div_min_max_scalar(bone_weight, -32768.0f, 32767.0f, bone_weight); vtx[i].bone_weight = bone_weight; vec4i bone_index; - bone_index.x = (int32_t)io_read_uint8_t(s); - bone_index.y = (int32_t)io_read_uint8_t(s); - bone_index.z = (int32_t)io_read_uint8_t(s); - bone_index.w = (int32_t)io_read_uint8_t(s); + bone_index.x = (int32_t)s.read_uint8_t(); + bone_index.y = (int32_t)s.read_uint8_t(); + bone_index.z = (int32_t)s.read_uint8_t(); + bone_index.w = (int32_t)s.read_uint8_t(); if (bone_index.x == 0xFF) bone_index.x = -1; if (bone_index.y == 0xFF) @@ -6673,7 +6646,7 @@ static void obj_modern_read_vertex(obj* obj, stream* s, int64_t* vertex, obj_mes mesh->vertex_format = vertex_format; } -static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, +static void obj_modern_write_vertex(obj* obj, stream& s, bool is_x, int64_t* vertex, obj_mesh* mesh, uint32_t* vertex_flags, uint32_t* num_vertex, uint32_t* size_vertex, f2_struct* ovtx) { @@ -6722,76 +6695,76 @@ static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, } bool has_tangents = false; - vertex[13] = io_get_position(s); + vertex[13] = s.get_position(); 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); - io_write_float_t(s, position.z); + s.write_float_t(position.x); + s.write_float_t(position.y); + s.write_float_t(position.z); vec3 normal; vec3_mult_min_max_scalar(vtx[i].normal, -32768.0f, 32767.0f, normal); - io_write_int16_t(s, (int16_t)roundf(normal.x)); - io_write_int16_t(s, (int16_t)roundf(normal.y)); - io_write_int16_t(s, (int16_t)roundf(normal.z)); - io_write(s, 0x02); + s.write_int16_t((int16_t)roundf(normal.x)); + s.write_int16_t((int16_t)roundf(normal.y)); + s.write_int16_t((int16_t)roundf(normal.z)); + s.write(0x02); vec4 tangent = vtx[i].tangent; vec4_mult_min_max_scalar(tangent, -32768.0f, 32767.0f, tangent); - io_write_int16_t(s, (int16_t)roundf(tangent.x)); - io_write_int16_t(s, (int16_t)roundf(tangent.y)); - io_write_int16_t(s, (int16_t)roundf(tangent.z)); - io_write_int16_t(s, (int16_t)roundf(tangent.w)); + s.write_int16_t((int16_t)roundf(tangent.x)); + s.write_int16_t((int16_t)roundf(tangent.y)); + s.write_int16_t((int16_t)roundf(tangent.z)); + s.write_int16_t((int16_t)roundf(tangent.w)); vec2h texcoord0; vec2_to_vec2h(vtx[i].texcoord0, texcoord0); - io_write_half_t(s, texcoord0.x); - io_write_half_t(s, texcoord0.y); + s.write_half_t(texcoord0.x); + s.write_half_t(texcoord0.y); vec2h texcoord1; vec2_to_vec2h(vtx[i].texcoord1, texcoord1); - io_write_half_t(s, texcoord1.x); - io_write_half_t(s, texcoord1.y); + s.write_half_t(texcoord1.x); + s.write_half_t(texcoord1.y); 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); + s.write_half_t(texcoord2.x); + s.write_half_t(texcoord2.y); } else if (_vertex_flags == 0x0A) { vec2h texcoord2; vec2_to_vec2h(vtx[i].texcoord2, texcoord2); - io_write_half_t(s, texcoord2.x); - io_write_half_t(s, texcoord2.y); + s.write_half_t(texcoord2.x); + s.write_half_t(texcoord2.y); vec2h texcoord3; vec2_to_vec2h(vtx[i].texcoord3, texcoord3); - io_write_half_t(s, texcoord3.x); - io_write_half_t(s, texcoord3.y); + s.write_half_t(texcoord3.x); + s.write_half_t(texcoord3.y); } vec4h color; vec4_to_vec4h(vtx[i].color0, color); - io_write_half_t(s, color.x); - io_write_half_t(s, color.y); - io_write_half_t(s, color.z); - io_write_half_t(s, color.w); + s.write_half_t(color.x); + s.write_half_t(color.y); + s.write_half_t(color.z); + s.write_half_t(color.w); 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); - io_write_int16_t(s, (int16_t)bone_weight.y); - io_write_int16_t(s, (int16_t)bone_weight.z); - io_write_int16_t(s, (int16_t)bone_weight.w); + s.write_int16_t((int16_t)bone_weight.x); + s.write_int16_t((int16_t)bone_weight.y); + s.write_int16_t((int16_t)bone_weight.z); + s.write_int16_t((int16_t)bone_weight.w); vec4u8 bone_index; vec4_to_vec4u8(vtx[i].bone_index, bone_index) - io_write_uint8_t(s, bone_index.x); - io_write_uint8_t(s, bone_index.y); - io_write_uint8_t(s, bone_index.z); - io_write_uint8_t(s, bone_index.w); + s.write_uint8_t(bone_index.x); + s.write_uint8_t(bone_index.y); + s.write_uint8_t(bone_index.z); + s.write_uint8_t(bone_index.w); } } @@ -6801,7 +6774,7 @@ static void obj_modern_write_vertex(obj* obj, stream* s, bool is_x, } inline static void obj_skin_block_node_free(obj_skin_block_node* b) { - string_free(&b->parent_name); + free(b->parent_name); } inline static uint32_t obj_skin_strings_get_string_index(std::vector& vec, const char* str) { diff --git a/src/KKdLib/obj.hpp b/src/KKdLib/obj.hpp index 94946686..b71aa69d 100644 --- a/src/KKdLib/obj.hpp +++ b/src/KKdLib/obj.hpp @@ -5,11 +5,9 @@ #pragma once -#include "default.h" -#include "kf.h" -#include "mat.h" -#include "string.h" -#include "vec.h" +#include "default.hpp" +#include "mat.hpp" +#include "vec.hpp" enum obj_index_format : uint32_t { OBJ_INDEX_U8 = 0x00, @@ -395,7 +393,7 @@ struct obj_mesh { }; struct obj_skin_block_cloth_field_1C_sub { - string bone_name; + char* bone_name; float_t weight; uint32_t matrix_index; uint32_t field_C; @@ -434,15 +432,15 @@ struct obj_skin_block_cloth_field_20 { }; struct obj_skin_block_node { - string parent_name; + char* parent_name; vec3 position; vec3 rotation; vec3 scale; }; struct obj_skin_block_cloth { - string mesh_name; - string backface_mesh_name; + char* mesh_name; + char* backface_mesh_name; uint32_t field_8; uint32_t count; uint32_t field_10; @@ -469,7 +467,7 @@ struct obj_skin_block_constraint_up_vector { float_t roll; vec3 affected_axis; vec3 point_at; - string name; + char* name; }; struct obj_skin_block_constraint_direction { @@ -498,7 +496,7 @@ struct obj_skin_block_constraint_position { struct obj_skin_block_constraint { obj_skin_block_node base; uint32_t name_index; - string source_node_name; + char* source_node_name; obj_skin_block_constraint_coupling coupling; obj_skin_block_constraint_type type; union { @@ -513,7 +511,7 @@ struct obj_skin_block_expression { obj_skin_block_node base; uint32_t name_index; uint32_t expressions_count; - string expressions[9]; + char* expressions[9]; }; struct obj_skin_motion_node { @@ -524,7 +522,7 @@ struct obj_skin_motion_node { struct obj_skin_block_motion { obj_skin_block_node base; union { - string name; + char* name; uint32_t name_index; }; obj_skin_motion_node* nodes; @@ -555,7 +553,7 @@ struct obj_skin_osage_root_node { float_t rot_z; float_t hinge_y; float_t hinge_z; - string name; + char* name; obj_skin_osage_root_coli* coli; int32_t coli_count; float_t coli_r; @@ -574,7 +572,7 @@ struct obj_skin_block_osage { bool root_init; uint32_t external_name_index; uint32_t name_index; - string motion_node_name; + char* motion_node_name; }; struct obj_skin_block { @@ -612,7 +610,7 @@ struct obj_skin_bone { uint32_t id; uint32_t parent; mat4u inv_bind_pose_mat; - string name; + char* name; }; struct obj_skin { @@ -632,7 +630,7 @@ struct obj { uint32_t reserved[10]; obj_skin skin; bool skin_init; - string name; + char* name; uint32_t id; uint32_t hash; }; @@ -652,5 +650,5 @@ struct obj_set { virtual ~obj_set(); void pack_file(void** data, size_t* size); - void unpack_file(void* data, size_t size, bool modern); + void unpack_file(const void* data, size_t size, bool modern); }; diff --git a/src/KKdLib/pv_db.hpp b/src/KKdLib/pv_db.hpp index 39740c4a..86946ccb 100644 --- a/src/KKdLib/pv_db.hpp +++ b/src/KKdLib/pv_db.hpp @@ -7,7 +7,7 @@ #include #include -#include "default.h" +#include "default.hpp" #include "database/item_table.hpp" enum pv_db_chreff_type { diff --git a/src/KKdLib/pv_exp.cpp b/src/KKdLib/pv_exp.cpp index 68799e19..25697881 100644 --- a/src/KKdLib/pv_exp.cpp +++ b/src/KKdLib/pv_exp.cpp @@ -5,14 +5,14 @@ #include "pv_exp.hpp" #include "f2/struct.hpp" -#include "io/path.h" -#include "io/stream.h" -#include "str_utils.h" +#include "io/path.hpp" +#include "io/stream.hpp" +#include "str_utils.hpp" -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); +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() { @@ -46,17 +46,15 @@ void pv_exp::read(const char* path, bool modern) { char* path_bin = str_utils_add(path, ".bin"); if (path_check_file_exists(path_bin)) { stream s; - io_open(&s, path_bin, "rb"); + s.open(path_bin, "rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); - io_read(&s, data, s.length); + s.read(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); + s_bin.open(data, s.length); + pv_exp_classic_read_inner(this, s_bin); free(data); } - io_free(&s); } free(path_bin); } @@ -67,10 +65,9 @@ void pv_exp::read(const char* path, bool modern) { st.read(path_dex); if (st.header.signature == reverse_endianness_uint32_t('EXPC')) { stream s_expc; - io_open(&s_expc, &st.data); + s_expc.open(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); + pv_exp_modern_read_inner(this, s_expc, st.header.length); } } free(path_dex); @@ -85,17 +82,15 @@ void pv_exp::read(const wchar_t* path, bool 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"); + s.open(path_bin, L"rb"); if (s.io.stream) { uint8_t* data = force_malloc_s(uint8_t, s.length); - io_read(&s, data, s.length); + s.read(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); + s_bin.open(data, s.length); + pv_exp_classic_read_inner(this, s_bin); free(data); } - io_free(&s); } free(path_bin); } @@ -106,10 +101,9 @@ void pv_exp::read(const wchar_t* path, bool modern) { st.read(path_dex); if (st.header.signature == reverse_endianness_uint32_t('EXPC')) { stream s_expc; - io_open(&s_expc, &st.data); + s_expc.open(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); + pv_exp_modern_read_inner(this, s_expc, st.header.length); } } free(path_dex); @@ -122,19 +116,17 @@ void pv_exp::read(const void* data, size_t size, bool modern) { if (!modern) { stream s; - io_open(&s, data, size); - pv_exp_classic_read_inner(this, &s); - io_free(&s); + s.open(data, size); + pv_exp_classic_read_inner(this, 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.open(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); + pv_exp_modern_read_inner(this, s_expc, st.header.length); } } } @@ -146,19 +138,17 @@ void pv_exp::write(const char* path) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); stream s; - io_open(&s, path_bin, "wb"); + s.open(path_bin, "wb"); if (s.io.stream) - pv_exp_classic_write_inner(this, &s); - io_free(&s); + pv_exp_classic_write_inner(this, s); free(path_bin); } else { char* path_dex = str_utils_add(path, ".dex"); stream s; - io_open(&s, path_dex, "wb"); + s.open(path_dex, "wb"); if (s.io.stream) - pv_exp_modern_write_inner(this, &s); - io_free(&s); + pv_exp_modern_write_inner(this, s); free(path_dex); } } @@ -170,19 +160,17 @@ void pv_exp::write(const wchar_t* path) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); stream s; - io_open(&s, path_bin, L"wb"); + s.open(path_bin, L"wb"); if (s.io.stream) - pv_exp_classic_write_inner(this, &s); - io_free(&s); + pv_exp_classic_write_inner(this, s); free(path_bin); } else { wchar_t* path_dex = str_utils_add(path, L".dex"); stream s; - io_open(&s, path_dex, L"wb"); + s.open(path_dex, L"wb"); if (s.io.stream) - pv_exp_modern_write_inner(this, &s); - io_free(&s); + pv_exp_modern_write_inner(this, s); free(path_dex); } } @@ -192,14 +180,13 @@ void pv_exp::write(void** data, size_t* size) { return; stream s; - io_open(&s); + s.open(); if (!modern) - pv_exp_classic_write_inner(this, &s); + 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); + pv_exp_modern_write_inner(this, s); + s.align_write(0x10); + s.copy(data, size); } bool pv_exp::load_file(void* data, const char* path, const char* file, uint32_t hash) { @@ -217,18 +204,18 @@ bool pv_exp::load_file(void* data, const char* path, const char* file, uint32_t return exp->ready; } -static void pv_exp_classic_read_inner(pv_exp* exp, stream* s) { +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_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_read_inner(pv_exp* exp, stream& s, uint32_t header_length) { } -static void pv_exp_modern_write_inner(pv_exp* exp, stream* s) { +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 index 5081ebfa..a2e3fcae 100644 --- a/src/KKdLib/pv_exp.hpp +++ b/src/KKdLib/pv_exp.hpp @@ -7,7 +7,7 @@ #include #include -#include "default.h" +#include "default.hpp" struct pv_exp_data { float_t frame; diff --git a/src/KKdLib/pvpp.cpp b/src/KKdLib/pvpp.cpp index 587c210b..2814b904 100644 --- a/src/KKdLib/pvpp.cpp +++ b/src/KKdLib/pvpp.cpp @@ -5,21 +5,21 @@ #include "pvpp.hpp" #include "f2/struct.hpp" -#include "io/path.h" -#include "io/stream.h" +#include "io/path.hpp" +#include "io/stream.hpp" #include "hash.hpp" -#include "str_utils.h" +#include "str_utils.hpp" -static void pvpp_a3da_read(pvpp_a3da* a3d, stream* s); -static void pvpp_chara_read(pvpp_chara* chr, stream* s); -static void pvpp_chara_effect_read(pvpp_chara_effect* chr_eff, stream* s); -static void pvpp_chara_effect_a3da_read(pvpp_chara_effect_a3da* chr_pv_eff, stream* s); -static void pvpp_chara_item_read(pvpp_chara_item* chr_itm, stream* s); -static void pvpp_effect_read(pvpp_effect* eff, stream* s); -static void pvpp_glitter_read(pvpp_glitter* glt, stream* s); -static void pvpp_motion_read(pvpp_motion* mot, stream* s); -static void pvpp_object_set_read(pvpp_object_set* objset, stream* s); -static void pvpp_read_inner(pvpp* pp, stream* s); +static void pvpp_a3da_read(pvpp_a3da* a3d, stream& s); +static void pvpp_chara_read(pvpp_chara* chr, stream& s); +static void pvpp_chara_effect_read(pvpp_chara_effect* chr_eff, stream& s); +static void pvpp_chara_effect_a3da_read(pvpp_chara_effect_a3da* chr_pv_eff, stream& s); +static void pvpp_chara_item_read(pvpp_chara_item* chr_itm, stream& s); +static void pvpp_effect_read(pvpp_effect* eff, stream& s); +static void pvpp_glitter_read(pvpp_glitter* glt, stream& s); +static void pvpp_motion_read(pvpp_motion* mot, stream& s); +static void pvpp_object_set_read(pvpp_object_set* objset, stream& s); +static void pvpp_read_inner(pvpp* pp, stream& s); pvpp::pvpp() : ready() { @@ -36,10 +36,9 @@ void pvpp::read(const char* path) { char* path_pvpp = str_utils_add(path, ".pvpp"); if (path_check_file_exists(path_pvpp)) { stream s; - io_open(&s, path_pvpp, "rb"); + s.open(path_pvpp, "rb"); if (s.io.stream) - pvpp_read_inner(this, &s); - io_free(&s); + pvpp_read_inner(this, s); } free(path_pvpp); } @@ -51,10 +50,9 @@ void pvpp::read(const wchar_t* path) { wchar_t* path_pvpp = str_utils_add(path, L".pvpp"); if (path_check_file_exists(path_pvpp)) { stream s; - io_open(&s, path_pvpp, L"rb"); + s.open(path_pvpp, L"rb"); if (s.io.stream) - pvpp_read_inner(this, &s); - io_free(&s); + pvpp_read_inner(this, s); } free(path_pvpp); } @@ -64,9 +62,8 @@ void pvpp::read(const void* data, size_t size) { return; stream s; - io_open(&s, data, size); - pvpp_read_inner(this, &s); - io_free(&s); + s.open(data, size); + pvpp_read_inner(this, s); } bool pvpp::load_file(void* data, const char* path, const char* file, uint32_t hash) { @@ -157,204 +154,202 @@ pvpp_object_set::~pvpp_object_set() { } -static void pvpp_a3da_read(pvpp_a3da* a3d, stream* s) { - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &a3d->name); - a3d->hash = io_read_uint32_t_stream_reverse_endianness(s); - io_align_read(s, 0x08); +static void pvpp_a3da_read(pvpp_a3da* a3d, stream& s) { + a3d->name = s.read_string_null_terminated_offset(s.read_offset_x()); + a3d->hash = s.read_uint32_t_reverse_endianness(); + s.align_read(0x08); } -static void pvpp_chara_read(pvpp_chara* chr, stream* s) { - int8_t u00 = io_read_int8_t(s); - int8_t u01 = io_read_int8_t(s); - int8_t motion_count = io_read_int8_t(s); - int8_t a3da_count = io_read_int8_t(s); - int8_t item_count = io_read_int8_t(s); - int8_t u05 = io_read_int8_t(s); - int8_t glitter_count = io_read_int8_t(s); - int8_t u07 = io_read_int8_t(s); - size_t chr_eff_offset = io_read_offset_x(s); - size_t motion_offset = io_read_offset_x(s); - size_t a3da_offset = io_read_offset_x(s); - size_t item_offset = io_read_offset_x(s); - size_t glitter_offset = io_read_offset_x(s); - size_t o30 = io_read_offset_x(s); +static void pvpp_chara_read(pvpp_chara* chr, stream& s) { + int8_t u00 = s.read_int8_t(); + int8_t u01 = s.read_int8_t(); + int8_t motion_count = s.read_int8_t(); + int8_t a3da_count = s.read_int8_t(); + int8_t item_count = s.read_int8_t(); + int8_t u05 = s.read_int8_t(); + int8_t glitter_count = s.read_int8_t(); + int8_t u07 = s.read_int8_t(); + size_t chr_eff_offset = s.read_offset_x(); + size_t motion_offset = s.read_offset_x(); + size_t a3da_offset = s.read_offset_x(); + size_t item_offset = s.read_offset_x(); + size_t glitter_offset = s.read_offset_x(); + size_t o30 = s.read_offset_x(); chr->chara_effect_init = false; if (chr_eff_offset) { - io_position_push(s, chr_eff_offset, SEEK_SET); + s.position_push(chr_eff_offset, SEEK_SET); pvpp_chara_effect_read(&chr->chara_effect, s); chr->chara_effect_init = true; - io_position_pop(s); + s.position_pop(); } chr->motion.resize(motion_count); - io_position_push(s, motion_offset, SEEK_SET); + s.position_push(motion_offset, SEEK_SET); for (pvpp_motion& i : chr->motion) { - io_position_push(s, io_read_offset_x(s), SEEK_SET); + s.position_push(s.read_offset_x(), SEEK_SET); pvpp_motion_read(&i, s); - io_position_pop(s); + s.position_pop(); } - io_position_pop(s); + s.position_pop(); chr->a3da.resize(a3da_count); - io_position_push(s, a3da_offset, SEEK_SET); + s.position_push(a3da_offset, SEEK_SET); for (pvpp_a3da& i : chr->a3da) pvpp_a3da_read(&i, s); - io_position_pop(s); + s.position_pop(); chr->item.resize(item_count); - io_position_push(s, item_offset, SEEK_SET); + s.position_push(item_offset, SEEK_SET); for (pvpp_chara_item& i : chr->item) pvpp_chara_item_read(&i, s); - io_position_pop(s); + s.position_pop(); chr->glitter.resize(glitter_count); - io_position_push(s, glitter_offset, SEEK_SET); + s.position_push(glitter_offset, SEEK_SET); for (pvpp_glitter& i : chr->glitter) pvpp_glitter_read(&i, s); - io_position_pop(s); + s.position_pop(); } -static void pvpp_chara_effect_read(pvpp_chara_effect* chr_eff, stream* s) { - chr_eff->base_chara = (pvpp_chara_type)io_read_uint8_t(s); - int8_t pv_effects_count = io_read_int8_t(s); - chr_eff->chara_index = (pvpp_chara_index)io_read_uint8_t(s); - size_t pv_effects_offstet = io_read_offset_x(s); +static void pvpp_chara_effect_read(pvpp_chara_effect* chr_eff, stream& s) { + chr_eff->base_chara = (pvpp_chara_type)s.read_uint8_t(); + int8_t pv_effects_count = s.read_int8_t(); + chr_eff->chara_index = (pvpp_chara_index)s.read_uint8_t(); + size_t pv_effects_offstet = s.read_offset_x(); chr_eff->effect_a3da.resize(pv_effects_count); - io_position_push(s, pv_effects_offstet, SEEK_SET); + s.position_push(pv_effects_offstet, SEEK_SET); for (pvpp_chara_effect_a3da& i : chr_eff->effect_a3da) pvpp_chara_effect_a3da_read(&i, s); - io_position_pop(s); + s.position_pop(); } -static void pvpp_chara_effect_a3da_read(pvpp_chara_effect_a3da* chr_eff_a3da, stream* s) { - chr_eff_a3da->u00 = io_read_uint8_t(s); - chr_eff_a3da->u01 = io_read_uint8_t(s); - chr_eff_a3da->u02 = io_read_uint8_t(s); - chr_eff_a3da->u03 = io_read_uint8_t(s); - chr_eff_a3da->u04 = io_read_uint8_t(s); - chr_eff_a3da->u05 = io_read_uint8_t(s); - chr_eff_a3da->u06 = io_read_uint8_t(s); - chr_eff_a3da->u07 = io_read_uint8_t(s); - size_t a3da_offset = io_read_offset_x(s); - size_t source_a3da_offset = io_read_offset_x(s); +static void pvpp_chara_effect_a3da_read(pvpp_chara_effect_a3da* chr_eff_a3da, stream& s) { + chr_eff_a3da->u00 = s.read_uint8_t(); + chr_eff_a3da->u01 = s.read_uint8_t(); + chr_eff_a3da->u02 = s.read_uint8_t(); + chr_eff_a3da->u03 = s.read_uint8_t(); + chr_eff_a3da->u04 = s.read_uint8_t(); + chr_eff_a3da->u05 = s.read_uint8_t(); + chr_eff_a3da->u06 = s.read_uint8_t(); + chr_eff_a3da->u07 = s.read_uint8_t(); + size_t a3da_offset = s.read_offset_x(); + size_t source_a3da_offset = s.read_offset_x(); - io_position_push(s, a3da_offset, SEEK_SET); + s.position_push(a3da_offset, SEEK_SET); pvpp_a3da_read(&chr_eff_a3da->a3da, s); - io_position_pop(s); + s.position_pop(); chr_eff_a3da->has_object_set = false; if (source_a3da_offset) { - io_position_push(s, source_a3da_offset, SEEK_SET); + s.position_push(source_a3da_offset, SEEK_SET); pvpp_object_set_read(&chr_eff_a3da->object_set, s); chr_eff_a3da->has_object_set = true; - io_position_pop(s); + s.position_pop(); } } -static void pvpp_chara_item_read(pvpp_chara_item* chr_itm, stream* s) { - int8_t a3das_count = io_read_int8_t(s); - size_t a3das_offset = io_read_offset_x(s); - size_t bone_offset = io_read_offset_x(s); - chr_itm->u18.x = io_read_float_t_stream_reverse_endianness(s); - chr_itm->u18.y = io_read_float_t_stream_reverse_endianness(s); - chr_itm->u18.z = io_read_float_t_stream_reverse_endianness(s); - chr_itm->u18.w = io_read_float_t_stream_reverse_endianness(s); +static void pvpp_chara_item_read(pvpp_chara_item* chr_itm, stream& s) { + int8_t a3das_count = s.read_int8_t(); + size_t a3das_offset = s.read_offset_x(); + size_t bone_offset = s.read_offset_x(); + chr_itm->u18.x = s.read_float_t_reverse_endianness(); + chr_itm->u18.y = s.read_float_t_reverse_endianness(); + chr_itm->u18.z = s.read_float_t_reverse_endianness(); + chr_itm->u18.w = s.read_float_t_reverse_endianness(); chr_itm->a3da.resize(a3das_count); - io_position_push(s, a3das_offset, SEEK_SET); + s.position_push(a3das_offset, SEEK_SET); for (pvpp_a3da& i : chr_itm->a3da) pvpp_a3da_read(&i, s); - io_position_pop(s); + s.position_pop(); - io_read_string_null_terminated_offset(s, bone_offset, &chr_itm->bone); + chr_itm->bone = s.read_string_null_terminated_offset(bone_offset); } -static void pvpp_effect_read(pvpp_effect* eff, stream* s) { - int8_t a3das_count = io_read_int8_t(s); - int8_t glitters_count = io_read_int8_t(s); - eff->chara_index = (pvpp_chara_type)io_read_uint8_t(s); - int64_t a3das_offset = io_read_offset_x(s); - int64_t glitters_offset = io_read_offset_x(s); +static void pvpp_effect_read(pvpp_effect* eff, stream& s) { + int8_t a3das_count = s.read_int8_t(); + int8_t glitters_count = s.read_int8_t(); + eff->chara_index = (pvpp_chara_type)s.read_uint8_t(); + int64_t a3das_offset = s.read_offset_x(); + int64_t glitters_offset = s.read_offset_x(); eff->a3da.resize(a3das_count); - io_position_push(s, a3das_offset, SEEK_SET); + s.position_push(a3das_offset, SEEK_SET); for (pvpp_a3da& i : eff->a3da) pvpp_a3da_read(&i, s); - io_position_pop(s); + s.position_pop(); eff->glitter.resize(glitters_count); - io_position_push(s, glitters_offset, SEEK_SET); + s.position_push(glitters_offset, SEEK_SET); for (pvpp_glitter& i : eff->glitter) pvpp_glitter_read(&i, s); - io_position_pop(s); + s.position_pop(); } -static void pvpp_glitter_read(pvpp_glitter* glt, stream* s) { - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &glt->name); - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &glt->unk1); - glt->unk2 = io_read_uint8_t(s) ? true : false; - io_align_read(s, 0x08); +static void pvpp_glitter_read(pvpp_glitter* glt, stream& s) { + glt->name = s.read_string_null_terminated_offset(s.read_offset_x()); + glt->unk1 = s.read_string_null_terminated_offset(s.read_offset_x()); + glt->unk2 = s.read_uint8_t() ? true : false; + s.align_read(0x08); } -static void pvpp_motion_read(pvpp_motion* mot, stream* s) { - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &mot->name); - mot->hash = io_read_uint32_t_stream_reverse_endianness(s); - io_align_read(s, 0x08); +static void pvpp_motion_read(pvpp_motion* mot, stream& s) { + mot->name = s.read_string_null_terminated_offset(s.read_offset_x()); + mot->hash = s.read_uint32_t_reverse_endianness(); + s.align_read(0x08); } -static void pvpp_object_set_read(pvpp_object_set* objset, stream* s) { - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &objset->name); - objset->hash = io_read_uint32_t_stream_reverse_endianness(s); - io_align_read(s, 0x08); +static void pvpp_object_set_read(pvpp_object_set* objset, stream& s) { + objset->name = s.read_string_null_terminated_offset(s.read_offset_x()); + objset->hash = s.read_uint32_t_reverse_endianness(); + s.align_read(0x08); } -static void pvpp_read_inner(pvpp* pp, stream* s) { +static void pvpp_read_inner(pvpp* pp, stream& s) { f2_struct st; st.read(s); if (st.header.signature != reverse_endianness_uint32_t('PVPP') || !st.data.data()) return; stream s_pvpp; - io_open(&s_pvpp, &st.data); + s_pvpp.open(st.data); s_pvpp.is_big_endian = st.header.use_big_endian; - io_read_uint32_t_stream_reverse_endianness(&s_pvpp); - int8_t chara_count = io_read_int8_t(&s_pvpp); - int64_t effect_offset = io_read_offset_x(&s_pvpp); - int64_t chara_offset = io_read_offset_x(&s_pvpp); - io_read_offset_x(&s_pvpp); + s_pvpp.read_uint32_t_reverse_endianness(); + int8_t chara_count = s_pvpp.read_int8_t(); + int64_t effect_offset = s_pvpp.read_offset_x(); + int64_t chara_offset = s_pvpp.read_offset_x(); + s_pvpp.read_offset_x(); pp->chara.resize(chara_count); - io_position_push(&s_pvpp, chara_offset, SEEK_SET); + s_pvpp.position_push(chara_offset, SEEK_SET); for (pvpp_chara& i : pp->chara) - pvpp_chara_read(&i, &s_pvpp); - io_position_pop(&s_pvpp); + pvpp_chara_read(&i, s_pvpp); + s_pvpp.position_pop(); - io_position_push(&s_pvpp, effect_offset, SEEK_SET); - io_read_uint8_t(&s_pvpp); - int8_t efffect_count = io_read_int8_t(&s_pvpp); - effect_offset = io_read_offset_x(&s_pvpp); - io_position_pop(&s_pvpp); + s_pvpp.position_push( effect_offset, SEEK_SET); + s_pvpp.read_uint8_t(); + int8_t efffect_count = s_pvpp.read_int8_t(); + effect_offset = s_pvpp.read_offset_x(); + s_pvpp.position_pop(); pp->effect.resize(efffect_count); - io_position_push(&s_pvpp, effect_offset, SEEK_SET); + s_pvpp.position_push(effect_offset, SEEK_SET); for (pvpp_effect& i : pp->effect) - pvpp_effect_read(&i, &s_pvpp); - io_position_pop(&s_pvpp); - - io_free(&s_pvpp); + pvpp_effect_read(&i, s_pvpp); + s_pvpp.position_pop(); pp->ready = true; } diff --git a/src/KKdLib/pvpp.hpp b/src/KKdLib/pvpp.hpp index e7271d4d..17789e5c 100644 --- a/src/KKdLib/pvpp.hpp +++ b/src/KKdLib/pvpp.hpp @@ -7,8 +7,8 @@ #include #include -#include "default.h" -#include "vec.h" +#include "default.hpp" +#include "vec.hpp" enum pvpp_chara_index { PVPP_CHARA_1P = 0, diff --git a/src/KKdLib/pvsr.cpp b/src/KKdLib/pvsr.cpp index c54d2182..c0da8313 100644 --- a/src/KKdLib/pvsr.cpp +++ b/src/KKdLib/pvsr.cpp @@ -5,20 +5,20 @@ #include "pvsr.hpp" #include "f2/struct.hpp" -#include "io/path.h" -#include "io/stream.h" +#include "io/path.hpp" +#include "io/stream.hpp" #include "hash.hpp" -#include "str_utils.h" +#include "str_utils.hpp" -static void pvsr_a3da_read(pvsr_a3da* a3d, stream* s); -static void pvsr_aet_read(pvsr_aet* aet_entry, stream* s); -static void pvsr_effect_read(pvsr_effect* eff, stream* s); -static void pvsr_glitter_read(pvsr_glitter* glt, stream* s); -static void pvsr_read_inner(pvsr* sr, stream* s); -static void pvsr_stage_effect_read(pvsr_stage_effect* stg_eff, stream* s); -static void pvsr_stage_effect_env_read(pvsr_stage_effect_env* aet, stream* s, int32_t x00); -static bool pvsr_stage_effect_env_sub1_read(pvsr_stage_effect_env_sub1* aet_sub1, stream* s, int64_t offset); -static bool pvsr_stage_effect_env_sub2_read(pvsr_stage_effect_env_sub2* aet_sub2, stream* s, int64_t offset); +static void pvsr_a3da_read(pvsr_a3da* a3d, stream& s); +static void pvsr_aet_read(pvsr_aet* aet_entry, stream& s); +static void pvsr_effect_read(pvsr_effect* eff, stream& s); +static void pvsr_glitter_read(pvsr_glitter* glt, stream& s); +static void pvsr_read_inner(pvsr* sr, stream& s); +static void pvsr_stage_effect_read(pvsr_stage_effect* stg_eff, stream& s); +static void pvsr_stage_effect_env_read(pvsr_stage_effect_env* aet, stream& s, int32_t x00); +static bool pvsr_stage_effect_env_sub1_read(pvsr_stage_effect_env_sub1* aet_sub1, stream& s, int64_t offset); +static bool pvsr_stage_effect_env_sub2_read(pvsr_stage_effect_env_sub2* aet_sub2, stream& s, int64_t offset); pvsr::pvsr() : ready(), stage_change_effect_init() { @@ -35,10 +35,9 @@ void pvsr::read(const char* path) { char* path_pvsr = str_utils_add(path, ".pvsr"); if (path_check_file_exists(path_pvsr)) { stream s; - io_open(&s, path_pvsr, "rb"); + s.open(path_pvsr, "rb"); if (s.io.stream) - pvsr_read_inner(this, &s); - io_free(&s); + pvsr_read_inner(this, s); } free(path_pvsr); } @@ -50,10 +49,9 @@ void pvsr::read(const wchar_t* path) { wchar_t* path_pvsr = str_utils_add(path, L".pvsr"); if (path_check_file_exists(path_pvsr)) { stream s; - io_open(&s, path_pvsr, L"rb"); + s.open(path_pvsr, L"rb"); if (s.io.stream) - pvsr_read_inner(this, &s); - io_free(&s); + pvsr_read_inner(this, s); } free(path_pvsr); } @@ -131,128 +129,125 @@ pvsr_stage_effect_env::~pvsr_stage_effect_env() { } -static void pvsr_a3da_read(pvsr_a3da* a3d, stream* s) { - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &a3d->name); - a3d->hash = io_read_uint32_t_stream_reverse_endianness(s); - io_align_read(s, 0x08); +static void pvsr_a3da_read(pvsr_a3da* a3d, stream& s) { + a3d->name = s.read_string_null_terminated_offset(s.read_offset_x()); + a3d->hash = s.read_uint32_t_reverse_endianness(); + s.align_read(0x08); } -static void pvsr_aet_read(pvsr_aet* aet_entry, stream* s) { - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &aet_entry->name); - aet_entry->hash = io_read_uint32_t_stream_reverse_endianness(s); - aet_entry->bright_scale = io_read_float_t_stream_reverse_endianness(s); +static void pvsr_aet_read(pvsr_aet* aet_entry, stream& s) { + aet_entry->name = s.read_string_null_terminated_offset(s.read_offset_x()); + aet_entry->hash = s.read_uint32_t_reverse_endianness(); + aet_entry->bright_scale = s.read_float_t_reverse_endianness(); } -static void pvsr_effect_read(pvsr_effect* eff, stream* s) { - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &eff->name); - eff->emission = io_read_float_t_stream_reverse_endianness(s); - io_align_read(s, 0x08); +static void pvsr_effect_read(pvsr_effect* eff, stream& s) { + eff->name = s.read_string_null_terminated_offset(s.read_offset_x()); + eff->emission = s.read_float_t_reverse_endianness(); + s.align_read(0x08); } -static void pvsr_glitter_read(pvsr_glitter* glt, stream* s) { - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &glt->name); - glt->unk1 = io_read_uint8_t(s); - io_align_read(s, 0x08); +static void pvsr_glitter_read(pvsr_glitter* glt, stream& s) { + glt->name = s.read_string_null_terminated_offset(s.read_offset_x()); + glt->unk1 = s.read_uint8_t(); + s.align_read(0x08); } -static void pvsr_read_inner(pvsr* sr, stream* s) { +static void pvsr_read_inner(pvsr* sr, stream& s) { f2_struct st; st.read(s); if (st.header.signature != reverse_endianness_uint32_t('PVSR') || !st.data.data()) return; stream s_pvsr; - io_open(&s_pvsr, &st.data); + s_pvsr.open(st.data); s_pvsr.is_big_endian = st.header.use_big_endian; - int32_t x00 = io_read_int32_t_stream_reverse_endianness(&s_pvsr); - uint8_t x04 = io_read_uint8_t(&s_pvsr); - uint8_t x05 = io_read_uint8_t(&s_pvsr); - uint8_t x06 = io_read_uint8_t(&s_pvsr); - uint8_t x07 = io_read_uint8_t(&s_pvsr); - int8_t stage_effect_count = io_read_int8_t(&s_pvsr); - int8_t stage_effect_envs_count = io_read_int8_t(&s_pvsr); - uint8_t x0a = io_read_uint8_t(&s_pvsr); - uint8_t x0b = io_read_uint8_t(&s_pvsr); - uint8_t x0c = io_read_uint8_t(&s_pvsr); - uint8_t x0d = io_read_uint8_t(&s_pvsr); - uint8_t x0e = io_read_uint8_t(&s_pvsr); - uint8_t x0f = io_read_uint8_t(&s_pvsr); - int64_t x10 = io_read_offset_x(&s_pvsr); - int64_t stage_effect_offset = io_read_offset_x(&s_pvsr); - int64_t stage_change_effect_offset = io_read_offset_x(&s_pvsr); - int64_t stage_effect_env_offset = io_read_offset_x(&s_pvsr); + int32_t x00 = s_pvsr.read_int32_t_reverse_endianness(); + uint8_t x04 = s_pvsr.read_uint8_t(); + uint8_t x05 = s_pvsr.read_uint8_t(); + uint8_t x06 = s_pvsr.read_uint8_t(); + uint8_t x07 = s_pvsr.read_uint8_t(); + int8_t stage_effect_count = s_pvsr.read_int8_t(); + int8_t stage_effect_envs_count = s_pvsr.read_int8_t(); + uint8_t x0a = s_pvsr.read_uint8_t(); + uint8_t x0b = s_pvsr.read_uint8_t(); + uint8_t x0c = s_pvsr.read_uint8_t(); + uint8_t x0d = s_pvsr.read_uint8_t(); + uint8_t x0e = s_pvsr.read_uint8_t(); + uint8_t x0f = s_pvsr.read_uint8_t(); + int64_t x10 = s_pvsr.read_offset_x(); + int64_t stage_effect_offset = s_pvsr.read_offset_x(); + int64_t stage_change_effect_offset = s_pvsr.read_offset_x(); + int64_t stage_effect_env_offset = s_pvsr.read_offset_x(); - io_position_push(&s_pvsr, x10, SEEK_SET); - int8_t unknown_count = io_read_int8_t(&s_pvsr); - int8_t effect_count = io_read_int8_t(&s_pvsr); - int8_t emcs_count = io_read_int8_t(&s_pvsr); - int64_t unknown_offset = io_read_offset_x(&s_pvsr); - int64_t effect_offset = io_read_offset_x(&s_pvsr); - int64_t emcs_offset = io_read_offset_x(&s_pvsr); - io_position_pop(&s_pvsr); + s_pvsr.position_push(x10, SEEK_SET); + int8_t unknown_count = s_pvsr.read_int8_t(); + int8_t effect_count = s_pvsr.read_int8_t(); + int8_t emcs_count = s_pvsr.read_int8_t(); + int64_t unknown_offset = s_pvsr.read_offset_x(); + int64_t effect_offset = s_pvsr.read_offset_x(); + int64_t emcs_offset = s_pvsr.read_offset_x(); + s_pvsr.position_pop(); sr->effect.resize(effect_count); - io_position_push(&s_pvsr, effect_offset, SEEK_SET); + s_pvsr.position_push(effect_offset, SEEK_SET); for (pvsr_effect& i : sr->effect) - pvsr_effect_read(&i, &s_pvsr); - io_position_pop(&s_pvsr); + pvsr_effect_read(&i, s_pvsr); + s_pvsr.position_pop(); sr->emcs.resize(emcs_count); - io_position_push(&s_pvsr, emcs_offset, SEEK_SET); + s_pvsr.position_push(emcs_offset, SEEK_SET); for (std::string& i : sr->emcs) - io_read_string_null_terminated_offset(&s_pvsr, - io_read_offset_x(&s_pvsr), &i); - io_position_pop(&s_pvsr); + i = s_pvsr.read_string_null_terminated_offset(s_pvsr.read_offset_x()); + s_pvsr.position_pop(); sr->stage_effect.resize(stage_effect_count); - io_position_push(&s_pvsr, stage_effect_offset, SEEK_SET); + s_pvsr.position_push(stage_effect_offset, SEEK_SET); for (pvsr_stage_effect& i : sr->stage_effect) - pvsr_stage_effect_read(&i, &s_pvsr); - io_position_pop(&s_pvsr); + pvsr_stage_effect_read(&i, s_pvsr); + s_pvsr.position_pop(); for (int32_t i = 0; i < PVSR_STAGE_CHANGE_EFFECT_COUNT; i++) for (int32_t j = 0; j < PVSR_STAGE_CHANGE_EFFECT_COUNT; j++) sr->stage_change_effect_init[i][j] = false; - io_position_push(&s_pvsr, stage_change_effect_offset, SEEK_SET); + s_pvsr.position_push(stage_change_effect_offset, SEEK_SET); for (int32_t i = 0; i < PVSR_STAGE_CHANGE_EFFECT_COUNT; i++) for (int32_t j = 0; j < PVSR_STAGE_CHANGE_EFFECT_COUNT; j++) { - int64_t offset = io_read_offset_x(&s_pvsr); + int64_t offset = s_pvsr.read_offset_x(); if (offset <= 0) continue; - io_position_push(&s_pvsr, offset, SEEK_SET); - pvsr_stage_effect_read(&sr->stage_change_effect[i][j], &s_pvsr); + s_pvsr.position_push(offset, SEEK_SET); + pvsr_stage_effect_read(&sr->stage_change_effect[i][j], s_pvsr); sr->stage_change_effect_init[i][j] = true; - io_position_pop(&s_pvsr); + s_pvsr.position_pop(); } - io_position_pop(&s_pvsr); + s_pvsr.position_pop(); sr->stage_effect_env.resize(stage_effect_envs_count); - io_position_push(&s_pvsr, stage_effect_env_offset, SEEK_SET); + s_pvsr.position_push(stage_effect_env_offset, SEEK_SET); for (pvsr_stage_effect_env& i : sr->stage_effect_env) - pvsr_stage_effect_env_read(&i, &s_pvsr, x00); - io_position_pop(&s_pvsr); - - io_free(&s_pvsr); + pvsr_stage_effect_env_read(&i, s_pvsr, x00); + s_pvsr.position_pop(); sr->ready = true; } -static void pvsr_stage_effect_read(pvsr_stage_effect* stg_eff, stream* s) { - uint8_t u00 = io_read_uint8_t(s); - uint8_t u01 = io_read_uint8_t(s); - uint8_t u02 = io_read_uint8_t(s); - uint8_t u03 = io_read_uint8_t(s); - stg_eff->bar_count = io_read_uint8_t(s); - int64_t a3da_offset = io_read_offset_x(s); - int64_t glitter_offset = io_read_offset_x(s); - io_read_offset_x(s); +static void pvsr_stage_effect_read(pvsr_stage_effect* stg_eff, stream& s) { + uint8_t u00 = s.read_uint8_t(); + uint8_t u01 = s.read_uint8_t(); + uint8_t u02 = s.read_uint8_t(); + uint8_t u03 = s.read_uint8_t(); + stg_eff->bar_count = s.read_uint8_t(); + int64_t a3da_offset = s.read_offset_x(); + int64_t glitter_offset = s.read_offset_x(); + s.read_offset_x(); uint8_t a3da_count; uint8_t glitter_count; @@ -267,80 +262,80 @@ static void pvsr_stage_effect_read(pvsr_stage_effect* stg_eff, stream* s) { stg_eff->a3da.resize(a3da_count); - io_position_push(s, a3da_offset, SEEK_SET); + s.position_push(a3da_offset, SEEK_SET); for (pvsr_a3da& i : stg_eff->a3da) pvsr_a3da_read(&i, s); - io_position_pop(s); + s.position_pop(); stg_eff->glitter.resize(glitter_count); - io_position_push(s, glitter_offset, SEEK_SET); + s.position_push(glitter_offset, SEEK_SET); for (pvsr_glitter& i : stg_eff->glitter) pvsr_glitter_read(&i, s); - io_position_pop(s); + s.position_pop(); } -static void pvsr_stage_effect_env_read(pvsr_stage_effect_env* aet, stream* s, int32_t x00) { - int64_t set_name_offset = io_read_offset_x(s); - int64_t front_offset = io_read_offset_x(s); - int64_t front_low_offset = io_read_offset_x(s); - int64_t back_offset = io_read_offset_x(s); - int64_t sub1_offset = io_read_offset_x(s); - int64_t sub2a_offset = io_read_offset_x(s); - int64_t sub2b_offset = io_read_offset_x(s); - int64_t sub2c_offset = io_read_offset_x(s); - int64_t sub2d_offset = io_read_offset_x(s); - aet->u48 = io_read_uint16_t_stream_reverse_endianness(s); - aet->u4a = io_read_uint16_t_stream_reverse_endianness(s); - aet->u4c = io_read_uint16_t_stream_reverse_endianness(s); - aet->u4e = io_read_uint16_t_stream_reverse_endianness(s); - aet->u50 = io_read_uint16_t_stream_reverse_endianness(s); - aet->u52 = io_read_uint16_t_stream_reverse_endianness(s); - aet->u54 = io_read_uint16_t_stream_reverse_endianness(s); - aet->u56 = io_read_uint16_t_stream_reverse_endianness(s); - aet->u58 = io_read_uint16_t_stream_reverse_endianness(s); - aet->u5a = io_read_uint16_t_stream_reverse_endianness(s); - aet->u5c = io_read_uint16_t_stream_reverse_endianness(s); - aet->u5e = io_read_uint16_t_stream_reverse_endianness(s); - aet->u60 = io_read_uint16_t_stream_reverse_endianness(s); - int8_t front_count = io_read_int8_t(s); - int8_t front_low_count = io_read_int8_t(s); - int8_t back_count = io_read_int8_t(s); - io_align_read(s, 0x08); +static void pvsr_stage_effect_env_read(pvsr_stage_effect_env* aet, stream& s, int32_t x00) { + int64_t set_name_offset = s.read_offset_x(); + int64_t front_offset = s.read_offset_x(); + int64_t front_low_offset = s.read_offset_x(); + int64_t back_offset = s.read_offset_x(); + int64_t sub1_offset = s.read_offset_x(); + int64_t sub2a_offset = s.read_offset_x(); + int64_t sub2b_offset = s.read_offset_x(); + int64_t sub2c_offset = s.read_offset_x(); + int64_t sub2d_offset = s.read_offset_x(); + aet->u48 = s.read_uint16_t_reverse_endianness(); + aet->u4a = s.read_uint16_t_reverse_endianness(); + aet->u4c = s.read_uint16_t_reverse_endianness(); + aet->u4e = s.read_uint16_t_reverse_endianness(); + aet->u50 = s.read_uint16_t_reverse_endianness(); + aet->u52 = s.read_uint16_t_reverse_endianness(); + aet->u54 = s.read_uint16_t_reverse_endianness(); + aet->u56 = s.read_uint16_t_reverse_endianness(); + aet->u58 = s.read_uint16_t_reverse_endianness(); + aet->u5a = s.read_uint16_t_reverse_endianness(); + aet->u5c = s.read_uint16_t_reverse_endianness(); + aet->u5e = s.read_uint16_t_reverse_endianness(); + aet->u60 = s.read_uint16_t_reverse_endianness(); + int8_t front_count = s.read_int8_t(); + int8_t front_low_count = s.read_int8_t(); + int8_t back_count = s.read_int8_t(); + s.align_read(0x08); int64_t o68 = 0; int64_t o70 = 0; int8_t u78 = 0; int8_t u79 = 0; if (x00 & 0x100) { - o68 = io_read_offset_x(s); - o70 = io_read_offset_x(s); - u78 = io_read_int8_t(s); - u79 = io_read_int8_t(s); - io_align_read(s, 0x08); + o68 = s.read_offset_x(); + o70 = s.read_offset_x(); + u78 = s.read_int8_t(); + u79 = s.read_int8_t(); + s.align_read(0x08); } - io_read_string_null_terminated_offset(s, set_name_offset, &aet->set_name); + aet->set_name = s.read_string_null_terminated_offset(set_name_offset); aet->aet_front.resize(front_count); - io_position_push(s, front_offset, SEEK_SET); + s.position_push(front_offset, SEEK_SET); for (pvsr_aet& i : aet->aet_front) pvsr_aet_read(&i, s); - io_position_pop(s); + s.position_pop(); aet->aet_front_low.resize(front_low_count); - io_position_push(s, front_low_offset, SEEK_SET); + s.position_push(front_low_offset, SEEK_SET); for (pvsr_aet& i : aet->aet_front_low) pvsr_aet_read(&i, s); - io_position_pop(s); + s.position_pop(); aet->aet_back.resize(back_count); - io_position_push(s, back_offset, SEEK_SET); + s.position_push(back_offset, SEEK_SET); for (pvsr_aet& i : aet->aet_back) pvsr_aet_read(&i, s); - io_position_pop(s); + s.position_pop(); aet->sub1_data_init = pvsr_stage_effect_env_sub1_read(&aet->sub1_data, s, sub1_offset); aet->sub2a_data_init = pvsr_stage_effect_env_sub2_read(&aet->sub2a_data, s, sub2a_offset); @@ -351,46 +346,46 @@ static void pvsr_stage_effect_env_read(pvsr_stage_effect_env* aet, stream* s, in if (x00 & 0x100) { aet->unk03.resize(u78); - io_position_push(s, o68, SEEK_SET); + s.position_push(o68, SEEK_SET); for (pvsr_aet& i : aet->unk03) pvsr_aet_read(&i, s); - io_position_pop(s); + s.position_pop(); aet->unk04.resize(u79); - io_position_push(s, o70, SEEK_SET); + s.position_push(o70, SEEK_SET); for (pvsr_aet& i : aet->unk04) pvsr_aet_read(&i, s); - io_position_pop(s); + s.position_pop(); } } -static bool pvsr_stage_effect_env_sub1_read(pvsr_stage_effect_env_sub1* aet_sub1, stream* s, int64_t offset) { +static bool pvsr_stage_effect_env_sub1_read(pvsr_stage_effect_env_sub1* aet_sub1, stream& s, int64_t offset) { if (offset <= 0) return false; - io_position_push(s, offset, SEEK_SET); - io_read_string_null_terminated_offset(s, io_read_offset_x(s), &aet_sub1->name); - aet_sub1->hash = io_read_uint32_t_stream_reverse_endianness(s); - aet_sub1->unk2 = io_read_uint16_t_stream_reverse_endianness(s); - io_align_read(s, 0x08); - io_position_pop(s); + s.position_push(offset, SEEK_SET); + aet_sub1->name = s.read_string_null_terminated_offset(s.read_offset_x()); + aet_sub1->hash = s.read_uint32_t_reverse_endianness(); + aet_sub1->unk2 = s.read_uint16_t_reverse_endianness(); + s.align_read(0x08); + s.position_pop(); return true; } -static bool pvsr_stage_effect_env_sub2_read(pvsr_stage_effect_env_sub2* aet_sub2, stream* s, int64_t offset) { +static bool pvsr_stage_effect_env_sub2_read(pvsr_stage_effect_env_sub2* aet_sub2, stream& s, int64_t offset) { if (offset <= 0) return false; - io_position_push(s, offset, SEEK_SET); - aet_sub2->u00 = io_read_uint16_t_stream_reverse_endianness(s); - aet_sub2->u02 = io_read_uint16_t_stream_reverse_endianness(s); - aet_sub2->u04 = io_read_uint16_t_stream_reverse_endianness(s); - aet_sub2->u06 = io_read_uint16_t_stream_reverse_endianness(s); - aet_sub2->u08 = io_read_uint16_t_stream_reverse_endianness(s); - aet_sub2->u0a = io_read_uint16_t_stream_reverse_endianness(s); - aet_sub2->u0c = io_read_uint16_t_stream_reverse_endianness(s); - io_align_read(s, 0x08); - io_position_pop(s); + s.position_push(offset, SEEK_SET); + aet_sub2->u00 = s.read_uint16_t_reverse_endianness(); + aet_sub2->u02 = s.read_uint16_t_reverse_endianness(); + aet_sub2->u04 = s.read_uint16_t_reverse_endianness(); + aet_sub2->u06 = s.read_uint16_t_reverse_endianness(); + aet_sub2->u08 = s.read_uint16_t_reverse_endianness(); + aet_sub2->u0a = s.read_uint16_t_reverse_endianness(); + aet_sub2->u0c = s.read_uint16_t_reverse_endianness(); + s.align_read(0x08); + s.position_pop(); return true; } diff --git a/src/KKdLib/pvsr.hpp b/src/KKdLib/pvsr.hpp index 1a482913..0114c2df 100644 --- a/src/KKdLib/pvsr.hpp +++ b/src/KKdLib/pvsr.hpp @@ -7,7 +7,7 @@ #include #include -#include "default.h" +#include "default.hpp" struct pvsr_a3da { std::string name; diff --git a/src/KKdLib/quat.c b/src/KKdLib/quat.cpp similarity index 99% rename from src/KKdLib/quat.c rename to src/KKdLib/quat.cpp index 8e00455f..3e51cc4e 100644 --- a/src/KKdLib/quat.c +++ b/src/KKdLib/quat.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "quat.h" +#include "quat.hpp" #include #include diff --git a/src/KKdLib/quat.h b/src/KKdLib/quat.hpp similarity index 93% rename from src/KKdLib/quat.h rename to src/KKdLib/quat.hpp index 854b8ae9..5fc1d3f6 100644 --- a/src/KKdLib/quat.h +++ b/src/KKdLib/quat.hpp @@ -5,8 +5,8 @@ #pragma once -#include "default.h" -#include "vec.h" +#include "default.hpp" +#include "vec.hpp" union quat { struct { diff --git a/src/KKdLib/quat_trans.h b/src/KKdLib/quat_trans.h index 50fc4287..f1dd0e4b 100644 --- a/src/KKdLib/quat_trans.h +++ b/src/KKdLib/quat_trans.h @@ -5,9 +5,9 @@ #pragma once -#include "default.h" -#include "quat.h" -#include "vec.h" +#include "default.hpp" +#include "quat.hpp" +#include "vec.hpp" struct quat_trans { quat quat; diff --git a/src/KKdLib/sort.cpp b/src/KKdLib/sort.cpp index f0675a0f..830e3d12 100644 --- a/src/KKdLib/sort.cpp +++ b/src/KKdLib/sort.cpp @@ -7,7 +7,7 @@ #include "sort.hpp" #include -#include "str_utils.h" +#include "str_utils.hpp" #define RADIX_BASE 8 #define RADIX (1 << RADIX_BASE) @@ -24,9 +24,7 @@ static int quicksort_ssize_t_compare(void const* src1, void const* src2); static int quicksort_size_t_compare(void const* src1, void const* src2); static int quicksort_char_ptr_compare(void const* src1, void const* src2); static int quicksort_wchar_t_ptr_compare(void const* src1, void const* src2); -static int quicksort_string_compare(void const* src1, void const* src2); static int quicksort_std_string_compare(void const* src1, void const* src2); -static int quicksort_wstring_compare(void const* src1, void const* src2); static int quicksort_std_wstring_compare(void const* src1, void const* src2); inline void radix_sort_int8_t(int8_t* arr, size_t n) { @@ -357,20 +355,12 @@ void quicksort_wchar_t_ptr(wchar_t** arr, size_t n) { qsort(arr, n, sizeof(wchar_t*), quicksort_wchar_t_ptr_compare); } -inline void quicksort_string(string* arr, size_t n) { - qsort(arr, n, sizeof(string), quicksort_string_compare); -} - inline void quicksort_string(std::string* arr, size_t n) { - qsort(arr, n, sizeof(string), quicksort_std_string_compare); -} - -inline void quicksort_wstring(wstring* arr, size_t n) { - qsort(arr, n, sizeof(wstring), quicksort_wstring_compare); + qsort(arr, n, sizeof(std::string), quicksort_std_string_compare); } inline void quicksort_wstring(std::wstring* arr, size_t n) { - qsort(arr, n, sizeof(wstring), quicksort_std_wstring_compare); + qsort(arr, n, sizeof(std::wstring), quicksort_std_wstring_compare); } inline void quicksort_custom(void* arr, size_t n, size_t s, quicksort_compare_func comp_finc) { @@ -449,13 +439,6 @@ static int quicksort_wchar_t_ptr_compare(void const* src1, void const* src2) { return str_utils_compare(str1, str2); } -static int quicksort_string_compare(void const* src1, void const* src2) { - string* str1 = (string*)src1; - string* str2 = (string*)src2; - return str_utils_compare_length(string_data(str1), str1->length, - string_data(str2), str2->length); -} - static int quicksort_std_string_compare(void const* src1, void const* src2) { std::string* str1 = (std::string*)src1; std::string* str2 = (std::string*)src2; @@ -463,13 +446,6 @@ static int quicksort_std_string_compare(void const* src1, void const* src2) { str2->c_str(), str2->size()); } -static int quicksort_wstring_compare(void const* src1, void const* src2) { - wstring* str1 = (wstring*)src1; - wstring* str2 = (wstring*)src2; - return str_utils_compare_length(wstring_data(str1), str1->length, - wstring_data(str2), str2->length); -} - static int quicksort_std_wstring_compare(void const* src1, void const* src2) { std::wstring* str1 = (std::wstring*)src1; std::wstring* str2 = (std::wstring*)src2; diff --git a/src/KKdLib/sort.hpp b/src/KKdLib/sort.hpp index 52b8f46f..c4fb73d9 100644 --- a/src/KKdLib/sort.hpp +++ b/src/KKdLib/sort.hpp @@ -8,8 +8,7 @@ #pragma once #include -#include "default.h" -#include "string.h" +#include "default.hpp" typedef size_t(*radix_index_func)(void* data, size_t index); typedef int(*quicksort_compare_func)(void const* src1, void const* src2); @@ -76,8 +75,6 @@ extern void quicksort_ssize_t(ssize_t* arr, size_t n); extern void quicksort_size_t(size_t* arr, size_t n); extern void quicksort_char_ptr(char** arr, size_t n); extern void quicksort_wchar_t_ptr(wchar_t** arr, size_t n); -extern void quicksort_string(string* arr, size_t n); extern void quicksort_string(std::string* arr, size_t n); -extern void quicksort_wstring(wstring* arr, size_t n); extern void quicksort_wstring(std::wstring* arr, size_t n); extern void quicksort_custom(void* arr, size_t n, size_t s, quicksort_compare_func comp_finc); diff --git a/src/KKdLib/sound/diva.c b/src/KKdLib/sound/diva.cpp similarity index 83% rename from src/KKdLib/sound/diva.c rename to src/KKdLib/sound/diva.cpp index c4488b2c..13402ae5 100644 --- a/src/KKdLib/sound/diva.c +++ b/src/KKdLib/sound/diva.cpp @@ -3,10 +3,10 @@ GitHub/GitLab: korenkonder */ -#include "diva.h" -#include "wav.h" -#include "../io/stream.h" -#include "../str_utils.h" +#include "diva.hpp" +#include "wav.hpp" +#include "../io/stream.hpp" +#include "../str_utils.hpp" static const int8_t ima_index_table[] = { -1, -1, -1, -1, 2, 4, 6, 8, @@ -46,20 +46,20 @@ void diva_read(diva* d, const char* path) { void diva_read(diva* d, const wchar_t* path) { wchar_t* path_diva = str_utils_add(path, L".diva"); stream s; - io_open(&s, path_diva, L"rb"); + s.open(path_diva, L"rb"); if (s.io.stream) { - uint32_t signature = io_read_uint32_t_reverse_endianness(&s, true); + uint32_t signature = s.read_uint32_t_reverse_endianness(true); if (signature != 'DIVA') goto End; - io_read_uint32_t(&s); - d->size = io_read_uint32_t(&s); - d->sample_rate = io_read_uint32_t(&s); - d->samples_count = io_read_uint32_t(&s); - d->loop_start = io_read_uint32_t(&s); - d->loop_end = io_read_uint32_t(&s); - d->channels = io_read_uint32_t(&s); - io_set_position(&s, io_get_position(&s) + 0x20, SEEK_SET); + s.read_uint32_t(); + d->size = s.read_uint32_t(); + d->sample_rate = s.read_uint32_t(); + d->samples_count = s.read_uint32_t(); + d->loop_start = s.read_uint32_t(); + d->loop_end = s.read_uint32_t(); + d->channels = s.read_uint32_t(); + s.set_position(s.get_position() + 0x20, SEEK_SET); uint8_t nibble = 0; uint8_t value = 0; @@ -76,7 +76,7 @@ void diva_read(diva* d, const wchar_t* path) { for (size_t i = 0; i < samples_count; i++) for (size_t c = 0; c < ch; c++, current_sample++) { if (~current_sample & 0x01) - value = io_read_uint8_t(&s); + value = s.read_uint8_t(); nibble = (current_sample & 1 ? value : value >> 4) & 0x0F; ima_decode(nibble, current + c, current_clamp + c, step_index + c); @@ -90,7 +90,6 @@ void diva_read(diva* d, const wchar_t* path) { free(data); } End: - io_free(&s); free(path_diva); } @@ -109,20 +108,20 @@ void diva_write(diva* d, const wchar_t* path) { wchar_t* path_diva = str_utils_add(path, L".diva"); stream s; - io_open(&s, path_diva, L"wb"); + s.open(path_diva, L"wb"); if (s.io.stream) { - io_write_uint32_t_reverse_endianness(&s, 'DIVA', true); - io_write_uint32_t(&s, 0); - io_write_uint32_t(&s, align_val_divide(d->samples_count * d->channels, 2, 2)); - io_write_uint32_t(&s, d->sample_rate); - io_write_uint32_t(&s, d->samples_count); - io_write_uint32_t(&s, 0); - io_write_uint32_t(&s, 0); - io_write_uint32_t(&s, d->channels); - io_write_uint64_t(&s, 0); - io_write_uint64_t(&s, 0); - io_write_uint64_t(&s, 0); - io_write_uint64_t(&s, 0); + s.write_uint32_t_reverse_endianness('DIVA', true); + s.write_uint32_t(0); + s.write_uint32_t(align_val_divide(d->samples_count * d->channels, 2, 2)); + s.write_uint32_t(d->sample_rate); + s.write_uint32_t(d->samples_count); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint32_t(d->channels); + s.write_uint64_t(0); + s.write_uint64_t(0); + s.write_uint64_t(0); + s.write_uint64_t(0); uint8_t nibble = 0; uint8_t value = 0; @@ -141,18 +140,17 @@ void diva_write(diva* d, const wchar_t* path) { current + c, current_clamp + c, step_index + c); value |= current_sample & 1 ? nibble : nibble << 4; if (current_sample & 1) { - io_write_uint8_t(&s, value); + s.write_uint8_t(value); value = 0; } } if (current_sample & 1) - io_write_uint8_t(&s, value); + s.write_uint8_t(value); free(step_index); free(current_clamp); free(current); } - io_free(&s); free(path_diva); free(data); } diff --git a/src/KKdLib/sound/diva.h b/src/KKdLib/sound/diva.hpp similarity index 95% rename from src/KKdLib/sound/diva.h rename to src/KKdLib/sound/diva.hpp index ef4aea4e..9c0c0914 100644 --- a/src/KKdLib/sound/diva.h +++ b/src/KKdLib/sound/diva.hpp @@ -5,7 +5,7 @@ #pragma once -#include "../default.h" +#include "../default.hpp" struct diva { size_t size; diff --git a/src/KKdLib/sound/vag.c b/src/KKdLib/sound/vag.cpp similarity index 90% rename from src/KKdLib/sound/vag.c rename to src/KKdLib/sound/vag.cpp index b7f5aef3..e220cf70 100644 --- a/src/KKdLib/sound/vag.c +++ b/src/KKdLib/sound/vag.cpp @@ -3,11 +3,11 @@ GitHub/GitLab: korenkonder */ -#include "vag.h" -#include "wav.h" -#include "../io/path.h" -#include "../io/stream.h" -#include "../str_utils.h" +#include "vag.hpp" +#include "wav.hpp" +#include "../io/path.hpp" +#include "../io/stream.hpp" +#include "../str_utils.hpp" static const int8_t shift_factor_table[] = { 0, 1, 2, 3, 4, 5, 6, 7, -8, -7, -6, -5, -4, -3, -2, -1 @@ -118,24 +118,24 @@ void vag_read(vag* v, const char* path) { void vag_read(vag* v, const wchar_t* path) { wchar_t* path_vag = str_utils_add(path, L".vag"); stream s; - io_open(&s, path_vag, L"rb"); + s.open(path_vag, L"rb"); if (s.io.stream) { - uint32_t signature = io_read_uint32_t_reverse_endianness(&s, true); + uint32_t signature = s.read_uint32_t_reverse_endianness(true); if (signature != 'VAGp') goto End; - v->version = io_read_uint32_t_reverse_endianness(&s, true); - io_read_uint32_t(&s); - v->size = io_read_uint32_t_reverse_endianness(&s, true); - v->sample_rate = io_read_uint32_t_reverse_endianness(&s, true); - io_read_uint32_t(&s); - io_read_uint32_t(&s); - io_read_uint16_t(&s); - v->channels = io_read_uint16_t(&s); + v->version = s.read_uint32_t_reverse_endianness(true); + s.read_uint32_t(); + v->size = s.read_uint32_t_reverse_endianness(true); + v->sample_rate = s.read_uint32_t_reverse_endianness(true); + s.read_uint32_t(); + s.read_uint32_t(); + s.read_uint16_t(); + v->channels = s.read_uint16_t(); if (v->channels < 2) v->channels = 1; - io_read_uint64_t(&s); - io_read_uint64_t(&s); + s.read_uint64_t(); + s.read_uint64_t(); bool hevag = v->version == 0x00020001 || v->version == 0x00030000; if (!hevag) @@ -157,10 +157,10 @@ void vag_read(vag* v, const wchar_t* path) { uint8_t coef_index, d, shift_factor; for (i1 = 0; i1 < num_blocks; i1++, temp_data += vag_block_size) for (c = 0; c < ch; c++) { - d = io_read_uint8_t(&s); + d = s.read_uint8_t(); coef_index = (d & 0xF0) >> 4; shift_factor = d & 0x0F; - d = io_read_uint8_t(&s); + d = s.read_uint8_t(); coef_index = (d & 0xF0) | coef_index; flags[i1] = d & 0x0F; @@ -168,7 +168,7 @@ void vag_read(vag* v, const wchar_t* path) { coef_index = 0; for (i = 0, i2 = 1; i < BLOCK_SIZE; i += 2, i2 += 2) { - d = io_read_uint8_t(&s); + d = s.read_uint8_t(); nibble[i] = d & 0x0F; nibble[i2] = (d & 0xF0) >> 4; } @@ -203,7 +203,6 @@ void vag_read(vag* v, const wchar_t* path) { free(data); } End: - io_free(&s); free(path_vag); } @@ -227,7 +226,7 @@ void vag_write(vag* v, const wchar_t* path, vag_option option) { wchar_t* temp_path = str_utils_get_without_extension(path); wchar_t* path_vag = str_utils_add(temp_path, L".vag"); stream s; - io_open(&s, path_vag, L"wb"); + s.open(path_vag, L"wb"); if (s.io.stream) { int32_t coef_index_count; switch (option) { @@ -252,17 +251,17 @@ void vag_write(vag* v, const wchar_t* path, vag_option option) { } bool hevag = option != VAG_OPTION_VAG; - io_write_uint32_t_reverse_endianness(&s, 'VAGp', true); - io_write_uint32_t_reverse_endianness(&s, hevag ? 0x00020001 : 0x00000020, true); - io_write_uint32_t(&s, 0); - io_write_uint32_t_reverse_endianness(&s, (uint32_t)(((v->size + 1) * (hevag ? v->channels : 1)) << 4), true); - io_write_uint32_t_reverse_endianness(&s, v->sample_rate, true); - io_write_uint32_t(&s, 0); - io_write_uint32_t(&s, 0); - io_write_uint16_t(&s, 0); - io_write_uint16_t(&s, hevag ? v->channels : 1); - io_write_uint64_t(&s, 0); - io_write_uint64_t(&s, 0); + s.write_uint32_t_reverse_endianness('VAGp', true); + s.write_uint32_t_reverse_endianness(hevag ? 0x00020001 : 0x00000020, true); + s.write_uint32_t(0); + s.write_uint32_t_reverse_endianness((uint32_t)(((v->size + 1) * (hevag ? v->channels : 1)) << 4), true); + s.write_uint32_t_reverse_endianness(v->sample_rate, true); + s.write_uint32_t(0); + s.write_uint32_t(0); + s.write_uint16_t(0); + s.write_uint16_t(hevag ? v->channels : 1); + s.write_uint64_t(0); + s.write_uint64_t(0); size_t c, i, i1, i2; int32_t ch = v->channels; @@ -285,17 +284,17 @@ void vag_write(vag* v, const wchar_t* path, vag_option option) { flag = flags ? (flags[i1] & 0x0F) : (i1 + 1 == size) ? 0x01 : 0; sample = ((coef_index & 0x0F) << 4) | (shift_factor & 0x0F); - io_write_char(&s, sample); + s.write_uint8_t(sample); sample = (coef_index & 0xF0) | flag; - io_write_char(&s, sample); + s.write_uint8_t(sample); for (i = 0, i2 = 1; i < BLOCK_SIZE; i += 2, i2 += 2) { sample = ((four_bit[i2] & 0x0F) << 4) | (four_bit[i] & 0x0F); - io_write_char(&s, sample); + s.write_uint8_t(sample); } } for (c = 0; c < ch; c++) { - io_write_uint64_t(&s, 0x7777777777770700); - io_write_uint64_t(&s, 0x7777777777777777); + s.write_uint64_t(0x7777777777770700); + s.write_uint64_t(0x7777777777777777); } } else if (hevag) { @@ -316,18 +315,18 @@ void vag_write(vag* v, const wchar_t* path, vag_option option) { flag = flags ? (flags[i1] & 0x0F) : (i1 + 1 == size) ? 0x01 : 0; sample = ((coef_index & 0x0F) << 4) | (shift_factor & 0x0F); - io_write_char(&s, sample); + s.write_uint8_t(sample); sample = (coef_index & 0xF0) | flag; - io_write_char(&s, sample); + s.write_uint8_t(sample); for (i = 0, i2 = 1; i < BLOCK_SIZE; i += 2, i2 += 2) { sample = ((four_bit[i2] & 0x0F) << 4) | (four_bit[i] & 0x0F); - io_write_char(&s, sample); + s.write_uint8_t(sample); } } for (c = 0; c < ch; c++) { - io_write_uint64_t(&s, 0x7777777777770700); - io_write_uint64_t(&s, 0x7777777777777777); + s.write_uint64_t(0x7777777777770700); + s.write_uint64_t(0x7777777777777777); } } else { @@ -355,22 +354,21 @@ void vag_write(vag* v, const wchar_t* path, vag_option option) { flag = flags ? (flags[i1] & 0x0F) : (i1 + 1 == size) ? 0x01 : 0; sample = ((coef_index & 0x0F) << 4) | (shift_factor & 0x0F); - io_write_char(&s, sample); + s.write_uint8_t(sample); sample = (coef_index & 0xF0) | flag; - io_write_char(&s, sample); + s.write_uint8_t(sample); for (i = 0, i2 = 1; i < BLOCK_SIZE; i += 2, i2 += 2) { sample = ((four_bit[i2] & 0x0F) << 4) | (four_bit[i] & 0x0F); - io_write_char(&s, sample); + s.write_uint8_t(sample); } } - io_write_uint64_t(&s, 0x7777777777770700); - io_write_uint64_t(&s, 0x7777777777777777); + s.write_uint64_t(0x7777777777770700); + s.write_uint64_t(0x7777777777777777); } - io_write_uint64_t(&s, 0x1010101010101010); - io_write_uint64_t(&s, 0x1010101010101010); + s.write_uint64_t(0x1010101010101010); + s.write_uint64_t(0x1010101010101010); free(samp); } - io_free(&s); free(path_vag); free(temp_path); free(flags); @@ -405,11 +403,10 @@ static void vag_read_wav(vag* v, const wchar_t* path, float_t** data, size_t* sa wchar_t temp[MAX_PATH]; size_t count = 0; wchar_t* temp_path = str_utils_get_without_extension(path); - vector_old_bool loop; + std::vector loop; bool n, l; bool add_loop = false; - loop = vector_old_empty(bool); while (true) { swprintf_s(temp, MAX_PATH, L"%ls.%llu.wav", temp_path, count); n = path_check_file_exists(temp); @@ -423,12 +420,11 @@ static void vag_read_wav(vag* v, const wchar_t* path, float_t** data, size_t* sa add_loop = !n; - vector_old_bool_push_back(&loop, &l); + loop.push_back(l); count++; } if (!count) { - vector_old_bool_free(&loop, 0); free(temp_path); return; } @@ -442,7 +438,7 @@ static void vag_read_wav(vag* v, const wchar_t* path, float_t** data, size_t* sa if (add_loop && i + 1 == count) continue; - swprintf_s(temp, MAX_PATH, loop.begin[i] ? L"%ls.%llu.loop.wav" : L"%ls.%llu.wav", temp_path, i); + swprintf_s(temp, MAX_PATH, loop[i] ? L"%ls.%llu.loop.wav" : L"%ls.%llu.wav", temp_path, i); wav_read(w, temp, &wav_data[i], &wav_samples[i]); if (i == 0) { v->channels = w->channels; @@ -456,7 +452,6 @@ static void vag_read_wav(vag* v, const wchar_t* path, float_t** data, size_t* sa free(wav_samples); free(wav_data); - vector_old_bool_free(&loop, 0); free(temp_path); return; } @@ -499,7 +494,7 @@ static void vag_read_wav(vag* v, const wchar_t* path, float_t** data, size_t* sa num_blocks = 1; else num_blocks = align_val_divide(wav_samples[i], BLOCK_SIZE, BLOCK_SIZE); - if (loop.begin[i]) { + if (loop[i]) { *f++ = 6; for (size_t i1 = 1; i1 < num_blocks; i1++) *f++ = 2; @@ -530,7 +525,6 @@ static void vag_read_wav(vag* v, const wchar_t* path, float_t** data, size_t* sa free(wav_samples); free(wav_data); - vector_old_bool_free(&loop, 0); free(temp_path); } diff --git a/src/KKdLib/sound/vag.h b/src/KKdLib/sound/vag.hpp similarity index 96% rename from src/KKdLib/sound/vag.h rename to src/KKdLib/sound/vag.hpp index b7a3da07..9198d0b0 100644 --- a/src/KKdLib/sound/vag.h +++ b/src/KKdLib/sound/vag.hpp @@ -5,7 +5,7 @@ #pragma once -#include "../default.h" +#include "../default.hpp" enum vag_option { VAG_OPTION_VAG, diff --git a/src/KKdLib/sound/wav.c b/src/KKdLib/sound/wav.cpp similarity index 67% rename from src/KKdLib/sound/wav.c rename to src/KKdLib/sound/wav.cpp index c9deb78b..08eee041 100644 --- a/src/KKdLib/sound/wav.c +++ b/src/KKdLib/sound/wav.cpp @@ -3,8 +3,8 @@ GitHub/GitLab: korenkonder */ -#include "wav.h" -#include "../io/stream.h" +#include "wav.hpp" +#include "../io/stream.hpp" wav* wav_init() { wav* w = force_malloc_s(wav, 1); @@ -23,45 +23,45 @@ void wav_read(wav* w, const wchar_t* path, float_t** data, size_t* samples) { memset(w, 0, sizeof(wav)); stream s; - io_open(&s, path, L"rb"); + s.open(path, L"rb"); if (s.io.stream) { wav w_t; - if (io_read_uint32_t(&s) != 0x46464952) - goto End; - io_read_uint32_t(&s); - if (io_read_uint32_t(&s) != 0x45564157 || io_read_uint32_t(&s) != 0x20746D66) - goto End; - size_t offset = io_read_uint32_t(&s); - w_t.format = io_read_uint16_t(&s); + if (s.read_uint32_t() != 0x46464952) + return; + s.read_uint32_t(); + if (s.read_uint32_t() != 0x45564157 || s.read_uint32_t() != 0x20746D66) + return; + size_t offset = s.read_uint32_t(); + w_t.format = s.read_uint16_t(); if (w_t.format != 0x01 && w_t.format != 0x03 && w_t.format != 0xFFFE) - goto End; + return; - w_t.channels = io_read_uint16_t(&s); - w_t.sample_rate = io_read_uint32_t(&s); - io_read_uint32_t(&s); - io_read_uint16_t(&s); - w_t.bytes = io_read_uint16_t(&s); + w_t.channels = s.read_uint16_t(); + w_t.sample_rate = s.read_uint32_t(); + s.read_uint32_t(); + s.read_uint16_t(); + w_t.bytes = s.read_uint16_t(); if (w_t.bytes % 8 || !(w_t.bytes / 8)) - goto End; + return; if (w_t.format == 0xFFFE) { - io_read_uint32_t(&s); - w_t.channel_mask = io_read_uint32_t(&s); - w_t.format = io_read_uint16_t(&s); + s.read_uint32_t(); + w_t.channel_mask = s.read_uint32_t(); + w_t.format = s.read_uint16_t(); } w_t.bytes >>= 3; if (w_t.bytes < 1 || (w_t.bytes > 4 && w_t.bytes != 8)) - goto End; + return; else if (w_t.bytes > 0 && w_t.bytes < 4 && w_t.format == 3) - goto End; + return; else if (w_t.bytes == 8 && w_t.format == 1) - goto End; + return; - io_set_position(&s, offset + 0x14, SEEK_SET); - if (io_read_uint32_t(&s) != 0x61746164) - goto End; - w_t.size = io_read_uint32_t(&s); - w_t.header_size = (int32_t)io_get_position(&s); + s.set_position(offset + 0x14, SEEK_SET); + if (s.read_uint32_t() != 0x61746164) + return; + w_t.size = s.read_uint32_t(); + w_t.header_size = (int32_t)s.get_position(); w_t.is_supported = true; *w = w_t; @@ -75,14 +75,14 @@ void wav_read(wav* w, const wchar_t* path, float_t** data, size_t* samples) { if (w->bytes == 0x01 && w->format == 0x01) for (size_t i = 0; i < t_s; i++) for (size_t c = 0; c < ch; c++) { - double_t sample = io_read_int8_t(&s); + double_t sample = s.read_int8_t(); sample = div_min_max(sample, -128.0, 127.0); t_d[i * ch + c] = (float_t)sample; } else if (w->bytes == 0x02 && (w->format == 0x01 || w->format == 0xFFFE)) for (size_t i = 0; i < t_s; i++) for (size_t c = 0; c < ch; c++) { - double_t sample = io_read_int16_t(&s); + double_t sample = s.read_int16_t(); sample = div_min_max(sample, -32768.0, 32767.0); t_d[i * ch + c] = (float_t)sample; } @@ -90,7 +90,7 @@ void wav_read(wav* w, const wchar_t* path, float_t** data, size_t* samples) { for (size_t i = 0; i < t_s; i++) for (size_t c = 0; c < ch; c++) { int32_t samp; - io_read(&s, &samp, 3); + s.read(&samp, 3); double_t sample = (samp << 8) >> 8; sample = div_min_max(sample, -8388608.0, 8388607.0); t_d[i * ch + c] = (float_t)sample; @@ -98,25 +98,23 @@ void wav_read(wav* w, const wchar_t* path, float_t** data, size_t* samples) { else if (w->bytes == 0x04 && w->format == 0x01) for (size_t i = 0; i < t_s; i++) for (size_t c = 0; c < ch; c++) { - double_t sample = io_read_int32_t(&s); + double_t sample = s.read_int32_t(); sample = div_min_max(sample, -2147483648.0, 2147483647.0); t_d[i * ch + c] = (float_t)sample; } else if (w->bytes == 0x04 && (w->format == 0x03 || w->format == 0xFFFE)) for (size_t i = 0; i < t_s; i++) for (size_t c = 0; c < ch; c++) { - float_t sample = io_read_float_t(&s); + float_t sample = s.read_float_t(); t_d[i * ch + c] = sample; } else if (w->bytes == 0x08 && (w->format == 0x03 || w->format == 0xFFFE)) for (size_t i = 0; i < t_s; i++) for (size_t c = 0; c < ch; c++) { - double_t sample = io_read_double_t(&s); + double_t sample = s.read_double_t(); t_d[i * ch + c] = (float_t)sample; } } -End: - io_free(&s); } void wav_write(wav* w, const char* path, float_t* data, size_t samples) { @@ -127,7 +125,7 @@ void wav_write(wav* w, const char* path, float_t* data, size_t samples) { void wav_write(wav* w, const wchar_t* path, float_t* data, size_t samples) { stream s; - io_open(&s, path, L"wb"); + s.open(path, L"wb"); if (s.io.stream && data) { w->size = (int32_t)(samples * w->channels * w->bytes); @@ -139,28 +137,28 @@ void wav_write(wav* w, const wchar_t* path, float_t* data, size_t samples) { else w->size = 0; - io_write_uint32_t(&s, 0x46464952); - io_write_uint32_t(&s, w->size + (w->format != 0xFFFE ? 0x24 : 0x3C)); - io_write_uint32_t(&s, 0x45564157); - io_write_uint32_t(&s, 0x20746D66); - io_write_uint32_t(&s, w->format != 0xFFFE ? 0x10 : 0x28); - io_write_uint16_t(&s, w->format); - io_write_uint16_t(&s, w->channels); - io_write_uint32_t(&s, w->sample_rate); - io_write_uint32_t(&s, w->sample_rate * w->channels * w->bytes); - io_write_uint16_t(&s, (uint16_t)(w->channels * w->bytes)); - io_write_uint16_t(&s, (uint16_t)(w->bytes << 3)); + s.write_uint32_t(0x46464952); + s.write_uint32_t(w->size + (w->format != 0xFFFE ? 0x24 : 0x3C)); + s.write_uint32_t(0x45564157); + s.write_uint32_t(0x20746D66); + s.write_uint32_t(w->format != 0xFFFE ? 0x10 : 0x28); + s.write_uint16_t(w->format); + s.write_uint16_t(w->channels); + s.write_uint32_t(w->sample_rate); + s.write_uint32_t(w->sample_rate * w->channels * w->bytes); + s.write_uint16_t((uint16_t)(w->channels * w->bytes)); + s.write_uint16_t((uint16_t)(w->bytes << 3)); if (w->format == 0xFFFE) { - io_write_uint16_t(&s, 0x16); - io_write_uint16_t(&s, (uint16_t)(w->bytes << 3)); - io_write_uint32_t(&s, w->channel_mask); - io_write_uint32_t(&s, w->bytes == 2 ? 0x01 : 0x03); - io_write_uint32_t(&s, 0x00100000); - io_write_uint32_t(&s, 0xAA000080); - io_write_uint32_t(&s, 0x719B3800); + s.write_uint16_t(0x16); + s.write_uint16_t((uint16_t)(w->bytes << 3)); + s.write_uint32_t(w->channel_mask); + s.write_uint32_t(w->bytes == 2 ? 0x01 : 0x03); + s.write_uint32_t(0x00100000); + s.write_uint32_t(0xAA000080); + s.write_uint32_t(0x719B3800); } - io_write_uint32_t(&s, 0x61746164); - io_write_uint32_t(&s, w->size); + s.write_uint32_t(0x61746164); + s.write_uint32_t(w->size); size_t ch = w->channels; if (w->bytes == 0x01 && w->format == 0x01) @@ -169,7 +167,7 @@ void wav_write(wav* w, const wchar_t* path, float_t* data, size_t samples) { double_t sample = data[i * ch + c]; sample = clamp(sample, -1.0, 1.0); sample = mult_min_max(sample, -128.0, 127.0); - io_write_char(&s, (int8_t)round(sample)); + s.write_int8_t((int8_t)round(sample)); } else if (w->bytes == 0x02 && (w->format == 0x01 || w->format == 0xFFFE)) for (size_t i = 0; i < samples; i++) @@ -177,7 +175,7 @@ void wav_write(wav* w, const wchar_t* path, float_t* data, size_t samples) { double_t sample = data[i * ch + c]; sample = clamp(sample, -1.0, 1.0); sample = mult_min_max(sample, -32768.0, 32767.0); - io_write_int16_t(&s, (int16_t)round(sample)); + s.write_int16_t((int16_t)round(sample)); } else if (w->bytes == 0x03 && w->format == 0x01) for (size_t i = 0; i < samples; i++) @@ -186,7 +184,7 @@ void wav_write(wav* w, const wchar_t* path, float_t* data, size_t samples) { sample = clamp(sample, -1.0, 1.0); sample = mult_min_max(sample, -8388608.0, 8388607.0); int32_t samp = (int32_t)round(sample); - io_write(&s, &samp, 3); + s.write(&samp, 3); } else if (w->bytes == 0x04 && w->format == 0x01) for (size_t i = 0; i < samples; i++) @@ -194,22 +192,21 @@ void wav_write(wav* w, const wchar_t* path, float_t* data, size_t samples) { double_t sample = data[i * ch + c]; sample = clamp(sample, -1.0, 1.0); sample = mult_min_max(sample, -2147483648.0, 2147483647.0); - io_write_int32_t(&s, (int32_t)round(sample)); + s.write_int32_t((int32_t)round(sample)); } else if (w->bytes == 0x04 && (w->format == 0x03 || w->format == 0xFFFE)) for (size_t i = 0; i < samples; i++) for (size_t c = 0; c < ch; c++) { float_t sample = data[i * ch + c]; - io_write_float_t(&s, sample); + s.write_float_t(sample); } else if (w->bytes == 0x08 && (w->format == 0x03 || w->format == 0xFFFE)) for (size_t i = 0; i < samples; i++) for (size_t c = 0; c < ch; c++) { double_t sample = data[i * ch + c]; - io_write_double_t(&s, sample); + s.write_double_t(sample); } } - io_free(&s); } void wav_dispose(wav* f) { diff --git a/src/KKdLib/sound/wav.h b/src/KKdLib/sound/wav.hpp similarity index 96% rename from src/KKdLib/sound/wav.h rename to src/KKdLib/sound/wav.hpp index 8f805fbe..ba35244e 100644 --- a/src/KKdLib/sound/wav.h +++ b/src/KKdLib/sound/wav.hpp @@ -5,7 +5,7 @@ #pragma once -#include "../default.h" +#include "../default.hpp" struct wav { int32_t size; diff --git a/src/KKdLib/str_utils.c b/src/KKdLib/str_utils.cpp similarity index 92% rename from src/KKdLib/str_utils.c rename to src/KKdLib/str_utils.cpp index c34bba15..f43789cc 100644 --- a/src/KKdLib/str_utils.c +++ b/src/KKdLib/str_utils.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "str_utils.h" +#include "str_utils.hpp" bool str_utils_check_ends_with(const char* str, const char* mask) { if (!str || !mask) @@ -41,64 +41,60 @@ bool str_utils_check_ends_with(const wchar_t* str, const wchar_t* mask) { return false; } -const char* str_utils_get_next_int32_t(const char* str, int32_t* value, char separator) { - string s; - str = str_utils_get_next_string(str, &s, separator); - sscanf_s(string_data(&s), "%d", value); - string_free(&s); +const char* str_utils_get_next_int32_t(const char* str, int32_t& value, char separator) { + std::string s; + str = str_utils_get_next_string(str, s, separator); + sscanf_s(s.c_str(), "%d", &value); return str; } -const wchar_t* str_utils_get_next_int32_t(const wchar_t* str, int32_t* value, wchar_t separator) { - wstring s; - str = str_utils_get_next_string(str, &s, separator); - swscanf_s(wstring_data(&s), L"%d", value); - wstring_free(&s); +const wchar_t* str_utils_get_next_int32_t(const wchar_t* str, int32_t& value, wchar_t separator) { + std::wstring s; + str = str_utils_get_next_string(str, s, separator); + swscanf_s(s.c_str(), L"%d", &value); return str; } -const char* str_utils_get_next_float_t(const char* str, float_t* value, char separator) { - string s; - str = str_utils_get_next_string(str, &s, separator); - sscanf_s(string_data(&s), "%f", value); - string_free(&s); +const char* str_utils_get_next_float_t(const char* str, float_t& value, char separator) { + std::string s; + str = str_utils_get_next_string(str, s, separator); + sscanf_s(s.c_str(), "%f", &value); return str; } -const wchar_t* str_utils_get_next_float_t(const wchar_t* str, float_t* value, wchar_t separator) { - wstring s; - str = str_utils_get_next_string(str, &s, separator); - swscanf_s(wstring_data(&s), L"%f", value); - wstring_free(&s); +const wchar_t* str_utils_get_next_float_t(const wchar_t* str, float_t& value, wchar_t separator) { + std::wstring s; + str = str_utils_get_next_string(str, s, separator); + swscanf_s(s.c_str(), L"%f", &value); return str; } -const char* str_utils_get_next_string(const char* str, string* value, char separator) { +const char* str_utils_get_next_string(const char* str, std::string& value, char separator) { if (!str) return 0; - string_init(value); + value = {}; while (*str) { char c = *str++; if (c == separator) break; - string_add_char(value, c); + value += c; } return *str ? str : 0; } -const wchar_t* str_utils_get_next_string(const wchar_t* str, wstring* value, wchar_t separator) { +const wchar_t* str_utils_get_next_string(const wchar_t* str, std::wstring& value, wchar_t separator) { if (!str) return 0; - wstring_init(value); + value = {}; while (*str) { wchar_t c = *str++; if (c == separator) break; - wstring_add_char(value, c); + value += c; } return str; } @@ -535,12 +531,12 @@ size_t str_utils_get_substring_offset(const wchar_t* str0, size_t str0_len, return -1; } -bool str_utils_text_file_parse(void* data, size_t size, +bool str_utils_text_file_parse(const void* data, size_t size, char** buf, char*** lines, size_t* count) { if (!data || !size || !buf || !lines || !count) return false; - char* d = (char*)data; + const char* d = (const char*)data; bool del = false; size_t c; *buf = 0; @@ -586,7 +582,7 @@ bool str_utils_text_file_parse(void* data, size_t size, c = 1; bool lf; char ch; - char* t; + const char* t; lf = false; t = d; ch = 0; @@ -672,7 +668,9 @@ bool str_utils_text_file_parse(void* data, size_t size, *count = c; } - if (del) - free(d); + if (del) { + void* data = (void*)d; + free(data); + } return true; } diff --git a/src/KKdLib/str_utils.h b/src/KKdLib/str_utils.hpp similarity index 90% rename from src/KKdLib/str_utils.h rename to src/KKdLib/str_utils.hpp index e1ad74c7..021d34e0 100644 --- a/src/KKdLib/str_utils.h +++ b/src/KKdLib/str_utils.hpp @@ -5,17 +5,17 @@ #pragma once -#include "default.h" -#include "string.h" +#include +#include "default.hpp" extern bool str_utils_check_ends_with(const char* str, const char* mask); extern bool str_utils_check_ends_with(const wchar_t* str, const wchar_t* mask); -extern const char* str_utils_get_next_int32_t(const char* str, int32_t* value, char separator); -extern const wchar_t* str_utils_get_next_int32_t(const wchar_t* str, int32_t* value, wchar_t separator); -extern const char* str_utils_get_next_float_t(const char* str, float_t* value, char separator); -extern const wchar_t* str_utils_get_next_float_t(const wchar_t* str, float_t* value, wchar_t separator); -extern const char* str_utils_get_next_string(const char* str, string* value, char separator); -extern const wchar_t* str_utils_get_next_string(const wchar_t* str, wstring* value, wchar_t separator); +extern const char* str_utils_get_next_int32_t(const char* str, int32_t& value, char separator); +extern const wchar_t* str_utils_get_next_int32_t(const wchar_t* str, int32_t& value, wchar_t separator); +extern const char* str_utils_get_next_float_t(const char* str, float_t& value, char separator); +extern const wchar_t* str_utils_get_next_float_t(const wchar_t* str, float_t& value, wchar_t separator); +extern const char* str_utils_get_next_string(const char* str, std::string& value, char separator); +extern const wchar_t* str_utils_get_next_string(const wchar_t* str, std::wstring& value, wchar_t separator); extern char* str_utils_split_get_right(const char* str, char split); extern wchar_t* str_utils_split_get_right(const wchar_t* str, wchar_t split); extern char* str_utils_split_get_left(const char* str, char split); @@ -48,5 +48,5 @@ extern size_t str_utils_get_substring_offset(const char* str0, size_t str0_len, size_t str0_off, const char* str1, size_t str1_len); extern size_t str_utils_get_substring_offset(const wchar_t* str0, size_t str0_len, size_t str0_off, const wchar_t* str1, size_t str1_len); -extern bool str_utils_text_file_parse(void* data, size_t size, +extern bool str_utils_text_file_parse(const void* data, size_t size, char** buf, char*** lines, size_t* count); diff --git a/src/KKdLib/txp.cpp b/src/KKdLib/txp.cpp index 4ef70b19..90ccc015 100644 --- a/src/KKdLib/txp.cpp +++ b/src/KKdLib/txp.cpp @@ -5,7 +5,7 @@ #include "txp.hpp" #include "f2/struct.hpp" -#include "io/stream.h" +#include "io/stream.hpp" txp_mipmap::txp_mipmap() : width(), height(), format(), size() { @@ -117,45 +117,44 @@ bool txp_set::pack_file(void** data, size_t* size, bool big_endian) { } stream s; - io_open(&s, 0, l); + s.open(0, l); s.is_big_endian = big_endian; - io_write_uint32_t_stream_reverse_endianness(&s, 0x03505854); - io_write_uint32_t_stream_reverse_endianness(&s, (uint32_t)count); - io_write_uint32_t_stream_reverse_endianness(&s, (uint8_t)count | 0x01010100); + s.write_uint32_t_reverse_endianness(0x03505854); + s.write_uint32_t_reverse_endianness((uint32_t)count); + s.write_uint32_t_reverse_endianness((uint8_t)count | 0x01010100); for (size_t i = 0; i < count; i++) - io_write_uint32_t_stream_reverse_endianness(&s, (uint32_t)txp4_offset[i]); + s.write_uint32_t_reverse_endianness((uint32_t)txp4_offset[i]); tex = textures.data(); for (size_t i = 0; i < count; i++, tex++) { - io_set_position(&s, txp4_offset[i], SEEK_SET); - io_write_uint32_t_stream_reverse_endianness(&s, tex->array_size > 1 ? 0x05505854 : 0x04505854); - io_write_uint32_t_stream_reverse_endianness(&s, tex->mipmaps_count * tex->array_size); - io_write_uint32_t_stream_reverse_endianness(&s, (uint8_t)tex->mipmaps_count + s.set_position(txp4_offset[i], SEEK_SET); + s.write_uint32_t_reverse_endianness(tex->array_size > 1 ? 0x05505854 : 0x04505854); + s.write_uint32_t_reverse_endianness(tex->mipmaps_count * tex->array_size); + s.write_uint32_t_reverse_endianness((uint8_t)tex->mipmaps_count | ((uint8_t)tex->array_size << 8) | 0x01010000); for (size_t j = 0; j < tex->array_size; j++) for (size_t k = 0; k < tex->mipmaps_count; k++) - io_write_uint32_t_stream_reverse_endianness(&s, + s.write_uint32_t_reverse_endianness( (uint32_t)(txp2_offset[i][j * tex->mipmaps_count + k] - txp4_offset[i])); tex_mipmap = tex->mipmaps.data(); for (size_t j = 0; j < tex->array_size; j++) for (size_t k = 0; k < tex->mipmaps_count; k++, tex_mipmap++) { - io_set_position(&s, txp2_offset[i][j * tex->mipmaps_count + k], SEEK_SET); - io_write_uint32_t_stream_reverse_endianness(&s, 0x02505854); - io_write_uint32_t_stream_reverse_endianness(&s, tex_mipmap->width); - io_write_uint32_t_stream_reverse_endianness(&s, tex_mipmap->height); - io_write_uint32_t_stream_reverse_endianness(&s, tex_mipmap->format); - io_write_uint32_t_stream_reverse_endianness(&s, (uint32_t)(j * tex->mipmaps_count + k)); - io_write_uint32_t_stream_reverse_endianness(&s, tex_mipmap->size); - io_write(&s, tex_mipmap->data.data(), tex_mipmap->size); - io_align_write(&s, 0x04); + s.set_position(txp2_offset[i][j * tex->mipmaps_count + k], SEEK_SET); + s.write_uint32_t_reverse_endianness(0x02505854); + s.write_uint32_t_reverse_endianness(tex_mipmap->width); + s.write_uint32_t_reverse_endianness(tex_mipmap->height); + s.write_uint32_t_reverse_endianness(tex_mipmap->format); + s.write_uint32_t_reverse_endianness((uint32_t)(j * tex->mipmaps_count + k)); + s.write_uint32_t_reverse_endianness(tex_mipmap->size); + s.write(tex_mipmap->data.data(), tex_mipmap->size); + s.align_write(0x04); } } - io_set_position(&s, 0, SEEK_END); + s.set_position(0, SEEK_END); - io_align_write(&s, 0x10); - io_copy(&s, data, size); - io_free(&s); + s.align_write(0x10); + s.copy(data, size); for (size_t i = 0; i < count; i++) free(txp2_offset[i]); @@ -164,16 +163,13 @@ bool txp_set::pack_file(void** data, size_t* size, bool big_endian) { return true; } -bool txp_set::pack_file(std::vector* data, bool big_endian) { +bool txp_set::pack_file(std::vector& data, bool big_endian) { size_t l; txp* tex; txp_mipmap* tex_mipmap; - if (!data) - return false; - - data->clear(); - data->shrink_to_fit(); + data.clear(); + data.shrink_to_fit(); size_t count = textures.size(); if (count < 1) @@ -203,45 +199,44 @@ bool txp_set::pack_file(std::vector* data, bool big_endian) { } stream s; - io_open(&s, 0, l); + s.open(0, l); s.is_big_endian = big_endian; - io_write_uint32_t_stream_reverse_endianness(&s, 0x03505854); - io_write_uint32_t_stream_reverse_endianness(&s, (uint32_t)count); - io_write_uint32_t_stream_reverse_endianness(&s, (uint8_t)count | 0x01010100); + s.write_uint32_t_reverse_endianness(0x03505854); + s.write_uint32_t_reverse_endianness((uint32_t)count); + s.write_uint32_t_reverse_endianness((uint8_t)count | 0x01010100); for (size_t i = 0; i < count; i++) - io_write_uint32_t_stream_reverse_endianness(&s, (uint32_t)txp4_offset[i]); + s.write_uint32_t_reverse_endianness((uint32_t)txp4_offset[i]); tex = textures.data(); for (size_t i = 0; i < count; i++, tex++) { - io_set_position(&s, txp4_offset[i], SEEK_SET); - io_write_uint32_t_stream_reverse_endianness(&s, tex->array_size > 1 ? 0x05505854 : 0x04505854); - io_write_uint32_t_stream_reverse_endianness(&s, tex->mipmaps_count * tex->array_size); - io_write_uint32_t_stream_reverse_endianness(&s, (uint8_t)tex->mipmaps_count + s.set_position(txp4_offset[i], SEEK_SET); + s.write_uint32_t_reverse_endianness(tex->array_size > 1 ? 0x05505854 : 0x04505854); + s.write_uint32_t_reverse_endianness(tex->mipmaps_count * tex->array_size); + s.write_uint32_t_reverse_endianness((uint8_t)tex->mipmaps_count | ((uint8_t)tex->array_size << 8) | 0x01010000); for (size_t j = 0; j < tex->array_size; j++) for (size_t k = 0; k < tex->mipmaps_count; k++) - io_write_uint32_t_stream_reverse_endianness(&s, + s.write_uint32_t_reverse_endianness( (uint32_t)(txp2_offset[i][j * tex->mipmaps_count + k] - txp4_offset[i])); tex_mipmap = tex->mipmaps.data(); for (size_t j = 0; j < tex->array_size; j++) for (size_t k = 0; k < tex->mipmaps_count; k++, tex_mipmap++) { - io_set_position(&s, txp2_offset[i][j * tex->mipmaps_count + k], SEEK_SET); - io_write_uint32_t_stream_reverse_endianness(&s, 0x02505854); - io_write_uint32_t_stream_reverse_endianness(&s, tex_mipmap->width); - io_write_uint32_t_stream_reverse_endianness(&s, tex_mipmap->height); - io_write_uint32_t_stream_reverse_endianness(&s, tex_mipmap->format); - io_write_uint32_t_stream_reverse_endianness(&s, (uint32_t)(j * tex->mipmaps_count + k)); - io_write_uint32_t_stream_reverse_endianness(&s, tex_mipmap->size); - io_write(&s, tex_mipmap->data.data(), tex_mipmap->size); - io_align_write(&s, 0x04); + s.set_position(txp2_offset[i][j * tex->mipmaps_count + k], SEEK_SET); + s.write_uint32_t_reverse_endianness(0x02505854); + s.write_uint32_t_reverse_endianness(tex_mipmap->width); + s.write_uint32_t_reverse_endianness(tex_mipmap->height); + s.write_uint32_t_reverse_endianness(tex_mipmap->format); + s.write_uint32_t_reverse_endianness((uint32_t)(j * tex->mipmaps_count + k)); + s.write_uint32_t_reverse_endianness(tex_mipmap->size); + s.write(tex_mipmap->data.data(), tex_mipmap->size); + s.align_write(0x04); } } - io_set_position(&s, 0, SEEK_END); + s.set_position(0, SEEK_END); - io_align_write(&s, 0x10); - io_copy(&s, data); - io_free(&s); + s.align_write(0x10); + s.copy(data); for (size_t i = 0; i < count; i++) free(txp2_offset[i]); @@ -252,7 +247,7 @@ bool txp_set::pack_file(std::vector* data, bool big_endian) { bool txp_set::pack_file_modern(void** data, size_t* size, bool big_endian) { f2_struct st; - if (!pack_file(&st.data, big_endian)) { + if (!pack_file(st.data, big_endian)) { *data = 0; *size = 0; return false; @@ -321,7 +316,7 @@ bool txp_set::produce_enrs(enrs* enrs) { return true; } -bool txp_set::unpack_file(void* data, bool big_endian) { +bool txp_set::unpack_file(const void* data, bool big_endian) { uint32_t signature; uint32_t tex_count; txp* tex; @@ -420,7 +415,7 @@ bool txp_set::unpack_file(void* data, bool big_endian) { return true; } -bool txp_set::unpack_file_modern(void* data, size_t size) { +bool txp_set::unpack_file_modern(const void* data, size_t size) { bool ret = false; f2_struct st; st.read(data, size); diff --git a/src/KKdLib/txp.hpp b/src/KKdLib/txp.hpp index 20a9bfcc..689a1cc3 100644 --- a/src/KKdLib/txp.hpp +++ b/src/KKdLib/txp.hpp @@ -6,7 +6,7 @@ #pragma once #include -#include "default.h" +#include "default.hpp" #include "f2/enrs.hpp" enum txp_format { @@ -58,9 +58,9 @@ struct txp_set { ~txp_set(); bool pack_file(void** data, size_t* size, bool big_endian); - bool pack_file(std::vector* data, bool big_endian); + bool pack_file(std::vector& data, bool big_endian); bool pack_file_modern(void** data, size_t* size, bool big_endian); bool produce_enrs(enrs* enrs); - bool unpack_file(void* data, bool big_endian); - bool unpack_file_modern(void* data, size_t size); + bool unpack_file(const void* data, bool big_endian); + bool unpack_file_modern(const void* data, size_t size); }; diff --git a/src/KKdLib/types.h b/src/KKdLib/types.hpp similarity index 100% rename from src/KKdLib/types.h rename to src/KKdLib/types.hpp diff --git a/src/KKdLib/vec.c b/src/KKdLib/vec.cpp similarity index 82% rename from src/KKdLib/vec.c rename to src/KKdLib/vec.cpp index dca77a4c..f3b490c7 100644 --- a/src/KKdLib/vec.c +++ b/src/KKdLib/vec.cpp @@ -3,7 +3,7 @@ GitHub/GitLab: korenkonder */ -#include "vec.h" +#include "vec.hpp" const __m128 vec2_negate = { -0.0f, -0.0f, 0.0f, 0.0f }; const __m128 vec3_negate = { -0.0f, -0.0f, -0.0f, 0.0f }; @@ -36,21 +36,6 @@ const vec4u vec4u_null = { 0.0f, 0.0f, 0.0f, 0.0f }; const vec4iu vec4iu_null = { 0, 0, 0, 0 }; -vector_old_func(vec2) -vector_old_func(vec2i) -vector_old_func(vec3) -vector_old_func(vec3i) -vector_old_func(vec4) -vector_old_func(vec4i) -vector_old_ptr_func(vec2) -vector_old_ptr_func(vec2i) -vector_old_ptr_func(vec3) -vector_old_ptr_func(vec3i) -vector_old_ptr_func(vec4) -vector_old_ptr_func(vec4i) - -// Crutch for vector_old_func definition - vec4::operator vec4u() const { vec4u v; v.x = x; diff --git a/src/KKdLib/vec.h b/src/KKdLib/vec.hpp similarity index 99% rename from src/KKdLib/vec.h rename to src/KKdLib/vec.hpp index 2ad275c5..a1bbc539 100644 --- a/src/KKdLib/vec.h +++ b/src/KKdLib/vec.hpp @@ -5,9 +5,8 @@ #pragma once -#include "default.h" -#include "half_t.h" -#include "vector.h" +#include "default.hpp" +#include "half_t.hpp" #include #include @@ -209,19 +208,6 @@ extern const vec4u vec4u_null; extern const vec4iu vec4iu_null; -vector_old(vec2) -vector_old(vec2i) -vector_old(vec3) -vector_old(vec3i) -vector_old(vec4) -vector_old(vec4i) -vector_old_ptr(vec2) -vector_old_ptr(vec2i) -vector_old_ptr(vec3) -vector_old_ptr(vec3i) -vector_old_ptr(vec4) -vector_old_ptr(vec4i) - #define vec2i8_to_vec2(src, dst) \ (dst).x = (float_t)(src).x; \ (dst).y = (float_t)(src).y; diff --git a/src/MMPlusDec/MMPlusDec.cpp b/src/MMPlusDec/MMPlusDec.cpp index 8cf07c62..b479fec3 100644 --- a/src/MMPlusDec/MMPlusDec.cpp +++ b/src/MMPlusDec/MMPlusDec.cpp @@ -7,11 +7,11 @@ #include #include -#include "../KKdLib/default.h" -#include "../KKdLib/io/path.h" -#include "../KKdLib/io/stream.h" -#include "../KKdLib/aes.h" -#include "../KKdLib/str_utils.h" +#include "../KKdLib/default.hpp" +#include "../KKdLib/io/path.hpp" +#include "../KKdLib/io/stream.hpp" +#include "../KKdLib/aes.hpp" +#include "../KKdLib/str_utils.hpp" #include static const uint8_t mmplus_key[] = { @@ -30,7 +30,7 @@ bool aes_ni; int32_t wmain(int32_t argc, wchar_t** argv) { if (argc < 2) { - printf("MMPlusDec v0.1.1.0 by korenkonder. Key provided by Skyth\n"); + printf("MMPlusDec v0.1.2.0 by korenkonder. Key provided by Skyth\n"); printf("Usage: MMPlusDec indir [outdir] [-e]\n"); return 0; } @@ -79,40 +79,46 @@ int32_t wmain(int32_t argc, wchar_t** argv) { stream in_file; stream out_file; - io_open(&in_file, infile.c_str(), L"rb"); - io_open(&out_file, outfile.c_str(), L"wb"); + in_file.open(infile.c_str(), L"rb"); + out_file.open(outfile.c_str(), L"wb"); if (in_file.io.stream && out_file.io.stream) { printf(encrypt ? "Encrypting %ls\n" : "Decrypting %ls\n", i.c_str()); aes256_ctx_set_iv(&ctx, mmplus_iv); + size_t length = in_file.get_length(); + uint8_t buf[0x400]; size_t size; if (encrypt) { - while (size = io_read(&in_file, buf, sizeof(buf))) { - if (size % 0x10) { - size_t align = align_val(size, 0x10) - size; - buf[size] = '\n'; - for (size_t i = 1; i < align; i++) - buf[size + i] = '\t'; + while (length && (size = in_file.read(buf, sizeof(buf)))) { + if (length == size) { + uint8_t align = (uint8_t)(0x10 - size % 0x10); + for (uint8_t i = 0; i < align; i++) + buf[size + i] = align; size += align; } aes256_cbc_encrypt_buffer(&ctx, buf, size); - io_write(&out_file, buf, size); + out_file.write(buf, size); + + length -= size; } } else { - while (size = io_read(&in_file, buf, sizeof(buf))) { + while (length && (size = in_file.read(buf, sizeof(buf)))) { aes256_cbc_decrypt_buffer(&ctx, buf, size); - io_write(&out_file, buf, size); + + if (length == size) + size -= buf[size - 1]; + + out_file.write(buf, size); + + length -= size; } } } - - io_free(&in_file); - io_free(&out_file); } } @@ -135,40 +141,46 @@ int32_t wmain(int32_t argc, wchar_t** argv) { stream in_file; stream out_file; - io_open(&in_file, infile.c_str(), L"rb"); - io_open(&out_file, outfile.c_str(), L"wb"); + in_file.open(infile.c_str(), L"rb"); + out_file.open(outfile.c_str(), L"wb"); if (in_file.io.stream && out_file.io.stream) { printf(encrypt ? "Encrypting %ls\\%ls\n" : "Decrypting %ls\\%ls\n", i.c_str(), j.c_str()); aes256_ctx_set_iv(&ctx, mmplus_iv); + size_t length = in_file.get_length(); + uint8_t buf[0x400]; size_t size; if (encrypt) { - while (size = io_read(&in_file, buf, sizeof(buf))) { - if (size % 0x10) { - size_t align = align_val(size, 0x10) - size; - buf[size] = '\n'; - for (size_t i = 1; i < align; i++) - buf[size + i] = '\t'; + while (length && (size = in_file.read(buf, sizeof(buf)))) { + if (length == size) { + uint8_t align = (uint8_t)(0x10 - size % 0x10); + for (uint8_t i = 0; i < align; i++) + buf[size + i] = align; size += align; } aes256_cbc_encrypt_buffer(&ctx, buf, size); - io_write(&out_file, buf, size); + out_file.write(buf, size); + + length -= size; } } else { - while (size = io_read(&in_file, buf, sizeof(buf))) { + while (length && (size = in_file.read(buf, sizeof(buf)))) { aes256_cbc_decrypt_buffer(&ctx, buf, size); - io_write(&out_file, buf, size); + + if (length == size) + size -= buf[size - 1]; + + out_file.write(buf, size); + + length -= size; } } } - - io_free(&in_file); - io_free(&out_file); } } return 0;