diff --git a/src/DivaGL/DivaGL.vcxproj b/src/DivaGL/DivaGL.vcxproj
index e5bfcc3..91551fa 100644
--- a/src/DivaGL/DivaGL.vcxproj
+++ b/src/DivaGL/DivaGL.vcxproj
@@ -253,6 +253,7 @@ del "$(SolutionDir)bin\$(TargetName).lib"
+
@@ -301,6 +302,7 @@ del "$(SolutionDir)bin\$(TargetName).lib"
+
diff --git a/src/DivaGL/auth_2d.cpp b/src/DivaGL/auth_2d.cpp
new file mode 100644
index 0000000..fe3ca50
--- /dev/null
+++ b/src/DivaGL/auth_2d.cpp
@@ -0,0 +1,310 @@
+/*
+ by korenkonder
+ GitHub/GitLab: korenkonder
+*/
+
+#include "auth_2d.hpp"
+#include "file_handler.hpp"
+#include "task.hpp"
+
+struct aet_comp;
+struct aet_marker;
+struct aet_scene;
+
+typedef uint16_t aet_layer_flag;
+typedef uint8_t aet_layer_quality;
+
+union aet_item {
+ void* none;
+ uint32_t offset;
+ struct aet_video* video;
+ struct aet_audio* audio;
+ aet_comp* comp;
+};
+enum aet_item_type : uint8_t {
+ AET_ITEM_TYPE_NONE = 0x00,
+ AET_ITEM_TYPE_VIDEO = 0x01,
+ AET_ITEM_TYPE_AUDIO = 0x02,
+ AET_ITEM_TYPE_COMPOSITION = 0x03,
+};
+
+struct aet_layer {
+ const char* name;
+ float_t start_time;
+ float_t end_time;
+ float_t offset_time;
+ float_t time_scale;
+ aet_layer_flag flags;
+ aet_layer_quality quality;
+ aet_item_type item_type;
+ aet_item item;
+ aet_layer* parent;
+ uint32_t markers_count;
+ aet_marker* markers;
+ struct aet_layer_video* video;
+ struct aet_layer_audio* audio;
+};
+
+struct AetSet;
+
+struct AetSet_vtbl {
+ AetSet* (__fastcall* Dispose)(AetSet* _this, uint8_t flags);
+ void(__fastcall* ReadFile)(AetSet* _this, const char* file_path);
+ bool(__fastcall* LoadFile)(AetSet* _this);
+ void(__fastcall* Unload)(AetSet* _this);
+ bool(__fastcall* Load)(AetSet* _this);
+};
+
+struct AetSet {
+ AetSet_vtbl* __vftable;
+ int32_t index;
+ aet_scene** scenes;
+ uint32_t scenes_count;
+ int32_t load_count;
+ p_file_handler file_handler;
+ bool ready;
+ prj::shared_ptr alloc_handler; // prj::stack_allocator
+};
+
+struct AetObj;
+
+struct AetObj_vtbl {
+ AetObj*(FASTCALL * Dispose)(AetObj* _this, uint8_t flags);
+ void(FASTCALL* Init)(AetObj* _this, AetArgs* init_data, aet_scene* scene, aet_comp* comp,
+ aet_layer* layer, aet_marker* start_marker, aet_marker* end_marker, resolution_mode mode);
+ void(FASTCALL* Ctrl)(AetObj* _this);
+ void(FASTCALL* Disp)(AetObj* _this);
+ bool(FASTCALL* StepFrame)(AetObj* _this);
+ void(FASTCALL* SetPlay)(AetObj* _this, bool value);
+ void(FASTCALL* SetVisible)(AetObj* _this, bool value);
+ void(FASTCALL* SetPosition)(AetObj* _this, vec3* value);
+ void(FASTCALL* SetScale)(AetObj* _this, vec3* value);
+ void(FASTCALL* SetRotation)(AetObj* _this, vec3* value);
+ void(FASTCALL* SetAlpha)(AetObj* _this, float_t value);
+ void(FASTCALL* SetSpriteReplace)(AetObj* _this, prj::map& value);
+ void(FASTCALL* SetSpriteTexture)(AetObj* _this, prj::map& value);
+ void(FASTCALL* SetSpriteDiscard)(AetObj* _this, prj::map& value);
+ void(FASTCALL* SetColor)(AetObj* _this, vec4* value);
+ void(FASTCALL* SetEndTime)(AetObj* _this, float_t value);
+ void(FASTCALL* SetFrame)(AetObj* _this, float_t value);
+ void(FASTCALL* SetPrio)(AetObj* _this, spr::SprPrio value);
+ aet_info(FASTCALL* GetInfo)(AetObj* _this);
+ bool(FASTCALL* GetPlay)(AetObj* _this);
+ bool(FASTCALL* GetVisible)(AetObj* _this);
+ float_t(FASTCALL* GetFrame)(AetObj* _this);
+ bool(FASTCALL* GetEnd)(AetObj* _this);
+ void(FASTCALL* CtrlComp)(AetObj* _this, aet_comp* comp, float_t frame);
+ void(FASTCALL* DispComp)(AetObj* _this, mat4* mat, aet_comp* comp, float_t frame, float_t opacity);
+ void(FASTCALL* CtrlLayer)(AetObj* _this, aet_layer* layer, float_t frame);
+ void(FASTCALL* DispLayer)(AetObj* _this, mat4* mat, aet_layer* layer, float_t frame, float_t opacity);
+ void(FASTCALL* DispVideo)(AetObj* _this, mat4* mat, aet_layer* layer, float_t frame, float_t opacity);
+ void(FASTCALL* DispSprite)(AetObj* _this, mat4* mat, aet_layer* layer, float_t opacity);
+ void(FASTCALL* DispSpriteSource)(AetObj* _this, mat4* mat,
+ aet_layer* layer, uint32_t source_index, float_t opacity);
+ void(FASTCALL* CalcMat)(AetObj* _this, mat4* mat, aet_layer* layer, float_t frame);
+};
+
+struct AetObj {
+ AetObj_vtbl* __vftable;
+ aet_info info;
+ aet_scene* scene;
+ aet_comp* comp;
+ aet_layer* layer;
+ float_t start_time;
+ float_t end_time;
+ AetFlags flags;
+ int32_t index;
+ int32_t layer_index;
+ spr::SprPrio prio;
+ resolution_mode src_mode;
+ vec3 pos;
+ vec3 rot;
+ vec3 scale;
+ vec3 anchor;
+ float_t frame_speed;
+ vec4 color;
+ float_t frame;
+ resolution_mode dst_mode;
+ vec2 scale_size;
+ bool matte;
+ spr::SprArgs spr_args;
+ float_t opacity;
+ prj::map layer_sprite;
+ prj::string sound_path;
+ prj::map sound_replace;
+ int32_t sound_queue_index;
+ prj::map sprite_replace;
+ prj::map sprite_texture;
+ prj::map sprite_discard;
+ FrameRateControl* frame_rate_control;
+ bool sound_voice;
+ bool use_float;
+
+ void SetFrameRateControl(FrameRateControl* value);
+};
+
+class AetMgr : public app::Task {
+public:
+ prj::map sets;
+ prj::map objects;
+ prj::list::iterator> free_objects;
+ uint32_t load_counter;
+
+ AetObj* get_obj(uint32_t id);
+ void set_obj_frame_rate_control(uint32_t id, FrameRateControl* value);
+};
+
+void (FASTCALL* aet_manager_unload_set)(int32_t set_id)
+ = (void (FASTCALL*)(int32_t set_id))0x000000014019CDD0;
+bool (FASTCALL* aet_manager_get_obj_end)(uint32_t id)
+ = (bool (FASTCALL*)(uint32_t id))0x000000014019CE60;
+void (FASTCALL* aet_manager_init_aet_layout)(AetComp* comp, AetArgs* args)
+ = (void (FASTCALL*)(AetComp* comp, AetArgs * args))0x000000014019CEB0;
+float_t(FASTCALL* aet_manager_get_obj_frame)(uint32_t id) = (float_t(FASTCALL*)(uint32_t id))0x000000014019CE70;
+void (FASTCALL* aet_manager_init_aet_layout_0)(AetComp* comp, int32_t aet_id, const char* layer_name,
+ AetFlags flags, resolution_mode mode, const char* start_marker, float_t start_time)
+ = (void (FASTCALL * )(AetComp * comp, int32_t aet_id, const char* layer_name,
+ AetFlags flags, resolution_mode mode, const char* start_marker, float_t start_time))0x000000014019CF40;
+uint32_t(FASTCALL* aet_manager_init_aet_object)(AetArgs& args)
+ = (uint32_t(FASTCALL*)(AetArgs & args))0x000000014019D3F0;
+void (FASTCALL* aet_manager_free_aet_object)(uint32_t id)
+ = (void (FASTCALL*)(uint32_t id))0x000000014019D570;
+void (FASTCALL* aet_manager_read_file)(int32_t set_id, const prj::string mdata_dir)
+ = (void (FASTCALL*)(int32_t set_id, const prj::string mdata_dir))0x000000014019D650;
+void (FASTCALL* aet_manager_set_obj_visible)(uint32_t id, bool value)
+ = (void (FASTCALL*)(uint32_t id, bool value))0x000000014019D750;
+void (FASTCALL* aet_manager_set_obj_frame)(uint32_t id, float_t value)
+ = (void (FASTCALL*)(uint32_t id, float_t value))0x000000014019D790;
+void (FASTCALL* aet_manager_set_obj_alpha)(uint32_t id, float_t value)
+ = (void (FASTCALL*)(uint32_t id, float_t value))0x000000014019D7B0;
+bool (FASTCALL* aet_manager_load_file)(int32_t set_id)
+ = (bool (FASTCALL*)(int32_t set_id))0x000000014019D970;
+
+AetMgr& aet_manager = *(AetMgr*)0x0000000140EC5390;
+
+AetArgs::AetArgs() : layer_name(), start_marker(), end_marker(),
+flags(), index(), layer(), frame_rate_control(), sound_voice() {
+ start_time = -1.0f;
+ end_time = -1.0f;
+ prio = spr::SPR_PRIO_DEFAULT;
+ mode = RESOLUTION_MODE_HD;
+ scale = 1.0f;
+ frame_speed = 1.0f;
+ color = 1.0f;
+ sound_queue_index = 1;
+}
+
+AetArgs::~AetArgs() {
+
+}
+
+aet_layout_data::aet_layout_data() : width(), height() {
+ mat = mat4_identity;
+ opacity = 1.0f;
+ color = 0xFFFFFFFF;
+ mode = RESOLUTION_MODE_HD;
+}
+
+void aet_layout_data::put_sprite(int32_t spr_id, spr::SprAttr attr,
+ spr::SprPrio prio, const vec2* pos, const aet_layout_data* layout) {
+ if (!layout)
+ return;
+
+ spr::SprArgs args;
+ aet_layout_data::set_args(layout, &args);
+ args.id.id = spr_id;
+ args.attr = attr;
+ args.prio = prio;
+ if (pos)
+ *(vec2*)&args.trans.x += *pos;
+ spr::put_sprite(&args);
+}
+
+void aet_layout_data::set_args(const aet_layout_data* layout, spr::SprArgs* args) {
+ if (!layout || !args)
+ return;
+
+ args->trans = layout->position;
+ args->center = layout->anchor;
+ args->scale.x = layout->mat.row0.x;
+ args->scale.y = layout->mat.row1.y;
+ args->scale.z = layout->mat.row2.z;
+}
+
+AetComp::AetComp() {
+
+}
+
+AetComp::~AetComp() {
+
+}
+
+void AetComp::Add(const char* name, const aet_layout_data& data) {
+ this->data.insert({ name, data });
+}
+
+void AetComp::Clear() {
+ data.clear();
+}
+
+const aet_layout_data* AetComp::Find(const char* name) {
+ auto elem = data.find(name);
+ if (elem != data.end())
+ return &elem->second;
+ return 0;
+}
+
+void AetComp::put_number_sprite(int32_t value, int32_t max_digits,
+ AetComp* comp, const char** names, const int32_t* spr_ids,
+ spr::SprPrio prio, const vec2* pos, bool all_digits) {
+ if (!comp || !names || !spr_ids)
+ return;
+
+ for (int32_t i = 0; i < max_digits; i++) {
+ int32_t digit = value % 10;
+ value /= 10;
+
+ const aet_layout_data* layout = comp->Find(names[i]);
+ if (layout)
+ aet_layout_data::put_sprite(spr_ids[digit],
+ spr::SPR_ATTR_CTR_CC, prio, pos, layout);
+
+ if (!all_digits && !value)
+ break;
+ }
+}
+
+int32_t aet_database_get_aet_id_by_name(const prj::string& name) {
+ int32_t(FASTCALL * aet_database_struct__get_aet_id_by_name)
+ (size_t _this, const prj::string & name)
+ = (int32_t(FASTCALL*)(size_t _this, const prj::string & name))0x0000000140112180;
+ return aet_database_struct__get_aet_id_by_name(0x0000000140EC5430, name);
+}
+
+int32_t aet_database_get_aet_set_id_by_name(const prj::string& name) {
+ int32_t(FASTCALL * aet_database_struct__get_aet_set_id_by_name)
+ (size_t _this, const prj::string & name)
+ = (int32_t(FASTCALL*)(size_t _this, const prj::string & name))0x0000000140112190;
+ return aet_database_struct__get_aet_set_id_by_name(0x0000000140EC5430, name);
+}
+
+void aet_manager_set_obj_frame_rate_control(uint32_t id, FrameRateControl* value) {
+ aet_manager.set_obj_frame_rate_control(id, value);
+}
+
+void AetObj::SetFrameRateControl(FrameRateControl* value) {
+ frame_rate_control = value;
+}
+
+AetObj* AetMgr::get_obj(uint32_t id) {
+ auto elem = objects.find(id);
+ if (elem != objects.end())
+ return &elem->second;
+ return 0;
+}
+
+void AetMgr::set_obj_frame_rate_control(uint32_t id, FrameRateControl* value) {
+ AetObj* obj = get_obj(id);
+ if (obj)
+ obj->SetFrameRateControl(value);
+}
diff --git a/src/DivaGL/auth_2d.hpp b/src/DivaGL/auth_2d.hpp
new file mode 100644
index 0000000..c3ec6f6
--- /dev/null
+++ b/src/DivaGL/auth_2d.hpp
@@ -0,0 +1,172 @@
+/*
+ by korenkonder
+ GitHub/GitLab: korenkonder
+*/
+
+#pragma once
+
+#include "../KKdLib/vec.hpp"
+#include "frame_rate_control.hpp"
+#include "sprite.hpp"
+#include "texture.hpp"
+#include "types.hpp"
+
+enum AetFlags {
+ AET_END = 0x000001,
+ AET_REVERSE = 0x000002,
+ AET_PAUSE = 0x000004,
+ AET_HIDDEN = 0x000008,
+ AET_LOOP = 0x010000,
+ AET_PLAY_ONCE = 0x020000,
+ AET_FLIP_H = 0x040000,
+ AET_FLIP_V = 0x080000,
+ AET_100000 = 0x100000,
+};
+
+struct aet_info {
+ uint16_t index;
+ uint16_t set_index;
+
+ inline aet_info() {
+ this->index = (uint16_t)-1;
+ this->set_index = (uint16_t)-1;
+ }
+
+ inline aet_info(uint16_t index, uint16_t set_index) {
+ this->index = index;
+ this->set_index = set_index;
+ }
+
+ inline bool is_null() const {
+ return index == (uint16_t)-1 && set_index == (uint16_t)-1;
+ }
+
+ inline bool not_null() const {
+ return index != (uint16_t)-1 || set_index != (uint16_t)-1;
+ }
+};
+
+static_assert(sizeof(aet_info) == 0x04, "\"aet_info\" struct should have a size of 0x04");
+
+inline bool operator >(const aet_info& left, const aet_info& right) {
+ return *(uint32_t*)&left > *(uint32_t*)&right;
+}
+
+inline bool operator <(const aet_info& left, const aet_info& right) {
+ return *(uint32_t*)&left < *(uint32_t*)&right;
+}
+
+inline bool operator >=(const aet_info& left, const aet_info& right) {
+ return *(uint32_t*)&left >= *(uint32_t*)&right;
+}
+
+inline bool operator <=(const aet_info& left, const aet_info& right) {
+ return *(uint32_t*)&left <= *(uint32_t*)&right;
+}
+
+inline bool operator ==(const aet_info& left, const aet_info& right) {
+ return *(uint32_t*)&left == *(uint32_t*)&right;
+}
+
+inline bool operator !=(const aet_info& left, const aet_info& right) {
+ return *(uint32_t*)&left != *(uint32_t*)&right;
+}
+
+struct AetArgs {
+ union IDUnion {
+ aet_info info;
+ int32_t id;
+
+ IDUnion() {
+ id = -1;
+ info = {};
+ }
+ };
+
+ IDUnion id;
+ const char* layer_name;
+ const char* start_marker;
+ const char* end_marker;
+ float_t start_time;
+ float_t end_time;
+ AetFlags flags;
+ int32_t index;
+ int32_t layer;
+ spr::SprPrio prio;
+ resolution_mode mode;
+ vec3 pos;
+ vec3 rot;
+ vec3 scale;
+ vec3 anchor;
+ float_t frame_speed;
+ vec4 color;
+ prj::map layer_sprite;
+ prj::string sound_path;
+ prj::map sound_replace;
+ int32_t sound_queue_index;
+ prj::map sprite_replace;
+ prj::map sprite_texture;
+ prj::map sprite_discard;
+ FrameRateControl* frame_rate_control;
+ bool sound_voice;
+
+ AetArgs();
+ ~AetArgs();
+};
+
+static_assert(sizeof(AetArgs) == 0x108, "\"AetArgs\" struct should have a size of 0x108");
+
+struct aet_layout_data {
+ mat4 mat;
+ vec3 position;
+ vec3 anchor;
+ float_t width;
+ float_t height;
+ float_t opacity;
+ color4u8 color;
+ resolution_mode mode;
+
+ aet_layout_data();
+
+ static void put_sprite(int32_t spr_id, spr::SprAttr attr,
+ spr::SprPrio prio, const vec2* pos, const aet_layout_data* layout);
+ static void set_args(const aet_layout_data* layout, spr::SprArgs* args);
+};
+
+static_assert(sizeof(aet_layout_data) == 0x6C, "\"aet_layout_data\" struct should have a size of 0x6C");
+
+struct AetComp {
+ prj::map data;
+
+ AetComp();
+ ~AetComp();
+
+ void Add(const char* name, const aet_layout_data& data);
+ void Clear();
+ const aet_layout_data* Find(const char* name);
+
+ static void put_number_sprite(int32_t value, int32_t max_digits,
+ AetComp* comp, const char** names, const int32_t* spr_ids,
+ spr::SprPrio prio, const vec2* pos, bool all_digits);
+};
+
+static_assert(sizeof(AetComp) == 0x10, "\"AetComp\" struct should have a size of 0x10");
+
+extern void (FASTCALL* aet_manager_unload_set)(int32_t set_id);
+extern bool (FASTCALL* aet_manager_get_obj_end)(uint32_t id);
+extern void (FASTCALL* aet_manager_init_aet_layout)(AetComp* comp, AetArgs* args);
+extern float_t(FASTCALL* aet_manager_get_obj_frame)(uint32_t id);
+extern void (FASTCALL* aet_manager_init_aet_layout_0)(AetComp* comp, int32_t aet_id, const char* layer_name,
+ AetFlags flags, resolution_mode mode, const char* start_marker, float_t start_time);
+extern uint32_t(FASTCALL* aet_manager_init_aet_object)(AetArgs& args);
+extern void (FASTCALL* aet_manager_free_aet_object)(uint32_t id);
+extern void (FASTCALL* aet_manager_read_file)(int32_t set_id, const prj::string mdata_dir);
+extern void (FASTCALL* aet_manager_set_obj_visible)(uint32_t id, bool value);
+extern void (FASTCALL* aet_manager_set_obj_frame)(uint32_t id, float_t value);
+extern void (FASTCALL* aet_manager_set_obj_alpha)(uint32_t id, float_t value);
+extern bool (FASTCALL* aet_manager_load_file)(int32_t set_id);
+
+extern int32_t aet_database_get_aet_id_by_name(const prj::string& name);
+extern int32_t aet_database_get_aet_set_id_by_name(const prj::string& name);
+
+extern void aet_manager_set_obj_frame_rate_control(uint32_t id, FrameRateControl* value);
diff --git a/src/DivaGL/sprite.cpp b/src/DivaGL/sprite.cpp
index 9747a61..6cef9f5 100644
--- a/src/DivaGL/sprite.cpp
+++ b/src/DivaGL/sprite.cpp
@@ -109,8 +109,12 @@ namespace spr {
vec4& spr_color = *(vec4*)0x00000001411ACC30;
+void (FASTCALL* sprite_manager_unload_set)(int32_t set_id)
+ = (void (FASTCALL*)(int32_t set_id))0x000000014063F8D0;
size_t(FASTCALL* sprite_manager_get_reqlist_count)(int32_t index)
= (size_t(FASTCALL*)(int32_t index))0x000000014063FA90;
+void (FASTCALL* sprite_manager_read_file)(int32_t set_id, const prj::string mdata_dir)
+ = (void (FASTCALL*)(int32_t set_id, const prj::string mdata_dir))0x0000000140640E10;
bool (FASTCALL* sprite_manager_load_file)(int32_t set_id)
= (bool (FASTCALL*)(int32_t set_id))0x0000000140640FB0;
@@ -131,6 +135,8 @@ static const GLenum spr_blend_param[6][4] = {
namespace spr {
void(FASTCALL* put_rgb_cross)(mat4* mat) = (void(FASTCALL*)(mat4 * mat))0x00000001404BC8F0;
+ spr::SprArgs* (FASTCALL* put_sprite)(const spr::SprArgs* args)
+ = (spr::SprArgs * (FASTCALL*)(const spr::SprArgs * args))0x0000000140640740;
SpriteManager::RenderData::RenderData() {
glGenVertexArrays(1, &vao);
@@ -1187,6 +1193,13 @@ namespace spr {
}
}
+int32_t sprite_database_get_spr_set_id_by_name(const prj::string& name) {
+ int32_t(FASTCALL * sprite_database_struct__get_spr_set_id_by_name)
+ (size_t _this, const prj::string & name)
+ = (int32_t(FASTCALL*)(size_t _this, const prj::string & name))0x00000001401121A0;
+ return sprite_database_struct__get_spr_set_id_by_name(0x000000014CC62290, name);
+}
+
void sprite_manager_init() {
if (!sprite_manager_render_data)
sprite_manager_render_data = new spr::SpriteManager::RenderData;
diff --git a/src/DivaGL/sprite.hpp b/src/DivaGL/sprite.hpp
index 2b4518f..67646b8 100644
--- a/src/DivaGL/sprite.hpp
+++ b/src/DivaGL/sprite.hpp
@@ -207,13 +207,18 @@ namespace spr {
extern void(FASTCALL* put_rgb_cross)(mat4* mat);
+ extern spr::SprArgs* (FASTCALL* put_sprite)(const spr::SprArgs* args);
}
extern vec4& spr_color;
+extern void (FASTCALL* sprite_manager_unload_set)(int32_t set_id);
extern size_t(FASTCALL* sprite_manager_get_reqlist_count)(int32_t index);
+extern void (FASTCALL* sprite_manager_read_file)(int32_t set_id, const prj::string mdata_dir);
extern bool (FASTCALL* sprite_manager_load_file)(int32_t set_id);
+extern int32_t sprite_database_get_spr_set_id_by_name(const prj::string& name);
+
extern void sprite_manager_init();
extern void sprite_manager_draw(int32_t index, bool font, texture* tex);
extern void sprite_manager_set_res(double_t aspect, int32_t width, int32_t height);