diff --git a/src/CRE/auth_3d.cpp b/src/CRE/auth_3d.cpp index c1af18c2..5e61eedc 100644 --- a/src/CRE/auth_3d.cpp +++ b/src/CRE/auth_3d.cpp @@ -5909,7 +5909,7 @@ static void auth_3d_object_hrc_load(auth_3d* auth, auth_3d_object_hrc* oh, static bool auth_3d_object_hrc_replace_chara(auth_3d_object_hrc* oh, chara_index src_chara, chara_index dst_chara, object_database* obj_db) { - if (src_chara < CHARA_MIKU || src_chara > CHARA_TETO || dst_chara < CHARA_MIKU || dst_chara > CHARA_TETO || src_chara == dst_chara) + if (src_chara < 0 || src_chara >= CHARA_MAX || dst_chara < 0 || dst_chara >= CHARA_MAX || src_chara == dst_chara) return false; std::string src_chara_str = chara_index_get_auth_3d_name(src_chara); diff --git a/src/CRE/gl_state.hpp b/src/CRE/gl_state.hpp index 15844116..65108cc6 100644 --- a/src/CRE/gl_state.hpp +++ b/src/CRE/gl_state.hpp @@ -113,3 +113,15 @@ extern void gl_state_set_polygon_mode(GLenum face, GLenum mode, bool force = fal extern void gl_state_set_primitive_restart_index(GLuint index, bool force = false); extern void gl_state_set_stencil_mask(GLuint mask, bool force = false); extern void gl_state_use_program(GLuint program, bool force = false); + +inline constexpr void gl_state_begin_event(const char* str) { +#ifdef DEBUG + glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, (GLsizei)utf8_length(str), str); +#endif +} + +inline constexpr void gl_state_end_event() { +#ifdef DEBUG + glPopDebugGroup(); +#endif +} diff --git a/src/CRE/item_table.cpp b/src/CRE/item_table.cpp index 8cfbba2b..17f408d5 100644 --- a/src/CRE/item_table.cpp +++ b/src/CRE/item_table.cpp @@ -92,7 +92,7 @@ const item_table_item* item_table::get_item(int32_t item_no) { void item_table_handler_array_init() { item_table_handler_array = new item_table_handler[CHARA_MAX]; - for (int32_t i = CHARA_MIKU; i < CHARA_MAX; i++) + for (int32_t i = 0; i < CHARA_MAX; i++) item_table_handler_array[i].set_path((chara_index)i); } @@ -112,11 +112,27 @@ const item_cos_data* item_table_handler_array_get_item_cos_data_by_module_index( const item_table_item* item_table_handler_array_get_item( chara_index chara_index, int32_t item_no) { - if (chara_index >= CHARA_MIKU && chara_index < CHARA_MAX) + if (chara_index >= 0 && chara_index < CHARA_MAX) return item_table_handler_array[chara_index].get_item(item_no); return 0; } +std::string item_table_handler_array_get_item_name( + chara_index chara_index, int32_t item_no) { + const item_table_item* item = item_table_handler_array_get_item(chara_index, item_no); + if (item) + return item->name; + return {}; +} + +item_sub_id item_table_handler_array_get_item_sub_id( + chara_index chara_index, int32_t item_no) { + const item_table_item* item = item_table_handler_array_get_item(chara_index, item_no); + if (item) + return item->sub_id; + return ITEM_SUB_NONE; +} + const std::vector* item_table_handler_array_get_item_objset( chara_index chara_index, int32_t item_no) { const item_table_item* item = item_table_handler_array_get_item(chara_index, item_no); @@ -126,20 +142,20 @@ const std::vector* item_table_handler_array_get_item_objset( } const item_table* item_table_handler_array_get_table(chara_index chara_index) { - if (chara_index < CHARA_MIKU || chara_index >= CHARA_MAX) + if (chara_index < 0 || chara_index >= CHARA_MAX) return 0; return &item_table_handler_array[chara_index].table; } bool item_table_handler_array_load() { bool ret = false; - for (int32_t i = CHARA_MIKU; i < CHARA_MAX; i++) + for (int32_t i = 0; i < CHARA_MAX; i++) ret |= item_table_handler_array[i].load(); return ret; } void item_table_handler_array_read() { - for (int32_t i = CHARA_MIKU; i < CHARA_MAX; i++) + for (int32_t i = 0; i < CHARA_MAX; i++) item_table_handler_array[i].read(); } @@ -170,7 +186,7 @@ const item_table_item* item_table_handler::get_item(int32_t item_no) { } bool item_table_handler::load() { - if (chara_index < CHARA_MIKU || chara_index >= CHARA_MAX || ready || !file) + if (chara_index < 0 || chara_index >= CHARA_MAX || ready || !file) return false; for (p_file_handler*& i : file_handlers) @@ -251,7 +267,7 @@ static void item_table_load(data_struct* data, item_table& itm_tbl, itm_table& i for (itm_table_item& i : itm_tbl_file.item) { item_table_item itm; itm.flag = i.flag; - itm.name = i.name; + itm.name.assign(i.name); itm.objset.reserve(i.objset.size()); for (std::string& j : i.objset) { @@ -322,13 +338,17 @@ static void item_table_load(data_struct* data, item_table& itm_tbl, itm_table& i } for (itm_table_dbgset& i : itm_tbl_file.dbgset) { - uint32_t set_id = aft_obj_db->get_object_set_id(i.name.c_str()); - if (set_id == -1) + if (aft_obj_db->get_object_set_id(i.name.c_str()) == -1) continue; - item_table_dbgset dbg; - dbg.item = i.item; - itm_tbl.dbgset.push_back(set_id, dbg); + item_cos_data cos = {}; + for (int32_t j : i.item) { + const item_table_item* item = itm_tbl.get_item(j); + if (item) + cos.arr[item->sub_id] = j; + } + + itm_tbl.dbgset.push_back(i.name, cos); } for (itm_table_cos& i : itm_tbl_file.cos) { diff --git a/src/CRE/item_table.hpp b/src/CRE/item_table.hpp index 787674bb..42d900dc 100644 --- a/src/CRE/item_table.hpp +++ b/src/CRE/item_table.hpp @@ -105,8 +105,6 @@ union item_cos_data { }; struct item_table_dbgset { - std::vector item; - item_table_dbgset(); ~item_table_dbgset(); }; @@ -114,7 +112,7 @@ struct item_table_dbgset { struct item_table { prj::vector_pair_combine item; prj::vector_pair_combine cos; - prj::vector_pair_combine dbgset; + prj::vector_pair_combine dbgset; item_table(); ~item_table(); @@ -127,6 +125,10 @@ extern const item_cos_data* item_table_handler_array_get_item_cos_data_by_module chara_index chara_index, int32_t module_index); extern const item_table_item* item_table_handler_array_get_item( chara_index chara_index, int32_t item_no); +extern std::string item_table_handler_array_get_item_name( + chara_index chara_index, int32_t item_no); +extern item_sub_id item_table_handler_array_get_item_sub_id( + chara_index chara_index, int32_t item_no); extern const std::vector* item_table_handler_array_get_item_objset( chara_index chara_index, int32_t item_no); extern const item_table* item_table_handler_array_get_table(chara_index chara_index); diff --git a/src/CRE/object.cpp b/src/CRE/object.cpp index d4b781c1..f48b1df2 100644 --- a/src/CRE/object.cpp +++ b/src/CRE/object.cpp @@ -31,8 +31,8 @@ static void obj_set_handler_vertex_buffer_free(obj_set_handler* handler); static size_t obj_vertex_format_get_vertex_size(obj_vertex_format format); static size_t obj_vertex_format_get_vertex_size_comp(obj_vertex_format format); -std::vector object_storage_data; -std::list object_storage_data_modern; +std::map object_storage_data; +std::map object_storage_data_modern; obj_mesh_index_buffer::obj_mesh_index_buffer() : buffer(), size() { @@ -1439,108 +1439,76 @@ void object_material_msgpack_write(const char* path, const char* set_name, uint3 } inline void object_storage_init(const object_database* obj_db) { - const object_set_info* obj_set = obj_db->object_set.data(); - size_t count = obj_db->object_set.size(); - object_storage_data.resize(count); - for (size_t i = 0; i < count; i++) { - object_storage_data[i].set_id = obj_set[i].id; - object_storage_data[i].name.assign(obj_set[i].name); + for (const object_set_info& i : obj_db->object_set) { + obj_set_handler handler; + handler.set_id = i.id; + handler.name.assign(i.name); + object_storage_data.insert({ i.id, handler }); } object_storage_data_modern.clear(); } inline obj* object_storage_get_obj(object_info obj_info) { - for (obj_set_handler& i : object_storage_data) { - if (i.set_id != obj_info.set_id) - continue; - - obj_set* set = i.obj_set; - if (!set) - return 0; - - for (uint32_t j = 0; j < set->obj_num; j++) - if (set->obj_data[j].id == obj_info.id) - return &set->obj_data[j]; + auto elem = object_storage_data.find(obj_info.set_id); + if (elem != object_storage_data.end()) { + obj_set* set = elem->second.obj_set; + if (set) + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) + return &set->obj_data[j]; return 0; } - for (obj_set_handler& i : object_storage_data_modern) { - if (i.set_id != obj_info.set_id) - continue; - - obj_set* set = i.obj_set; - if (!set) - return 0; - - for (uint32_t j = 0; j < set->obj_num; j++) - if (set->obj_data[j].id == obj_info.id) - return &set->obj_data[j]; + auto elem_modern = object_storage_data_modern.find(obj_info.set_id); + if (elem_modern != object_storage_data_modern.end()) { + obj_set* set = elem_modern->second.obj_set; + if (set) + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) + return &set->obj_data[j]; return 0; } return 0; } inline obj_set_handler* object_storage_get_obj_set_handler(uint32_t set_id) { - for (obj_set_handler& i : object_storage_data) - if (i.set_id == set_id) - return &i; + auto elem = object_storage_data.find(set_id); + if (elem != object_storage_data.end()) + return &elem->second; - for (obj_set_handler& i : object_storage_data_modern) - if (i.set_id == set_id) - return &i; - return 0; -} - -inline obj_set_handler* object_storage_get_obj_set_handler_by_index(size_t index) { - if (index >= 0 && index < object_storage_data.size()) - return &object_storage_data[index]; - - index -= object_storage_data.size(); - if (index >= 0 && index < object_storage_data_modern.size()) { - auto elem = object_storage_data_modern.begin(); - std::advance(elem, index); - return &*elem; - } + auto elem_modern = object_storage_data_modern.find(set_id); + if (elem_modern != object_storage_data_modern.end()) + return &elem_modern->second; return 0; } inline obj_mesh* object_storage_get_obj_mesh(object_info obj_info, const char* mesh_name) { - for (obj_set_handler& i : object_storage_data) { - if (i.set_id != obj_info.set_id) - continue; - - obj_set* set = i.obj_set; - if (!set) - return 0; - - for (uint32_t j = 0; j < set->obj_num; j++) - if (set->obj_data[j].id == obj_info.id) - return set->obj_data[j].get_obj_mesh(mesh_name); + auto elem = object_storage_data.find(obj_info.set_id); + if (elem != object_storage_data.end()) { + obj_set* set = elem->second.obj_set; + if (set) + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) + return set->obj_data[j].get_obj_mesh(mesh_name); return 0; } - for (obj_set_handler& i : object_storage_data_modern) { - if (i.set_id != obj_info.set_id) - continue; - - obj_set* set = i.obj_set; - if (!set) - return 0; - - for (uint32_t j = 0; j < set->obj_num; j++) - if (set->obj_data[j].id == obj_info.id) - return set->obj_data[j].get_obj_mesh(mesh_name); + auto elem_modern = object_storage_data_modern.find(obj_info.set_id); + if (elem_modern != object_storage_data_modern.end()) { + obj_set* set = elem_modern->second.obj_set; + if (set) + for (uint32_t j = 0; j < set->obj_num; j++) + if (set->obj_data[j].id == obj_info.id) + return set->obj_data[j].get_obj_mesh(mesh_name); return 0; } return 0; } inline obj_mesh* object_storage_get_obj_mesh_by_index(object_info obj_info, uint32_t index) { - for (obj_set_handler& i : object_storage_data) { - if (i.set_id != obj_info.set_id) - continue; - - obj_set* set = i.obj_set; + auto elem = object_storage_data.find(obj_info.set_id); + if (elem != object_storage_data.end()) { + obj_set* set = elem->second.obj_set; if (!set) return 0; @@ -1556,11 +1524,9 @@ inline obj_mesh* object_storage_get_obj_mesh_by_index(object_info obj_info, uint return 0; } - for (obj_set_handler& i : object_storage_data_modern) { - if (i.set_id != obj_info.set_id) - continue; - - obj_set* set = i.obj_set; + auto elem_modern = object_storage_data_modern.find(obj_info.set_id); + if (elem_modern != object_storage_data_modern.end()) { + obj_set* set = elem_modern->second.obj_set; if (!set) return 0; @@ -1579,8 +1545,8 @@ inline obj_mesh* object_storage_get_obj_mesh_by_index(object_info obj_info, uint } inline obj_mesh* object_storage_get_obj_mesh_by_object_hash(uint32_t hash, const char* mesh_name) { - for (obj_set_handler& i : object_storage_data) { - obj_set* set = i.obj_set; + for (auto& i : object_storage_data) { + obj_set* set = i.second.obj_set; if (!set) continue; @@ -1589,8 +1555,8 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash(uint32_t hash, const return set->obj_data[j].get_obj_mesh(mesh_name); } - for (obj_set_handler& i : object_storage_data_modern) { - obj_set* set = i.obj_set; + for (auto& i : object_storage_data_modern) { + obj_set* set = i.second.obj_set; if (!set) continue; @@ -1602,8 +1568,8 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash(uint32_t hash, const } inline obj_mesh* object_storage_get_obj_mesh_by_object_hash_index(uint32_t hash, uint32_t index) { - for (obj_set_handler& i : object_storage_data) { - obj_set* set = i.obj_set; + for (auto& i : object_storage_data) { + obj_set* set = i.second.obj_set; if (!set) continue; @@ -1618,8 +1584,8 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash_index(uint32_t hash, } } - for (obj_set_handler& i : object_storage_data_modern) { - obj_set* set = i.obj_set; + for (auto& i : object_storage_data_modern) { + obj_set* set = i.second.obj_set; if (!set) continue; @@ -1637,11 +1603,9 @@ inline obj_mesh* object_storage_get_obj_mesh_by_object_hash_index(uint32_t hash, } inline uint32_t object_storage_get_obj_mesh_index(object_info obj_info, const char* mesh_name) { - for (obj_set_handler& i : object_storage_data) { - if (i.set_id != obj_info.set_id) - continue; - - obj_set* set = i.obj_set; + auto elem = object_storage_data.find(obj_info.set_id); + if (elem != object_storage_data.end()) { + obj_set* set = elem->second.obj_set; if (!set) return -1; @@ -1650,11 +1614,9 @@ inline uint32_t object_storage_get_obj_mesh_index(object_info obj_info, const ch return set->obj_data[j].get_obj_mesh_index(mesh_name); } - for (obj_set_handler& i : object_storage_data_modern) { - if (i.set_id != obj_info.set_id) - continue; - - obj_set* set = i.obj_set; + auto elem_modern = object_storage_data_modern.find(obj_info.set_id); + if (elem_modern != object_storage_data_modern.end()) { + obj_set* set = elem_modern->second.obj_set; if (!set) return -1; @@ -1666,8 +1628,8 @@ inline uint32_t object_storage_get_obj_mesh_index(object_info obj_info, const ch } inline uint32_t object_storage_get_obj_mesh_index_by_hash(uint32_t hash, const char* mesh_name) { - for (obj_set_handler& i : object_storage_data) { - obj_set* set = i.obj_set; + for (auto& i : object_storage_data) { + obj_set* set = i.second.obj_set; if (!set) continue; @@ -1676,8 +1638,8 @@ inline uint32_t object_storage_get_obj_mesh_index_by_hash(uint32_t hash, const c return set->obj_data[j].get_obj_mesh_index(mesh_name); } - for (obj_set_handler& i : object_storage_data_modern) { - obj_set* set = i.obj_set; + for (auto& i : object_storage_data_modern) { + obj_set* set = i.second.obj_set; if (!set) continue; @@ -1689,13 +1651,13 @@ inline uint32_t object_storage_get_obj_mesh_index_by_hash(uint32_t hash, const c } inline obj_set* object_storage_get_obj_set(uint32_t set_id) { - for (obj_set_handler& i : object_storage_data) - if (i.set_id == set_id) - return i.obj_set; + auto elem = object_storage_data.find(set_id); + if (elem != object_storage_data.end()) + return elem->second.obj_set; - for (obj_set_handler& i : object_storage_data_modern) - if (i.set_id == set_id) - return i.obj_set; + auto elem_modern = object_storage_data_modern.find(set_id); + if (elem_modern != object_storage_data_modern.end()) + return elem_modern->second.obj_set; return 0; } @@ -1704,62 +1666,20 @@ inline size_t object_storage_get_obj_set_count() { } inline int32_t object_storage_get_obj_storage_load_count(uint32_t set_id) { - for (obj_set_handler& i : object_storage_data) - if (i.set_id == set_id) - return i.load_count; + auto elem = object_storage_data.find(set_id); + if (elem != object_storage_data.end()) + return elem->second.load_count; - for (obj_set_handler& i : object_storage_data_modern) - if (i.set_id == set_id) - return i.load_count; + auto elem_modern = object_storage_data_modern.find(set_id); + if (elem_modern != object_storage_data_modern.end()) + return elem_modern->second.load_count; return 0; } -inline obj_set* object_storage_get_obj_set_by_index(size_t index) { - if (index >= 0 && index < object_storage_data.size()) - return object_storage_data[index].obj_set; - - index -= object_storage_data.size(); - if (index >= 0 && index < object_storage_data_modern.size()) { - auto elem = object_storage_data_modern.begin(); - std::advance(elem, index); - return elem->obj_set; - } - return 0; -} - -inline int32_t object_storage_get_obj_storage_load_count_by_index(size_t index) { - if (index >= 0 && index < object_storage_data.size()) - return object_storage_data[index].load_count; - - index -= object_storage_data.size(); - if (index >= 0 && index < object_storage_data_modern.size()) { - auto elem = object_storage_data_modern.begin(); - std::advance(elem, index); - return elem->load_count; - } - return 0; -} - -inline size_t object_storage_get_obj_set_index(uint32_t set_id) { - for (obj_set_handler& i : object_storage_data) - if (i.set_id == set_id) - return &i - object_storage_data.data(); - - size_t index = 0; - for (obj_set_handler& i : object_storage_data_modern) - if (i.set_id == set_id) - return object_storage_data.size() + index; - else - index++; - return -1; -} - inline obj_skin* object_storage_get_obj_skin(object_info obj_info) { - for (obj_set_handler& i : object_storage_data) { - if (i.set_id != obj_info.set_id) - continue; - - obj_set* set = i.obj_set; + auto elem = object_storage_data.find(obj_info.set_id); + if (elem != object_storage_data.end()) { + obj_set* set = elem->second.obj_set; if (!set) return 0; @@ -1769,11 +1689,9 @@ inline obj_skin* object_storage_get_obj_skin(object_info obj_info) { return 0; } - for (obj_set_handler& i : object_storage_data_modern) { - if (i.set_id != obj_info.set_id) - continue; - - obj_set* set = i.obj_set; + auto elem_modern = object_storage_data_modern.find(obj_info.set_id); + if (elem_modern != object_storage_data_modern.end()) { + obj_set* set = elem_modern->second.obj_set; if (!set) return 0; @@ -1929,8 +1847,7 @@ int32_t object_storage_load_set_hash(void* data, uint32_t hash) { obj_set_handler* handler = object_storage_get_obj_set_handler(hash); if (!handler) { - object_storage_data_modern.push_back({}); - handler = &object_storage_data_modern.back(); + handler = &object_storage_data_modern.insert({ hash, {} }).first->second; handler->set_id = hash; } @@ -2172,16 +2089,11 @@ inline void object_storage_unload_set(uint32_t set_id) { handler->obj_file_handler.reset(); handler->farc_file_handler.reset(); if (handler->modern) - for (auto i = object_storage_data_modern.begin(); i != object_storage_data_modern.end(); i++) - if (i->set_id == set_id) { - i = object_storage_data_modern.erase(i); - break; - } + object_storage_data_modern.erase(set_id); } inline void object_storage_free() { object_storage_data.clear(); - object_storage_data.shrink_to_fit(); object_storage_data_modern.clear(); } diff --git a/src/CRE/object.hpp b/src/CRE/object.hpp index d96a83a5..02c49cb3 100644 --- a/src/CRE/object.hpp +++ b/src/CRE/object.hpp @@ -125,7 +125,6 @@ extern void object_material_msgpack_write(const char* path, const char* set_name extern void object_storage_init(const object_database* obj_db); extern obj* object_storage_get_obj(object_info obj_info); extern obj_set_handler* object_storage_get_obj_set_handler(uint32_t set_id); -extern obj_set_handler* object_storage_get_obj_set_handler_by_index(size_t index); extern obj_mesh* object_storage_get_obj_mesh(object_info obj_info, const char* mesh_name); extern obj_mesh* object_storage_get_obj_mesh_by_index(object_info obj_info, uint32_t index); extern obj_mesh* object_storage_get_obj_mesh_by_object_hash(uint32_t hash, const char* mesh_name); @@ -135,9 +134,6 @@ extern uint32_t object_storage_get_obj_mesh_index_by_hash(uint32_t hash, const c extern obj_set* object_storage_get_obj_set(uint32_t set_id); extern size_t object_storage_get_obj_set_count(); extern int32_t object_storage_get_obj_storage_load_count(uint32_t set_id); -extern obj_set* object_storage_get_obj_set_by_index(size_t index); -extern size_t object_storage_get_obj_set_index(uint32_t set_id); -extern int32_t object_storage_get_obj_storage_load_count_by_index(size_t index); extern obj_skin* object_storage_get_obj_skin(object_info obj_info); extern obj_index_buffer* object_storage_get_obj_index_buffers(uint32_t set_id); extern obj_mesh_index_buffer* object_storage_get_obj_mesh_index_buffer(object_info obj_info); diff --git a/src/CRE/post_process/aa.cpp b/src/CRE/post_process/aa.cpp index 9fafb77d..6fa109d7 100644 --- a/src/CRE/post_process/aa.cpp +++ b/src/CRE/post_process/aa.cpp @@ -35,6 +35,7 @@ post_process_aa::~post_process_aa() { void post_process_aa::apply_mlaa(render_texture* rt, render_texture* buf_rt, GLuint* samplers, int32_t ss_alpha_mask) { + gl_state_begin_event("PostProcess::mlaa"); mlaa_buffer.bind(); gl_state_active_bind_texture_2d(0, rt->color_texture->tex); gl_state_bind_sampler(0, samplers[1]); @@ -67,6 +68,7 @@ void post_process_aa::apply_mlaa(render_texture* rt, 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); + gl_state_end_event(); } void post_process_aa::init_fbo(int32_t width, int32_t height) { diff --git a/src/CRE/post_process/dof.cpp b/src/CRE/post_process/dof.cpp index 0174b9a7..99f2e3fa 100644 --- a/src/CRE/post_process/dof.cpp +++ b/src/CRE/post_process/dof.cpp @@ -51,7 +51,7 @@ namespace renderer { 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_tile(post_process_dof* dof, + 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); @@ -271,6 +271,7 @@ namespace renderer { render_texture* buf, 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_begin_event("renderer::DOF3::apply_f2"); gl_state_disable_blend(); gl_state_set_depth_mask(GL_FALSE); gl_state_set_depth_func(GL_ALWAYS); @@ -280,7 +281,7 @@ namespace renderer { uniform_value[U_DOF] = 1; gl_state_bind_vertex_array(dof->vao); - render_tile(dof, samplers, depth_texture, true); + render_tiles(dof, samplers, depth_texture, true); downsample(dof, samplers, color_texture, depth_texture, true); main_filter(dof, samplers, true); upsample(dof, rt, buf, samplers, color_texture, depth_texture, true); @@ -291,12 +292,14 @@ namespace renderer { gl_state_active_bind_texture_2d(i, 0); } gl_state_bind_vertex_array(0); + gl_state_end_event(); } void DOF3::apply_physical(post_process_dof* dof, render_texture* rt, render_texture* buf, 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_begin_event("renderer::DOF3::apply_physical"); gl_state_disable_blend(); gl_state_set_depth_mask(GL_FALSE); gl_state_set_depth_func(GL_ALWAYS); @@ -306,7 +309,7 @@ namespace renderer { uniform_value[U_DOF] = 0; gl_state_bind_vertex_array(dof->vao); - render_tile(dof, samplers, depth_texture, false); + render_tiles(dof, samplers, depth_texture, false); downsample(dof, samplers, color_texture, depth_texture, false); main_filter(dof, samplers, false); upsample(dof, rt, buf, samplers, color_texture, depth_texture, false); @@ -317,10 +320,12 @@ namespace renderer { gl_state_active_bind_texture_2d(i, 0); } gl_state_bind_vertex_array(0); + gl_state_end_event(); } - void DOF3::render_tile(post_process_dof* dof, + void DOF3::render_tiles(post_process_dof* dof, GLuint* samplers, GLuint depth_texture, bool f2) { + gl_state_begin_event("renderer::DOF3::render_tiles"); gl_state_bind_framebuffer(dof->fbo[0].buffer); glViewport(0, 0, dof->fbo[0].width, dof->fbo[0].height); uniform_value[U_DOF_STAGE] = 0; @@ -337,11 +342,13 @@ namespace renderer { gl_state_active_bind_texture_2d(0, dof->textures[0]); gl_state_bind_sampler(0, samplers[1]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + gl_state_end_event(); } void DOF3::downsample(post_process_dof* dof, GLuint* samplers, GLuint color_texture, GLuint depth_texture, bool f2) { + gl_state_begin_event("renderer::DOF3::downsample"); gl_state_bind_framebuffer(dof->fbo[2].buffer); glViewport(0, 0, dof->fbo[2].width, dof->fbo[2].height); uniform_value[U_DOF_STAGE] = 2; @@ -354,9 +361,11 @@ namespace renderer { gl_state_active_bind_texture_2d(2, dof->textures[1]); gl_state_bind_sampler(2, samplers[1]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + gl_state_end_event(); } void DOF3::main_filter(post_process_dof* dof, GLuint* samplers, bool f2) { + gl_state_begin_event("renderer::DOF3::main_filter"); gl_state_bind_framebuffer(dof->fbo[3].buffer); glViewport(0, 0, dof->fbo[3].width, dof->fbo[3].height); uniform_value[U_DOF_STAGE] = 3; @@ -370,10 +379,12 @@ namespace renderer { gl_state_active_bind_texture_2d(2, dof->textures[1]); gl_state_bind_sampler(2, samplers[1]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + gl_state_end_event(); } void DOF3::upsample(post_process_dof* dof, render_texture* rt, render_texture* buf, GLuint* samplers, GLuint color_texture, GLuint depth_texture, bool f2) { + gl_state_begin_event("renderer::DOF3::upsample"); buf->bind(); glViewport(0, 0, dof->width, dof->height); uniform_value[U_DOF_STAGE] = 4; @@ -394,6 +405,7 @@ namespace renderer { fbo::blit(buf->fbos[0], rt->fbos[0], 0, 0, buf->color_texture->width, buf->color_texture->height, 0, 0, rt->color_texture->width, rt->color_texture->height, GL_COLOR_BUFFER_BIT, GL_LINEAR); + gl_state_end_event(); } void DOF3::update_data(post_process_dof* dof, float_t min_dist, diff --git a/src/CRE/post_process/tone_map.cpp b/src/CRE/post_process/tone_map.cpp index 535feefd..58168428 100644 --- a/src/CRE/post_process/tone_map.cpp +++ b/src/CRE/post_process/tone_map.cpp @@ -39,6 +39,7 @@ void post_process_tone_map::apply(render_texture* in_tex, texture* light_proj_te if (!this) return; + gl_state_begin_event("PostProcess::tone_map"); post_process* pp = (post_process*)pp_data; set_lens_flare_power(pp->lens_flare_power); @@ -171,6 +172,7 @@ void post_process_tone_map::apply(render_texture* in_tex, texture* light_proj_te 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); + gl_state_end_event(); } void post_process_tone_map::init_fbo() { diff --git a/src/CRE/pv_db.cpp b/src/CRE/pv_db.cpp index bda72bbf..1c61f2dd 100644 --- a/src/CRE/pv_db.cpp +++ b/src/CRE/pv_db.cpp @@ -2248,7 +2248,7 @@ item_id pv_performer_item_to_item_id(pv_performer_item item) { item_sub_id pv_performer_item_to_item_sub_id(pv_performer_item item) { static const item_sub_id pv_performer_item_id_to_item_sub_id_table[] = { - ITEM_SUB_ZUJO, ITEM_SUB_MEGANE, ITEM_SUB_KUBI, ITEM_SUB_L_UDE, + ITEM_SUB_ZUJO, ITEM_SUB_MEGANE, ITEM_SUB_KUBI, ITEM_SUB_JOHA_USHIRO, }; if (item >= 0 && item < PV_PERFORMER_ITEM_MAX) diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index 15503306..78a7ec36 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -161,7 +161,7 @@ namespace rndr { RND_PASSID_SPRITE_BG, RND_PASSID_ALL_3D, RND_PASSID_SHOW_VECTOR, - RND_PASSID_POSTPROCESS, + RND_PASSID_POST_PROCESS, RND_PASSID_SPRITE_FG, RND_PASSID_12, RND_PASSID_NUM, @@ -697,7 +697,7 @@ namespace rndr { void pass_sprite_bg(render_context* rctx); void pass_all_3d(render_context* rctx); void pass_show_vector(render_context* rctx); - void pass_postprocess(render_context* rctx); + void pass_post_process(render_context* rctx); void pass_sprite_fg(render_context* rctx); void pass_3d_contour(render_context* rctx); diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index 3b8e7df3..d90ed361 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -121,8 +121,8 @@ namespace rndr { case RND_PASSID_SHOW_VECTOR: pass_show_vector(rctx); break; - case RND_PASSID_POSTPROCESS: - pass_postprocess(rctx); + case RND_PASSID_POST_PROCESS: + pass_post_process(rctx); break; case RND_PASSID_SPRITE_FG: pass_sprite_fg(rctx); @@ -150,6 +150,7 @@ namespace rndr { } void RenderManager::pass_shadowmap(render_context* rctx) { + gl_state_begin_event("pass_shadowmap"); rctx->camera->update_data(); if (rctx->litproj->set(rctx)) { rctx->obj_scene_ubo.WriteMapMemory(rctx->obj_scene); @@ -232,6 +233,7 @@ namespace rndr { } } gl_state_bind_framebuffer(0); + gl_state_end_event(); } void RenderManager::pass_ss_sss(render_context* rctx) { @@ -239,6 +241,7 @@ namespace rndr { if (!sss->init || !sss->enable) return; + gl_state_begin_event("pass_ss_sss"); rctx->camera->update_data(); post_process* pp = &rctx->post_process; //if (pp->render_width > 1280.0) @@ -325,9 +328,11 @@ namespace rndr { draw_pass_sss_filter(rctx, sss); gl_state_bind_framebuffer(0); + gl_state_end_event(); } void RenderManager::pass_reflect(render_context* rctx) { + gl_state_begin_event("pass_reflect"); render_texture& refl_tex = rctx->render_manager.get_render_texture(0); render_texture& refl_buf_tex = rctx->render_manager.get_render_texture(11); refl_tex.bind(); @@ -406,9 +411,11 @@ namespace rndr { glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w); } gl_state_bind_framebuffer(0); + gl_state_end_event(); } void RenderManager::pass_refract(render_context* rctx) { + gl_state_begin_event("pass_refract"); render_texture& refract_texture = rctx->render_manager.get_render_texture(1); refract_texture.bind(); if (rctx->disp_manager.get_obj_count(mdl::OBJ_TYPE_REFRACT_OPAQUE) @@ -450,15 +457,19 @@ namespace rndr { glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w); } gl_state_bind_framebuffer(0); + gl_state_end_event(); } void RenderManager::pass_user(render_context* rctx) { + gl_state_begin_event("pass_user"); for (draw_user& i : user) if (i.func) i.func(i.data); + gl_state_end_event(); } void RenderManager::pass_clear(render_context* rctx) { + gl_state_begin_event("pass_clear"); if (true/*field_128*/) { vec4 clear_color = get_clear_color(); glClearBufferfv(GL_COLOR, 0, (GLfloat*)&clear_color); @@ -504,12 +515,14 @@ namespace rndr { } } gl_state_get_error(); + gl_state_end_event(); } void RenderManager::pass_sprite_bg(render_context* rctx) { if (!sprite_manager_get_reqlist_count(2)) return; + gl_state_begin_event("pass_sprite_bg"); post_process* pp = &rctx->post_process; pp->set_render_texture(true); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); @@ -527,9 +540,11 @@ namespace rndr { gl_state_set_depth_mask(GL_TRUE); gl_state_bind_framebuffer(0); gl_state_get_error(); + gl_state_end_event(); } void RenderManager::pass_all_3d(render_context* rctx) { + gl_state_begin_event("pass_all_3d"); rctx->camera->update_data(); rctx->post_process.set_render_texture(); draw_pass_set_camera(rctx); @@ -714,6 +729,7 @@ namespace rndr { shader::unbind(); pass_sprite_fg_surf(rctx); gl_state_bind_framebuffer(0); + gl_state_end_event(); } void RenderManager::pass_show_vector(render_context* rctx) { @@ -721,6 +737,8 @@ namespace rndr { /*if (!show_vector_flags) return; + gl_state_begin_event("pass_show_vector"); + rctx->camera->update_data(); rctx->view_mat = rctx->camera->view; rctx->post_process.set_render_texture(); @@ -749,10 +767,12 @@ namespace rndr { draw_task_draw_objects_by_type_show_vector(rctx, mdl::OBJ_TYPE_TRANSLUCENT_NO_SHADOW, i); draw_task_draw_objects_by_type_show_vector(rctx, mdl::OBJ_TYPE_TRANSLUCENT, i); } - }*/ + } + gl_state_end_event();*/ } - void RenderManager::pass_postprocess(render_context* rctx) { + void RenderManager::pass_post_process(render_context* rctx) { + gl_state_begin_event("pass_post_process"); rctx->camera->update_data(); texture* light_proj_tex = 0; @@ -765,12 +785,14 @@ namespace rndr { } rctx->post_process.apply(rctx->camera, light_proj_tex, npr_param); + gl_state_end_event(); } void RenderManager::pass_sprite_fg(render_context* rctx) { if (!sprite_manager_get_reqlist_count(0)) return; + gl_state_begin_event("pass_sprite_fg"); post_process* pp = &rctx->post_process; glViewport(0, 0, pp->sprite_width, pp->sprite_height); @@ -802,6 +824,7 @@ namespace rndr { gl_state_bind_read_framebuffer(0); } gl_state_get_error(); + gl_state_end_event(); } void RenderManager::pass_3d_contour(render_context* rctx) { diff --git a/src/CRE/rob/rob.cpp b/src/CRE/rob/rob.cpp index de6992b6..fad7ce34 100644 --- a/src/CRE/rob/rob.cpp +++ b/src/CRE/rob/rob.cpp @@ -2199,7 +2199,7 @@ extern render_context* rctx_ptr; extern uint32_t cmn_set_id; const chara_init_data* chara_init_data_get(chara_index chara_index) { - if (chara_index >= CHARA_MIKU && chara_index <= CHARA_TETO) + if (chara_index >= 0 && chara_index < CHARA_MAX) return &chara_init_data_array[chara_index]; return 0; } @@ -2785,7 +2785,6 @@ uint32_t rob_chara::get_rob_cmn_mottbl_motion_id(int32_t id) { int32_t v2 = data.field_8.field_1A4; if (rob_cmn_mottbl_data - && chara_index >= CHARA_MIKU && chara_index >= 0 && chara_index < rob_cmn_mottbl_data->chara_count && id >= 0 && id < rob_cmn_mottbl_data->mottbl_indices_count) { rob_cmn_mottbl_sub_header* v4 = (rob_cmn_mottbl_sub_header*)((uint8_t*)rob_cmn_mottbl_data @@ -13712,7 +13711,7 @@ item_cos_texture_change_tex::~item_cos_texture_change_tex() { } -rob_chara_item_cos_data::rob_chara_item_cos_data() : chara_index(), chara_index_2nd(), cos(), cos_2nd() { +rob_chara_item_cos_data::rob_chara_item_cos_data() : curr_chara_index(), chara_index(), curr_cos(), cos() { } @@ -13846,7 +13845,7 @@ static void sub_140522990(rob_chara_item_cos_data* item_cos_data) { item_cos_data->texture_pattern_clear(); for (int32_t sub_id = ITEM_SUB_ZUJO; sub_id < ITEM_SUB_MAX; sub_id++) { int32_t item_no = item_cos_data->cos.arr[sub_id]; - if (!item_no || sub_id == ITEM_SUB_KUTSU) + if (!item_no || sub_id == ITEM_SUB_HADA) continue; const item_table_item* item = item_table_handler_array_get_item(item_cos_data->chara_index, item_no); @@ -14020,8 +14019,8 @@ static void sub_140522C60(rob_chara_item_cos_data* item_cos_data, rob_chara_item const item_sub_id dword_140A2BB70[] = { ITEM_SUB_ZUJO, ITEM_SUB_KAMI, ITEM_SUB_HITAI, ITEM_SUB_ME, ITEM_SUB_MEGANE, ITEM_SUB_MIMI, ITEM_SUB_KUCHI, ITEM_SUB_MAKI, ITEM_SUB_KUBI, ITEM_SUB_INNER, - ITEM_SUB_JOHA_MAE, ITEM_SUB_JOHA_USHIRO, ITEM_SUB_HADA, ITEM_SUB_U_UDE, ITEM_SUB_L_UDE, - ITEM_SUB_TE, ITEM_SUB_BELT, ITEM_SUB_ASI, ITEM_SUB_SUNE, ITEM_SUB_HEAD, ITEM_SUB_MAX, + ITEM_SUB_KATA, ITEM_SUB_U_UDE, ITEM_SUB_L_UDE, ITEM_SUB_JOHA_MAE, ITEM_SUB_JOHA_USHIRO, + ITEM_SUB_BELT, ITEM_SUB_KOSI, ITEM_SUB_SUNE, ITEM_SUB_KUTSU, ITEM_SUB_HEAD, ITEM_SUB_MAX, }; const item_sub_id* v6 = dword_140A2BB70; @@ -14086,7 +14085,7 @@ static void sub_140522D00(rob_chara_item_cos_data* item_cos_data, rob_chara_item return; const item_sub_id dword_140A2BBC8[] = { - ITEM_SUB_KATA, ITEM_SUB_PANTS, ITEM_SUB_MAX, + ITEM_SUB_TE, ITEM_SUB_ASI, ITEM_SUB_MAX, }; const item_sub_id* v6 = dword_140A2BBC8; @@ -14114,7 +14113,7 @@ static void sub_140522D90(rob_chara_item_cos_data* item_cos_data, rob_chara_item return; const item_sub_id dword_140A2BBD8[] = { - ITEM_SUB_COSI, ITEM_SUB_OUTER, ITEM_SUB_MAX, + ITEM_SUB_PANTS, ITEM_SUB_OUTER, ITEM_SUB_MAX, }; const item_sub_id* v6 = dword_140A2BBD8; @@ -14173,7 +14172,7 @@ static void sub_140522F90(rob_chara_item_cos_data* item_cos_data, rob_chara_item if (!item_table_handler_array_get_table(item_cos_data->chara_index)) return; - int32_t item_no = item_cos_data->cos.arr[ITEM_SUB_KUTSU]; + int32_t item_no = item_cos_data->cos.arr[ITEM_SUB_HADA]; if (!item_no) return; @@ -14247,7 +14246,7 @@ static void sub_1405231D0(rob_chara_item_cos_data* item_cos_data, rob_chara_item if (!item_table_handler_array_get_table(item_cos_data->chara_index)) return; - for (int32_t i = ITEM_SUB_ZUJO; i < ITEM_SUB_MAX; i++) + for (int32_t i = 0; i < ITEM_SUB_MAX; i++) sub_140523230(item_cos_data, rob_itm_equip, item_cos_data->cos.arr[i]); } @@ -14308,7 +14307,7 @@ void rob_chara_item_cos_data::set_item_no(item_sub_id sub_id, int32_t item_no) { } void rob_chara_item_cos_data::set_item_nos(const int32_t* item_nos) { - for (int32_t i = ITEM_SUB_ZUJO; i < ITEM_SUB_MAX; i++) + for (int32_t i = 0; i < ITEM_SUB_MAX; i++) set_item_no((item_sub_id)i, item_nos[i]); } @@ -17027,7 +17026,7 @@ bool OpdMakeManager::Ctrl() { } break; case 5: { bool v8 = false; - for (int32_t i = CHARA_MIKU; i < CHARA_MAX; i++) + for (int32_t i = 0; i < CHARA_MAX; i++) if (!sub_140479090(field_88, (chara_index)i)) { chara = (chara_index)i; v8 = true; @@ -19134,7 +19133,7 @@ bool TaskRobLoad::LoadCharaItemCheckNotRead(chara_index chara_index, int32_t ite void TaskRobLoad::LoadCharaItems(chara_index chara_index, item_cos_data* cos, void* data, const object_database* obj_db) { - for (int32_t i = ITEM_SUB_ZUJO; i < ITEM_SUB_MAX; i++) + for (int32_t i = 0; i < ITEM_SUB_MAX; i++) LoadCharaItem(chara_index, cos->arr[i], data, obj_db); } @@ -19204,7 +19203,7 @@ void TaskRobLoad::UnloadCharaItem(chara_index chara_index, int32_t item_no) { } void TaskRobLoad::UnloadCharaItems(chara_index chara_index, item_cos_data* cos) { - for (int32_t i = ITEM_SUB_ZUJO; i < ITEM_SUB_MAX; i++) + for (int32_t i = 0; i < ITEM_SUB_MAX; i++) UnloadCharaItem(chara_index, cos->arr[i]); } @@ -19539,7 +19538,7 @@ bool TaskRobManager::GetWait(rob_chara* rob_chr) { if (i->chara_id == chara_id) return true; - return true; + return false; } TaskRobMotionModifier::TaskRobMotionModifier() { diff --git a/src/CRE/rob/rob.hpp b/src/CRE/rob/rob.hpp index 6b987317..5d04742f 100644 --- a/src/CRE/rob/rob.hpp +++ b/src/CRE/rob/rob.hpp @@ -2309,10 +2309,10 @@ struct item_cos_texture_change_tex { }; struct rob_chara_item_cos_data { + ::chara_index curr_chara_index; ::chara_index chara_index; - ::chara_index chara_index_2nd; + item_cos_data curr_cos; item_cos_data cos; - item_cos_data cos_2nd; std::map> texture_change; std::map> item_change; std::map field_F0; diff --git a/src/DivaGL/bone_data.hpp b/src/DivaGL/bone_data.hpp index 868be499..0cff4ba1 100644 --- a/src/DivaGL/bone_data.hpp +++ b/src/DivaGL/bone_data.hpp @@ -162,19 +162,19 @@ enum item_sub_id { 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_KATA = 0x0B, + ITEM_SUB_U_UDE = 0x0C, + ITEM_SUB_L_UDE = 0x0D, + ITEM_SUB_TE = 0x0E, + ITEM_SUB_JOHA_MAE = 0x0F, + ITEM_SUB_JOHA_USHIRO = 0x10, + ITEM_SUB_BELT = 0x11, + ITEM_SUB_KOSI = 0x12, + ITEM_SUB_PANTS = 0x13, + ITEM_SUB_ASI = 0x14, + ITEM_SUB_SUNE = 0x15, + ITEM_SUB_KUTSU = 0x16, + ITEM_SUB_HADA = 0x17, ITEM_SUB_HEAD = 0x18, ITEM_SUB_MAX = 0x19, }; diff --git a/src/KKdLib/database/item_table.cpp b/src/KKdLib/database/item_table.cpp index 348f99b9..a90a59d5 100644 --- a/src/KKdLib/database/item_table.cpp +++ b/src/KKdLib/database/item_table.cpp @@ -67,6 +67,68 @@ const char* chara_names[] = { "EXT", }; +const char* item_id_names[] = { + "BODY", + "ATAMA", + "KATA_R", + "MUNE", + "KATA_L", + "UDE_R", + "SENAKA", + "UDE_L", + "HARA", + "KOSI", + "TE_R", + "TE_L", + "MOMO", + "SUNE", + "ASI", + "KAMI", + "OUTER", + "PANTS", + "ZUJO", + "MEGANE", + "KUBI", + "JOHA_USHIRO", + "KUCHI", + "ITEM09", + "ITEM10", + "ITEM11", + "ITEM12", + "ITEM13", + "ITEM14", + "ITEM15", + "ITEM16", +}; + +const char* item_sub_id_names[] = { + "ZUJO", + "KAMI", + "HITAI", + "ME", + "MEGANE", + "MIMI", + "KUCHI", + "MAKI", + "KUBI", + "INNER", + "OUTER", + "KATA", + "U_UDE", + "L_UDE", + "TE", + "JOHA_MAE", + "JOHA_USHIRO", + "BELT", + "KOSI", + "PANTS", + "ASI", + "SUNE", + "KUTSU", + "HADA", + "HEAD", +}; + 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); @@ -230,19 +292,19 @@ bool itm_table::load_file(void* data, const char* path, const char* file, uint32 } const char* chara_index_get_auth_3d_name(chara_index chara_index) { - if (chara_index >= CHARA_MIKU && chara_index <= CHARA_TETO) + if (chara_index >= 0 && chara_index < CHARA_MAX) return chara_auth_3d_names[chara_index]; return 0; } const char* chara_index_get_chara_name(chara_index chara_index) { - if (chara_index >= CHARA_MIKU && chara_index <= CHARA_TETO) + if (chara_index >= 0 && chara_index < CHARA_MAX) return chara_names[chara_index]; return 0; } const char* chara_index_get_face_mot_name(chara_index chara_index) { - if (chara_index >= CHARA_MIKU && chara_index <= CHARA_TETO) + if (chara_index >= 0 && chara_index < CHARA_MAX) return chara_face_mot_names[chara_index]; return 0; } @@ -251,14 +313,13 @@ chara_index chara_index_get_from_chara_name(const char* str) { if (!str) return CHARA_MAX; - for (int32_t i = CHARA_MIKU; i < CHARA_MAX; i++) { + for (int32_t i = 0; i < CHARA_MAX; i++) { const char* chr_s = chara_names[i]; const char* s = str; char chr_c; char diff; - do - { + do { chr_c = *chr_s; diff = *s - chr_c; if (diff) @@ -275,11 +336,23 @@ chara_index chara_index_get_from_chara_name(const char* str) { } const char* chara_index_get_name(chara_index chara_index) { - if (chara_index >= CHARA_MIKU && chara_index <= CHARA_TETO) + if (chara_index >= 0 && chara_index < CHARA_MAX) return chara_full_names[chara_index]; return 0; } +const char* item_id_get_name(item_id id) { + if (id >= 0 && id < ITEM_MAX) + return item_id_names[id]; + return 0; +} + +const char* item_sub_id_get_name(item_sub_id sub_id) { + if (sub_id >= 0 && sub_id < ITEM_SUB_MAX) + return item_sub_id_names[sub_id]; + return 0; +} + 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); diff --git a/src/KKdLib/database/item_table.hpp b/src/KKdLib/database/item_table.hpp index c5bfb9b0..e1085391 100644 --- a/src/KKdLib/database/item_table.hpp +++ b/src/KKdLib/database/item_table.hpp @@ -77,19 +77,19 @@ enum item_sub_id { 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_KATA = 0x0B, + ITEM_SUB_U_UDE = 0x0C, + ITEM_SUB_L_UDE = 0x0D, + ITEM_SUB_TE = 0x0E, + ITEM_SUB_JOHA_MAE = 0x0F, + ITEM_SUB_JOHA_USHIRO = 0x10, + ITEM_SUB_BELT = 0x11, + ITEM_SUB_KOSI = 0x12, + ITEM_SUB_PANTS = 0x13, + ITEM_SUB_ASI = 0x14, + ITEM_SUB_SUNE = 0x15, + ITEM_SUB_KUTSU = 0x16, + ITEM_SUB_HADA = 0x17, ITEM_SUB_HEAD = 0x18, ITEM_SUB_MAX = 0x19, }; @@ -200,8 +200,14 @@ extern const char* chara_face_mot_names[]; extern const char* chara_full_names[]; extern const char* chara_names[]; +extern const char* item_id_names[]; +extern const char* item_sub_id_names[]; + 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); + +extern const char* item_id_get_name(item_id id); +extern const char* item_sub_id_get_name(item_sub_id sub_id); diff --git a/src/KKdLib/str_utils.cpp b/src/KKdLib/str_utils.cpp index b2593ec3..a3e74416 100644 --- a/src/KKdLib/str_utils.cpp +++ b/src/KKdLib/str_utils.cpp @@ -447,8 +447,7 @@ inline int32_t str_utils_compare_length(const char* str0, size_t str0_len, const int32_t diff = 0; char c0; char c1; - do - { + do { c0 = *str0++; c1 = *str1++; if (!c0 || !c1) @@ -485,8 +484,7 @@ inline int32_t str_utils_compare_length(const wchar_t* str0, size_t str0_len, co int32_t diff = 0; wchar_t c0; wchar_t c1; - do - { + do { c0 = *str0++; c1 = *str1++; if (!c0 || !c1) diff --git a/src/ReDIVA/classes/data_view/object.cpp b/src/ReDIVA/classes/data_view/object.cpp index 68672936..fe4a097f 100644 --- a/src/ReDIVA/classes/data_view/object.cpp +++ b/src/ReDIVA/classes/data_view/object.cpp @@ -47,7 +47,7 @@ void data_view_object_imgui(class_data* data) { return; } - size_t count = object_storage_get_obj_set_count(); + /*size_t count = object_storage_get_obj_set_count(); for (size_t i = 0; i < count; i++) { obj_set_handler* handler = object_storage_get_obj_set_handler_by_index(i); if (!handler || !handler->obj_set) @@ -61,7 +61,7 @@ void data_view_object_imgui(class_data* data) { handler->set_id, load_count, handler->name.c_str()); ImGui::Selectable(buf); ImGui::PopID(); - } + }*/ data->imgui_focus |= ImGui::IsWindowFocused(); ImGui::End(); diff --git a/src/ReDIVA/classes/glitter_editor.cpp b/src/ReDIVA/classes/glitter_editor.cpp index d19c0154..b38ffeeb 100644 --- a/src/ReDIVA/classes/glitter_editor.cpp +++ b/src/ReDIVA/classes/glitter_editor.cpp @@ -4182,7 +4182,7 @@ static void glitter_editor_property_particle(GlitterEditor* glt_edt, class_data* obj_set_handler* handler = object_storage_get_obj_set_handler(set_id); ssize_t object_set_count = object_storage_get_obj_set_count(); - ImGui::StartPropertyColumn("Object Set"); + /*ImGui::StartPropertyColumn("Object Set"); if (ImGui::BeginCombo("##Object Set", handler ? handler->name.c_str() : "None", 0)) { ssize_t set_index = handler ? object_storage_get_obj_set_index(set_id) : -1; @@ -4219,7 +4219,7 @@ static void glitter_editor_property_particle(GlitterEditor* glt_edt, class_data* data->imgui_focus |= true; ImGui::EndCombo(); } - ImGui::EndPropertyColumn(); + ImGui::EndPropertyColumn();*/ ImGui::DisableElementPush(set_id != -1); obj* obj = 0; diff --git a/src/ReDIVA/data_test/auth_2d_test.cpp b/src/ReDIVA/data_test/auth_2d_test.cpp index 7495a53f..8f4c452c 100644 --- a/src/ReDIVA/data_test/auth_2d_test.cpp +++ b/src/ReDIVA/data_test/auth_2d_test.cpp @@ -17,6 +17,32 @@ #include "../../CRE/task_effect.hpp" #include "../input_state.hpp" +class DtwAet : public dw::Shell { +public: + dw::ListBox* set; + dw::ListBox* id; + dw::ListBox* layer; + dw::ListBox* marker; + dw::Label* marker_frame; + dw::ListBox* type; + dw::Slider* frame; + + DtwAet(); + virtual ~DtwAet() override; + + virtual void Hide() override; + + static void CenteringCallback(dw::Widget* data); + static void FrameCallback(dw::Widget* data); + static void IdCallback(dw::Widget* data); + static void LayerCallback(dw::Widget* data); + static void LockCallback(dw::Widget* data); + static void LoopCallback(dw::Widget* data); + static void MarkerCallback(dw::Widget* data); + static void SetCallback(dw::Widget* data); + static void TypeCallback(dw::Widget* data); +}; + extern int32_t width; extern int32_t height; @@ -363,6 +389,36 @@ void DtmAet::SetCentering(bool value) { centering = value; } +void dtm_aet_init() { + dtm_aet = new DtmAet; +} + +void dtm_aet_load() { + if (app::TaskWork::CheckTaskReady(dtm_aet)) + return; + + app::TaskWork::AddTask(dtm_aet, "DATA_TEST_AET_MANAGER"); + + if (!dtw_aet) { + dtw_aet = new DtwAet; + dtw_aet->sub_1402F38B0(); + } + else + dtw_aet->Disp(); +} + +void dtm_aet_unload() { + dtm_aet->DelTask(); + dtw_aet->Hide(); +} + +void dtm_aet_free() { + if (dtm_aet) { + delete dtm_aet; + dtm_aet = 0; + } +} + DtwAet::DtwAet() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; @@ -508,33 +564,3 @@ void DtwAet::TypeCallback(dw::Widget* data) { if (list_box) dtm_aet->SetType(list_box->list->selected_item ? 1 : 0); } - -void dtm_aet_init() { - dtm_aet = new DtmAet; -} - -void dtm_aet_load() { - if (app::TaskWork::CheckTaskReady(dtm_aet)) - return; - - app::TaskWork::AddTask(dtm_aet, "DATA_TEST_AET_MANAGER"); - - if (!dtw_aet) { - dtw_aet = new DtwAet; - dtw_aet->sub_1402F38B0(); - } - else - dtw_aet->Disp(); -} - -void dtm_aet_unload() { - dtm_aet->DelTask(); - dtw_aet->Hide(); -} - -void dtm_aet_free() { - if (dtm_aet) { - delete dtm_aet; - dtm_aet = 0; - } -} diff --git a/src/ReDIVA/data_test/auth_2d_test.hpp b/src/ReDIVA/data_test/auth_2d_test.hpp index a6115aca..d3c12e8e 100644 --- a/src/ReDIVA/data_test/auth_2d_test.hpp +++ b/src/ReDIVA/data_test/auth_2d_test.hpp @@ -54,36 +54,8 @@ public: virtual void SetCentering(bool value); }; -class DtwAet : public dw::Shell { -public: - dw::ListBox* set; - dw::ListBox* id; - dw::ListBox* layer; - dw::ListBox* marker; - dw::Label* marker_frame; - dw::ListBox* type; - dw::Slider* frame; - - DtwAet(); - virtual ~DtwAet() override; - - virtual void Hide() override; - - static void CenteringCallback(dw::Widget* data); - static void FrameCallback(dw::Widget* data); - static void IdCallback(dw::Widget* data); - static void LayerCallback(dw::Widget* data); - static void LockCallback(dw::Widget* data); - static void LoopCallback(dw::Widget* data); - static void MarkerCallback(dw::Widget* data); - static void SetCallback(dw::Widget* data); - static void TypeCallback(dw::Widget* data); -}; - extern DtmAet* dtm_aet; -extern DtwAet* dtw_aet; - extern void dtm_aet_init(); extern void dtm_aet_load(); extern void dtm_aet_unload(); diff --git a/src/ReDIVA/data_test/auth_3d_test.cpp b/src/ReDIVA/data_test/auth_3d_test.cpp index 8026e42a..eb1cf44b 100644 --- a/src/ReDIVA/data_test/auth_3d_test.cpp +++ b/src/ReDIVA/data_test/auth_3d_test.cpp @@ -16,6 +16,285 @@ #include "../dw.hpp" #include "../input_state.hpp" +class Auth3dTestRobWindow : public dw::Shell { +public: + class SelectionListRob : public dw::SelectionAdapter { + public: + SelectionListRob(); + virtual ~SelectionListRob() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionListDispStyle : public dw::SelectionAdapter { + public: + SelectionListDispStyle(); + virtual ~SelectionListDispStyle() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + dw::ListBox* chara_list[2]; + dw::ListBox* costume_list[2]; + //int64_t field_1A0; + SelectionListRob selection_list_rob; + SelectionListDispStyle selection_list_disp_style; + + Auth3dTestRobWindow(); + virtual ~Auth3dTestRobWindow() override; + + void Hide() override; + + void GetCharaCos(::chara_index chara_index, int32_t chara_id, dw::ListBox* list_box); +}; + +class Auth3dTestSubWindow : public dw::Shell { +public: + class SelectionListStage : public dw::SelectionAdapter { + public: + SelectionListStage(); + virtual ~SelectionListStage() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionListAet : public dw::SelectionAdapter { + public: + SelectionListAet(); + virtual ~SelectionListAet() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + dw::Button* plane_above_floor; + dw::Button* stage; + dw::Button* stg_auth; + dw::ListBox* stg_list; + dw::Button* stage_link_change; + dw::Button* auth_2d; + dw::ListBox* aet_list; + SelectionListStage selection_list_stage; + SelectionListAet selection_list_aet; + + Auth3dTestSubWindow(); + virtual ~Auth3dTestSubWindow() override; + + void Hide() override; + + void ResetAet(); +}; + +class Auth3dTestWindow : public dw::Shell { +public: + class SelectionCategoryMenuItem : public dw::SelectionAdapter { + public: + SelectionCategoryMenuItem(); + virtual ~SelectionCategoryMenuItem() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionCategoryList : public dw::SelectionAdapter { + public: + SelectionCategoryList(); + virtual ~SelectionCategoryList() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionIDMenuItem : public dw::SelectionAdapter { + public: + SelectionIDMenuItem(); + virtual ~SelectionIDMenuItem() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionList : public dw::SelectionAdapter { + public: + SelectionList(); + virtual ~SelectionList() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionSliderFrame : public dw::SelectionAdapter { + public: + SelectionSliderFrame(); + virtual ~SelectionSliderFrame() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionSliderTransElement : public dw::SelectionAdapter { + public: + int32_t axis; + + SelectionSliderTransElement(); + virtual ~SelectionSliderTransElement() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionSliderRotY : public dw::SelectionAdapter { + public: + SelectionSliderRotY(); + virtual ~SelectionSliderRotY() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionButtonPlay : public dw::SelectionAdapter { + public: + SelectionButtonPlay(); + virtual ~SelectionButtonPlay() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionButtonBegin : public dw::SelectionAdapter { + public: + SelectionButtonBegin(); + virtual ~SelectionButtonBegin() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionButtonEnd : public dw::SelectionAdapter { + public: + SelectionButtonEnd(); + virtual ~SelectionButtonEnd() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionButtonBindBoolFunc : public dw::SelectionAdapter { + public: + void(*callback)(bool value); + + SelectionButtonBindBoolFunc(); + virtual ~SelectionButtonBindBoolFunc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionButtonSnapShot : public dw::SelectionAdapter { + public: + SelectionButtonSnapShot(); + virtual ~SelectionButtonSnapShot() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionButtonLog : public dw::SelectionAdapter { + public: + SelectionButtonLog(); + virtual ~SelectionButtonLog() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionButtonShadowType : public dw::SelectionAdapter { + public: + SelectionButtonShadowType(); + virtual ~SelectionButtonShadowType() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionButtonSave : public dw::SelectionAdapter { + public: + SelectionButtonSave(); + virtual ~SelectionButtonSave() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionButtonCamReset : public dw::SelectionAdapter { + public: + SelectionButtonCamReset(); + virtual ~SelectionButtonCamReset() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SelectionButtonDebugCamera : public dw::SelectionAdapter { + public: + SelectionButtonDebugCamera(); + virtual ~SelectionButtonDebugCamera() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + std::vector categories; + dw::Button* chara; + dw::Button* stg; + dw::Button* eff; + dw::Button* nage; + dw::Menu* chara_menu; + dw::Menu* stg_menu; + dw::Menu* eff_menu; + dw::Menu* nage_menu; + dw::ListBox* category_list; + dw::ListBox* id_list; + dw::Button* obj_link; + dw::Label* frame; + dw::Slider* frame_slider; + dw::Button* begin; + dw::Button* play; + dw::Button* end; + dw::Button* repeat; + dw::Button* left_right_reverse; + dw::Button* pos; + dw::Button* log; + dw::Button* snap_shot; + dw::Button* self_shadow_off; + dw::Button* self_shadow_on; + dw::Button* black_mask; + dw::Slider* trans_x; + dw::Slider* trans_z; + dw::Slider* rot_y; + dw::Button* save; + Auth3dTestSubWindow* sub_window; + Auth3dTestRobWindow* rob_window; + SelectionCategoryMenuItem category_menu_item_listener; + SelectionCategoryList category_list_listener; + SelectionIDMenuItem id_menu_listener; + SelectionList list_listener; + SelectionSliderFrame slider_frame_listener; + SelectionSliderTransElement trans_x_listener; + SelectionSliderTransElement trans_z_listener; + SelectionSliderRotY rot_y_listener; + SelectionButtonPlay play_listener; + SelectionButtonBegin begin_listener; + SelectionButtonEnd end_listener; + SelectionButtonBindBoolFunc pos_listener; + SelectionButtonBindBoolFunc repeat_listener; + SelectionButtonBindBoolFunc left_right_reverse_listener; + SelectionButtonSnapShot snap_shot_listener; + SelectionButtonLog log_listener; + SelectionButtonShadowType shadow_type_listener; + SelectionButtonSave save_listener; + SelectionButtonCamReset cam_reset_listener; + SelectionButtonDebugCamera debug_camera_listener; + + Auth3dTestWindow(); + virtual ~Auth3dTestWindow() override; + + void Hide() override; + + void SetAuth3dCategoryIndex(size_t index); + void SetAuth3dIndex(size_t index); + void SetMaxFrame(float_t max_frame); + void UpdatePlayButton(); + + static void CategoryCharaMenuInit(dw::Button* button, dw::Menu*& menu, + std::vector& items, dw::SelectionListener* selection_listener); + static void LeftRightReverseCallback(bool value); + static void PosCallback(bool value); + static void RepeatCallback(bool value); +}; + class SelectionButtonBool : public dw::SelectionAdapter { public: SelectionButtonBool(); @@ -380,6 +659,21 @@ void Auth3dTestTask::sub_140244610() { } } +void auth_3d_test_task_init() { + auth_3d_test_task = new Auth3dTestTask; +} + +void auth_3d_test_task_disp_chara() { + auth_3d_test_task->DispChara(); +} + +void auth_3d_test_task_free() { + if (auth_3d_test_task) { + delete auth_3d_test_task; + auth_3d_test_task = 0; + } +} + Auth3dTestRobWindow::SelectionListRob::SelectionListRob() { } @@ -1231,21 +1525,6 @@ void Auth3dTestWindow::RepeatCallback(bool value) { auth_3d_test_task->auth_3d_id.set_repeat(value); } -void auth_3d_test_task_init() { - auth_3d_test_task = new Auth3dTestTask; -} - -void auth_3d_test_task_disp_chara() { - auth_3d_test_task->DispChara(); -} - -void auth_3d_test_task_free() { - if (auth_3d_test_task) { - delete auth_3d_test_task; - auth_3d_test_task = 0; - } -} - SelectionButtonBool::SelectionButtonBool() { } diff --git a/src/ReDIVA/data_test/auth_3d_test.hpp b/src/ReDIVA/data_test/auth_3d_test.hpp index ea15d0be..91a3e4f6 100644 --- a/src/ReDIVA/data_test/auth_3d_test.hpp +++ b/src/ReDIVA/data_test/auth_3d_test.hpp @@ -9,8 +9,7 @@ #include "../../KKdLib/default.hpp" #include "../../KKdLib/database/item_table.hpp" #include "../../CRE/auth_3d.hpp" -#include "../task_window.hpp" -#include "../dw.hpp" +#include "../../CRE/task.hpp" class Auth3dTestTask : public app::Task { public: @@ -79,287 +78,7 @@ public: void sub_140244610(); }; -class Auth3dTestRobWindow : public dw::Shell { -public: - class SelectionListRob : public dw::SelectionAdapter { - public: - SelectionListRob(); - virtual ~SelectionListRob() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionListDispStyle : public dw::SelectionAdapter { - public: - SelectionListDispStyle(); - virtual ~SelectionListDispStyle() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - dw::ListBox* chara_list[2]; - dw::ListBox* costume_list[2]; - //int64_t field_1A0; - SelectionListRob selection_list_rob; - SelectionListDispStyle selection_list_disp_style; - - Auth3dTestRobWindow(); - virtual ~Auth3dTestRobWindow() override; - - void Hide() override; - - void GetCharaCos(::chara_index chara_index, int32_t chara_id, dw::ListBox* list_box); -}; - -class Auth3dTestSubWindow : public dw::Shell { -public: - class SelectionListStage : public dw::SelectionAdapter { - public: - SelectionListStage(); - virtual ~SelectionListStage() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionListAet : public dw::SelectionAdapter { - public: - SelectionListAet(); - virtual ~SelectionListAet() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - dw::Button* plane_above_floor; - dw::Button* stage; - dw::Button* stg_auth; - dw::ListBox* stg_list; - dw::Button* stage_link_change; - dw::Button* auth_2d; - dw::ListBox* aet_list; - SelectionListStage selection_list_stage; - SelectionListAet selection_list_aet; - - Auth3dTestSubWindow(); - virtual ~Auth3dTestSubWindow() override; - - void Hide() override; - - void ResetAet(); -}; - -class Auth3dTestWindow : public dw::Shell { -public: - class SelectionCategoryMenuItem : public dw::SelectionAdapter { - public: - SelectionCategoryMenuItem(); - virtual ~SelectionCategoryMenuItem() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionCategoryList : public dw::SelectionAdapter { - public: - SelectionCategoryList(); - virtual ~SelectionCategoryList() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionIDMenuItem : public dw::SelectionAdapter { - public: - SelectionIDMenuItem(); - virtual ~SelectionIDMenuItem() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionList : public dw::SelectionAdapter { - public: - SelectionList(); - virtual ~SelectionList() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionSliderFrame : public dw::SelectionAdapter { - public: - SelectionSliderFrame(); - virtual ~SelectionSliderFrame() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionSliderTransElement : public dw::SelectionAdapter { - public: - int32_t axis; - - SelectionSliderTransElement(); - virtual ~SelectionSliderTransElement() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionSliderRotY : public dw::SelectionAdapter { - public: - SelectionSliderRotY(); - virtual ~SelectionSliderRotY() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionButtonPlay : public dw::SelectionAdapter { - public: - SelectionButtonPlay(); - virtual ~SelectionButtonPlay() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionButtonBegin : public dw::SelectionAdapter { - public: - SelectionButtonBegin(); - virtual ~SelectionButtonBegin() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionButtonEnd : public dw::SelectionAdapter { - public: - SelectionButtonEnd(); - virtual ~SelectionButtonEnd() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionButtonBindBoolFunc : public dw::SelectionAdapter { - public: - void(*callback)(bool value); - - SelectionButtonBindBoolFunc(); - virtual ~SelectionButtonBindBoolFunc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionButtonSnapShot : public dw::SelectionAdapter { - public: - SelectionButtonSnapShot(); - virtual ~SelectionButtonSnapShot() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionButtonLog : public dw::SelectionAdapter { - public: - SelectionButtonLog(); - virtual ~SelectionButtonLog() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionButtonShadowType : public dw::SelectionAdapter { - public: - SelectionButtonShadowType(); - virtual ~SelectionButtonShadowType() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionButtonSave : public dw::SelectionAdapter { - public: - SelectionButtonSave(); - virtual ~SelectionButtonSave() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionButtonCamReset : public dw::SelectionAdapter { - public: - SelectionButtonCamReset(); - virtual ~SelectionButtonCamReset() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SelectionButtonDebugCamera : public dw::SelectionAdapter { - public: - SelectionButtonDebugCamera(); - virtual ~SelectionButtonDebugCamera() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - std::vector categories; - dw::Button* chara; - dw::Button* stg; - dw::Button* eff; - dw::Button* nage; - dw::Menu* chara_menu; - dw::Menu* stg_menu; - dw::Menu* eff_menu; - dw::Menu* nage_menu; - dw::ListBox* category_list; - dw::ListBox* id_list; - dw::Button* obj_link; - dw::Label* frame; - dw::Slider* frame_slider; - dw::Button* begin; - dw::Button* play; - dw::Button* end; - dw::Button* repeat; - dw::Button* left_right_reverse; - dw::Button* pos; - dw::Button* log; - dw::Button* snap_shot; - dw::Button* self_shadow_off; - dw::Button* self_shadow_on; - dw::Button* black_mask; - dw::Slider* trans_x; - dw::Slider* trans_z; - dw::Slider* rot_y; - dw::Button* save; - Auth3dTestSubWindow* sub_window; - Auth3dTestRobWindow* rob_window; - SelectionCategoryMenuItem category_menu_item_listener; - SelectionCategoryList category_list_listener; - SelectionIDMenuItem id_menu_listener; - SelectionList list_listener; - SelectionSliderFrame slider_frame_listener; - SelectionSliderTransElement trans_x_listener; - SelectionSliderTransElement trans_z_listener; - SelectionSliderRotY rot_y_listener; - SelectionButtonPlay play_listener; - SelectionButtonBegin begin_listener; - SelectionButtonEnd end_listener; - SelectionButtonBindBoolFunc pos_listener; - SelectionButtonBindBoolFunc repeat_listener; - SelectionButtonBindBoolFunc left_right_reverse_listener; - SelectionButtonSnapShot snap_shot_listener; - SelectionButtonLog log_listener; - SelectionButtonShadowType shadow_type_listener; - SelectionButtonSave save_listener; - SelectionButtonCamReset cam_reset_listener; - SelectionButtonDebugCamera debug_camera_listener; - - Auth3dTestWindow(); - virtual ~Auth3dTestWindow() override; - - void Hide() override; - - void SetAuth3dCategoryIndex(size_t index); - void SetAuth3dIndex(size_t index); - void SetMaxFrame(float_t max_frame); - void UpdatePlayButton(); - - static void CategoryCharaMenuInit(dw::Button* button, dw::Menu*& menu, - std::vector& items, dw::SelectionListener* selection_listener); - static void LeftRightReverseCallback(bool value); - static void PosCallback(bool value); - static void RepeatCallback(bool value); -}; - extern Auth3dTestTask* auth_3d_test_task; -extern Auth3dTestWindow* auth_3d_test_window; extern void auth_3d_test_task_init(); extern void auth_3d_test_task_disp_chara(); diff --git a/src/ReDIVA/data_test/equip_test.cpp b/src/ReDIVA/data_test/equip_test.cpp index d0632b3f..60388b13 100644 --- a/src/ReDIVA/data_test/equip_test.cpp +++ b/src/ReDIVA/data_test/equip_test.cpp @@ -5,15 +5,143 @@ #include "equip_test.hpp" #include "../../CRE/rob/rob.hpp" +#include "../dw.hpp" #include "auth_3d_test.hpp" #include "motion_test.hpp" +#define DATA_TEST_ITEM_EQUIP_MAX 25 + +class DataTestEquipDw : public dw::Shell { +public: + struct Data { + bool disp; + bool field_1; + bool field_2; + bool refresh; + int32_t item_no; + const item_cos_data* cos; + chara_index chara_index; + int32_t module_index; + bool field_18; + int32_t disp_parts; + std::vector items[DATA_TEST_ITEM_EQUIP_MAX]; + std::map field_278[DATA_TEST_ITEM_EQUIP_MAX]; + int32_t current_items[DATA_TEST_ITEM_EQUIP_MAX]; + + Data(); + ~Data(); + }; + + struct Item { + dw::Composite* comp[DATA_TEST_ITEM_EQUIP_MAX]; + dw::Label* label[DATA_TEST_ITEM_EQUIP_MAX]; + dw::ListBox* list_box[DATA_TEST_ITEM_EQUIP_MAX]; + dw::ListBox* parts; + + Item(); + }; + + int32_t chara_id; + Data data[ROB_CHARA_COUNT]; + Item item; + + DataTestEquipDw(); + virtual ~DataTestEquipDw() override; + + virtual void Hide() override; + + void DataReset(int32_t chara_id); + int32_t GetCharaID(); + chara_index GetCharaIndex(int32_t chara_id); + const item_cos_data* GetCos(int32_t chara_id); + int32_t GetCurrentCharaItem(int32_t chara_id, dw::Widget* data); + int32_t GetDispParts(int32_t chara_id); + int32_t GetItemNo(int32_t chara_id); + int32_t GetModuleIndex(int32_t chara_id); + bool GetRefresh(int32_t chara_id); + int32_t GetSelectedCharaItemNo(int32_t chara_id, dw::Widget* data); + bool IsEquipAllowed(int32_t equip); + void ItemReset(); + void SetCharaID(int32_t value); + void SetCharaIndex(int32_t chara_id, ::chara_index chara_index); + void SetCharaItemCos(int32_t chara_id, const item_cos_data* cos); + void SetCos(int32_t chara_id, const item_cos_data* cos); + void SetCurrentItemNo(int32_t chara_id, dw::Widget* data, int32_t value); + void SetDisp(int32_t chara_id, bool value); + void SetDispParts(int32_t chara_id, int32_t parts); + void SetItemNo(int32_t chara_id, int32_t value); + void SetModuleIndex(int32_t chara_id, int32_t module_index); + void SetRefresh(int32_t chara_id, bool value); + + static void Disp1pCallback(dw::Widget* data); + static void Disp2pCallback(dw::Widget* data); + static void DispCallback(int32_t chara_id, dw::Widget* widget); + static void DispPartsCallback(dw::Widget* data); + static void ExclusiveCheckCallback(dw::Widget* widget); + static void ItemCallback(dw::Widget* data); + static void PartsCallback(dw::Widget* data); + static void RefreshCallback(dw::Widget* data); + static void RobCallback(dw::Widget* data); + + void sub_14025FD80(int32_t chara_id); + + bool sub_1402606C0(int32_t chara_id); + bool sub_140260720(int32_t chara_id); + void sub_140260C40(int32_t chara_id); + void sub_140261370(int32_t chara_id, bool value); + void sub_1402613D0(int32_t chara_id, bool value); + void sub_1402613F0(int32_t chara_id, bool value); + void sub_140261520(int32_t chara_id); + void sub_140261580(int32_t chara_id); + void sub_140261AF0(int32_t chara_id); + void sub_140261C40(int32_t chara_id); +}; + +static const item_sub_id data_test_equip_sub_ids[] = { + ITEM_SUB_ZUJO, ITEM_SUB_KAMI, ITEM_SUB_HITAI, ITEM_SUB_ME, ITEM_SUB_MEGANE, + ITEM_SUB_MIMI, ITEM_SUB_KUCHI, ITEM_SUB_MAKI, ITEM_SUB_KUBI, ITEM_SUB_INNER, + ITEM_SUB_OUTER, ITEM_SUB_KATA, ITEM_SUB_U_UDE, ITEM_SUB_L_UDE, ITEM_SUB_TE, + ITEM_SUB_JOHA_MAE, ITEM_SUB_JOHA_USHIRO, ITEM_SUB_BELT, ITEM_SUB_KOSI, ITEM_SUB_PANTS, + ITEM_SUB_ASI, ITEM_SUB_SUNE, ITEM_SUB_KUTSU, ITEM_SUB_HADA, ITEM_SUB_HEAD, +}; + extern render_context* rctx_ptr; DtmEqVs* dtm_eq_vs_array; +DataTestEquipDw* data_test_equip_dw; + +int32_t data_test_item_array_load_count; +std::vector data_test_item_array[CHARA_MAX][ITEM_SUB_MAX]; + +int32_t data_test_item_equip_array_load_count; +std::vector data_test_item_equip_array[CHARA_MAX][5]; + +chara_index data_test_equip_dw_chara_index_array[ROB_CHARA_COUNT]; + +static int32_t data_test_equip_dw_get_disp_parts(int32_t chara_id); +static void data_test_equip_dw_set_chara_index(int32_t chara_id, chara_index chara_index); +static void data_test_equip_dw_set_chara_item_cos(int32_t chara_id, const item_cos_data* cos); +static const item_cos_data* data_test_equip_dw_get_cos(int32_t chara_id); +static int32_t data_test_equip_dw_get_item_no(int32_t chara_id); +static void data_test_equip_dw_set_module_index(int32_t chara_id, int32_t module_index); +static bool data_test_equip_dw_sub_1402606C0(int32_t chara_id); +static bool data_test_equip_dw_sub_140260720(int32_t chara_id); +static void data_test_equip_dw_sub_140260C40(int32_t chara_id); +static void data_test_equip_dw_sub_140261520(int32_t chara_id); + +static std::vector* data_test_item_array_get(::chara_index chara_index); +static void data_test_item_array_load(); +static void data_test_item_array_unload(); + +static std::vector* data_test_item_equip_array_get(::chara_index chara_index); +static void data_test_item_equip_array_load(); +static void data_test_item_equip_array_unload(); + +static int32_t data_test_item_get_item_equip(chara_index chara_index, int32_t item_no); + DtmEqVs::DtmEqVs() : chara_id(), chara_index(), curr_chara_index(), -module_index(), curr_module_index(), field_80() { +module_index(), curr_module_index(), disp_parts() { state = -1; } @@ -31,44 +159,44 @@ bool DtmEqVs::Ctrl() { rob_chara* rob_chr = rob_chara_array_get(chara_id); switch (state) { case 0: - //data_test_equip_dw_sub_14025FCC0(chara_id); - //data_test_equip_dw_sub_14025FA80(chara_id, item_cos_data->get_cos()); + data_test_equip_dw_sub_140261520(chara_id); + data_test_equip_dw_set_chara_item_cos(chara_id, item_cos_data->get_cos()); state = 3; case 3: - if (false /*dtm_mot_array_sub_140287740()*/) { - sub_140262050(); - sub_140261FF0(); + if (dtm_mot_array_sub_140291C10()) { + CtrlDispParts(); + CtrlChara(); - int32_t item_no = ITEM_NONE;//data_test_equip_dw_sub_14025FB20(chara_id); + int32_t item_no = data_test_equip_dw_get_item_no(chara_id); ::item_cos_data temp_cos; if (rob_chr) temp_cos = *rob_chr->item_cos_data.get_cos(); - bool v2 = false; - /*if (data_test_equip_dw_sub_14025FAF0(chara_id)) { + bool reload = false; + if (data_test_equip_dw_sub_1402606C0(chara_id)) { item_cos_data->set_chara_index_item(chara_index, item_no); - v2 = true; - }*/ + reload = true; + } - /*if (data_test_equip_dw_sub_14025FB80(chara_id)) { + if (data_test_equip_dw_sub_140260720(chara_id)) { item_cos_data->set_chara_index_item_zero(chara_index, item_no); - v2 = true; - }*/ + reload = true; + } - const ::item_cos_data* cos = 0;//data_test_equip_dw_get_cos(chara_id); + const ::item_cos_data* cos = data_test_equip_dw_get_cos(chara_id); if (cos) { item_cos_data->set_chara_index_item_nos(chara_index, cos->arr); - v2 = true; + reload = true; } /*if (sub_1402CEEC0(chara_id)) { - v2 = true; + reload = true; sub_1402CF8F0(); }*/ - //data_test_equip_dw_sub_14025FBE0(chara_id); + data_test_equip_dw_sub_140260C40(chara_id); - if (v2) { + if (reload) { if (rob_chr) task_rob_load_append_free_req_data_obj(rob_chr->chara_index, &temp_cos); rob_chara_array_reset_bone_data_item_equip(chara_id); @@ -78,7 +206,7 @@ bool DtmEqVs::Ctrl() { } break; case 1: - if (rob_chr->chara_index) { + if (rob_chr) { task_rob_load_append_load_req_data_obj(rob_chr->chara_index, rob_chr->item_cos_data.get_cos()); state = 2; } @@ -94,7 +222,7 @@ bool DtmEqVs::Ctrl() { } auth_3d_test_task_disp_chara(); dtm_mot_array_set_reset_mot(); - this->state = 3; + state = 3; } break; } @@ -106,16 +234,15 @@ bool DtmEqVs::Dest() { } bool DtmEqVs::AddTask(int32_t chara_id, ::chara_index chara_index) { - chara_id = chara_id; + this->chara_id = chara_id; this->chara_index = chara_index; this->curr_chara_index = chara_index; module_index = 0; curr_module_index = 0; - this->field_80 = 0; - //data_test_equip_dw_set_chara_index(chara_id, chara_index); - //data_test_equip_dw_set_module_index(chara_id, module_index); + disp_parts = 0; + data_test_equip_dw_set_chara_index(chara_id, chara_index); + data_test_equip_dw_set_module_index(chara_id, module_index); return app::TaskWork::AddTask(this, "DATA TEST EQUIP MANAGER FOR VS"); - return true; } bool DtmEqVs::DelTask() { @@ -125,11 +252,11 @@ bool DtmEqVs::DelTask() { void DtmEqVs::SetCharaIndexModuleIndex(::chara_index chara_index, int32_t module_index) { this->chara_index = chara_index; this->module_index = module_index; - //data_test_equip_dw_set_chara_index(chara_id, chara_index); - //data_test_equip_dw_set_module_index(chara_id, module_index); + data_test_equip_dw_set_chara_index(chara_id, chara_index); + data_test_equip_dw_set_module_index(chara_id, module_index); } -void DtmEqVs::sub_140261FF0() { +void DtmEqVs::CtrlChara() { if (chara_index == curr_chara_index && module_index == curr_module_index) return; @@ -137,22 +264,20 @@ void DtmEqVs::sub_140261FF0() { curr_module_index = module_index; const item_cos_data* cos = item_table_handler_array_get_item_cos_data_by_module_index(chara_index, module_index); if (!check_module_index_is_501(curr_module_index) || !cos) { - //data_test_equip_dw_sub_14025FCC0(chara_id); - //data_test_equip_dw_sub_14025FA80(chara_id, cos); + data_test_equip_dw_sub_140261520(chara_id); + data_test_equip_dw_set_chara_item_cos(chara_id, cos); } } -void DtmEqVs::sub_140262050() { - return; - - int32_t v2 = 0;//data_test_equip_dw_sub_14025FAC0(chara_id); - /*if (v2 == field_80) - return;*/ +void DtmEqVs::CtrlDispParts() { + int32_t disp_parts = data_test_equip_dw_get_disp_parts(chara_id); + if (this->disp_parts == disp_parts) + return; rob_chara_item_equip* rob_itm_equip = rob_chara_array_get_item_equip(chara_id); bool disp = false; item_id id; - switch (v2) { + switch (disp_parts) { default: id = ITEM_NONE; disp = true; @@ -176,7 +301,7 @@ void DtmEqVs::sub_140262050() { if (i != id && (!disp || i != rob_itm_equip->field_D4)) rob_itm_equip->set_disp((item_id)i, disp); - field_80 = v2; + this->disp_parts = disp_parts; } void equip_test_init() { @@ -190,3 +315,670 @@ void equip_test_free() { dtm_eq_vs_array = 0; } } + +DataTestEquipDw::Data::Data() : disp(), field_1(), field_2(), refresh(), item_no(), +cos(), chara_index(), module_index(), field_18(), disp_parts(), current_items() { + +} + +DataTestEquipDw::Data::~Data() { + +} + +DataTestEquipDw::Item::Item() : comp(), label(), list_box(), parts() { + +} + +DataTestEquipDw::DataTestEquipDw() : chara_id() { + ItemReset(); + + for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) { + DataReset(i); + data[i].chara_index = data_test_equip_dw_chara_index_array[i]; + } + + data_test_item_array_load(); + +#if DW_TRANSLATE + const char* exclusive_check_text = "Switch to exclusive check window"; +#else + const char* exclusive_check_text = "排他チェック窓に切替"; +#endif + + dw::Button* exclusive_check = new dw::Button(this, dw::FLAG_8); + exclusive_check->SetText(exclusive_check_text); + exclusive_check->callback = DataTestEquipDw::ExclusiveCheckCallback; + + dw::Composite* rob_comp = new dw::Composite(this); + + dw::Label* rob_label = new dw::Label(rob_comp); + rob_label->SetText("ROB"); + rob_label->SetFont(dw::p_font_type_6x12); + + dw::ListBox* rob_list = new dw::ListBox(rob_comp, dw::MULTISELECT); + rob_list->SetFont(dw::p_font_type_6x12); + rob_list->AddItem("1P"); + rob_list->AddItem("2P"); + rob_list->SetItemIndex(0); + rob_list->AddSelectionListener(new dw::SelectionListenerOnHook(DataTestEquipDw::RobCallback)); + + dw::Composite* disp_comp = new dw::Composite(this); + disp_comp->SetLayout(new dw::RowLayout(dw::HORIZONTAL)); + + dw::Button* disp_1p = new dw::Button(disp_comp, dw::CHECKBOX); + disp_1p->SetText("DISP 1P "); + disp_1p->SetValue(data[0].disp); + disp_1p->AddSelectionListener(new dw::SelectionListenerOnHook(DataTestEquipDw::Disp1pCallback)); + + dw::Button* disp_2p = new dw::Button(disp_comp, dw::CHECKBOX); + disp_2p->SetText("DISP 2P "); + disp_2p->SetValue(data[1].disp); + disp_2p->AddSelectionListener(new dw::SelectionListenerOnHook(DataTestEquipDw::Disp2pCallback)); + + dw::Composite* disp_parts_comp = new dw::Composite(this); + + dw::Label* disp_parts_label = new dw::Label(disp_parts_comp); + disp_parts_label->SetText("DISP PARTS"); + disp_parts_label->SetFont(dw::p_font_type_6x12); + + static const char* disp_parts_array[] = { + "ALL", + "ALL_OFF", + "OUTER ONLY", + "PANTS ONLY", + }; + + dw::ListBox* disp_parts_list = new dw::ListBox(disp_parts_comp, dw::MULTISELECT); + disp_parts_list->SetFont(dw::p_font_type_6x12); + for (const char*& i : disp_parts_array) + disp_parts_list->AddItem(i); + disp_parts_list->SetItemIndex(0); + disp_parts_list->AddSelectionListener(new dw::SelectionListenerOnHook(DataTestEquipDw::DispPartsCallback)); + + dw::Composite* v35 = new dw::Composite(this); + v35->SetLayout(new dw::RowLayout(dw::HORIZONTAL)); + + dw::Label* color_item_set = new dw::Label(v35); + color_item_set->SetText("COLOR ITEM SET "); + color_item_set->SetFont(dw::p_font_type_6x12); + + dw::Button* refresh = new dw::Button(v35, dw::CHECKBOX); + refresh->SetText("refresh all equip"); + refresh->SetValue(true); + refresh->AddSelectionListener(new dw::SelectionListenerOnHook(DataTestEquipDw::RefreshCallback)); + + dw::Composite* parts_comp = new dw::Composite(this); + + dw::ListBox* parts_list = new dw::ListBox(parts_comp); + parts_list->SetFont(dw::p_font_type_6x12); + parts_list->AddSelectionListener(new dw::SelectionListenerOnHook(DataTestEquipDw::PartsCallback)); + item.parts = parts_list; + + dw::Composite* items_comp = new dw::Composite(this); + + for (int32_t i = 0, j = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) { + if (!IsEquipAllowed(i)) + continue; + + dw::Composite* comp = new dw::Composite(items_comp); + comp->SetLayout(new dw::RowLayout(dw::HORIZONTAL)); + item.comp[j] = comp; + + char buf[0x10]; + sprintf_s(buf, sizeof(buf), "*%-11s", item_sub_id_get_name(data_test_equip_sub_ids[i])); + + dw::Label* label = new dw::Label(comp); + label->SetText(buf); + label->SetFont(dw::p_font_type_6x12); + item.label[j] = label; + + dw::ListBox* list = new dw::ListBox(comp); + list->SetFont(dw::p_font_type_6x12); + list->SetMaxItems(10); + list->AddSelectionListener(new dw::SelectionListenerOnHook(DataTestEquipDw::ItemCallback)); + list->callback_data.i64 = j; + item.list_box[j] = list; + j++; + } + + sub_140261520(0); + SetCharaItemCos(0, &rob_chara_array_get_item_cos_data(0)->cos); + + sub_140261520(1); + SetCharaItemCos(1, &rob_chara_array_get_item_cos_data(1)->cos); + + rect.pos = { 953.0f, 0.0f }; +} + +DataTestEquipDw::~DataTestEquipDw() { + +} + +void DataTestEquipDw::Hide() { + dw::Shell::SetDisp(false); + + for (DataTestEquipDw::Data& i : data) + i.field_18 = false; + + data_test_item_equip_array_unload(); +} + +void DataTestEquipDw::DataReset(int32_t chara_id) { + DataTestEquipDw::Data& data = this->data[chara_id]; + data.disp = true; + data.field_1 = false; + data.field_2 = false; + data.refresh = false; + data.item_no = 0; + data.chara_index = CHARA_MIKU; + data.field_18 = false; + data.disp_parts = 0; + + for (int32_t i = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) { + data.items[i].clear(); + + if (IsEquipAllowed(i)) { + data.field_278[i].clear(); + data.current_items[i] = 0; + } + } +} + +int32_t DataTestEquipDw::GetCharaID() { + return chara_id; +} + +chara_index DataTestEquipDw::GetCharaIndex(int32_t chara_id) { + return data[chara_id].chara_index; +} + +const item_cos_data* DataTestEquipDw::GetCos(int32_t chara_id) { + return data[chara_id].cos; +} + +int32_t DataTestEquipDw::GetDispParts(int32_t chara_id) { + return data[chara_id].disp_parts; +} + +int32_t DataTestEquipDw::GetItemNo(int32_t chara_id) { + return data[chara_id].item_no; +} + +int32_t DataTestEquipDw::GetModuleIndex(int32_t chara_id) { + return data[chara_id].module_index; +} + +bool DataTestEquipDw::GetRefresh(int32_t chara_id) { + return data[chara_id].refresh; +} + +int32_t DataTestEquipDw::GetSelectedCharaItemNo(int32_t chara_id, dw::Widget* data) { + dw::ListBox* list_box = dynamic_cast(data); + if (list_box) + return this->data[chara_id].items[data->callback_data.i32][list_box->list->selected_item]; + return 0; +} + +bool DataTestEquipDw::IsEquipAllowed(int32_t equip) { + if (equip >= 0 && equip < DATA_TEST_ITEM_EQUIP_MAX + && (equip == 0 || equip == 1 || equip == 4 || equip == 6 || equip == 8 + || equip == 10 || equip == 14 || equip == 16 || equip == 24)) + return true; + return false; +} + +void DataTestEquipDw::ItemReset() { + for (int32_t i = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) + item.comp[i] = 0; + + for (int32_t i = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) + if (IsEquipAllowed(i)) { + item.label[i] = 0; + item.list_box[i] = 0; + } + + item.parts = 0; +} + +void DataTestEquipDw::SetCharaID(int32_t value) { + chara_id = value; +} + +void DataTestEquipDw::SetCharaIndex(int32_t chara_id, ::chara_index chara_index) { + data[chara_id].chara_index = chara_index; +} + +void DataTestEquipDw::SetCharaItemCos(int32_t chara_id, const item_cos_data* cos) { + if (!cos) + return; + + DataTestEquipDw::Data& data = this->data[chara_id]; + + for (int32_t i = 0, j = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) { + if (!IsEquipAllowed(i)) + continue; + + if (this->chara_id == chara_id) { + auto elem = data.field_278[j].find(cos->arr[data_test_equip_sub_ids[i]]); + if (elem != data.field_278[j].end() && elem->second) + item.list_box[j]->SetItemIndex(elem->second); + else + item.list_box[j]->SetItemIndex(-1); + } + + data.current_items[j] = cos->arr[data_test_equip_sub_ids[i]]; + j++; + } +} + +void DataTestEquipDw::SetCos(int32_t chara_id, const item_cos_data* cos) { + data[chara_id].cos = cos; +} + +void DataTestEquipDw::SetCurrentItemNo(int32_t chara_id, dw::Widget* data, int32_t value) { + this->data[chara_id].current_items[data->callback_data.i32] = value; +} + +void DataTestEquipDw::SetDisp(int32_t chara_id, bool value) { + data[chara_id].disp = value; + data[chara_id].disp_parts = value ? 0 : 1; +} + +void DataTestEquipDw::SetDispParts(int32_t chara_id, int32_t parts) { + if (data[chara_id].disp) + data[chara_id].disp_parts = parts; +} + +void DataTestEquipDw::SetItemNo(int32_t chara_id, int32_t value) { + data[chara_id].item_no = value; +} + +void DataTestEquipDw::SetModuleIndex(int32_t chara_id, int32_t module_index) { + data[chara_id].module_index = module_index; +} + +void DataTestEquipDw::SetRefresh(int32_t chara_id, bool value) { + data[chara_id].refresh = value; +} + +void DataTestEquipDw::Disp1pCallback(dw::Widget* data) { + DispCallback(0, data); +} + +void DataTestEquipDw::Disp2pCallback(dw::Widget* data) { + DispCallback(1, data); +} + +void DataTestEquipDw::DispCallback(int32_t chara_id, dw::Widget* data) { + dw::Button* button = dynamic_cast(data); + if (button) + data_test_equip_dw->SetDisp(chara_id, button->value); +} + +void DataTestEquipDw::DispPartsCallback(dw::Widget* data) { + dw::ListBox* list_box = dynamic_cast(data); + if (list_box) + data_test_equip_dw->SetDispParts(data_test_equip_dw->GetCharaID(), + (int32_t)list_box->list->selected_item); +} + +void DataTestEquipDw::ExclusiveCheckCallback(dw::Widget* data) { + data_test_equip_dw->Hide(); + //data_test_item_check_add_task(&data_test_item_check); +} + +void DataTestEquipDw::ItemCallback(dw::Widget* data) { + int32_t chara_id = data_test_equip_dw->GetCharaID(); + int32_t item_no = data_test_equip_dw->GetSelectedCharaItemNo(chara_id, data); + int32_t curr_item_no = data_test_equip_dw->GetCurrentCharaItem(chara_id, data); + + if (item_no) { + data_test_equip_dw->sub_140261370(chara_id, true); + data_test_equip_dw->sub_1402613D0(chara_id, false); + data_test_equip_dw->sub_1402613F0(chara_id, true); + data_test_equip_dw->SetItemNo(chara_id, item_no); + data_test_equip_dw->SetCurrentItemNo(chara_id, data, item_no); + } + else if (curr_item_no) { + data_test_equip_dw->sub_140261370(chara_id, false); + data_test_equip_dw->sub_1402613D0(chara_id, true); + data_test_equip_dw->sub_1402613F0(chara_id, true); + data_test_equip_dw->SetItemNo(chara_id, curr_item_no); + data_test_equip_dw->SetCurrentItemNo(chara_id, data, curr_item_no); + } + else{ + data_test_equip_dw->SetItemNo(chara_id, item_no); + data_test_equip_dw->SetCurrentItemNo(chara_id, data, item_no); + } + +} + +void DataTestEquipDw::PartsCallback(dw::Widget* data) { + dw::ListBox* list_box = dynamic_cast(data); + if (!list_box) + return; + + int32_t chara_id = data_test_equip_dw->GetCharaID(); + ::chara_index chara_index = data_test_equip_dw->GetCharaIndex(chara_id); + int32_t module_index = data_test_equip_dw->GetModuleIndex(chara_id); + + const item_cos_data* v9 = item_table_handler_array_get_item_cos_data_by_module_index(chara_index, module_index); + size_t selected_item = list_box->list->selected_item; + switch (selected_item) { + case 0: + break; + case 1: + v9 = item_table_handler_array_get_item_cos_data_by_module_index(chara_index, 499); + break; + case 2: + default: { + auto& dbgset = item_table_handler_array_get_table(chara_index)->dbgset; + auto elem = dbgset.find(list_box->GetItemStr(selected_item).c_str()); + if (elem != dbgset.end()) + v9 = &elem->second; + } break; + } + + item_cos_data* v23 = &rob_chara_array_get_item_cos_data(chara_id)->cos; + if (selected_item >= 2 && data_test_equip_dw->GetRefresh(chara_id)) { + *v23 = *v9; + v9 = v23; + } + + data_test_equip_dw->SetCos(chara_id, v9); + data_test_equip_dw->sub_140261C40(chara_id); + data_test_equip_dw->sub_140261580(chara_id); + data_test_equip_dw->UpdateLayout(); + data_test_equip_dw->SetCharaItemCos(chara_id, v9); +} + +void DataTestEquipDw::RefreshCallback(dw::Widget* data) { + dw::Button* button = dynamic_cast(data); + if (button) { + int32_t chara_id = data_test_equip_dw->GetCharaID(); + if (button->value) + data_test_equip_dw->SetRefresh(chara_id, false); + else + data_test_equip_dw->SetRefresh(chara_id, true); + } +} + +void DataTestEquipDw::RobCallback(dw::Widget* data) { + dw::ListBox* list_box = dynamic_cast(data); + if (list_box) { + int32_t chara_id = (int32_t)list_box->list->selected_item; + data_test_equip_dw->SetCharaID(chara_id); + data_test_equip_dw->sub_140261C40(chara_id); + data_test_equip_dw->sub_140261AF0(chara_id); + data_test_equip_dw->sub_14025FD80(chara_id); + } +} + +void DataTestEquipDw::sub_14025FD80(int32_t chara_id) { + if (this->chara_id != chara_id) + return; + + DataTestEquipDw::Data& data = this->data[chara_id]; + + for (int32_t i = 0, j = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) { + if (!IsEquipAllowed(i)) + continue; + + auto elem = data.field_278[j].find(data.current_items[j]); + if (elem != data.field_278[j].end()) + item.list_box[j]->SetItemIndex(elem->second); + else + item.list_box[j]->SetItemIndex(-1); + } +} + +int32_t DataTestEquipDw::GetCurrentCharaItem(int32_t chara_id, dw::Widget* data) { + return this->data[chara_id].current_items[data->callback_data.i32]; +} + +bool DataTestEquipDw::sub_1402606C0(int32_t chara_id) { + return data[chara_id].field_1; +} + +bool DataTestEquipDw::sub_140260720(int32_t chara_id) { + return data[chara_id].field_2; +} + +void DataTestEquipDw::sub_140260C40(int32_t chara_id) { + data[chara_id].field_1 = false; + data[chara_id].field_2 = false; + data[chara_id].item_no = 0; + data[chara_id].cos = 0; +} + +void DataTestEquipDw::sub_140261370(int32_t chara_id, bool value) { + data[chara_id].field_1 = value; +} + +void DataTestEquipDw::sub_1402613D0(int32_t chara_id, bool value) { + data[chara_id].field_2 = value; +} + +void DataTestEquipDw::sub_1402613F0(int32_t chara_id, bool value) { + data[chara_id].field_18 = value; +} + +void DataTestEquipDw::sub_140261520(int32_t chara_id) { + if (this->chara_id == chara_id) { + sub_140261C40(chara_id); + sub_140261AF0(chara_id); + sub_140261580(chara_id); + UpdateLayout(); + } + else + sub_140261580(chara_id); +} + +void DataTestEquipDw::sub_140261580(int32_t chara_id) { + DataTestEquipDw::Data& data = this->data[chara_id]; + + ::chara_index chara_index = data.chara_index; + + for (int32_t i = 0, j = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) { + if (!IsEquipAllowed(i)) + continue; + + std::vector* item_array = data_test_item_array_get(chara_index); + data.items[j].clear(); + data.field_278[j].clear(); + data.current_items[j] = 0; + data.items[j].push_back(0); + + data.field_278[j].insert({ 0, 0 }); + + int32_t index = 1; + for (int32_t& k : item_array[data_test_equip_sub_ids[i]]) { + data.items[j].push_back(k); + data.field_278[j].insert({ k, index++ }); + } + j++; + } +} + +void DataTestEquipDw::sub_140261AF0(int32_t chara_id) { + dw::ListBox* parts = item.parts; + parts->ClearItems(); + parts->AddItem("DEFAULT"); + parts->AddItem("NUDE"); + + for (auto& i : item_table_handler_array_get_table(data[chara_id].chara_index)->dbgset) + parts->AddItem(i.first); +} + +void DataTestEquipDw::sub_140261C40(int32_t chara_id) { + DataTestEquipDw::Data& data = this->data[chara_id]; + + ::chara_index chara_index = data.chara_index; + + char buf[0x20]; + sprintf_s(buf, sizeof(buf), "ITEM EQUIP (%s)", chara_index_get_name(chara_index)); + SetText(buf); + + for (int32_t i = 0, j = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) { + if (!IsEquipAllowed(i)) + continue; + + std::vector* item_array = data_test_item_array_get(chara_index); + item.list_box[j]->ClearItems(); + item.list_box[j]->AddItem("REMOVE ITEM"); + + for (int32_t& k : item_array[data_test_equip_sub_ids[i]]) { + char buf[0x200]; + sprintf_s(buf, sizeof(buf), "%03d %s", k, + item_table_handler_array_get_item_name(chara_index, k).c_str()); + item.list_box[j]->AddItem(buf); + } + j++; + } +} + +void data_test_equip_dw_init() { + if (!data_test_equip_dw) { + data_test_equip_dw = new DataTestEquipDw; + data_test_equip_dw->sub_1402F38B0(); + } + else { + data_test_item_equip_array_load(); + //if (!data_test_item_check_dw_get_disp()) + data_test_equip_dw->Disp(); + } +} + +static int32_t data_test_equip_dw_get_disp_parts(int32_t chara_id) { + if (data_test_equip_dw) + return data_test_equip_dw->GetDispParts(chara_id); + return 0; +} + +static void data_test_equip_dw_set_chara_index(int32_t chara_id, chara_index chara_index) { + if (data_test_equip_dw) + data_test_equip_dw->SetCharaIndex(chara_id, chara_index); + data_test_equip_dw_chara_index_array[chara_id] = chara_index; +} + +static void data_test_equip_dw_set_chara_item_cos(int32_t chara_id, const item_cos_data* cos) { + if (data_test_equip_dw) + data_test_equip_dw->SetCharaItemCos(chara_id, cos); +} + +static const item_cos_data* data_test_equip_dw_get_cos(int32_t chara_id) { + if (data_test_equip_dw) + return data_test_equip_dw->GetCos(chara_id); + return 0; +} + +static int32_t data_test_equip_dw_get_item_no(int32_t chara_id) { + if (data_test_equip_dw) + return data_test_equip_dw->GetItemNo(chara_id); + return 0; +} + +static void data_test_equip_dw_set_module_index(int32_t chara_id, int32_t module_index) { + if (data_test_equip_dw) + data_test_equip_dw->SetModuleIndex(chara_id, module_index); +} + +static bool data_test_equip_dw_sub_1402606C0(int32_t chara_id) { + if (data_test_equip_dw) + return data_test_equip_dw->sub_1402606C0(chara_id); + return false; +} + +static bool data_test_equip_dw_sub_140260720(int32_t chara_id) { + if (data_test_equip_dw) + return data_test_equip_dw->sub_140260720(chara_id); + return false; +} + +static void data_test_equip_dw_sub_140260C40(int32_t chara_id) { + if (data_test_equip_dw) + data_test_equip_dw->sub_140260C40(chara_id); +} + +static void data_test_equip_dw_sub_140261520(int32_t chara_id) { + if (data_test_equip_dw) + data_test_equip_dw->sub_140261520(chara_id); +} + +static std::vector* data_test_item_array_get(::chara_index chara_index) { + return data_test_item_array[chara_index]; +} + +static void data_test_item_array_load() { + if (data_test_item_array_load_count) + data_test_item_array_load_count++; + else + for (int32_t i = 0; i < CHARA_MAX; i++) { + const item_table* table = item_table_handler_array_get_table((chara_index)i); + if (!table) + continue; + + for (auto& j : table->item) { + const item_table_item* item = item_table_handler_array_get_item((chara_index)i, j.first); + if (item && item->sub_id != -1) + data_test_item_array[i][item->sub_id].push_back(j.first); + } + } +} + +static void data_test_item_array_unload() { + if (--data_test_item_array_load_count < 0) + data_test_item_array_load_count = 0; + else if (!data_test_item_array_load_count) + for (auto& i : data_test_item_array) + for (auto& j : i) { + j.clear(); + j.shrink_to_fit(); + } +} + +static std::vector* data_test_item_equip_array_get(::chara_index chara_index) { + return data_test_item_equip_array[chara_index]; +} + +static void data_test_item_equip_array_load() { + if (data_test_item_equip_array_load_count) + data_test_item_equip_array_load_count++; + else + for (int32_t i = 0; i < CHARA_MAX; i++) { + const item_table* table = item_table_handler_array_get_table((chara_index)i); + if (!table || !data_test_item_equip_array[i]->size()) + continue; + + for (auto& j : table->item) { + int32_t equip = data_test_item_get_item_equip((chara_index)i, j.first); + if (equip != -1) + data_test_item_equip_array[i][equip].push_back(j.first); + } + } +} + +static void data_test_item_equip_array_unload() { + if (--data_test_item_equip_array_load_count < 0) + data_test_item_equip_array_load_count = 0; + else if (!data_test_item_equip_array_load_count) + for (auto& i : data_test_item_equip_array) + for (auto& j : i) { + j.clear(); + j.shrink_to_fit(); + } +} + +static int32_t data_test_item_get_item_equip(chara_index chara_index, int32_t item_no) { + static const int32_t data_test_item_item_equip_array[] = { + 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 2, 2, 4, 4, 4, 4, 4, 4, 2, 1, + }; + + if (!item_table_handler_array_get_table(chara_index)) + return -1; + + item_sub_id sub_id = item_table_handler_array_get_item_sub_id(chara_index, item_no); + if (sub_id != ITEM_SUB_NONE) + return data_test_item_item_equip_array[sub_id]; + return -1; +} diff --git a/src/ReDIVA/data_test/equip_test.hpp b/src/ReDIVA/data_test/equip_test.hpp index 8a944fd3..e3a7fe8a 100644 --- a/src/ReDIVA/data_test/equip_test.hpp +++ b/src/ReDIVA/data_test/equip_test.hpp @@ -7,8 +7,7 @@ #include "../../KKdLib/default.hpp" #include "../../CRE/rob/rob.hpp" -#include "../dw.hpp" -#include "../task_window.hpp" +#include "../../CRE/task.hpp" class DtmEqVs : public app::Task { public: @@ -18,7 +17,7 @@ public: ::chara_index curr_chara_index; int32_t module_index; int32_t curr_module_index; - int32_t field_80; + int32_t disp_parts; DtmEqVs(); virtual ~DtmEqVs() override; @@ -32,165 +31,13 @@ public: void SetCharaIndexModuleIndex(::chara_index chara_index, int32_t module_index); - void sub_140261FF0(); - void sub_140262050(); -}; - -class DataTestEquipDw : public dw::Shell { -public: - struct Data { - bool field_0; - bool field_1; - bool field_2; - bool field_3; - uint32_t field_4; - item_cos_data* cos; - chara_index chara_index; - int32_t module_index; - bool field_18; - int field_1C; - std::vector field_20[25]; - std::map field_278[25]; - uint32_t field_408[25]; - - Data(); - ~Data(); - }; - - int32_t chara_id; - DataTestEquipDw::Data data[6]; - dw::Composite* field_1C28[25]; - dw::Label* field_1CF0[25]; - dw::ListBox* field_1DB8[25]; - dw::ListBox* field_1E80; - __int64 field_1E88; - __int64 field_1E90; - __int64 field_1E98; - __int64 field_1EA0; - __int64 field_1EA8; - __int64 field_1EB0; - __int64 field_1EB8; - __int64 field_1EC0; - __int64 field_1EC8; - __int64 field_1ED0; - __int64 field_1ED8; - __int64 field_1EE0; - __int64 field_1EE8; - __int64 field_1EF0; - __int64 field_1EF8; - __int64 field_1F00; - __int64 field_1F08; - __int64 field_1F10; - __int64 field_1F18; - __int64 field_1F20; - __int64 field_1F28; - __int64 field_1F30; - __int64 field_1F38; - __int64 field_1F40; - __int64 field_1F48; - __int64 field_1F50; - __int64 field_1F58; - __int64 field_1F60; - __int64 field_1F68; - __int64 field_1F70; - __int64 field_1F78; - __int64 field_1F80; - __int64 field_1F88; - __int64 field_1F90; - __int64 field_1F98; - __int64 field_1FA0; - __int64 field_1FA8; - __int64 field_1FB0; - __int64 field_1FB8; - __int64 field_1FC0; - __int64 field_1FC8; - __int64 field_1FD0; - __int64 field_1FD8; - __int64 field_1FE0; - __int64 field_1FE8; - __int64 field_1FF0; - __int64 field_1FF8; - __int64 field_2000; - __int64 field_2008; - __int64 field_2010; - __int64 field_2018; - __int64 field_2020; - __int64 field_2028; - __int64 field_2030; - __int64 field_2038; - __int64 field_2040; - __int64 field_2048; - __int64 field_2050; - __int64 field_2058; - __int64 field_2060; - __int64 field_2068; - __int64 field_2070; - __int64 field_2078; - __int64 field_2080; - __int64 field_2088; - __int64 field_2090; - __int64 field_2098; - __int64 field_20A0; - __int64 field_20A8; - __int64 field_20B0; - __int64 field_20B8; - __int64 field_20C0; - __int64 field_20C8; - __int64 field_20D0; - __int64 field_20D8; - __int64 field_20E0; - __int64 field_20E8; - __int64 field_20F0; - __int64 field_20F8; - __int64 field_2100; - __int64 field_2108; - __int64 field_2110; - __int64 field_2118; - __int64 field_2120; - __int64 field_2128; - __int64 field_2130; - __int64 field_2138; - __int64 field_2140; - __int64 field_2148; - __int64 field_2150; - __int64 field_2158; - __int64 field_2160; - __int64 field_2168; - __int64 field_2170; - __int64 field_2178; - __int64 field_2180; - __int64 field_2188; - __int64 field_2190; - __int64 field_2198; - __int64 field_21A0; - __int64 field_21A8; - __int64 field_21B0; - __int64 field_21B8; - __int64 field_21C0; - __int64 field_21C8; - __int64 field_21D0; - __int64 field_21D8; - __int64 field_21E0; - __int64 field_21E8; - __int64 field_21F0; - __int64 field_21F8; - __int64 field_2200; - __int64 field_2208; - __int64 field_2210; - __int64 field_2218; - __int64 field_2220; - __int64 field_2228; - __int64 field_2230; - __int64 field_2238; - __int64 field_2240; - __int64 field_2248; - __int64 field_2250; - __int64 field_2258; - __int64 field_2260; - __int64 field_2268; + void CtrlChara(); + void CtrlDispParts(); }; extern DtmEqVs* dtm_eq_vs_array; extern void equip_test_init(); extern void equip_test_free(); + +extern void data_test_equip_dw_init(); diff --git a/src/ReDIVA/data_test/glitter_test.cpp b/src/ReDIVA/data_test/glitter_test.cpp index 594b25c1..dd0f038b 100644 --- a/src/ReDIVA/data_test/glitter_test.cpp +++ b/src/ReDIVA/data_test/glitter_test.cpp @@ -10,11 +10,43 @@ #include "../../CRE/data.hpp" #include "../../CRE/render_context.hpp" #include "../../CRE/stage.hpp" -#include "../imgui_helper.hpp" +#include "../dw.hpp" #include "../input_state.hpp" #include "../print_work.hpp" #include "stage_test.hpp" +class DataTestGlitterParticleDw : public dw::Shell { +public: + TaskDataTestGlitterParticle* task; + dw::ListBox* list; + dw::ListBox* geff; + dw::Button* pause; + dw::Button* auto_and_repeat; + dw::Button* pv_mode; + dw::Button* play; + dw::Button* stop; + dw::Slider* emission; + dw::Button* show_grid; + dw::Button* stage; + dw::Button* chara; + + DataTestGlitterParticleDw(TaskDataTestGlitterParticle* task); + virtual ~DataTestGlitterParticleDw() override; + + void Init(); + + static void AutoAndRepeatCallback(dw::Widget* data); + static void CharaCallback(dw::Widget* data); + static void EmissionCallback(dw::Widget* data); + static void ListCallback(dw::Widget* data); + static void PauseCallback(dw::Widget* data); + static void PlayCallback(dw::Widget* data); + static void PvModeCallback(dw::Widget* data); + static void ShowGridCallback(dw::Widget* data); + static void StageCallback(dw::Widget* data); + static void StopCallback(dw::Widget* data); +}; + TaskDataTestGlitterParticle* task_data_test_glitter_particle; extern int32_t width; @@ -204,6 +236,18 @@ void TaskDataTestGlitterParticle::LoadFile(const char* file) { rebuild_geff = true; } +void task_data_test_glitter_particle_init() { + if (!task_data_test_glitter_particle) + task_data_test_glitter_particle = new TaskDataTestGlitterParticle; +} + +void task_data_test_glitter_particle_free() { + if (task_data_test_glitter_particle) { + delete task_data_test_glitter_particle; + task_data_test_glitter_particle = 0; + } +} + DataTestGlitterParticleDw::DataTestGlitterParticleDw(TaskDataTestGlitterParticle* task) { this->task = task; @@ -388,15 +432,3 @@ void DataTestGlitterParticleDw::StopCallback(dw::Widget* data) { glt_ptcl_dw->task->SceneFree(); } } - -void task_data_test_glitter_particle_init() { - if (!task_data_test_glitter_particle) - task_data_test_glitter_particle = new TaskDataTestGlitterParticle; -} - -void task_data_test_glitter_particle_free() { - if (task_data_test_glitter_particle) { - delete task_data_test_glitter_particle; - task_data_test_glitter_particle = 0; - } -} diff --git a/src/ReDIVA/data_test/glitter_test.hpp b/src/ReDIVA/data_test/glitter_test.hpp index a3979783..3bcd8d0b 100644 --- a/src/ReDIVA/data_test/glitter_test.hpp +++ b/src/ReDIVA/data_test/glitter_test.hpp @@ -10,15 +10,12 @@ #include "../../KKdLib/default.hpp" #include "../../CRE/Glitter/glitter.hpp" #include "../../CRE/task.hpp" -#include "../dw.hpp" - -class DataTestGlitterParticleDw; class TaskDataTestGlitterParticle : public app::Task { public: uint64_t hash; Glitter::SceneCounter scene_counter; - DataTestGlitterParticleDw* dw; + class DataTestGlitterParticleDw* dw; float_t frame; bool auto_and_repeat; bool reload; @@ -40,38 +37,6 @@ public: void SetReload(); }; -class DataTestGlitterParticleDw : public dw::Shell { -public: - TaskDataTestGlitterParticle* task; - dw::ListBox* list; - dw::ListBox* geff; - dw::Button* pause; - dw::Button* auto_and_repeat; - dw::Button* pv_mode; - dw::Button* play; - dw::Button* stop; - dw::Slider* emission; - dw::Button* show_grid; - dw::Button* stage; - dw::Button* chara; - - DataTestGlitterParticleDw(TaskDataTestGlitterParticle* task); - virtual ~DataTestGlitterParticleDw() override; - - void Init(); - - static void AutoAndRepeatCallback(dw::Widget* data); - static void CharaCallback(dw::Widget* data); - static void EmissionCallback(dw::Widget* data); - static void ListCallback(dw::Widget* data); - static void PauseCallback(dw::Widget* data); - static void PlayCallback(dw::Widget* data); - static void PvModeCallback(dw::Widget* data); - static void ShowGridCallback(dw::Widget* data); - static void StageCallback(dw::Widget* data); - static void StopCallback(dw::Widget* data); -}; - extern TaskDataTestGlitterParticle* task_data_test_glitter_particle; extern void task_data_test_glitter_particle_init(); diff --git a/src/ReDIVA/data_test/motion_test.cpp b/src/ReDIVA/data_test/motion_test.cpp index 0427f1bc..bb082343 100644 --- a/src/ReDIVA/data_test/motion_test.cpp +++ b/src/ReDIVA/data_test/motion_test.cpp @@ -14,11 +14,337 @@ #include "../../CRE/resolution_mode.hpp" #include "../../CRE/stage.hpp" #include "../config.hpp" +#include "../dw.hpp" #include "../input_state.hpp" #include "auth_3d_test.hpp" #include "equip_test.hpp" #include "stage_test.hpp" +class DataTestFaceMotDw : public dw::Shell { +public: + struct MotionData { + int32_t mottbl_index; + float_t frame; + }; + + struct Data { + MotionData face; + MotionData eyelid; + MotionData eyes; + MotionData mouth; + }; + + int32_t chara_id; + std::map motion_id_mottbl_map; + dw::Button* enable; + dw::ListBox* face; + dw::Slider* face_frame; + dw::Label* face_cl; + dw::Slider* face_cl_frame; + dw::ListBox* eyes; + dw::Slider* eyes_frame; + dw::ListBox* mouth; + dw::Slider* mouth_frame; + + DataTestFaceMotDw(int32_t chara_id); + virtual ~DataTestFaceMotDw() override; + + virtual void Hide() override; + + void AddMottblMapMotions(dw::ListBox* list_box, int32_t type); + Data GetData(); + bool GetEnable(); + dw::ListBox* InitAddMottblMapMotions(dw::Composite* parent, int32_t type); + void Reset(); +}; + +class DataTestMotDw : public dw::Shell { +public: + class StepSliderProc : public dw::SelectionAdapter { + public: + int32_t index; + + StepSliderProc(); + virtual ~StepSliderProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class CharaListBoxProc : public dw::SelectionAdapter { + public: + dw::ListBox* list_box; + + CharaListBoxProc(); + virtual ~CharaListBoxProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class CTypeListBoxProc : public dw::SelectionAdapter { + public: + dw::ListBox* list_box; + + CTypeListBoxProc(); + virtual ~CTypeListBoxProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SetListBoxProc : public dw::SelectionAdapter { + public: + dw::ListBox* list_box; + + SetListBoxProc(); + virtual ~SetListBoxProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class IdListBoxProc : public dw::SelectionAdapter { + public: + dw::Slider* slider; + + IdListBoxProc(); + virtual ~IdListBoxProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class RotateSliderProc : public dw::SelectionAdapter { + public: + dw::Slider* slider; + + RotateSliderProc(); + virtual ~RotateSliderProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class PositionSliderProc : public dw::SelectionAdapter { + public: + PositionSliderProc(); + virtual ~PositionSliderProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class FrameSliderProc : public dw::SelectionAdapter { + public: + dw::Slider* slider; + + FrameSliderProc(); + virtual ~FrameSliderProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class StartFrameSliderProc : public dw::SelectionAdapter { + public: + dw::Button* button; + + StartFrameSliderProc(); + virtual ~StartFrameSliderProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class DispButtonProc : public dw::SelectionAdapter { + public: + dw::Button* button; + + DispButtonProc(); + virtual ~DispButtonProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class UseOpdButtonProc : public dw::SelectionAdapter { + public: + UseOpdButtonProc(); + virtual ~UseOpdButtonProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class PartialMotButtonProc : public dw::SelectionAdapter { + public: + PartialMotButtonProc(); + virtual ~PartialMotButtonProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SaveOnlyStartFrameButtonProc : public dw::SelectionAdapter { + public: + SaveOnlyStartFrameButtonProc(); + virtual ~SaveOnlyStartFrameButtonProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class CreateFaceMotDwProc : public dw::SelectionAdapter { + public: + CreateFaceMotDwProc(); + virtual ~CreateFaceMotDwProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class CreateEqDwProc : public dw::SelectionAdapter { + public: + CreateEqDwProc(); + virtual ~CreateEqDwProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + struct CreateDebugCamProc : public dw::SelectionAdapter { + public: + CreateDebugCamProc(); + virtual ~CreateDebugCamProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + DtmMot* dtm_mot; + dw::ListBox* chara; + CharaListBoxProc chara_list_box_proc; + CTypeListBoxProc c_type_list_box_proc; + SetListBoxProc set_list_box_proc; + IdListBoxProc id_list_box_proc; + RotateSliderProc rotate_slider_proc; + PositionSliderProc position_slider_proc; + //__int64 field_1E8; + //__int64 field_1F0; + //__int64 field_1F8; + dw::Slider* step_slider; + StepSliderProc step_slider_proc[4]; + dw::Slider* current; + FrameSliderProc frame_slider_proc; + StartFrameSliderProc start_frame_slider_proc; + dw::Label* ab_loop; + dw::Label* frame; + dw::Label* frame_count; + DispButtonProc disp_button_proc; + UseOpdButtonProc use_opd_button_proc; + PartialMotButtonProc partial_mot_button_proc; + SaveOnlyStartFrameButtonProc save_only_start_frame_button_proc; + CreateFaceMotDwProc create_face_mot_dw_proc; + CreateEqDwProc create_eq_dw_proc; + CreateDebugCamProc create_debug_cam_proc; + + DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot); + virtual ~DataTestMotDw() override; + + virtual void Draw() override; + virtual void Hide() override; + + virtual void ClearIDs(); + virtual void AddID(const char* str); + virtual void SetFrameSlider(float_t frame, float_t frame_count); + virtual void SetFrameLabel(float_t frame, float_t frame_count); + + void AddModules(int32_t chara_id, dw::ListBox* list_box); + void ResetFrame(); + void ResetIDListBoxIndex(); + void SetIDListBoxIndex(uint32_t index); + + static void ABToggleCallback(dw::Widget* data); + static void ACallback(dw::Widget* data); + static void BCallback(dw::Widget* data); + static void StartCtrlLeftRightCallback(dw::Widget* data); + static void StartCtrlResetCallback(dw::Widget* data); + + void sub_14028D8B0(); +}; + +class DataTestMotA3dDw : public dw::Shell { +public: + class PvListBoxProc : public dw::SelectionAdapter { + public: + PvListBoxProc(); + virtual ~PvListBoxProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class A3dListBoxProc : public dw::SelectionAdapter { + public: + A3dListBoxProc(); + virtual ~A3dListBoxProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + dw::ListBox* pv; + DataTestMotA3dDw::PvListBoxProc pv_list_box_proc; + dw::ListBox* a3d; + DataTestMotA3dDw::A3dListBoxProc a3d_list_box_proc; + dw::Button* play_a3d; + dw::Button* sync_1p_frame; + + DataTestMotA3dDw(); + virtual ~DataTestMotA3dDw(); + + virtual void Draw() override; + virtual void Hide() override; + + void SetPvId(int32_t pv_id); + + static void PlayA3dCallback(dw::Widget* data); + static void Sync1pFrameCallback(dw::Widget* data); +}; + +class DataTestMotCtrlDw : public dw::Shell { +public: + class TypeListBoxProc : public dw::SelectionAdapter { + public: + TypeListBoxProc(); + virtual ~TypeListBoxProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + class SyncFrameButtonProc : public dw::SelectionAdapter { + public: + SyncFrameButtonProc(); + virtual ~SyncFrameButtonProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + + class GameCameraButtonProc : public dw::SelectionAdapter { + public: + GameCameraButtonProc(); + virtual ~GameCameraButtonProc() override; + + virtual void Callback(dw::SelectionListener::CallbackData* data) override; + }; + + dw::ListBox* type_list; + TypeListBoxProc type_list_box_proc; + dw::Button* reset_mot; + dw::Button* reset_cam; + dw::Button* reload_data; + dw::Button* stage; + dw::Button* running; + DataTestMotCtrlDw::SyncFrameButtonProc sync_frame_button_proc; + DataTestMotCtrlDw::GameCameraButtonProc game_camera_button_proc; + + DataTestMotCtrlDw(); + virtual ~DataTestMotCtrlDw(); + + virtual void Draw() override; + virtual void Hide() override; + + static void ReloadDataCallback(dw::Widget* data); + static void ResetCamCallback(dw::Widget* data); + static void ResetMotCallback(dw::Widget* data); + static void RunningCallback(dw::Widget* data); + static void StageCallback(dw::Widget* data); +}; + extern int32_t width; extern int32_t height; extern render_context* rctx_ptr; @@ -112,8 +438,8 @@ bool DataTestMot::Init() { data_test_mot_a3d_dw_init(); data.reset_cam = true; data.field_A8 = true; - //dtm_eq_vs_array[0].AddTask(0, data.chara_index[0]); - //dtm_eq_vs_array[1].AddTask(1, data.chara_index[1]); + dtm_eq_vs_array[0].AddTask(0, data.chara_index[0]); + dtm_eq_vs_array[1].AddTask(1, data.chara_index[1]); motion_test_objset_load(); return true; } @@ -135,28 +461,28 @@ bool DataTestMot::Ctrl() { if (data.chara_index[0] != data.curr_chara_index[0]) { data.curr_chara_index[0] = data.chara_index[0]; - //dtm_eq_vs_array[0].SetCharaIndexModuleIndex(data.chara_index[0], data.module_index[0]); + dtm_eq_vs_array[0].SetCharaIndexModuleIndex(data.chara_index[0], data.module_index[0]); v3 = true; v2 = true; } if (data.chara_index[1] != data.curr_chara_index[1]) { data.curr_chara_index[1] = data.chara_index[1]; - //dtm_eq_vs_array[1].SetCharaIndexModuleIndex(data.chara_index[1], data.module_index[1]); + dtm_eq_vs_array[1].SetCharaIndexModuleIndex(data.chara_index[1], data.module_index[1]); v3 = true; v2 = true; } if (data.module_index[0] != data.curr_module_index[0]) { data.curr_module_index[0] = data.module_index[0]; - //dtm_eq_vs_array[0].SetCharaIndexModuleIndex(data.chara_index[0], data.module_index[0]); + dtm_eq_vs_array[0].SetCharaIndexModuleIndex(data.chara_index[0], data.module_index[0]); v3 = true; v2 = true; } if (data.module_index[1] != data.curr_module_index[1]) { data.curr_module_index[1] = data.module_index[1]; - //dtm_eq_vs_array[1].SetCharaIndexModuleIndex(data.chara_index[1], data.module_index[1]); + dtm_eq_vs_array[1].SetCharaIndexModuleIndex(data.chara_index[1], data.module_index[1]); v3 = true; v2 = true; } @@ -183,7 +509,7 @@ bool DataTestMot::Ctrl() { data_test_mot_dw_array_get(1)->ClearIDs(); - const motion_set_info& set_info = aft_mot_db->motion_set[data.motion_set_index[0]]; + const motion_set_info& set_info = aft_mot_db->motion_set[data.motion_set_index[1]]; for (const motion_info& i : set_info.motion) data_test_mot_dw_array_get(1)->AddID(i.name.c_str()); @@ -335,8 +661,8 @@ bool DataTestMot::Dest() { data_test_mot_ctrl_dw_get()->Hide(); data_test_mot_a3d_dw_get()->Hide(); data_test_face_mot_dw_array_unload(); - //dtm_eq_vs_array[0].DelTask(); - //dtm_eq_vs_array[1].DelTask(); + dtm_eq_vs_array[0].DelTask(); + dtm_eq_vs_array[1].DelTask(); motion_test_objset_unload(); data_test_mot_a3d_get()->DelTask(); return true; @@ -562,7 +888,7 @@ void DataTestMotA3d::Sync1pFrame() { i.set_req_frame(frame); } -DtmMot::DtmMot() : rob_bone_data(), field_7C(), rot_y(), pre_offset(), post_offset(), divide(), +DtmMot::DtmMot() : rob_bone_data(), type(), rot_y(), pre_offset(), post_offset(), divide(), loop(), change_motion(), use_opd(), field_D6(), reset_mot(), save_only_start_frame(), state(), frame(), delta_frame(), looped(), start_frame(), ab_frame(), ab_loop(), set_motion_index() { chara_id = -1; @@ -592,7 +918,7 @@ bool DtmMot::Init() { state = 1; looped = 0; - if (chara_index < CHARA_MIKU || chara_index >= CHARA_MAX || module_index >= 502) { + if (chara_index < 0 || chara_index >= CHARA_MAX || module_index >= 502) { state = 0; return true; } @@ -600,7 +926,7 @@ bool DtmMot::Init() { data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - if (!field_7C) { + if (!type) { int32_t motion_set_index = this->motion_set_index; int32_t motion_index = this->motion_index; if (aft_mot_db->motion_set.size() <= motion_set_index) { @@ -863,7 +1189,7 @@ bool DtmMot::Ctrl() { rob_chara* rob_chr = rob_chara_array_get(chara_id); - float_t frame = 0.0f; + float_t frame = this->frame; if (frame >= pre_offset) frame = min_def(rob_chr->data.field_1588.field_0.frame, frame - pre_offset); @@ -970,7 +1296,7 @@ void DtmMot::Basic() { int32_t step_index = 3; for (int32_t i = 0; i < 4; i++) - if (frame >= divide[i]) { + if (frame < divide[i]) { step_index = i; break; } @@ -1017,13 +1343,32 @@ void DtmMot::Basic() { } bool DtmMot::AddTask(::chara_index chara_index, - int32_t module_index, uint32_t motion_set_id, uint32_t motion_id) { - return true; + int32_t module_index, uint32_t motion_set_index, uint32_t motion_index) { + if (app::TaskWork::HasTask(this) || app::TaskWork::CheckTaskReady(this)) + return true; + + this->chara_index = chara_index; + this->module_index = module_index; + this->motion_index = motion_index; + this->motion_set_index = motion_set_index; + type = 0; + return app::TaskWork::AddTask(this, "DATA_TEST_MOTION_MANAGER", 0); } bool DtmMot::AddTask(::chara_index chara_index, int32_t module_index, uint32_t motion_id) { - return true; + if (app::TaskWork::HasTask(this) || app::TaskWork::CheckTaskReady(this)) + return true; + + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + this->chara_index = chara_index; + this->module_index = module_index; + this->motion_id = motion_id; + this->motion_set_id = aft_mot_db->get_motion_set_id_by_motion_id(motion_id); + type = 1; + return app::TaskWork::AddTask(this, "DATA_TEST_MOTION_MANAGER", 0); } bool DtmMot::DelTask() { @@ -1153,11 +1498,11 @@ void DtmMot::SetOffset(float_t pre_offset, float_t post_offset) { } void DtmMot::SetPlay(bool value) { - partial_mot = value; + play = value; } void DtmMot::SetPartialMot(bool value) { - play = value; + partial_mot = value; } void DtmMot::SetResetMot() { @@ -1249,6 +1594,70 @@ int32_t DtmMot::ConvertMotionSetNameToPVID(const char* set_name) { return pv_id; } +void motion_test_init() { + if (!data_test_mot) + data_test_mot = new DataTestMot; + + if (!data_test_mot_a3d) + data_test_mot_a3d = new DataTestMotA3d; + + if (!dtm_mot_array) + dtm_mot_array = new DtmMot[2]; + + motion_test_objset = {}; +} + +void motion_test_free() { + for (DataTestFaceMotDw*& i : data_test_face_mot_dw_array) + if (i) { + delete i; + i = 0; + } + + if (data_test_mot_ctrl_dw) { + delete data_test_mot_ctrl_dw; + data_test_mot_ctrl_dw = 0; + } + + if (data_test_mot_a3d_dw) { + delete data_test_mot_a3d_dw; + data_test_mot_a3d_dw = 0; + } + + for (DataTestMotDw*& i : data_test_mot_dw_array) + if (i) { + delete i; + i = 0; + } + + motion_test_objset.clear(); + motion_test_objset.shrink_to_fit(); + + if (dtm_mot_array) { + delete[] dtm_mot_array; + dtm_mot_array = 0; + } + + if (data_test_mot_a3d) { + delete data_test_mot_a3d; + data_test_mot_a3d = 0; + } + + if (data_test_mot) { + delete data_test_mot; + data_test_mot = 0; + } +} + +void dtm_mot_array_set_reset_mot() { + dtm_mot_array[0].SetResetMot(); + dtm_mot_array[1].SetResetMot(); +} + +bool dtm_mot_array_sub_140291C10() { + return dtm_mot_array[0].sub_140291C10() && dtm_mot_array[1].sub_140291C10(); +} + DataTestFaceMotDw::DataTestFaceMotDw(int32_t chara_id) { this->chara_id = chara_id; @@ -1503,7 +1912,7 @@ void DataTestMotDw::CTypeListBoxProc::Callback(dw::SelectionListener::CallbackDa size_t end = str.find(')'); if (end != -1) test_mot_data->module_index[list_box->callback_data.i32] = - atoi(str.substr(start, end - start).c_str()) - 1; + atoi(str.substr(start, end - start).c_str()) - 1; } } } @@ -1535,7 +1944,13 @@ DataTestMotDw::IdListBoxProc::~IdListBoxProc() { } void DataTestMotDw::IdListBoxProc::Callback(dw::SelectionListener::CallbackData* data) { - + DataTestMot::Data* test_mot_data = data_test_mot_data_get(); + dw::ListBox* list_box = dynamic_cast(data->widget); + if (list_box) { + int32_t chara_id = list_box->callback_data.i32; + test_mot_data->motion_index[chara_id] = (int32_t)list_box->list->selected_item; + data_test_mot_dw_array_get(chara_id)->ResetFrame(); + } } DataTestMotDw::RotateSliderProc::RotateSliderProc() : slider() { @@ -1547,7 +1962,10 @@ DataTestMotDw::RotateSliderProc::~RotateSliderProc() { } void DataTestMotDw::RotateSliderProc::Callback(dw::SelectionListener::CallbackData* data) { - + DataTestMot::Data* test_mot_data = data_test_mot_data_get(); + dw::Slider* slider = dynamic_cast(data->widget); + if (slider) + test_mot_data->rot_y[slider->callback_data.i32] = slider->scroll_bar->value * DEG_TO_RAD_FLOAT; } DataTestMotDw::PositionSliderProc::PositionSliderProc() { @@ -1559,7 +1977,10 @@ DataTestMotDw::PositionSliderProc::~PositionSliderProc() { } void DataTestMotDw::PositionSliderProc::Callback(dw::SelectionListener::CallbackData* data) { - + DataTestMot::Data* test_mot_data = data_test_mot_data_get(); + dw::Slider* slider = dynamic_cast(data->widget); + if (slider) + test_mot_data->trans_x[slider->callback_data.i32] = slider->scroll_bar->value; } DataTestMotDw::FrameSliderProc::FrameSliderProc() : slider() { @@ -1571,7 +1992,16 @@ DataTestMotDw::FrameSliderProc::~FrameSliderProc() { } void DataTestMotDw::FrameSliderProc::Callback(dw::SelectionListener::CallbackData* data) { - + DataTestMot::Data* test_mot_data = data_test_mot_data_get(); + dw::Slider* slider = dynamic_cast(data->widget); + if (slider) { + float_t frame = slider->scroll_bar->value; + data_test_mot_dw_array_get(slider->scroll_bar->callback_data.i32)->dtm_mot->SetFrame(frame); + if (test_mot_data->sync_frame) { + dtm_mot_array[0].SetFrame(frame); + dtm_mot_array[1].SetFrame(frame); + } + } } DataTestMotDw::StartFrameSliderProc::StartFrameSliderProc() : button() { @@ -1583,7 +2013,10 @@ DataTestMotDw::StartFrameSliderProc::~StartFrameSliderProc() { } void DataTestMotDw::StartFrameSliderProc::Callback(dw::SelectionListener::CallbackData* data) { - + DataTestMot::Data* test_mot_data = data_test_mot_data_get(); + dw::Slider* slider = dynamic_cast(data->widget); + if (slider) + test_mot_data->start_frame[slider->callback_data.i32] = slider->scroll_bar->value; } DataTestMotDw::DispButtonProc::DispButtonProc() : button() { @@ -1595,7 +2028,9 @@ DataTestMotDw::DispButtonProc::~DispButtonProc() { } void DataTestMotDw::DispButtonProc::Callback(dw::SelectionListener::CallbackData* data) { - + dw::Button* button = dynamic_cast(data->widget); + if (button) + data_test_mot_dw_array_get(button->callback_data.i32)->dtm_mot->SetDisp(button->value); } DataTestMotDw::UseOpdButtonProc::UseOpdButtonProc() { @@ -1607,7 +2042,9 @@ DataTestMotDw::UseOpdButtonProc::~UseOpdButtonProc() { } void DataTestMotDw::UseOpdButtonProc::Callback(dw::SelectionListener::CallbackData* data) { - + dw::Button* button = dynamic_cast(data->widget); + if (button) + data_test_mot_dw_array_get(button->callback_data.i32)->dtm_mot->SetUseOpd(button->value); } DataTestMotDw::PartialMotButtonProc::PartialMotButtonProc() { @@ -1619,7 +2056,9 @@ DataTestMotDw::PartialMotButtonProc::~PartialMotButtonProc() { } void DataTestMotDw::PartialMotButtonProc::Callback(dw::SelectionListener::CallbackData* data) { - + dw::Button* button = dynamic_cast(data->widget); + if (button) + data_test_mot_dw_array_get(button->callback_data.i32)->dtm_mot->SetPartialMot(button->value); } DataTestMotDw::SaveOnlyStartFrameButtonProc::SaveOnlyStartFrameButtonProc() { @@ -1631,7 +2070,9 @@ DataTestMotDw::SaveOnlyStartFrameButtonProc::~SaveOnlyStartFrameButtonProc() { } void DataTestMotDw::SaveOnlyStartFrameButtonProc::Callback(dw::SelectionListener::CallbackData* data) { - + dw::Button* button = dynamic_cast(data->widget); + if (button) + data_test_mot_dw_array_get(button->callback_data.i32)->dtm_mot->SetSaveOnlyStartFrame(button->value); } DataTestMotDw::CreateFaceMotDwProc::CreateFaceMotDwProc() { @@ -1643,7 +2084,9 @@ DataTestMotDw::CreateFaceMotDwProc::~CreateFaceMotDwProc() { } void DataTestMotDw::CreateFaceMotDwProc::Callback(dw::SelectionListener::CallbackData* data) { - + dw::Button* button = dynamic_cast(data->widget); + if (button) + data_test_face_mot_dw_array_init(button->callback_data.i32); } DataTestMotDw::CreateEqDwProc::CreateEqDwProc() { @@ -1655,7 +2098,7 @@ DataTestMotDw::CreateEqDwProc::~CreateEqDwProc() { } void DataTestMotDw::CreateEqDwProc::Callback(dw::SelectionListener::CallbackData* data) { - + data_test_equip_dw_init(); } DataTestMotDw::CreateDebugCamProc::CreateDebugCamProc() { @@ -1688,7 +2131,7 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { dw::ListBox* chara = new dw::ListBox(chara_comp); chara->SetMaxItems(20); - for (int32_t i = CHARA_MIKU; i < CHARA_MAX; i++) + for (int32_t i = 0; i < CHARA_MAX; i++) chara->AddItem(chara_index_get_name((chara_index)i)); chara->callback_data.i32 = chara_id; chara->SetItemIndex(test_mot_data->chara_index[chara_id]); @@ -1709,7 +2152,7 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { chara_list_box_proc.list_box->SetFont(dw::p_font_type_6x12); dw::Composite* set_comp = new dw::Composite(this); - set_comp->SetLayout( new dw::RowLayout(dw::HORIZONTAL)); + set_comp->SetLayout(new dw::RowLayout(dw::HORIZONTAL)); dw::Label* set_label = new dw::Label(set_comp); set_label->SetText("SET "); @@ -2064,10 +2507,10 @@ void DataTestMotDw::StartCtrlLeftRightCallback(dw::Widget* data) { if (i.motion_id == test_mot_dw->dtm_mot->motion_id) if (&i != set_motion.data()) last = i.frame_stage_index.first; - if (frame < i.frame_stage_index.first) { - first = i.frame_stage_index.first; - break; - } + if (frame < i.frame_stage_index.first) { + first = i.frame_stage_index.first; + break; + } } if (frame > set_motion.back().frame_stage_index.first) @@ -2335,7 +2778,7 @@ DataTestMotCtrlDw::DataTestMotCtrlDw() { SetText("MOTION TEST"); - type_list = new dw::ListBox(this); + type_list = new dw::ListBox(this, dw::MULTISELECT); type_list->AddItem("ONCE"); type_list->AddItem("LOOP"); type_list->AddItem("STEP"); @@ -2455,66 +2898,6 @@ void DataTestMotCtrlDw::StageCallback(dw::Widget* data) { dtw_stg_load(false); } -void motion_test_init() { - if (!data_test_mot) - data_test_mot = new DataTestMot; - - if (!data_test_mot_a3d) - data_test_mot_a3d = new DataTestMotA3d; - - if (!dtm_mot_array) - dtm_mot_array = new DtmMot[2]; - - motion_test_objset = {}; -} - -void motion_test_free() { - for (DataTestFaceMotDw*& i : data_test_face_mot_dw_array) - if (i) { - delete i; - i = 0; - } - - if (data_test_mot_ctrl_dw) { - delete data_test_mot_ctrl_dw; - data_test_mot_ctrl_dw = 0; - } - - if (data_test_mot_a3d_dw) { - delete data_test_mot_a3d_dw; - data_test_mot_a3d_dw = 0; - } - - for (DataTestMotDw*& i : data_test_mot_dw_array) - if (i) { - delete i; - i = 0; - } - - motion_test_objset.clear(); - motion_test_objset.shrink_to_fit(); - - if (dtm_mot_array) { - delete[] dtm_mot_array; - dtm_mot_array = 0; - } - - if (data_test_mot_a3d) { - delete data_test_mot_a3d; - data_test_mot_a3d = 0; - } - - if (data_test_mot) { - delete data_test_mot; - data_test_mot = 0; - } -} - -void dtm_mot_array_set_reset_mot() { - dtm_mot_array[0].SetResetMot(); - dtm_mot_array[1].SetResetMot(); -} - static DataTestMot::Data* data_test_mot_data_get() { return &data_test_mot->data; } @@ -2567,6 +2950,7 @@ static DataTestMotDw* data_test_mot_dw_array_get(int32_t chara_id) { } static void data_test_mot_a3d_dw_init() { + data_test_mot_a3d_add_task(); if (!data_test_mot_a3d_dw) { data_test_mot_a3d_dw = new DataTestMotA3dDw; data_test_mot_a3d_dw->sub_1402F38B0(); diff --git a/src/ReDIVA/data_test/motion_test.hpp b/src/ReDIVA/data_test/motion_test.hpp index 90dacfed..e80ef29b 100644 --- a/src/ReDIVA/data_test/motion_test.hpp +++ b/src/ReDIVA/data_test/motion_test.hpp @@ -8,9 +8,8 @@ #include "../../KKdLib/default.hpp" #include "../../CRE/rob/rob.hpp" #include "../../CRE/auth_3d.hpp" +#include "../../CRE/task.hpp" #include "../pv_game/pv_game_pv_data.hpp" -#include "../dw.hpp" -#include "../task_window.hpp" class DataTestMot : public app::Task { public: @@ -106,7 +105,7 @@ class DtmMot : public app::Task { public: rob_chara_bone_data* rob_bone_data; int32_t chara_id; - int32_t field_7C; + int32_t type; ::chara_index chara_index; int32_t module_index; union { @@ -157,7 +156,7 @@ public: virtual void Basic() override; virtual bool AddTask(::chara_index chara_index, - int32_t module_index, uint32_t motion_set_id, uint32_t motion_id); + int32_t module_index, uint32_t motion_set_index, uint32_t motion_index); virtual bool AddTask(::chara_index chara_index, int32_t module_index, uint32_t motion_id); virtual bool DelTask(); @@ -195,332 +194,6 @@ public: void sub_1402922C0(bool value); }; -class DataTestFaceMotDw : public dw::Shell { -public: - struct MotionData - { - int32_t mottbl_index; - float_t frame; - }; - - struct Data { - MotionData face; - MotionData eyelid; - MotionData eyes; - MotionData mouth; - }; - - int32_t chara_id; - std::map motion_id_mottbl_map; - dw::Button* enable; - dw::ListBox* face; - dw::Slider* face_frame; - dw::Label* face_cl; - dw::Slider* face_cl_frame; - dw::ListBox* eyes; - dw::Slider* eyes_frame; - dw::ListBox* mouth; - dw::Slider* mouth_frame; - - DataTestFaceMotDw(int32_t chara_id); - virtual ~DataTestFaceMotDw() override; - - virtual void Hide() override; - - void AddMottblMapMotions(dw::ListBox* list_box, int32_t type); - Data GetData(); - bool GetEnable(); - dw::ListBox* InitAddMottblMapMotions(dw::Composite* parent, int32_t type); - void Reset(); -}; - -class DataTestMotDw : public dw::Shell { -public: - class StepSliderProc : public dw::SelectionAdapter { - public: - int32_t index; - - StepSliderProc(); - virtual ~StepSliderProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class CharaListBoxProc : public dw::SelectionAdapter { - public: - dw::ListBox* list_box; - - CharaListBoxProc(); - virtual ~CharaListBoxProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class CTypeListBoxProc : public dw::SelectionAdapter { - public: - dw::ListBox* list_box; - - CTypeListBoxProc(); - virtual ~CTypeListBoxProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SetListBoxProc : public dw::SelectionAdapter { - public: - dw::ListBox* list_box; - - SetListBoxProc(); - virtual ~SetListBoxProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class IdListBoxProc : public dw::SelectionAdapter { - public: - dw::Slider* slider; - - IdListBoxProc(); - virtual ~IdListBoxProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class RotateSliderProc : public dw::SelectionAdapter { - public: - dw::Slider* slider; - - RotateSliderProc(); - virtual ~RotateSliderProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class PositionSliderProc : public dw::SelectionAdapter { - public: - PositionSliderProc(); - virtual ~PositionSliderProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class FrameSliderProc : public dw::SelectionAdapter { - public: - dw::Slider* slider; - - FrameSliderProc(); - virtual ~FrameSliderProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class StartFrameSliderProc : public dw::SelectionAdapter { - public: - dw::Button* button; - - StartFrameSliderProc(); - virtual ~StartFrameSliderProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class DispButtonProc : public dw::SelectionAdapter { - public: - dw::Button* button; - - DispButtonProc(); - virtual ~DispButtonProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class UseOpdButtonProc : public dw::SelectionAdapter { - public: - UseOpdButtonProc(); - virtual ~UseOpdButtonProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class PartialMotButtonProc : public dw::SelectionAdapter { - public: - PartialMotButtonProc(); - virtual ~PartialMotButtonProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SaveOnlyStartFrameButtonProc : public dw::SelectionAdapter { - public: - SaveOnlyStartFrameButtonProc(); - virtual ~SaveOnlyStartFrameButtonProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class CreateFaceMotDwProc : public dw::SelectionAdapter { - public: - CreateFaceMotDwProc(); - virtual ~CreateFaceMotDwProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class CreateEqDwProc : public dw::SelectionAdapter { - public: - CreateEqDwProc(); - virtual ~CreateEqDwProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - struct CreateDebugCamProc : public dw::SelectionAdapter { - public: - CreateDebugCamProc(); - virtual ~CreateDebugCamProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - DtmMot* dtm_mot; - dw::ListBox* chara; - CharaListBoxProc chara_list_box_proc; - CTypeListBoxProc c_type_list_box_proc; - SetListBoxProc set_list_box_proc; - IdListBoxProc id_list_box_proc; - RotateSliderProc rotate_slider_proc; - PositionSliderProc position_slider_proc; - //__int64 field_1E8; - //__int64 field_1F0; - //__int64 field_1F8; - dw::Slider* step_slider; - StepSliderProc step_slider_proc[4]; - dw::Slider* current; - FrameSliderProc frame_slider_proc; - StartFrameSliderProc start_frame_slider_proc; - dw::Label* ab_loop; - dw::Label* frame; - dw::Label* frame_count; - DispButtonProc disp_button_proc; - UseOpdButtonProc use_opd_button_proc; - PartialMotButtonProc partial_mot_button_proc; - SaveOnlyStartFrameButtonProc save_only_start_frame_button_proc; - CreateFaceMotDwProc create_face_mot_dw_proc; - CreateEqDwProc create_eq_dw_proc; - CreateDebugCamProc create_debug_cam_proc; - - DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot); - virtual ~DataTestMotDw() override; - - virtual void Draw() override; - virtual void Hide() override; - - virtual void ClearIDs(); - virtual void AddID(const char* str); - virtual void SetFrameSlider(float_t frame, float_t frame_count); - virtual void SetFrameLabel(float_t frame, float_t frame_count); - - void AddModules(int32_t chara_id, dw::ListBox* list_box); - void ResetFrame(); - void ResetIDListBoxIndex(); - void SetIDListBoxIndex(uint32_t index); - - static void ABToggleCallback(dw::Widget* data); - static void ACallback(dw::Widget* data); - static void BCallback(dw::Widget* data); - static void StartCtrlLeftRightCallback(dw::Widget* data); - static void StartCtrlResetCallback(dw::Widget* data); - - void sub_14028D8B0(); -}; - -class DataTestMotA3dDw : public dw::Shell { -public: - class PvListBoxProc : public dw::SelectionAdapter { - public: - PvListBoxProc(); - virtual ~PvListBoxProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class A3dListBoxProc : public dw::SelectionAdapter { - public: - A3dListBoxProc(); - virtual ~A3dListBoxProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - dw::ListBox* pv; - DataTestMotA3dDw::PvListBoxProc pv_list_box_proc; - dw::ListBox* a3d; - DataTestMotA3dDw::A3dListBoxProc a3d_list_box_proc; - dw::Button* play_a3d; - dw::Button* sync_1p_frame; - - DataTestMotA3dDw(); - virtual ~DataTestMotA3dDw(); - - virtual void Draw() override; - virtual void Hide() override; - - void SetPvId(int32_t pv_id); - - static void PlayA3dCallback(dw::Widget* data); - static void Sync1pFrameCallback(dw::Widget* data); -}; - -class DataTestMotCtrlDw : public dw::Shell { -public: - class TypeListBoxProc : public dw::SelectionAdapter { - public: - TypeListBoxProc(); - virtual ~TypeListBoxProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - class SyncFrameButtonProc : public dw::SelectionAdapter { - public: - SyncFrameButtonProc(); - virtual ~SyncFrameButtonProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - - class GameCameraButtonProc : public dw::SelectionAdapter { - public: - GameCameraButtonProc(); - virtual ~GameCameraButtonProc() override; - - virtual void Callback(dw::SelectionListener::CallbackData* data) override; - }; - - dw::ListBox* type_list; - TypeListBoxProc type_list_box_proc; - dw::Button* reset_mot; - dw::Button* reset_cam; - dw::Button* reload_data; - dw::Button* stage; - dw::Button* running; - DataTestMotCtrlDw::SyncFrameButtonProc sync_frame_button_proc; - DataTestMotCtrlDw::GameCameraButtonProc game_camera_button_proc; - - DataTestMotCtrlDw(); - virtual ~DataTestMotCtrlDw(); - - virtual void Draw() override; - virtual void Hide() override; - - static void ReloadDataCallback(dw::Widget* data); - static void ResetCamCallback(dw::Widget* data); - static void ResetMotCallback(dw::Widget* data); - static void RunningCallback(dw::Widget* data); - static void StageCallback(dw::Widget* data); -}; - extern DataTestMot* data_test_mot; extern DtmMot* dtm_mot_array; @@ -528,3 +201,4 @@ extern void motion_test_init(); extern void motion_test_free(); extern void dtm_mot_array_set_reset_mot(); +extern bool dtm_mot_array_sub_140291C10(); diff --git a/src/ReDIVA/data_test/stage_test.cpp b/src/ReDIVA/data_test/stage_test.cpp index f52f8dc9..2754a4df 100644 --- a/src/ReDIVA/data_test/stage_test.cpp +++ b/src/ReDIVA/data_test/stage_test.cpp @@ -11,10 +11,33 @@ #include "../../CRE/render_context.hpp" #include "../../CRE/stage.hpp" #include "../../CRE/task_effect.hpp" -#include "../imgui_helper.hpp" +#include "../dw.hpp" #include "../input.hpp" #include "../config.hpp" +class DtwStg : public dw::Shell { +public: + std::map> pv_stage; + dw::ListBox* stage; + dw::ListBox* ns; + dw::ListBox* pv; + dw::ListBox* pv_id; + dw::ListBox* other; + dw::Button* stage_display; + dw::Button* ground; + dw::Button* ring; + dw::Button* sky; + dw::Button* effect_display; + + DtwStg(); + virtual ~DtwStg() override; + + virtual void Hide() override; + + static void PvIdCallback(dw::Widget* data); + static void StageCallback(dw::Widget* data); +}; + extern int32_t width; extern int32_t height; @@ -68,6 +91,48 @@ bool DtmStg::Dest() { return true; } +void dtm_stg_init() { + dtm_stg = new DtmStg; +} + +void dtm_stg_load(int32_t stage_index) { + if (app::TaskWork::CheckTaskReady(dtm_stg)) + return; + + if (app::TaskWork::CheckTaskReady(dtm_stg)) { + dtm_stg->stage_index = stage_index; + dtm_stg->load_stage_index = stage_index; + } + app::TaskWork::AddTask(dtm_stg, "DATA_TEST_STAGE"); +} + +bool dtm_stg_unload() { + return dtm_stg->DelTask(); +} + +void dtm_stg_free() { + if (dtm_stg) { + delete dtm_stg; + dtm_stg = 0; + } +} + +void dtw_stg_init() { + while (!dtw_stg) + dtw_stg = new DtwStg; + dtw_stg->Disp(); +} + +void dtw_stg_load(bool hide) { + dtw_stg_init(); + if (hide) + dtw_stg->SetDisp(false); +} + +void dtw_stg_unload() { + dtw_stg->Hide(); +} + DtwStg::DtwStg() : Shell(0) { data_struct* aft_data = &data_list[DATA_AFT]; stage_database* aft_stage_data = &aft_data->data_ft.stage_data; @@ -141,10 +206,10 @@ DtwStg::DtwStg() : Shell(0) { stage->AddSelectionListener(new dw::SelectionListenerOnHook(DtwStg::StageCallback)); #if DW_TRANSLATE - const char* stage_display_text = "Stage display"; - const char* ring_text = "[Ring]"; - const char* ground_text = "[Ground]"; - const char* sky_text = "[Sky]"; + const char* stage_display_text = "Stage display"; + const char* ring_text = "[Ring]"; + const char* ground_text = "[Ground]"; + const char* sky_text = "[Sky]"; const char* effect_display_text = "Effects display"; #else const char* stage_display_text = "ステージ表示"; @@ -215,48 +280,6 @@ void DtwStg::StageCallback(dw::Widget* data) { } } -void dtm_stg_init() { - dtm_stg = new DtmStg; -} - -void dtm_stg_load(int32_t stage_index) { - if (app::TaskWork::CheckTaskReady(dtm_stg)) - return; - - if (app::TaskWork::CheckTaskReady(dtm_stg)) { - dtm_stg->stage_index = stage_index; - dtm_stg->load_stage_index = stage_index; - } - app::TaskWork::AddTask(dtm_stg, "DATA_TEST_STAGE"); -} - -bool dtm_stg_unload() { - return dtm_stg->DelTask(); -} - -void dtm_stg_free() { - if (dtm_stg) { - delete dtm_stg; - dtm_stg = 0; - } -} - -void dtw_stg_init() { - while (!dtw_stg) - dtw_stg = new DtwStg; - dtw_stg->Disp(); -} - -void dtw_stg_load(bool hide) { - dtw_stg_init(); - if (hide) - dtw_stg->SetDisp(false); -} - -void dtw_stg_unload() { - dtw_stg->Hide(); -} - static int stage_test_stage_pv_quicksort_compare_func(void const* src1, void const* src2) { int32_t pv1 = ((stage_test_stage_pv*)src1)->pv_id; int32_t pv2 = ((stage_test_stage_pv*)src2)->pv_id; diff --git a/src/ReDIVA/data_test/stage_test.hpp b/src/ReDIVA/data_test/stage_test.hpp index 8411c88e..c4e9b698 100644 --- a/src/ReDIVA/data_test/stage_test.hpp +++ b/src/ReDIVA/data_test/stage_test.hpp @@ -7,11 +7,11 @@ #include "../../KKdLib/default.hpp" #include "../../CRE/task.hpp" -#include "../dw.hpp" +#include struct stage_test_stage_pv { int32_t pv_id; - std::vector stage; + std::vector stage; stage_test_stage_pv(int32_t pv_id); ~stage_test_stage_pv(); @@ -30,33 +30,8 @@ public: virtual bool Dest() override; }; -class DtwStg : public dw::Shell { -public: - std::map> pv_stage; - dw::ListBox* stage; - dw::ListBox* ns; - dw::ListBox* pv; - dw::ListBox* pv_id; - dw::ListBox* other; - dw::Button* stage_display; - dw::Button* ground; - dw::Button* ring; - dw::Button* sky; - dw::Button* effect_display; - - DtwStg(); - virtual ~DtwStg() override; - - virtual void Hide() override; - - static void PvIdCallback(dw::Widget* data); - static void StageCallback(dw::Widget* data); -}; - extern DtmStg* dtm_stg; -extern DtwStg* dtw_stg; - extern void dtm_stg_init(); extern void dtm_stg_load(int32_t stage_index); extern bool dtm_stg_unload(); diff --git a/src/ReDIVA/dw.cpp b/src/ReDIVA/dw.cpp index dd339f24..3942e69f 100644 --- a/src/ReDIVA/dw.cpp +++ b/src/ReDIVA/dw.cpp @@ -2030,6 +2030,7 @@ namespace dw { void List::ClearItems() { items.clear(); + selections.clear(); hovered_item = -1; selected_item = -1; } @@ -3561,13 +3562,13 @@ void dw_gui_detail::Display::Draw() { void dw_gui_detail::Display::FreeWidgets() { for (auto& i : free_widgets) { - delete i; - if (howered_widget == i) howered_widget = 0; if (selected_widget == i) selected_widget = 0; + + delete i; } free_widgets.clear(); diff --git a/src/ReDIVA/dw.hpp b/src/ReDIVA/dw.hpp index f422d934..9e0aa681 100644 --- a/src/ReDIVA/dw.hpp +++ b/src/ReDIVA/dw.hpp @@ -139,7 +139,7 @@ namespace dw { class Widget { public: - typedef void(*Callback)(Widget* widget); + typedef void(*Callback)(Widget* data); struct KeyCallbackData { Widget* widget; diff --git a/src/ReDIVA/game_state.cpp b/src/ReDIVA/game_state.cpp index 8dc7c455..64bd2309 100644 --- a/src/ReDIVA/game_state.cpp +++ b/src/ReDIVA/game_state.cpp @@ -1390,8 +1390,8 @@ bool SubGameState::DataTestStg::Ctrl() { bool SubGameState::DataTestStg::Dest() { clear_color = 0xFF000000; - dtw_stg->Hide(); - dtm_stg->DelTask(); + dtm_stg_unload(); + dtw_stg_unload(); return true; } diff --git a/src/ReDIVA/pv_game/pv_game.cpp b/src/ReDIVA/pv_game/pv_game.cpp index 9ae2ff09..13bd786a 100644 --- a/src/ReDIVA/pv_game/pv_game.cpp +++ b/src/ReDIVA/pv_game/pv_game.cpp @@ -898,8 +898,7 @@ int32_t pv_game::calculate_reference_score() { int32_t target_index_chance = 0; int32_t target_index_chance_no_flag = 0; bool end; - do - { + do { int32_t target_count = 0; int32_t target_flag = 0; int32_t slide_chain_type = 0; @@ -5745,7 +5744,7 @@ float_t bar_time_set_to_target_flying_time(int32_t bpm, int32_t time_signature, } float_t dsc_time_to_frame(int64_t time) { - return (float_t)time / (float_t)1000000000 * 60.0f; + return roundf((float_t)time / (float_t)1000000000 * 60.0f); } bool pv_game_init() { diff --git a/src/ReDIVA/pv_game/pv_game_pv_data.cpp b/src/ReDIVA/pv_game/pv_game_pv_data.cpp index 9bb787c8..2c34890c 100644 --- a/src/ReDIVA/pv_game/pv_game_pv_data.cpp +++ b/src/ReDIVA/pv_game/pv_game_pv_data.cpp @@ -2318,7 +2318,7 @@ void pv_game_pv_data::find_set_motion(const pv_db_pv_difficulty* diff) { frame = (float_t)(frame < 0.0f ? frame_int - 1 : frame_int); uint32_t motion_id = diff->get_motion_or_default(i, j.index).id; - if (pv_game_get()->data.pv) { + if (pv_game_get() && pv_game_get()->data.pv) { rob_chara* rob_chr = playdata.rob_chr; if (rob_chr) motion_id = pv_game_get()->data.pv->get_chrmot_motion_id(rob_chr->chara_id, diff --git a/src/ReDIVA/render.cpp b/src/ReDIVA/render.cpp index cef77e84..48845d3b 100644 --- a/src/ReDIVA/render.cpp +++ b/src/ReDIVA/render.cpp @@ -49,6 +49,7 @@ #include "../KKdLib/str_utils.hpp" #include "data_test/auth_2d_test.hpp" #include "data_test/auth_3d_test.hpp" +#include "data_test/equip_test.hpp" #include "data_test/glitter_test.hpp" #include "data_test/motion_test.hpp" #include "data_test/selector.hpp" @@ -70,7 +71,7 @@ #include #include -#if defined(DEBUG) +#ifdef DEBUG #define RENDER_DEBUG 1 #endif @@ -593,6 +594,7 @@ static render_context* render_context_load() { dtm_aet_init(); dtm_stg_init(); motion_test_init(); + equip_test_init(); task_data_test_glitter_particle_init(); Glitter::glt_particle_manager->bone_data = aft_bone_data; @@ -1200,6 +1202,7 @@ static void render_context_dispose(render_context* rctx) { light_param_data_storage::unload(); task_data_test_glitter_particle_free(); + equip_test_free(); motion_test_free(); dtm_stg_free(); dtm_aet_free(); @@ -1392,7 +1395,8 @@ static void render_imgui_context_menu(classes_data* classes, #if RENDER_DEBUG static void APIENTRY render_debug_output(GLenum source, GLenum type, uint32_t id, GLenum severity, GLsizei length, const char* message, const void* userParam) { - if (id == 131169 || id == 131185 || id == 131218 || id == 131204) + if (!id && severity == GL_DEBUG_SEVERITY_NOTIFICATION + || id == 131169 || id == 131185 || id == 131218 || id == 131204) return; printf_debug("########################################\n"); diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index eef05ead..b01af928 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -33,7 +33,6 @@ #endif #include "imgui_helper.hpp" #include "input.hpp" -#include enum dsc_x_func { DSC_X_END = 0, @@ -4603,43 +4602,34 @@ bool x_pv_game::Ctrl() { case 18: { std::vector object_hrc; std::vector material_list; + + auto check_for_material_list_object_hrc = [&](auth_3d_id& id) { + if (!id.check_not_empty() || !id.check_loaded()) + return; + + auth_3d* auth = id.get_auth_3d(); + if (!auth || !auth->material_list.size() || !auth->object_hrc.size()) + return; + + for (auth_3d_material_list& i : auth->material_list) + if (i.flags & (AUTH_3D_MATERIAL_LIST_BLEND_COLOR | AUTH_3D_MATERIAL_LIST_EMISSION)) + material_list.push_back(i.name); + + for (auth_3d_object_hrc& i : auth->object_hrc) + object_hrc.push_back(i.object_info); + }; + for (int32_t i = 0; i < X_PV_GAME_STAGE_EFFECT_COUNT; i++) { x_pv_game_stage_effect& eff = stage_data.effect[i]; - for (x_pv_game_stage_effect_auth_3d& j : eff.auth_3d) { - if (!j.id.check_not_empty() || !j.id.check_loaded()) - continue; - - auth_3d* auth = j.id.get_auth_3d(); - if (!auth || !auth->material_list.size() || !auth->object_hrc.size()) - continue; - - for (auth_3d_material_list& k : auth->material_list) - if (k.flags & (AUTH_3D_MATERIAL_LIST_BLEND_COLOR | AUTH_3D_MATERIAL_LIST_EMISSION)) - material_list.push_back(k.name); - - for (auth_3d_object_hrc& k : auth->object_hrc) - object_hrc.push_back(k.object_info); - } + for (x_pv_game_stage_effect_auth_3d& j : eff.auth_3d) + check_for_material_list_object_hrc(j.id); } for (int32_t i = 0; i < X_PV_GAME_STAGE_EFFECT_COUNT; i++) for (int32_t j = 0; j < X_PV_GAME_STAGE_EFFECT_COUNT; j++) { x_pv_game_stage_change_effect& chg_eff = stage_data.change_effect[i][j]; - for (x_pv_game_stage_effect_auth_3d& k : chg_eff.auth_3d) { - if (!k.id.check_not_empty() || !k.id.check_loaded()) - continue; - - auth_3d* auth = k.id.get_auth_3d(); - if (!auth || !auth->material_list.size() || !auth->object_hrc.size()) - continue; - - for (auth_3d_material_list& l : auth->material_list) - if (l.flags & (AUTH_3D_MATERIAL_LIST_BLEND_COLOR | AUTH_3D_MATERIAL_LIST_EMISSION)) - material_list.push_back(l.name); - - for (auth_3d_object_hrc& l : auth->object_hrc) - object_hrc.push_back(l.object_info); - } + for (x_pv_game_stage_effect_auth_3d& k : chg_eff.auth_3d) + check_for_material_list_object_hrc(k.id); } prj::sort_unique(object_hrc); @@ -4650,43 +4640,34 @@ bool x_pv_game::Ctrl() { std::vector object; material_list.clear(); + + auto check_for_material_list_object = [&](auth_3d_id& id) { + if (!id.check_not_empty() || !id.check_loaded()) + return; + + auth_3d* auth = id.get_auth_3d(); + if (!auth || !auth->material_list.size() || !auth->object.size()) + return; + + for (auth_3d_material_list& i : auth->material_list) + if (i.flags & (AUTH_3D_MATERIAL_LIST_BLEND_COLOR | AUTH_3D_MATERIAL_LIST_EMISSION)) + material_list.push_back(i.name); + + for (auth_3d_object& i : auth->object) + object.push_back(i.object_info); + }; + for (int32_t i = 0; i < X_PV_GAME_STAGE_EFFECT_COUNT; i++) { x_pv_game_stage_effect& eff = stage_data.effect[i]; - for (x_pv_game_stage_effect_auth_3d& j : eff.auth_3d) { - if (!j.id.check_not_empty() || !j.id.check_loaded()) - continue; - - auth_3d* auth = j.id.get_auth_3d(); - if (!auth || !auth->material_list.size() || !auth->object.size()) - continue; - - for (auth_3d_material_list& k : auth->material_list) - if (k.flags & (AUTH_3D_MATERIAL_LIST_BLEND_COLOR | AUTH_3D_MATERIAL_LIST_EMISSION)) - material_list.push_back(k.name); - - for (auth_3d_object& k : auth->object) - object.push_back(k.object_info); - } + for (x_pv_game_stage_effect_auth_3d& j : eff.auth_3d) + check_for_material_list_object(j.id); } for (int32_t i = 0; i < X_PV_GAME_STAGE_EFFECT_COUNT; i++) for (int32_t j = 0; j < X_PV_GAME_STAGE_EFFECT_COUNT; j++) { x_pv_game_stage_change_effect& chg_eff = stage_data.change_effect[i][j]; - for (x_pv_game_stage_effect_auth_3d& k : chg_eff.auth_3d) { - if (!k.id.check_not_empty() || !k.id.check_loaded()) - continue; - - auth_3d* auth = k.id.get_auth_3d(); - if (!auth || !auth->material_list.size() || !auth->object.size()) - continue; - - for (auth_3d_material_list& l : auth->material_list) - if (l.flags & (AUTH_3D_MATERIAL_LIST_BLEND_COLOR | AUTH_3D_MATERIAL_LIST_EMISSION)) - material_list.push_back(l.name); - - for (auth_3d_object& l : auth->object) - object.push_back(l.object_info); - } + for (x_pv_game_stage_effect_auth_3d& k : chg_eff.auth_3d) + check_for_material_list_object(k.id); } prj::sort_unique(object); @@ -6123,7 +6104,7 @@ static vec4 bright_scale_get(int32_t index, float_t value) { } static float_t dsc_time_to_frame(int64_t time) { - return (float_t)time / 1000000000.0f * 60.0f; + return roundf((float_t)time / 1000000000.0f * 60.0f); } static void x_pv_game_chara_item_alpha_callback(void* data, int32_t chara_id, int32_t type, float_t alpha) { @@ -8392,6 +8373,30 @@ static void x_pv_game_split_auth_3d_hrc_material_list(x_pv_game* xpvgm, typedef std::pair material_list_color; +inline bool operator >(const material_list_color& left, const material_list_color& right) { + return memcmp(&left, &right, sizeof(material_list_color)) > 0; +} + +inline bool operator <(const material_list_color& left, const material_list_color& right) { + return memcmp(&left, &right, sizeof(material_list_color)) < 0; +} + +inline bool operator >=(const material_list_color& left, const material_list_color& right) { + return memcmp(&left, &right, sizeof(material_list_color)) >= 0; +} + +inline bool operator <=(const material_list_color& left, const material_list_color& right) { + return memcmp(&left, &right, sizeof(material_list_color)) <= 0; +} + +inline bool operator ==(const material_list_color& left, const material_list_color& right) { + return !memcmp(&left, &right, sizeof(material_list_color)); +} + +inline bool operator !=(const material_list_color& left, const material_list_color& right) { + return !!memcmp(&left, &right, sizeof(material_list_color)); +} + struct material_list_data { std::vector color; std::vector color_opt; @@ -8410,8 +8415,11 @@ struct material_list_data { bool cycle; float_t start_time; float_t end_time; + bool original_data; + bool has_data[8]; - inline material_list_data() : has_color(), type(), cycle(), start_time(), end_time() { + inline material_list_data() : has_color(), type(), cycle(), + start_time(), end_time(), original_data(), has_data() { } @@ -8422,55 +8430,31 @@ struct material_list_data { bool optimize(); }; +struct material_list_color_data { + std::vector data; + bool original_data; + bool has_data[8]; + + inline material_list_color_data() : original_data(), has_data() { + + } + + inline ~material_list_color_data() { + + } +}; + bool material_list_data::optimize() { color_opt.assign(color.begin(), color.end()); morph_opt.assign(morph.begin(), morph.end()); - if (type < A3DA_KEY_LINEAR) + if (type < A3DA_KEY_LINEAR || original_data) return true; - while (true) { - std::vector color(this->color_opt); - std::vector morph(this->morph_opt); - - // Remove duplicate color entries + // Find and optimize 0123456 to 01230123 + auto optimize_func_1 = [&](std::vector& color, std::vector& morph) { kft3* keys = morph.data(); size_t length = morph.size(); - if (color.size() > 1) { - auto i_begin = color.begin(); - auto i_end = color.end() - 1; - - for (auto i = i_begin; i != i_end;) - if (!memcmp(&i[0], &i[1], sizeof(material_list_color))) { - float_t value = (float_t)(int64_t)(i - i_begin + 1); - for (size_t k = i - i_begin + 1; k < length; k++) - if (keys[k].value >= value) - keys[k].value -= 1.0f; - i = color.erase(i); - i_begin = color.begin(); - i_end = color.end() - 1; - } - else - i++; - } - - // Remove duplicate at start - if (length > 1 && *(uint32_t*)&keys[0].frame != *(uint32_t*)&keys[1].frame - && *(uint32_t*)&keys[0].value == *(uint32_t*)&keys[1].value) { - morph.erase(morph.begin()); - keys = morph.data(); - length = morph.size(); - } - - // Remove duplicate at end - if (length > 1 && *(uint32_t*)&keys[length - 2].frame != *(uint32_t*)&keys[length - 1].frame - && *(uint32_t*)&keys[length - 2].value == *(uint32_t*)&keys[length - 1].value) { - morph.erase(morph.end() - 1); - keys = morph.data(); - length = morph.size(); - } - - // Find and optimize 0123456 to 01230123 if (color.size() > 2) for (size_t i = 0; i < length - 2; i++) for (size_t j = i + 2; j < length; j++) { @@ -8513,8 +8497,12 @@ bool material_list_data::optimize() { color.erase(elem, elem + count); break; } + }; - // Find and optimize 01234 to 01210 + // Find and optimize 01234 to 01210 + auto optimize_func_2_asc = [&](std::vector& color, std::vector& morph) { + kft3* keys = morph.data(); + size_t length = morph.size(); for (size_t i = 0; i < length - 1; i++) for (size_t j = i + 1; j < length; j++) { size_t count = j - i; @@ -8555,8 +8543,58 @@ bool material_list_data::optimize() { i += count * 2; break; } + }; + + // Find and optimize 01234 to 01210 + auto optimize_func_2_desc = [&](std::vector& color, std::vector& morph) { + kft3* keys = morph.data(); + size_t length = morph.size(); + for (size_t i = 0; i < length - 1; i++) + for (size_t j = i + 1; j < length; j++) { + size_t count = j - i; + if (j + count > length || i + count * 2 >= length) + break; - // Find and optimize 012345 to 012210 + material_list_color* color_data = color.data(); + bool equal = true; + for (size_t k = 0, l = count * 2; k < count; k++, l--) + if (memcmp(&color_data[(int32_t)keys[i + k].value], + &color_data[(int32_t)keys[i + l].value], + sizeof(material_list_color))) { + equal = false; + break; + } + + if (!equal) + continue; + + float_t start_value = keys[i].value; + float_t end_value = keys[i + count * 2].value; + + if (*(uint32_t*)&start_value == *(uint32_t*)&end_value) + break; + else if (i + count * 2 + 1 < length + && *(uint32_t*)&keys[i + count * 2].frame != *(uint32_t*)&keys[i + count * 2 + 1].frame) + break; + + for (size_t k = count, l = count - 1; k < count * 2; k++, l--) { + if (keys[i + k].value > keys[i + k + 1].value && keys[i + l + 1].value < keys[i + l].value + || keys[i + k].value < keys[i + k + 1].value && keys[i + l + 1].value > keys[i + l].value) { + keys[i + k + 0].tangent1 = -keys[i + k + 0].tangent1; + keys[i + k + 1].tangent2 = -keys[i + k + 1].tangent2; + } + keys[i + k + 1].value = keys[i + l].value; + } + + i += count * 2; + break; + } + }; + + // Find and optimize 012345 to 012210 + auto optimize_func_3_asc = [&](std::vector& color, std::vector& morph) { + kft3* keys = morph.data(); + size_t length = morph.size(); for (size_t i = 0; i < length - 1; i++) for (size_t j = i + 1; j < length; j++) { size_t count = j - i; @@ -8597,21 +8635,138 @@ bool material_list_data::optimize() { i += count * 2; break; } + }; + + // Find and optimize 012345 to 012210 + auto optimize_func_3_desc = [&](std::vector& color, std::vector& morph) { + kft3* keys = morph.data(); + size_t length = morph.size(); + for (size_t i = 0; i < length - 1; i++) + for (size_t j = i + 1; j < length; j++) { + size_t count = j - i; + if (j + count > length || i + count * 2 + 1 >= length) + break; - int32_t max_value = 0; - for (kft3& i : morph) - max_value = max_def(max_value, (int32_t)i.value); - max_value++; + material_list_color* color_data = color.data(); + bool equal = true; + for (size_t k = 0, l = count * 2 + 1; k <= count; k++, l--) + if (memcmp(&color_data[(int64_t)keys[i + k].value], + &color_data[(int64_t)keys[i + l].value], + sizeof(material_list_color))) { + equal = false; + break; + } - if (max_value < color.size()) - color.resize(max_value); + if (!equal) + continue; - if (color.size() < this->color_opt.size() || morph.size() < this->morph_opt.size()) { - this->color_opt.assign(color.begin(), color.end()); - this->morph_opt.assign(morph.begin(), morph.end()); - continue; + float_t start_value = keys[i].value; + float_t end_value = keys[i + count * 2 + 1].value; + + if (*(uint32_t*)&start_value == *(uint32_t*)&end_value) + break; + else if (i + count * 2 + 2 < length + && *(uint32_t*)&keys[i + count * 2 + 1].frame != *(uint32_t*)&keys[i + count * 2 + 2].frame) + break; + + for (size_t k = count, l = count - 1; k < count * 2; k++, l--) { + if (keys[i + k + 1].value > keys[i + k + 2].value && keys[i + l + 1].value < keys[i + l].value + || keys[i + k + 1].value < keys[i + k + 2].value && keys[i + l + 1].value > keys[i + l].value) { + keys[i + k + 1].tangent1 = -keys[i + k + 1].tangent1; + keys[i + k + 2].tangent2 = -keys[i + k + 2].tangent2; + } + keys[i + k + 2].value = keys[i + l].value; + } + + i += count * 2; + break; + } + }; + + if (color_opt.size() > 1) { + // Remove duplicate color entries + kft3* keys = morph_opt.data(); + size_t length = morph_opt.size(); + { + auto i_begin = color_opt.begin(); + auto i_end = color_opt.end() - 1; + + for (auto i = i_begin; i != i_end;) + if (!memcmp(&i[0], &i[1], sizeof(material_list_color))) { + float_t value = (float_t)(int64_t)(i - i_begin + 1); + for (size_t k = i - i_begin + 1; k < length; k++) + if (keys[k].value >= value) + keys[k].value -= 1.0f; + i = color_opt.erase(i); + i_begin = color_opt.begin(); + i_end = color_opt.end() - 1; + } + else + i++; + } + + // Remove duplicate at start + if (length > 1 && *(uint32_t*)&keys[0].frame != *(uint32_t*)&keys[1].frame + && *(uint32_t*)&keys[0].value == *(uint32_t*)&keys[1].value) + morph_opt.erase(morph_opt.begin()); + + // Remove duplicate at end + if (length > 1 && *(uint32_t*)&keys[length - 2].frame != *(uint32_t*)&keys[length - 1].frame + && *(uint32_t*)&keys[length - 2].value == *(uint32_t*)&keys[length - 1].value) + morph_opt.erase(morph_opt.end() - 1); + + while (true) { + std::vector color(color_opt); + std::vector morph(morph_opt); + + optimize_func_1(color, morph); + optimize_func_2_asc(color, morph); + optimize_func_3_asc(color, morph); + + int32_t max_value = 0; + for (kft3& i : morph) + max_value = max_def(max_value, (int32_t)i.value); + max_value++; + + if (max_value < color.size()) + color.resize(max_value); + + if (color.size() > 2) { + std::reverse(morph.begin(), morph.end()); + + optimize_func_2_desc(color, morph); + optimize_func_3_desc(color, morph); + + int32_t min_value = INT32_MAX; + for (kft3& i : morph) + min_value = min_def(min_value, (int32_t)i.value); + + int32_t max_value = 0; + for (kft3& i : morph) + max_value = max_def(max_value, (int32_t)i.value); + max_value++; + + if (min_value && min_value != INT32_MAX) { + color.erase(color.begin(), color.begin() + min_value); + max_value -= min_value; + + for (kft3& i : morph) + i.value -= (float_t)min_value; + } + + if (max_value < color.size()) + color.resize(max_value); + + std::reverse(morph.begin(), morph.end()); + } + + if (color.size() < color_opt.size() || morph.size() < morph_opt.size()) { + color_opt.assign(color.begin(), color.end()); + morph_opt.assign(morph.begin(), morph.end()); + continue; + } + break; } - break; } /*if (color_opt.size() > 2) { @@ -8839,11 +8994,37 @@ static void x_pv_game_split_auth_3d_material_list(auth_3d_material_list& ml, float_t start_time = FLT_MAX; float_t end_time = FLT_MIN; auth_3d_ep_type ep_type_post = AUTH_3D_EP_NONE; + auth_3d_key_type type = AUTH_3D_KEY_NONE; + uint64_t hash0 = hash_fnv1a64m_empty; + uint32_t hash1 = hash_murmurhash_empty; + bool same_data = true; + int32_t first_same_data_index = -1; + int32_t count_same_data = 0; + + auto check_ep_cycle = [&](auth_3d_key& k, int32_t index) { + type = max_def(k.type, type); - std::function check_ep_cycle = [&](auth_3d_key& k, int32_t index) { if (!has_data[index]) return; + if (same_data) { + uint64_t _hash0 = hash_fnv1a64m(k.keys_vec.data(), sizeof(kft3) * k.keys_vec.size()); + uint32_t _hash1 = hash_murmurhash(k.keys_vec.data(), sizeof(kft3) * k.keys_vec.size(), 0, true); + if (hash0 == hash_fnv1a64m_empty) { + hash0 = _hash0; + hash1 = _hash1; + first_same_data_index = index; + count_same_data = 1; + } + else if (hash0 != _hash0 || hash1 != _hash1) { + same_data = false; + first_same_data_index = -1; + count_same_data = 0; + } + else + count_same_data++; + } + if ((!ep_type_post || ep_type_post == AUTH_3D_EP_CYCLE) && k.ep_type_post == AUTH_3D_EP_CYCLE && (start_time == FLT_MAX || start_time == k.keys_vec.front().frame) && (end_time == FLT_MIN || end_time == k.keys_vec.back().frame + 1.0f)) { @@ -8861,6 +9042,7 @@ static void x_pv_game_split_auth_3d_material_list(auth_3d_material_list& ml, ep_type_post = AUTH_3D_EP_NONE; start_time = 0.0f; end_time = max_def(end_time, k.max_frame); + end_time = max_def(end_time, k.keys_vec.back().frame + 1.0f); } }; @@ -8878,10 +9060,88 @@ static void x_pv_game_split_auth_3d_material_list(auth_3d_material_list& ml, end_time = play_control_size; } + if (type >= AUTH_3D_KEY_LINEAR && first_same_data_index != -1) { + std::vector* vec_data = 0; + switch (first_same_data_index) { + case 0: + vec_data = &ml.blend_color.r.keys_vec; + break; + case 1: + vec_data = &ml.blend_color.g.keys_vec; + break; + case 2: + vec_data = &ml.blend_color.b.keys_vec; + break; + case 3: + vec_data = &ml.blend_color.a.keys_vec; + break; + case 4: + vec_data = &ml.emission.r.keys_vec; + break; + case 5: + vec_data = &ml.emission.g.keys_vec; + break; + case 6: + vec_data = &ml.emission.b.keys_vec; + break; + case 7: + vec_data = &ml.emission.a.keys_vec; + break; + } + + float_t min_value = FLT_MAX; + float_t max_value = -FLT_MAX; + + for (kft3& i : *vec_data) { + min_value = min_def(min_value, i.value); + max_value = max_def(max_value, i.value); + } + + float_t scale = 1.0f / (max_value - min_value); + + ml.blend_color.interpolate(0.0f); + ml.emission.interpolate(0.0f); + + + data.morph.reserve(vec_data->size()); + int32_t index = 0; + for (kft3& i : *vec_data) { + material_list_color color; + color.first = ml.blend_color.value; + color.second = ml.emission.value; + for (int32_t j = 0; j < 8; j++) + if (has_data[j]) + ((float_t*)&color)[j] = i.value; + + data.morph.push_back({ i.frame, (float_t)index, i.tangent1, i.tangent2 }); + data.color.push_back(color); + } + + data.type = type; + data.original_data = true; + memcpy(data.has_data, has_data, sizeof(has_data)); + return; + } + else if (type >= AUTH_3D_KEY_NONE && type <= AUTH_3D_KEY_STATIC) { + ml.blend_color.interpolate(0.0f); + ml.emission.interpolate(0.0f); + + material_list_color color; + color.first = ml.blend_color.value; + color.second = ml.emission.value; + + data.morph.push_back({ 0, (float_t)(int64_t)data.color.size() }); + data.color.push_back(color); + data.type = type; + data.original_data = true; + memcpy(data.has_data, has_data, sizeof(has_data)); + return; + } + #pragma warning(suppress: 26451) size_t count = (size_t)(int64_t)(end_time - start_time); - std::function get_max_count = [&](auth_3d_key& k, int32_t index) { + auto get_max_count = [&](auth_3d_key& k, int32_t index) { if (ep_type_post || !has_data[index] || k.ep_type_post != AUTH_3D_EP_CYCLE) return; @@ -8923,10 +9183,12 @@ static void x_pv_game_split_auth_3d_material_list(auth_3d_material_list& ml, if (values_src[0].first != 0.0f || values_src[0].second != 0.0f) { data.morph.push_back({ 0, (float_t)(int64_t)data.color.size() }); data.color.push_back(values_src[0]); - data.type = 1; + data.type = AUTH_3D_KEY_STATIC; } else - data.type = 0; + data.type = AUTH_3D_KEY_NONE; + data.original_data = true; + memcpy(data.has_data, has_data, sizeof(has_data)); return; } } @@ -8995,69 +9257,91 @@ static void x_pv_game_split_auth_3d_material_list(auth_3d_material_list& ml, t1 = 0.0f; t2 = 0.0f; - float_t start[8]; - float_t end[8]; - float_t _t1[8]; - float_t _t2[8]; - *(material_list_color*)start = v[0]; - *(material_list_color*)end = v[i]; - for (size_t o = 0; o < 8; o++) { - if (!has_data[o] || constant[o]) - continue; + if (type == AUTH_3D_KEY_HERMITE) { + float_t start[8]; + float_t end[8]; + float_t _t1[8]; + float_t _t2[8]; + *(material_list_color*)start = v[0]; + *(material_list_color*)end = v[i]; + for (size_t o = 0; o < 8; o++) { + if (!has_data[o] || constant[o]) + continue; - float_t scale = fabsf(end[o] - start[o]) > 0.0f ? 1.0f / (end[o] - start[o]) : 0.0f; - float_t offset = -start[o]; + float_t scale = fabsf(end[o] - start[o]) > 0.0f ? 1.0f / (end[o] - start[o]) : 0.0f; + float_t offset = -start[o]; - for (size_t j = 0; j <= i; j++) - a[j] = (((float_t*)&v[j])[o] - offset) * scale; + for (size_t j = 0; j <= i; j++) + a[j] = (((float_t*)&v[j])[o] - offset) * scale; - if (!fast) { - double_t t1_accum = 0.0; - double_t t2_accum = 0.0; - for (size_t j = 1; j < i - 1; j++) { - float_t t1 = 0.0f; - float_t t2 = 0.0f; - interpolate_chs_reverse_value(a, left_count, t1, t2, 0, i, j); - t1_accum += t1; - t2_accum += t2; + if (!fast) { + double_t t1_accum = 0.0; + double_t t2_accum = 0.0; + for (size_t j = 1; j < i - 1; j++) { + float_t t1 = 0.0f; + float_t t2 = 0.0f; + interpolate_chs_reverse_value(a, left_count, t1, t2, 0, i, j); + t1_accum += t1; + t2_accum += t2; + } + _t1[o] = (float_t)(t1_accum / (double_t)(i - 2)); + _t2[o] = (float_t)(t2_accum / (double_t)(i - 2)); } - _t1[o] = (float_t)(t1_accum / (double_t)(i - 2)); - _t2[o] = (float_t)(t2_accum / (double_t)(i - 2)); + else + interpolate_chs_reverse_value(a, left_count, _t1[o], _t2[o], 0, i, 1); + + t1 += _t1[o]; + t2 += _t2[o]; } - else - interpolate_chs_reverse_value(a, left_count, _t1[o], _t2[o], 0, i, 1); - t1 += _t1[o]; - t2 += _t2[o]; - } + if (has_data_count) { + t1 /= (float_t)has_data_count; + t2 /= (float_t)has_data_count; + } - if (has_data_count) { - t1 /= (float_t)has_data_count; - t2 /= (float_t)has_data_count; - } + has_error = false; + for (size_t j = 1; j < i; j++) { + float_t val = interpolate_chs_value(0.0f, 1.0f, t1, t2, 0.0f, (float_t)i, (float_t)j); + vec4 v_first = vec4::abs(vec4::lerp(v[0].first, v[i].first, val) - v[j].first); + vec4 v_second = vec4::abs(vec4::lerp(v[0].second, v[i].second, val) - v[j].second); + if (val < 0.0f || val > 1.0f + || has_data[0] && v_first.x > reverse_bias + || has_data[1] && v_first.y > reverse_bias + || has_data[2] && v_first.z > reverse_bias + || has_data[3] && v_first.w > reverse_bias + || has_data[4] && v_second.x > reverse_bias + || has_data[5] && v_second.y > reverse_bias + || has_data[6] && v_second.z > reverse_bias + || has_data[7] && v_second.w > reverse_bias) { + has_error = true; + break; + } + } - has_error = false; - for (size_t j = 1; j < i; j++) { - float_t val = interpolate_chs_value(0.0f, 1.0f, t1, t2, 0.0f, (float_t)i, (float_t)j); - vec4 v_first = vec4::abs(vec4::lerp(v[0].first, v[i].first, val) - v[j].first); - vec4 v_second = vec4::abs(vec4::lerp(v[0].second, v[i].second, val) - v[j].second); - if (val < 0.0f || val > 1.0f - || has_data[0] && v_first.x > reverse_bias - || has_data[1] && v_first.y > reverse_bias - || has_data[2] && v_first.z > reverse_bias - || has_data[3] && v_first.w > reverse_bias - || has_data[4] && v_second.x > reverse_bias - || has_data[5] && v_second.y > reverse_bias - || has_data[6] && v_second.z > reverse_bias - || has_data[7] && v_second.w > reverse_bias) { + if (fabsf(t1) > 0.5f || fabsf(t2) > 0.5f) has_error = true; - break; + } + else { + has_error = false; + for (size_t j = 1; j < i; j++) { + float_t val = interpolate_linear_value(0.0f, 1.0f, 0.0f, (float_t)i, (float_t)j); + vec4 v_first = vec4::abs(vec4::lerp(v[0].first, v[i].first, val) - v[j].first); + vec4 v_second = vec4::abs(vec4::lerp(v[0].second, v[i].second, val) - v[j].second); + if (val < 0.0f || val > 1.0f + || has_data[0] && v_first.x > reverse_bias + || has_data[1] && v_first.y > reverse_bias + || has_data[2] && v_first.z > reverse_bias + || has_data[3] && v_first.w > reverse_bias + || has_data[4] && v_second.x > reverse_bias + || has_data[5] && v_second.y > reverse_bias + || has_data[6] && v_second.z > reverse_bias + || has_data[7] && v_second.w > reverse_bias) { + has_error = true; + break; + } } } - if (fabsf(t1) > 0.5f || fabsf(t2) > 0.5f) - has_error = true; - if (!has_error) { i_prev = i; t1_prev = t1; @@ -9135,34 +9419,35 @@ static void x_pv_game_split_auth_3d_material_list(auth_3d_material_list& ml, (float_t)(int64_t)data.color.size(), t2_old, 0.0f }); data.color.push_back(val[count - 1]); - int32_t type = 2; + if (type == AUTH_3D_KEY_HERMITE) { + type = AUTH_3D_KEY_LINEAR; + kft3* keys = data.morph.data(); + size_t length = data.morph.size(); + for (size_t i = 0; i < count; i++) { + float_t frame = start_time + (float_t)(int64_t)i; - kft3* keys = data.morph.data(); - size_t length = data.morph.size(); - for (size_t i = 0; i < count; i++) { - float_t frame = start_time + (float_t)(int64_t)i; + kft3* first_key = keys; + kft3* key = keys; + size_t _length = length; + size_t temp; + while (_length > 0) + if (frame < key[temp = _length / 2].frame) + _length = temp; + else { + key += temp + 1; + _length -= temp + 1; + } - kft3* first_key = keys; - kft3* key = keys; - size_t _length = length; - size_t temp; - while (_length > 0) - if (frame < key[temp = _length / 2].frame) - _length = temp; - else { - key += temp + 1; - _length -= temp + 1; - } - - if (key != first_key && key != &first_key[length]) { - float_t l_val = interpolate_linear_value(key[-1].value, key[0].value, - key[-1].frame, key[0].frame, frame); - float_t h_val = interpolate_chs_value(key[-1].value, key[0].value, - key[-1].tangent2, key[0].tangent1, - key[-1].frame, key[0].frame, frame); - if (fabsf(l_val - h_val) > reverse_bias) { - type = 3; - break; + if (key != first_key && key != &first_key[length]) { + float_t l_val = interpolate_linear_value(key[-1].value, key[0].value, + key[-1].frame, key[0].frame, frame); + float_t h_val = interpolate_chs_value(key[-1].value, key[0].value, + key[-1].tangent2, key[0].tangent1, + key[-1].frame, key[0].frame, frame); + if (fabsf(l_val - h_val) > reverse_bias) { + type = AUTH_3D_KEY_HERMITE; + break; + } } } } @@ -9171,6 +9456,7 @@ static void x_pv_game_split_auth_3d_material_list(auth_3d_material_list& ml, data.cycle = ep_type_post == AUTH_3D_EP_CYCLE; data.start_time = start_time; data.end_time = end_time; + memcpy(data.has_data, has_data, sizeof(has_data)); } static void x_pv_game_split_auth_3d_material_list(x_pv_game* xpvgm, @@ -9237,49 +9523,87 @@ static void x_pv_game_split_auth_3d_material_list(x_pv_game* xpvgm, printf_debug(""); - for (auto& i : stage_data_effect_auth_3ds) { - auth_3d* auth = i.first.get_auth_3d(); + prj::vector_pair material_colors; + auto convert_material_list = [&](auth_3d* auth, + prj::vector_pair& material_lists) { printf_debug("%s\n", auth->file_name.c_str()); - i.second.reserve(auth->material_list.size()); + material_lists.reserve(auth->material_list.size()); for (auth_3d_material_list& j : auth->material_list) { if (!(j.flags & (AUTH_3D_MATERIAL_LIST_BLEND_COLOR | AUTH_3D_MATERIAL_LIST_EMISSION))) continue; - i.second.push_back(j.hash, {}); - material_list_data& data = i.second.back().second; + material_lists.push_back(j.hash, {}); + material_list_data& data = material_lists.back().second; x_pv_game_split_auth_3d_material_list(j, auth->play_control.size, data); bool same = data.optimize(); - printf_debug(" %d %20s %3llu %3llu %3llu %3llu%s%s\n", data.type, - j.name.c_str(), data.color.size(), data.morph.size(), + printf_debug(" %c%c%c%c%c%c%c%c %d %32s %08X %3llu %3llu %3llu %3llu%s%s%s\n", + j.blend_color.flags & AUTH_3D_RGBA_R ? 'R' : ' ', + j.blend_color.flags & AUTH_3D_RGBA_G ? 'G' : ' ', + j.blend_color.flags & AUTH_3D_RGBA_B ? 'B' : ' ', + j.blend_color.flags & AUTH_3D_RGBA_A ? 'A' : ' ', + j.emission.flags & AUTH_3D_RGBA_R ? 'R' : ' ', + j.emission.flags & AUTH_3D_RGBA_G ? 'G' : ' ', + j.emission.flags & AUTH_3D_RGBA_B ? 'B' : ' ', + j.emission.flags & AUTH_3D_RGBA_A ? 'A' : ' ', + data.type, j.name.c_str(), j.hash, + data.color.size(), data.morph.size(), data.color_opt.size(), data.morph_opt.size(), - same ? "" : " Not same", data.cycle ? " Cycle" : ""); + data.cycle ? "; Cycle" : "", same ? "" : "; Not same", + data.original_data ? "; Orig Data" : ""); + + auto elem = material_colors.find(j.hash); + if (elem == material_colors.end()) { + material_colors.push_back({ j.hash, {} }); + material_colors.sort(); + elem = material_colors.find(j.hash); + elem->second.original_data = data.original_data; + memcpy(elem->second.has_data, data.has_data, sizeof(data.has_data)); + } + + if (elem->second.original_data && !data.original_data) + elem->second.original_data = false; + + elem->second.data.insert(elem->second.data.end(), data.color_opt.begin(), data.color_opt.end()); } + }; + + for (auto& i : stage_data_effect_auth_3ds) + convert_material_list(i.first.get_auth_3d(), i.second); + + for (auto& i : stage_data_change_effect_auth_3ds) + convert_material_list(i.first.get_auth_3d(), i.second); + + for (auto& i : material_colors) + prj::sort_unique(i.second.data); + + for (auto& i : material_colors) { + if (!i.second.original_data) + continue; + + material_list_color min_color = { FLT_MAX, FLT_MAX }; + material_list_color max_color = { -FLT_MAX, -FLT_MAX }; + for (material_list_color& j : i.second.data) { + min_color.first = vec4::min(j.first, min_color.first); + min_color.second = vec4::min(j.second, min_color.second); + max_color.first = vec4::max(j.first, max_color.first); + max_color.second = vec4::max(j.second, max_color.second); + } + + printf("%f %f %f %f %f %f %f %f\n", + min_color.first.x, min_color.first.y, min_color.first.z, min_color.first.w, + min_color.second.x, min_color.second.y, min_color.second.z, min_color.second.w); + printf("%f %f %f %f %f %f %f %f\n", + max_color.first.x, max_color.first.y, max_color.first.z, max_color.first.w, + max_color.second.x, max_color.second.y, max_color.second.z, max_color.second.w); } - for (auto& i : stage_data_change_effect_auth_3ds) { - auth_3d* auth = i.first.get_auth_3d(); + for (auto& i : material_colors) + printf("%d ", (int32_t)i.second.data.size()); - printf_debug("%s\n", auth->file_name.c_str()); - - i.second.reserve(auth->material_list.size()); - for (auth_3d_material_list& j : auth->material_list) { - if (!(j.flags & (AUTH_3D_MATERIAL_LIST_BLEND_COLOR | AUTH_3D_MATERIAL_LIST_EMISSION))) - continue; - - i.second.push_back(j.hash, {}); - material_list_data& data = i.second.back().second; - - x_pv_game_split_auth_3d_material_list(j, auth->play_control.size, data); - bool same = data.optimize(); - printf_debug(" %d %20s %3llu %3llu %3llu %3llu%s%s\n", data.type, - j.name.c_str(), data.color.size(), data.morph.size(), - data.color_opt.size(), data.morph_opt.size(), - same ? "" : " Not same", data.cycle ? " Cycle" : ""); - } - } + printf("%d\n", (int32_t)material_colors.size()); } static void pv_game_dsc_data_find_playdata_item_anim(x_pv_game* xpvgm, int32_t chara_id) {