Files
korenkonder_AFTMods/src/DivaGL/auth_2d.cpp
T
2024-03-19 15:59:19 +03:00

311 lines
10 KiB
C++

/*
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<void*> 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<uint32_t, uint32_t>& value);
void(FASTCALL* SetSpriteTexture)(AetObj* _this, prj::map<uint32_t, texture*>& value);
void(FASTCALL* SetSpriteDiscard)(AetObj* _this, prj::map<uint32_t, uint32_t>& 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<prj::string, int32_t> layer_sprite;
prj::string sound_path;
prj::map<prj::string, prj::string> sound_replace;
int32_t sound_queue_index;
prj::map<uint32_t, uint32_t> sprite_replace;
prj::map<uint32_t, texture*> sprite_texture;
prj::map<uint32_t, uint32_t> sprite_discard;
FrameRateControl* frame_rate_control;
bool sound_voice;
bool use_float;
void SetFrameRateControl(FrameRateControl* value);
};
class AetMgr : public app::Task {
public:
prj::map<int32_t, AetSet> sets;
prj::map<uint32_t, AetObj> objects;
prj::list<prj::map<uint32_t, AetObj>::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);
}