Temp commit

This commit is contained in:
korenkonder
2022-07-06 14:13:11 +03:00
parent 8a0f0d4aa3
commit 935d7ffeb6
126 changed files with 6163 additions and 4157 deletions
BIN
View File
Binary file not shown.
+3 -3
View File
@@ -10,8 +10,8 @@ extern "C" {
#endif
#define LIBDEFLATE_VERSION_MAJOR 1
#define LIBDEFLATE_VERSION_MINOR 10
#define LIBDEFLATE_VERSION_STRING "1.10"
#define LIBDEFLATE_VERSION_MINOR 12
#define LIBDEFLATE_VERSION_STRING "1.12"
#include <stddef.h>
#include <stdint.h>
@@ -31,7 +31,7 @@ extern "C" {
# define LIBDEFLATEEXPORT
#endif
#if defined(_WIN32) && !defined(_WIN64)
#if defined(_WIN32) && !defined(_WIN64) && defined(LIBDEFLATE_DLL)
# define LIBDEFLATEAPI_ABI __stdcall
#else
# define LIBDEFLATEAPI_ABI
+1 -3
View File
@@ -126,8 +126,6 @@ bool TaskDataTestGlitterParticle::Init() {
}
bool TaskDataTestGlitterParticle::Ctrl() {
Glitter::glt_particle_manager.rctx = rctx_ptr;
if (load_file && file_index < files.size())
LoadFile(files[file_index].name.c_str());
load_file = false;
@@ -152,7 +150,7 @@ bool TaskDataTestGlitterParticle::Ctrl() {
}
if (Glitter::glt_particle_manager.SceneHasNotEnded(scene_counter) && !Glitter::glt_particle_manager.GetPause())
frame += sys_frame_rate.frame_speed;
frame += sys_frame_rate.GetDeltaFrame();
if (reload || auto_and_repeat && !Glitter::glt_particle_manager.SceneHasNotEnded(scene_counter)) {
Glitter::glt_particle_manager.FreeSceneEffect(scene_counter, hash_fnv1a64m_empty, true);
+3 -5
View File
@@ -155,17 +155,15 @@ void data_view_draw_task_imgui(class_data* data) {
continue;
}
mat4 mat = task->mat;
vec3 trans;
mat4_get_translation(&mat, &trans);
mat4_get_translation(&task->mat, &trans);
vec3 rot;
mat4_get_rotation(&mat, &rot);
mat4_get_rotation(&task->mat, &rot);
vec3_mult_scalar(rot, RAD_TO_DEG_FLOAT, rot);
vec3 scale;
mat4_get_scale(&mat, &scale);
mat4_get_scale(&task->mat, &scale);
ImGui::Text("Trans: %9.4f %9.4f %9.4f", trans.x, trans.y, trans.z);
ImGui::Text(" Rot: %9.4f %9.4f %9.4f", rot.x, rot.y, rot.z);
+35 -14
View File
@@ -10,7 +10,7 @@
#include "../../KKdLib/io/path.hpp"
#include "../../KKdLib/io/stream.hpp"
#include "../../KKdLib/dds.hpp"
#include "../../KKdLib/interpolation.h"
#include "../../KKdLib/interpolation.hpp"
#include "../../KKdLib/str_utils.hpp"
#include "../../KKdLib/txp.hpp"
#include "../../KKdLib/vec.hpp"
@@ -196,6 +196,8 @@ extern bool global_context_menu;
extern float_t rob_frame;
extern render_context* rctx_ptr;
static const char* glitter_editor_window_title = "Glitter Editor";
static void glitter_editor_windows(glitter_editor_struct* glt_edt, class_data* data);
@@ -1276,7 +1278,6 @@ static void glitter_editor_windows(glitter_editor_struct* glt_edt, class_data* d
enum_or(data->flags, CLASS_DISPOSE);
if (ImGui::MenuItem("Quit", "Ctrl+Q"))
close = true;
ImGui::EndMenu();
}
if (ImGui::BeginMenu("Edit", false)) {
@@ -1499,9 +1500,9 @@ static void glitter_editor_reload(glitter_editor_struct* glt_edt) {
Glitter::Effect* effect = i;
if (eg->type != Glitter::FT)
effect->data.name_hash = hash_string_murmurhash(&effect->name);
effect->data.name_hash = hash_string_murmurhash(effect->name);
else
effect->data.name_hash = hash_string_fnv1a64m(&effect->name);
effect->data.name_hash = hash_string_fnv1a64m(effect->name);
for (Glitter::Curve*& c : effect->animation.curves)
if (c)
@@ -1664,7 +1665,7 @@ static void glitter_editor_load_file(glitter_editor_struct* glt_edt, const char*
continue;
Glitter::Effect* e = i;
if (e->data.name_hash != hash_string_fnv1a64m(&e->name)) {
if (e->data.name_hash != hash_string_fnv1a64m(e->name)) {
lst_not_valid = true;
break;
}
@@ -1985,7 +1986,7 @@ static void glitter_editor_test_window(glitter_editor_struct* glt_edt, class_dat
float_t y;
float_t w = 280.0f;
float_t h = 326.0f;
float_t h = 352.0f;
ImGui::SetNextWindowPos({ 0, 0 }, ImGuiCond_FirstUseEver);
ImGui::SetNextWindowSize({ w, h }, ImGuiCond_Always);
@@ -2058,6 +2059,16 @@ static void glitter_editor_test_window(glitter_editor_struct* glt_edt, class_dat
ImGui::CheckboxFlagsEnterKeyPressed("No Draw",
(uint32_t*)&glt_edt->draw_flags, GLITTER_EDITOR_DRAW_NO_DRAW);
ImGui::Separator();
camera* cam = rctx_ptr->camera;
static const double_t fov_min = 0.0;
static const double_t fov_max = 180.0;
double_t fov = cam->get_fov();
if (ImGui::SliderScalar("Camera FOV", ImGuiDataType_Double, &fov, &fov_min, &fov_max, "%g"))
cam->set_fov(fov);
data->imgui_focus |= ImGui::IsWindowFocused();
ImGui::End();
@@ -2725,6 +2736,17 @@ static void glitter_editor_play_manager(glitter_editor_struct* glt_edt) {
ImGui::DisableElementPush(Glitter::glt_particle_manager.draw_all && eg && eg->type == Glitter::X);
ImGui::CheckboxEnterKeyPressed("Draw All Mesh", &Glitter::glt_particle_manager.draw_all_mesh);
ImGui::DisableElementPop(Glitter::glt_particle_manager.draw_all && eg && eg->type == Glitter::X);
ImGui::Separator();
camera* cam = rctx_ptr->camera;
static const double_t fov_min = 0.0;
static const double_t fov_max = 180.0;
double_t fov = cam->get_fov();
if (ImGui::SliderScalar("Camera FOV", ImGuiDataType_Double, &fov, &fov_min, &fov_max, "%g"))
cam->set_fov(fov);
}
static void glitter_editor_property(glitter_editor_struct* glt_edt, class_data* data) {
@@ -2761,7 +2783,7 @@ static void glitter_editor_property_effect(glitter_editor_struct* glt_edt, class
name.assign(effect->name.c_str());
if (ImGui::ColumnInputText("Name", (char*)name.c_str(), name.capacity(), 0, 0, 0)) {
effect->data.name_hash = eg->type != Glitter::FT
? hash_string_murmurhash(&name) : hash_string_fnv1a64m(&name);
? hash_string_murmurhash(name) : hash_string_fnv1a64m(name);
effect->name.assign(name.c_str());
changed = true;
}
@@ -6868,8 +6890,7 @@ static void glitter_editor_gl_draw_wireframe_draw_mesh(glitter_editor_struct* gl
if (!elem->disp)
continue;
render_context* rctx = (render_context*)Glitter::glt_particle_manager.rctx;
object_data* object_data = &rctx->object_data;
object_data* object_data = &rctx_ptr->object_data;
Glitter::Particle* particle = rg->particle->data.particle;
object_info object_info;
@@ -6881,10 +6902,10 @@ static void glitter_editor_gl_draw_wireframe_draw_mesh(glitter_editor_struct* gl
obj_mesh_index_buffer* obj_index_buffer
= object_storage_get_obj_mesh_index_buffer(object_info);
mat4 mat = elem->mat_draw;
mat4& mat = elem->mat_draw;
if (!obj || !obj_vertex_buffer || !obj_index_buffer || (object_data->object_culling
&& !object_bounding_sphere_check_visibility(&obj->bounding_sphere,
object_data, rctx->camera, &mat)))
object_data, rctx_ptr->camera, &mat)))
continue;
glt_edt->gl_data->wireframe.shader.set("model", false, mat);
@@ -6895,7 +6916,7 @@ static void glitter_editor_gl_draw_wireframe_draw_mesh(glitter_editor_struct* gl
obj_mesh* mesh = &obj->mesh_array[i];
if (object_data->object_culling && !object_bounding_sphere_check_visibility(
&mesh->bounding_sphere, object_data, rctx->camera, &mat))
&mesh->bounding_sphere, object_data, rctx_ptr->camera, &mat))
continue;
for (uint32_t j = 0; j < mesh->num_submesh; j++) {
@@ -6906,14 +6927,14 @@ static void glitter_editor_gl_draw_wireframe_draw_mesh(glitter_editor_struct* gl
if (object_data->object_culling) {
int32_t v32 = object_bounding_sphere_check_visibility(
&sub_mesh->bounding_sphere, object_data, rctx->camera, &mat);
&sub_mesh->bounding_sphere, object_data, rctx_ptr->camera, &mat);
if (v32 != 2 || (!mesh->attrib.m.billboard && !mesh->attrib.m.billboard_y_axis)) {
if (v32 == 2) {
if (object_data->object_bounding_sphere_check_func)
v32 = 1;
else
v32 = obj_axis_aligned_bounding_box_check_visibility(
&sub_mesh->axis_aligned_bounding_box, rctx->camera, &mat);
&sub_mesh->axis_aligned_bounding_box, rctx_ptr->camera, &mat);
}
if (!v32)
@@ -7,6 +7,7 @@
#include "../../../CRE/lock.hpp"
#include "../../../CRE/static_var.hpp"
#include "../../../CRE/timer.hpp"
#include "../../render.hpp"
#include "../imgui_helper.hpp"
extern int32_t width;
@@ -15,12 +16,6 @@ extern int32_t height;
extern timer* render_timer;
extern timer* sound_timer;
extern size_t render_scale_table_count;
extern double_t render_get_scale();
extern void render_set_scale(double_t value);
extern int32_t render_get_scale_index();
extern void render_set_scale_index(int32_t index);
const char* graphics_render_settings_window_title = "Render Settings##Graphics";
inline static void render_settings_freq_to_string(double_t freq,
@@ -75,7 +70,7 @@ void graphics_render_settings_imgui(class_data* data) {
char buf[0x80];
sprintf_s(buf, sizeof(buf), "%g%%%%", scale);
if (ImGui::ColumnSliderInt("Scale", &scale_index, 0,
(int32_t)render_scale_table_count, buf, ImGuiSliderFlags_NoInput, true))
RENDER_SCALE_MAX - 1, buf, ImGuiSliderFlags_NoInput, true))
render_set_scale_index(scale_index);
#if defined(CLOUD_DEV)
@@ -118,7 +113,7 @@ void graphics_render_settings_imgui(class_data* data) {
ImGui::Separator();
if (ImGui::ButtonEnterKeyPressed("Reset Render Settings"))
render_set_scale(1.0);
render_set_scale_index(6);
data->imgui_focus |= ImGui::IsWindowFocused();
ImGui::End();
+42 -40
View File
@@ -14,8 +14,10 @@
double_t input_movement_speed = 0.1;
double_t input_rotation_sensitivity = 0.5;
vec2d input_move;
vec2d input_rotate;
double_t input_move_x;
double_t input_move_y;
double_t input_rotate_x;
double_t input_rotate_y;
double_t input_roll;
bool input_reset;
bool input_reset_mouse_position;
@@ -189,10 +191,10 @@ namespace Input {
ScreenToClient(window_handle, &pos);
}
input_move.x = 0.0;
input_move.y = 0.0;
input_rotate.x = 0.0;
input_rotate.y = 0.0;
input_move_x = 0.0;
input_move_y = 0.0;
input_rotate_x = 0.0;
input_rotate_y = 0.0;
input_roll = 0.0;
if (!window_handle || window_handle != GetForegroundWindow())
@@ -218,40 +220,40 @@ namespace Input {
speed_slow *= frame_speed;
if (IsKeyDown(GLFW_KEY_W) || IsKeyDown(GLFW_KEY_W, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT))
input_move.x += speed;
input_move_x += speed;
else if (IsKeyDown(GLFW_KEY_W, GLFW_MOD_SHIFT))
input_move.x += speed_fast;
input_move_x += speed_fast;
else if (IsKeyDown(GLFW_KEY_W, GLFW_MOD_CONTROL))
input_move.x += speed_slow;
input_move_x += speed_slow;
else if (IsKeyDown(GLFW_KEY_W, -1))
input_move.x += speed;
input_move_x += speed;
if (IsKeyDown(GLFW_KEY_S) || IsKeyDown(GLFW_KEY_S, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT))
input_move.x -= speed;
input_move_x -= speed;
else if (IsKeyDown(GLFW_KEY_S, GLFW_MOD_SHIFT))
input_move.x -= speed_fast;
input_move_x -= speed_fast;
else if (IsKeyDown(GLFW_KEY_S, GLFW_MOD_CONTROL))
input_move.x -= speed_slow;
input_move_x -= speed_slow;
else if (IsKeyDown(GLFW_KEY_S, -1))
input_move.x -= speed;
input_move_x -= speed;
if (IsKeyDown(GLFW_KEY_A) || IsKeyDown(GLFW_KEY_A, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT))
input_move.y -= speed;
input_move_y -= speed;
else if (IsKeyDown(GLFW_KEY_A, GLFW_MOD_SHIFT))
input_move.y -= speed_fast;
input_move_y -= speed_fast;
else if (IsKeyDown(GLFW_KEY_A, GLFW_MOD_CONTROL))
input_move.y -= speed_slow;
input_move_y -= speed_slow;
else if (IsKeyDown(GLFW_KEY_A, -1))
input_move.y -= speed;
input_move_y -= speed;
if (IsKeyDown(GLFW_KEY_D) || IsKeyDown(GLFW_KEY_D, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT))
input_move.y += speed;
input_move_y += speed;
else if (IsKeyDown(GLFW_KEY_D, GLFW_MOD_SHIFT))
input_move.y += speed_fast;
input_move_y += speed_fast;
else if (IsKeyDown(GLFW_KEY_D, GLFW_MOD_CONTROL))
input_move.y += speed_slow;
input_move_y += speed_slow;
else if (IsKeyDown(GLFW_KEY_D, -1))
input_move.y += speed;
input_move_y += speed;
speed = input_movement_speed;
speed_fast = input_movement_speed * 2.0;
@@ -267,40 +269,40 @@ namespace Input {
speed_slow *= 10.0;
if (IsKeyDown(GLFW_KEY_UP) || IsKeyDown(GLFW_KEY_UP, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT))
input_rotate.y += speed;
input_rotate_y += speed;
else if (IsKeyDown(GLFW_KEY_UP, GLFW_MOD_SHIFT))
input_rotate.y += speed_fast;
input_rotate_y += speed_fast;
else if (IsKeyDown(GLFW_KEY_UP, GLFW_MOD_CONTROL))
input_rotate.y += speed_slow;
input_rotate_y += speed_slow;
else if (IsKeyDown(GLFW_KEY_UP, -1))
input_rotate.y += speed;
input_rotate_y += speed;
if (IsKeyDown(GLFW_KEY_DOWN) || IsKeyDown(GLFW_KEY_DOWN, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT))
input_rotate.y -= speed;
input_rotate_y -= speed;
else if (IsKeyDown(GLFW_KEY_DOWN, GLFW_MOD_SHIFT))
input_rotate.y -= speed_fast;
input_rotate_y -= speed_fast;
else if (IsKeyDown(GLFW_KEY_DOWN, GLFW_MOD_CONTROL))
input_rotate.y -= speed_slow;
input_rotate_y -= speed_slow;
else if (IsKeyDown(GLFW_KEY_DOWN, -1))
input_rotate.y -= speed;
input_rotate_y -= speed;
if (IsKeyDown(GLFW_KEY_LEFT) || IsKeyDown(GLFW_KEY_LEFT, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT))
input_rotate.x -= speed;
input_rotate_x -= speed;
else if (IsKeyDown(GLFW_KEY_LEFT, GLFW_MOD_SHIFT))
input_rotate.x -= speed_fast;
input_rotate_x -= speed_fast;
else if (IsKeyDown(GLFW_KEY_LEFT, GLFW_MOD_CONTROL))
input_rotate.x -= speed_slow;
input_rotate_x -= speed_slow;
else if (IsKeyDown(GLFW_KEY_LEFT, -1))
input_rotate.x -= speed;
input_rotate_x -= speed;
if (IsKeyDown(GLFW_KEY_RIGHT) || IsKeyDown(GLFW_KEY_RIGHT, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT))
input_rotate.x += speed;
input_rotate_x += speed;
else if (IsKeyDown(GLFW_KEY_RIGHT, GLFW_MOD_SHIFT))
input_rotate.x += speed_fast;
input_rotate_x += speed_fast;
else if (IsKeyDown(GLFW_KEY_RIGHT, GLFW_MOD_CONTROL))
input_rotate.x += speed_slow;
input_rotate_x += speed_slow;
else if (IsKeyDown(GLFW_KEY_RIGHT, -1))
input_rotate.x += speed;
input_rotate_x += speed;
if (IsKeyDown(GLFW_KEY_Q) || IsKeyDown(GLFW_KEY_Q, GLFW_MOD_CONTROL | GLFW_MOD_SHIFT))
input_roll += speed;
@@ -325,8 +327,8 @@ namespace Input {
if (IsMouseButtonDown(GLFW_MOUSE_BUTTON_MIDDLE, -1)) {
if (!input_reset_mouse_position) {
input_rotate.y += ((double_t)pos_prev.y - (double_t)pos.y) * input_rotation_sensitivity;
input_rotate.x += ((double_t)pos.x - (double_t)pos_prev.x) * input_rotation_sensitivity;
input_rotate_y += ((double_t)pos_prev.y - (double_t)pos.y) * input_rotation_sensitivity;
input_rotate_x += ((double_t)pos.x - (double_t)pos_prev.x) * input_rotation_sensitivity;
}
input_reset_mouse_position = false;
}
+4 -5
View File
@@ -14,6 +14,7 @@
#include <timeapi.h>
bool aes_ni;
bool f16c;
inline static void next_rand_uint8_t_pointer(uint8_t* arr, size_t length, uint32_t* state) {
if (!arr || length < 1)
@@ -312,16 +313,14 @@ int32_t wmain(int32_t argc, wchar_t** argv) {
timeBeginPeriod(1);
SetProcessDPIAware();
int32_t cpuid_data[4];
int32_t cpuid_data[4] = {};
__cpuid(cpuid_data, 1);
aes_ni = cpuid_data[2] & 0x2000000 ? true : false;
aes_ni = (cpuid_data[2] & (1 << 25)) ? true : false;
f16c = (cpuid_data[2] & (1 << 29)) ? true : false;
//a3da_to_dft_dsc(269);
render_init_struct ris;
ris.res.x = 0;
ris.res.y = 0;
ris.scale = 0.0f;
thread render, sound;
HANDLE h[2];
+72 -39
View File
@@ -171,7 +171,7 @@ void pv_play_data_motion_data::reset() {
set_item.shrink_to_fit();
}
pv_play_data::pv_play_data() : rob_chr(), disp() {
pv_play_data::pv_play_data() : rob_chr(), disp(), field_31(), field_34() {
}
@@ -198,7 +198,15 @@ pv_disp2d::~pv_disp2d() {
}
pv_game_dsc_data::pv_game_dsc_data() {
pv_game_dsc_data::pv_game_dsc_data() : field_0(), state(), play(), dsc_buffer(), dsc_buffer_counter(),
field_2BF30(), field_2BF38(), curr_time(), curr_time_float(), prev_time_float(), field_2BF50(), field_2BF58(),
field_2BF60(), field_2BF64(), field_2BF68(), chara_id(), pv_game()/*, field_2BF80(), field_2BF88()*/,
dsc_file_handler(), target_anim_fps(), anim_frame_speed(), target_flying_time(), time_signature(), dsc_time(),
field_2BFB0(), field_2BFB4(), field_2BFB8(), field_2BFBC(), field_2BFC0(), music_play(), field_2BFC4(), pv_end(),
fov(), min_dist(), field_2BFD4(), field_2BFD5(), data_camera(), scene_fade_enable(), scene_fade_frame(),
scene_fade_duration(), scene_fade_start_alpha(), scene_fade_end_alpha(), scene_fade_color(), has_signature(),
has_perf_id(), field_2C4E4(), field_2C500(), scene_rot_y(), scene_rot_mat(), field_2C54C(),
field_2C550(), branch_mode(), first_challenge_note(), last_challenge_note(), field_2C560() {
}
@@ -206,7 +214,7 @@ pv_game_dsc_data::~pv_game_dsc_data() {
}
pv_game_data_chara::pv_game_data_chara() {
pv_game_data_chara::pv_game_data_chara() : chara_index(), cos(), chara_id(), pv_data(), rob_chr() {
}
@@ -214,7 +222,8 @@ pv_game_data_chara::~pv_game_data_chara() {
}
pv_game_data_field::pv_game_data_field() {
pv_game_data_field::pv_game_data_field() : stage_index(), light_auth_3d_uid(), light_auth_3d_id(),
light_frame(), spr_set_back_id(), stage_flag(), npr_type(), cam_blur(), sdw_off() {
}
@@ -222,7 +231,7 @@ pv_game_data_field::~pv_game_data_field() {
}
struc_78::struc_78() {
struc_78::struc_78() : field_30(), field_34() {
}
@@ -230,7 +239,8 @@ struc_78::~struc_78() {
}
pv_game_data_chreff::pv_game_data_chreff() {
pv_game_data_chreff::pv_game_data_chreff() : src_chara_index(),
dst_chara_index(), src_auth_3d_uid(), dst_auth_3d_uid() {
}
@@ -238,7 +248,7 @@ pv_game_data_chreff::~pv_game_data_chreff() {
}
pv_effect_resource::pv_effect_resource() {
pv_effect_resource::pv_effect_resource() : emission() {
}
@@ -246,7 +256,26 @@ pv_effect_resource::~pv_effect_resource() {
}
pv_game_data::pv_game_data() {
pv_game_data::pv_game_data() : field_2CE98(), field_2CE9C(), field_2CF1C(), field_2CF20(), field_2CF24(),
field_2CF28(), field_2CF2C(), field_2CF30(), field_2CF34(), field_2CF38(), life_gauge(), score_final(),
challenge_time_total_bonus(), combo(), challenge_time_combo_count(), max_combo(), total_hit_count(), hit_count(),
current_reference_score(), target_count(), field_2CF84(), field_2CF88(), field_2CF8C(), score_slide_chain_bonus(),
slide_chain_length(), field_2CF98(), field_2CF9C(), field_2CFA0(), field_2CFA4(), pv(), field_2CFB0(), field_2CFB4(),
reference_score(), field_2CFBC(), field_2CFC0(), field_2CFC4(), field_2CFE0(), field_2CFE4(), notes_passed(),
field_2CFF0(), score_percentage(), score_percentage_clear(), score_percentage_border(), life_gauge_safety_time(),
life_gauge_border(), field_2D008(), field_2D00C(), no_fail(), field_2D00E(), field_2D00F(), challenge_time_start(),
challenge_time_end(), max_time(), max_time_float(), current_time_float(), current_time(), current_time_float_dup(),
field_2D03C(), score_hold_multi(), score_hold(), score_slide(), field_2D04C(), chance_time_ended(), pv_disp2d(),
life_gauge_final(), hit_border(), field_2D05D(), field_2D05E(), field_2D05F(), title_image_init(), field_2D061(),
field_2D062(), field_2D063(), has_auth_3d_frame(), has_light_frame(), field_2D066(), field_2D068(), field_2D069(),
field_2D06A(), field_2D06C(), field_index(), edit_effect_index(), slidertouch_counter(),
change_field_branch_success_counter(), field_2D080(), field_2D084(), life_gauge_bonus(), life_gauge_total_bonus(),
field_2D090(), field_2D091(), field_2D092(), field_2D093(), field_2D094(), field_2D095(), field_2D096(), success(),
field_2D098(), field_2D09C(), field_2D0A0(), pv_end_fadeout(), rival_percentage(), field_2D0A8(), field_2D0AC(),
field_2D0B0(), field_2D0BC(), field_2D0BD(), field_2D0BE(), field_2D0BF(), field_2D0C0(), field_2D0C4(),
field_2D7E8(), field_2D7EC(), field_2D808(), field_2D80C(), field_2D858(), camera_auth_3d_uid(), field_2D874(),
field_2D878(), field_2D87C(), current_field(), field_2D8A0(), field_2D8A4(), data_camera_id(),
field_2D954(), field_2DAC8(), field_2DACC(), field_2DB28(), field_2DB2C(), field_2DB34() {
}
@@ -254,7 +283,8 @@ pv_game_data::~pv_game_data() {
}
pv_game::pv_game() {
pv_game::pv_game() : loaded(), field_1(), field_2(), end_pv(), field_4(),
state(), field_C(), pv_id(), field_14(), modules(), items(), field_90() {
}
@@ -262,7 +292,9 @@ pv_game::~pv_game() {
}
TaskPvGame::Data::Data() {
TaskPvGame::Data::Data() : field_0(), field_4(), field_8(), score_percentage_clear(), life_gauge_safety_time(),
life_gauge_border(), field_1C(), modules(), items(), field_98(), field_A0(), field_A8(), field_190(),
field_191(), no_fail(), field_193(), field_194(), field_195(), field_196(), field_198() {
}
@@ -315,7 +347,7 @@ pv_end(), playdata(), scene_rot_y(), branch_mode(), pause(), step_frame() {
camera_auth_3d_id = -1;
target_anim_fps = 60.0f;
anim_frame_speed = 1.0f;
scene_rot_mat = mat4u_identity;
scene_rot_mat = mat4_identity;
}
pv_game_old::~pv_game_old() {
@@ -543,18 +575,6 @@ bool pv_game_old::Ctrl() {
pause = true;
} break;
case 10: {
if (step_frame)
if (pause)
pause = false;
else {
pause = true;
step_frame = false;
}
Glitter::glt_particle_manager.SetPause(pause);
extern float_t frame_speed;
frame_speed = pause ? 0.0f : 1.0f;
float_t delta_frame = get_delta_frame();
frame_float += delta_frame;
frame = (int32_t)frame_float;
@@ -575,12 +595,6 @@ bool pv_game_old::Ctrl() {
return false;
}
void pv_game_old::Disp() {
if (state != 10)
return;
}
bool pv_game_old::Dest() {
Unload();
task_stage_unload();
@@ -599,6 +613,29 @@ bool pv_game_old::Dest() {
return true;
}
void pv_game_old::Disp() {
if (state != 10)
return;
}
void pv_game_old::Basic() {
if (state != 10)
return;
if (step_frame)
if (pause)
pause = false;
else {
pause = true;
step_frame = false;
}
Glitter::glt_particle_manager.SetPause(pause);
extern float_t frame_speed;
frame_speed = pause ? 0.0f : 1.0f;
}
void pv_game_old::Window() {
if (state != 10)
return;
@@ -706,7 +743,7 @@ void pv_game_old::Load(int32_t pv_id, chara_index charas[6], int32_t modules[6])
for (pv_play_data& i : playdata)
i.reset();
scene_rot_y = 0.0f;
scene_rot_mat = mat4u_identity;
scene_rot_mat = mat4_identity;
branch_mode = 0;
pause = false;
@@ -815,7 +852,7 @@ void pv_game_old::Unload() {
for (pv_play_data& i : playdata)
i.reset();
scene_rot_y = 0.0f;
scene_rot_mat = mat4u_identity;
scene_rot_mat = mat4_identity;
branch_mode = 0;
Glitter::glt_particle_manager.draw_all = true;
@@ -955,9 +992,8 @@ static bool pv_game_dsc_process(pv_game_old* a1, int64_t curr_time) {
if (!rob_chr)
break;
mat4 scene_rot_mat = a1->scene_rot_mat;
mat4_mult_vec3_trans(&scene_rot_mat, &trans, &trans);
rob_chr->data.miku_rot.position = trans;
mat4_mult_vec3_trans(&a1->scene_rot_mat,
&trans, &rob_chr->data.miku_rot.position);
rob_chr->set_osage_reset();
} break;
case DSC_FT_MIKU_ROT: {
@@ -1733,8 +1769,7 @@ static bool pv_game_dsc_process(pv_game_old* a1, int64_t curr_time) {
if (!rob_chr)
break;
mat4 scene_rot_mat = a1->scene_rot_mat;
mat4_mult_vec3_trans(&scene_rot_mat, &pos, &pos);
mat4_mult_vec3_trans(&a1->scene_rot_mat, &pos, &pos);
rob_chr->set_chara_pos_adjust(&pos);
/*if (rob_chara_check_for_ageageagain_module(rob_chr->chara_index, rob_chr->module_index)) {
@@ -1746,9 +1781,7 @@ static bool pv_game_dsc_process(pv_game_old* a1, int64_t curr_time) {
float_t scene_rot_y = (float_t)(int32_t)data[0] * 0.001f;
a1->scene_rot_y = scene_rot_y;
mat4 scene_rot_mat = a1->scene_rot_mat;
mat4_rotate_y(scene_rot_y * DEG_TO_RAD_FLOAT, &scene_rot_mat);
a1->scene_rot_mat = scene_rot_mat;
mat4_rotate_y(scene_rot_y * DEG_TO_RAD_FLOAT, &a1->scene_rot_mat);
} break;
case DSC_FT_EDIT_MOT_SMOOTH_LEN: {
+5 -4
View File
@@ -241,7 +241,7 @@ struct pv_game_dsc_data {
struct pv_game_data_chara {
chara_index chara_index;
int32_t module_index;
int32_t cos;
int32_t chara_id;
rob_chara_pv_data pv_data;
rob_chara* rob_chr;
@@ -304,7 +304,7 @@ struct struc_78 {
struct pv_game_data_chreff {
chara_index src_chara_index;
chara_index dst_chara_index;
std::bitset<128>* type;
std::bitset<128> type;
std::string src_auth_3d;
std::string dst_auth_3d;
std::string src_auth_3d_category;
@@ -390,7 +390,7 @@ struct pv_game_data {
uint32_t score_hold;
int32_t score_slide;
uint8_t field_2D04C;
uint8_t chance_time_endede;
uint8_t chance_time_ended;
pv_disp2d* pv_disp2d;
int32_t life_gauge_final;
bool hit_border;
@@ -603,7 +603,7 @@ public:
bool pv_end;
pv_play_data playdata[ROB_CHARA_COUNT];
float_t scene_rot_y;
mat4u scene_rot_mat;
mat4 scene_rot_mat;
int32_t branch_mode;
bool pause;
@@ -616,6 +616,7 @@ public:
virtual bool Ctrl() override;
virtual bool Dest() override;
virtual void Disp() override;
virtual void Basic() override;
virtual void Window() override;
void Load(int32_t pv_id, chara_index charas[6], int32_t modules[6]);
+29 -56
View File
@@ -92,9 +92,8 @@ const double_t render_scale_table[] = {
8.0 / 4.0, // 200%
};
size_t render_scale_table_count = sizeof(render_scale_table) / sizeof(double_t);
static float_t old_scale, scale;
static int32_t old_scale_index;
static int32_t scale_index;
static vec2i old_internal_2d_res;
static vec2i old_internal_3d_res;
@@ -147,6 +146,10 @@ extern size_t frame_counter;
render_context* rctx_ptr;
bool task_stage_is_modern;
render_init_struct::render_init_struct() : scale_index() {
}
int32_t render_main(void* arg) {
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
timeBeginPeriod(1);
@@ -234,7 +237,9 @@ int32_t render_main(void* arg) {
width = window_rect.right;
height = window_rect.bottom;
old_scale = scale = ris->scale > 0 ? ris->scale : 1.0f;
scale_index = ris->scale_index > 0 && ris->scale_index < RENDER_SCALE_MAX
? ris->scale_index : RENDER_SCALE_100;
old_scale_index = scale_index;
#pragma endregion
#if defined(DEBUG) && OPENGL_DEBUG
@@ -333,47 +338,15 @@ int32_t render_main(void* arg) {
}
double_t render_get_scale() {
return scale;
}
void render_set_scale(double_t value) {
size_t i;
for (i = 0; i < render_scale_table_count; i++)
if (value <= render_scale_table[i]) break;
if (i < render_scale_table_count)
value = render_scale_table[i];
else if (render_scale_table_count - 1 > -1)
value = render_scale_table[render_scale_table_count - 1];
else
value = 1.0;
scale = (float_t)value;
return render_scale_table[scale_index];
}
int32_t render_get_scale_index() {
size_t i;
for (i = 0; i < render_scale_table_count; i++)
if (scale <= render_scale_table[i]) break;
int32_t index;
if (i < render_scale_table_count)
index = (int32_t)i;
else
index = (int32_t)(render_scale_table_count - 1);
return index;
return scale_index;
}
void render_set_scale_index(int32_t index) {
double_t value;
if (index < 0)
value = render_scale_table[0];
else if (index < render_scale_table_count)
value = render_scale_table[index];
else
value = render_scale_table[render_scale_table_count - 1];
scale = (float_t)value;
scale_index = index >= 0 && index < RENDER_SCALE_MAX ? index : RENDER_SCALE_100;
}
float_t rob_frame = 0.0f;
@@ -393,11 +366,11 @@ static render_context* render_load() {
mothead_storage_init();
osage_setting_data_init();
Glitter::glt_particle_manager.rctx = rctx;
data_struct_init();
data_struct_load("CLOUD_data.txt");
render_shaders_load();
data_struct* aft_data = &data_list[DATA_AFT];
auth_3d_database* aft_auth_3d_db = &aft_data->data_ft.auth_3d_db;
bone_database* aft_bone_data = &aft_data->data_ft.bone_data;
@@ -430,8 +403,6 @@ static render_context* render_load() {
uniform_value[U16] = 1;
render_shaders_load();
const char* cube_line_vert_shader =
"#version 430 core\n"
"layout(location = 0) in vec4 a_position;\n"
@@ -764,9 +735,9 @@ static render_context* render_load() {
modules[5] = 0;//31;
//pv_game_data.Load(739, charas, modules);
charas[0] = CHARA_LUKA;
charas[1] = CHARA_LUKA;//CHARA_RIN;
charas[2] = CHARA_LUKA;//CHARA_LEN;
charas[0] = CHARA_KAITO;
charas[1] = CHARA_MIKU;//CHARA_RIN;
charas[2] = CHARA_MEIKO;//CHARA_LEN;
charas[3] = CHARA_LUKA;//CHARA_LUKA;
charas[4] = CHARA_LUKA;//CHARA_KAITO;
charas[5] = CHARA_LUKA;//CHARA_MEIKO;
@@ -785,8 +756,10 @@ static render_context* render_load() {
return rctx;
}
extern vec2d input_move;
extern vec2d input_rotate;
extern double_t input_move_x;
extern double_t input_move_y;
extern double_t input_rotate_x;
extern double_t input_rotate_y;
extern double_t input_roll;
extern bool input_reset;
@@ -811,13 +784,13 @@ static void render_ctrl(render_context* rctx) {
classes_process_imgui(classes, classes_count);
lock_unlock(&imgui_context_lock);
if (old_width != width || old_height != height || old_scale != scale) {
if (old_width != width || old_height != height || old_scale_index != scale_index) {
render_resize_fb(rctx, true);
cam->set_res(internal_3d_res.x, internal_3d_res.y);
}
old_width = width;
old_height = height;
old_scale = scale;
old_scale_index = scale_index;
lock_lock(&imgui_context_lock);
ImGui::SetCurrentContext(imgui_context);
@@ -845,8 +818,8 @@ static void render_ctrl(render_context* rctx) {
cam->set_fast_change_hist0(true);
}
else {
cam->rotate(input_rotate);
cam->move(input_move);
cam->rotate(input_rotate_x, input_rotate_y);
cam->move(input_move_x, input_move_y);
if (input_roll != 0.0)
cam->set_roll(cam->get_roll() + input_roll);
}
@@ -1145,8 +1118,6 @@ static void render_dispose(render_context* rctx) {
object_storage_free();
data_struct_free();
render_shaders_free();
glDeleteBuffers(1, &common_data_ubo);
glDeleteBuffers(1, &grid_vbo);
glDeleteBuffers(1, &cube_line_point_instance_vbo);
@@ -1164,6 +1135,8 @@ static void render_dispose(render_context* rctx) {
file_handler_storage_free();
texture_storage_free();
render_shaders_free();
}
static void render_imgui(render_context* rctx) {
@@ -1222,8 +1195,8 @@ static void render_resize_fb(render_context* rctx, bool change_fb) {
internal_2d_res.x = clamp(internal_res.x, 1, sv_max_texture_size);
internal_2d_res.y = clamp(internal_res.y, 1, sv_max_texture_size);
internal_3d_res.x = (int32_t)roundf((float_t)internal_res.x * scale);
internal_3d_res.y = (int32_t)roundf((float_t)internal_res.y * scale);
internal_3d_res.x = (int32_t)roundf((float_t)(internal_res.x * render_scale_table[scale_index]));
internal_3d_res.y = (int32_t)roundf((float_t)(internal_res.y * render_scale_table[scale_index]));
internal_3d_res.x = clamp(internal_3d_res.x, 1, sv_max_texture_size);
internal_3d_res.y = clamp(internal_3d_res.y, 1, sv_max_texture_size);
+22 -2
View File
@@ -8,15 +8,35 @@
#include "shared.hpp"
#include "../KKdLib/vec.hpp"
enum render_scale {
RENDER_SCALE_25 = 0,
RENDER_SCALE_33,
RENDER_SCALE_50,
RENDER_SCALE_67,
RENDER_SCALE_75,
RENDER_SCALE_83,
RENDER_SCALE_100,
RENDER_SCALE_117,
RENDER_SCALE_125,
RENDER_SCALE_133,
RENDER_SCALE_150,
RENDER_SCALE_167,
RENDER_SCALE_175,
RENDER_SCALE_183,
RENDER_SCALE_200,
RENDER_SCALE_MAX,
};
struct render_init_struct {
vec2i res;
float_t scale;
int32_t scale_index;
render_init_struct();
};
extern const double_t render_scale_table[];
extern int32_t render_main(void* arg);
extern double_t render_get_scale();
extern void render_set_scale(double_t value);
extern int32_t render_get_scale_index();
extern void render_set_scale_index(int32_t index);
+526 -283
View File
File diff suppressed because it is too large Load Diff
+54 -4
View File
@@ -17,9 +17,57 @@
#include "../KKdLib/pvsr.hpp"
#include "../CRE/rob/rob.hpp"
#include "../CRE/auth_3d.hpp"
#include "../CRE/frame_rate_control.hpp"
#include "../CRE/task.hpp"
#include "classes.hpp"
struct x_pv_bar_beat_data {
int32_t bar;
float_t bar_time;
int32_t beat_count;
int32_t beat_counter;
float_t beat_time[16];
bool compare_bar_time_less(float_t time);
};
struct x_pv_bar_beat {
float_t curr_time;
float_t delta_time;
float_t next_bar_time;
float_t curr_bar_time;
float_t next_beat_time;
float_t curr_beat_time;
float_t divisor;
int32_t bar;
int32_t field_20;
std::vector<x_pv_bar_beat_data> data;
x_pv_bar_beat();
~x_pv_bar_beat();
float_t get_bar_current_frame();
float_t get_delta_frame();
float_t get_next_beat_time(float_t time);
int32_t get_time_bar_beat(int32_t* beat, float_t time);
void reset();
void reset_time();
void set_frame(float_t curr_frame, float_t delta_frame);
void set_time(float_t curr_time, float_t delta_time);
};
class BPMFrameRateControl : public FrameRateControl {
public:
x_pv_bar_beat* bar_beat;
BPMFrameRateControl();
virtual ~BPMFrameRateControl() override;
virtual float_t GetDeltaFrame() override;
void Reset();
};
struct x_pv_game_glitter {
std::string name;
uint32_t hash;
@@ -96,6 +144,7 @@ struct x_pv_game_stage_effect {
int32_t prev_stage_effect;
int32_t stage_effect;
int32_t next_stage_effect;
int32_t bar_count;
};
struct x_pv_game_stage_effect_init {
@@ -237,6 +286,9 @@ public:
dsc_data* dsc_data_ptr;
dsc_data* dsc_data_ptr_end;
x_pv_bar_beat bar_beat;
BPMFrameRateControl frame_rate_control;
std::vector<x_pv_game_stage_effect_init> stage_effects;
x_pv_game_stage_effect_init* stage_effects_ptr;
x_pv_game_stage_effect_init* stage_effects_ptr_end;
@@ -252,12 +304,9 @@ public:
bool pv_end;
x_pv_play_data playdata[ROB_CHARA_COUNT];
float_t scene_rot_y;
mat4u scene_rot_mat;
mat4 scene_rot_mat;
int32_t branch_mode;
int64_t prev_bar_point_time;
int32_t prev_bpm;
bool pause;
bool step_frame;
@@ -270,6 +319,7 @@ public:
virtual bool Ctrl() override;
virtual bool Dest() override;
virtual void Disp() override;
virtual void Basic() override;
virtual void Window() override;
void Load(int32_t pv_id, int32_t stage_id, chara_index charas[6], int32_t modules[6]);
+1 -1
View File
@@ -4,7 +4,7 @@
*/
#include "glitter.hpp"
#include "../../KKdLib/interpolation.h"
#include "../../KKdLib/interpolation.hpp"
namespace Glitter {
#if defined(CRE_DEV)
+1 -1
View File
@@ -61,7 +61,7 @@ namespace Glitter {
obj_material* mat = &obj->material_array[j].material;
if (!memcmp(&mat->color.emission, &vec3_null, sizeof(vec3))
&& mat->color.emission.w == 1.0f)
mat->color.emission = vec4u_identity;
mat->color.emission = vec4_identity;
}
}
}
+124 -65
View File
@@ -13,7 +13,7 @@ namespace Glitter {
size_t id, float_t emission, bool appear_now) : data(GLT_VAL) {
effect = eff;
data = eff->data;
color = vec4u_identity;
color = vec4_identity;
scale_all = 1.0f;
this->id = id;
translation = eff->translation;
@@ -24,7 +24,7 @@ namespace Glitter {
mat = mat4_identity;
flags = (EffectInstFlag)0;
random = 0;
min_color = vec4u_null;
min_color = vec4_null;
ext_anim_scale = vec3_null;
some_scale = -1.0f;
@@ -38,19 +38,6 @@ namespace Glitter {
}
draw_pass_3d_type EffectInst::GetAlpha() {
return data.flags & EFFECT_ALPHA ? DRAW_PASS_3D_TRANSPARENT : DRAW_PASS_3D_TRANSLUCENT;
}
fog_id EffectInst::GetFog() {
if (data.flags & EFFECT_FOG)
return FOG_DEPTH;
else if (data.flags & EFFECT_FOG_HEIGHT)
return FOG_HEIGHT;
else
return (fog_id)-1;
}
F2EffectInst::ExtAnim::ExtAnim() {
object_index = -1;
mesh_index = -1;
@@ -146,10 +133,9 @@ namespace Glitter {
GetValue(GLT_VAL);
mat4 mat;
if (flags & EFFECT_INST_HAS_EXT_ANIM_TRANS && ext_anim) {
vec3 trans;
vec3_add(translation, ext_anim->translation, trans);
mat4_translate_mult(&ext_anim->mat, trans.x, trans.y, trans.z, &mat);
if (GetExtAnimMat(&mat)) {
vec3 trans = translation;
mat4_translate_mult(&mat, trans.x, trans.y, trans.z, &mat);
}
else {
vec3 trans = translation;
@@ -175,19 +161,15 @@ namespace Glitter {
}
else if (data.flags & EFFECT_LOOP)
frame0 -= (float_t)data.life_time;
else {
enum_or(flags, EFFECT_INST_FREE);
for (F2EmitterInst*& i : emitters)
if (i)
i->Free(GPM_VAL, GLT_VAL, emission, false);
}
else
Free(GPM_VAL, GLT_VAL, emission, false);
render_scene.Ctrl(GLT_VAL, delta_frame);
frame0 += delta_frame;
}
void F2EffectInst::Disp(GPM, draw_pass_3d_type alpha) {
render_scene.Disp(GPM_VAL, alpha);
void F2EffectInst::Disp(GPM, DispType disp_type) {
render_scene.Disp(GPM_VAL, disp_type);
}
void F2EffectInst::Free(GPM, GLT, float_t emission, bool free) {
@@ -219,6 +201,7 @@ namespace Glitter {
void F2EffectInst::Reset(GPM, GLT, float_t emission) {
frame0 = -(float_t)data.appear_time;
frame1 = 0.0;
flags = (EffectInstFlag)0;
if (~data.flags & EFFECT_LOCAL && data.ext_anim) {
@@ -258,15 +241,8 @@ namespace Glitter {
GetValue(GLT_VAL);
mat4 mat;
if (flags & EFFECT_INST_HAS_EXT_ANIM_TRANS && ext_anim) {
vec3 trans;
vec3_add(translation, ext_anim->translation, trans);
mat4_translate_mult(&ext_anim->mat, trans.x, trans.y, trans.z, &mat);
}
else {
vec3 trans = translation;
mat4_translate(trans.x, trans.y, trans.z, &mat);
}
vec3 trans = translation;
mat4_translate(trans.x, trans.y, trans.z, &mat);
vec3 rot = rotation;
vec3 scale;
@@ -285,12 +261,8 @@ namespace Glitter {
}
else if (data.flags & EFFECT_LOOP)
frame0 -= (float_t)data.life_time;
else {
enum_or(flags, EFFECT_INST_FREE);
for (F2EmitterInst*& i : emitters)
if (i)
i->Free(GPM_VAL, GLT_VAL, emission, false);
}
else
Free(GPM_VAL, GLT_VAL, emission, false);
render_scene.Ctrl(GLT_VAL, delta_frame);
}
@@ -299,7 +271,36 @@ namespace Glitter {
frame1 += delta_frame;
start_time -= delta_frame;
}
frame1 += delta_frame;
CtrlMat(GPM_VAL, GLT_VAL);
}
void F2EffectInst::CtrlMat(GPM, GLT) {
if (~flags & EFFECT_INST_JUST_INIT)
return;
vec3 trans = translation;
vec3 rot = rotation;
vec3 scale;
vec3_mult_scalar(this->scale, scale_all, scale);
mat4 mat;
mat4_translate(trans.x, trans.y, trans.z, &mat);
mat4_rot(&mat, rot.x, rot.y, rot.z, &mat);
mat4_scale_rot(&mat, scale.x, scale.y, scale.z, &mat);
this->mat = mat;
for (F2EmitterInst*& i : emitters)
if (i)
i->CtrlMat(GPM_VAL, GLT_VAL, this);
enum_and(flags, ~EFFECT_INST_JUST_INIT);
}
DispType F2EffectInst::GetDispType() {
if (data.flags & EFFECT_ALPHA)
return DISP_ALPHA;
return DISP_NORMAL;
}
void F2EffectInst::GetExtAnim() {
@@ -320,7 +321,7 @@ namespace Glitter {
if (!rob_chr)
return;
mat4 mat = rob_chr->data.adjust_data.mat;
mat4& mat = rob_chr->data.adjust_data.mat;
vec3 scale;
mat4_get_scale(&mat, &scale);
@@ -433,6 +434,23 @@ namespace Glitter {
}
}
bool F2EffectInst::GetExtAnimMat(mat4* mat) {
if (~flags & EFFECT_INST_HAS_EXT_ANIM_TRANS || !ext_anim)
return false;
vec3 trans = ext_anim->translation;
mat4_translate_mult(&ext_anim->mat, trans.x, trans.y, trans.z, mat);
return true;
}
FogType F2EffectInst::GetFog() {
if (data.flags & EFFECT_FOG)
return Glitter::FOG_DEPTH;
else if (data.flags & EFFECT_FOG_HEIGHT)
return Glitter::FOG_HEIGHT;
return Glitter::FOG_NONE;
}
void F2EffectInst::GetValue(GLT) {
Animation* anim = &effect->animation;
size_t length = anim->curves.size();
@@ -555,7 +573,7 @@ namespace Glitter {
uint64_t bone_name_hash = hash_utf8_fnv1a64m(bone_names[node]);
for (std::string& i : *motion_bone_names)
if (bone_name_hash == hash_string_fnv1a64m(&i))
if (bone_name_hash == hash_string_fnv1a64m(i))
return (int32_t)(&i - motion_bone_names->data());
return -1;
}
@@ -641,7 +659,7 @@ namespace Glitter {
emitters.push_back(emitter);
}
CtrlInit(emission);
CtrlInit(GPM_VAL, emission);
}
XEffectInst::~XEffectInst() {
@@ -682,22 +700,19 @@ namespace Glitter {
vec3 rot = rotation;
mat4 mat;
if (flags & EFFECT_INST_HAS_EXT_ANIM_TRANS && ext_anim) {
mat4_normalize_rotation(&ext_anim->mat, &mat_rot);
if (GetExtAnimMat(&mat)) {
mat4_normalize_rotation(&mat, &mat_rot);
mat4_clear_trans(&mat_rot, &mat_rot);
mat4_rotate_mult(&mat_rot, rot.x, rot.y, rot.z, &mat_rot_eff_rot);
vec3 ext_trans = ext_anim->translation;
mat4_translate_mult(&ext_anim->mat, ext_trans.x, ext_trans.y, ext_trans.z, &mat);
vec3& trans = translation;
vec3 trans = translation;
mat4_translate_mult(&mat, trans.x, trans.y, trans.z, &mat);
}
else {
mat_rot = mat4_identity;
mat4_rotate(rot.x, rot.y, rot.z, &mat_rot_eff_rot);
vec3& trans = translation;
vec3 trans = translation;
mat4_translate(trans.x, trans.y, trans.z, &mat);
}
@@ -719,19 +734,15 @@ namespace Glitter {
}
else if (data.flags & EFFECT_LOOP)
frame0 -= (float_t)data.life_time;
else {
enum_or(flags, EFFECT_INST_FREE);
for (XEmitterInst*& i : emitters)
if (i)
i->Free(emission, false);
}
else
Free(GPM_VAL, GLT_VAL, emission, false);
render_scene.Ctrl(delta_frame, true);
frame0 += delta_frame;
}
void XEffectInst::Disp(GPM, draw_pass_3d_type alpha) {
render_scene.Disp(GPM_VAL, alpha);
void XEffectInst::Disp(GPM, DispType disp_type) {
render_scene.Disp(GPM_VAL, disp_type);
}
void XEffectInst::Free(GPM, GLT, float_t emission, bool free) {
@@ -763,6 +774,7 @@ namespace Glitter {
void XEffectInst::Reset(GPM, GLT, float_t emission) {
frame0 = -(float_t)data.appear_time;
frame1 = 0.0;
flags = (EffectInstFlag)0;
if (~data.flags & EFFECT_LOCAL && data.ext_anim_x) {
@@ -792,14 +804,14 @@ namespace Glitter {
if (i)
i->Reset();
CtrlInit(emission);
CtrlInit(GPM_VAL, emission);
}
void XEffectInst::CalcDisp(GPM) {
render_scene.CalcDisp(GPM_VAL);
}
void XEffectInst::CtrlInit(float_t emission) {
void XEffectInst::CtrlInit(GPM, float_t emission) {
if (data.start_time < 1)
return;
@@ -847,6 +859,36 @@ namespace Glitter {
frame1 += delta_frame;
start_time -= delta_frame;
}
CtrlMat(GPM_VAL);
}
void XEffectInst::CtrlMat(GPM) {
if (~flags & EFFECT_INST_JUST_INIT)
return;
vec3 trans = translation;
vec3 rot = rotation;
vec3 scale;
vec3_mult_scalar(this->scale, scale_all, scale);
mat4 mat;
mat4_translate(trans.x, trans.y, trans.z, &mat);
mat4_rot(&mat, rot.x, rot.y, rot.z, &mat);
mat4_scale_rot(&mat, scale.x, scale.y, scale.z, &mat);
this->mat = mat;
for (XEmitterInst*& i : emitters)
if (i)
i->CtrlMat(GPM_VAL, this);
enum_and(flags, ~EFFECT_INST_JUST_INIT);
}
DispType XEffectInst::GetDispType() {
if (data.flags & EFFECT_ALPHA)
return DISP_ALPHA;
return DISP_NORMAL;
}
void XEffectInst::GetExtAnim() {
@@ -867,7 +909,7 @@ namespace Glitter {
if (!rob_chr)
return;
mat4 mat = rob_chr->data.adjust_data.mat;
mat4& mat = rob_chr->data.adjust_data.mat;
vec3 scale;
mat4_get_scale(&rob_chr->data.adjust_data.mat, &scale);
@@ -916,7 +958,7 @@ namespace Glitter {
rob_chara* rob_chr = rob_chara_array_get(chara_id);
if (rob_chr) {
vec3 trans = rob_chr->data.adjust_data.trans;
mat4_translate(trans.x, trans.y + rob_chr->data.adjust_data.pos_adjust_y, trans.z, &m);
mat4_translate(trans.x, trans.y, trans.z, &m);
vec3 scale;
mat4_get_scale(&rob_chr->data.adjust_data.mat, &scale);
@@ -964,6 +1006,23 @@ namespace Glitter {
}
}
bool XEffectInst::GetExtAnimMat(mat4* mat) {
if (~flags & EFFECT_INST_HAS_EXT_ANIM_TRANS || !ext_anim)
return false;
vec3 trans = ext_anim->translation;
mat4_translate_mult(&ext_anim->mat, trans.x, trans.y, trans.z, mat);
return true;
}
FogType XEffectInst::GetFog() {
if (data.flags & EFFECT_FOG)
return Glitter::FOG_DEPTH;
else if (data.flags & EFFECT_FOG_HEIGHT)
return Glitter::FOG_HEIGHT;
return Glitter::FOG_NONE;
}
void XEffectInst::GetValue() {
Animation* anim = &effect->animation;
size_t length = anim->curves.size();
+26 -5
View File
@@ -6,12 +6,33 @@
#include "glitter.hpp"
namespace Glitter {
Emitter::Emitter(GLT) : data() {
Emitter::Box::Box() {
}
Emitter::Cylinder::Cylinder() : radius(), height(),
start_angle(), end_angle(), on_edge(), direction() {
}
Emitter::Polygon::Polygon() : size(), count(), direction() {
}
Emitter::Sphere::Sphere() : radius(), latitude(), longitude(), on_edge(), direction() {
}
Emitter::Data::Data() : start_time(), life_time(),
flags(), timer(), emission_interval(), type(), seed() {
loop_start_time = 0;
loop_end_time = -1;
particles_per_emission = 1.0f;
direction = DIRECTION_EFFECT_ROTATION;
}
Emitter::Emitter(GLT) {
version = GLT_VAL == Glitter::X ? 0x04 : 0x02;
data.loop_start_time = 0;
data.loop_end_time = -1;
data.particles_per_emission = 1;
data.direction = DIRECTION_EFFECT_ROTATION;
}
Emitter::~Emitter() {
+101 -95
View File
@@ -143,7 +143,7 @@ namespace Glitter {
mat4 dir_mat;
switch (data.direction) {
case DIRECTION_BILLBOARD:
mat4_from_mat3(&((render_context*)GPM_VAL->rctx)->camera->inv_view_mat3, &dir_mat);
mat4_from_mat3(&GPM_VAL->cam.inv_view_mat3, &dir_mat);
mat4_mult(&eff_inst->mat, &dir_mat, &dir_mat);
mat4_clear_trans(&dir_mat, &dir_mat);
break;
@@ -157,7 +157,7 @@ namespace Glitter {
mat4_rotate_z((float_t)-M_PI_2, &dir_mat);
break;
case DIRECTION_BILLBOARD_Y_AXIS:
mat4_rotate_y(((render_context*)GPM_VAL->rctx)->camera->rotation.y, &dir_mat);
mat4_rotate_y(GPM_VAL->cam.rotation_y, &dir_mat);
break;
default:
mult = false;
@@ -304,17 +304,17 @@ namespace Glitter {
return true;
}
void F2EmitterInst::InitMesh(GLT, int32_t index, vec3* scale,
vec3* position, vec3* direction, Random* random) {
void F2EmitterInst::InitMesh(GLT, int32_t index, vec3& scale,
vec3& position, vec3& direction, Random* random) {
switch (data.type) {
case EMITTER_BOX: {
vec3 dir;
vec3_mult(data.box.size, *scale, dir);
vec3_mult(data.box.size, scale, dir);
vec3_mult_scalar(dir, 0.5f, dir);
random->F2GetVec3(GLT_VAL, &dir, position);
random->F2GetVec3(GLT_VAL, dir, position);
} break;
case EMITTER_CYLINDER: {
float_t radius = data.cylinder.radius * scale->x;
float_t radius = data.cylinder.radius * scale.x;
if (!data.cylinder.on_edge)
radius = random->F2GetFloat(GLT_VAL, 0.0f, radius);
@@ -325,19 +325,19 @@ namespace Glitter {
dir.y = 0.0f;
dir.z = sinf(angle);
position->x = dir.x * radius;
position->y = random->F2GetFloat(GLT_VAL, data.cylinder.height * scale->y * 0.5f);
position->z = dir.z * radius;
position.x = dir.x * radius;
position.y = random->F2GetFloat(GLT_VAL, data.cylinder.height * scale.y * 0.5f);
position.z = dir.z * radius;
if (data.cylinder.direction == EMITTER_EMISSION_DIRECTION_OUTWARD)
*direction = dir;
direction = dir;
else if (data.cylinder.direction == EMITTER_EMISSION_DIRECTION_INWARD) {
const vec3 reverse_xz_dir = { -0.0f, 0.0f, -0.0f };
vec3_xor(dir, reverse_xz_dir, *direction);
vec3_xor(dir, reverse_xz_dir, direction);
}
} break;
case EMITTER_SPHERE: {
float_t radius = data.sphere.radius * scale->x;
float_t radius = data.sphere.radius * scale.x;
if (!data.sphere.on_edge)
radius = random->F2GetFloat(GLT_VAL, 0.0f, radius);
@@ -349,19 +349,19 @@ namespace Glitter {
dir.y = sinf(latitude);
dir.z = cosf(longitude) * cosf(latitude);
vec3_mult_scalar(dir, radius, *position);
vec3_mult_scalar(dir, radius, position);
if (data.sphere.direction == EMITTER_EMISSION_DIRECTION_OUTWARD)
*direction = dir;
direction = dir;
else if (data.sphere.direction == EMITTER_EMISSION_DIRECTION_INWARD)
vec3_negate(dir, *direction);
vec3_negate(dir, direction);
} break;
case EMITTER_POLYGON: {
float_t radius = data.polygon.size * scale->x;
float_t radius = data.polygon.size * scale.x;
float_t angle = (float_t)index * 360.0f
/ (float_t)data.polygon.count * DEG_TO_RAD_FLOAT + (float_t)M_PI_2;
position->x = sinf(angle) * radius;
position->y = 0.0f;
position.x = sinf(angle) * radius;
position.y = 0.0f;
} break;
}
}
@@ -381,17 +381,17 @@ namespace Glitter {
i->Reset();
}
void XEmitterInst::InitMesh(int32_t index, vec3* scale,
vec3* position, vec3* direction, Random* random) {
void XEmitterInst::InitMesh(int32_t index, vec3& scale,
vec3& position, vec3& direction, Random* random) {
switch (emitter->data.type) {
case EMITTER_BOX: {
vec3 dir;
vec3_mult(data.box.size, *scale, dir);
vec3_mult(data.box.size, scale, dir);
vec3_mult_scalar(dir, 0.5f, dir);
random->XGetVec3(&dir, position);
random->XGetVec3(dir, position);
} break;
case EMITTER_CYLINDER: {
float_t radius = data.cylinder.radius * scale->x;
float_t radius = data.cylinder.radius * scale.x;
if (!data.cylinder.on_edge)
radius = random->XGetFloat(0.0f, radius);
@@ -402,19 +402,19 @@ namespace Glitter {
dir.y = 0.0f;
dir.z = sinf(angle);
position->x = dir.x * radius;
position->y = random->XGetFloat(data.cylinder.height * scale->y * 0.5f);
position->z = dir.z * radius;
position.x = dir.x * radius;
position.y = random->XGetFloat(data.cylinder.height * scale.y * 0.5f);
position.z = dir.z * radius;
if (data.cylinder.direction == EMITTER_EMISSION_DIRECTION_OUTWARD)
*direction = dir;
direction = dir;
else if (data.cylinder.direction == EMITTER_EMISSION_DIRECTION_INWARD) {
const vec3 reverse_xz_dir = { -0.0f, 0.0f, -0.0f };
vec3_xor(dir, reverse_xz_dir, *direction);
vec3_xor(dir, reverse_xz_dir, direction);
}
} break;
case EMITTER_SPHERE: {
float_t radius = data.sphere.radius * scale->x;
float_t radius = data.sphere.radius * scale.x;
if (!data.sphere.on_edge)
radius = random->XGetFloat(0.0f, radius);
@@ -426,14 +426,14 @@ namespace Glitter {
dir.y = sinf(latitude);
dir.z = cosf(longitude) * cosf(latitude);
vec3_mult_scalar(dir, radius, *position);
vec3_mult_scalar(dir, radius, position);
if (data.sphere.direction == EMITTER_EMISSION_DIRECTION_OUTWARD)
*direction = dir;
direction = dir;
else if (data.sphere.direction == EMITTER_EMISSION_DIRECTION_INWARD)
vec3_negate(dir, *direction);
vec3_negate(dir, direction);
} break;
case EMITTER_POLYGON: {
float_t radius = data.polygon.size * scale->x;
float_t radius = data.polygon.size * scale.x;
float_t angle = ((float_t)index * 360.0f
/ (float_t)data.polygon.count + 90.0f) * DEG_TO_RAD_FLOAT;
@@ -442,11 +442,11 @@ namespace Glitter {
dir.y = 0.0f;
dir.z = sinf(angle);
vec3_mult_scalar(dir, radius, *position);
vec3_mult_scalar(dir, radius, position);
if (data.sphere.direction == EMITTER_EMISSION_DIRECTION_OUTWARD)
*direction = dir;
direction = dir;
else if (data.sphere.direction == EMITTER_EMISSION_DIRECTION_INWARD)
vec3_negate(dir, *direction);
vec3_negate(dir, direction);
} break;
}
}
@@ -547,11 +547,6 @@ namespace Glitter {
vec3_mult_scalar(data.rotation_add, delta_frame, rotation_add);
vec3_add(rotation, rotation_add, rotation);
vec3 trans = translation;
vec3 rot = rotation;
vec3 scale;
vec3_mult_scalar(this->scale, scale_all, scale);
vec3 trans_prev = vec3_null;
bool has_dist = false;
if (data.timer == EMITTER_TIMER_BY_DISTANCE && flags & EMITTER_INST_HAS_DISTANCE) {
@@ -559,61 +554,10 @@ namespace Glitter {
has_dist = true;
}
mat4 mat = eff_inst->mat;
mat4_translate_mult(&mat, trans.x, trans.y, trans.z, &mat);
mat4_normalize_rotation(&mat, &mat);
mat4 mat_rot;
if (data.direction == DIRECTION_EFFECT_ROTATION)
mat_rot = eff_inst->mat_rot_eff_rot;
else {
mat4_clear_rot(&mat, &mat);
mat_rot = eff_inst->mat_rot;
}
bool mult = true;
mat4 dir_mat;
switch (data.direction) {
case DIRECTION_BILLBOARD: {
if (eff_inst->data.flags & EFFECT_LOCAL) {
dir_mat = ((render_context*)GPM_VAL->rctx)->camera->view;
mat4_clear_trans(&dir_mat, &dir_mat);
mat4_mult(&dir_mat, &mat, &dir_mat);
}
else
dir_mat = mat;
mat4 inv_view_mat;
mat4_from_mat3(&((render_context*)GPM_VAL->rctx)->camera->inv_view_mat3, &inv_view_mat);
mat4_mult(&dir_mat, &inv_view_mat, &dir_mat);
mat4_clear_trans(&dir_mat, &dir_mat);
} break;
case DIRECTION_Y_AXIS:
mat4_rotate_y((float_t)M_PI_2, &dir_mat);
break;
case DIRECTION_X_AXIS:
mat4_rotate_x((float_t)-M_PI_2, &dir_mat);
break;
case DIRECTION_BILLBOARD_Y_AXIS:
mat4_rotate_y(((render_context*)GPM_VAL->rctx)->camera->rotation.y, &dir_mat);
break;
default:
mult = false;
break;
}
if (mult) {
mat4_mult(&dir_mat, &mat, &mat);
mat4_mult(&dir_mat, &mat_rot, &mat_rot);
}
mat4_rot(&mat, rot.x, rot.y, rot.z, &mat);
mat4_rot(&mat_rot, rot.x, rot.y, rot.z, &mat_rot);
mat4_scale_rot(&mat, scale.x, scale.y, scale.z, &mat);
this->mat = mat;
this->mat_rot = mat_rot;
CtrlMat(GPM_VAL, eff_inst);
if (has_dist) {
vec3 trans;
mat4_get_translation(&mat, &trans);
float_t trans_dist;
@@ -682,6 +626,68 @@ namespace Glitter {
enum_or(flags, EMITTER_INST_HAS_DISTANCE);
}
void XEmitterInst::CtrlMat(GPM, XEffectInst* eff_inst) {
vec3 trans = translation;
vec3 rot = rotation;
vec3 scale;
vec3_mult_scalar(this->scale, scale_all, scale);
mat4 mat = eff_inst->mat;
mat4_translate_mult(&mat, trans.x, trans.y, trans.z, &mat);
mat4 mat_rot;
if (data.direction == DIRECTION_EFFECT_ROTATION) {
mat4_normalize_rotation(&mat, &mat);
mat_rot = eff_inst->mat_rot_eff_rot;
}
else {
mat4_clear_rot(&mat, &mat);
mat_rot = eff_inst->mat_rot;
}
bool mult = true;
mat4 dir_mat;
switch (data.direction) {
case DIRECTION_BILLBOARD: {
if (eff_inst->data.flags & EFFECT_LOCAL) {
dir_mat = GPM_VAL->cam.view;
mat4_clear_trans(&dir_mat, &dir_mat);
mat4_mult(&dir_mat, &mat, &dir_mat);
}
else
dir_mat = mat;
mat4 inv_view_mat;
mat4_from_mat3(&GPM_VAL->cam.inv_view_mat3, &inv_view_mat);
mat4_mult(&dir_mat, &inv_view_mat, &dir_mat);
mat4_clear_trans(&dir_mat, &dir_mat);
} break;
case DIRECTION_Y_AXIS:
mat4_rotate_y((float_t)M_PI_2, &dir_mat);
break;
case DIRECTION_X_AXIS:
mat4_rotate_x((float_t)-M_PI_2, &dir_mat);
break;
case DIRECTION_BILLBOARD_Y_AXIS:
mat4_rotate_y(GPM_VAL->cam.rotation_y, &dir_mat);
break;
default:
mult = false;
break;
}
if (mult) {
mat4_mult(&dir_mat, &mat, &mat);
mat4_mult(&dir_mat, &mat_rot, &mat_rot);
}
mat4_rot(&mat, rot.x, rot.y, rot.z, &mat);
mat4_rot(&mat_rot, rot.x, rot.y, rot.z, &mat_rot);
mat4_scale_rot(&mat, scale.x, scale.y, scale.z, &mat);
this->mat = mat;
this->mat_rot = mat_rot;
}
void XEmitterInst::Emit(float_t delta_frame, float_t emission) {
if (frame < 0.0f) {
frame += delta_frame;
+2 -5
View File
@@ -5,7 +5,7 @@
#include "glitter.hpp"
#include "../../KKdLib/io/path.hpp"
#include "../../KKdLib/interpolation.h"
#include "../../KKdLib/interpolation.hpp"
#include "../../KKdLib/farc.hpp"
#include "../../KKdLib/str_utils.hpp"
#include "../data.hpp"
@@ -2365,10 +2365,7 @@ namespace Glitter {
ptcl->data.unk1 = unk1;
vec2_rcp(ptcl->data.split_uv, ptcl->data.split_uv);
vec4 color = ptcl->data.color;
vec4_mult_scalar(color, (float_t)(1.0 / 255.0), color);
ptcl->data.color = color;
vec4_mult_scalar(ptcl->data.color, (float_t)(1.0 / 255.0), ptcl->data.color);
int32_t uv_max_count = (int32_t)(split_u * split_v);
if (uv_max_count)
-36
View File
@@ -286,40 +286,4 @@ namespace Glitter {
if (t < 0.0f)
*angle = (float_t)M_PI - *angle;
}
void mat3_mult_axis_angle(const mat3* src, mat3* dst, const vec3* axis, const float_t angle) {
quat q1;
quat q2;
quat q3;
quat_from_mat3(src->row0.x, src->row1.x, src->row2.x, src->row0.y,
src->row1.y, src->row2.y, src->row0.z, src->row1.z, src->row2.z, &q1);
quat_from_axis_angle(axis, angle, &q2);
quat_mult(&q2, &q1, &q3);
mat3_from_quat(&q3, dst);
}
void mat4_mult_axis_angle(const mat4* src, mat4* dst, const vec3* axis, const float_t angle) {
quat q1;
quat q2;
quat q3;
float_t t0;
float_t t1;
float_t t2;
vec4 t3;
t0 = src->row0.w;
t1 = src->row1.w;
t2 = src->row2.w;
t3 = src->row3;
quat_from_mat3(src->row0.x, src->row1.x, src->row2.x, src->row0.y,
src->row1.y, src->row2.y, src->row0.z, src->row1.z, src->row2.z, &q1);
quat_from_axis_angle(axis, angle, &q2);
quat_mult(&q2, &q1, &q3);
mat4_from_quat(&q3, dst);
dst->row0.w = t0;
dst->row1.w = t1;
dst->row2.w = t2;
dst->row3 = t3;
}
}
+70 -30
View File
@@ -126,6 +126,12 @@ namespace Glitter {
DIRECTION_PARTICLE_ROTATION = 11,
};
enum DispType {
DISP_OPAQUE = 0,
DISP_NORMAL,
DISP_ALPHA,
};
enum EffectExtAnimFlag {
EFFECT_EXT_ANIM_SET_ONCE = 0x00001,
EFFECT_EXT_ANIM_TRANS_ONLY = 0x00002,
@@ -248,6 +254,12 @@ namespace Glitter {
EMITTER_POLYGON = 4,
};
enum FogType {
FOG_NONE = 0,
FOG_DEPTH,
FOG_HEIGHT,
};
enum KeyType {
KEY_CONSTANT = 0,
KEY_LINEAR = 1,
@@ -351,7 +363,7 @@ namespace Glitter {
SCENE_NONE = 0x00,
SCENE_FLAG_1 = 0x01,
SCENE_NOT_DISP = 0x02,
SCENE_FLAG_4 = 0x04,
SCENE_FLAG_3 = 0x04,
#if defined(CRE_DEV) || defined(CLOUD_DEV)
SCENE_EDITOR = 0x80,
#endif
@@ -376,6 +388,7 @@ namespace Glitter {
struct Animation;
struct Buffer;
struct Camera;
struct Curve;
class Effect;
class Emitter;
@@ -460,7 +473,18 @@ namespace Glitter {
struct Buffer {
vec3 position;
vec2 uv;
vec4u color;
vec4 color;
};
struct Camera {
mat4 projection;
mat4 view;
mat4 inv_view;
mat3 inv_view_mat3;
vec3 view_point;
float_t rotation_y;
Camera();
};
struct Curve {
@@ -635,7 +659,7 @@ namespace Glitter {
float_t F2GetFloat(GLT, float_t min, float_t max);
int32_t F2GetInt(GLT, int32_t value);
int32_t F2GetInt(GLT, int32_t min, int32_t max);
void F2GetVec3(GLT, vec3* src, vec3* dst);
void F2GetVec3(GLT, vec3& src, vec3& dst);
void F2StepValue();
int32_t GetValue();
void SetValue(int32_t value);
@@ -643,7 +667,7 @@ namespace Glitter {
float_t XGetFloat(float_t min, float_t max);
int32_t XGetInt(int32_t value);
int32_t XGetInt(int32_t min, int32_t max);
void XGetVec3(vec3* src, vec3* dst);
void XGetVec3(vec3& src, vec3& dst);
void XReset();
void XSetStep(uint8_t step);
void XStepValue();
@@ -676,8 +700,8 @@ namespace Glitter {
RenderElement* elements;
size_t max_count;
Random* random_ptr;
draw_pass_3d_type alpha;
fog_id fog;
DispType disp_type;
FogType fog_type;
GLuint vbo;
GLuint ebo;
float_t emission;
@@ -728,7 +752,7 @@ namespace Glitter {
void CalcDispQuadNormal(GPM,
F2RenderGroup* rend_group, mat4* model_mat, mat4* dir_mat);
void Ctrl(GLT, float_t delta_frame);
void Disp(GPM, draw_pass_3d_type alpha);
void Disp(GPM, DispType disp_type);
void Disp(GPM, F2RenderGroup* rend_group);
};
@@ -751,7 +775,7 @@ namespace Glitter {
void CalcDispQuadNormal(GPM,
XRenderGroup* rend_group, mat4* model_mat, mat4* dir_mat);
void Ctrl(float_t delta_frame, bool copy_mats);
void Disp(GPM, draw_pass_3d_type alpha);
void Disp(GPM, DispType disp_type);
void Disp(GPM, XRenderGroup* rend_group);
};
@@ -764,7 +788,7 @@ namespace Glitter {
Effect::Data data;
float_t frame0;
float_t frame1;
vec4u color;
vec4 color;
vec3 translation;
vec3 rotation;
vec3 scale;
@@ -773,7 +797,7 @@ namespace Glitter {
EffectInstFlag flags;
size_t id;
uint32_t random;
vec4u min_color;
vec4 min_color;
vec3 ext_anim_scale;
float_t some_scale;
@@ -783,16 +807,13 @@ namespace Glitter {
virtual void Copy(EffectInst* dst, float_t emission) = 0;
virtual void Ctrl(GPM, GLT, float_t delta_frame, float_t emission) = 0;
virtual void Disp(GPM, draw_pass_3d_type alpha) = 0;
virtual void Disp(GPM, DispType disp_type) = 0;
virtual void Free(GPM, GLT, float_t emission, bool free) = 0;
virtual size_t GetCtrlCount(ParticleType type) = 0;
virtual size_t GetDispCount(ParticleType type) = 0;
virtual bool HasEnded(bool a2) = 0;
virtual void Reset(GPM, GLT, float_t emission) = 0;
draw_pass_3d_type GetAlpha();
fog_id GetFog();
static int32_t GetExtAnimBoneIndex(EffectExtAnimCharaNode node);
};
@@ -830,7 +851,7 @@ namespace Glitter {
virtual void Copy(EffectInst* dst, float_t emission) override;
virtual void Ctrl(GPM, GLT, float_t delta_frame, float_t emission) override;
virtual void Disp(GPM, draw_pass_3d_type alpha) override;
virtual void Disp(GPM, DispType disp_type) override;
virtual void Free(GPM, GLT, float_t emission, bool free) override;
virtual size_t GetCtrlCount(ParticleType type) override;
virtual size_t GetDispCount(ParticleType type) override;
@@ -838,7 +859,11 @@ namespace Glitter {
virtual void Reset(GPM, GLT, float_t emission) override;
void CtrlInit(GPM, GLT, float_t emission);
void CtrlMat(GPM, GLT);
DispType GetDispType();
void GetExtAnim();
bool GetExtAnimMat(mat4* mat);
FogType GetFog();
void GetValue(GLT);
void SetMinColor(float_t& r, float_t& g, float_t& b, float_t& a);
};
@@ -881,7 +906,7 @@ namespace Glitter {
virtual void Copy(EffectInst* dst, float_t emission) override;
virtual void Ctrl(GPM, GLT, float_t delta_frame, float_t emission) override;
virtual void Disp(GPM, draw_pass_3d_type alpha) override;
virtual void Disp(GPM, DispType disp_type) override;
virtual void Free(GPM, GLT, float_t emission, bool free) override;
virtual size_t GetCtrlCount(ParticleType type) override;
virtual size_t GetDispCount(ParticleType type) override;
@@ -889,8 +914,12 @@ namespace Glitter {
virtual void Reset(GPM, GLT, float_t emission) override;
void CalcDisp(GPM);
void CtrlInit(float_t emission);
void CtrlInit(GPM, float_t emission);
void CtrlMat(GPM);
DispType GetDispType();
void GetExtAnim();
bool GetExtAnimMat(mat4* mat);
FogType GetFog();
void GetValue();
void SetExtAnim(mat4* a2, mat4* a3, vec3* trans, bool set_flags);
void SetMinColor(float_t& r, float_t& g, float_t& b, float_t& a);
@@ -900,6 +929,8 @@ namespace Glitter {
public:
struct Box {
vec3 size;
Box();
};
struct Cylinder {
@@ -909,12 +940,16 @@ namespace Glitter {
float_t end_angle;
bool on_edge;
EmitterEmissionDirection direction;
Cylinder();
};
struct Polygon {
float_t size;
int32_t count;
EmitterEmissionDirection direction;
Polygon();
};
struct Sphere {
@@ -923,6 +958,8 @@ namespace Glitter {
float_t longitude;
bool on_edge;
EmitterEmissionDirection direction;
Sphere();
};
struct Data {
@@ -943,6 +980,8 @@ namespace Glitter {
Emitter::Sphere sphere;
Emitter::Polygon polygon;
int32_t seed;
Data();
};
Emitter::Data data;
@@ -993,8 +1032,8 @@ namespace Glitter {
void Free(GPM, GLT, float_t emission, bool free);
void GetValue(GLT);
bool HasEnded(bool a2);
void InitMesh(GLT, int32_t index, vec3* scale,
vec3* position, vec3* direction, Random* random);
void InitMesh(GLT, int32_t index, vec3& scale,
vec3& position, vec3& direction, Random* random);
void Reset();
};
@@ -1010,13 +1049,14 @@ namespace Glitter {
void Copy(XEmitterInst* dst, float_t emission);
void Ctrl(GPM, XEffectInst* eff_inst, float_t delta_frame);
void CtrlInit(XEffectInst* eff_inst, float_t delta_frame);
void CtrlMat(GPM, XEffectInst* eff_inst);
void Emit(float_t delta_frame, float_t emission);
void EmitParticle(float_t emission);
void Free(float_t emission, bool free);
void GetValue();
bool HasEnded(bool a2);
void InitMesh(int32_t index, vec3* scale,
vec3* position, vec3* direction, Random* random);
void InitMesh(int32_t index, vec3& scale,
vec3& position, vec3& direction, Random* random);
uint8_t RandomGetStep();
void RandomStepValue();
void Reset();
@@ -1068,7 +1108,7 @@ namespace Glitter {
struct LocusHistory {
struct Data {
vec4u color;
vec4 color;
vec3 translation;
float_t scale;
};
@@ -1121,7 +1161,7 @@ namespace Glitter {
float_t reflection_coeff;
float_t reflection_coeff_random;
float_t rebound_plane_y;
vec4u color;
vec4 color;
UVIndexType uv_index_type;
int32_t uv_index;
int32_t frame_step_uv;
@@ -1283,7 +1323,7 @@ namespace Glitter {
XEmitterInst* emit_inst, int32_t dup_count, int32_t count);
void Free();
void FreeData();
bool GetEmitterScale(vec3* emitter_scale);
bool GetEmitterScale(vec3& emitter_scale);
bool GetExtAnimScale(vec3* ext_anim_scale, float_t* some_scale);
static mat4 RotateMeshToEmitPosition(XRenderGroup* rend_group,
@@ -1308,7 +1348,7 @@ namespace Glitter {
float_t speed;
float_t deceleration;
vec2 uv;
vec4u color;
vec4 color;
vec3 base_translation;
vec3 base_direction;
vec3 translation;
@@ -1330,6 +1370,8 @@ namespace Glitter {
uint32_t random;
uint8_t step;
RenderElement();
void InitLocusHistory(GLT, F2ParticleInst* ptcl_inst, Random* random);
void InitLocusHistory(XParticleInst* ptcl_inst, Random* random);
void InitMesh(GLT, F2EmitterInst* emit_inst,
@@ -1378,7 +1420,7 @@ namespace Glitter {
#endif
bool Copy(Glitter::EffectInst* eff_inst, Glitter::Scene* dst);
void Ctrl(GPM, float_t delta_frame);
void Disp(GPM, draw_pass_3d_type alpha);
void Disp(GPM, DispType disp_type);
size_t GetCtrlCount(ParticleType ptcl_type);
size_t GetDispCount(ParticleType ptcl_type);
void GetFrame(float_t* frame, int32_t* life_time);
@@ -1401,9 +1443,9 @@ namespace Glitter {
EffectInst* effect;
EmitterInst* emitter;
ParticleInst* particle;
void* rctx;
void* bone_data;
FrameRateControl* frame_rate;
Camera cam;
ParticleManagerFlag flags;
int32_t scene_load_counter;
float_t emission;
@@ -1433,7 +1475,7 @@ namespace Glitter {
int32_t CounterGet();
void CounterIncrement();
void CtrlScenes();
void Disp(draw_pass_3d_type draw_pass_type);
void DispScenes(DispType disp_type);
void FreeEffects();
void FreeSceneEffect(SceneCounter scene_counter, uint64_t hash, bool force_kill);
void FreeScenes();
@@ -1471,8 +1513,6 @@ namespace Glitter {
};
extern void axis_angle_from_vectors(vec3* axis, float_t* angle, const vec3* vec0, const vec3* vec1);
extern void mat3_mult_axis_angle(const mat3* src, mat3* dst, const vec3* axis, const float_t angle);
extern void mat4_mult_axis_angle(const mat4* src, mat4* dst, const vec3* axis, const float_t angle);
extern GltParticleManager glt_particle_manager;
}
+1 -1
View File
@@ -11,7 +11,7 @@ namespace Glitter {
data.pivot = PIVOT_MIDDLE_CENTER;
data.scale = vec3_identity;
data.reflection_coeff = 1.0f;
data.color = vec4u_identity;
data.color = vec4_identity;
data.uv_index = 0;
data.uv_index_start = 0;
data.uv_index_end = 1;
+18 -10
View File
@@ -34,11 +34,12 @@ namespace Glitter {
if (data.data.type != PARTICLE_LOCUS) {
F2RenderGroup* rend_group = new F2RenderGroup(this);
if (rend_group) {
rend_group->alpha = eff_inst->GetAlpha();
rend_group->fog = eff_inst->GetFog();
rend_group->disp_type = eff_inst->GetDispType();
rend_group->fog_type = eff_inst->GetFog();
if (data.data.type == PARTICLE_QUAD
&& data.data.blend_mode == PARTICLE_BLEND_PUNCH_THROUGH)
rend_group->alpha = DRAW_PASS_3D_OPAQUE;
rend_group->disp_type = DISP_OPAQUE;
if (data.data.emission >= min_emission)
rend_group->emission = data.data.emission;
@@ -46,6 +47,7 @@ namespace Glitter {
rend_group->emission = eff_inst->data.emission;
else
rend_group->emission = emission;
data.render_group = rend_group;
eff_inst->render_scene.Append(rend_group);
}
@@ -68,15 +70,18 @@ namespace Glitter {
F2RenderGroup* rend_group = new F2RenderGroup(this);
if (rend_group) {
F2EffectInst* effect = parent->data.effect;
rend_group->alpha = effect->GetAlpha();
rend_group->fog = effect->GetFog();
rend_group->disp_type = effect->GetDispType();
rend_group->fog_type = effect->GetFog();
if (data.data.blend_mode == PARTICLE_BLEND_PUNCH_THROUGH
&& data.data.type == PARTICLE_QUAD)
rend_group->alpha = DRAW_PASS_3D_OPAQUE;
rend_group->disp_type = DISP_OPAQUE;
if (effect->data.emission >= min_emission)
rend_group->emission = effect->data.emission;
else
rend_group->emission = emission;
data.render_group = rend_group;
effect->render_scene.Append(rend_group);
}
@@ -485,8 +490,8 @@ namespace Glitter {
if (data.data.type == PARTICLE_QUAD || data.data.type == PARTICLE_MESH) {
XRenderGroup* rend_group = new XRenderGroup(this);
if (rend_group) {
rend_group->alpha = eff_inst->GetAlpha();
rend_group->fog = eff_inst->GetFog();
rend_group->disp_type = eff_inst->GetDispType();
rend_group->fog_type = eff_inst->GetFog();
if (data.data.draw_flags & PARTICLE_DRAW_NO_BILLBOARD_CULL)
rend_group->use_culling = false;
@@ -499,6 +504,7 @@ namespace Glitter {
rend_group->emission = eff_inst->data.emission;
else
rend_group->emission = emission;
data.render_group = rend_group;
eff_inst->render_scene.Append(rend_group);
}
@@ -521,12 +527,14 @@ namespace Glitter {
XRenderGroup* rend_group = new XRenderGroup(this);
if (rend_group) {
XEffectInst* effect = (XEffectInst*)parent->data.effect;
rend_group->alpha = effect->GetAlpha();
rend_group->fog = effect->GetFog();
rend_group->disp_type = effect->GetDispType();
rend_group->fog_type = effect->GetFog();
if (effect->data.emission >= min_emission)
rend_group->emission = effect->data.emission;
else
rend_group->emission = emission;
data.render_group = rend_group;
effect->render_scene.Append(rend_group);
}
+26 -5
View File
@@ -4,13 +4,24 @@
*/
#include "glitter.hpp"
#include "../render_context.hpp"
extern render_context* rctx_ptr;
namespace Glitter {
GltParticleManager glt_particle_manager;
GltParticleManager::GltParticleManager() :scene(), effect(), emitter(), particle(), rctx(),
bone_data(), frame_rate(), flags(), scene_load_counter(), emission(1.5f), delta_frame(2.0f),
texture_counter(), random(), counter(), draw_all(true), draw_all_mesh(true), draw_selected() {
Camera::Camera() : rotation_y() {
}
GltParticleManager::GltParticleManager() :scene(), effect(), emitter(), particle(),
bone_data(), frame_rate(), cam(), flags(), scene_load_counter(),
texture_counter(), random(), counter(), draw_selected() {
emission = 1.5f;
delta_frame = 2.0f;
draw_all = true;
draw_all_mesh = true;
scenes.reserve(0x100);
file_readers.reserve(0x100);
}
@@ -43,6 +54,16 @@ namespace Glitter {
delta_frame = frame_rate->GetDeltaFrame();
else
delta_frame = get_delta_frame();
camera* c = rctx_ptr->camera;
c->update();
cam.projection = c->projection;
cam.view = c->view;
cam.inv_view = c->inv_view;
cam.inv_view_mat3 = c->inv_view_mat3;
cam.view_point = c->view_point;
cam.rotation_y = c->rotation.y;
CtrlScenes();
}
return false;
@@ -157,7 +178,7 @@ namespace Glitter {
}
}
void GltParticleManager::Disp(draw_pass_3d_type draw_pass_type) {
void GltParticleManager::DispScenes(DispType disp_type) {
if (flags & PARTICLE_MANAGER_NOT_DISP)
return;
@@ -169,7 +190,7 @@ namespace Glitter {
if (draw_selected && scene && scene != i)
continue;
#endif
i->Disp(this, draw_pass_type);
i->Disp(this, disp_type);
}
}
+6 -6
View File
@@ -1298,7 +1298,7 @@ namespace Glitter {
return val % (max - min) + min;
}
void Random::F2GetVec3(GLT, vec3* src, vec3* dst) {
void Random::F2GetVec3(GLT, vec3& src, vec3& dst) {
vec3 val;
switch (GLT_VAL) {
default:
@@ -1315,9 +1315,9 @@ namespace Glitter {
}
vec3 t;
vec3_add(*src, *src, t);
vec3_add(src, src, t);
vec3_mult(val, t, val);
vec3_sub(val, *src, *dst);
vec3_sub(val, src, dst);
}
void Random::F2StepValue() {
@@ -1358,7 +1358,7 @@ namespace Glitter {
return val % (max - min) + min;
}
void Random::XGetVec3(vec3* src, vec3* dst) {
void Random::XGetVec3(vec3& src, vec3& dst) {
vec3 val;
val.x = *(float_t*)&x_float_table[value % 0x169];
value += step;
@@ -1368,9 +1368,9 @@ namespace Glitter {
value += step;
vec3 t;
vec3_add(*src, *src, t);
vec3_add(src, src, t);
vec3_mult(val, t, val);
vec3_sub(val, *src, *dst);
vec3_sub(val, src, dst);
}
void Random::XReset() {
+12 -6
View File
@@ -6,6 +6,12 @@
#include "glitter.hpp"
namespace Glitter {
RenderElement::RenderElement() : alive(), uv_index(), disp(), frame(), life_time(),
rebound_time(), frame_step_uv(), base_speed(), speed(), deceleration(),
scale_all(), fade_out_frames(), fade_in_frames(), locus_history(), random(), step() {
}
void RenderElement::InitLocusHistory(GLT, F2ParticleInst* ptcl_inst, Random* random) {
if (ptcl_inst->data.data.type == PARTICLE_LOCUS) {
uint32_t locus_history_size = random->F2GetInt(GLT_VAL,
@@ -45,7 +51,7 @@ namespace Glitter {
vec3_mult_scalar(emit_inst->scale, emit_inst->scale_all, scale);
vec3 position = vec3_null;
emit_inst->InitMesh(GLT_VAL, index, &scale, &position, &direction, random);
emit_inst->InitMesh(GLT_VAL, index, scale, position, direction, random);
if (~ptcl_inst_data->data.flags & PARTICLE_EMITTER_LOCAL)
mat4_mult_vec3(&emit_inst->mat_rot, &position, &position);
@@ -55,7 +61,7 @@ namespace Glitter {
translation_prev = base_translation;
vec3 direction_random;
random->F2GetVec3(GLT_VAL, &ptcl_inst_data->data.direction_random, &direction_random);
random->F2GetVec3(GLT_VAL, ptcl_inst_data->data.direction_random, direction_random);
vec3_add(direction, direction_random, direction);
vec3_normalize(direction, direction);
@@ -72,7 +78,7 @@ namespace Glitter {
this->deceleration = max(deceleration * 60.0f, 0.0f);
vec3 acceleration;
random->F2GetVec3(GLT_VAL, &ptcl_inst_data->data.acceleration_random, &acceleration);
random->F2GetVec3(GLT_VAL, ptcl_inst_data->data.acceleration_random, acceleration);
vec3_add(acceleration, ptcl_inst_data->data.acceleration, acceleration);
vec3_add(acceleration, ptcl_inst_data->data.gravity, this->acceleration);
}
@@ -92,7 +98,7 @@ namespace Glitter {
vec3_mult_scalar(emit_inst->scale, emit_inst->scale_all, scale);
vec3 position = vec3_null;
emit_inst->InitMesh(index, &scale, &position, &direction, random);
emit_inst->InitMesh(index, scale, position, direction, random);
if (~ptcl_inst_data->data.flags & PARTICLE_EMITTER_LOCAL)
mat4_mult_vec3(&emit_inst->mat_rot, &position, &position);
@@ -102,7 +108,7 @@ namespace Glitter {
translation_prev = base_translation;
vec3 direction_random;
random->XGetVec3(&ptcl_inst_data->data.direction_random, &direction_random);
random->XGetVec3(ptcl_inst_data->data.direction_random, direction_random);
vec3_add(direction, direction_random, direction);
vec3_normalize(direction, direction);
@@ -120,7 +126,7 @@ namespace Glitter {
this->deceleration = max(deceleration, 0.0f);
vec3 acceleration;
random->XGetVec3(&ptcl_inst_data->data.acceleration_random, &acceleration);
random->XGetVec3(ptcl_inst_data->data.acceleration_random, acceleration);
vec3_add(acceleration, ptcl_inst_data->data.acceleration, acceleration);
vec3_add(acceleration, ptcl_inst_data->data.gravity, this->acceleration);
}
+10 -13
View File
@@ -9,14 +9,14 @@
namespace Glitter {
RenderGroup::RenderGroup() : flags(), type(), draw_type(), pivot(),
z_offset(), count(), ctrl(), disp(), texture(), mask_texture(), frame(),
elements(), max_count(), random_ptr(), alpha(), fog(), vbo(), ebo() {
elements(), max_count(), random_ptr(), disp_type(), fog_type(), vbo(), ebo() {
split_u = 1;
split_v = 1;
split_uv = vec2_identity;
mat = mat4_identity;
mat_rot = mat4_identity;
mat_draw = mat4_identity;
alpha = DRAW_PASS_3D_TRANSLUCENT;
disp_type = DISP_NORMAL;
emission = 1.0f;
blend_mode = PARTICLE_BLEND_TYPICAL;
mask_blend_mode = PARTICLE_BLEND_TYPICAL;
@@ -611,20 +611,17 @@ namespace Glitter {
DeleteBuffers(true);
}
bool XRenderGroup::GetEmitterScale(vec3* emitter_scale) {
*emitter_scale = vec3_identity;
bool XRenderGroup::GetEmitterScale(vec3& emitter_scale) {
if (particle) {
XEmitterInst* emitter = particle->data.emitter;
if (emitter) {
vec3_mult_scalar(emitter->scale, emitter->scale_all, *emitter_scale);
float_t length;
vec3_length(*emitter_scale, length);
return length > 0.000001f;
Glitter::EmitterInst* emit_inst = particle->data.emitter;
if (emit_inst) {
vec3_mult_scalar(emit_inst->scale, emit_inst->scale_all, emitter_scale);
return emitter_scale.x > 0.000001f || emitter_scale.y > 0.000001f || emitter_scale.z > 0.000001f;
}
}
return true;
emitter_scale = vec3_identity;
return false;
}
bool XRenderGroup::GetExtAnimScale(vec3* ext_anim_scale, float_t* some_scale) {
+103 -106
View File
@@ -11,6 +11,8 @@
#include "../shader_ft.hpp"
#include "../static_var.hpp"
extern render_context* rctx_ptr;
namespace Glitter {
RenderScene::RenderScene() : ctrl_quad(), ctrl_line(), ctrl_locus(),
ctrl_mesh(), disp_quad(), disp_line(), disp_locus(), disp_mesh() {
@@ -281,9 +283,9 @@ namespace Glitter {
vec3 x_vec = { 1.0f, 0.0f, 0.0f };
if (rend_group->flags & PARTICLE_LOCAL) {
mat4 mat;
mat4_mult(&((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat, &mat);
mat4_mult(&((render_context*)GPM_VAL->rctx)->camera->view, &mat, &mat);
mat4_mult(&mat, &((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat_draw);
mat4_mult(&GPM_VAL->cam.inv_view, &rend_group->mat, &mat);
mat4_mult(&GPM_VAL->cam.view, &mat, &mat);
mat4_mult(&mat, &GPM_VAL->cam.inv_view, &rend_group->mat_draw);
}
else
rend_group->mat_draw = mat4_identity;
@@ -311,7 +313,7 @@ namespace Glitter {
else
model_mat = mat3_identity;
mat3_mult_vec(&((render_context*)GPM_VAL->rctx)->camera->inv_view_mat3, &x_vec, &x_vec);
mat3_mult_vec(&GPM_VAL->cam.inv_view_mat3, &x_vec, &x_vec);
gl_state_bind_array_buffer(rend_group->vbo);
Buffer* buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
@@ -411,13 +413,13 @@ namespace Glitter {
if (rend_group->flags & PARTICLE_EMITTER_LOCAL) {
model_mat = rend_group->mat;
mat4_normalize_rotation(&model_mat, &view_mat);
mat4_mult(&view_mat, &((render_context*)GPM_VAL->rctx)->camera->view, &view_mat);
mat4_mult(&view_mat, &GPM_VAL->cam.view, &view_mat);
mat4_inverse(&view_mat, &inv_view_mat);
}
else {
model_mat = mat4_identity;
view_mat = ((render_context*)GPM_VAL->rctx)->camera->view;
inv_view_mat = ((render_context*)GPM_VAL->rctx)->camera->inv_view;
view_mat = GPM_VAL->cam.view;
inv_view_mat = GPM_VAL->cam.inv_view;
}
if (rend_group->flags & PARTICLE_LOCAL) {
@@ -426,7 +428,7 @@ namespace Glitter {
mat4_inverse(&view_mat, &inv_view_mat);
}
mat4_mult(&view_mat, &((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat_draw);
mat4_mult(&view_mat, &GPM_VAL->cam.inv_view, &rend_group->mat_draw);
mat4 dir_mat;
switch (rend_group->draw_type) {
@@ -456,7 +458,7 @@ namespace Glitter {
mat4_rotate_z((float_t)-M_PI_2, &dir_mat);
break;
case DIRECTION_BILLBOARD_Y_AXIS:
mat4_rotate_y(((render_context*)GPM_VAL->rctx)->camera->rotation.y, &dir_mat);
mat4_rotate_y(GPM_VAL->cam.rotation_y, &dir_mat);
break;
default:
dir_mat = mat4_identity;
@@ -607,7 +609,7 @@ namespace Glitter {
if (fabsf(rend_group->z_offset) > 0.000001f) {
use_z_offset = true;
mat4_get_translation(model_mat, &dist_to_cam);
vec3_sub(((render_context*)GPM_VAL->rctx)->camera->view_point, dist_to_cam, dist_to_cam);
vec3_sub(GPM_VAL->cam.view_point, dist_to_cam, dist_to_cam);
if (rend_group->flags & PARTICLE_EMITTER_LOCAL) {
mat4_normalize_rotation(model_mat, &z_offset_inv_mat);
mat4_inverse(&z_offset_inv_mat, &z_offset_inv_mat);
@@ -830,7 +832,7 @@ namespace Glitter {
gl_state_bind_array_buffer(0);
}
void F2RenderScene::Disp(GPM, draw_pass_3d_type alpha) {
void F2RenderScene::Disp(GPM, DispType disp_type) {
disp_quad = 0;
disp_line = 0;
disp_locus = 0;
@@ -844,7 +846,7 @@ namespace Glitter {
continue;
F2RenderGroup* rend_group = i;
if ((rend_group)->alpha != alpha
if ((rend_group)->disp_type != disp_type
|| (rend_group->CannotDisp() && !GPM_VAL->draw_all))
continue;
@@ -951,14 +953,14 @@ namespace Glitter {
switch (rend_group->type) {
case PARTICLE_QUAD:
switch (rend_group->fog) {
switch (rend_group->fog_type) {
default:
uniform_value[U_FOG_HEIGHT] = 0;
break;
case FOG_DEPTH:
case Glitter::FOG_DEPTH:
uniform_value[U_FOG_HEIGHT] = 1;
break;
case FOG_HEIGHT:
case Glitter::FOG_HEIGHT:
uniform_value[U_FOG_HEIGHT] = 2;
break;
}
@@ -970,7 +972,7 @@ namespace Glitter {
gl_state_set_depth_mask(GL_TRUE);
}
else {
uniform_value[U_ALPHA_BLEND] = rend_group->alpha != DRAW_PASS_3D_OPAQUE ? 2 : 0;
uniform_value[U_ALPHA_BLEND] = rend_group->disp_type ? 2 : 0;
gl_state_enable_depth_test();
gl_state_set_depth_func(GL_LESS);
gl_state_set_depth_mask(GL_FALSE);
@@ -1010,9 +1012,7 @@ namespace Glitter {
emission = rend_group->emission;
shaders_ft.state_material_set_emission(false, emission, emission, emission, 1.0f);
shaders_ft.state_matrix_set_mvp(rend_group->mat_draw,
((render_context*)GPM_VAL->rctx)->camera->view,
((render_context*)GPM_VAL->rctx)->camera->projection);
shaders_ft.state_matrix_set_mvp(rend_group->mat_draw, GPM_VAL->cam.view, GPM_VAL->cam.projection);
shaders_ft.state_matrix_set_texture(0, mat4_identity);
shaders_ft.state_matrix_set_texture(1, mat4_identity);
shaders_ft.env_vert_set(3, vec4_identity);
@@ -1176,7 +1176,7 @@ namespace Glitter {
bool has_scale = false;
vec3 scale = vec3_null;
if (rend_group->flags & PARTICLE_EMITTER_LOCAL) {
rend_group->GetEmitterScale(&scale);
rend_group->GetEmitterScale(scale);
if (!(has_scale |= fabsf(scale.x) > 0.000001f ? true : false))
scale.x = 0.0f;
if (!(has_scale |= fabsf(scale.y) > 0.000001f ? true : false))
@@ -1258,9 +1258,9 @@ namespace Glitter {
vec3 x_vec = { 1.0f, 0.0f, 0.0f };
if (rend_group->flags & PARTICLE_LOCAL) {
mat4 mat;
mat4_mult(&((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat, &mat);
mat4_mult(&((render_context*)GPM_VAL->rctx)->camera->view, &mat, &mat);
mat4_mult(&mat, &((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat_draw);
mat4_mult(&GPM_VAL->cam.inv_view, &rend_group->mat, &mat);
mat4_mult(&GPM_VAL->cam.view, &mat, &mat);
mat4_mult(&mat, &GPM_VAL->cam.inv_view, &rend_group->mat_draw);
}
else
rend_group->mat_draw = mat4_identity;
@@ -1286,7 +1286,7 @@ namespace Glitter {
else
model_mat = mat3_identity;
mat3_mult_vec(&((render_context*)GPM_VAL->rctx)->camera->inv_view_mat3, &x_vec, &x_vec);
mat3_mult_vec(&GPM_VAL->cam.inv_view_mat3, &x_vec, &x_vec);
gl_state_bind_array_buffer(rend_group->vbo);
Buffer* buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
@@ -1389,31 +1389,29 @@ namespace Glitter {
if (rend_group->flags & PARTICLE_EMITTER_LOCAL) {
model_mat = rend_group->mat;
mat4_normalize_rotation(&model_mat, &view_mat);
mat4_mult(&view_mat, &((render_context*)GPM_VAL->rctx)->camera->view, &view_mat);
mat4_mult(&view_mat, &GPM_VAL->cam.view, &view_mat);
mat4_inverse(&view_mat, &inv_view_mat);
emitter_local = true;
if (rend_group->flags & PARTICLE_SCALE) {
rend_group->GetEmitterScale(&emit_scale);
if (fabsf(emit_scale.x) > 0.000001f
|| fabsf(emit_scale.y) > 0.000001f || fabsf(emit_scale.z) > 0.000001f)
if (rend_group->GetEmitterScale(emit_scale))
has_scale = true;
}
}
else {
model_mat = mat4_identity;
view_mat = ((render_context*)GPM_VAL->rctx)->camera->view;
inv_view_mat = ((render_context*)GPM_VAL->rctx)->camera->inv_view;
view_mat = GPM_VAL->cam.view;
inv_view_mat = GPM_VAL->cam.inv_view;
}
bool draw_local = false;
bool local = false;
if (rend_group->flags & PARTICLE_LOCAL) {
mat4_mult(&inv_view_mat, &rend_group->mat, &inv_view_mat);
mat4_mult(&view_mat, &inv_view_mat, &view_mat);
mat4_inverse(&view_mat, &inv_view_mat);
draw_local = true;
local = true;
}
mat4_mult(&view_mat, &((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat_draw);
mat4_mult(&view_mat, &GPM_VAL->cam.inv_view, &rend_group->mat_draw);
mat4 dir_mat = mat4_identity;
vec3 up_vec = { 0.0f, 0.0f, 1.0f };
@@ -1444,13 +1442,43 @@ namespace Glitter {
mat4_rotate_x((float_t)-M_PI_2, &dir_mat);
break;
case DIRECTION_BILLBOARD_Y_AXIS:
mat4_rotate_y(((render_context*)GPM_VAL->rctx)->camera->rotation.y, &dir_mat);
mat4_rotate_y(GPM_VAL->cam.rotation_y, &dir_mat);
break;
case DIRECTION_EMITTER_ROTATION:
emitter_rotation = true;
break;
}
Particle* particle = rend_group->particle->data.particle;
object_info object_info;
object_info.set_id = (uint32_t)particle->data.mesh.object_set_name_hash;
object_info.id = (uint32_t)particle->data.mesh.object_name_hash;
obj* obj = object_storage_get_obj(object_info);
if (!obj)
return;
texture_transform_struct tex_trans[2];
int32_t tex_trans_count = 0;
for (texture_transform_struct& i : tex_trans) {
tex_trans->id = hash_murmurhash_empty;
tex_trans->mat = mat4_identity;
}
obj_material& material = obj->material_array[0].material;
for (obj_material_texture_data& i : material.texdata) {
if (i.tex_index == hash_murmurhash_empty || i.tex_index == hash_murmurhash_null)
continue;
tex_trans[tex_trans_count].id = i.tex_index;
tex_trans[tex_trans_count].mat = mat4_identity;
tex_trans_count++;
if (++tex_trans_count == 2)
break;
}
vec3 ext_anim_scale;
float_t some_scale = 0.0f;
if (rend_group->GetExtAnimScale(&ext_anim_scale, &some_scale)) {
@@ -1467,8 +1495,8 @@ namespace Glitter {
vec3_add(emit_scale, ext_anim_scale, emit_scale);
}
render_context* rctx = (render_context*)GPM_VAL->rctx;
object_data* object_data = &rctx->object_data;
object_data* object_data = &rctx_ptr->object_data;
object_data->set_texture_pattern(0, 0);
RenderElement* elem = rend_group->elements;
size_t disp = 0;
@@ -1494,80 +1522,51 @@ namespace Glitter {
mat4 mat;
if (billboard) {
if (draw_local)
if (local)
mat = mat4_identity;
else
mat = dir_mat;
}
else if (rotate_func)
else if (rotate_func) {
mat = rotate_func(rend_group, elem, &up_vec, &trans);
}
else if (emitter_rotation)
mat = elem->mat;
else
mat = dir_mat;
mat = mat4_identity;
mat4_rotate(rot.x, rot.y, rot.z, &mat);
mat4_scale_rot(&mat, scale.x, scale.y, scale.z, &mat);
mat4_set_translation(&mat, &trans);
mat4_rot(&mat, rot.x, rot.y, rot.z, &mat);
mat4_scale_rot(&mat, scale.x, scale.y, scale.z, &mat);
mat4 uv_mat[2];
mat4_translate(elem->uv_scroll.x, -elem->uv_scroll.y, 0.0f, &uv_mat[0]);
mat4_translate(elem->uv_scroll_2nd.x, -elem->uv_scroll_2nd.y, 0.0f, &uv_mat[1]);
Particle* particle = rend_group->particle->data.particle;
object_info object_info;
object_info.set_id = (uint32_t)particle->data.mesh.object_set_name_hash;
object_info.id = (uint32_t)particle->data.mesh.object_name_hash;
obj* obj = object_storage_get_obj(object_info);
if (!obj)
continue;
vec3 uv_scroll;
vec3 uv_scroll_2nd;
uv_scroll.x = elem->uv_scroll.x;
uv_scroll.y = -elem->uv_scroll.y;
uv_scroll.z = 0.0f;
uv_scroll_2nd.x = elem->uv_scroll_2nd.x;
uv_scroll_2nd.y = -elem->uv_scroll_2nd.y;
uv_scroll_2nd.z = 0.0f;
object_data->texture_pattern_count = 0;
int32_t ttc = 0;
texture_transform_struct* tt = object_data->texture_transform_array;
for (uint32_t i = 0; i < obj->num_mesh; i++) {
obj_mesh* mesh = &obj->mesh_array[i];
for (uint32_t j = 0; j < mesh->num_submesh; j++) {
obj_sub_mesh* sub_mesh = &mesh->submesh_array[j];
obj_material* material = &obj->material_array[sub_mesh->material_index].material;
mat4_set_translation(&tex_trans[0].mat, &uv_scroll);
mat4_set_translation(&tex_trans[1].mat, &uv_scroll_2nd);
int32_t l = 0;
for (obj_material_texture_data& k : material->texdata) {
obj_material_texture_data* texture = &k;
if (texture->shader_info.m.tex_type != OBJ_MATERIAL_TEXTURE_COLOR)
continue;
object_data->set_texture_transform(tex_trans_count, tex_trans);
tt->id = texture->tex_index;
tt->mat = uv_mat[l];
ttc++;
tt++;
if (local)
mat4_mult(&mat, &GPM_VAL->cam.inv_view, &mat);
if (++l == 2 || ttc == 24)
break;
}
if (ttc == 24)
break;
}
if (ttc == 24)
break;
}
object_data->texture_transform_count = ttc;
if (rend_group->flags & PARTICLE_LOCAL)
mat4_mult(&mat, &((render_context*)GPM_VAL->rctx)->camera->inv_view, &mat);
vec4u color = elem->color;
if (draw_task_add_draw_object_by_object_info_color(rctx, &mat,
vec4& color = elem->color;
if (draw_task_add_draw_object_by_object_info_color(rctx_ptr, &mat,
object_info, color.x, color.y, color.z, color.w))
disp++;
elem->mat_draw = mat;
object_data->texture_pattern_count = 0;
object_data->texture_transform_count = 0;
object_data->set_texture_transform(0, 0);
}
}
object_data->set_texture_pattern(0, 0);
rend_group->disp = disp;
}
@@ -1587,13 +1586,13 @@ namespace Glitter {
mat4_clear_rot(&rend_group->mat, &view_mat);
else
mat4_normalize_rotation(&rend_group->mat, &view_mat);
mat4_mult(&view_mat, &((render_context*)GPM_VAL->rctx)->camera->view, &view_mat);
mat4_mult(&view_mat, &GPM_VAL->cam.view, &view_mat);
mat4_inverse(&view_mat, &inv_view_mat);
}
else {
model_mat = mat4_identity;
view_mat = ((render_context*)GPM_VAL->rctx)->camera->view;
inv_view_mat = ((render_context*)GPM_VAL->rctx)->camera->inv_view;
view_mat = GPM_VAL->cam.view;
inv_view_mat = GPM_VAL->cam.inv_view;
}
if (rend_group->flags & PARTICLE_LOCAL) {
@@ -1601,7 +1600,7 @@ namespace Glitter {
mat4_mult(&view_mat, &inv_view_mat, &view_mat);
mat4_inverse(&view_mat, &inv_view_mat);
}
mat4_mult(&view_mat, &((render_context*)GPM_VAL->rctx)->camera->inv_view, &rend_group->mat_draw);
mat4_mult(&view_mat, &GPM_VAL->cam.inv_view, &rend_group->mat_draw);
switch (rend_group->draw_type) {
case DIRECTION_BILLBOARD:
@@ -1619,7 +1618,7 @@ namespace Glitter {
mat4_rotate_x((float_t)-M_PI_2, &dir_mat);
break;
case DIRECTION_BILLBOARD_Y_AXIS:
mat4_rotate_y(((render_context*)GPM_VAL->rctx)->camera->rotation.y, &dir_mat);
mat4_rotate_y(GPM_VAL->cam.rotation_y, &dir_mat);
break;
default:
dir_mat = mat4_identity;
@@ -1664,7 +1663,7 @@ namespace Glitter {
bool use_scale = false;
vec3 scale = vec3_identity;
if (rend_group->flags & PARTICLE_EMITTER_LOCAL
&& rend_group->GetEmitterScale(&scale))
&& rend_group->GetEmitterScale(scale))
use_scale = rend_group->flags & PARTICLE_SCALE ? true : false;
gl_state_bind_array_buffer(rend_group->vbo);
@@ -1771,7 +1770,7 @@ namespace Glitter {
if (fabsf(rend_group->z_offset) > 0.000001f) {
use_z_offset = true;
mat4_get_translation(model_mat, &dist_to_cam);
vec3_sub(((render_context*)GPM_VAL->rctx)->camera->view_point, dist_to_cam, dist_to_cam);
vec3_sub(GPM_VAL->cam.view_point, dist_to_cam, dist_to_cam);
if (rend_group->flags & PARTICLE_EMITTER_LOCAL) {
mat4_normalize_rotation(model_mat, &z_offset_inv_mat);
mat4_inverse(&z_offset_inv_mat, &z_offset_inv_mat);
@@ -1782,7 +1781,7 @@ namespace Glitter {
bool emitter_local = false;
vec3 scale = vec3_null;
if (rend_group->flags & PARTICLE_EMITTER_LOCAL) {
rend_group->GetEmitterScale(&scale);
rend_group->GetEmitterScale(scale);
if (rend_group->flags & PARTICLE_SCALE) {
x_vec.x = scale.x;
y_vec.y = scale.y;
@@ -2009,7 +2008,7 @@ namespace Glitter {
}
}
void XRenderScene::Disp(GPM, draw_pass_3d_type alpha) {
void XRenderScene::Disp(GPM, DispType disp_type) {
disp_quad = 0;
disp_line = 0;
disp_locus = 0;
@@ -2022,7 +2021,7 @@ namespace Glitter {
continue;
XRenderGroup* rend_group = i;
if ((rend_group)->alpha != alpha || rend_group->CannotDisp() && !GPM_VAL->draw_all)
if ((rend_group)->disp_type != disp_type || rend_group->CannotDisp() && !GPM_VAL->draw_all)
continue;
#if !defined(CRE_DEV)
@@ -2126,22 +2125,22 @@ namespace Glitter {
uniform_value[U_TEXTURE_BLEND] = 0;
}
switch (rend_group->fog) {
switch (rend_group->fog_type) {
default:
uniform_value[U_FOG_HEIGHT] = 0;
break;
case FOG_DEPTH:
case Glitter::FOG_DEPTH:
uniform_value[U_FOG_HEIGHT] = 1;
break;
case FOG_HEIGHT:
case Glitter::FOG_HEIGHT:
uniform_value[U_FOG_HEIGHT] = 2;
break;
}
if (rend_group->blend_mode == PARTICLE_BLEND_PUNCH_THROUGH)
uniform_value[U_ALPHA_BLEND] = rend_group->alpha != DRAW_PASS_3D_OPAQUE ? 3 : 1;
uniform_value[U_ALPHA_BLEND] = rend_group->disp_type ? 3 : 1;
else
uniform_value[U_ALPHA_BLEND] = rend_group->alpha != DRAW_PASS_3D_OPAQUE ? 2 : 0;
uniform_value[U_ALPHA_BLEND] = rend_group->disp_type ? 2 : 0;
if (~rend_group->particle->data.flags & PARTICLE_DEPTH_TEST) {
gl_state_enable_depth_test();
@@ -2167,9 +2166,7 @@ namespace Glitter {
emission = rend_group->emission;
shaders_ft.state_material_set_emission(false, emission, emission, emission, 1.0f);
shaders_ft.state_matrix_set_mvp(rend_group->mat_draw,
((render_context*)GPM_VAL->rctx)->camera->view,
((render_context*)GPM_VAL->rctx)->camera->projection);
shaders_ft.state_matrix_set_mvp(rend_group->mat_draw, GPM_VAL->cam.view, GPM_VAL->cam.projection);
shaders_ft.state_matrix_set_texture(0, mat4_identity);
shaders_ft.state_matrix_set_texture(1, mat4_identity);
shaders_ft.env_vert_set(3, vec4_identity);
+4 -4
View File
@@ -22,7 +22,7 @@ namespace Glitter {
effects.reserve(eff_group->effects.size());
emission = eff_group->emission;
if (a5)
enum_or(flags, SCENE_FLAG_4);
enum_or(flags, SCENE_FLAG_3);
}
}
@@ -32,7 +32,7 @@ namespace Glitter {
}
bool Scene::Copy(Glitter::EffectInst* eff_inst, Glitter::Scene* dst) {
if (~flags & SCENE_FLAG_4)
if (~flags & SCENE_FLAG_3)
return flags;
for (SceneEffect& i : effects)
@@ -63,7 +63,7 @@ namespace Glitter {
i.ptr->Ctrl(GPM_VAL, type, delta_frame, emission);
}
void Scene::Disp(GPM, draw_pass_3d_type alpha) {
void Scene::Disp(GPM, DispType disp_type) {
if (flags & SCENE_NOT_DISP)
return;
@@ -73,7 +73,7 @@ namespace Glitter {
if (GPM_VAL->draw_selected && GPM_VAL->effect && GPM_VAL->effect != i.ptr)
continue;
#endif
i.ptr->Disp(GPM_VAL, alpha);
i.ptr->Disp(GPM_VAL, disp_type);
}
}
+59 -78
View File
@@ -5,7 +5,7 @@
#include "auth_3d.hpp"
#include "../KKdLib/hash.hpp"
#include "../KKdLib/interpolation.h"
#include "../KKdLib/interpolation.hpp"
#include "../KKdLib/sort.hpp"
#include "../KKdLib/str_utils.hpp"
#include "rob/rob.hpp"
@@ -262,8 +262,6 @@ void auth_3d::ctrl(render_context* rctx) {
if (state != 2 || !enable)
return;
mat4 mat = this->mat;
bool set = false;
while (true) {
if (frame_changed) {
@@ -380,8 +378,6 @@ void auth_3d::disp(render_context* rctx) {
if (state != 2 || !enable)
return;
mat4 mat = this->mat;
auth_3d_set_material_list(this, rctx);
for (auth_3d_point& i : point)
@@ -646,7 +642,7 @@ void auth_3d::load_from_farc(farc* f, const char* file,
void auth_3d::reset() {
uid = -1;
id = -1;
mat = mat4u_identity;
mat = mat4_identity;
enable = false;
camera_root_update = true;
visible = true;
@@ -854,7 +850,7 @@ void auth_3d_rgba::reset() {
g.reset();
b.reset();
a.reset();
value = vec4u_null;
value = vec4_null;
}
auth_3d_vec3::auth_3d_vec3() {
@@ -898,7 +894,7 @@ void auth_3d_model_transform::interpolate(float_t frame) {
}
void auth_3d_model_transform::reset() {
mat = mat4u_identity;
mat = mat4_identity;
scale.reset();
rotation.reset();
translation.reset();
@@ -1078,7 +1074,7 @@ void auth_3d_fog::reset() {
end_value = 0.0f;
start_value = 0.0f;
color_init = vec4u_null;
color_init = vec4_null;
density_init = 0.0f;
end_init = 0.0f;
start_init = 0.0f;
@@ -1121,16 +1117,16 @@ void auth_3d_light::reset() {
intensity_value = 0.0f;
linear_value = 0.0f;
quadratic_value = 0.0f;
ambient_init = vec4u_null;
ambient_init = vec4_null;
cone_angle_init = 0.0f;
constant_init = 0.0f;
diffuse_init = vec4u_null;
diffuse_init = vec4_null;
drop_off_init = 0.0f;
far_init = 0.0f;
intensity_init = 0.0f;
linear_init = 0.0f;
quadratic_init = 0.0f;
specular_init = vec4u_null;
specular_init = vec4_null;
tone_curve_init = vec3_null;
}
@@ -1309,9 +1305,9 @@ auth_3d_object_model_transform::~auth_3d_object_model_transform() {
}
void auth_3d_object_model_transform::reset() {
mat = mat4u_identity;
mat_inner = mat4u_identity;
mat_rot = mat4u_identity;
mat = mat4_identity;
mat_inner = mat4_identity;
mat_rot = mat4_identity;
translation.reset();
rotation.reset();
scale.reset();
@@ -1340,7 +1336,7 @@ void auth_3d_object_node::reset() {
flags = (auth_3d_object_node_flags)0;
bone_id = -1;
joint_orient = vec3_null;
joint_orient_mat = mat4u_identity;
joint_orient_mat = mat4_identity;
mat = 0;
model_transform.reset();
name.clear();
@@ -1375,7 +1371,7 @@ void auth_3d_object_texture_transform::reset() {
flags = (auth_3d_object_texture_transform_flags)0;
coverage_u.reset();
coverage_v.reset();
mat = mat4u_identity;
mat = mat4_identity;
name.clear();
name.shrink_to_fit();
offset_u.reset();
@@ -1448,7 +1444,7 @@ void auth_3d_post_process::reset() {
lens_ghost_init = 1.0f;
lens_shaft_init = 1.0f;
radius_init = vec3_null;
scene_fade_init = vec4u_null;
scene_fade_init = vec4_null;
}
auth_3d_farc::auth_3d_farc() : load_count(), name(), state(), farc(), data(), size() {
@@ -2519,7 +2515,7 @@ static void auth_3d_set_material_list(auth_3d* auth, render_context* rctx) {
material_list_struct mat_list[TEXTURE_PATTERN_COUNT];
for (auth_3d_material_list& i : auth->material_list) {
if (i.blend_color.flags) {
vec4u& blend_color = mat_list[mat_list_count].blend_color;
vec4& blend_color = mat_list[mat_list_count].blend_color;
vec4u8& has_blend_color = mat_list[mat_list_count].has_blend_color;
blend_color = i.blend_color.value;
@@ -2534,7 +2530,7 @@ static void auth_3d_set_material_list(auth_3d* auth, render_context* rctx) {
}
if (i.incandescence.flags) {
vec4u& emission = mat_list[mat_list_count].emission;
vec4& emission = mat_list[mat_list_count].emission;
vec4u8& has_emission = mat_list[mat_list_count].has_emission;
emission = i.incandescence.value;
@@ -2692,7 +2688,7 @@ static void auth_3d_camera_root_ctrl(auth_3d_camera_root* cr,
cr->model_transform.interpolate(frame);
auth_3d_model_transform_set_mat(&cr->model_transform, &mat4_identity);
mat4 cr_mat = cr->model_transform.mat;
mat4& cr_mat = cr->model_transform.mat;
vec3 view_point = cr->view_point.model_transform.translation.interpolate(frame);
mat4_mult_vec3_trans(&cr_mat, &view_point, &cr->view_point_value);
@@ -3183,10 +3179,10 @@ static void auth_3d_m_object_hrc_disp(auth_3d_m_object_hrc* moh, auth_3d* auth,
if (shad && flags & DRAW_TASK_SHADOW) {
object_data->set_shadow_type(SHADOW_STAGE);
mat4u* m = &moh->model_transform.mat;
mat4* m = &moh->model_transform.mat;
for (auth_3d_object_node& j : moh->node)
if (j.mat) {
m = (mat4u*)j.mat;
m = j.mat;
break;
}
@@ -3199,11 +3195,9 @@ static void auth_3d_m_object_hrc_disp(auth_3d_m_object_hrc* moh, auth_3d* auth,
shad->field_1D0[shadow_type].push_back(pos);
}
if (i.mats.size() > 0) {
mat4 mat = i.model_transform.mat;
if (i.mats.size() > 0)
draw_task_add_draw_object_by_object_info_object_skin(rctx,
i.object_info, 0, 0, auth->alpha, i.mats.data(), 0, 0, &mat);
}
i.object_info, 0, 0, auth->alpha, i.mats.data(), 0, 0, &i.model_transform.mat);
}
object_data->set_draw_task_flags();
@@ -3221,7 +3215,7 @@ static void auth_3d_m_object_hrc_list_ctrl(auth_3d_m_object_hrc* moh, mat4* pare
auth_3d_object_model_transform_mat_mult(&moh->model_transform, parent_mat);
mat4 mat = moh->model_transform.mat;
mat4& mat = moh->model_transform.mat;
for (auth_3d_object_instance& i : moh->instance) {
//if (!i.model_transform.visible)
@@ -3240,10 +3234,9 @@ static void auth_3d_m_object_hrc_nodes_mat_mult(auth_3d_m_object_hrc* moh) {
auth_3d_object_node* node = moh->node.data();
for (auth_3d_object_node& i : moh->node)
if (i.parent >= 0) {
mat4 mat = node[i.parent].model_transform.mat;
auth_3d_object_model_transform_mat_mult(&i.model_transform, &mat);
}
if (i.parent >= 0)
auth_3d_object_model_transform_mat_mult(
&i.model_transform, &node[i.parent].model_transform.mat);
else
i.model_transform.mat = i.model_transform.mat_inner;
}
@@ -3274,7 +3267,7 @@ static void auth_3d_material_list_load(auth_3d* auth, auth_3d_material_list* ml,
}
ml->name = mlf->name;
ml->hash = hash_string_murmurhash(&ml->name);
ml->hash = hash_string_murmurhash(ml->name);
}
static void auth_3d_material_list_set(auth_3d_material_list* ml) {
@@ -3344,7 +3337,7 @@ static void auth_3d_object_load(auth_3d* auth, auth_3d_object* o,
o->refract = strstr(o->uid_name.c_str(), "_REFRACT") ? true : false;
o->object_info = obj_db->get_object_info(o->uid_name.c_str());
o->object_hash = hash_string_murmurhash(&o->uid_name);
o->object_hash = hash_string_murmurhash(o->uid_name);
}
static void auth_3d_object_curve_ctrl(auth_3d_object_curve* oc, float_t frame) {
@@ -3398,7 +3391,7 @@ static void auth_3d_object_disp(auth_3d_object* o, auth_3d* auth, render_context
rob_chara* rob_chr = rob_chara_array_get(auth->chara_id);
mat4 m;
mat4_mult(&rob_chr->data.miku_rot.field_6C,
&rob_chr->data.adjust_data.mat, (mat4u*)&m);
&rob_chr->data.adjust_data.mat, &m);
mat4_mult(&m, &mat, &mat);
object_data->set_shadow_type(auth->chara_id ? SHADOW_STAGE : SHADOW_CHARA);
}
@@ -3517,7 +3510,7 @@ static void auth_3d_object_list_ctrl(auth_3d_object* o, mat4* parent_mat) {
auth_3d_model_transform_set_mat(&o->model_transform, parent_mat);
mat4 mat = o->model_transform.mat;
mat4& mat = o->model_transform.mat;
for (auth_3d_object*& i : o->children_object)
auth_3d_object_list_ctrl(i, &mat);
@@ -3549,7 +3542,7 @@ static void auth_3d_object_hrc_load(auth_3d* auth, auth_3d_object_hrc* oh,
oh->refract = strstr(oh->uid_name.c_str(), "_REFRACT") ? true : false;
oh->object_info = obj_db->get_object_info(oh->uid_name.c_str());
oh->object_hash = hash_string_murmurhash(&oh->uid_name);
oh->object_hash = hash_string_murmurhash(oh->uid_name);
obj_skin* skin = object_storage_get_obj_skin(oh->object_info);
if (!skin)
@@ -3560,7 +3553,7 @@ static void auth_3d_object_hrc_load(auth_3d* auth, auth_3d_object_hrc* oh,
for (auth_3d_object_node& i : oh->node) {
i.bone_id = -1;
uint64_t name_hash = hash_string_fnv1a64m(&i.name);
uint64_t name_hash = hash_string_fnv1a64m(i.name);
for (uint32_t j = 0; j < skin->bones_count; j++)
if (hash_utf8_fnv1a64m(skin->bones[j].name) == name_hash) {
i.bone_id = skin->bones[j].id;
@@ -3598,7 +3591,7 @@ static void auth_3d_object_hrc_disp(auth_3d_object_hrc* oh, auth_3d* auth, rende
if (rob_chara_pv_data_array_check_chara_id(auth->chara_id)) {
rob_chara* rob_chr = rob_chara_array_get(auth->chara_id);
mat4_mult(&rob_chr->data.miku_rot.field_6C,
&rob_chr->data.adjust_data.mat, (mat4u*)&mat);
&rob_chr->data.adjust_data.mat, &mat);
if (auth->chara_id)
object_data->set_shadow_type(SHADOW_STAGE);
}
@@ -3606,10 +3599,10 @@ static void auth_3d_object_hrc_disp(auth_3d_object_hrc* oh, auth_3d* auth, rende
else if (flags & DRAW_TASK_SHADOW) {
object_data->set_shadow_type(SHADOW_STAGE);
mat4u* m = &oh->node[0].model_transform.mat;
mat4* m = &oh->node[0].model_transform.mat;
for (auth_3d_object_node& i : oh->node)
if (i.mat) {
m = (mat4u*)i.mat;
m = i.mat;
break;
}
@@ -3643,17 +3636,15 @@ static void auth_3d_object_hrc_list_ctrl(auth_3d_object_hrc* oh, mat4* mat) {
int32_t* childer_object_parent_node = oh->childer_object_parent_node.data();
size_t children_object_count = oh->children_object.size();
for (size_t i = 0; i < children_object_count; i++) {
mat4 mat = oh->node[childer_object_parent_node[i]].model_transform.mat;
auth_3d_object_list_ctrl(oh->children_object[i], &mat);
}
for (size_t i = 0; i < children_object_count; i++)
auth_3d_object_list_ctrl(oh->children_object[i],
&oh->node[childer_object_parent_node[i]].model_transform.mat);
int32_t* childer_object_hrc_parent_node = oh->childer_object_hrc_parent_node.data();
size_t children_object_hrc_count = oh->children_object_hrc.size();
for (size_t i = 0; i < children_object_hrc_count; i++) {
mat4 mat = oh->node[childer_object_hrc_parent_node[i]].model_transform.mat;
auth_3d_object_hrc_list_ctrl(oh->children_object_hrc[i], &mat);
}
for (size_t i = 0; i < children_object_hrc_count; i++)
auth_3d_object_hrc_list_ctrl(oh->children_object_hrc[i],
&oh->node[childer_object_hrc_parent_node[i]].model_transform.mat);
}
static void auth_3d_object_hrc_nodes_mat_mult(auth_3d_object_hrc* oh, mat4* mat) {
@@ -3666,8 +3657,7 @@ static void auth_3d_object_hrc_nodes_mat_mult(auth_3d_object_hrc* oh, mat4* mat)
else
m = *mat;
mat4 joint_orient = i.joint_orient_mat;
mat4_mult(&joint_orient, &m, &m);
mat4_mult(&i.joint_orient_mat, &m, &m);
auth_3d_object_model_transform_mat_mult(&i.model_transform, &m);
if (i.mat)
@@ -3683,7 +3673,7 @@ static void auth_3d_object_instance_load(auth_3d* auth, auth_3d_object_instance*
oi->uid_name = oif->uid_name;
oi->object_info = obj_db->get_object_info(oi->uid_name.c_str());
oi->object_hash = hash_string_murmurhash(&oi->uid_name);
oi->object_hash = hash_string_murmurhash(oi->uid_name);
obj_skin* skin = object_storage_get_obj_skin(oi->object_info);
if (!skin)
@@ -3698,7 +3688,7 @@ static void auth_3d_object_instance_load(auth_3d* auth, auth_3d_object_instance*
for (uint32_t i = 0; i < skin->bones_count; i++) {
uint64_t name_hash = hash_utf8_fnv1a64m(skin->bones[i].name);
for (auth_3d_object_node& j : moh->node)
if (hash_string_fnv1a64m(&j.name) == name_hash) {
if (hash_string_fnv1a64m(j.name) == name_hash) {
int32_t bone_id = skin->bones[i].id;
if (~bone_id & 0x8000)
object_bone_indices[bone_id] = (int32_t)(&j - moh->node.data());
@@ -3720,10 +3710,8 @@ static void auth_3d_object_model_transform_ctrl(auth_3d_object_model_transform*
if (obj_mt->has_visibility)
obj_mt->visible = obj_mt->visibility.interpolate(frame) >= 0.99900001f;
mat4 mat_rot;
vec3 rotation = obj_mt->rotation_value;
mat4_rotate(rotation.x, rotation.y, rotation.z, &mat_rot);
obj_mt->mat_rot = mat_rot;
vec3& rotation = obj_mt->rotation_value;
mat4_rotate(rotation.x, rotation.y, rotation.z, &obj_mt->mat_rot);
obj_mt->frame = frame;
obj_mt->has_rotation = false;
obj_mt->has_translation = false;
@@ -3731,9 +3719,9 @@ static void auth_3d_object_model_transform_ctrl(auth_3d_object_model_transform*
static void auth_3d_object_model_transform_load(auth_3d* auth,
auth_3d_object_model_transform* omt, auth_3d_model_transform_file* mtf) {
omt->mat = mat4u_identity;
omt->mat_inner = mat4u_identity;
omt->mat_rot = mat4u_identity;
omt->mat = mat4_identity;
omt->mat_inner = mat4_identity;
omt->mat_rot = mat4_identity;
omt->translation_value = vec3_null;
omt->rotation_value = vec3_null;
omt->scale_value = vec3_identity;
@@ -3767,9 +3755,7 @@ static void auth_3d_object_model_transform_load(auth_3d* auth,
}
static void auth_3d_object_model_transform_mat_mult(auth_3d_object_model_transform* obj_mt, mat4* mat) {
mat4 obj_mt_mat = obj_mt->mat_inner;
mat4_mult(&obj_mt_mat, mat, &obj_mt_mat);
obj_mt->mat = obj_mt_mat;
mat4_mult(&obj_mt->mat_inner, mat, &obj_mt->mat);
}
static void auth_3d_object_model_transform_set_mat_inner(auth_3d_object_model_transform* obj_mt) {
@@ -3777,11 +3763,10 @@ static void auth_3d_object_model_transform_set_mat_inner(auth_3d_object_model_tr
return;
mat4 mat;
vec3 translation = obj_mt->translation_value;
vec3& translation = obj_mt->translation_value;
mat4_translate(translation.x, translation.y, translation.z, &mat);
mat4 mat_rot = obj_mt->mat_rot;
mat4_mult(&mat_rot, &mat, &mat);
mat4_mult(&obj_mt->mat_rot, &mat, &mat);
if (obj_mt->has_scale) {
vec3 scale = obj_mt->scale_value;
mat4_scale_rot(&mat, scale.x, scale.y, scale.z, &mat);
@@ -3793,16 +3778,15 @@ static void auth_3d_object_model_transform_set_mat_inner(auth_3d_object_model_tr
static void auth_3d_object_node_load(auth_3d* auth,
auth_3d_object_node* on, auth_3d_object_node_file* onf) {
if (onf->flags & A3DA_OBJECT_NODE_JOINT_ORIENT) {
vec3 rot = onf->joint_orient;
mat4 mat;
mat4_rotate(rot.x, rot.y, rot.z, &mat);
vec3& rot = onf->joint_orient;
on->joint_orient = rot;
on->joint_orient_mat = mat;
mat4 mat;
mat4_rotate(rot.x, rot.y, rot.z, &on->joint_orient_mat);
enum_or(on->flags, AUTH_3D_OBJECT_NODE_JOINT_ORIENT);
}
else {
on->joint_orient = vec3_null;
on->joint_orient_mat = mat4u_identity;
on->joint_orient_mat = mat4_identity;
}
auth_3d_object_model_transform_load(auth, &on->model_transform, &onf->model_transform);
@@ -4059,10 +4043,8 @@ static void auth_3d_post_process_restore_prev_value(auth_3d_post_process* pp, re
if (pp->flags_init & AUTH_3D_POST_PROCESS_RADIUS)
blur->set_radius(pp->radius_init);
if (pp->flags_init & AUTH_3D_POST_PROCESS_SCENE_FADE) {
vec4 scene_fade_init = pp->scene_fade_init;
tm->set_scene_fade(scene_fade_init);
}
if (pp->flags_init & AUTH_3D_POST_PROCESS_SCENE_FADE)
tm->set_scene_fade(pp->scene_fade_init);
}
static void auth_3d_post_process_set(auth_3d_post_process* pp, render_context* rctx) {
@@ -4120,8 +4102,7 @@ static void auth_3d_post_process_set(auth_3d_post_process* pp, render_context* r
enum_or(pp->flags_init, AUTH_3D_POST_PROCESS_SCENE_FADE);
}
vec4 scene_fade = pp->scene_fade.value;
tm->set_scene_fade(scene_fade);
tm->set_scene_fade(pp->scene_fade.value);
}
}
@@ -4180,7 +4161,7 @@ static auth_3d_farc* auth_3d_data_struct_get_farc(
uint64_t name_hash = hash_utf8_fnv1a64m(category_name);
for (auth_3d_farc& i : auth_3d_data->farcs)
if (hash_string_fnv1a64m(&i.name) == name_hash)
if (hash_string_fnv1a64m(i.name) == name_hash)
return &i;
return 0;
}
+13 -13
View File
@@ -214,7 +214,7 @@ struct auth_3d_rgba {
auth_3d_key b;
auth_3d_key a;
vec4u value;
vec4 value;
auth_3d_rgba();
~auth_3d_rgba();
@@ -236,7 +236,7 @@ struct auth_3d_vec3 {
};
struct auth_3d_model_transform {
mat4u mat;
mat4 mat;
auth_3d_vec3 scale;
auth_3d_vec3 rotation;
auth_3d_vec3 translation;
@@ -382,7 +382,7 @@ struct auth_3d_fog {
float_t end_value;
float_t start_value;
vec4u color_init;
vec4 color_init;
float_t density_init;
float_t end_init;
float_t start_init;
@@ -420,16 +420,16 @@ struct auth_3d_light {
float_t linear_value;
float_t quadratic_value;
vec4u ambient_init;
vec4 ambient_init;
float_t cone_angle_init;
float_t constant_init;
vec4u diffuse_init;
vec4 diffuse_init;
float_t drop_off_init;
float_t far_init;
float_t intensity_init;
float_t linear_init;
float_t quadratic_init;
vec4u specular_init;
vec4 specular_init;
vec3 tone_curve_init;
auth_3d_light();
@@ -439,9 +439,9 @@ struct auth_3d_light {
};
struct auth_3d_object_model_transform {
mat4u mat;
mat4u mat_inner;
mat4u mat_rot;
mat4 mat;
mat4 mat_inner;
mat4 mat_rot;
auth_3d_vec3 translation;
auth_3d_vec3 rotation;
auth_3d_vec3 scale;
@@ -569,7 +569,7 @@ struct auth_3d_object_node {
auth_3d_object_node_flags flags;
int32_t bone_id;
vec3 joint_orient;
mat4u joint_orient_mat;
mat4 joint_orient_mat;
mat4* mat;
auth_3d_object_model_transform model_transform;
std::string name;
@@ -596,7 +596,7 @@ struct auth_3d_object_texture_transform {
auth_3d_object_texture_transform_flags flags;
auth_3d_key coverage_u;
auth_3d_key coverage_v;
mat4u mat;
mat4 mat;
std::string name;
auth_3d_key offset_u;
auth_3d_key offset_v;
@@ -657,7 +657,7 @@ struct auth_3d_post_process {
float_t lens_ghost_init;
float_t lens_shaft_init;
vec3 radius_init;
vec4u scene_fade_init;
vec4 scene_fade_init;
auth_3d_post_process();
~auth_3d_post_process();
@@ -675,7 +675,7 @@ struct auth_3d {
bool ended;
bool left_right_reverse;
bool once;
mat4u mat;
mat4 mat;
float_t alpha;
draw_task_flags draw_task_flags;
int32_t chara_id;
+10 -18
View File
@@ -205,17 +205,17 @@ void camera::reset() {
update();
}
void camera::move(vec2d& move) {
if (memcmp(&move, &vec2d_null, sizeof(vec2d))) {
void camera::move(double_t move_x, double_t move_y) {
if (move_x != 0.0 || move_y != 0.0) {
vec3 temp;
vec3 view_point;
vec3 interest;
vec3 up = { 0.0f, 1.0f, 0.0f };
vec3_cross(forward, up, temp);
vec3_normalize(temp, temp);
vec3_mult_scalar(temp, (float_t)move.y, temp);
vec3_mult_scalar(temp, (float_t)move_y, temp);
vec3_add(this->view_point, temp, view_point);
vec3_mult_scalar(forward, (float_t)move.x, temp);
vec3_mult_scalar(forward, (float_t)move_x, temp);
vec3_add(view_point, temp, view_point);
vec3_add(view_point, forward, interest);
@@ -224,18 +224,14 @@ void camera::move(vec2d& move) {
}
}
void camera::move(vec2d&& move) {
this->move(*(vec2d*)&move);
}
void camera::rotate(double_t rotate_x, double_t rotate_y) {
if (rotate_x != 0.0)
set_yaw(get_yaw() + rotate_x);
void camera::rotate(vec2d& rotate) {
if (rotate.x != 0.0)
set_yaw(get_yaw() + rotate.x);
if (rotate_y != 0.0)
set_pitch(get_pitch() + rotate_y);
if (rotate.y != 0.0)
set_pitch(get_pitch() + rotate.y);
if (memcmp(&rotate, &vec2d_null, sizeof(vec2d))) {
if (rotate_x != 0.0 || rotate_y != 0.0) {
camera_calculate_forward(this);
vec3 interest;
@@ -244,10 +240,6 @@ void camera::rotate(vec2d& rotate) {
}
}
void camera::rotate(vec2d&& rotate) {
this->rotate(*(vec2d*)&rotate);
}
void camera::set(const vec3& view_point, const vec3& interest,
const vec3& trans, const vec3& rot, const vec3& scale, double_t roll, double_t fov) {
vec3 _vp;
+2 -4
View File
@@ -76,10 +76,8 @@ struct camera {
void set_fast_change_hist0(bool value);
void set_fast_change_hist1(bool value);
void reset();
void move(vec2d& move);
void move(vec2d&& move);
void rotate(vec2d& rotate);
void rotate(vec2d&& rotate);
void move(double_t move_x, double_t move_y);
void rotate(double_t rotate_x, double_t rotate_y);
void set(const vec3& view_point, const vec3& interest,
const vec3& trans, const vec3& rot, const vec3& scale, double_t roll, double_t fov);
void set(const vec3&& view_point, const vec3&& interest,
+40 -61
View File
@@ -664,7 +664,7 @@ data_f2::~data_f2() {
}
#endif
data_ft::data_ft() : obj_db(), stage_data(), base_obj_db(), base_stage_data() {
data_ft::data_ft() {
}
@@ -935,17 +935,18 @@ static void data_load_inner(stream& s) {
data_struct* ds = &data_list[DATA_AFT];
data_ft* d = &ds->data_ft;
{
auth_3d_database_file* base_auth_3d_db = &d->base_auth_3d_db;
*base_auth_3d_db = auth_3d_database_file();
ds->load_file(base_auth_3d_db, "rom/auth_3d/",
"auth_3d_db.bin", auth_3d_database_file::load_file);
static const char* prefixes[] = {
"",
"mdata_",
};
auth_3d_database_file mdata_auth_3d_db;
ds->load_file(&mdata_auth_3d_db, "rom/auth_3d/",
"mdata_auth_3d_db.bin", auth_3d_database_file::load_file);
for (const char* i : prefixes) {
std::string file = std::string(i) + "auth_3d_db.bin";
d->auth_3d_db.merge_mdata(base_auth_3d_db, &mdata_auth_3d_db);
auth_3d_database_file auth_3d_db_file;
ds->load_file(&auth_3d_db_file, "rom/auth_3d/", file.c_str(),
auth_3d_database_file::load_file);
d->auth_3d_db.add(&auth_3d_db_file);
}
{
@@ -956,65 +957,43 @@ static void data_load_inner(stream& s) {
"bone_data.bin", bone_database::load_file);
}
{
motion_database* base_mot_db = &d->base_mot_db;
ds->load_file(base_mot_db, "rom/rob/",
"mot_db.farc", motion_database::load_file);
for (const char* i : prefixes) {
std::string file = std::string(i) + "mot_db.farc";
motion_database mdata_mot_db;
ds->load_file(&mdata_mot_db, "rom/rob/",
"mdata_mot_db.farc", motion_database::load_file);
d->mot_db.merge_mdata(base_mot_db, &mdata_mot_db);
motion_database_file mot_db_file;
ds->load_file(&mot_db_file, "rom/rob/", file.c_str(),
motion_database_file::load_file);
d->mot_db.add(&mot_db_file);
}
{
object_database* base_obj_db = &d->base_obj_db;
*base_obj_db = object_database();
base_obj_db->modern = false;
ds->load_file(base_obj_db, "rom/objset/",
"obj_db.bin", object_database::load_file);
for (const char* i : prefixes) {
std::string file = std::string(i) + "obj_db.bin";
object_database mdata_obj_db;
mdata_obj_db.modern = false;
ds->load_file(&mdata_obj_db, "rom/objset/",
"mdata_obj_db.bin", object_database::load_file);
object_database* obj_db = &d->obj_db;
*obj_db = object_database();
obj_db->merge_mdata(base_obj_db, &mdata_obj_db);
object_database_file obj_db_file;
obj_db_file.modern = false;
ds->load_file(&obj_db_file, "rom/objset/", file.c_str(),
object_database_file::load_file);
d->obj_db.add(&obj_db_file);
}
{
stage_database* base_stage_data = &d->base_stage_data;
*base_stage_data = stage_database();
base_stage_data->modern = false;
ds->load_file(base_stage_data, "rom/",
"stage_data.bin", stage_database::load_file);
for (const char* i : prefixes) {
std::string file = std::string(i) + "stage_data.bin";
stage_database mdata_stage_data;
mdata_stage_data.modern = false;
ds->load_file(&mdata_stage_data, "rom/",
"mdata_stage_data.bin", stage_database::load_file);
stage_database* stage_data = &d->stage_data;
*stage_data = stage_database();
stage_data->merge_mdata(base_stage_data, &mdata_stage_data);
stage_database_file stage_data_file;
stage_data_file.modern = false;
ds->load_file(&stage_data_file, "rom/", file.c_str(),
stage_database_file::load_file);
d->stage_data.add(&stage_data_file);
}
{
texture_database* base_tex_db = &d->base_tex_db;
*base_tex_db = texture_database();
base_tex_db->modern = false;
ds->load_file(base_tex_db, "rom/objset/",
"tex_db.bin", texture_database::load_file);
for (const char* i : prefixes) {
std::string file = std::string(i) + "tex_db.bin";
texture_database mdata_tex_db;
mdata_tex_db.modern = false;
ds->load_file(&mdata_tex_db, "rom/objset/",
"mdata_tex_db.bin", texture_database::load_file);
d->tex_db.merge_mdata(base_tex_db, &mdata_tex_db);
texture_database_file tex_db_file;
tex_db_file.modern = false;
ds->load_file(&tex_db_file, "rom/objset/", file.c_str(),
texture_database_file::load_file);
d->tex_db.add(&tex_db_file);
}
}
@@ -1111,7 +1090,7 @@ static void data_load_glitter_list(data_struct* ds, const char* path) {
case DATA_XHD:
ds->glitter_list_murmurhash.reserve(count);
for (size_t i = 0; i < count; i++) {
uint32_t hash = hash_string_murmurhash(&ds->glitter_list_names[i]);
uint32_t hash = hash_string_murmurhash(ds->glitter_list_names[i]);
ds->glitter_list_murmurhash.push_back(hash);
}
break;
@@ -1120,7 +1099,7 @@ static void data_load_glitter_list(data_struct* ds, const char* path) {
case DATA_M39:
ds->glitter_list_fnv1a64m.reserve(count);
for (size_t i = 0; i < count; i++) {
uint64_t hash = hash_string_fnv1a64m(&ds->glitter_list_names[i]);
uint64_t hash = hash_string_fnv1a64m(ds->glitter_list_names[i]);
ds->glitter_list_fnv1a64m.push_back(hash);
}
break;
-6
View File
@@ -71,12 +71,6 @@ struct data_ft {
stage_database stage_data;
texture_database tex_db;
auth_3d_database_file base_auth_3d_db;
motion_database base_mot_db;
object_database base_obj_db;
stage_database base_stage_data;
texture_database base_tex_db;
data_ft();
~data_ft();
};
+24 -28
View File
@@ -38,11 +38,9 @@ static void draw_object_vertex_attrib_set_reflect_compressed(draw_object* draw);
void draw_object_draw(render_context* rctx, draw_object* draw, mat4* model,
void(*draw_object_func)(render_context* rctx, draw_object* draw), int32_t show_vector) {
if (draw->mats) {
mat4u* mats = draw->mats;
if (draw->mat_count == 2) {
mat4 mat = *mats;
shaders_ft.state_matrix_set_program(7, mat);
}
mat4* mats = draw->mats;
if (draw->mat_count == 2)
shaders_ft.state_matrix_set_program(7, *mats);
mat4 mat;
for (int32_t i = 0; i < draw->mat_count; i++, mats++) {
@@ -74,8 +72,7 @@ void draw_object_draw(render_context* rctx, draw_object* draw, mat4* model,
void draw_object_draw_default(render_context* rctx, draw_object* draw) {
if (draw->set_blend_color) {
vec4 blend_color = draw->blend_color;
shaders_ft.env_vert_set(3, blend_color);
shaders_ft.env_vert_set(3, draw->blend_color);
shaders_ft.env_vert_set(4, vec4_null);
}
@@ -91,9 +88,9 @@ void draw_object_draw_default(render_context* rctx, draw_object* draw) {
draw->sub_mesh->last_index,
draw->sub_mesh->index_format,
draw->sub_mesh->indices_offset);
else
else {
mat4 mat;
for (int32_t i = 0; i < draw->instances_count; i++) {
mat4 mat;
mat4_transpose(&draw->instances_mat[i], &mat);
glVertexAttrib4fv(12, (const GLfloat*)&mat.row0);
glVertexAttrib4fv(13, (const GLfloat*)&mat.row1);
@@ -107,6 +104,7 @@ void draw_object_draw_default(render_context* rctx, draw_object* draw) {
draw->sub_mesh->index_format,
draw->sub_mesh->indices_offset);
}
}
draw_object_material_reset_default(draw->material);
if (!draw->draw_object_func)
@@ -154,7 +152,7 @@ void draw_object_draw_sss(render_context* rctx, draw_object* draw) {
uniform_value[U37] = 1;
}
else {
vec4 sss_param = rctx->draw_pass.sss_data.param;
vec4& sss_param = rctx->draw_pass.sss_data.param;
shaders_ft.env_frag_set(25, sss_param.x, sss_param.y, sss_param.z, 0.5f);
uniform_value[U37] = 0;
}
@@ -226,8 +224,7 @@ void draw_object_draw_translucent(render_context* rctx, draw_object* draw) {
obj_material_data* material = draw->material;
std::vector<GLuint>* textures = draw->textures;
if (rctx->draw_state.shader_index != -1) {
vec4 emission = draw->emission;
shaders_ft.state_material_set_emission(false, emission);
shaders_ft.state_material_set_emission(false, draw->emission);
draw_object_material_set_uniform(rctx, material, 0);
if (material->material.attrib.m.alpha_texture)
uniform_value[U_TEXTURE_COUNT] = 0;
@@ -1038,13 +1035,13 @@ static void draw_object_vertex_attrib_set_default(draw_object* draw) {
int32_t texture_id = material->material.texdata[i].tex_index;
mat4 mat = material->material.texdata[i].tex_coord_mat;
shaders_ft.state_matrix_set_texture(texcoord_index, mat);
shaders_ft.state_matrix_set_texture(texcoord_index,
material->material.texdata[i].tex_coord_mat);
if (material->material.texdata[i].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR)
for (int32_t k = 0; k < draw->texture_transform_count; k++)
if (draw->texture_transform_array[k].id == texture_id) {
mat4 mat = draw->texture_transform_array[k].mat;
shaders_ft.state_matrix_set_texture(texcoord_index, mat);
shaders_ft.state_matrix_set_texture(texcoord_index,
draw->texture_transform_array[k].mat);
texcoord_mat_set[texcoord_index] = true;
break;
}
@@ -1240,13 +1237,12 @@ inline static void draw_object_vertex_attrib_set_default_compressed(draw_object*
int32_t tex_index = material->material.texdata[i].tex_index;
mat4 mat = material->material.texdata[i].tex_coord_mat;
shaders_ft.state_matrix_set_texture(texcoord_index, mat);
shaders_ft.state_matrix_set_texture(texcoord_index,
material->material.texdata[i].tex_coord_mat);
if (material->material.texdata[i].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR)
for (int32_t k = 0; k < draw->texture_transform_count; k++)
if (draw->texture_transform_array[k].id == tex_index) {
mat4 mat = draw->texture_transform_array[k].mat;
shaders_ft.state_matrix_set_texture(texcoord_index, mat);
shaders_ft.state_matrix_set_texture(texcoord_index, draw->texture_transform_array[k].mat);
texcoord_mat_set[texcoord_index] = true;
break;
}
@@ -1411,13 +1407,13 @@ static void draw_object_vertex_attrib_set_reflect(draw_object* draw) {
int32_t tex_index = material->material.texdata[0].tex_index;
mat4 mat = material->material.texdata[0].tex_coord_mat;
shaders_ft.state_matrix_set_texture(0, mat);
shaders_ft.state_matrix_set_texture(0,
material->material.texdata[0].tex_coord_mat);
if (material->material.texdata[0].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR)
for (int32_t j = 0; j < draw->texture_transform_count; j++)
if (draw->texture_transform_array[j].id == tex_index) {
mat4 mat = draw->texture_transform_array[j].mat;
shaders_ft.state_matrix_set_texture(0, mat);
shaders_ft.state_matrix_set_texture(0,
draw->texture_transform_array[j].mat);
break;
}
}
@@ -1584,13 +1580,13 @@ inline static void draw_object_vertex_attrib_set_reflect_compressed(draw_object*
int32_t tex_index = material->material.texdata[0].tex_index;
mat4 mat = material->material.texdata[0].tex_coord_mat;
shaders_ft.state_matrix_set_texture(0, mat);
shaders_ft.state_matrix_set_texture(0,
material->material.texdata[0].tex_coord_mat);
if (material->material.texdata[0].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR)
for (int32_t j = 0; j < draw->texture_transform_count; j++)
if (draw->texture_transform_array[j].id == tex_index) {
mat4 mat = draw->texture_transform_array[j].mat;
shaders_ft.state_matrix_set_texture(0, mat);
shaders_ft.state_matrix_set_texture(0,
draw->texture_transform_array[j].mat);
break;
}
}
+4 -3
View File
@@ -80,6 +80,7 @@ void draw_pass_main(render_context* rctx) {
gl_state_set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
gl_state_enable_depth_test();
gl_state_set_depth_func(GL_LEQUAL);
gl_state_set_depth_mask(GL_TRUE);
for (int32_t i = DRAW_PASS_SHADOW; i < DRAW_PASS_MAX; i++) {
rctx->draw_pass.cpu_time[i] = 0.0;
@@ -863,7 +864,7 @@ static void draw_pass_3d(render_context* rctx, draw_pass* a1) {
gl_state_disable_depth_test();
}
Glitter::glt_particle_manager.Disp(DRAW_PASS_3D_OPAQUE);
Glitter::glt_particle_manager.DispScenes(Glitter::DISP_OPAQUE);
if (draw_grid_3d)
draw_pass_3d_grid(rctx);
@@ -897,7 +898,7 @@ static void draw_pass_3d(render_context* rctx, draw_pass* a1) {
gl_state_disable_depth_test();
gl_state_set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
Glitter::glt_particle_manager.Disp(DRAW_PASS_3D_TRANSPARENT);
Glitter::glt_particle_manager.DispScenes(Glitter::DISP_ALPHA);
gl_state_set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
if (a1->npr_param == 1) {
@@ -930,7 +931,7 @@ static void draw_pass_3d(render_context* rctx, draw_pass* a1) {
gl_state_disable_depth_test();
gl_state_set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
Glitter::glt_particle_manager.Disp(DRAW_PASS_3D_TRANSLUCENT);
Glitter::glt_particle_manager.DispScenes(Glitter::DISP_NORMAL);
gl_state_set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
gl_state_enable_depth_test();
+36 -44
View File
@@ -14,7 +14,7 @@
static void draw_task_add(render_context* rctx, draw_object_type type, draw_task* task);
static void draw_task_object_init(draw_task* task, object_data* object_data, mat4* mat,
float_t bounding_radius, obj_sub_mesh* sub_mesh, obj_mesh* mesh, obj_material_data* material,
std::vector<GLuint>* textures, int32_t mat_count, mat4u* mats, GLuint array_buffer,
std::vector<GLuint>* textures, int32_t mat_count, mat4* mats, GLuint array_buffer,
GLuint element_array_buffer, vec4* blend_color, vec4* emission, int32_t morph_array_buffer,
int32_t instances_count, mat4* instances_mat, void(*draw_object_func)(draw_object*));
static void draw_task_object_translucent_init(draw_task* task, mat4* mat,
@@ -142,25 +142,21 @@ void draw_task_draw_objects_by_type(render_context* rctx, draw_object_type type,
draw_task* task = i;
switch (task->type) {
case DRAW_TASK_TYPE_OBJECT: {
mat4 mat = task->mat;
draw_object_draw(rctx, &task->data.object,
&mat, draw_object_func, show_vector);
&task->mat, draw_object_func, show_vector);
} break;
case DRAW_TASK_TYPE_PRIMITIVE: {
mat4 mat = task->mat;
draw_object_model_mat_load(rctx, &mat);
draw_object_model_mat_load(rctx, &task->mat);
//draw_primitive_draw(&task->data.primitive);
} break;
case DRAW_TASK_TYPE_PREPROCESS: {
mat4 mat = task->mat;
draw_object_model_mat_load(rctx, &mat);
draw_object_model_mat_load(rctx, &task->mat);
task->data.preprocess.func(rctx, task->data.preprocess.data);
} break;
case DRAW_TASK_TYPE_OBJECT_TRANSLUCENT: {
mat4 mat = task->mat;
for (int32_t j = 0; j < task->data.object_translucent.count; j++)
draw_object_draw(rctx, task->data.object_translucent.objects[j],
&mat, draw_object_func, show_vector);
&task->mat, draw_object_func, show_vector);
} break;
}
}
@@ -172,20 +168,18 @@ void draw_task_draw_objects_by_type(render_context* rctx, draw_object_type type,
int32_t a = (int32_t)(task->data.object.blend_color.w * 255.0f);
a = clamp(a, 0, 255);
if (a == alpha) {
mat4 mat = task->mat;
draw_object_draw(rctx, &task->data.object,
&mat, draw_object_func, show_vector);
&task->mat, draw_object_func, show_vector);
}
} break;
case DRAW_TASK_TYPE_OBJECT_TRANSLUCENT: {
mat4 mat = task->mat;
for (int32_t j = 0; j < task->data.object_translucent.count; j++) {
draw_object* object = task->data.object_translucent.objects[j];
int32_t a = (int32_t)(object->blend_color.w * 255.0f);
a = clamp(a, 0, 255);
if (a == alpha)
draw_object_draw(rctx, object,
&mat, draw_object_func, show_vector);
&task->mat, draw_object_func, show_vector);
}
} break;
}
@@ -361,7 +355,7 @@ bool draw_task_add_draw_object(render_context* rctx, obj* object,
int32_t bone_indices_count = sub_mesh->bone_indices_count;
uint16_t* bone_indices = sub_mesh->bone_indices;
mat4u* mats;
mat4* mats;
if (bone_indices_count && enable_bone_mat) {
mats = object_data->buffer.add_mat4(bone_indices_count);
if (bone_mat)
@@ -703,25 +697,25 @@ void draw_task_add_draw_object_by_object_info_object_skin(render_context* rctx,
object_data* object_data = &rctx->object_data;
if (texture_data && !texture_data->field_0) {
vec4 value;
object_data->get_texture_color_coeff(&texture_color_coeff);
object_data->get_texture_color_coeff(texture_color_coeff);
vec3_mult(texture_data->texture_color_coeff, *(vec3*)&texture_color_coeff, *(vec3*)&value);
value.w = 0.0f;
object_data->set_texture_color_coeff(&value);
object_data->set_texture_color_coeff(value);
object_data->get_texture_color_offset(&texture_color_offset);
object_data->get_texture_color_offset(texture_color_offset);
*(vec3*)&value = texture_data->texture_color_offset;
value.w = 0.0f;
object_data->set_texture_color_offset(&value);
object_data->set_texture_color_offset(value);
object_data->get_texture_specular_coeff(&texture_specular_coeff);
object_data->get_texture_specular_coeff(texture_specular_coeff);
vec3_mult(texture_data->texture_specular_coeff, *(vec3*)&texture_specular_coeff, *(vec3*)&value);
value.w = 0.0f;
object_data->set_texture_specular_coeff(&value);
object_data->set_texture_specular_coeff(value);
object_data->get_texture_specular_offset(&texture_specular_offset);
object_data->get_texture_specular_offset(texture_specular_offset);
*(vec3*)&value = texture_data->texture_specular_offset;
value.w = 0.0f;
object_data->set_texture_specular_offset(&value);
object_data->set_texture_specular_offset(value);
}
size_t texture_pattern_count = texture_pattern ? texture_pattern->size() : 0;
@@ -739,10 +733,10 @@ void draw_task_add_draw_object_by_object_info_object_skin(render_context* rctx,
object_data->set_texture_pattern();
if (texture_data && !texture_data->field_0) {
object_data->set_texture_color_coeff(&texture_color_coeff);
object_data->set_texture_color_offset(&texture_color_offset);
object_data->set_texture_specular_coeff(&texture_specular_coeff);
object_data->set_texture_specular_offset(&texture_specular_offset);
object_data->set_texture_color_coeff(texture_color_coeff);
object_data->set_texture_color_offset(texture_color_offset);
object_data->set_texture_specular_coeff(texture_specular_coeff);
object_data->set_texture_specular_offset(texture_specular_offset);
}
}
@@ -754,28 +748,26 @@ void draw_task_sort(render_context* rctx, draw_object_type type, int32_t compare
object_data* object_data = &rctx->object_data;
for (draw_task*& i : vec) {
draw_task* task = i;
mat4 mat = task->mat;
vec3 center;
mat4_get_translation(&mat, &center);
mat4_get_translation(&task->mat, &center);
if (task->type == DRAW_TASK_TYPE_OBJECT) {
if (task->data.object.mesh->attrib.m.billboard) {
model_mat_face_camera_view(&rctx->camera->view, &mat, &mat);}
mat4 mat = task->mat;
if (task->data.object.mesh->attrib.m.billboard)
model_mat_face_camera_view(&rctx->camera->view, &mat, &mat);
else if (task->data.object.mesh->attrib.m.billboard_y_axis)
model_mat_face_camera_position(&rctx->camera->view, &mat, &mat);
obj_sub_mesh* sub_mesh = task->data.object.sub_mesh;
if (task->data.object.mat_count < 1 || !sub_mesh->bone_indices_count)
mat4_mult_vec3_trans(&mat, &sub_mesh->bounding_sphere.center, &center);
else {
obj_sub_mesh* sub_mesh = task->data.object.sub_mesh;
if (task->data.object.mat_count < 1 || !sub_mesh->bone_indices_count)
mat4_mult_vec3_trans(&mat, &sub_mesh->bounding_sphere.center, &center);
else {
vec3 center_sum = vec3_null;
for (uint32_t j = 0; j < sub_mesh->bone_indices_count; j++) {
center = sub_mesh->bounding_sphere.center;
mat = task->data.object.mats[j];
mat4_mult_vec3_trans(&mat, &center, &center);
vec3_add(center_sum, center, center_sum);
}
vec3_mult_scalar(center_sum, 1.0f / (float_t)sub_mesh->bone_indices_count, center);
vec3 center_sum = vec3_null;
for (uint32_t j = 0; j < sub_mesh->bone_indices_count; j++) {
center = sub_mesh->bounding_sphere.center;
mat4_mult_vec3_trans(&task->data.object.mats[j], &center, &center);
vec3_add(center_sum, center, center_sum);
}
vec3_mult_scalar(center_sum, 1.0f / (float_t)sub_mesh->bone_indices_count, center);
}
task->bounding_radius = task->data.object.mesh->bounding_sphere.radius;
}
@@ -910,7 +902,7 @@ inline static void draw_task_add(render_context* rctx, draw_object_type type, dr
inline static void draw_task_object_init(draw_task* task, object_data* object_data, mat4* mat,
float_t bounding_radius, obj_sub_mesh* sub_mesh, obj_mesh* mesh, obj_material_data* material,
std::vector<GLuint>* textures, int32_t mat_count, mat4u* mats, GLuint array_buffer,
std::vector<GLuint>* textures, int32_t mat_count, mat4* mats, GLuint array_buffer,
GLuint element_array_buffer, vec4* blend_color, vec4* emission, int32_t morph_array_buffer,
int32_t instances_count, mat4* instances_mat, void(*draw_object_func)(draw_object*)) {
task->type = DRAW_TASK_TYPE_OBJECT;
@@ -942,7 +934,7 @@ inline static void draw_task_object_init(draw_task* task, object_data* object_da
}
else {
draw->set_blend_color = false;
draw->blend_color = vec4u_identity;
draw->blend_color = vec4_identity;
}
draw->emission = *emission;
+14 -7
View File
@@ -10,14 +10,21 @@ fbo::fbo() : flags(), width(), height(), buffer(), count(), textures() {
}
fbo::fbo(int32_t width, int32_t height,
GLuint* color_textures, int32_t count, GLuint depth_texture) : flags(),
width(), height(), buffer(), count(), textures() {
fbo::~fbo() {
free_data();
}
void fbo::init_data(int32_t width, int32_t height,
GLuint* color_textures, int32_t count, GLuint depth_texture) {
if (buffer) {
glDeleteFramebuffers(1, &buffer);
buffer = 0;
}
free(textures);
if (textures) {
delete[] textures;
textures = 0;
}
count = min(count, 8);
@@ -30,7 +37,7 @@ fbo::fbo(int32_t width, int32_t height,
this->count++;
}
textures = force_malloc_s(GLuint, this->count);
textures = new GLuint[this->count];
for (int32_t i = 0; i < count; i++)
textures[i] = color_textures[i];
@@ -52,14 +59,14 @@ fbo::fbo(int32_t width, int32_t height,
glCheckFramebufferStatus(GL_FRAMEBUFFER);
}
fbo::~fbo() {
void fbo::free_data() {
if (buffer) {
glDeleteFramebuffers(1, &buffer);
buffer = 0;
}
if (textures) {
free(textures);
delete[] textures;
textures = 0;
}
}
+4 -2
View File
@@ -20,10 +20,12 @@ struct fbo {
GLuint* textures;
fbo();
fbo(int32_t width, int32_t height,
GLuint* color_textures, int32_t count, GLuint depth_texture);
~fbo();
void init_data(int32_t width, int32_t height,
GLuint* color_textures, int32_t count, GLuint depth_texture);
void free_data();
static void blit(GLuint src_fbo, GLuint dst_fbo,
GLint src_x0, GLint src_y0, GLint src_x1, GLint src_y1,
GLint dst_x0, GLint dst_y0, GLint dst_x1, GLint dst_y1, GLbitfield mask, GLenum filter);
-26
View File
@@ -7,8 +7,6 @@
#include "static_var.hpp"
SysFrameRate sys_frame_rate;
DivaPvFrameRate diva_pv_frame_rate;
DivaStageFrameRate diva_stage_frame_rate;
FrameRateControl::FrameRateControl() {
frame_speed = 1.0f;
@@ -33,27 +31,3 @@ SysFrameRate::~SysFrameRate() {
float_t SysFrameRate::GetDeltaFrame() {
return get_delta_frame() * get_anim_frame_speed() * frame_speed;
}
DivaPvFrameRate::DivaPvFrameRate() {
frame_speed = 1.0f;
}
DivaPvFrameRate::~DivaPvFrameRate() {
}
float_t DivaPvFrameRate::GetDeltaFrame() {
return get_delta_frame() * get_anim_frame_speed() * frame_speed;
}
DivaStageFrameRate::DivaStageFrameRate() {
frame_speed = 1.0f;
}
DivaStageFrameRate::~DivaStageFrameRate() {
}
float_t DivaStageFrameRate::GetDeltaFrame() {
return get_delta_frame() * get_anim_frame_speed() * frame_speed;
}
+1 -15
View File
@@ -13,6 +13,7 @@ public:
FrameRateControl();
virtual ~FrameRateControl();
virtual float_t GetDeltaFrame() = 0;
virtual void SetFrameSpeed(float_t frame_speed);
};
@@ -21,23 +22,8 @@ class SysFrameRate : public FrameRateControl {
public:
SysFrameRate();
virtual ~SysFrameRate() override;
virtual float_t GetDeltaFrame() override;
};
class DivaPvFrameRate : public FrameRateControl {
public:
DivaPvFrameRate();
virtual ~DivaPvFrameRate() override;
virtual float_t GetDeltaFrame() override;
};
class DivaStageFrameRate : public FrameRateControl {
public:
DivaStageFrameRate();
virtual ~DivaStageFrameRate() override;
virtual float_t GetDeltaFrame() override;
};
extern SysFrameRate sys_frame_rate;
extern DivaPvFrameRate diva_pv_frame_rate;
extern DivaStageFrameRate diva_stage_frame_rate;
+11 -11
View File
@@ -13,19 +13,19 @@
struct light_data {
light_type type;
vec4u ambient;
vec4u diffuse;
vec4u specular;
vec4u position;
vec4 ambient;
vec4 diffuse;
vec4 specular;
vec4 position;
vec3 spot_direction;
float_t spot_exponent;
float_t spot_cutoff;
float_t constant;
float_t linear;
float_t quadratic;
vec4u ibl_specular;
vec4u ibl_back;
vec4u ibl_direction;
vec4 ibl_specular;
vec4 ibl_back;
vec4 ibl_direction;
vec3 tone_curve;
bool clip_plane[4];
@@ -82,10 +82,10 @@ struct light_data {
struct light_set {
light_data lights[LIGHT_MAX];
vec4u ambient_intensity;
mat4u irradiance_r;
mat4u irradiance_g;
mat4u irradiance_b;
vec4 ambient_intensity;
mat4 irradiance_r;
mat4 irradiance_g;
mat4 irradiance_b;
light_set();
+19 -25
View File
@@ -142,7 +142,7 @@ bool obj_mesh_vertex_buffer::load(obj_mesh& mesh) {
return false;
{
const vec4u attib_default = { 0.0f, 0.0f, 0.0f, 1.0f };
const vec4 attib_default = { 0.0f, 0.0f, 0.0f, 1.0f };
obj_vertex_format vertex_format = mesh.vertex_format;
obj_vertex_data* vertex_file = mesh.vertex;
@@ -168,20 +168,20 @@ bool obj_mesh_vertex_buffer::load(obj_mesh& mesh) {
enum_or(_vertex_format, OBJ_VERTEX_TEXCOORD3);
if (~_vertex_format & OBJ_VERTEX_COLOR0 && vertex_format & OBJ_VERTEX_COLOR0
&& memcmp(&vertex_file[i].normal, &vec4u_identity, sizeof(vec4u)))
&& memcmp(&vertex_file[i].normal, &vec4_identity, sizeof(vec4)))
enum_or(_vertex_format, OBJ_VERTEX_COLOR0);
if (~_vertex_format & OBJ_VERTEX_COLOR1 && vertex_format & OBJ_VERTEX_COLOR1
&& memcmp(&vertex_file[i].normal, &vec4u_identity, sizeof(vec4u)))
&& memcmp(&vertex_file[i].normal, &vec4_identity, sizeof(vec4)))
enum_or(_vertex_format, OBJ_VERTEX_COLOR1);
if (~_vertex_format & OBJ_VERTEX_BONE_DATA && vertex_format & OBJ_VERTEX_BONE_DATA
&& memcmp(&vertex_file[i].bone_index, &vec4iu_null, sizeof(vec4iu))
&& memcmp(&vertex_file[i].bone_weight, &vec4u_null, sizeof(vec4u)))
&& memcmp(&vertex_file[i].bone_index, &vec4i_null, sizeof(vec4i))
&& memcmp(&vertex_file[i].bone_weight, &vec4_null, sizeof(vec4)))
enum_or(_vertex_format, OBJ_VERTEX_BONE_DATA);
if (~_vertex_format & OBJ_VERTEX_UNKNOWN && vertex_format & OBJ_VERTEX_UNKNOWN
&& memcmp(&vertex_file[i].unknown, &attib_default, sizeof(vec4u)))
&& memcmp(&vertex_file[i].unknown, &attib_default, sizeof(vec4)))
enum_or(_vertex_format, OBJ_VERTEX_UNKNOWN);
}
@@ -214,7 +214,7 @@ bool obj_mesh_vertex_buffer::load(obj_mesh& mesh) {
}
if (vertex_format & OBJ_VERTEX_TANGENT) {
*(vec4u*)d = vertex_file[i].tangent;
*(vec4*)d = vertex_file[i].tangent;
d += 16;
}
@@ -244,24 +244,24 @@ bool obj_mesh_vertex_buffer::load(obj_mesh& mesh) {
}
if (vertex_format & OBJ_VERTEX_COLOR0) {
*(vec4u*)d = vertex_file[i].color0;
*(vec4*)d = vertex_file[i].color0;
d += 16;
}
if (vertex_format & OBJ_VERTEX_COLOR1) {
*(vec4u*)d = vertex_file[i].color1;
*(vec4*)d = vertex_file[i].color1;
d += 16;
}
if (vertex_format & OBJ_VERTEX_BONE_DATA) {
*(vec4u*)d = vertex_file[i].bone_weight;
*(vec4*)d = vertex_file[i].bone_weight;
d += 16;
*(vec4iu*)d = vertex_file[i].bone_index;
*(vec4i*)d = vertex_file[i].bone_index;
d += 16;
}
if (vertex_format & OBJ_VERTEX_UNKNOWN) {
*(vec4u*)d = vertex_file[i].unknown;
*(vec4*)d = vertex_file[i].unknown;
d += 16;
}
}
@@ -488,10 +488,7 @@ void obj_skin_set_matrix_buffer(obj_skin* s, mat4* matrices,
mat4_mult(mat, &matrices[bone_id], &temp);
mat4_mult(&temp, global_mat, &temp);
mat4 inv_bind_pose_mat = s->bones[i].inv_bind_pose_mat;
mat4_mult(&inv_bind_pose_mat, &temp, &temp);
matrix_buffer[i] = temp;
mat4_mult(&s->bones[i].inv_bind_pose_mat, &temp, &matrix_buffer[i]);
}
else
for (uint32_t i = 0; i < s->bones_count; i++) {
@@ -503,10 +500,7 @@ void obj_skin_set_matrix_buffer(obj_skin* s, mat4* matrices,
temp = matrices[bone_id];
mat4_mult(&temp, global_mat, &temp);
mat4 inv_bind_pose_mat = s->bones[i].inv_bind_pose_mat;
mat4_mult(&inv_bind_pose_mat, &temp, &temp);
matrix_buffer[i] = temp;
mat4_mult(&s->bones[i].inv_bind_pose_mat, &temp, &matrix_buffer[i]);
}
}
@@ -1122,25 +1116,25 @@ bool object_storage_load_obj_set_check_not_read(uint32_t set_id,
if (!txi)
return false;
object_database local_obj_db;
object_database_file local_obj_db;
local_obj_db.read(osi->data, osi->size, true);
texture_database local_tex_db;
texture_database_file local_tex_db;
local_tex_db.read(txi->data, txi->size, true);
std::string name;
if (local_obj_db.ready)
for (object_set_info& m : local_obj_db.object_set)
for (object_set_info_file& m : local_obj_db.object_set)
if (m.id == handler->set_id) {
name = m.name;
break;
}
if (obj_db)
obj_db->merge_mdata(obj_db, &local_obj_db);
obj_db->add(&local_obj_db);
if (tex_db)
tex_db->merge_mdata(tex_db, &local_tex_db);
tex_db->add(&local_tex_db);
if (!name.size())
return false;
+2 -2
View File
@@ -17,9 +17,9 @@
#include "texture.hpp"
struct material_change {
vec4u blend_color;
vec4 blend_color;
float_t glow_intensity;
vec4u incandescence;
vec4 incandescence;
};
struct obj_mesh_index_buffer {
+5 -5
View File
@@ -705,7 +705,7 @@ void post_process_dof::apply(render_texture* rt, GLuint* samplers, camera* cam)
}
void post_process_dof::init_fbo(int32_t width, int32_t height) {
if (!this || (width == width && height == height))
if (!this || (this->width == width && this->height == height))
return;
if (textures[0]) {
@@ -732,20 +732,20 @@ void post_process_dof::init_fbo(int32_t width, int32_t height) {
glGenTextures(6, textures);
gl_state_bind_texture_2d(textures[0]);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RG16F, w20, h20);
fbo[0] = ::fbo(w20, h20, &textures[0], 1, 0);
fbo[0].init_data(w20, h20, &textures[0], 1, 0);
gl_state_bind_texture_2d(textures[1]);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RG16F, w20, h20);
fbo[1] = ::fbo(w20, h20, &textures[1], 1, 0);
fbo[1].init_data(w20, h20, &textures[1], 1, 0);
gl_state_bind_texture_2d(textures[2]);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_R11F_G11F_B10F, w2, h2);
gl_state_bind_texture_2d(textures[3]);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_R11F_G11F_B10F, w2, h2);
fbo[2] = ::fbo(w2, h2, &textures[2], 2, 0);
fbo[2].init_data(w2, h2, &textures[2], 2, 0);
gl_state_bind_texture_2d(textures[4]);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_R11F_G11F_B10F, w2, h2);
gl_state_bind_texture_2d(textures[5]);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_R8, w2, h2);
fbo[3] = ::fbo(w2, h2, &textures[4], 2, 0);
fbo[3].init_data(w2, h2, &textures[4], 2, 0);
glGenBuffers(2, ubo);
gl_state_bind_uniform_buffer(ubo[0]);
+4 -2
View File
@@ -37,8 +37,10 @@ void post_process_exposure::get_exposure(camera* cam, int32_t render_width,
int32_t render_height, bool reset_exposure, GLuint in_tex_0, GLuint in_tex_1) {
bool v2 = false;
if (!reset_exposure) {
for (int32_t i = 0; i < ROB_CHARA_COUNT; i++)
memset(&chara_data[i], 0, sizeof(post_process_exposure_chara_data));
for (int32_t i = 0; i < ROB_CHARA_COUNT; i++) {
memset(&chara_data[i].field_0, 0, sizeof(chara_data[i].field_0));
chara_data[i].field_80 = 0.0f;
}
post_process_exposure_chara_data* v6 = chara_data;
float_t v18 = (float_t)render_height / (float_t)render_width;
+428
View File
@@ -0,0 +1,428 @@
/*
by korenkonder
GitHub/GitLab: korenkonder
*/
#include <string>
#include <vector>
#include "pv_expression.hpp"
#include "../KKdLib/pv_exp.hpp"
#include "rob/rob.hpp"
#include "file_handler.hpp"
#include "render_context.hpp"
struct pv_expression {
rob_chara* rob_chr;
int32_t motion_id;
pv_exp_data* face_data;
pv_exp_data* face_data_curr;
pv_exp_data* face_data_prev;
pv_exp_data* face_cl_data;
pv_exp_data* face_cl_data_curr;
pv_exp_data* face_cl_data_prev;
float_t frame_speed;
bool face_data_update;
bool face_cl_data_update;
pv_expression();
~pv_expression();
bool ctrl();
void face_cl_set_data(float_t frame);
void face_cl_set_frame(float_t frame);
void face_set_data(float_t frame);
void face_set_frame(float_t frame);
void reset();
void reset_data();
bool set_motion(int32_t motion_id);
};
struct pv_expression_file_handler {
p_file_handler file_handler;
pv_exp* data;
int32_t load_count;
pv_expression_file_handler();
~pv_expression_file_handler();
static void load_file(pv_expression_file_handler* handler, const void* data, size_t size);
};
pv_expression_file_handler pv_expression_file_handler_data;
pv_expression pv_expression_array[6];
extern render_context* rctx_ptr;
void pv_expression_array_ctrl(void* rob_chr) {
for (pv_expression& i : pv_expression_array)
if (i.rob_chr == rob_chr) {
i.ctrl();
break;
}
}
void pv_expression_array_reset() {
for (pv_expression& i : pv_expression_array)
i.reset();
}
bool pv_expression_array_reset_data(size_t chara_id, void* rob_chr, float_t frame_speed) {
if (chara_id < 0 || chara_id >= ROB_CHARA_COUNT)
return false;
pv_expression& exp = pv_expression_array[chara_id];
exp.rob_chr = (rob_chara*)rob_chr;
exp.frame_speed = frame_speed;
exp.reset_data();
return true;
}
void pv_expression_array_reset_motion(size_t chara_id) {
if (chara_id < 0 || chara_id >= ROB_CHARA_COUNT)
return;
pv_expression& exp = pv_expression_array[chara_id];
if (exp.rob_chr)
exp.rob_chr->autoblink_enable();
exp.reset();
}
bool pv_expression_array_set_motion(size_t chara_id, int32_t motion_id) {
if (chara_id >= 0 && chara_id < ROB_CHARA_COUNT)
return pv_expression_array[chara_id].set_motion(motion_id);
return false;
}
bool pv_expression_file_check_not_ready() {
return pv_expression_file_handler_data.file_handler.check_not_ready();
}
void pv_expression_file_load(void* data, const char* path, const char* file) {
if (pv_expression_file_handler_data.load_count > 0)
pv_expression_file_handler_data.load_count++;
else if (pv_expression_file_handler_data.file_handler.read_file(data, path, file)) {
if (pv_expression_file_handler_data.data)
delete pv_expression_file_handler_data.data;
pv_expression_file_handler_data.data = new pv_exp;
pv_expression_file_handler_data.data->modern = false;
pv_expression_file_handler_data.file_handler.set_callback_data(0,
(void(*)(void*, const void*, size_t))pv_expression_file_handler::load_file,
&pv_expression_file_handler_data);
pv_expression_file_handler_data.load_count = 1;
}
else
pv_expression_file_handler_data.load_count = 0;
}
void pv_expression_file_load(void* data, const char* path, uint32_t hash) {
if (pv_expression_file_handler_data.load_count > 0)
pv_expression_file_handler_data.load_count++;
else if (pv_expression_file_handler_data.file_handler.read_file(data, path, hash, ".dex")) {
if (pv_expression_file_handler_data.data)
delete pv_expression_file_handler_data.data;
pv_expression_file_handler_data.data = new pv_exp;
pv_expression_file_handler_data.data->modern = true;
pv_expression_file_handler_data.file_handler.set_callback_data(0,
(void(*)(void*, const void*, size_t))pv_expression_file_handler::load_file,
&pv_expression_file_handler_data);
pv_expression_file_handler_data.load_count = 1;
}
else
pv_expression_file_handler_data.load_count = 0;
}
void pv_expression_file_unload() {
if (--pv_expression_file_handler_data.load_count < 0)
pv_expression_file_handler_data.load_count = 0;
else if (!pv_expression_file_handler_data.load_count) {
if (pv_expression_file_handler_data.data) {
delete pv_expression_file_handler_data.data;
pv_expression_file_handler_data.data = 0;
}
pv_expression_file_handler_data.file_handler.free_data();
}
}
pv_expression::pv_expression() : rob_chr(), face_data(), face_data_curr(), face_data_prev(),
face_cl_data(), face_cl_data_curr(), face_cl_data_prev(), face_data_update(), face_cl_data_update() {
motion_id = -1;
frame_speed = 1.0f;
}
pv_expression::~pv_expression() {
}
bool pv_expression::ctrl() {
if (!rob_chr || rob_chr->data.motion.motion_id != motion_id)
return false;
float_t frame = rob_chr->get_frame();
if (face_data_curr) {
face_set_frame(frame);
face_set_data(frame);
}
if (face_cl_data_curr) {
face_cl_set_frame(frame);
face_cl_set_data(frame);
}
return true;
}
void pv_expression::face_cl_set_data(float_t frame) {
pv_exp_data* v2 = face_cl_data_curr;
pv_exp_data* v3 = face_cl_data_prev;
int32_t id = 4;
float_t duration = 0.0f;
float_t value = 0.0f;
float_t offset = 0.0f;
if (face_cl_data_update) {
face_cl_data_update = false;
if (v2->type == 1) {
value = v2->value;
id = v2->id;
}
if (v2->type == 1 && frame - v2->frame >= v2->trans)
v3 = v2++;
else if (v3->type == 1) {
id = v3->id;
duration = 0.0f;
value = v3->value;
offset = 0.0f;
}
}
else {
float_t v9 = 1.0f;
if (v3->trans + v3->frame + 1.0f < v2->frame || v2->trans <= 0.0f)
v9 = 0.0f;
if (v2->frame + v9 > frame || v2->type != 1) {
face_cl_data_curr = v2;
face_cl_data_prev = v3;
return;
}
value = v2->value;
id = v2->id;
float_t v10 = frame - v2->frame;
float_t v11 = v2->trans - v10;
if (v11 < 0.0f) {
v11 = 0.0f;
v10 = 0.0f;
}
duration = (1.0f / frame_speed) * v11;
if (duration > 0.0f)
offset = (1.0f / frame_speed) * v10;
v3 = v2++;
}
if (id != 4 && rob_chr)
rob_chr->set_eyelid_mottbl_motion_from_face(id, duration, value, offset, &rctx_ptr->data->data_ft.mot_db);
face_cl_data_curr = v2;
face_cl_data_prev = v3;
}
void pv_expression::face_cl_set_frame(float_t frame) {
pv_exp_data* v2 = face_cl_data_prev;
pv_exp_data* v3 = face_cl_data_curr;
if (frame < v2->frame) {
v2 = face_cl_data;
v3 = face_cl_data;
}
bool update = false;
if (frame > v3->frame && v3->type != -1) {
pv_exp_data* v5 = v3 + 1;
while (v5->type != -1 && frame > v5->frame) {
v2 = v3;
v3 = v5++;
update = true;
}
}
face_cl_data_curr = v3;
face_cl_data_prev = v2;
face_cl_data_update = update;
}
void pv_expression::face_set_data(float_t frame) {
pv_exp_data* v2 = face_data_curr;
pv_exp_data* v3 = face_data_prev;
int32_t expression_id = 78;
float_t value = 0.0f;
float_t duration = 0.0f;
float_t offset = 0.0f;
if (face_data_update) {
face_data_update = false;
if (!v2->type) {
expression_id = v2->id;
value = v2->value;
}
if (!v2->type && frame - v2->frame >= v2->trans || v3->type)
v3 = v2++;
else {
expression_id = v3->id;
value = v3->value;
duration = 0.0f;
offset = 0.0f;
}
}
else {
float_t v10 = 1.0f;
if (v3->trans + v3->frame + 1.0f < v2->frame || v2->trans <= 0.0f)
v10 = 0.0f;
if (v2->frame + v10 > frame || v2->type) {
face_data_prev = v3;
face_data_curr = v2;
return;
}
expression_id = v2->id;
value = v2->value;
float_t v11 = frame - v2->frame;
float_t v12 = v2->trans - v11;
if (v12 < 0.0f) {
v12 = 0.0f;
v11 = 0.0f;
}
duration = (1.0f / frame_speed) * v12;
if (duration > 0.0f)
offset = (1.0f / frame_speed) * v11;
v3 = v2++;
}
if (expression_id != 78 && rob_chr) {
int32_t mottbl_index = expression_id_to_mottbl_index(expression_id);
rob_chr->set_face_mottbl_motion(0, mottbl_index, value, mottbl_index >= 214 && mottbl_index <= 223 ? 1 : 0,
duration, 0.0f, 1.0f, -1, offset, false, &rctx_ptr->data->data_ft.mot_db);
}
face_data_prev = v3;
face_data_curr = v2;
}
void pv_expression::face_set_frame(float_t frame) {
pv_exp_data* v2 = face_data_prev;
pv_exp_data* v3 = face_data_curr;
if (frame < v2->frame) {
v2 = face_data;
v3 = face_data;
}
bool update = false;
if (frame > v3->frame && v3->type != -1) {
pv_exp_data* v5 = v3 + 1;
while (v5->type != -1 && frame > v5->frame) {
v2 = v3;
v3 = v5++;
update = true;
}
}
face_data_curr = v3;
face_data_prev = v2;
face_data_update = update;
}
void pv_expression::reset() {
rob_chr = 0;
motion_id = -1;
face_data = 0;
face_data_curr = 0;
face_data_prev = 0;
face_cl_data = 0;
face_cl_data_curr = 0;
face_cl_data_prev = 0;
frame_speed = 1.0f;
face_data_update = false;
face_cl_data_update = false;
}
void pv_expression::reset_data() {
motion_id = -1;
face_data = 0;
face_data_curr = 0;
face_data_prev = 0;
face_cl_data = 0;
face_cl_data_curr = 0;
face_cl_data_prev = 0;
face_data_update = false;
face_cl_data_update = false;
}
bool pv_expression::set_motion(int32_t motion_id) {
if (!pv_expression_file_handler_data.data)
return false;
pv_exp* exp = pv_expression_file_handler_data.data;
if (!exp->motion_data.size()) {
reset_data();
return false;
}
const char* motion_name = rctx_ptr->data->data_ft.mot_db.get_motion_name(motion_id);
size_t motion_index = -1;
for (pv_exp_mot& i : exp->motion_data)
if (!i.name.compare(motion_name)) {
motion_index = (&i - exp->motion_data.data());
break;
}
if (motion_index == -1) {
reset_data();
return false;
}
this->motion_id = motion_id;
pv_exp_data* face_data = exp->motion_data[motion_index].face_data;
if (this->face_data != face_data) {
this->face_data = face_data;
this->face_data_prev = face_data;
this->face_data_curr = face_data;
}
pv_exp_data* face_cl_data = exp->motion_data[motion_index].face_cl_data;
if (this->face_cl_data != face_cl_data) {
this->face_cl_data = face_cl_data;
this->face_cl_data_prev = face_cl_data;
this->face_cl_data_curr = face_cl_data;
if (rob_chr)
rob_chr->autoblink_disable();
}
return true;
}
pv_expression_file_handler::pv_expression_file_handler() : data(), load_count() {
}
pv_expression_file_handler::~pv_expression_file_handler() {
}
void pv_expression_file_handler::load_file(pv_expression_file_handler* handler, const void* data, size_t size) {
handler->data->read(data, size, handler->data->modern);
}
+19
View File
@@ -0,0 +1,19 @@
/*
by korenkonder
GitHub/GitLab: korenkonder
*/
#pragma once
#include "../KKdLib/default.hpp"
extern void pv_expression_array_ctrl(void* rob_chr);
extern void pv_expression_array_reset();
extern bool pv_expression_array_reset_data(size_t chara_id, void* rob_chr, float_t frame_speed);
extern void pv_expression_array_reset_motion(size_t chara_id);
extern bool pv_expression_array_set_motion(size_t chara_id, int32_t motion_id);
extern bool pv_expression_file_check_not_ready();
extern void pv_expression_file_load(void* data, const char* path, const char* file);
extern void pv_expression_file_load(void* data, const char* path, uint32_t hash);
extern void pv_expression_file_unload();
+33 -35
View File
@@ -65,8 +65,8 @@ has_blend_color(), emission(), has_emission() {
hash = (uint32_t)-1;
}
material_list_struct::material_list_struct(uint32_t hash, vec4u& blend_color,
vec4u8& has_blend_color, vec4u& emission, vec4u8& has_emission) : hash(hash), blend_color(blend_color),
material_list_struct::material_list_struct(uint32_t hash, vec4& blend_color,
vec4u8& has_blend_color, vec4& emission, vec4u8& has_emission) : hash(hash), blend_color(blend_color),
has_blend_color(has_blend_color), emission(emission), has_emission(has_emission) {
}
@@ -81,10 +81,10 @@ texture_pattern_struct::texture_pattern_struct(texture_id src, texture_id dst) :
texture_transform_struct::texture_transform_struct() {
id = (uint32_t)-1;
mat = mat4u_identity;
mat = mat4_identity;
}
texture_transform_struct::texture_transform_struct(uint32_t id, mat4u& mat) : id(id), mat(mat) {
texture_transform_struct::texture_transform_struct(uint32_t id, mat4& mat) : id(id), mat(mat) {
}
@@ -212,7 +212,7 @@ draw_task* object_data_buffer::add_draw_task(draw_task_type type) {
if (!data)
return 0;
int32_t size = align_val(sizeof(draw_task_type) + sizeof(mat4u) + sizeof(float_t) * 2, 0x08);
int32_t size = align_val(sizeof(draw_task_type) + sizeof(mat4) + sizeof(float_t) * 2, 0x08);
switch (type) {
case DRAW_TASK_TYPE_OBJECT:
size += sizeof(draw_object);
@@ -240,15 +240,15 @@ draw_task* object_data_buffer::add_draw_task(draw_task_type type) {
return task;
}
mat4u* object_data_buffer::add_mat4(int32_t count) {
mat4* object_data_buffer::add_mat4(int32_t count) {
if (!data)
return 0;
int32_t size = sizeof(mat4u) * count;
int32_t size = sizeof(mat4) * count;
if (offset + size > this->size)
return 0;
mat4u* mats = (mat4u*)((size_t)data + offset);
mat4* mats = (mat4*)((size_t)data + offset);
offset += size;
if (max_offset < offset)
max_offset = offset;
@@ -285,10 +285,10 @@ bool object_data::get_chara_color() {
return draw_task_flags;
}
void object_data::get_material_list(int32_t* count, material_list_struct* value) {
*count = material_list_count;
void object_data::get_material_list(int32_t& count, material_list_struct*& value) {
count = material_list_count;
for (int32_t i = 0; i < *count; i++)
for (int32_t i = 0; i < count; i++)
value[i] = material_list_array[i];
}
@@ -301,33 +301,33 @@ shadow_type_enum object_data::get_shadow_type() {
return shadow_type;
}
void object_data::get_texture_color_coeff(vec4* value) {
*value = texture_color_coeff;
void object_data::get_texture_color_coeff(vec4& value) {
value = texture_color_coeff;
}
void object_data::get_texture_color_offset(vec4* value) {
*value = texture_color_offset;
void object_data::get_texture_color_offset(vec4& value) {
value = texture_color_offset;
}
void object_data::get_texture_pattern(int32_t* count, texture_pattern_struct* value) {
*count = texture_pattern_count;
void object_data::get_texture_pattern(int32_t& count, texture_pattern_struct*& value) {
count = texture_pattern_count;
for (int32_t i = 0; i < *count; i++)
for (int32_t i = 0; i < count; i++)
value[i] = texture_pattern_array[i];
}
void object_data::get_texture_specular_coeff(vec4* value) {
*value = texture_specular_coeff;
void object_data::get_texture_specular_coeff(vec4& value) {
value = texture_specular_coeff;
}
void object_data::get_texture_specular_offset(vec4* value) {
*value = texture_specular_offset;
void object_data::get_texture_specular_offset(vec4& value) {
value = texture_specular_offset;
}
void object_data::get_texture_transform(int32_t* count, texture_transform_struct* value) {
*count = texture_transform_count;
void object_data::get_texture_transform(int32_t& count, texture_transform_struct*& value) {
count = texture_transform_count;
for (int32_t i = 0; i < *count; i++)
for (int32_t i = 0; i < count; i++)
value[i] = texture_transform_array[i];
}
@@ -395,12 +395,12 @@ void object_data::set_shadow_type(shadow_type_enum type) {
shadow_type = type;
}
void object_data::set_texture_color_coeff(vec4* value) {
texture_color_coeff = *value;
void object_data::set_texture_color_coeff(vec4& value) {
texture_color_coeff = value;
}
void object_data::set_texture_color_offset(vec4* value) {
texture_color_offset = *value;
void object_data::set_texture_color_offset(vec4& value) {
texture_color_offset = value;
}
void object_data::set_texture_pattern(int32_t count, texture_pattern_struct* value) {
@@ -417,12 +417,12 @@ void object_data::set_texture_pattern(int32_t count, texture_pattern_struct* val
texture_pattern_array[i] = {};
}
void object_data::set_texture_specular_coeff(vec4* value) {
texture_specular_coeff = *value;
void object_data::set_texture_specular_coeff(vec4& value) {
texture_specular_coeff = value;
}
void object_data::set_texture_specular_offset(vec4* value) {
texture_specular_offset = *value;
void object_data::set_texture_specular_offset(vec4& value) {
texture_specular_offset = value;
}
void object_data::set_texture_transform(int32_t count, texture_transform_struct* value) {
@@ -496,8 +496,6 @@ void render_context::ctrl() {
rob_chara_array[i].item_equip->shadow_type = SHADOW_CHARA;
}*/
Glitter::glt_particle_manager.rctx = this;
rctx_ptr = this;
app::TaskWork::Ctrl();
+32 -32
View File
@@ -159,7 +159,7 @@ struct sss_data {
bool enable;
bool npr_contour;
render_texture textures[4];
vec4u param;
vec4 param;
sss_data();
~sss_data();
@@ -227,14 +227,14 @@ struct draw_state {
struct material_list_struct {
uint32_t hash;
vec4u blend_color;
vec4 blend_color;
vec4u8 has_blend_color;
vec4u emission;
vec4 emission;
vec4u8 has_emission;
material_list_struct();
material_list_struct(uint32_t hash, vec4u& blend_color,
vec4u8& has_blend_color, vec4u& emission, vec4u8& has_emission);
material_list_struct(uint32_t hash, vec4& blend_color,
vec4u8& has_blend_color, vec4& emission, vec4u8& has_emission);
};
struct texture_pattern_struct {
@@ -247,10 +247,10 @@ struct texture_pattern_struct {
struct texture_transform_struct {
uint32_t id;
mat4u mat;
mat4 mat;
texture_transform_struct();
texture_transform_struct(uint32_t id, mat4u& mat);
texture_transform_struct(uint32_t id, mat4& mat);
};
struct draw_object;
@@ -261,23 +261,23 @@ struct draw_object {
obj_material_data* material;
std::vector<GLuint>* textures;
int32_t mat_count;
mat4u* mats;
mat4* mats;
GLuint array_buffer;
GLuint element_array_buffer;
bool set_blend_color;
bool chara_color;
vec4u blend_color;
vec4u emission;
vec4 blend_color;
vec4 emission;
bool self_shadow;
shadow_type_enum shadow;
GLuint morph_array_buffer;
float_t morph_value;
int32_t texture_pattern_count;
texture_pattern_struct texture_pattern_array[TEXTURE_PATTERN_COUNT];
vec4u texture_color_coeff;
vec4u texture_color_offset;
vec4u texture_specular_coeff;
vec4u texture_specular_offset;
vec4 texture_color_coeff;
vec4 texture_color_offset;
vec4 texture_specular_coeff;
vec4 texture_specular_offset;
int32_t texture_transform_count;
texture_transform_struct texture_transform_array[TEXTURE_TRANSFORM_COUNT];
int32_t instances_count;
@@ -356,7 +356,7 @@ union draw_primitive_union {
struct draw_primitive {
draw_primitive_type type;
bool fog;
vec4u color;
vec4 color;
draw_primitive_union data;
};
@@ -379,7 +379,7 @@ union draw_task_union {
struct draw_task {
draw_task_type type;
mat4u mat;
mat4 mat;
float_t depth;
float_t bounding_radius;
draw_task_union data;
@@ -418,7 +418,7 @@ struct object_data_buffer {
~object_data_buffer();
draw_task* add_draw_task(draw_task_type type);
mat4u* add_mat4(int32_t count);
mat4* add_mat4(int32_t count);
void reset();
};
@@ -448,10 +448,10 @@ struct object_data {
morph_struct morph;
int32_t texture_pattern_count;
texture_pattern_struct texture_pattern_array[TEXTURE_PATTERN_COUNT];
vec4u texture_color_coeff;
vec4u texture_color_offset;
vec4u texture_specular_coeff;
vec4u texture_specular_offset;
vec4 texture_color_coeff;
vec4 texture_color_offset;
vec4 texture_specular_coeff;
vec4 texture_specular_offset;
float_t wet_param;
int32_t texture_transform_count;
texture_transform_struct texture_transform_array[TEXTURE_TRANSFORM_COUNT];
@@ -464,15 +464,15 @@ struct object_data {
bool get_chara_color();
::draw_task_flags get_draw_task_flags();
void get_material_list(int32_t* count, material_list_struct* value);
void get_material_list(int32_t& count, material_list_struct*& value);
void get_morph(object_info* object, float_t* value);
shadow_type_enum get_shadow_type();
void get_texture_color_coeff(vec4* value);
void get_texture_color_offset(vec4* value);
void get_texture_pattern(int32_t* count, texture_pattern_struct* value);
void get_texture_specular_coeff(vec4* value);
void get_texture_specular_offset(vec4* value);
void get_texture_transform(int32_t* count, texture_transform_struct* value);
void get_texture_color_coeff(vec4& value);
void get_texture_color_offset(vec4& value);
void get_texture_pattern(int32_t& count, texture_pattern_struct*& value);
void get_texture_specular_coeff(vec4& value);
void get_texture_specular_offset(vec4& value);
void get_texture_transform(int32_t& count, texture_transform_struct*& value);
float_t get_wet_param();
void reset();
void set_chara_color(bool value = false);
@@ -481,11 +481,11 @@ struct object_data {
void set_morph(object_info object = {}, float_t value = 0.0f);
void set_object_bounding_sphere_check_func(bool(*func)(obj_bounding_sphere*, camera*) = 0);
void set_shadow_type(shadow_type_enum type = SHADOW_CHARA);
void set_texture_color_coeff(vec4* value);
void set_texture_color_offset(vec4* value);
void set_texture_color_coeff(vec4& value);
void set_texture_color_offset(vec4& value);
void set_texture_pattern(int32_t count = 0, texture_pattern_struct* value = 0);
void set_texture_specular_coeff(vec4* value);
void set_texture_specular_offset(vec4* value);
void set_texture_specular_coeff(vec4& value);
void set_texture_specular_offset(vec4& value);
void set_texture_transform(int32_t count = 0, texture_transform_struct* value = 0);
void set_wet_param(float_t value = 0.0f);
};
+79 -23
View File
@@ -299,7 +299,7 @@ void RobOsageNodeDataNormalRef::GetMat() {
vec3 v22;
vec3 v23;
if (sub_14053D1B0(&l_trans, &r_trans, &u_trans, &d_trans, &v22, &v21, &v23)) {
mat4u mat;
mat4 mat;
mat.row0.x = v23.x;
mat.row0.y = v21.x;
mat.row0.z = v22.x;
@@ -364,7 +364,7 @@ void RobOsageNodeData::Reset() {
normal_ref.d = 0;
normal_ref.l = 0;
normal_ref.r = 0;
normal_ref.mat = mat4u_identity;
normal_ref.mat = mat4_identity;
skp_osg_node.weight = 1.0f;
skp_osg_node.inertial_cancel = 0.0f;
skp_osg_node.coli_r = 0.0f;
@@ -407,7 +407,7 @@ void RobOsageNode::Reset() {
data_ptr = &data;
opd_data.clear();
opd_data.resize(3);
mat = mat4u_null;
mat = mat4_null;
}
skin_param_osage_root_coli::skin_param_osage_root_coli() : type(),
@@ -489,12 +489,12 @@ void osage_coli::set(osage_coli* coli, skin_param_osage_root_coli* skp_root_coli
for (; skp_root_coli->type; coli++, skp_root_coli++) {
coli->type = skp_root_coli->type;
coli->radius = skp_root_coli->radius;
mat4 mat = mats[skp_root_coli->bone0_index];
mat4_mult_vec3_trans(&mat, &skp_root_coli->bone0_pos, &coli->bone0_pos);
mat4_mult_vec3_trans(&mats[skp_root_coli->bone0_index],
&skp_root_coli->bone0_pos, &coli->bone0_pos);
if (skp_root_coli->type == SKIN_PARAM_OSAGE_ROOT_COLI_TYPE_CYLINDER
|| skp_root_coli->type == SKIN_PARAM_OSAGE_ROOT_COLI_TYPE_ELLIPSE) {
mat = mats[skp_root_coli->bone1_index];
mat4_mult_vec3_trans(&mat, &skp_root_coli->bone1_pos, &coli->bone1_pos);
mat4_mult_vec3_trans(&mats[skp_root_coli->bone1_index],
&skp_root_coli->bone1_pos, &coli->bone1_pos);
vec3_sub(coli->bone1_pos, coli->bone0_pos, coli->bone_pos_diff);
vec3_length_squared(coli->bone_pos_diff, coli->bone_pos_diff_length_squared);
coli->bone_pos_diff_length = sqrtf(coli->bone_pos_diff_length_squared);
@@ -502,7 +502,8 @@ void osage_coli::set(osage_coli* coli, skin_param_osage_root_coli* skp_root_coli
coli->type = SKIN_PARAM_OSAGE_ROOT_COLI_TYPE_BALL;
}
else if (skp_root_coli->type == SKIN_PARAM_OSAGE_ROOT_COLI_TYPE_PLANE)
mat4_mult_vec3(&mat, &skp_root_coli->bone1_pos, &coli->bone1_pos);
mat4_mult_vec3(&mats[skp_root_coli->bone0_index],
&skp_root_coli->bone1_pos, &coli->bone1_pos);
}
coli->type = (skin_param_osage_root_coli_type)0;
}
@@ -721,7 +722,7 @@ void RobCloth::Disp(mat4* mat, render_context* rctx) {
}
void RobCloth::InitData(size_t root_count, size_t nodes_count, obj_skin_block_cloth_root* root,
obj_skin_block_cloth_node* nodes, mat4u* mats, int32_t a7,
obj_skin_block_cloth_node* nodes, mat4* mats, int32_t a7,
rob_chara_item_equip_object* itm_eq_obj, bone_database* bone_data) {
this->itm_eq_obj = itm_eq_obj;
obj* obj = object_storage_get_obj(itm_eq_obj->obj_info);
@@ -1403,9 +1404,7 @@ void RobOsage::InitData(obj_skin_block_osage* osg_data, obj_skin_osage_node* osg
obj_skin_bone* v36 = skin->bones;
for (uint32_t j = 0; j < skin->bones_count; j++, v36++)
if (v36->id == osg_nodes->name_index) {
mat4 mat = skin->bones[j].inv_bind_pose_mat;
mat4_inverse_normalized(&mat, &mat);
v26[i].mat = mat;
mat4_inverse_normalized(&skin->bones[j].inv_bind_pose_mat, &v26[i].mat);
break;
}
@@ -1414,11 +1413,8 @@ void RobOsage::InitData(obj_skin_block_osage* osg_data, obj_skin_osage_node* osg
}
RobOsageNode* v38 = &nodes.back();
if (memcmp(&v38->mat, &mat4_null, sizeof(mat4))) {
mat4 mat = v38->mat;
mat4_translate_mult(&mat, node.length, 0.0f, 0.0f, &mat);
node.mat = mat;
}
if (memcmp(&v38->mat, &mat4_null, sizeof(mat4)))
mat4_translate_mult(&v38->mat, node.length, 0.0f, 0.0f, &node.mat);
}
float_t* RobOsage::LoadOpdData(size_t node_index, float_t* opd_data, size_t opd_count) {
@@ -1482,7 +1478,7 @@ void RobOsage::Reset() {
set_external_force = false;
external_force = vec3_null;
parent_mat_ptr = 0;
parent_mat = mat4u_null;
parent_mat = mat4_null;
}
void RobOsage::SetAirRes(float_t air_res) {
@@ -2356,7 +2352,7 @@ void ExExpressionBlock::InitData(rob_chara_item_equip_object* itm_eq_obj,
for (int32_t i = 0; i < 9; i++) {
const char* expression = exp_data->expressions[i];
if (!expression || str_utils_compare(expression, "= "))
if (!expression || str_utils_compare_length(expression, utf8_length(expression), "= ", 2))
break;
expression += 2;
@@ -2718,6 +2714,67 @@ void skin_param_osage_root_parse(void* kv, const char* name,
_kv->close_scope();
}
int32_t expression_id_to_mottbl_index(int32_t expression_id) {
static const int32_t expression_id_to_mottbl_index_table[] = {
11, 15, 57, 19, 23, 25, 29, 33,
37, 41, 45, 49, 53, 65, 7, 69,
73, 77, 81, 85, 89, 7, 61, 6,
214, 215, 216, 217, 218, 219, 220, 221,
222, 223, 93, 95, 97, 99, 101, 103,
105, 107, 109, 111, 113, 115, 117, 119,
121, 123, 125, 127, 13, 21, 31, 39,
43, 47, 51, 55, 67, 71, 79, 83,
129, 59, 17, 91, 27, 87, 35, 75,
9, 63, 236, 238, 240, 242,
};
if (expression_id >= 0 && expression_id
< sizeof(expression_id_to_mottbl_index_table) / sizeof(int32_t))
return expression_id_to_mottbl_index_table[expression_id];
return 6;
}
int32_t hand_anim_id_to_mottbl_index(int32_t hand_anim_id) {
static const int32_t hand_anim_id_to_mottbl_index_table[] = {
195, 196, 194, 197, 201, 198, 199, 202,
203, 192, 200, 204, 204, 204, 193,
};
if (hand_anim_id >= 0 && hand_anim_id
< sizeof(hand_anim_id_to_mottbl_index_table) / sizeof(int32_t))
return hand_anim_id_to_mottbl_index_table[hand_anim_id];
return 192;
}
int32_t look_anim_id_to_mottbl_index(int32_t look_anim_id) {
static const int32_t look_anim_id_to_mottbl_index_table[] = {
168, 170, 174, 172, 178, 176, 182, 180,
166, 165, 224, 169, 171, 175, 173, 179,
177, 183, 181, 167,
};
if (look_anim_id >= 0 && look_anim_id
< sizeof(look_anim_id_to_mottbl_index_table) / sizeof(int32_t))
return look_anim_id_to_mottbl_index_table[look_anim_id];
return 165;
}
int32_t mouth_anim_id_to_mottbl_index(int32_t mouth_anim_id) {
static const int32_t mouth_anim_id_to_mottbl_index_table[] = {
134, 140, 142, 146, 144, 148, 150, 152,
132, 131, 136, 138, 154, 155, 156, 157,
158, 159, 160, 161, 162, 163, 164, 151,
135, 143, 147, 145, 133, 137, 139, 141,
149, 153, 244, 245, 246, 247, 248, 249,
250, 251, 252,
};
if (mouth_anim_id >= 0 && mouth_anim_id
< sizeof(mouth_anim_id_to_mottbl_index_table) / sizeof(int32_t))
return mouth_anim_id_to_mottbl_index_table[mouth_anim_id];
return 131;
}
osage_setting::osage_setting() {
}
@@ -3120,9 +3177,8 @@ static void sub_1402196D0(RobCloth* rob_cls) {
for (size_t i = 0; i < root_count; i++, root++) {
CLOTHNode* node = &rob_cls->nodes.data()[i + root_count];
for (size_t j = 1; j < nodes_count; j++, node += root_count) {
mat4 mat = root->field_D8;
mat4_mult_vec3_trans(&mat, &node->reset_data.trans, &node->trans);
mat4_mult_vec3(&mat, &node->reset_data.trans_diff, &node->trans_diff);
mat4_mult_vec3_trans(&root->field_D8, &node->reset_data.trans, &node->trans);
mat4_mult_vec3(&root->field_D8, &node->reset_data.trans_diff, &node->trans_diff);
}
}
}
@@ -3391,7 +3447,7 @@ void sub_14021AA60(RobCloth* rob_cls, float_t step, bool a3) {
vec3_mult_scalar(v44, v10, node->trans_diff);
if (!a3) {
mat4 v49 = rob_cls->root.data()[j].field_118;
mat4& v49 = rob_cls->root.data()[j].field_118;
mat4_mult_vec3_trans(&v49, &node->trans, &node->reset_data.trans);
mat4_mult_vec3(&v49, &node->trans_diff, &node->reset_data.trans_diff);
}
+1123 -315
View File
File diff suppressed because it is too large Load Diff
+84 -64
View File
@@ -909,9 +909,9 @@ struct bone_data {
vec3 rotation;
vec3 ik_target;
vec3 trans;
mat4u rot_mat[3];
mat4 rot_mat[3];
vec3 trans_prev[2];
mat4u rot_mat_prev[3][2];
mat4 rot_mat_prev[3][2];
mat4* pole_target_mat;
mat4* parent_mat;
bone_node* node;
@@ -973,8 +973,8 @@ struct struc_308 {
int32_t field_0;
int32_t field_4;
uint8_t field_8;
mat4u mat;
mat4u field_4C;
mat4 mat;
mat4 field_4C;
bool field_8C;
vec3 field_90;
vec3 field_9C;
@@ -1025,10 +1025,10 @@ class MotionBlendCross : public MotionBlend {
public:
bool field_20;
bool field_21;
mat4u rot_y_mat;
mat4u field_64;
mat4u field_A4;
mat4u field_E4;
mat4 rot_y_mat;
mat4 field_64;
mat4 field_A4;
mat4 field_E4;
MotionBlendCross();
virtual ~MotionBlendCross() override;
@@ -1055,10 +1055,10 @@ public:
float_t field_28;
float_t field_2C;
int32_t field_30;
mat4u rot_y_mat;
mat4u field_74;
mat4u field_B4;
mat4u field_F4;
mat4 rot_y_mat;
mat4 field_74;
mat4 field_B4;
mat4 field_F4;
MotionBlendFreeze();
virtual ~MotionBlendFreeze() override;
@@ -1088,8 +1088,10 @@ struct struc_313 {
~struc_313();
};
typedef bool(* PFNMOTIONBONECHECKFUNC)(motion_bone_index bone_index);
struct struc_240 {
bool(*bone_check_func)(motion_bone_index bone_index);
PFNMOTIONBONECHECKFUNC bone_check_func;
struc_313 field_8;
size_t motion_bone_count;
@@ -1146,15 +1148,18 @@ struct struc_241 {
float_t field_14;
float_t field_18;
float_t field_1C;
float_t field_20;
float_t field_24;
float_t field_28;
vec3 field_20;
float_t field_2C;
float_t field_30;
float_t field_34;
float_t field_38;
float_t field_3C;
float_t field_40;
struc_241();
struc_241(float_t field_0, float_t field_4, float_t field_8, float_t field_C, float_t field_10,
float_t field_14, float_t field_18, float_t field_1C, vec3 field_20, float_t field_2C,
float_t field_30, float_t field_34, float_t field_38, float_t field_3C, float_t field_40);
};
struct struc_243 {
@@ -1172,7 +1177,7 @@ struct struc_243 {
struct struc_258 {
std::vector<bone_data>* field_0;
mat4u field_8;
mat4 field_8;
struc_241 field_48;
bool field_8C;
bool field_8D;
@@ -1190,16 +1195,14 @@ struct struc_258 {
float_t field_B0;
vec3 field_B4;
vec3 field_C0;
mat4u field_CC;
mat4u field_10C;
mat4 field_CC;
mat4 field_10C;
bool field_14C;
float_t field_150;
float_t field_154;
float_t field_158;
struc_243 field_15C;
float_t field_184;
float_t field_188;
float_t field_18C;
vec3 field_184;
bool field_190;
bool field_191;
bool field_192;
@@ -1219,32 +1222,40 @@ struct struc_258 {
bool field_1C4;
int32_t field_1C8;
int32_t field_1CC;
struc_258();
};
struct struc_242 {
float_t field_0;
float_t field_4;
float_t field_8;
float_t field_C;
float_t field_10;
float_t field_14;
float_t field_18;
vec3 field_1C;
float_t field_28;
struct sleeve_data {
float_t radius;
float_t cyofs;
float_t czofs;
float_t ymin;
float_t ymax;
float_t zmin;
float_t zmax;
float_t mune_xofs;
float_t mune_yofs;
float_t mune_zofs;
float_t mune_rad;
};
struct struc_312 {
struc_242 field_0;
struc_242 field_2C;
bool field_58;
bool field_59;
struct rob_chara_bone_data_sleeve_adjust {
sleeve_data sleeve_l;
sleeve_data sleeve_r;
bool enable1;
bool enable2;
vec3 field_5C;
vec3 field_68;
vec3 field_74;
vec3 field_80;
float_t field_8C;
float_t radius;
std::vector<bone_data>* bones;
float_t step;
rob_chara_bone_data_sleeve_adjust();
void reset();
};
struct rob_chara_bone_data {
@@ -1275,7 +1286,7 @@ struct rob_chara_bone_data {
vec3 field_76C[2];
int32_t field_784;
struc_258 field_788;
struc_312 field_958;
rob_chara_bone_data_sleeve_adjust sleeve_adjust;
rob_chara_bone_data();
virtual ~rob_chara_bone_data();
@@ -1301,8 +1312,8 @@ struct rob_chara_pv_data {
vec3 field_8;
int16_t rot_y_int16;
int16_t field_16;
struc_242 field_18;
struc_242 field_44;
sleeve_data sleeve_l;
sleeve_data sleeve_r;
int32_t field_70;
int32_t motion_face_ids[10];
int32_t chara_size_index;
@@ -1324,14 +1335,15 @@ struct struc_218 {
struct struc_344 {
int32_t chara_size_index;
int32_t field_4;
int32_t field_8;
int32_t field_C;
int32_t swim_costume;
int32_t swim_s_costume;
};
struct chara_init_data {
int32_t object_set;
bone_database_skeleton_type skeleton_type;
object_info field_7E0[15];
object_info field_7E0;
object_info field_7E4[14];
uint32_t motion_set;
const struc_218* field_828;
const struc_218* field_830;
@@ -1404,7 +1416,7 @@ struct RobOsageNodeDataNormalRef {
RobOsageNode* d;
RobOsageNode* l;
RobOsageNode* r;
mat4u mat;
mat4 mat;
void GetMat();
};
@@ -1475,7 +1487,7 @@ struct RobOsageNode {
float_t child_length;
bone_node* bone_node_ptr;
mat4* bone_node_mat;
mat4u mat;
mat4 mat;
RobOsageNode* sibling_node;
float_t max_distance;
vec3 field_94;
@@ -1660,7 +1672,7 @@ struct CLOTH {
osage_coli coli[64];
osage_coli coli_ring[64];
osage_ring_data ring;
mat4u* mats;
mat4* mats;
CLOTH();
virtual ~CLOTH();
@@ -1680,14 +1692,14 @@ struct CLOTH {
struct RobClothRoot {
vec3 trans;
vec3 normal;
vec4u tangent;
vec4 tangent;
bone_node* node[4];
mat4* node_mat[4];
mat4u* mat[4];
mat4* mat[4];
float_t weight[4];
mat4u field_98;
mat4u field_D8;
mat4u field_118;
mat4 field_98;
mat4 field_D8;
mat4 field_118;
};
struct RobClothSubMeshArray {
@@ -1728,7 +1740,7 @@ struct RobCloth : public CLOTH {
void ColiSet(mat4* mats);
void Disp(mat4* mat, render_context* rctx);
void InitData(size_t root_count, size_t nodes_count, obj_skin_block_cloth_root* root,
obj_skin_block_cloth_node* nodes, mat4u* mats, int32_t a7,
obj_skin_block_cloth_node* nodes, mat4* mats, int32_t a7,
rob_chara_item_equip_object* itm_eq_obj, bone_database* bone_data);
void InitDataParent(obj_skin_block_cloth* cls_data,
rob_chara_item_equip_object* itm_eq_obj, bone_database* bone_data);
@@ -1809,7 +1821,7 @@ struct RobOsage {
int32_t yz_order;
int32_t field_1EBC;
mat4* parent_mat_ptr;
mat4u parent_mat;
mat4 parent_mat;
float_t move_cancel;
bool field_1F0C;
bool osage_reset;
@@ -2024,7 +2036,7 @@ struct rob_chara_item_equip_object {
std::vector<ExExpressionBlock*> expression_blocks;
std::vector<ExClothBlock*> cloth_blocks;
bool field_1B8;
int64_t field_1C0;
size_t osage_nodes_count;
bool use_opd;
obj_skin_ex_data* skin_ex_data;
obj_skin* skin;
@@ -2079,13 +2091,13 @@ struct rob_chara_item_equip {
int32_t field_D4;
bool disable_update;
int32_t field_DC;
vec4u texture_color_coeff;
vec4 texture_color_coeff;
float_t wet;
float_t wind_strength;
bool chara_color;
bool npr_flag;
mat4u mat;
mat4u field_13C[30];
mat4 mat;
mat4 field_13C[30];
int32_t field_8BC;
int32_t field_8C0;
int32_t field_8C4;
@@ -2120,6 +2132,7 @@ struct rob_chara_item_equip {
rob_chara_item_equip();
virtual ~rob_chara_item_equip();
rob_chara_item_equip_object* get_item_equip_object(item_id id);
void reset();
};
@@ -2602,8 +2615,8 @@ struct rob_chara_motion {
object_info hand_l_object;
object_info hand_r_object;
struc_405 field_3B0;
rob_chara_data_adjust parts_adjust[13];
rob_chara_data_adjust parts_adjust_prev[13];
rob_chara_data_adjust parts_adjust[ROB_OSAGE_PARTS_MAX];
rob_chara_data_adjust parts_adjust_prev[ROB_OSAGE_PARTS_MAX];
rob_chara_data_adjust adjust_global;
rob_chara_data_adjust adjust_global_prev;
rob_chara_data_hand_adjust hand_adjust[2];
@@ -2882,7 +2895,7 @@ struct rob_chara_data_miku_rot {
int32_t field_60;
int32_t field_64;
int32_t field_68;
mat4u field_6C;
mat4 field_6C;
void reset();
};
@@ -2898,7 +2911,7 @@ struct rob_chara_adjust_data {
bool offset_z;
bool get_global_trans;
vec3 trans;
mat4u mat;
mat4 mat;
float_t left_hand_scale;
float_t right_hand_scale;
float_t left_hand_scale_default;
@@ -2960,8 +2973,8 @@ struct struc_209 {
int32_t field_6C;
int32_t field_70;
int32_t field_74;
mat4u field_78[27];
mat4u field_738[27];
mat4 field_78[27];
mat4 field_738[27];
struc_195 field_DF8[27];
struc_195 field_1230[27];
struc_195 field_1668[27];
@@ -3128,6 +3141,8 @@ struct rob_chara {
rob_chara();
virtual ~rob_chara();
void autoblink_disable();
void autoblink_enable();
mat4* get_bone_data_mat(size_t index);
float_t get_frame();
float_t get_frame_count();
@@ -3244,3 +3259,8 @@ extern void skin_param_osage_node_parse(void* kv, const char* name,
extern void skin_param_osage_root_parse(void* kv, const char* name,
skin_param_osage_root& skp_root, bone_database* bone_data);
extern int32_t expression_id_to_mottbl_index(int32_t expression_id);
extern int32_t hand_anim_id_to_mottbl_index(int32_t hand_anim_id);
extern int32_t look_anim_id_to_mottbl_index(int32_t look_anim_id);
extern int32_t mouth_anim_id_to_mottbl_index(int32_t mouth_anim_id);
+51 -43
View File
@@ -67,6 +67,14 @@ shader_state_point::shader_state_point() {
}
shader_state_texgen::eye::eye() {
}
shader_state_texgen::object::object() {
}
shader_state_texgen::shader_state_texgen() {
}
@@ -166,7 +174,7 @@ void shader_set_data::draw_range_elements(GLenum mode,
int32_t shader_set_data::get_index_by_name(const char* name) {
for (size_t i = 0; i < size; i++)
if (!str_utils_compare(shaders[i].name, name))
return (int32_t)shaders[i].index;
return (int32_t)shaders[i].name_index;
return -1;
}
@@ -206,7 +214,7 @@ void shader_set_data::load(farc* f, bool ignore_cache, bool not_load_cache,
for (size_t i = 0; i < size; i++) {
shader* shader = &shaders[i];
shader->name = shaders_table[i].name;
shader->index = shaders_table[i].index;
shader->name_index = shaders_table[i].name_index;
shader->num_sub = shaders_table[i].num_sub;
shader->sub = force_malloc_s(shader_sub, shader->num_sub);
shader->num_uniform = shaders_table[i].num_uniform;
@@ -465,7 +473,7 @@ void shader_set_data::load(farc* f, bool ignore_cache, bool not_load_cache,
vec_frag.clear();
for (size_t j = 0; j < bind_func_table_size; j++)
if (shader->index == bind_func_table[j].index) {
if (shader->name_index == bind_func_table[j].index) {
shader->bind_func = bind_func_table[j].bind_func;
break;
}
@@ -879,56 +887,56 @@ void shader_set_data::state_texgen_get_eye_s(size_t index, vec4& data) {
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
data = this->data.state.texgen[index].eye_s;
data = this->data.state.texgen[index].eye.s;
}
void shader_set_data::state_texgen_get_eye_t(size_t index, vec4& data) {
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
data = this->data.state.texgen[index].eye_t;
data = this->data.state.texgen[index].eye.t;
}
void shader_set_data::state_texgen_get_eye_r(size_t index, vec4& data) {
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
data = this->data.state.texgen[index].eye_r;
data = this->data.state.texgen[index].eye.r;
}
void shader_set_data::state_texgen_get_eye_q(size_t index, vec4& data) {
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
data = this->data.state.texgen[index].eye_q;
data = this->data.state.texgen[index].eye.q;
}
void shader_set_data::state_texgen_get_object_s(size_t index, vec4& data) {
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
data = this->data.state.texgen[index].object_s;
data = this->data.state.texgen[index].object.s;
}
void shader_set_data::state_texgen_get_object_t(size_t index, vec4& data) {
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
data = this->data.state.texgen[index].object_t;
data = this->data.state.texgen[index].object.t;
}
void shader_set_data::state_texgen_get_object_r(size_t index, vec4& data) {
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
data = this->data.state.texgen[index].object_r;
data = this->data.state.texgen[index].object.r;
}
void shader_set_data::state_texgen_get_object_q(size_t index, vec4& data) {
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
data = this->data.state.texgen[index].object_q;
data = this->data.state.texgen[index].object.q;
}
void shader_set_data::state_texenv_get_color(size_t index, vec4& data) {
@@ -1891,10 +1899,10 @@ void shader_set_data::state_texgen_set_eye_s(size_t index, float_t x, float_t y,
return;
vec4 data = { x, y, z, w };
if (!memcmp(&this->data.state.texgen[index].eye_s, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].eye.s, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].eye_s = data;
this->data.state.texgen[index].eye.s = data;
this->data.state_update_data = true;
}
@@ -1902,10 +1910,10 @@ void shader_set_data::state_texgen_set_eye_s(size_t index, const vec4& data) {
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
if (!memcmp(&this->data.state.texgen[index].eye_s, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].eye.s, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].eye_s = data;
this->data.state.texgen[index].eye.s = data;
this->data.state_update_data = true;
}
@@ -1914,10 +1922,10 @@ void shader_set_data::state_texgen_set_eye_t(size_t index, float_t x, float_t y,
return;
vec4 data = { x, y, z, w };
if (!memcmp(&this->data.state.texgen[index].eye_t, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].eye.t, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].eye_t = data;
this->data.state.texgen[index].eye.t = data;
this->data.state_update_data = true;
}
@@ -1925,10 +1933,10 @@ void shader_set_data::state_texgen_set_eye_t(size_t index, const vec4& data) {
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
if (!memcmp(&this->data.state.texgen[index].eye_t, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].eye.t, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].eye_t = data;
this->data.state.texgen[index].eye.t = data;
this->data.state_update_data = true;
}
@@ -1937,10 +1945,10 @@ void shader_set_data::state_texgen_set_eye_r(size_t index, float_t x, float_t y,
return;
vec4 data = { x, y, z, w };
if (!memcmp(&this->data.state.texgen[index].eye_r, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].eye.r, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].eye_r = data;
this->data.state.texgen[index].eye.r = data;
this->data.state_update_data = true;
}
@@ -1948,10 +1956,10 @@ void shader_set_data::state_texgen_set_eye_r(size_t index, const vec4& data) {
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
if (!memcmp(&this->data.state.texgen[index].eye_r, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].eye.r, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].eye_r = data;
this->data.state.texgen[index].eye.r = data;
this->data.state_update_data = true;
}
@@ -1960,10 +1968,10 @@ void shader_set_data::state_texgen_set_eye_q(size_t index, float_t x, float_t y,
return;
vec4 data = { x, y, z, w };
if (!memcmp(&this->data.state.texgen[index].eye_q, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].eye.q, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].eye_q = data;
this->data.state.texgen[index].eye.q = data;
this->data.state_update_data = true;
}
@@ -1971,10 +1979,10 @@ void shader_set_data::state_texgen_set_eye_q(size_t index, const vec4& data) {
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
if (!memcmp(&this->data.state.texgen[index].eye_q, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].eye.q, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].eye_q = data;
this->data.state.texgen[index].eye.q = data;
this->data.state_update_data = true;
}
@@ -1983,10 +1991,10 @@ void shader_set_data::state_texgen_set_object_s(size_t index, float_t x, float_t
return;
vec4 data = { x, y, z, w };
if (!memcmp(&this->data.state.texgen[index].object_s, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].object.s, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].object_s = data;
this->data.state.texgen[index].object.s = data;
this->data.state_update_data = true;
}
@@ -1994,10 +2002,10 @@ void shader_set_data::state_texgen_set_object_s(size_t index, const vec4& data)
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
if (!memcmp(&this->data.state.texgen[index].object_s, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].object.s, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].object_s = data;
this->data.state.texgen[index].object.s = data;
this->data.state_update_data = true;
}
@@ -2006,10 +2014,10 @@ void shader_set_data::state_texgen_set_object_t(size_t index, float_t x, float_t
return;
vec4 data = { x, y, z, w };
if (!memcmp(&this->data.state.texgen[index].object_t, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].object.t, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].object_t = data;
this->data.state.texgen[index].object.t = data;
this->data.state_update_data = true;
}
@@ -2017,10 +2025,10 @@ void shader_set_data::state_texgen_set_object_t(size_t index, const vec4& data)
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
if (!memcmp(&this->data.state.texgen[index].object_t, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].object.t, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].object_t = data;
this->data.state.texgen[index].object.t = data;
this->data.state_update_data = true;
}
@@ -2029,10 +2037,10 @@ void shader_set_data::state_texgen_set_object_r(size_t index, float_t x, float_t
return;
vec4 data = { x, y, z, w };
if (!memcmp(&this->data.state.texgen[index].object_r, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].object.r, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].object_r = data;
this->data.state.texgen[index].object.r = data;
this->data.state_update_data = true;
}
@@ -2040,10 +2048,10 @@ void shader_set_data::state_texgen_set_object_r(size_t index, const vec4& data)
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
if (!memcmp(&this->data.state.texgen[index].object_r, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].object.r, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].object_r = data;
this->data.state.texgen[index].object.r = data;
this->data.state_update_data = true;
}
@@ -2052,10 +2060,10 @@ void shader_set_data::state_texgen_set_object_q(size_t index, float_t x, float_t
return;
vec4 data = { x, y, z, w };
if (!memcmp(&this->data.state.texgen[index].object_q, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].object.q, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].object_q = data;
this->data.state.texgen[index].object.q = data;
this->data.state_update_data = true;
}
@@ -2063,10 +2071,10 @@ void shader_set_data::state_texgen_set_object_q(size_t index, const vec4& data)
if (!this || index >= SHADER_MAX_TEXTURE_UNITS)
return;
if (!memcmp(&this->data.state.texgen[index].object_q, &data, sizeof(vec4)))
if (!memcmp(&this->data.state.texgen[index].object.q, &data, sizeof(vec4)))
return;
this->data.state.texgen[index].object_q = data;
this->data.state.texgen[index].object.q = data;
this->data.state_update_data = true;
}
+21 -23
View File
@@ -111,25 +111,23 @@ struct shader_state_point {
};
struct shader_state_texgen {
union {
vec4 eye[4];
struct {
vec4 eye_s;
vec4 eye_t;
vec4 eye_r;
vec4 eye_q;
};
};
struct eye {
vec4 s;
vec4 t;
vec4 r;
vec4 q;
union {
vec4 object[4];
struct {
vec4 object_s;
vec4 object_t;
vec4 object_r;
vec4 object_q;
};
};
eye();
} eye;
struct object {
vec4 s;
vec4 t;
vec4 r;
vec4 q;
object();
} object;
shader_state_texgen();
};
@@ -189,11 +187,11 @@ struct shader_data {
struct shader;
struct shader_set_data;
typedef void (*PFNSHADERPERMUTBINDFUNCPROC)(shader_set_data* set, shader* shad);
typedef void (*PFNSHADERBINDFUNCPROC)(shader_set_data* set, shader* shad);
struct shader_bind_func {
uint32_t index;
PFNSHADERPERMUTBINDFUNCPROC bind_func;
PFNSHADERBINDFUNCPROC bind_func;
};
struct shader_sub {
@@ -213,7 +211,7 @@ struct shader_sub_table {
struct shader_table {
const char* name;
uint32_t index;
uint32_t name_index;
int32_t num_sub;
const shader_sub_table* sub;
int32_t num_uniform;
@@ -223,13 +221,13 @@ struct shader_table {
struct shader {
const char* name;
uint32_t index;
uint32_t name_index;
int32_t num_sub;
shader_sub* sub;
int32_t num_uniform;
const uniform_name* use_uniform;
const bool* use_permut;
PFNSHADERPERMUTBINDFUNCPROC bind_func;
PFNSHADERBINDFUNCPROC bind_func;
int32_t bind(uint32_t sub_index);
static void unbind();
+19 -19
View File
@@ -37,8 +37,8 @@ enum shader_ft_sub_enum {
SHADER_FT_SUB_LAMBERT = 0x1B,
SHADER_FT_SUB_CONSTANT = 0x1C,
SHADER_FT_SUB_PEEL = 0x1D,
SHADER_FT_SUB_TONE_MAP = 0x1E,
SHADER_FT_SUB_TONE_MAP_NPR1 = 0x1F,
SHADER_FT_SUB_TONEMAP = 0x1E,
SHADER_FT_SUB_TONEMAP_NPR1 = 0x1F,
SHADER_FT_SUB_REDUCE_TEX = 0x20,
SHADER_FT_SUB_MAGNIFY = 0x21,
SHADER_FT_SUB_MLAA = 0x22,
@@ -310,19 +310,19 @@ static const int32_t peel_fpt_unival_max[] = {
1, 0,
};
static const int32_t tone_map_vpt_unival_max[] = {
static const int32_t tonemap_vpt_unival_max[] = {
0, 0, 0, 0, 1, 0, 0, 0,
};
static const int32_t tone_map_fpt_unival_max[] = {
static const int32_t tonemap_fpt_unival_max[] = {
0, 2, 2, 1, 1, 1, 0, 0,
};
static const int32_t tone_map_npr1_vpt_unival_max[] = {
static const int32_t tonemap_npr1_vpt_unival_max[] = {
0, 0, 0, 0, 1, 0, 0, 0,
};
static const int32_t tone_map_npr1_fpt_unival_max[] = {
static const int32_t tonemap_npr1_fpt_unival_max[] = {
1, 0, 0, 1, 1, 0, 0, 1,
};
@@ -891,16 +891,16 @@ static const shader_sub_table PEEL_table[] = {
static const shader_sub_table TONEMAP_table[] = {
{
SHADER_FT_SUB_TONE_MAP,
tone_map_vpt_unival_max,
tone_map_fpt_unival_max,
SHADER_FT_SUB_TONEMAP,
tonemap_vpt_unival_max,
tonemap_fpt_unival_max,
"tone_map",
"tone_map",
},
{
SHADER_FT_SUB_TONE_MAP_NPR1,
tone_map_npr1_vpt_unival_max,
tone_map_npr1_fpt_unival_max,
SHADER_FT_SUB_TONEMAP_NPR1,
tonemap_npr1_vpt_unival_max,
tonemap_npr1_fpt_unival_max,
"tone_map",
"tone_map_npr1",
},
@@ -2160,8 +2160,8 @@ static const bool SPRITE_permut[] = {
};
struct glass_eye_struct {
vec4u field_0;
vec4u field_10;
vec4 field_0;
vec4 field_10;
float_t field_20;
float_t field_24;
float_t field_28;
@@ -2178,7 +2178,7 @@ struct glass_eye_struct {
float_t field_8C;
vec3 field_90;
uint32_t frame;
vec4u field_A0;
vec4 field_A0;
bool field_B0;
bool field_B1;
bool field_B2;
@@ -2328,7 +2328,7 @@ glass_eye_struct glass_eye = {
{ 1.0f, 1.2f, 0.45f },
{ 1.0f, 1.2f, 0.25f },
{ 0.5f, 0.6f, 0.4f },
0.2f,
-0.2f,
{ 1.0f, 1.0f, 1.0f },
0.0f,
{ 0.0f, 0.0f, 0.0f },
@@ -2361,7 +2361,7 @@ static void glass_eye_calc(glass_eye_struct* glass_eye) {
vec3_mult_scalar(glass_eye->field_48, v2, glass_eye->field_80);
glass_eye->field_8C = glass_eye->field_54 * v2;
if (glass_eye->field_B0 == 0) {
glass_eye->field_A0 = vec4u_null;
glass_eye->field_A0 = vec4_null;
return;
}
@@ -2423,7 +2423,7 @@ static void glass_eye_set(glass_eye_struct* glass_eye, shader_set_data* set) {
set->local_frag_set(0x0D, v3, 1.0f - v3, glass_eye->field_20 / glass_eye->field_24, 0.0f);
float_t v4 = (glass_eye->field_24 * glass_eye->field_24) / (glass_eye->field_20 * glass_eye->field_20);
set->local_frag_set(0x0E, 1.0f - v4, v4, glass_eye->field_24 / glass_eye->field_20, 0.0f);
set->local_frag_set(0x0E, v4, 1.0f - v4, glass_eye->field_24 / glass_eye->field_20, 0.0f);
vec3_mult(glass_eye->field_74, glass_eye->field_74, *(vec3*)&temp);
temp.w = -1.0f;
@@ -2489,5 +2489,5 @@ static void shader_bind_eye_ball(shader_set_data* set, shader* shad) {
static void shader_bind_tone_map(shader_set_data* set, shader* shad) {
shad->bind(uniform_value[U_NPR] == 1
? SHADER_FT_SUB_TONE_MAP_NPR1 : SHADER_FT_SUB_TONE_MAP);
? SHADER_FT_SUB_TONEMAP_NPR1 : SHADER_FT_SUB_TONEMAP);
}
-48
View File
@@ -295,14 +295,6 @@ void shader_glsl::set(const char* name, vec4i& value) {
}
}
void shader_glsl::set(const char* name, vec4iu& value) {
int32_t location = get_uniform_location(name);
if (location != GL_INVALID_INDEX) {
use();
glUniform4i(location, value.x, value.y, value.z, value.w);
}
}
void shader_glsl::set(const char* name, int32_t x, int32_t y, int32_t z, int32_t w) {
int32_t location = get_uniform_location(name);
if (location != GL_INVALID_INDEX) {
@@ -319,14 +311,6 @@ void shader_glsl::set(const char* name, vec4& value) {
}
}
void shader_glsl::set(const char* name, vec4u& value) {
int32_t location = get_uniform_location(name);
if (location != GL_INVALID_INDEX) {
use();
glUniform4f(location, value.x, value.y, value.z, value.w);
}
}
void shader_glsl::set(const char* name, float_t x, float_t y, float_t z, float_t w) {
int32_t location = get_uniform_location(name);
if (location != GL_INVALID_INDEX) {
@@ -351,14 +335,6 @@ void shader_glsl::set(const char* name, bool transpose, mat4& value) {
}
}
void shader_glsl::set(const char* name, bool transpose, mat4u& value) {
int32_t location = get_uniform_location(name);
if (location != GL_INVALID_INDEX) {
use();
glUniformMatrix4fv(location, 1, transpose, (GLfloat*)&value);
}
}
void shader_glsl::set(const char* name, size_t count, int32_t* value) {
int32_t location = get_uniform_location(name);
if (location != GL_INVALID_INDEX) {
@@ -415,14 +391,6 @@ void shader_glsl::set(const char* name, size_t count, vec4i* value) {
}
}
void shader_glsl::set(const char* name, size_t count, vec4iu* value) {
int32_t location = get_uniform_location(name);
if (location != GL_INVALID_INDEX) {
use();
glUniform4iv(location, (GLsizei)count, (GLint*)value);
}
}
void shader_glsl::set(const char* name, size_t count, vec4* value) {
int32_t location = get_uniform_location(name);
if (location != GL_INVALID_INDEX) {
@@ -431,14 +399,6 @@ void shader_glsl::set(const char* name, size_t count, vec4* value) {
}
}
void shader_glsl::set(const char* name, size_t count, vec4u* value) {
int32_t location = get_uniform_location(name);
if (location != GL_INVALID_INDEX) {
use();
glUniform4fv(location, (GLsizei)count, (GLfloat*)value);
}
}
void shader_glsl::set(const char* name, size_t count, bool transpose, mat3* value) {
int32_t location = get_uniform_location(name);
if (location != GL_INVALID_INDEX) {
@@ -455,14 +415,6 @@ void shader_glsl::set(const char* name, size_t count, bool transpose, mat4* valu
}
}
void shader_glsl::set(const char* name, size_t count, bool transpose, mat4u* value) {
int32_t location = get_uniform_location(name);
if (location != GL_INVALID_INDEX) {
use();
glUniformMatrix4fv(location, (GLsizei)count, transpose, (GLfloat*)value);
}
}
void shader_glsl::set_uniform_block_binding(GLchar* name, GLint binding) {
GLint index = shader_get_uniform_block_index(program, name, &uniform_block);
if (index != GL_INVALID_INDEX)
-6
View File
@@ -50,14 +50,11 @@ struct shader_glsl {
void set(const char* name, vec3& value);
void set(const char* name, float_t x, float_t y, float_t z);
void set(const char* name, vec4i& value);
void set(const char* name, vec4iu& value);
void set(const char* name, int32_t x, int32_t y, int32_t z, int32_t w);
void set(const char* name, vec4& value);
void set(const char* name, vec4u& value);
void set(const char* name, float_t x, float_t y, float_t z, float_t w);
void set(const char* name, bool transpose, mat3& value);
void set(const char* name, bool transpose, mat4& value);
void set(const char* name, bool transpose, mat4u& value);
void set(const char* name, size_t count, int32_t* value);
void set(const char* name, size_t count, float_t* value);
void set(const char* name, size_t count, vec2i* value);
@@ -65,12 +62,9 @@ struct shader_glsl {
void set(const char* name, size_t count, vec3i* value);
void set(const char* name, size_t count, vec3* value);
void set(const char* name, size_t count, vec4i* value);
void set(const char* name, size_t count, vec4iu* value);
void set(const char* name, size_t count, vec4* value);
void set(const char* name, size_t count, vec4u* value);
void set(const char* name, size_t count, bool transpose, mat3* value);
void set(const char* name, size_t count, bool transpose, mat4* value);
void set(const char* name, size_t count, bool transpose, mat4u* value);
void set_uniform_block_binding(GLchar* name, GLint binding);
void unload();
void use();
+2 -6
View File
@@ -175,10 +175,6 @@ void task_stage_set_mat(mat4* mat) {
task_stage->mat = *mat;
}
void task_stage_set_mat(mat4u* mat) {
task_stage->mat = *mat;
}
void task_stage_set_stage(task_stage_info* stg_info) {
stage_detail::TaskStage_SetStage(task_stage, *stg_info);
}
@@ -343,7 +339,7 @@ static void stage_detail::TaskStage_Reset(stage_detail::TaskStage* a1) {
a1->field_FB2 = true;
a1->field_FB3 = true;
a1->field_FB4 = true;
a1->mat = mat4u_identity;
a1->mat = mat4_identity;
a1->field_FF8 = 0.0f;
}
@@ -630,7 +626,7 @@ static void stage_reset(stage* s) {
s->ring = true;
s->sky = true;
s->auth_3d_loaded = 0;
s->mat = mat4u_identity;
s->mat = mat4_identity;
s->rot_y = 0.0;
s->obj_set = -1;
+2 -3
View File
@@ -22,7 +22,7 @@ struct stage {
bool ring;
bool sky;
bool auth_3d_loaded;
mat4u mat;
mat4 mat;
float_t rot_y;
uint32_t obj_set;
@@ -49,7 +49,7 @@ namespace stage_detail {
bool field_FB2;
bool field_FB3;
bool field_FB4;
mat4u mat;
mat4 mat;
float_t field_FF8;
TaskStage();
@@ -106,7 +106,6 @@ int32_t task_stage_get_stage_index(task_stage_info* stg_info);
extern bool task_stage_has_stage_info(task_stage_info* stg_info);
extern bool task_stage_load(const char* name);
extern void task_stage_set_mat(mat4* mat);
extern void task_stage_set_mat(mat4u* mat);
extern void task_stage_set_stage(task_stage_info* stg_info);
extern void task_stage_set_stage_index(int32_t stage_index);
extern void task_stage_set_stage_indices(std::vector<int32_t>* stage_indices);
+2 -6
View File
@@ -152,10 +152,6 @@ void task_stage_modern_set_mat(mat4* mat) {
task_stage_modern->mat = *mat;
}
void task_stage_modern_set_mat(mat4u* mat) {
task_stage_modern->mat = *mat;
}
void task_stage_modern_set_stage(task_stage_modern_info* stg_info) {
stage_detail::TaskStageModern_SetStage(task_stage_modern, *stg_info);
}
@@ -329,7 +325,7 @@ static void stage_detail::TaskStageModern_Reset(stage_detail::TaskStageModern* a
a1->field_FB2 = true;
a1->field_FB3 = true;
a1->field_FB4 = true;
a1->mat = mat4u_identity;
a1->mat = mat4_identity;
a1->field_FF8 = 0.0f;
}
@@ -590,7 +586,7 @@ static void stage_modern_reset(stage_modern* s) {
s->ground = true;
s->sky = true;
s->auth_3d_loaded = 0;
s->mat = mat4u_identity;
s->mat = mat4_identity;
s->rot_y = 0.0;
s->obj_set_hash = hash_murmurhash_empty;
+2 -3
View File
@@ -20,7 +20,7 @@ struct stage_modern {
bool ground;
bool sky;
bool auth_3d_loaded;
mat4u mat;
mat4 mat;
float_t rot_y;
uint32_t obj_set_hash;
@@ -48,7 +48,7 @@ namespace stage_detail {
bool field_FB2;
bool field_FB3;
bool field_FB4;
mat4u mat;
mat4 mat;
float_t field_FF8;
void* data;
@@ -91,7 +91,6 @@ extern bool task_stage_modern_load(const char* name);
extern void task_stage_modern_set_data(void* data,
object_database* obj_db, texture_database* tex_db, stage_database* stage_data);
extern void task_stage_modern_set_mat(mat4* mat);
extern void task_stage_modern_set_mat(mat4u* mat);
extern void task_stage_modern_set_stage(task_stage_modern_info* stg_info);
extern void task_stage_modern_set_stage_hash(uint32_t stage_hash, stage_data_modern* stg_data);
extern void task_stage_modern_set_stage_hashes(std::vector<uint32_t>* stage_hashes,
+1 -1
View File
@@ -345,7 +345,7 @@ void TaskEffectFogAnim::Data::Reset() {
field_28 = 0;
field_2C = 0;
field_30 = 0;
field_34 = vec4u_identity;
field_34 = vec4_identity;
}
TaskEffectFogAnim::TaskEffectFogAnim() {
+1
View File
@@ -36,6 +36,7 @@ texture_id::texture_id(uint8_t id, uint32_t index) : id(id), index(index) {
texture::texture() : init_count(), flags(), width(), height(),
tex(), target(), internal_format(), max_mipmap_level(), size() {
}
texture* texture_init(texture_id id) {
+2 -2
View File
@@ -259,7 +259,7 @@ del "$(SolutionDir)bin\$(TargetName).lib"</Command>
<IntrinsicFunctions>true</IntrinsicFunctions>
<CallingConvention>FastCall</CallingConvention>
<CompileAs>CompileAsCpp</CompileAs>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalOptions>/Gw %(AdditionalOptions)</AdditionalOptions>
<ObjectFileName>$(IntDir)/%(RelativeDir)</ObjectFileName>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
@@ -297,7 +297,7 @@ del "$(SolutionDir)bin\$(TargetName).lib"</Command>
<IntrinsicFunctions>true</IntrinsicFunctions>
<CallingConvention>FastCall</CallingConvention>
<CompileAs>CompileAsCpp</CompileAs>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalOptions>/Gw %(AdditionalOptions)</AdditionalOptions>
<ObjectFileName>$(IntDir)/%(RelativeDir)</ObjectFileName>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
+19 -19
View File
@@ -93,14 +93,14 @@ static bone_data* bone_data_init(bone_data* bone) {
bone->ik_target = vec3_null;
bone->trans = vec3_null;
for (int32_t i = 0; i < 2; i++)
bone->rot_mat[i] = mat4u_null;
bone->rot_mat[i] = mat4_null;
for (int32_t i = 0; i < 2; i++)
bone->trans_prev[i] = vec3_null;
for (int32_t i = 0; i < 2; i++)
for (int32_t j = 0; j < 3; j++)
bone->rot_mat_prev[i][j] = mat4u_null;
bone->rot_mat_prev[i][j] = mat4_null;
bone->pole_target_mat = 0;
bone->parent_mat = 0;
@@ -816,7 +816,7 @@ static void sub_140414900(struc_308* a1, mat4* mat) {
a1->field_8C = true;
}
else {
a1->mat = mat4u_identity;
a1->mat = mat4_identity;
a1->field_8C = false;
}
}
@@ -1234,12 +1234,12 @@ static void bone_data_mult_0(bone_data* a1, int32_t skeleton_select) {
if (a1->type == BONE_DATABASE_BONE_POSITION) {
mat4_translate_mult(&mat, a1->trans.x, a1->trans.y, a1->trans.z, &mat);
a1->rot_mat[0] = mat4u_identity;
a1->rot_mat[0] = mat4_identity;
}
else if (a1->type == BONE_DATABASE_BONE_TYPE_1) {
mat4_mult_vec3_inv_trans(&mat, &a1->trans, &a1->trans);
mat4_translate_mult(&mat, a1->trans.x, a1->trans.y, a1->trans.z, &mat);
a1->rot_mat[0] = mat4u_identity;
a1->rot_mat[0] = mat4_identity;
}
else {
mat4 rot_mat;
@@ -1310,7 +1310,7 @@ void bone_data_mult_1(bone_data* a1, mat4* parent_mat, bone_data* a3, bool a4) {
mat4_transpose(&rot_mat, &a1->rot_mat[0]);
}
else
a1->rot_mat[0] = mat4u_identity;
a1->rot_mat[0] = mat4_identity;
}
}
@@ -1382,7 +1382,7 @@ void bone_data_mult_2(rob_chara_bone_data* rob_bone_data, mat4* mat) {
static void sub_140413EB0(struc_308* a1) {
a1->field_8C = false;
a1->field_4C = a1->mat;
a1->mat = mat4u_identity;
a1->mat = mat4_identity;
}
static void sub_1404117F0(motion_blend_mot* a1) {
@@ -1409,9 +1409,9 @@ static void sub_14040FBF0(motion_blend_mot* a1, float_t a2) {
mat4_transpose(&b_kl_hara_etc->rot_mat[0], &mat);
mat4_mult(&mat, &rot_mat, &rot_mat);
mat4_transpose(&rot_mat, &b_n_hara_cp->rot_mat[0]);
b_kg_hara_y->rot_mat[0] = mat4u_identity;
b_kl_hara_xz->rot_mat[0] = mat4u_identity;
b_kl_hara_etc->rot_mat[0] = mat4u_identity;
b_kg_hara_y->rot_mat[0] = mat4_identity;
b_kl_hara_xz->rot_mat[0] = mat4_identity;
b_kl_hara_etc->rot_mat[0] = mat4_identity;
float_t v8 = a1->field_4F8.field_C0;
float_t v9 = a1->field_4F8.field_C4;
@@ -2128,8 +2128,8 @@ static void bone_data_parent_reset(bone_data_parent* a1) {
static void sub_140413470(struc_308* a1) {
a1->field_0 = 0;
a1->field_8 = 0;
a1->mat = mat4u_identity;
a1->field_4C = mat4u_identity;
a1->mat = mat4_identity;
a1->field_4C = mat4_identity;
a1->field_8C = false;
a1->rot_y = 0.0f;
a1->prev_rot_y = 0.0f;
@@ -2221,7 +2221,7 @@ static void mot_blend_reset(mot_blend* a1) {
static void sub_1404198D0(struc_258* a1) {
a1->field_0 = 0;
a1->field_8 = mat4u_identity;
a1->field_8 = mat4_identity;
a1->field_48.field_0 = 0.0f;
a1->field_48.field_4 = 0.0f;
a1->field_48.field_8 = 0.0f;
@@ -2255,8 +2255,8 @@ static void sub_1404198D0(struc_258* a1) {
a1->field_B0 = 0.0f;
a1->field_B4 = vec3_null;
a1->field_C0 = vec3_null;
a1->field_CC = mat4u_identity;
a1->field_10C = mat4u_identity;
a1->field_CC = mat4_identity;
a1->field_10C = mat4_identity;
a1->field_14C = 0;
a1->field_150 = 0;
a1->field_158 = 0.0f;
@@ -3083,7 +3083,7 @@ static void bone_data_parent_load_bone_indices_from_mot(bone_data_parent* a1, mo
static void sub_140413C30(struc_308* a1) {
a1->field_8C = false;
a1->field_4C = a1->mat;
a1->mat = mat4u_identity;
a1->mat = mat4_identity;
}
static void motion_blend_mot_load_file(motion_blend_mot* a1,
@@ -3709,7 +3709,7 @@ static void rob_osage_node_data_init(rob_osage_node_data *node_data) {
node_data->normal_ref.d = 0;
node_data->normal_ref.l = 0;
node_data->normal_ref.r = 0;
node_data->normal_ref.mat = mat4u_identity;
node_data->normal_ref.mat = mat4_identity;
}
static void rob_osage_node_init(rob_osage_node* node) {
@@ -3738,7 +3738,7 @@ static void rob_osage_node_init(rob_osage_node* node) {
node->data_ptr = &node->data;
node->opd_data.end = node->opd_data.begin;
sub_14021DCC0(&node->opd_data, 3);
node->mat = mat4u_null;
node->mat = mat4_null;
}
static void skin_param_init(skin_param* skp) {
@@ -3788,7 +3788,7 @@ static void rob_osage_init(rob_osage* rob_osg) {
rob_osg->set_external_force = false;
rob_osg->external_force = vec3_null;
rob_osg->parent_mat_ptr = 0;
rob_osg->parent_mat = mat4u_null;
rob_osg->parent_mat = mat4_null;
}
static void rob_osage_node_free(rob_osage_node* node) {
+35 -35
View File
@@ -1745,7 +1745,7 @@ struct rob_chara_data_miku_rot {
vec3 field_48;
vec3 field_54;
vec3 field_60;
mat4u field_6C;
mat4 field_6C;
};
struct rob_chara_adjust_data {
@@ -1759,7 +1759,7 @@ struct rob_chara_adjust_data {
bool offset_z;
bool get_global_trans;
vec3 trans;
mat4u mat;
mat4 mat;
float_t left_hand_scale;
float_t right_hand_scale;
float_t left_hand_scale_default;
@@ -1827,8 +1827,8 @@ struct struc_209 {
int32_t field_6C;
int32_t field_70;
int32_t field_74;
mat4u field_78[27];
mat4u field_738[27];
mat4 field_78[27];
mat4 field_738[27];
struc_195 field_DF8[27];
struc_195 field_1230[27];
struc_195 field_1668[27];
@@ -2701,9 +2701,9 @@ struct bone_data {
vec3 rotation;
vec3 ik_target;
vec3 trans;
mat4u rot_mat[3];
mat4 rot_mat[3];
vec3 trans_prev[2];
mat4u rot_mat_prev[3][2];
mat4 rot_mat_prev[3][2];
mat4* pole_target_mat;
mat4* parent_mat;
bone_node* node;
@@ -2758,10 +2758,10 @@ struct MotionBlendCross {
MotionBlend base;
bool field_20;
bool field_21;
mat4u field_24;
mat4u field_64;
mat4u field_A4;
mat4u field_E4;
mat4 field_24;
mat4 field_64;
mat4 field_A4;
mat4 field_E4;
};
struct MotionBlendFreeze {
@@ -2772,10 +2772,10 @@ struct MotionBlendFreeze {
float_t field_28;
float_t field_2C;
int32_t field_30;
mat4u field_34;
mat4u field_74;
mat4u rot_y;
mat4u field_F4;
mat4 field_34;
mat4 field_74;
mat4 rot_y;
mat4 field_F4;
};
struct MotionBlendCombine {
@@ -2855,7 +2855,7 @@ struct struc_243 {
struct struc_258 {
vector_old_bone_data* field_0;
mat4u field_8;
mat4 field_8;
struc_241 field_48;
uint8_t field_8C;
uint8_t field_8D;
@@ -2873,8 +2873,8 @@ struct struc_258 {
float_t field_B0;
vec3 field_B4;
vec3 field_C0;
mat4u field_CC;
mat4u field_10C;
mat4 field_CC;
mat4 field_10C;
bool field_14C;
float_t field_150;
float_t field_154;
@@ -2939,8 +2939,8 @@ struct struc_308 {
int32_t field_0;
int32_t field_4;
uint8_t field_8;
mat4u mat;
mat4u field_4C;
mat4 mat;
mat4 field_4C;
bool field_8C;
vec3 field_90;
vec3 field_9C;
@@ -3148,7 +3148,7 @@ struct obj_skin_block_cloth {
uint32_t count;
uint32_t field_10;
int32_t field_14;
mat4u* field_18;
mat4* field_18;
struc_230* field_1C;
struc_251* field_20;
uint16_t* field_24;
@@ -3269,7 +3269,7 @@ struct rob_osage_node_data_normal_ref {
rob_osage_node* d;
rob_osage_node* l;
rob_osage_node* r;
mat4u mat;
mat4 mat;
};
struct skin_param_hinge {
@@ -3329,7 +3329,7 @@ struct rob_osage_node {
float_t child_length;
bone_node* bone_node_ptr;
mat4* bone_node_mat;
mat4u mat;
mat4 mat;
rob_osage_node* sibling_node;
float_t distance;
vec3 field_94;
@@ -3426,7 +3426,7 @@ struct rob_osage {
int32_t yz_order;
int32_t field_1EBC;
mat4* parent_mat_ptr;
mat4u parent_mat;
mat4 parent_mat;
float_t move_cancel;
bool field_1F0C;
bool osage_reset;
@@ -3726,7 +3726,7 @@ struct obj_mesh {
union obj_material_shader {
char name[8];
aft_shader_enum index;
shader_enum index;
};
struct obj_material_shader_flags {
@@ -3751,7 +3751,7 @@ struct obj_material_texture {
int32_t texture_flags;
char shader_name[8];
float_t weight;
mat4u tex_coord_mat;
mat4 tex_coord_mat;
float_t unk[8];
};
@@ -3764,10 +3764,10 @@ struct obj_material {
};
obj_material_texture textures[8];
int32_t blend_flags;
vec4u diffuse;
vec4u ambient;
vec4u specular;
vec4u emission;
vec4 diffuse;
vec4 ambient;
vec4 specular;
vec4 emission;
float_t shininess;
float_t intensity;
obj_bounding_sphere reserved_sphere;
@@ -3781,7 +3781,7 @@ struct obj_material_data {
obj_material material;
};
struct aft_obj {
struct obj {
uint32_t field_0;
uint32_t field_4;
obj_bounding_sphere bounding_sphere;
@@ -3848,7 +3848,7 @@ struct obj_skin_ex_data {
struct obj_skin {
uint32_t* bone_ids;
mat4u* bone_matrices;
mat4* bone_matrices;
const char** bone_names;
obj_skin_ex_data* ex_data;
uint32_t bone_count;
@@ -3884,7 +3884,7 @@ struct obj_set {
uint32_t signature;
uint32_t objects_count;
uint32_t max_object_id;
aft_obj** objects;
obj** objects;
obj_skin** object_skins;
const char** object_names;
uint32_t* object_ids;
@@ -4082,13 +4082,13 @@ struct rob_chara_item_equip {
item_id field_D4;
bool disable_update;
int32_t field_DC;
vec4u texture_color_coeff;
vec4 texture_color_coeff;
float_t wet;
float_t wind_strength;
bool chara_color;
bool npr_flag;
mat4u mat;
mat4u field_13C[30];
mat4 mat;
mat4 field_13C[30];
int32_t field_8BC;
int32_t field_8C0;
int32_t field_8C4;
+12 -15
View File
@@ -63,9 +63,9 @@ uint64_t inject_uint64_t(void* address, uint64_t data) {
}
static patch_struct patch_data[] = {
{ (void*)0x00000001405E4CE0, (uint64_t)&aft_shader_set, },
{ (void*)0x00000001405E4FC0, (uint64_t)&aft_shader_load_all_shaders, },
{ (void*)0x00000001405E4B50, (uint64_t)&aft_shader_bind, },
{ (void*)0x00000001405E4CE0, (uint64_t)&shader_set, },
{ (void*)0x00000001405E4FC0, (uint64_t)&shader_load_all_shaders, },
{ (void*)0x00000001405E4B50, (uint64_t)&shader_bind, },
{ (void*)0x00000001401D3860, (uint64_t)&printf_proxy, },
{ (void*)0x00000001400DE640, (uint64_t)&printf_proxy, },
//{ (void*)0x0000000140507210, (uint64_t)&rob_chara_reset_data, },
@@ -91,9 +91,6 @@ static patch_struct patch_data[] = {
static uint64_t shader_bind_func_orig_data[6];
extern bool toggle1[10];
extern bool toggle2[10];
void inject_patches() {
uint8_t buf[12];
buf[0] = 0x48;
@@ -111,17 +108,17 @@ void inject_patches() {
glutMainLoop = (void (*)())inject_uint64_t((void*)0x0000000140966008, (uint64_t)&gl_get_func_pointers);
shader_bind_func_orig_data[0] = inject_uint64_t(
(void*)&shader_name_bind_func_table[0].bind_func, (uint64_t)&aft_shader_bind_blinn);
(void*)&shader_name_bind_func_table[0].bind_func, (uint64_t)&shader_bind_blinn);
shader_bind_func_orig_data[1] = inject_uint64_t(
(void*)&shader_name_bind_func_table[1].bind_func, (uint64_t)&aft_shader_bind_cloth);
(void*)&shader_name_bind_func_table[1].bind_func, (uint64_t)&shader_bind_cloth);
shader_bind_func_orig_data[2] = inject_uint64_t(
(void*)&shader_name_bind_func_table[2].bind_func, (uint64_t)&aft_shader_bind_hair);
(void*)&shader_name_bind_func_table[2].bind_func, (uint64_t)&shader_bind_hair);
shader_bind_func_orig_data[3] = inject_uint64_t(
(void*)&shader_name_bind_func_table[3].bind_func, (uint64_t)&aft_shader_bind_membrane);
(void*)&shader_name_bind_func_table[3].bind_func, (uint64_t)&shader_bind_membrane);
shader_bind_func_orig_data[4] = inject_uint64_t(
(void*)&shader_name_bind_func_table[4].bind_func, (uint64_t)&aft_shader_bind_eye_ball);
(void*)&shader_name_bind_func_table[4].bind_func, (uint64_t)&shader_bind_eye_ball);
shader_bind_func_orig_data[5] = inject_uint64_t(
(void*)&shader_name_bind_func_table[5].bind_func, (uint64_t)&aft_shader_bind_tone_map);
(void*)&shader_name_bind_func_table[5].bind_func, (uint64_t)&shader_bind_tone_map);
}
void inject_restore() {
@@ -131,8 +128,8 @@ void inject_restore() {
free(data);
}
inject_uint64_t((void*)0x0000000140966008, (uint64_t)glutMainLoop);
inject_uint64_t((void*)0x0000000140966008, (uint64_t)glutMainLoop);
for (int32_t i = 0; i < 6; i++)
inject_uint64_t(shader_name_bind_func_table[i].bind_func, shader_bind_func_orig_data[i]);
for (int32_t i = 0; i < 6; i++)
inject_uint64_t(shader_name_bind_func_table[i].bind_func, shader_bind_func_orig_data[i]);
}
+42 -42
View File
@@ -4,8 +4,8 @@
*/
#include "shader_table.hpp"
#include "gl.hpp"
#include "../KKdLib/mat.hpp"
#include "gl.hpp"
enum uniform_name {
U_NONE = 0x00,
@@ -82,15 +82,15 @@ enum uniform_name {
U_INVALID = 0xFFFFFFFF,
};
typedef struct uniform_array {
struct uniform_array {
int32_t array[70];
} uniform_array;
};
extern uniform_array* uniform;
aft_shader* shaders = (aft_shader*)0x000000014CC57C10;
aft_shader_table_struct* aft_shader_table = (aft_shader_table_struct*)0x0000000140A41D20;
aft_shader_bind_func* shader_name_bind_func_table = (aft_shader_bind_func*)0x0000000140A40F50;
shader* shaders = (shader*)0x000000014CC57C10;
shader_table_struct* shader_table = (shader_table_struct*)0x0000000140A41D20;
shader_bind_func* shader_name_bind_func_table = (shader_bind_func*)0x0000000140A40F50;
uniform_array* uniform = (uniform_array*)0x000000014CC57AF0;
int32_t* current_vp = (int32_t*)0x000000014CC587B0;
int32_t* current_fp = (int32_t*)0x000000014CC587B4;
@@ -102,9 +102,9 @@ typedef void (GLAPIENTRY* PFNGLPROGRAMLOCALPARAMETER4FARBPROC)
(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (GLAPIENTRY* PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs);
void FASTCALL aft_shader_set(aft_shader_enum name) {
if (name == aft_shader_enum::SHADER_FFP) {
aft_shader_unbind();
void FASTCALL shader_set(shader_enum name) {
if (name == shader_enum::SHADER_FFP) {
shader_unbind();
return;
}
@@ -113,32 +113,32 @@ void FASTCALL aft_shader_set(aft_shader_enum name) {
_glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 24,
(float_t)uniform->array[U_TEXTURE_BLEND], 0.0f, 0.0f, 0.0f);
aft_shader* shad = &shaders[(size_t)name];
void (FASTCALL * bind_func)(aft_shader*) = (void (*)(aft_shader*))shad->bind_func;
shader* shad = &shaders[(size_t)name];
void (FASTCALL * bind_func)(shader*) = (void (*)(shader*))shad->bind_func;
if (bind_func)
bind_func(shad);
else
aft_shader_bind(shad, shad->subs->sub_name);
shader_bind(shad, shad->subs->sub_name);
}
void FASTCALL aft_shader_bind_blinn(aft_shader* shad) {
aft_shader_bind(shad, uniform->array[U_NORMAL]
? aft_shader_sub_enum::BLINN_FRAG : aft_shader_sub_enum::BLINN_VERT);
void FASTCALL shader_bind_blinn(shader* shad) {
shader_bind(shad, uniform->array[U_NORMAL]
? shader_sub_enum::BLINN_FRAG : shader_sub_enum::BLINN_VERT);
}
void FASTCALL aft_shader_bind_cloth(aft_shader* shad) {
aft_shader_bind(shad, uniform->array[U_NPR] ? aft_shader_sub_enum::CLOTH_NPR1
: (uniform->array[U_ANISO] ? aft_shader_sub_enum::CLOTH_ANISO : aft_shader_sub_enum::CLOTH_DEFAULT));
void FASTCALL shader_bind_cloth(shader* shad) {
shader_bind(shad, uniform->array[U_NPR] ? shader_sub_enum::CLOTH_NPR1
: (uniform->array[U_ANISO] ? shader_sub_enum::CLOTH_ANISO : shader_sub_enum::CLOTH_DEFAULT));
}
void FASTCALL aft_shader_bind_hair(aft_shader* shad) {
aft_shader_bind(shad, uniform->array[U_NPR] ? aft_shader_sub_enum::HAIR_NPR1
: (uniform->array[U_ANISO] ? aft_shader_sub_enum::HAIR_ANISO : aft_shader_sub_enum::HAIR_DEFAULT));
void FASTCALL shader_bind_hair(shader* shad) {
shader_bind(shad, uniform->array[U_NPR] ? shader_sub_enum::HAIR_NPR1
: (uniform->array[U_ANISO] ? shader_sub_enum::HAIR_ANISO : shader_sub_enum::HAIR_DEFAULT));
}
void FASTCALL aft_shader_bind_membrane(aft_shader* shad) {
void FASTCALL shader_bind_membrane(shader* shad) {
uniform->array[U_MEMBRANE] = 3;
if (aft_shader_bind(shad, aft_shader_sub_enum::MEMBRANE) < 0)
if (shader_bind(shad, shader_sub_enum::MEMBRANE) < 0)
return;
uint32_t(FASTCALL * sub_140192E00)() = (uint32_t(*)())0x0000000140192E00;
@@ -155,9 +155,9 @@ void FASTCALL aft_shader_bind_membrane(aft_shader* shad) {
_glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 10, vec.x, vec.y, vec.z, 0.0);
}
void FASTCALL aft_shader_bind_eye_ball(aft_shader* shader) {
void FASTCALL shader_bind_eye_ball(shader* shader) {
uniform->array[U18] = 0;
if (aft_shader_bind(&shaders[(size_t)aft_shader_enum::_GLASEYE], aft_shader_sub_enum::GLASS_EYE) >= 0) {
if (shader_bind(&shaders[(size_t)shader_enum::_GLASEYE], shader_sub_enum::GLASS_EYE) >= 0) {
float_t* glass_eye = (float_t*)0x0000000140CA2D70;
void (FASTCALL * glass_eye_calc)(float_t * glass_eye) = (void (*)(float_t*))0x00000001405E53D0;
void (FASTCALL * glass_eye_set)(float_t * glass_eye) = (void (*)(float_t*))0x00000001405E4750;
@@ -166,24 +166,24 @@ void FASTCALL aft_shader_bind_eye_ball(aft_shader* shader) {
}
}
void FASTCALL aft_shader_bind_tone_map(aft_shader* shader) {
aft_shader_bind(shader, uniform->array[U_NPR] == 1
? aft_shader_sub_enum::TONEMAP_NPR1 : aft_shader_sub_enum::TONEMAP);
void FASTCALL shader_bind_tone_map(shader* shader) {
shader_bind(shader, uniform->array[U_NPR] == 1
? shader_sub_enum::TONEMAP_NPR1 : shader_sub_enum::TONEMAP);
}
int32_t FASTCALL aft_shader_bind(aft_shader* shader, aft_shader_sub_enum name) {
int32_t FASTCALL shader_bind(shader* shader, shader_sub_enum name) {
int32_t num_sub = shader->num_sub;
int32_t subshader_index = 0;
if (num_sub < 1)
return -1;
for (aft_shader_sub* i = shader->subs; i->sub_name != name; i++) {
for (shader_sub* i = shader->subs; i->sub_name != name; i++) {
subshader_index++;
if (subshader_index >= num_sub)
return -1;
}
aft_shader_sub* subshader = &shader->subs[subshader_index];
shader_sub* subshader = &shader->subs[subshader_index];
if (!subshader)
return -1;
@@ -223,7 +223,7 @@ int32_t FASTCALL aft_shader_bind(aft_shader* shader, aft_shader_sub_enum name) {
return 0;
}
void FASTCALL aft_shader_unbind() {
void FASTCALL shader_unbind() {
if (current_vp)
_glDisable(GL_VERTEX_PROGRAM_ARB);
if (current_fp)
@@ -232,24 +232,24 @@ void FASTCALL aft_shader_unbind() {
current_vp = 0;
}
void FASTCALL aft_shader_load_all_shaders() {
void FASTCALL shader_load_all_shaders() {
PFNGLGENPROGRAMSARBPROC _glGenProgramsARB = *(PFNGLGENPROGRAMSARBPROC*)0x00000001411A4A70;
void (FASTCALL * shader_load_program_file)(GLuint program, const char* file_name, bool vertex_program)
= (void (*)(GLuint, const char*, bool))0x00000001405E52D0;
aft_shader_table_struct* shaders_table = &aft_shader_table[(int32_t)aft_shader_enum::_BLINN];
aft_shader* shader = &shaders[(int32_t)aft_shader_enum::_BLINN];
int32_t curr_shader = (int32_t)aft_shader_enum::SHADER_END - 1;
shader_table_struct* shaders_table = &shader_table[(int32_t)shader_enum::_BLINN];
shader* shader = &shaders[(int32_t)shader_enum::_BLINN];
int32_t curr_shader = (int32_t)shader_enum::SHADER_END - 1;
do {
shader->name = shaders_table->name;
shader->name_enum = shaders_table->name_enum;
shader->num_sub = shaders_table->num_sub;
int32_t num_sub = shaders_table->num_sub;
void* v9 = force_malloc(sizeof(aft_shader_sub) * num_sub + 8);
void* v9 = force_malloc(sizeof(shader_sub) * num_sub + 8);
*(int64_t*)v9 = num_sub;
const aft_shader_sub_table_struct* sub = shaders_table->sub;
aft_shader_sub* subs = (aft_shader_sub*)((char*)v9 + 8);
const shader_sub_table_struct* sub = shaders_table->sub;
shader_sub* subs = (shader_sub*)((char*)v9 + 8);
for (int32_t i = 0; i < num_sub; i++)
subs[i] = { };
@@ -277,11 +277,11 @@ void FASTCALL aft_shader_load_all_shaders() {
}
shader->bind_func = 0;
aft_shader_bind_func* bind_func_table = shader_name_bind_func_table;
aft_shader_enum bind_func_name = aft_shader_enum::_BLINN;
shader_bind_func* bind_func_table = shader_name_bind_func_table;
shader_enum bind_func_name = shader_enum::_BLINN;
while (shader->name_enum != bind_func_name) {
bind_func_name = (++bind_func_table)->name;
if (bind_func_table->name == aft_shader_enum::SHADER_END)
if (bind_func_table->name == shader_enum::SHADER_END)
break;
}
shader->bind_func = bind_func_table->bind_func;
+34 -34
View File
@@ -7,7 +7,7 @@
#include "../KKdLib/default.hpp"
typedef enum aft_shader_sub_enum {
typedef enum shader_sub_enum {
SHADER_SUB_FFP = 0,
BLINN_VERT = 1,
BLINN_FRAG = 2,
@@ -76,9 +76,9 @@ typedef enum aft_shader_sub_enum {
MOVIE = 65,
IMGFILTER = 66,
SPRITE = 67,
} aft_shader_sub_enum;
} shader_sub_enum;
typedef enum aft_shader_enum {
typedef enum shader_enum {
SHADER_FFP = 0,
_BLINN = 1,
_ITEM = 2,
@@ -142,10 +142,10 @@ typedef enum aft_shader_enum {
_IMGFILT = 60,
_SPRITE = 61,
SHADER_END = 62,
} aft_shader_enum;
} shader_enum;
typedef struct aft_shader_sub_table_struct {
aft_shader_sub_enum sub_name;
typedef struct shader_sub_table_struct {
shader_sub_enum sub_name;
int32_t padding;
const int32_t* vp_unival_max;
const int32_t* fp_unival_max;
@@ -153,20 +153,20 @@ typedef struct aft_shader_sub_table_struct {
int32_t num_fp;
const char** vp;
const char** fp;
} aft_shader_sub_table_struct;
} shader_sub_table_struct;
typedef struct aft_shader_table_struct {
typedef struct shader_table_struct {
const char* name;
aft_shader_enum name_enum;
shader_enum name_enum;
int32_t num_sub;
const aft_shader_sub_table_struct* sub;
const shader_sub_table_struct* sub;
int32_t num_uniform;
int32_t padding;
int32_t* use_uniform;
} aft_shader_table_struct;
} shader_table_struct;
typedef struct aft_shader_sub {
aft_shader_sub_enum sub_name;
typedef struct shader_sub {
shader_sub_enum sub_name;
int32_t padding;
int32_t* vp_unival_max;
int32_t* fp_unival_max;
@@ -174,38 +174,38 @@ typedef struct aft_shader_sub {
int32_t num_fp;
int32_t* vp;
int32_t* fp;
} aft_shader_sub;
} shader_sub;
typedef struct aft_shader {
typedef struct shader {
const char* name;
aft_shader_enum name_enum;
shader_enum name_enum;
int32_t num_sub;
aft_shader_sub* subs;
shader_sub* subs;
int32_t num_uniform;
int32_t padding;
int32_t* use_uniform;
void* bind_func;
} aft_shader;
} shader;
typedef struct aft_shader_bind_func {
aft_shader_enum name;
typedef struct shader_bind_func {
shader_enum name;
int32_t padding;
void* bind_func;
} aft_shader_bind_func;
} shader_bind_func;
extern aft_shader* shaders;
extern aft_shader_table_struct* aft_shader_table;
extern aft_shader_bind_func* shader_name_bind_func_table;
extern shader* shaders;
extern shader_table_struct* shader_table;
extern shader_bind_func* shader_name_bind_func_table;
extern int32_t* current_vp;
extern int32_t* current_fp;
extern void FASTCALL aft_shader_set(aft_shader_enum name); // 0x00000001405E4CE0
extern void FASTCALL aft_shader_bind_blinn(aft_shader* shader); // 0x00000001405E4320
extern void FASTCALL aft_shader_bind_cloth(aft_shader* shader); // 0x00000001405E4340
extern void FASTCALL aft_shader_bind_hair(aft_shader* shader); // 0x00000001405E4370
extern void FASTCALL aft_shader_bind_membrane(aft_shader* shader); // 0x00000001405E43A0
extern void FASTCALL aft_shader_bind_eye_ball(aft_shader* shader); // 0x00000001405E4530
extern void FASTCALL aft_shader_bind_tone_map(aft_shader* shader); // 0x00000001405E4580
extern int32_t FASTCALL aft_shader_bind(aft_shader* shader, aft_shader_sub_enum name); // 0x00000001405E4B50
extern void FASTCALL aft_shader_unbind(); // 0x00000001405E5660
extern void FASTCALL aft_shader_load_all_shaders(); // 0x00000001405E4FC0
extern void FASTCALL shader_set(shader_enum name); // 0x00000001405E4CE0
extern void FASTCALL shader_bind_blinn(shader* shader); // 0x00000001405E4320
extern void FASTCALL shader_bind_cloth(shader* shader); // 0x00000001405E4340
extern void FASTCALL shader_bind_hair(shader* shader); // 0x00000001405E4370
extern void FASTCALL shader_bind_membrane(shader* shader); // 0x00000001405E43A0
extern void FASTCALL shader_bind_eye_ball(shader* shader); // 0x00000001405E4530
extern void FASTCALL shader_bind_tone_map(shader* shader); // 0x00000001405E4580
extern int32_t FASTCALL shader_bind(shader* shader, shader_sub_enum name); // 0x00000001405E4B50
extern void FASTCALL shader_unbind(); // 0x00000001405E5660
extern void FASTCALL shader_load_all_shaders(); // 0x00000001405E4FC0
+1 -1
View File
@@ -1535,7 +1535,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* size, bool a3dc) {
key_val_out_write(&kv, s, "blend_color", ml->blend_color);
if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR)
key_val_out_write(&kv, s, "glow_intensity", ml->glow_intensity);
kv.write(s, "hash_name", hash_string_murmurhash(&ml->name));
kv.write(s, "hash_name", hash_string_murmurhash(ml->name));
if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR)
key_val_out_write(&kv, s, "incandescence", ml->incandescence);
kv.write(s, "name", ml->name);
+1 -1
View File
@@ -508,7 +508,7 @@ struct a3da {
a3da_post_process post_process;
a3da();
~a3da();
virtual ~a3da();
void read(const char* path);
void read(const wchar_t* path);
+18 -29
View File
@@ -115,7 +115,7 @@ bool auth_3d_database_file::load_file(void* data, const char* path, const char*
return auth_3d_db->ready;
}
auth_3d_database::auth_3d_database() : ready() {
auth_3d_database::auth_3d_database() {
}
@@ -123,10 +123,18 @@ auth_3d_database::~auth_3d_database() {
}
void auth_3d_database::add(auth_3d_database_file* auth_3d_db_file) {
if (!auth_3d_db_file || !auth_3d_db_file->ready )
return;
auth_3d_database_load_categories(this, auth_3d_db_file, false);
auth_3d_database_load_uids(this, auth_3d_db_file, false);
}
int32_t auth_3d_database::get_category_index(const char* name) {
uint32_t name_hash = hash_utf8_murmurhash(name);
for (auth_3d_database_category i : category)
if (hash_string_murmurhash(&i.name) == name_hash)
if (i.name_hash == name_hash)
return (int32_t)(&i - category.data());
return -1;
}
@@ -136,7 +144,7 @@ void auth_3d_database::get_category_uids(const char* name, std::vector<int32_t>&
uint32_t name_hash = hash_utf8_murmurhash(name);
for (auth_3d_database_category& i : category)
if (hash_string_murmurhash(&i.name) == name_hash) {
if (i.name_hash == name_hash) {
uid = i.uid;
return;
}
@@ -145,36 +153,14 @@ void auth_3d_database::get_category_uids(const char* name, std::vector<int32_t>&
int32_t auth_3d_database::get_uid(const char* name) {
uint32_t name_hash = hash_utf8_murmurhash(name);
for (auth_3d_database_uid& i : uid)
if (hash_string_murmurhash(&i.name) == name_hash)
if (i.name_hash == name_hash)
return (int32_t)(&i - uid.data());
return -1;
}
void auth_3d_database::merge_mdata(auth_3d_database_file* base_auth_3d_db,
auth_3d_database_file* mdata_auth_3d_db) {
if (!base_auth_3d_db || !mdata_auth_3d_db
|| !base_auth_3d_db->ready || !mdata_auth_3d_db->ready)
return;
auth_3d_database_load_categories(this, base_auth_3d_db, false);
auth_3d_database_load_uids(this, base_auth_3d_db, false);
auth_3d_database_load_categories(this, mdata_auth_3d_db, true);
auth_3d_database_load_uids(this, mdata_auth_3d_db, true);
ready = true;
}
void auth_3d_database::split_mdata(auth_3d_database_file* base_auth_3d_db,
auth_3d_database_file* mdata_auth_3d_db) {
if (!base_auth_3d_db || !mdata_auth_3d_db
|| !ready || !base_auth_3d_db->ready)
return;
}
auth_3d_database_uid::auth_3d_database_uid() : enabled(), org_uid(), size() {
category_hash = hash_murmurhash_empty;
name_hash = hash_murmurhash_empty;
}
auth_3d_database_uid::~auth_3d_database_uid() {
@@ -190,7 +176,7 @@ auth_3d_database_uid_file::~auth_3d_database_uid_file() {
}
auth_3d_database_category::auth_3d_database_category() {
name_hash = hash_murmurhash_empty;
}
auth_3d_database_category::~auth_3d_database_category() {
@@ -219,6 +205,7 @@ static void auth_3d_database_load_categories(auth_3d_database* auth_3d_db,
auth_3d_database_category cat;
cat.name = category_file[i];
cat.name_hash = hash_string_murmurhash(cat.name);
category.push_back(cat);
}
}
@@ -263,7 +250,9 @@ static void auth_3d_database_load_uids(auth_3d_database* auth_3d_db,
uid->enabled = true;
uid->name = uid_file->value.substr(2, uid_file->value.size() - 2);
uid->name_hash = hash_string_murmurhash(uid->name);
uid->category = uid_file->category;
uid->category_hash = hash_string_murmurhash(uid->category);
}
if (uid->enabled) {
+6 -8
View File
@@ -17,7 +17,9 @@ enum auth_3d_database_uid_flags {
struct auth_3d_database_uid {
bool enabled;
std::string category;
uint32_t category_hash;
std::string name;
uint32_t name_hash;
int32_t org_uid;
float_t size;
@@ -38,6 +40,7 @@ struct auth_3d_database_uid_file {
struct auth_3d_database_category {
std::string name;
uint32_t name_hash;
std::vector<int32_t> uid;
auth_3d_database_category();
@@ -52,7 +55,7 @@ struct auth_3d_database_file {
int32_t uid_max;
auth_3d_database_file();
~auth_3d_database_file();
virtual ~auth_3d_database_file();
void read(const char* path);
void read(const wchar_t* path);
@@ -65,19 +68,14 @@ struct auth_3d_database_file {
};
struct auth_3d_database {
bool ready;
std::vector<auth_3d_database_category> category;
std::vector<auth_3d_database_uid> uid;
auth_3d_database();
~auth_3d_database();
virtual ~auth_3d_database();
void add(auth_3d_database_file* auth_3d_db_file);
int32_t get_category_index(const char* name);
void get_category_uids(const char* name, std::vector<int32_t>& uid);
int32_t get_uid(const char* name);
void merge_mdata(auth_3d_database_file* base_auth_3d_db,
auth_3d_database_file* mdata_auth_3d_db);
void split_mdata(auth_3d_database_file* base_auth_3d_db,
auth_3d_database_file* mdata_auth_3d_db);
};
+13 -13
View File
@@ -197,7 +197,7 @@ bool bone_database::get_skeleton(const char* name, bone_database_skeleton** skel
uint32_t name_hash = hash_utf8_murmurhash(name);
for (bone_database_skeleton& i : this->skeleton)
if (hash_string_murmurhash(&i.name) == name_hash) {
if (hash_string_murmurhash(i.name) == name_hash) {
*skeleton = &i;
return true;
}
@@ -211,9 +211,9 @@ int32_t bone_database::get_skeleton_bone_index(const char* name, const char* bon
uint32_t name_hash = hash_utf8_murmurhash(name);
uint32_t bone_name_hash = hash_utf8_murmurhash(bone_name);
for (bone_database_skeleton& i : skeleton)
if (hash_string_murmurhash(&i.name) == name_hash) {
if (hash_string_murmurhash(i.name) == name_hash) {
for (bone_database_bone& j : i.bone)
if (hash_string_murmurhash(&j.name) == bone_name_hash)
if (hash_string_murmurhash(j.name) == bone_name_hash)
return (int32_t)(&j - i.bone.data());
return -1;
}
@@ -230,7 +230,7 @@ bool bone_database::get_skeleton_bones(const char* name, std::vector<bone_databa
uint32_t name_hash = hash_utf8_murmurhash(name);
for (bone_database_skeleton& i : skeleton)
if (hash_string_murmurhash(&i.name) == name_hash) {
if (hash_string_murmurhash(i.name) == name_hash) {
*bone = &i.bone;
return true;
}
@@ -247,7 +247,7 @@ bool bone_database::get_skeleton_positions(const char* name, std::vector<vec3>**
uint32_t name_hash = hash_utf8_murmurhash(name);
for (bone_database_skeleton& i : skeleton)
if (hash_string_murmurhash(&i.name) == name_hash) {
if (hash_string_murmurhash(i.name) == name_hash) {
*positions = &i.position;
return true;
}
@@ -261,9 +261,9 @@ int32_t bone_database::get_skeleton_object_bone_index(const char* name, const ch
uint32_t name_hash = hash_utf8_murmurhash(name);
uint32_t bone_name_hash = hash_utf8_murmurhash(bone_name);
for (bone_database_skeleton& i : skeleton)
if (hash_string_murmurhash(&i.name) == name_hash) {
if (hash_string_murmurhash(i.name) == name_hash) {
for (std::string& j : i.object_bone)
if (hash_string_murmurhash(&j) == bone_name_hash)
if (hash_string_murmurhash(j) == bone_name_hash)
return (int32_t)(&j - i.object_bone.data());
return -1;
}
@@ -280,7 +280,7 @@ bool bone_database::get_skeleton_object_bones(const char* name, std::vector<std:
uint32_t name_hash = hash_utf8_murmurhash(name);
for (bone_database_skeleton& i : skeleton)
if (hash_string_murmurhash(&i.name) == name_hash) {
if (hash_string_murmurhash(i.name) == name_hash) {
*object_bones = &i.object_bone;
return true;
}
@@ -294,9 +294,9 @@ int32_t bone_database::get_skeleton_motion_bone_index(const char* name, const ch
uint32_t name_hash = hash_utf8_murmurhash(name);
uint32_t bone_name_hash = hash_utf8_murmurhash(bone_name);
for (bone_database_skeleton& i : skeleton)
if (hash_string_murmurhash(&i.name) == name_hash) {
if (hash_string_murmurhash(i.name) == name_hash) {
for (std::string& j : i.motion_bone)
if (hash_string_murmurhash(&j) == bone_name_hash)
if (hash_string_murmurhash(j) == bone_name_hash)
return (int32_t)(&j - i.motion_bone.data());
return -1;
}
@@ -313,7 +313,7 @@ bool bone_database::get_skeleton_motion_bones(const char* name, std::vector<std:
uint32_t name_hash = hash_utf8_murmurhash(name);
for (bone_database_skeleton& i : skeleton)
if (hash_string_murmurhash(&i.name) == name_hash) {
if (hash_string_murmurhash(i.name) == name_hash) {
*motion_bones = &i.motion_bone;
return true;
}
@@ -330,7 +330,7 @@ bool bone_database::get_skeleton_parent_indices(const char* name, std::vector<st
uint32_t name_hash = hash_utf8_murmurhash(name);
for (bone_database_skeleton& i : skeleton)
if (hash_string_murmurhash(&i.name) == name_hash) {
if (hash_string_murmurhash(i.name) == name_hash) {
*parent_indices = &i.parent_index;
return true;
}
@@ -347,7 +347,7 @@ bool bone_database::get_skeleton_heel_height(const char* name, float_t** unknown
uint32_t name_hash = hash_utf8_murmurhash(name);
for (bone_database_skeleton& i : skeleton)
if (hash_string_murmurhash(&i.name) == name_hash) {
if (hash_string_murmurhash(i.name) == name_hash) {
*unknown_value = &i.heel_height;
return true;
}
+1 -1
View File
@@ -69,7 +69,7 @@ struct bone_database {
std::vector<bone_database_skeleton> skeleton;
bone_database();
~bone_database();
virtual ~bone_database();
void read(const char* path, bool modern);
void read(const wchar_t* path, bool modern);
+12 -12
View File
@@ -15,17 +15,17 @@
enum chara_index {
CHARA_NONE = -1,
CHARA_MIKU = 0,
CHARA_RIN = 1,
CHARA_LEN = 2,
CHARA_LUKA = 3,
CHARA_NERU = 4,
CHARA_HAKU = 5,
CHARA_KAITO = 6,
CHARA_MEIKO = 7,
CHARA_SAKINE = 8,
CHARA_TETO = 9,
CHARA_MAX = 10,
CHARA_MIKU = 0x00,
CHARA_RIN = 0x01,
CHARA_LEN = 0x02,
CHARA_LUKA = 0x03,
CHARA_NERU = 0x04,
CHARA_HAKU = 0x05,
CHARA_KAITO = 0x06,
CHARA_MEIKO = 0x07,
CHARA_SAKINE = 0x08,
CHARA_TETO = 0x09,
CHARA_MAX = 0x0A,
};
enum item_id {
@@ -181,7 +181,7 @@ struct itm_table {
std::vector<itm_table_dbgset> dbgset;
itm_table();
~itm_table();
virtual ~itm_table();
void read(const char* path);
void read(const wchar_t* path);
+96 -105
View File
@@ -10,18 +10,18 @@
#include "../hash.hpp"
#include "../str_utils.hpp"
static void motion_database_read_inner(motion_database* mot_db, stream& s);
static void motion_database_write_inner(motion_database* mot_db, stream& s);
static void motion_database_file_read_inner(motion_database_file* mot_db, stream& s);
static void motion_database_file_write_inner(motion_database_file* mot_db, stream& s);
motion_database::motion_database() : ready() {
motion_database_file::motion_database_file() : ready() {
}
motion_database::~motion_database() {
motion_database_file::~motion_database_file() {
}
void motion_database::read(const char* path) {
void motion_database_file::read(const char* path) {
if (!path)
return;
@@ -34,13 +34,13 @@ void motion_database::read(const char* path) {
if (ff) {
stream s;
s.open(ff->data, ff->size);
motion_database_read_inner(this, s);
motion_database_file_read_inner(this, s);
}
}
free(path_farc);
}
void motion_database::read(const wchar_t* path) {
void motion_database_file::read(const wchar_t* path) {
if (!path)
return;
@@ -53,22 +53,22 @@ void motion_database::read(const wchar_t* path) {
if (ff) {
stream s;
s.open(ff->data, ff->size);
motion_database_read_inner(this, s);
motion_database_file_read_inner(this, s);
}
}
free(path_farc);
}
void motion_database::read(const void* data, size_t size) {
void motion_database_file::read(const void* data, size_t size) {
if (!data || !size)
return;
stream s;
s.open(data, size);
motion_database_read_inner(this, s);
motion_database_file_read_inner(this, s);
}
void motion_database::write(const char* path) {
void motion_database_file::write(const char* path) {
if (!path || !ready)
return;
@@ -79,13 +79,13 @@ void motion_database::write(const char* path) {
stream s;
s.open();
motion_database_write_inner(this, s);
motion_database_file_write_inner(this, s);
s.copy(&ff->data, &ff->size);
f.write(path, FARC_COMPRESS_FArC, false);
}
void motion_database::write(const wchar_t* path) {
void motion_database_file::write(const wchar_t* path) {
if (!path || !ready)
return;
@@ -96,91 +96,82 @@ void motion_database::write(const wchar_t* path) {
stream s;
s.open();
motion_database_write_inner(this, s);
motion_database_file_write_inner(this, s);
s.copy(&ff->data, &ff->size);
f.write(path, FARC_COMPRESS_FArC, false);
}
void motion_database::write(void** data, size_t* size) {
void motion_database_file::write(void** data, size_t* size) {
if (!data || !size || !ready)
return;
stream s;
s.open();
motion_database_write_inner(this, s);
motion_database_file_write_inner(this, s);
s.copy(data, size);
}
void motion_database::merge_mdata(motion_database* base_mot_db,
motion_database* mdata_mot_db) {
if (!base_mot_db || !mdata_mot_db
|| !base_mot_db->ready || !mdata_mot_db->ready)
bool motion_database_file::load_file(void* data, const char* path, const char* file, uint32_t hash) {
size_t file_len = utf8_length(file);
const char* t = strrchr(file, '.');
if (t)
file_len = t - file;
std::string s = path + std::string(file, file_len);
motion_database_file* mot_db = (motion_database_file*)data;
mot_db->read(s.c_str());
return mot_db->ready;
}
motion_database::motion_database() {
}
motion_database::~motion_database() {
}
void motion_database::add(motion_database_file* mot_db_file) {
if (!mot_db_file || !mot_db_file->ready)
return;
bone_name = base_mot_db->bone_name;
bone_name = mot_db_file->bone_name;
motion_set.reserve(base_mot_db->motion_set.size());
motion_set.reserve(mot_db_file->motion_set.size());
for (motion_set_info& i : base_mot_db->motion_set) {
motion_set_info set_info;
set_info.id = i.id;
set_info.name = i.name;
set_info.name_hash = hash_string_murmurhash(&i.name);
for (motion_set_info_file& i : mot_db_file->motion_set) {
uint32_t name_hash = hash_string_murmurhash(i.name);
set_info.motion.reserve(i.motion.size());
for (motion_info& j : i.motion) {
motion_info info;
info.id = j.id;
info.name = j.name;
info.name_hash = hash_string_murmurhash(&j.name);
set_info.motion.push_back(info);
}
motion_set.push_back(set_info);
}
for (motion_set_info& i : mdata_mot_db->motion_set) {
const char* name_str = i.name.c_str();
size_t name_len = i.name.size();
motion_set_info* set_info_ptr = 0;
motion_set_info* set_info = 0;
for (motion_set_info& j : motion_set)
if (!memcmp(name_str, j.name.c_str(), min(name_len, j.name.size()) + 1)) {
set_info_ptr = &j;
if (name_hash == j.name_hash) {
set_info = &j;
break;
}
motion_set_info set_info;
set_info.id = i.id;
set_info.name = i.name;
set_info.name_hash = hash_string_murmurhash(&i.name);
if (!set_info) {
motion_set.push_back({});
set_info = &motion_set.back();
}
set_info.motion.reserve(i.motion.size());
set_info->id = i.id;
set_info->name = i.name;
set_info->name_hash = hash_string_murmurhash(set_info->name);
for (motion_info& j : i.motion) {
set_info->motion.reserve(i.motion.size());
for (motion_info_file& j : i.motion) {
motion_info info;
info.id = j.id;
info.name = j.name;
info.name_hash = hash_string_murmurhash(&j.name);
set_info.motion.push_back(info);
info.name_hash = hash_string_murmurhash(info.name);
set_info->motion.push_back(info);
}
if (set_info_ptr)
*set_info_ptr = set_info;
else
motion_set.push_back(set_info);
}
ready = true;
}
void motion_database::split_mdata(motion_database* base_mot_db,
motion_database* mdata_mot_db) {
if (!base_mot_db || !mdata_mot_db
|| !ready || !base_mot_db->ready)
return;
}
motion_set_info* motion_database::get_motion_set_by_id(uint32_t id) {
@@ -323,38 +314,41 @@ const char* motion_database::get_motion_name(uint32_t id) {
return 0;
}
bool motion_database::load_file(void* data, const char* path, const char* file, uint32_t hash) {
size_t file_len = utf8_length(file);
const char* t = strrchr(file, '.');
if (t)
file_len = t - file;
std::string s = path + std::string(file, file_len);
motion_database* mot_db = (motion_database*)data;
mot_db->read(s.c_str());
return mot_db->ready;
motion_info_file::motion_info_file() {
id = (uint32_t)-1;
}
motion_info::motion_info() : name_hash(hash_murmurhash_empty), id((uint32_t)-1) {
motion_info_file::~motion_info_file() {
}
motion_set_info_file::motion_set_info_file() {
id = (uint32_t)-1;
}
motion_set_info_file::~motion_set_info_file() {
}
motion_info::motion_info() {
name_hash = hash_murmurhash_empty;
id = (uint32_t)-1;
}
motion_info::~motion_info() {
}
motion_set_info::motion_set_info() : name_hash(hash_murmurhash_empty), id((uint32_t)-1) {
motion_set_info::motion_set_info() {
name_hash = hash_murmurhash_empty;
id = (uint32_t)-1;
}
motion_set_info::~motion_set_info() {
}
static void motion_database_read_inner(motion_database* mot_db, stream& s) {
static void motion_database_file_read_inner(motion_database_file* mot_db, stream& s) {
if (s.read_uint32_t() != 0x01)
return;
@@ -368,7 +362,7 @@ static void motion_database_read_inner(motion_database* mot_db, stream& s) {
s.position_push(motion_sets_offset, SEEK_SET);
for (uint32_t i = 0; i < motion_set_count; i++) {
motion_set_info& set_info = mot_db->motion_set[i];
motion_set_info_file& set_info = mot_db->motion_set[i];
uint32_t name_offset = s.read_uint32_t();
uint32_t motion_name_offsets_offset = s.read_uint32_t();
@@ -376,15 +370,12 @@ static void motion_database_read_inner(motion_database* mot_db, stream& s) {
uint32_t motion_ids_offset = s.read_uint32_t();
set_info.name = s.read_string_null_terminated_offset(name_offset);
set_info.name_hash = hash_string_murmurhash(&set_info.name);
set_info.motion.resize(motion_count);
s.position_push(motion_name_offsets_offset, SEEK_SET);
for (uint32_t j = 0; j < motion_count; j++) {
for (uint32_t j = 0; j < motion_count; j++)
set_info.motion[j].name = s.read_string_null_terminated_offset(s.read_uint32_t());
set_info.motion[j].name_hash = hash_string_murmurhash(&set_info.motion[j].name);
}
s.position_pop();
s.position_push(motion_ids_offset, SEEK_SET);
@@ -409,7 +400,7 @@ static void motion_database_read_inner(motion_database* mot_db, stream& s) {
mot_db->ready = true;
}
static void motion_database_write_inner(motion_database* mot_db, stream& s) {
static void motion_database_file_write_inner(motion_database_file* mot_db, stream& s) {
s.write_int32_t(0);
s.write_int32_t(0);
s.write_int32_t(0);
@@ -426,15 +417,15 @@ static void motion_database_write_inner(motion_database* mot_db, stream& s) {
s.align_write(0x20);
size_t size = 0;
for (motion_set_info& i : mot_db->motion_set)
for (motion_set_info_file& i : mot_db->motion_set)
size += i.name.size() + 1;
int64_t motion_set_name_offset = s.get_position();
s.write(size);
size = 0;
for (motion_set_info& i : mot_db->motion_set)
for (motion_info& j : i.motion)
for (motion_set_info_file& i : mot_db->motion_set)
for (motion_info_file& j : i.motion)
size += j.name.size() + 1;
int64_t motion_name_offset = s.get_position();
@@ -443,19 +434,19 @@ static void motion_database_write_inner(motion_database* mot_db, stream& s) {
int64_t motion_names_offset = s.get_position();
size = 0;
for (motion_set_info& i : mot_db->motion_set)
for (motion_set_info_file& i : mot_db->motion_set)
size += 0x04 * i.motion.size();
s.write(size);
s.align_write(0x20);
int64_t motion_ids_offset = s.get_position();
for (motion_set_info& i : mot_db->motion_set)
for (motion_info& j : i.motion)
for (motion_set_info_file& i : mot_db->motion_set)
for (motion_info_file& j : i.motion)
s.write_uint32_t(j.id);
s.align_write(0x20);
int64_t motion_set_ids_offset = s.get_position();
for (motion_set_info& i : mot_db->motion_set)
for (motion_set_info_file& i : mot_db->motion_set)
s.write_uint32_t(i.id);
int64_t bone_name_offset = s.get_position();
@@ -466,13 +457,13 @@ static void motion_database_write_inner(motion_database* mot_db, stream& s) {
s.align_write(0x20);
s.position_push(motion_set_name_offset, SEEK_SET);
for (motion_set_info& i : mot_db->motion_set)
for (motion_set_info_file& i : mot_db->motion_set)
s.write_string_null_terminated(i.name);
s.position_pop();
s.position_push(motion_name_offset, SEEK_SET);
for (motion_set_info& i : mot_db->motion_set)
for (motion_info& j : i.motion)
for (motion_set_info_file& i : mot_db->motion_set)
for (motion_info_file& j : i.motion)
s.write_string_null_terminated(j.name);
s.position_pop();
@@ -486,15 +477,15 @@ static void motion_database_write_inner(motion_database* mot_db, stream& s) {
s.align_write(0x20);
s.position_push(motion_names_offset, SEEK_SET);
for (motion_set_info& i : mot_db->motion_set)
for (motion_info& j : i.motion) {
for (motion_set_info_file& i : mot_db->motion_set)
for (motion_info_file& j : i.motion) {
s.write_uint32_t((uint32_t)motion_name_offset);
motion_name_offset += j.name.size() + 1;
}
s.position_pop();
s.position_push(motion_sets_offset, SEEK_SET);
for (motion_set_info& i : mot_db->motion_set) {
for (motion_set_info_file& i : mot_db->motion_set) {
s.write_uint32_t((uint32_t)motion_set_name_offset);
s.write_uint32_t((uint32_t)motion_names_offset);
s.write_uint32_t((uint32_t)i.motion.size());
+32 -8
View File
@@ -9,6 +9,23 @@
#include <vector>
#include "../default.hpp"
struct motion_info_file {
std::string name;
uint32_t id;
motion_info_file();
~motion_info_file();
};
struct motion_set_info_file {
std::string name;
uint32_t id;
std::vector<motion_info_file> motion;
motion_set_info_file();
~motion_set_info_file();
};
struct motion_info {
std::string name;
uint32_t name_hash;
@@ -28,14 +45,14 @@ struct motion_set_info {
~motion_set_info();
};
struct motion_database {
struct motion_database_file {
bool ready;
std::vector<std::string> bone_name;
std::vector<motion_set_info> motion_set;
std::vector<motion_set_info_file> motion_set;
motion_database();
~motion_database();
motion_database_file();
virtual ~motion_database_file();
void read(const char* path);
void read(const wchar_t* path);
@@ -44,8 +61,17 @@ struct motion_database {
void write(const wchar_t* path);
void write(void** data, size_t* size);
void merge_mdata(motion_database* base_mot_db, motion_database* mdata_mot_db);
void split_mdata(motion_database* base_mot_db, motion_database* mdata_mot_db);
static bool load_file(void* data, const char* path, const char* file, uint32_t hash);
};
struct motion_database {
std::vector<std::string> bone_name;
std::vector<motion_set_info> motion_set;
motion_database();
virtual ~motion_database();
void add(motion_database_file* mot_db_file);
motion_set_info* get_motion_set_by_id(uint32_t id);
motion_set_info* get_motion_set_by_name(const char* name);
@@ -59,6 +85,4 @@ struct motion_database {
motion_info* get_motion_by_name(const char* name);
uint32_t get_motion_id(const char* name);
const char* get_motion_name(uint32_t id);
static bool load_file(void* data, const char* path, const char* file, uint32_t hash);
};
+135 -114
View File
@@ -11,10 +11,10 @@
#include "../sort.hpp"
#include "../str_utils.hpp"
static void object_database_classic_read_inner(object_database* obj_db, stream& s);
static void object_database_classic_write_inner(object_database* obj_db, stream& s);
static void object_database_modern_read_inner(object_database* obj_db, stream& s, uint32_t header_length);
static void object_database_modern_write_inner(object_database* obj_db, stream& s);
static void object_database_file_classic_read_inner(object_database_file* obj_db, stream& s);
static void object_database_file_classic_write_inner(object_database_file* obj_db, stream& s);
static void object_database_file_modern_read_inner(object_database_file* obj_db, stream& s, uint32_t header_length);
static void object_database_file_modern_write_inner(object_database_file* obj_db, stream& s);
static int64_t object_database_strings_get_string_offset(std::vector<std::string>& vec,
std::vector<int64_t>& vec_off, std::string& str);
static void object_database_strings_push_back_check(std::vector<std::string>& vec, std::string& str);
@@ -29,15 +29,48 @@ object_info::object_info(uint32_t id, uint32_t set_id) {
this->set_id = set_id;
}
object_database::object_database() : ready(), modern(), is_x() {
object_set_info_file::object_set_info_file() : id() {
}
object_database::~object_database() {
object_set_info_file::~object_set_info_file() {
}
void object_database::read(const char* path, bool modern) {
object_info_data_file::object_info_data_file() : id() {
}
object_info_data_file::~object_info_data_file() {
}
object_set_info::object_set_info() : name_hash(), id() {
name_hash = hash_murmurhash_empty;
}
object_set_info::~object_set_info() {
}
object_info_data::object_info_data() : id() {
name_hash_fnv1a64m = hash_fnv1a64m_empty;
name_hash_fnv1a64m_upper = hash_fnv1a64m_empty;
name_hash_murmurhash = hash_murmurhash_empty;
}
object_info_data::~object_info_data() {
}
object_database_file::object_database_file() : ready(), modern(), is_x() {
}
object_database_file::~object_database_file() {
}
void object_database_file::read(const char* path, bool modern) {
if (!path)
return;
@@ -51,7 +84,7 @@ void object_database::read(const char* path, bool modern) {
s.read(data, s.length);
stream s_bin;
s_bin.open(data, s.length);
object_database_classic_read_inner(this, s_bin);
object_database_file_classic_read_inner(this, s_bin);
free(data);
}
}
@@ -66,14 +99,14 @@ void object_database::read(const char* path, bool modern) {
stream s_mosi;
s_mosi.open(st.data);
s_mosi.is_big_endian = st.header.use_big_endian;
object_database_modern_read_inner(this, s_mosi, st.header.length);
object_database_file_modern_read_inner(this, s_mosi, st.header.length);
}
}
free(path_osi);
}
}
void object_database::read(const wchar_t* path, bool modern) {
void object_database_file::read(const wchar_t* path, bool modern) {
if (!path)
return;
@@ -87,7 +120,7 @@ void object_database::read(const wchar_t* path, bool modern) {
s.read(data, s.length);
stream s_bin;
s_bin.open(data, s.length);
object_database_classic_read_inner(this, s_bin);
object_database_file_classic_read_inner(this, s_bin);
free(data);
}
}
@@ -102,21 +135,21 @@ void object_database::read(const wchar_t* path, bool modern) {
stream s_mosi;
s_mosi.open(st.data);
s_mosi.is_big_endian = st.header.use_big_endian;
object_database_modern_read_inner(this, s_mosi, st.header.length);
object_database_file_modern_read_inner(this, s_mosi, st.header.length);
}
}
free(path_osi);
}
}
void object_database::read(const void* data, size_t size, bool modern) {
void object_database_file::read(const void* data, size_t size, bool modern) {
if (!data || !size)
return;
if (!modern) {
stream s;
s.open(data, size);
object_database_classic_read_inner(this, s);
object_database_file_classic_read_inner(this, s);
}
else {
f2_struct st;
@@ -125,12 +158,12 @@ void object_database::read(const void* data, size_t size, bool modern) {
stream s_mosi;
s_mosi.open(st.data);
s_mosi.is_big_endian = st.header.use_big_endian;
object_database_modern_read_inner(this, s_mosi, st.header.length);
object_database_file_modern_read_inner(this, s_mosi, st.header.length);
}
}
}
void object_database::write(const char* path) {
void object_database_file::write(const char* path) {
if (!path || !ready)
return;
@@ -139,7 +172,7 @@ void object_database::write(const char* path) {
stream s;
s.open(path_bin, "wb");
if (s.io.stream)
object_database_classic_write_inner(this, s);
object_database_file_classic_write_inner(this, s);
free(path_bin);
}
else {
@@ -147,12 +180,12 @@ void object_database::write(const char* path) {
stream s;
s.open(path_osi, "wb");
if (s.io.stream)
object_database_modern_write_inner(this, s);
object_database_file_modern_write_inner(this, s);
free(path_osi);
}
}
void object_database::write(const wchar_t* path) {
void object_database_file::write(const wchar_t* path) {
if (!path || !ready)
return;
@@ -161,7 +194,7 @@ void object_database::write(const wchar_t* path) {
stream s;
s.open(path_bin, L"wb");
if (s.io.stream)
object_database_classic_write_inner(this, s);
object_database_file_classic_write_inner(this, s);
free(path_bin);
}
else {
@@ -169,58 +202,89 @@ void object_database::write(const wchar_t* path) {
stream s;
s.open(path_osi, L"wb");
if (s.io.stream)
object_database_modern_write_inner(this, s);
object_database_file_modern_write_inner(this, s);
free(path_osi);
}
}
void object_database::write(void** data, size_t* size) {
void object_database_file::write(void** data, size_t* size) {
if (!data || !size || !ready)
return;
stream s;
s.open();
if (!modern)
object_database_classic_write_inner(this, s);
object_database_file_classic_write_inner(this, s);
else
object_database_modern_write_inner(this, s);
object_database_file_modern_write_inner(this, s);
s.align_write(0x10);
s.copy(data, size);
}
void object_database::merge_mdata(object_database* base_obj_db, object_database* mdata_obj_db) {
if (!base_obj_db || !mdata_obj_db || !base_obj_db->ready || !mdata_obj_db->ready)
bool object_database_file::load_file(void* data, const char* path, const char* file, uint32_t hash) {
size_t file_len = utf8_length(file);
const char* t = strrchr(file, '.');
if (t)
file_len = t - file;
std::string s = path + std::string(file, file_len);
object_database_file* obj_db = (object_database_file*)data;
obj_db->read(s.c_str(), obj_db->modern);
return obj_db->ready;
}
object_database::object_database() {
}
object_database::~object_database() {
}
void object_database::add(object_database_file* obj_db_file) {
if (!obj_db_file || !obj_db_file->ready)
return;
if (this != base_obj_db)
object_set = base_obj_db->object_set;
object_set.reserve(obj_db_file->object_set.size());
for (object_set_info& i : mdata_obj_db->object_set) {
uint32_t name_hash = i.name_hash;
for (object_set_info_file& i : obj_db_file->object_set) {
uint32_t name_hash = hash_string_murmurhash(i.name);
object_set_info* info = 0;
object_set_info* set_info = 0;
for (object_set_info& j : object_set)
if (name_hash == j.name_hash) {
info = &j;
set_info = &j;
break;
}
if (info)
*info = i;
else
object_set.push_back(i);
}
if (!set_info) {
object_set.push_back({});
set_info = &object_set.back();
}
if (this != base_obj_db) {
ready = true;
modern = base_obj_db->modern;
is_x = base_obj_db->is_x;
}
}
set_info->id = i.id;
set_info->name = i.name;
set_info->name_hash = hash_string_murmurhash(i.name);
set_info->object_file_name = i.object_file_name;
set_info->texture_file_name = i.texture_file_name;
set_info->archive_file_name = i.archive_file_name;
void object_database::split_mdata(object_database* base_obj_db, object_database* mdata_obj_db) {
if (!base_obj_db || !mdata_obj_db || !ready || !base_obj_db->ready)
return;
set_info->object.clear();
set_info->object.reserve(i.object.size());
for (object_info_data_file& j : i.object) {
object_info_data info;
info.id = j.id;
info.name = j.name;
info.name_hash_fnv1a64m = hash_string_fnv1a64m(info.name);
info.name_hash_fnv1a64m_upper = hash_string_fnv1a64m(info.name, true);
info.name_hash_murmurhash = hash_string_murmurhash(info.name);
set_info->object.push_back(info);
}
}
}
bool object_database::get_object_set_info(const char* name, object_set_info** set_info) {
@@ -379,38 +443,7 @@ const char* object_database::get_object_name(object_info obj_info) {
return 0;
}
bool object_database::load_file(void* data, const char* path, const char* file, uint32_t hash) {
size_t file_len = utf8_length(file);
const char* t = strrchr(file, '.');
if (t)
file_len = t - file;
std::string s = path + std::string(file, file_len);
object_database* obj_db = (object_database*)data;
obj_db->read(s.c_str(), obj_db->modern);
return obj_db->ready;
}
object_set_info::object_set_info() : name_hash(), id() {
}
object_set_info::~object_set_info() {
}
object_info_data::object_info_data() : id(), name_hash_fnv1a64m(),
name_hash_fnv1a64m_upper(), name_hash_murmurhash() {
}
object_info_data::~object_info_data() {
}
static void object_database_classic_read_inner(object_database* obj_db, stream& s) {
static void object_database_file_classic_read_inner(object_database_file* obj_db, stream& s) {
uint32_t object_set_count = s.read_uint32_t();
uint32_t max_object_set_id = s.read_uint32_t();
uint32_t object_sets_offset = s.read_uint32_t();
@@ -421,9 +454,8 @@ static void object_database_classic_read_inner(object_database* obj_db, stream&
s.position_push(object_sets_offset, SEEK_SET);
for (uint32_t i = 0; i < object_set_count; i++) {
object_set_info* set_info = &obj_db->object_set[i];
object_set_info_file* set_info = &obj_db->object_set[i];
set_info->name = s.read_string_null_terminated_offset(s.read_uint32_t());
set_info->name_hash = hash_string_murmurhash(&set_info->name);
set_info->id = s.read_uint32_t();
set_info->object_file_name = s.read_string_null_terminated_offset(s.read_uint32_t());
set_info->texture_file_name = s.read_string_null_terminated_offset(s.read_uint32_t());
@@ -434,13 +466,10 @@ static void object_database_classic_read_inner(object_database* obj_db, stream&
s.position_push(objects_offset, SEEK_SET);
for (uint32_t i = 0; i < object_count; i++) {
object_info_data info;
object_info_data_file info;
info.id = s.read_uint16_t();
uint32_t set_id = s.read_uint16_t();
info.name = s.read_string_null_terminated_offset(s.read_uint32_t());
info.name_hash_fnv1a64m = hash_string_fnv1a64m(&info.name);
info.name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info.name, true);
info.name_hash_murmurhash = hash_string_murmurhash(&info.name);
if (info.id == 0xFFFF)
info.id = -1;
@@ -460,7 +489,7 @@ static void object_database_classic_read_inner(object_database* obj_db, stream&
obj_db->ready = true;
}
static void object_database_classic_write_inner(object_database* obj_db, stream& s) {
static void object_database_file_classic_write_inner(object_database_file* obj_db, stream& s) {
s.write_uint32_t(0x90669066);
s.write_uint32_t(0x90669066);
s.write_uint32_t(0x90669066);
@@ -482,7 +511,7 @@ static void object_database_classic_write_inner(object_database* obj_db, stream&
size_t off_idx = 0;
int64_t objects_offset = 0;
if (string_offsets.size()) {
for (object_set_info& i : obj_db->object_set) {
for (object_set_info_file& i : obj_db->object_set) {
string_offsets.push_back(s.get_position());
s.write_string_null_terminated(i.name);
string_offsets.push_back(s.get_position());
@@ -495,7 +524,7 @@ static void object_database_classic_write_inner(object_database* obj_db, stream&
s.align_write(0x20);
object_sets_offset = s.get_position();
for (object_set_info& i : obj_db->object_set) {
for (object_set_info_file& i : obj_db->object_set) {
s.write_uint32_t((uint32_t)string_offsets[off_idx++]);
s.write_uint32_t(i.id);
s.write_uint32_t((uint32_t)string_offsets[off_idx++]);
@@ -510,8 +539,8 @@ static void object_database_classic_write_inner(object_database* obj_db, stream&
string_offsets.clear();
string_offsets.reserve(object_count);
for (object_set_info& i : obj_db->object_set)
for (object_info_data& j : i.object) {
for (object_set_info_file& i : obj_db->object_set)
for (object_info_data_file& j : i.object) {
string_offsets.push_back(s.get_position());
s.write_string_null_terminated(j.name);
}
@@ -519,9 +548,9 @@ static void object_database_classic_write_inner(object_database* obj_db, stream&
objects_offset = s.get_position();
off_idx = 0;
for (object_set_info& i : obj_db->object_set) {
for (object_set_info_file& i : obj_db->object_set) {
uint16_t set_id = (uint16_t)i.id;
for (object_info_data& j : i.object) {
for (object_info_data_file& j : i.object) {
s.write_uint16_t((uint16_t)j.id);
s.write_uint16_t(set_id);
s.write_uint32_t((uint32_t)string_offsets[off_idx++]);
@@ -540,7 +569,7 @@ static void object_database_classic_write_inner(object_database* obj_db, stream&
s.position_pop();
}
static void object_database_modern_read_inner(object_database* obj_db, stream& s, uint32_t header_length) {
static void object_database_file_modern_read_inner(object_database_file* obj_db, stream& s, uint32_t header_length) {
bool is_x = true;
s.set_position(0x0C, SEEK_SET);
@@ -562,9 +591,8 @@ static void object_database_modern_read_inner(object_database* obj_db, stream& s
s.position_push(object_sets_offset, SEEK_SET);
if (!is_x)
for (uint32_t i = 0; i < object_set_count; i++) {
object_set_info* set_info = &obj_db->object_set[i];
object_set_info_file* set_info = &obj_db->object_set[i];
set_info->name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length));
set_info->name_hash = hash_string_murmurhash(&set_info->name);
set_info->id = s.read_uint32_t_reverse_endianness();
set_info->object_file_name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length));
set_info->texture_file_name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length));
@@ -573,9 +601,8 @@ static void object_database_modern_read_inner(object_database* obj_db, stream& s
}
else
for (uint32_t i = 0; i < object_set_count; i++) {
object_set_info* set_info = &obj_db->object_set[i];
object_set_info_file* set_info = &obj_db->object_set[i];
set_info->name = s.read_string_null_terminated_offset(s.read_offset_x());
set_info->name_hash = hash_string_murmurhash(&set_info->name);
set_info->id = s.read_uint32_t_reverse_endianness();
set_info->object_file_name = s.read_string_null_terminated_offset(s.read_offset_x());
set_info->texture_file_name = s.read_string_null_terminated_offset(s.read_offset_x());
@@ -587,13 +614,10 @@ static void object_database_modern_read_inner(object_database* obj_db, stream& s
s.position_push(objects_offset, SEEK_SET);
if (!is_x)
for (uint32_t i = 0; i < object_count; i++) {
object_info_data info;
object_info_data_file info;
info.id = s.read_uint32_t_reverse_endianness();
uint32_t set_id = s.read_uint32_t_reverse_endianness();
info.name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length));
info.name_hash_fnv1a64m = hash_string_fnv1a64m(&info.name);
info.name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info.name, true);
info.name_hash_murmurhash = hash_string_murmurhash(&info.name);
for (uint32_t i = 0; i < object_set_count; i++)
if (set_id == obj_db->object_set[i].id) {
@@ -603,13 +627,10 @@ static void object_database_modern_read_inner(object_database* obj_db, stream& s
}
else
for (uint32_t i = 0; i < object_count; i++) {
object_info_data info;
object_info_data_file info;
info.id = s.read_uint32_t_reverse_endianness();
uint32_t set_id = s.read_uint32_t_reverse_endianness();
info.name = s.read_string_null_terminated_offset(s.read_offset_x());
info.name_hash_fnv1a64m = hash_string_fnv1a64m(&info.name);
info.name_hash_fnv1a64m_upper = hash_string_fnv1a64m(&info.name, true);
info.name_hash_murmurhash = hash_string_murmurhash(&info.name);
for (uint32_t i = 0; i < object_set_count; i++)
if (set_id == obj_db->object_set[i].id) {
@@ -624,7 +645,7 @@ static void object_database_modern_read_inner(object_database* obj_db, stream& s
obj_db->ready = true;
}
static void object_database_modern_write_inner(object_database* obj_db, stream& s) {
static void object_database_file_modern_write_inner(object_database_file* obj_db, stream& s) {
stream s_mosi;
s_mosi.open();
uint32_t off;
@@ -637,7 +658,7 @@ static void object_database_modern_write_inner(object_database* obj_db, stream&
uint32_t object_set_count = (uint32_t)obj_db->object_set.size();
uint32_t object_count = 0;
for (object_set_info& i : obj_db->object_set)
for (object_set_info_file& i : obj_db->object_set)
object_count += (uint32_t)i.object.size();
if (!is_x) {
@@ -704,12 +725,12 @@ static void object_database_modern_write_inner(object_database* obj_db, stream&
strings.reserve((int64_t)object_set_count + object_count);
for (object_set_info& i : obj_db->object_set) {
for (object_set_info_file& i : obj_db->object_set) {
object_database_strings_push_back_check(strings, i.name);
object_database_strings_push_back_check(strings, i.object_file_name);
object_database_strings_push_back_check(strings, i.texture_file_name);
object_database_strings_push_back_check(strings, i.archive_file_name);
for (object_info_data& j : i.object)
for (object_info_data_file& j : i.object)
object_database_strings_push_back_check(strings, j.name);
}
@@ -732,7 +753,7 @@ static void object_database_modern_write_inner(object_database* obj_db, stream&
s_mosi.align_write(0x10);
if (!is_x)
for (object_set_info& i : obj_db->object_set) {
for (object_set_info_file& i : obj_db->object_set) {
io_write_offset_f2_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
string_offsets, i.name), 0x20, &pof);
s_mosi.write_uint32_t(i.id);
@@ -745,7 +766,7 @@ static void object_database_modern_write_inner(object_database* obj_db, stream&
s_mosi.write(0x10);
}
else
for (object_set_info& i : obj_db->object_set) {
for (object_set_info_file& i : obj_db->object_set) {
io_write_offset_x_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
string_offsets, i.name), &pof);
s_mosi.write_uint32_t(i.id);
@@ -760,9 +781,9 @@ static void object_database_modern_write_inner(object_database* obj_db, stream&
s_mosi.align_write(0x10);
if (!is_x)
for (object_set_info& i : obj_db->object_set) {
for (object_set_info_file& i : obj_db->object_set) {
uint32_t set_id = i.id;
for (object_info_data& j : i.object) {
for (object_info_data_file& j : i.object) {
s_mosi.write_uint32_t(j.id);
s_mosi.write_uint32_t(set_id);
io_write_offset_f2_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
@@ -770,9 +791,9 @@ static void object_database_modern_write_inner(object_database* obj_db, stream&
}
}
else
for (object_set_info& i : obj_db->object_set) {
for (object_set_info_file& i : obj_db->object_set) {
uint32_t set_id = i.id;
for (object_info_data& j : i.object) {
for (object_info_data_file& j : i.object) {
s_mosi.write_uint32_t(j.id);
s_mosi.write_uint32_t(set_id);
io_write_offset_x_pof_add(s_mosi, object_database_strings_get_string_offset(strings,
+34 -8
View File
@@ -51,6 +51,26 @@ inline bool operator !=(const object_info& left, const object_info& right) {
return left.set_id != right.set_id || left.id != right.id;
}
struct object_info_data_file {
uint32_t id;
std::string name;
object_info_data_file();
~object_info_data_file();
};
struct object_set_info_file {
std::string name;
uint32_t id;
std::string object_file_name;
std::string texture_file_name;
std::string archive_file_name;
std::vector<object_info_data_file> object;
object_set_info_file();
~object_set_info_file();
};
struct object_info_data {
uint32_t id;
std::string name;
@@ -75,15 +95,15 @@ struct object_set_info {
~object_set_info();
};
struct object_database {
struct object_database_file {
bool ready;
bool modern;
bool is_x;
std::vector<object_set_info> object_set;
std::vector<object_set_info_file> object_set;
object_database();
~object_database();
object_database_file();
virtual ~object_database_file();
void read(const char* path, bool modern);
void read(const wchar_t* path, bool modern);
@@ -92,8 +112,16 @@ struct object_database {
void write(const wchar_t* path);
void write(void** data, size_t* size);
void merge_mdata(object_database* base_obj_db, object_database* mdata_obj_db);
void split_mdata(object_database* base_obj_db, object_database* mdata_obj_db);
static bool load_file(void* data, const char* path, const char* file, uint32_t hash);
};
struct object_database {
std::vector<object_set_info> object_set;
object_database();
virtual ~object_database();
void add(object_database_file* obj_db_file);
bool get_object_set_info(const char* name, object_set_info** set_info);
bool get_object_set_info(uint32_t set_id, object_set_info** set_info);
@@ -104,6 +132,4 @@ struct object_database {
uint32_t get_object_set_id(const char* name);
object_info get_object_info(const char* name);
const char* get_object_name(object_info obj_info);
static bool load_file(void* data, const char* path, const char* file, uint32_t hash);
};
+173 -71
View File
@@ -10,10 +10,34 @@
#include "../hash.hpp"
#include "../str_utils.hpp"
static void stage_database_classic_read_inner(stage_database* stage_data, stream& s);
static void stage_database_classic_write_inner(stage_database* stage_data, stream& s);
static void stage_database_modern_read_inner(stage_database* stage_data, stream& s, uint32_t header_length);
static void stage_database_modern_write_inner(stage_database* stage_data, stream& s);
static void stage_database_file_classic_read_inner(stage_database_file* stage_data, stream& s);
static void stage_database_file_classic_write_inner(stage_database_file* stage_data, stream& s);
static void stage_database_file_modern_read_inner(stage_database_file* stage_data, stream& s, uint32_t header_length);
static void stage_database_file_modern_write_inner(stage_database_file* stage_data, stream& s);
stage_data_file::stage_data_file() : id(), object_set_id(), lens_flare_texture(), lens_shaft_texture(),
lens_ghost_texture(), unknown(), render_texture(), movie_texture(), reflect_type(), refract_enable(),
reflect(), reflect_data(), refract(), refract_data(), flags(), ring_rectangle_x(), ring_rectangle_y(),
ring_rectangle_width(), ring_rectangle_height(), ring_height(), ring_out_height(), effects() {
lens_shaft_inv_scale = 1.0f;
}
stage_data_file::~stage_data_file() {
}
stage_data_modern_file::stage_data_modern_file() : unknown(), render_texture(),
render_texture_flag(), movie_texture(), movie_texture_flag(), field_04(), field_04_flag(), field_05(),
field_05_flag(), field_06(), field_06_flag(), field_07(), field_07_flag(), field_08(), field_09(),
field_10(), field_11(), field_12(), ring_rectangle_x(), ring_rectangle_y(), ring_rectangle_width(),
ring_rectangle_height(), ring_height(), ring_out_height(), field_13(), effects() {
hash = hash_murmurhash_empty;
lens_shaft_inv_scale = 1.0f;
}
stage_data_modern_file::~stage_data_modern_file() {
}
stage_data::stage_data() : id(), object_set_id(), lens_flare_texture(), lens_shaft_texture(),
lens_ghost_texture(), unknown(), render_texture(), movie_texture(), reflect_type(), refract_enable(),
@@ -41,15 +65,15 @@ stage_data_modern::~stage_data_modern() {
}
stage_database::stage_database() : ready(), modern(), is_x(), format() {
stage_database_file::stage_database_file() : ready(), modern(), is_x(), format() {
}
stage_database::~stage_database() {
stage_database_file::~stage_database_file() {
}
void stage_database::read(const char* path, bool modern) {
void stage_database_file::read(const char* path, bool modern) {
if (!path)
return;
@@ -63,7 +87,7 @@ void stage_database::read(const char* path, bool modern) {
s.read(data, s.length);
stream s_bin;
s_bin.open(data, s.length);
stage_database_classic_read_inner(this, s_bin);
stage_database_file_classic_read_inner(this, s_bin);
free(data);
}
}
@@ -78,14 +102,14 @@ void stage_database::read(const char* path, bool modern) {
stream s_stgc;
s_stgc.open(st.data);
s_stgc.is_big_endian = st.header.use_big_endian;
stage_database_modern_read_inner(this, s_stgc, st.header.length);
stage_database_file_modern_read_inner(this, s_stgc, st.header.length);
}
}
free(path_stg);
}
}
void stage_database::read(const wchar_t* path, bool modern) {
void stage_database_file::read(const wchar_t* path, bool modern) {
if (!path)
return;
@@ -99,7 +123,7 @@ void stage_database::read(const wchar_t* path, bool modern) {
s.read(data, s.length);
stream s_bin;
s_bin.open(data, s.length);
stage_database_classic_read_inner(this, s_bin);
stage_database_file_classic_read_inner(this, s_bin);
free(data);
}
}
@@ -114,21 +138,21 @@ void stage_database::read(const wchar_t* path, bool modern) {
stream s_stgc;
s_stgc.open(st.data);
s_stgc.is_big_endian = st.header.use_big_endian;
stage_database_modern_read_inner(this, s_stgc, st.header.length);
stage_database_file_modern_read_inner(this, s_stgc, st.header.length);
}
}
free(path_stg);
}
}
void stage_database::read(const void* data, size_t size, bool modern) {
void stage_database_file::read(const void* data, size_t size, bool modern) {
if (!data || !size)
return;
if (!modern) {
stream s;
s.open(data, size);
stage_database_classic_read_inner(this, s);
stage_database_file_classic_read_inner(this, s);
}
else {
f2_struct st;
@@ -137,12 +161,12 @@ void stage_database::read(const void* data, size_t size, bool modern) {
stream s_stgc;
s_stgc.open(st.data);
s_stgc.is_big_endian = st.header.use_big_endian;
stage_database_modern_read_inner(this, s_stgc, st.header.length);
stage_database_file_modern_read_inner(this, s_stgc, st.header.length);
}
}
}
void stage_database::write(const char* path) {
void stage_database_file::write(const char* path) {
if (!path || !ready)
return;
@@ -151,7 +175,7 @@ void stage_database::write(const char* path) {
stream s;
s.open(path_bin, "wb");
if (s.io.stream)
stage_database_classic_write_inner(this, s);
stage_database_file_classic_write_inner(this, s);
free(path_bin);
}
else {
@@ -159,12 +183,12 @@ void stage_database::write(const char* path) {
stream s;
s.open(path_stg, "wb");
if (s.io.stream)
stage_database_modern_write_inner(this, s);
stage_database_file_modern_write_inner(this, s);
free(path_stg);
}
}
void stage_database::write(const wchar_t* path) {
void stage_database_file::write(const wchar_t* path) {
if (!path || !ready)
return;
@@ -173,7 +197,7 @@ void stage_database::write(const wchar_t* path) {
stream s;
s.open(path_bin, L"wb");
if (s.io.stream)
stage_database_classic_write_inner(this, s);
stage_database_file_classic_write_inner(this, s);
free(path_bin);
}
else {
@@ -181,26 +205,26 @@ void stage_database::write(const wchar_t* path) {
stream s;
s.open(path_stg, L"wb");
if (s.io.stream)
stage_database_modern_write_inner(this, s);
stage_database_file_modern_write_inner(this, s);
free(path_stg);
}
}
void stage_database::write(void** data, size_t* size) {
void stage_database_file::write(void** data, size_t* size) {
if (!data || !size || !ready)
return;
stream s;
s.open();
if (!modern)
stage_database_classic_write_inner(this, s);
stage_database_file_classic_write_inner(this, s);
else
stage_database_modern_write_inner(this, s);
stage_database_file_modern_write_inner(this, s);
s.align_write(0x10);
s.copy(data, size);
}
bool stage_database::load_file(void* data, const char* path, const char* file, uint32_t hash) {
bool stage_database_file::load_file(void* data, const char* path, const char* file, uint32_t hash) {
size_t file_len = utf8_length(file);
const char* t = strrchr(file, '.');
@@ -209,12 +233,20 @@ bool stage_database::load_file(void* data, const char* path, const char* file, u
std::string s = path + std::string(file, file_len);
stage_database* stage_data = (stage_database*)data;
stage_database_file* stage_data = (stage_database_file*)data;
stage_data->read(s.c_str(), stage_data->modern);
return stage_data->ready;
}
stage_database::stage_database() {
}
stage_database::~stage_database() {
}
::stage_data* stage_database::get_stage_data(int32_t stage_index) {
if (stage_index >= 0 && stage_index < stage_data.size())
return &stage_data[stage_index];
@@ -236,60 +268,132 @@ int32_t stage_database::get_stage_index(const char* name) {
return -1;
}
void stage_database::merge_mdata(stage_database* base_stage_data, stage_database* mdata_stage_data) {
if (!base_stage_data || !mdata_stage_data || !base_stage_data->ready || !mdata_stage_data->ready)
void stage_database::add(stage_database_file* stage_data_file) {
if (!stage_data_file || !stage_data_file->ready)
return;
if (this != base_stage_data) {
stage_data = base_stage_data->stage_data;
stage_modern = base_stage_data->stage_modern;
}
if (stage_data.capacity() - stage_data.size() < stage_data_file->stage_data.size())
stage_data.reserve(stage_data_file->stage_data.size());
for (::stage_data i : mdata_stage_data->stage_data) {
uint32_t name_hash = i.name_hash;
for (::stage_data_file i : stage_data_file->stage_data) {
uint32_t name_hash = hash_string_murmurhash(i.name);
::stage_data* info = 0;
::stage_data* data = 0;
for (::stage_data& j : stage_data)
if (name_hash == j.name_hash) {
info = &j;
data = &j;
break;
}
if (info)
*info = i;
else
stage_data.push_back(i);
if (!data) {
stage_data.push_back({});
data = &stage_data.back();
}
data->id = i.id;
data->name = i.name;
data->name_hash = hash_string_murmurhash(data->name);
data->auth_3d_name = i.auth_3d_name;
data->object_set_id = i.object_set_id;
data->object_ground = i.object_ground;
data->object_ring = i.object_ring;
data->object_sky = i.object_sky;
data->object_shadow = i.object_shadow;
data->object_reflect = i.object_reflect;
data->object_refract = i.object_refract;
data->lens_flare_texture = i.lens_flare_texture;
data->lens_shaft_texture = i.lens_shaft_texture;
data->lens_ghost_texture = i.lens_ghost_texture;
data->lens_shaft_inv_scale = i.lens_shaft_inv_scale;
data->unknown = i.unknown;
data->render_texture = i.render_texture;
data->movie_texture = i.movie_texture;
data->collision_file_path = i.collision_file_path;
data->reflect_type = i.reflect_type;
data->refract_enable = i.refract_enable;
data->reflect = i.reflect;
data->reflect_data = i.reflect_data;
data->refract = i.refract;
data->refract_data = i.refract_data;
data->flags = i.flags;
data->ring_rectangle_x = i.ring_rectangle_x;
data->ring_rectangle_y = i.ring_rectangle_y;
data->ring_rectangle_width = i.ring_rectangle_width;
data->ring_rectangle_height = i.ring_rectangle_height;
data->ring_height = i.ring_height;
data->ring_out_height = i.ring_out_height;
data->effects = i.effects;
data->auth_3d_ids = i.auth_3d_ids;
}
for (stage_data_modern& i : mdata_stage_data->stage_modern) {
uint32_t name_hash = hash_string_murmurhash(&i.name);
for (stage_data_modern_file& i : stage_data_file->stage_modern) {
uint32_t hash = i.hash;
stage_data_modern* info = 0;
stage_data_modern* data = 0;
for (stage_data_modern& j : stage_modern)
if (name_hash == hash_string_murmurhash(&j.name)) {
info = &j;
if (hash == j.hash) {
data = &j;
break;
}
if (info)
*info = i;
else
stage_modern.push_back(i);
if (!data) {
stage_modern.push_back({});
data = &stage_modern.back();
}
data->hash = i.hash;
data->name = i.name;
data->auth_3d_name = i.auth_3d_name;
data->auth_3d_name_hash = hash_string_murmurhash(data->auth_3d_name);
data->object_ground = i.object_ground;
data->object_sky = i.object_sky;
data->object_shadow = i.object_shadow;
data->object_reflect = i.object_reflect;
data->object_refract = i.object_refract;
data->lens_shaft_inv_scale = i.lens_shaft_inv_scale;
data->unknown = i.unknown;
data->render_texture = i.render_texture;
data->render_texture_flag = i.render_texture_flag;
data->movie_texture = i.movie_texture;
data->movie_texture_flag = i.movie_texture_flag;
data->field_04 = i.field_04;
data->field_04_flag = i.field_04_flag;
data->field_05 = i.field_05;
data->field_05_flag = i.field_05_flag;
data->field_06 = i.field_06;
data->field_06_flag = i.field_06_flag;
data->field_07 = i.field_07;
data->field_07_flag = i.field_07_flag;
data->field_08 = i.field_08;
data->field_09 = i.field_09;
data->field_10 = i.field_10;
data->field_11 = i.field_11;
data->field_12 = i.field_12;
data->ring_rectangle_x = i.ring_rectangle_x;
data->ring_rectangle_y = i.ring_rectangle_y;
data->ring_rectangle_width = i.ring_rectangle_width;
data->ring_rectangle_height = i.ring_rectangle_height;
data->ring_height = i.ring_height;
data->ring_out_height = i.ring_out_height;
data->effects = i.effects;
data->auth_3d_ids = i.auth_3d_ids;
data->render_texture = i.render_texture;
data->render_texture_flag = i.render_texture_flag;
data->movie_texture = i.movie_texture;
data->movie_texture_flag = i.movie_texture_flag;
data->ring_rectangle_x = i.ring_rectangle_x;
data->ring_rectangle_y = i.ring_rectangle_y;
data->ring_rectangle_width = i.ring_rectangle_width;
data->ring_rectangle_height = i.ring_rectangle_height;
data->ring_height = i.ring_height;
data->ring_out_height = i.ring_out_height;
data->field_13 = i.field_13;
data->effects = i.effects;
data->auth_3d_ids = i.auth_3d_ids;
}
ready = true;
modern = base_stage_data->modern;
is_x = base_stage_data->is_x;
format = base_stage_data->format;
}
void stage_database::split_mdata(stage_database* base_stage_data, stage_database* mdata_stage_data) {
if (!base_stage_data || !mdata_stage_data || !ready || !base_stage_data->ready)
return;
}
static void stage_database_classic_read_inner(stage_database* stage_data, stream& s) {
static void stage_database_file_classic_read_inner(stage_database_file* stage_data, stream& s) {
int32_t count = s.read_int32_t();
int32_t stages_offset = s.read_int32_t();
int32_t stage_effects_offset = s.read_int32_t();
@@ -312,11 +416,10 @@ static void stage_database_classic_read_inner(stage_database* stage_data, stream
s.position_push(stages_offset, SEEK_SET);
for (int32_t i = 0; i < count; i++) {
::stage_data* stage = &stage_data->stage_data[i];
stage_data_file* stage = &stage_data->stage_data[i];
stage->id = i;
stage->name = s.read_string_null_terminated_offset(s.read_uint32_t());
stage->name_hash = hash_string_murmurhash(&stage->name);
stage->auth_3d_name = s.read_string_null_terminated_offset(s.read_uint32_t());
stage->object_set_id = (uint16_t)s.read_uint32_t(); // Crutch to remove higher bits
stage->object_ground.id = s.read_uint16_t();
@@ -413,7 +516,7 @@ static void stage_database_classic_read_inner(stage_database* stage_data, stream
s.position_push(stage_effects_offset, SEEK_SET);
for (int32_t i = 0; i < count; i++) {
::stage_data* stage = &stage_data->stage_data[i];
stage_data_file* stage = &stage_data->stage_data[i];
stage_effects* effects = &stage->effects;
for (int32_t j = 0; j < 8; j++)
@@ -426,7 +529,7 @@ static void stage_database_classic_read_inner(stage_database* stage_data, stream
s.position_push(auth3d_id_counts_offset, SEEK_SET);
for (int32_t i = 0; i < count; i++) {
::stage_data* stage = &stage_data->stage_data[i];
stage_data_file* stage = &stage_data->stage_data[i];
stage->auth_3d_ids.resize(s.read_int32_t());
}
@@ -434,7 +537,7 @@ static void stage_database_classic_read_inner(stage_database* stage_data, stream
s.position_push(auth3d_ids_offsets_offset, SEEK_SET);
for (int32_t i = 0; i < count; i++) {
::stage_data* stage = &stage_data->stage_data[i];
stage_data_file* stage = &stage_data->stage_data[i];
uint32_t id = s.read_uint32_t();
uint32_t offset = s.read_uint32_t();
@@ -469,11 +572,11 @@ static void stage_database_classic_read_inner(stage_database* stage_data, stream
stage_data->is_x = false;
}
static void stage_database_classic_write_inner(stage_database* stage_data, stream& s) {
static void stage_database_file_classic_write_inner(stage_database_file* stage_data, stream& s) {
}
static void stage_database_modern_read_inner(stage_database* stage_data, stream& s, uint32_t header_length) {
static void stage_database_file_modern_read_inner(stage_database_file* stage_data, stream& s, uint32_t header_length) {
bool is_x = true;
s.set_position(0x04, SEEK_SET);
@@ -488,11 +591,10 @@ static void stage_database_modern_read_inner(stage_database* stage_data, stream&
s.position_push(stages_offset, SEEK_SET);
for (int32_t i = 0; i < count; i++) {
stage_data_modern* stage = &stage_data->stage_modern[i];
stage_data_modern_file* stage = &stage_data->stage_modern[i];
stage->hash = (uint32_t)s.read_uint64_t_reverse_endianness();
stage->name = s.read_string_null_terminated_offset(s.read_offset(header_length, is_x));
stage->auth_3d_name = s.read_string_null_terminated_offset(s.read_offset(header_length, is_x));
stage->auth_3d_name_hash = hash_string_murmurhash(&stage->auth_3d_name);
stage->object_ground.set_id = s.read_uint32_t_reverse_endianness();
stage->object_ground.id = s.read_uint32_t_reverse_endianness();
stage->object_sky.id = s.read_uint32_t_reverse_endianness();
@@ -584,7 +686,7 @@ static void stage_database_modern_read_inner(stage_database* stage_data, stream&
stage_data->format = STAGE_DATA_UNK;
}
static void stage_database_modern_write_inner(stage_database* stage_data, stream& s) {
static void stage_database_file_modern_write_inner(stage_database_file* stage_data, stream& s) {
}
+98 -11
View File
@@ -64,6 +64,87 @@ struct stage_effects {
int32_t field_20[16];
};
struct stage_data_file {
int32_t id;
std::string name;
std::string auth_3d_name;
uint32_t object_set_id;
object_info object_ground;
object_info object_ring;
object_info object_sky;
object_info object_shadow;
object_info object_reflect;
object_info object_refract;
uint32_t lens_flare_texture;
uint32_t lens_shaft_texture;
uint32_t lens_ghost_texture;
float_t lens_shaft_inv_scale;
uint32_t unknown;
uint32_t render_texture;
uint32_t movie_texture;
std::string collision_file_path;
stage_data_reflect_type reflect_type;
bool refract_enable;
bool reflect;
stage_data_reflect reflect_data;
bool refract;
stage_data_refract refract_data;
stage_data_flags flags;
float_t ring_rectangle_x;
float_t ring_rectangle_y;
float_t ring_rectangle_width;
float_t ring_rectangle_height;
float_t ring_height;
float_t ring_out_height;
stage_effects effects;
std::vector<int32_t> auth_3d_ids;
stage_data_file();
~stage_data_file();
};
struct stage_data_modern_file {
uint32_t hash;
std::string name;
std::string auth_3d_name;
object_info object_ground;
object_info object_sky;
object_info object_shadow;
object_info object_reflect;
object_info object_refract;
float_t lens_shaft_inv_scale;
uint32_t unknown;
uint32_t render_texture;
uint32_t render_texture_flag;
uint32_t movie_texture;
uint32_t movie_texture_flag;
uint32_t field_04;
uint32_t field_04_flag;
uint32_t field_05;
uint32_t field_05_flag;
uint32_t field_06;
uint32_t field_06_flag;
uint32_t field_07;
uint32_t field_07_flag;
uint32_t field_08;
uint32_t field_09;
uint32_t field_10;
size_t field_11;
size_t field_12;
float_t ring_rectangle_x;
float_t ring_rectangle_y;
float_t ring_rectangle_width;
float_t ring_rectangle_height;
float_t ring_height;
float_t ring_out_height;
uint32_t field_13;
stage_effects effects;
std::vector<uint32_t> auth_3d_ids;
stage_data_modern_file();
~stage_data_modern_file();
};
struct stage_data {
int32_t id;
std::string name;
@@ -147,17 +228,17 @@ struct stage_data_modern {
~stage_data_modern();
};
struct stage_database {
struct stage_database_file {
bool ready;
bool modern;
bool is_x;
stage_data_format format;
std::vector<::stage_data> stage_data;
std::vector<stage_data_modern> stage_modern;
std::vector<::stage_data_file> stage_data;
std::vector<stage_data_modern_file> stage_modern;
stage_database();
~stage_database();
stage_database_file();
virtual ~stage_database_file();
void read(const char* path, bool modern);
void read(const wchar_t* path, bool modern);
@@ -166,12 +247,18 @@ struct stage_database {
void write(const wchar_t* path);
void write(void** data, size_t* size);
::stage_data* get_stage_data(int32_t stage_index);
::stage_data_modern* get_stage_data_modern(uint32_t stage_hash);
int32_t get_stage_index(const char* name);
void merge_mdata(stage_database* base_stage_data, stage_database* mdata_stage_data);
void split_mdata(stage_database* base_stage_data, stage_database* mdata_stage_data);
static bool load_file(void* data, const char* path, const char* file, uint32_t hash);
};
struct stage_database {
std::vector<::stage_data> stage_data;
std::vector<stage_data_modern> stage_modern;
stage_database();
virtual ~stage_database();
::stage_data* get_stage_data(int32_t stage_index);
::stage_data_modern* get_stage_data_modern(uint32_t stage_hash);
int32_t get_stage_index(const char* name);
void add(stage_database_file* stage_data_file);
};
+95 -94
View File
@@ -11,23 +11,40 @@
#include "../sort.hpp"
#include "../str_utils.hpp"
static void texture_database_classic_read_inner(texture_database* tex_db, stream& s);
static void texture_database_classic_write_inner(texture_database* tex_db, stream& s);
static void texture_database_modern_read_inner(texture_database* tex_db, stream& s, uint32_t header_length);
static void texture_database_modern_write_inner(texture_database* tex_db, stream& s);
static int64_t texture_database_strings_get_string_offset(std::vector<std::string>& vec,
static void texture_database_file_classic_read_inner(texture_database_file* tex_db, stream& s);
static void texture_database_file_classic_write_inner(texture_database_file* tex_db, stream& s);
static void texture_database_file_modern_read_inner(texture_database_file* tex_db, stream& s, uint32_t header_length);
static void texture_database_file_modern_write_inner(texture_database_file* tex_db, stream& s);
static int64_t texture_database_file_strings_get_string_offset(std::vector<std::string>& vec,
std::vector<int64_t>& vec_off, std::string& str);
static void texture_database_strings_push_back_check(std::vector<std::string>& vec, std::string& str);
static void texture_database_file_strings_push_back_check(std::vector<std::string>& vec, std::string& str);
texture_database::texture_database() : ready(), modern(), is_x() {
texture_info_file::texture_info_file() {
id = (uint32_t)-1;
}
texture_info_file::~texture_info_file() {
}
texture_database::~texture_database() {
texture_info::texture_info() {
name_hash = hash_murmurhash_empty;
id = (uint32_t)-1;
}
texture_info::~texture_info() {
}
void texture_database::read(const char* path, bool modern) {
texture_database_file::texture_database_file() : ready(), modern(), is_x() {
}
texture_database_file::~texture_database_file() {
}
void texture_database_file::read(const char* path, bool modern) {
if (!path)
return;
@@ -41,7 +58,7 @@ void texture_database::read(const char* path, bool modern) {
s.read(data, s.length);
stream s_bin;
s_bin.open(data, s.length);
texture_database_classic_read_inner(this, s_bin);
texture_database_file_classic_read_inner(this, s_bin);
free(data);
}
}
@@ -56,14 +73,14 @@ void texture_database::read(const char* path, bool modern) {
stream s_mtxi;
s_mtxi.open(st.data);
s_mtxi.is_big_endian = st.header.use_big_endian;
texture_database_modern_read_inner(this, s_mtxi, st.header.length);
texture_database_file_modern_read_inner(this, s_mtxi, st.header.length);
}
}
free(path_txi);
}
}
void texture_database::read(const wchar_t* path, bool modern) {
void texture_database_file::read(const wchar_t* path, bool modern) {
if (!path)
return;
@@ -77,7 +94,7 @@ void texture_database::read(const wchar_t* path, bool modern) {
s.read(data, s.length);
stream s_bin;
s_bin.open(data, s.length);
texture_database_classic_read_inner(this, s_bin);
texture_database_file_classic_read_inner(this, s_bin);
free(data);
}
}
@@ -92,21 +109,21 @@ void texture_database::read(const wchar_t* path, bool modern) {
stream s_mtxi;
s_mtxi.open(st.data);
s_mtxi.is_big_endian = st.header.use_big_endian;
texture_database_modern_read_inner(this, s_mtxi, st.header.length);
texture_database_file_modern_read_inner(this, s_mtxi, st.header.length);
}
}
free(path_txi);
}
}
void texture_database::read(const void* data, size_t size, bool modern) {
void texture_database_file::read(const void* data, size_t size, bool modern) {
if (!data || !size)
return;
if (!modern) {
stream s;
s.open(data, size);
texture_database_classic_read_inner(this, s);
texture_database_file_classic_read_inner(this, s);
}
else {
f2_struct st;
@@ -115,12 +132,12 @@ void texture_database::read(const void* data, size_t size, bool modern) {
stream s_mtxi;
s_mtxi.open(st.data);
s_mtxi.is_big_endian = st.header.use_big_endian;
texture_database_modern_read_inner(this, s_mtxi, st.header.length);
texture_database_file_modern_read_inner(this, s_mtxi, st.header.length);
}
}
}
void texture_database::write(const char* path) {
void texture_database_file::write(const char* path) {
if (!path || !ready)
return;
@@ -129,7 +146,7 @@ void texture_database::write(const char* path) {
stream s;
s.open(path_bin, "wb");
if (s.io.stream)
texture_database_classic_write_inner(this, s);
texture_database_file_classic_write_inner(this, s);
free(path_bin);
}
else {
@@ -137,12 +154,12 @@ void texture_database::write(const char* path) {
stream s;
s.open(path_txi, "wb");
if (s.io.stream)
texture_database_modern_write_inner(this, s);
texture_database_file_modern_write_inner(this, s);
free(path_txi);
}
}
void texture_database::write(const wchar_t* path) {
void texture_database_file::write(const wchar_t* path) {
if (!path || !ready)
return;
@@ -151,7 +168,7 @@ void texture_database::write(const wchar_t* path) {
stream s;
s.open(path_bin, L"wb");
if (s.io.stream)
texture_database_classic_write_inner(this, s);
texture_database_file_classic_write_inner(this, s);
free(path_bin);
}
else {
@@ -159,35 +176,55 @@ void texture_database::write(const wchar_t* path) {
stream s;
s.open(path_txi, L"wb");
if (s.io.stream)
texture_database_modern_write_inner(this, s);
texture_database_file_modern_write_inner(this, s);
free(path_txi);
}
}
void texture_database::write(void** data, size_t* size) {
void texture_database_file::write(void** data, size_t* size) {
if (!data || !size || !ready)
return;
stream s;
s.open();
if (!modern)
texture_database_classic_write_inner(this, s);
texture_database_file_classic_write_inner(this, s);
else
texture_database_modern_write_inner(this, s);
texture_database_file_modern_write_inner(this, s);
s.align_write(0x10);
s.copy(data, size);
}
void texture_database::merge_mdata(texture_database* base_tex_db,
texture_database* mdata_tex_db) {
if (!base_tex_db || !mdata_tex_db
|| !base_tex_db->ready || !mdata_tex_db->ready)
bool texture_database_file::load_file(void* data, const char* path, const char* file, uint32_t hash) {
size_t file_len = utf8_length(file);
const char* t = strrchr(file, '.');
if (t)
file_len = t - file;
std::string s = path + std::string(file, file_len);
texture_database_file* tex_db = (texture_database_file*)data;
tex_db->read(s.c_str(), tex_db->modern);
return tex_db->ready;
}
texture_database::texture_database() {
}
texture_database::~texture_database() {
}
void texture_database::add(texture_database_file* tex_db_file) {
if (!tex_db_file || !tex_db_file->ready)
return;
if (this != base_tex_db)
texture = base_tex_db->texture;
texture.reserve(tex_db_file->texture.size());
for (texture_info& i : mdata_tex_db->texture) {
for (texture_info_file& i : tex_db_file->texture) {
uint32_t id = i.id;
texture_info* info = 0;
@@ -197,25 +234,15 @@ void texture_database::merge_mdata(texture_database* base_tex_db,
break;
}
if (info)
*info = i;
else
texture.push_back(i);
if (!info) {
texture.push_back({});
info = &texture.back();
}
info->id = i.id;
info->name = i.name;
info->name_hash = hash_string_murmurhash(info->name);
}
if (this != base_tex_db) {
ready = true;
modern = base_tex_db->modern;
is_x = base_tex_db->is_x;
}
}
void texture_database::split_mdata(texture_database* base_tex_db,
texture_database* mdata_tex_db) {
if (!base_tex_db || !mdata_tex_db
|| !ready || !mdata_tex_db->ready)
return;
}
uint32_t texture_database::get_texture_id(const char* name) {
@@ -240,30 +267,7 @@ const char* texture_database::get_texture_name(uint32_t id) {
return 0;
}
bool texture_database::load_file(void* data, const char* path, const char* file, uint32_t hash) {
size_t file_len = utf8_length(file);
const char* t = strrchr(file, '.');
if (t)
file_len = t - file;
std::string s = path + std::string(file, file_len);
texture_database* tex_db = (texture_database*)data;
tex_db->read(s.c_str(), tex_db->modern);
return tex_db->ready;
}
texture_info::texture_info() : name_hash(hash_murmurhash_empty), id((uint32_t)-1) {
}
texture_info::~texture_info() {
}
static void texture_database_classic_read_inner(texture_database* tex_db, stream& s) {
static void texture_database_file_classic_read_inner(texture_database_file* tex_db, stream& s) {
uint32_t textures_count = s.read_uint32_t();
uint32_t textures_offset = s.read_uint32_t();
@@ -271,10 +275,9 @@ static void texture_database_classic_read_inner(texture_database* tex_db, stream
s.position_push(textures_offset, SEEK_SET);
for (uint32_t i = 0; i < textures_count; i++) {
texture_info& info = tex_db->texture[i];
texture_info_file& info = tex_db->texture[i];
info.id = s.read_uint32_t();
info.name = s.read_string_null_terminated_offset(s.read_uint32_t());
info.name_hash = hash_string_murmurhash(&info.name);
}
s.position_pop();
@@ -283,7 +286,7 @@ static void texture_database_classic_read_inner(texture_database* tex_db, stream
tex_db->ready = true;
}
static void texture_database_classic_write_inner(texture_database* tex_db, stream& s) {
static void texture_database_file_classic_write_inner(texture_database_file* tex_db, stream& s) {
s.write_uint32_t(0x90669066);
s.write_uint32_t(0x90669066);
s.write_uint32_t(0x90669066);
@@ -299,7 +302,7 @@ static void texture_database_classic_write_inner(texture_database* tex_db, strea
std::vector<int64_t> string_offsets;
string_offsets.reserve(textures_count);
for (texture_info& i : tex_db->texture) {
for (texture_info_file& i : tex_db->texture) {
string_offsets.push_back(s.get_position());
s.write_string_null_terminated(i.name);
}
@@ -308,7 +311,7 @@ static void texture_database_classic_write_inner(texture_database* tex_db, strea
int64_t textures_offset = s.get_position();
if (string_offsets.size()) {
size_t off_idx = 0;
for (texture_info& i : tex_db->texture) {
for (texture_info_file& i : tex_db->texture) {
s.write_uint32_t(i.id);
s.write_uint32_t((uint32_t)string_offsets[off_idx++]);
}
@@ -321,7 +324,7 @@ static void texture_database_classic_write_inner(texture_database* tex_db, strea
s.position_pop();
}
static void texture_database_modern_read_inner(texture_database* tex_db, stream& s, uint32_t header_length) {
static void texture_database_file_modern_read_inner(texture_database_file* tex_db, stream& s, uint32_t header_length) {
bool is_x = true;
s.set_position(0x04, SEEK_SET);
@@ -337,17 +340,15 @@ static void texture_database_modern_read_inner(texture_database* tex_db, stream&
s.position_push(textures_offset, SEEK_SET);
if (!is_x)
for (uint32_t i = 0; i < textures_count; i++) {
texture_info& info = tex_db->texture[i];
texture_info_file& info = tex_db->texture[i];
info.id = s.read_uint32_t_reverse_endianness();
info.name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length));
info.name_hash = hash_string_murmurhash(&info.name);
}
else
for (uint32_t i = 0; i < textures_count; i++) {
texture_info& info = tex_db->texture[i];
texture_info_file& info = tex_db->texture[i];
info.id = s.read_uint32_t_reverse_endianness();
info.name = s.read_string_null_terminated_offset(s.read_offset_x());
info.name_hash = hash_string_murmurhash(&info.name);
}
s.position_pop();
@@ -356,7 +357,7 @@ static void texture_database_modern_read_inner(texture_database* tex_db, stream&
tex_db->ready = true;
}
static void texture_database_modern_write_inner(texture_database* tex_db, stream& s) {
static void texture_database_file_modern_write_inner(texture_database_file* tex_db, stream& s) {
stream s_mtxi;
s_mtxi.open();
uint32_t off;
@@ -403,8 +404,8 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream
strings.reserve(textures_count);
for (texture_info& i : tex_db->texture)
texture_database_strings_push_back_check(strings, i.name);
for (texture_info_file& i : tex_db->texture)
texture_database_file_strings_push_back_check(strings, i.name);
quicksort_string(strings.data(), strings.size());
string_offsets.reserve(strings.size());
@@ -420,16 +421,16 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream
s_mtxi.align_write(0x10);
if (!is_x)
for (texture_info& i : tex_db->texture) {
for (texture_info_file& i : tex_db->texture) {
s_mtxi.write_uint32_t(i.id);
int64_t offset = texture_database_strings_get_string_offset(strings,
int64_t offset = texture_database_file_strings_get_string_offset(strings,
string_offsets, i.name);
io_write_offset_f2_pof_add(s_mtxi, offset, 0x20, &pof);
}
else
for (texture_info& i : tex_db->texture) {
for (texture_info_file& i : tex_db->texture) {
s_mtxi.write_uint32_t(i.id);
int64_t offset = texture_database_strings_get_string_offset(strings,
int64_t offset = texture_database_file_strings_get_string_offset(strings,
string_offsets, i.name);
io_write_offset_x_pof_add(s_mtxi, offset, &pof);
}
@@ -451,7 +452,7 @@ static void texture_database_modern_write_inner(texture_database* tex_db, stream
st.write(s, true, tex_db->is_x);
}
inline static int64_t texture_database_strings_get_string_offset(std::vector<std::string>& vec,
inline static int64_t texture_database_file_strings_get_string_offset(std::vector<std::string>& vec,
std::vector<int64_t>& vec_off, std::string& str) {
for (std::string& i : vec)
if (str == i)
@@ -459,7 +460,7 @@ inline static int64_t texture_database_strings_get_string_offset(std::vector<std
return 0;
}
inline static void texture_database_strings_push_back_check(std::vector<std::string>& vec, std::string& str) {
inline static void texture_database_file_strings_push_back_check(std::vector<std::string>& vec, std::string& str) {
for (std::string& i : vec)
if (str == i)
return;
+22 -10
View File
@@ -9,6 +9,14 @@
#include <vector>
#include "../default.hpp"
struct texture_info_file {
std::string name;
uint32_t id;
texture_info_file();
~texture_info_file();
};
struct texture_info {
std::string name;
uint32_t name_hash;
@@ -18,15 +26,15 @@ struct texture_info {
~texture_info();
};
struct texture_database {
struct texture_database_file {
bool ready;
bool modern;
bool is_x;
std::vector<texture_info> texture;
std::vector<texture_info_file> texture;
texture_database();
~texture_database();
texture_database_file();
virtual ~texture_database_file();
void read(const char* path, bool modern);
void read(const wchar_t* path, bool modern);
@@ -35,13 +43,17 @@ struct texture_database {
void write(const wchar_t* path);
void write(void** data, size_t* size);
void merge_mdata(texture_database* base_tex_db,
texture_database* mdata_tex_db);
void split_mdata(texture_database* base_tex_db,
texture_database* mdata_tex_db);
static bool load_file(void* data, const char* path, const char* file, uint32_t hash);
};
struct texture_database {
std::vector<texture_info> texture;
texture_database();
virtual ~texture_database();
void add(texture_database_file* tex_db_file);
uint32_t get_texture_id(const char* name);
const char* get_texture_name(uint32_t id);
static bool load_file(void* data, const char* path, const char* file, uint32_t hash);
};
+1 -1
View File
@@ -7,7 +7,7 @@
#include "default.hpp"
#include "quat.hpp"
#include "quat_trans.h"
#include "quat_trans.hpp"
#include "vec.hpp"
struct enb_track {
+107 -84
View File
@@ -24,7 +24,8 @@ static errno_t farc_get_files(farc* f);
static void farc_pack_files(farc* f, stream& s, farc_compress_mode mode, bool get_files);
static errno_t farc_read_header(farc* f, stream& s);
static void farc_unpack_files(farc* f, stream& s, bool save);
static void farc_unpack_file(farc* f, stream& s, farc_file* ff);
static void farc_unpack_file(farc* f, stream& s, farc_file* ff,
bool save = false, char* temp_path = 0, size_t dir_len = 0);
farc::farc() : flags(), ft() {
signature = FARC_FArC;
@@ -36,7 +37,7 @@ farc::~farc() {
}
farc_file::farc_file() : offset(), size(), size_compressed(),
data(), data_compressed(), flags(), data_changed() {
data(), data_compressed(), compressed(), encrypted(), data_changed() {
}
@@ -180,7 +181,7 @@ farc_file* farc::read_file(const char* name) {
uint32_t name_hash = hash_utf8_murmurhash(name);
for (farc_file& i : files) {
if (hash_string_murmurhash(&i.name) != name_hash)
if (hash_string_murmurhash(i.name) != name_hash)
continue;
if (!i.data && i.data_compressed)
@@ -203,7 +204,7 @@ farc_file* farc::read_file(const wchar_t* name) {
uint32_t name_hash = hash_utf16_murmurhash(name);
for (farc_file& i : files) {
if (hash_string_murmurhash(&i.name) != name_hash)
if (hash_string_murmurhash(i.name) != name_hash)
continue;
if (!i.data && i.data_compressed)
@@ -566,6 +567,20 @@ static void farc_pack_files(farc* f, stream& s, farc_compress_mode mode, bool ge
break;
}
bool compressed = false;
switch (mode) {
case FARC_COMPRESS_FArc:
case FARC_COMPRESS_FARC:
case FARC_COMPRESS_FARC_AES:
compressed = false;
break;
case FARC_COMPRESS_FArC:
case FARC_COMPRESS_FARC_GZIP:
case FARC_COMPRESS_FARC_GZIP_AES:
compressed = true;
break;
}
if (mode == FARC_COMPRESS_FArc)
for (farc_file& i : f->files) {
s.write_string_null_terminated(i.name);
@@ -576,8 +591,8 @@ static void farc_pack_files(farc* f, stream& s, farc_compress_mode mode, bool ge
for (farc_file& i : f->files) {
s.write_string_null_terminated(i.name);
s.write_int32_t_reverse_endianness((int32_t)i.offset, true);
s.write_int32_t_reverse_endianness((int32_t)i.size_compressed, true);
s.write_int32_t_reverse_endianness((int32_t)i.size, true);
s.write_int32_t_reverse_endianness((int32_t)(compressed ? i.size : i.size_compressed), true);
s.write_int32_t_reverse_endianness((int32_t)(compressed ? i.size : 0), true);
}
align = align_val(align, 0x10) - align;
@@ -612,9 +627,9 @@ static errno_t farc_read_header(farc* f, stream& s) {
if (f->signature == FARC_FARC) {
f->flags = (farc_flags)s.read_int32_t_reverse_endianness(true);
s.read_int32_t();
int32_t farc_mode = s.read_int32_t_reverse_endianness(true);
int32_t alignment = s.read_int32_t_reverse_endianness(true);
f->ft = (f->flags & FARC_AES) && (farc_mode & (farc_mode - 1));
f->ft = (f->flags & FARC_AES) && (alignment & (alignment - 1));
if (f->ft) {
header_length -= 0x08;
s.set_position(-0x04, SEEK_CUR);
@@ -633,10 +648,14 @@ static errno_t farc_read_header(farc* f, stream& s) {
dt = d_t = force_malloc_s(uint8_t, header_length);
s.read(d_t, header_length);
if (f->ft) {
header_length -= 0x10;
aes128_ctx ctx;
aes128_init_ctx_iv(&ctx, key_ft, dt);
dt += 0x10;
aes128_cbc_decrypt_buffer(&ctx, dt, (size_t)header_length - 0x10);
aes128_cbc_decrypt_buffer(&ctx, dt, header_length);
header_length -= ((uint8_t*)dt)[header_length - 1]; // PKCS7 Padding
dt += sizeof(int32_t);
}
@@ -679,7 +698,10 @@ static errno_t farc_read_header(farc* f, stream& s) {
i.offset = (size_t)load_reverse_endianness_int32_t((void*)dt);
i.size_compressed = (size_t)load_reverse_endianness_int32_t((void*)(dt + 4));
i.size = (size_t)load_reverse_endianness_int32_t((void*)(dt + 8));
i.flags = (farc_flags)load_reverse_endianness_int32_t((void*)(dt + 12));
farc_flags flags = (farc_flags)load_reverse_endianness_int32_t((void*)(dt + 12));
i.compressed = i.size || flags & FARC_GZIP ? true : false;
i.encrypted = (f->flags | flags) & FARC_AES ? true : false;
dt += sizeof(int32_t) * 4;
}
else if (f->signature != FARC_FArc)
@@ -689,6 +711,9 @@ static errno_t farc_read_header(farc* f, stream& s) {
i.offset = (size_t)load_reverse_endianness_int32_t((void*)dt);
i.size_compressed = (size_t)load_reverse_endianness_int32_t((void*)(dt + 4));
i.size = (size_t)load_reverse_endianness_int32_t((void*)(dt + 8));
i.compressed = i.size ? true : false;
i.encrypted = f->flags & FARC_AES ? true : false;
dt += sizeof(int32_t) * 3;
}
else
@@ -697,6 +722,10 @@ static errno_t farc_read_header(farc* f, stream& s) {
dt += i.name.size() + 1;
i.offset = (size_t)load_reverse_endianness_int32_t((void*)dt);
i.size = (size_t)load_reverse_endianness_int32_t((void*)(dt + 4));
i.size_compressed = 0;
i.compressed = false;
i.encrypted = false;
dt += sizeof(int32_t) * 2;
}
free(d_t);
@@ -707,12 +736,6 @@ static void farc_unpack_files(farc* f, stream& s, bool save) {
if (!f || s.io.check_null())
return;
for (farc_file& i : f->files)
farc_unpack_file(f, s, &i);
if (!save)
return;
size_t max_path_len = 0;
size_t dir_len = f->directory_path.size();
for (farc_file& i : f->files) {
@@ -729,24 +752,13 @@ static void farc_unpack_files(farc* f, stream& s, bool save) {
memcpy(temp_path, f->directory_path.c_str(), sizeof(char) * dir_len);
temp_path[dir_len] = '\\';
for (farc_file& i : f->files) {
if (i.name.c_str()) {
memcpy(temp_path + dir_len + 1, i.name.c_str(), sizeof(wchar_t) * i.name.size());
temp_path[dir_len + 1 + i.name.size()] = '\0';
}
for (farc_file& i : f->files)
farc_unpack_file(f, s, &i, save, temp_path, dir_len);
if (i.data) {
stream temp_s;
temp_s.open(temp_path, "wb");
if (temp_s.io.stream)
temp_s.write(i.data, i.size);
free(i.data);
}
}
free(temp_path);
}
static void farc_unpack_file(farc* f, stream& s, farc_file* ff) {
static void farc_unpack_file(farc* f, stream& s, farc_file* ff, bool save, char* temp_path, size_t dir_len ) {
if (!f || s.io.check_null())
return;
@@ -755,68 +767,79 @@ static void farc_unpack_file(farc* f, stream& s, farc_file* ff) {
s.set_position(ff->offset, SEEK_SET);
if (f->signature != FARC_FARC) {
if (f->signature != FARC_FArC) {
ff->data_compressed = 0;
ff->data = force_malloc(ff->size);
s.read(ff->data, ff->size);
}
else if (ff->data_compressed)
deflate::decompress(ff->data_compressed, ff->size_compressed,
&ff->data, &ff->size, deflate::MODE_GZIP);
else {
ff->data_compressed = force_malloc(ff->size_compressed);
s.read(ff->data_compressed, ff->size_compressed);
deflate::decompress(ff->data_compressed, ff->size_compressed,
&ff->data, &ff->size, deflate::MODE_GZIP);
}
if (f->signature == FARC_FArc) {
ff->data_compressed = 0;
ff->data = force_malloc(ff->size);
s.read(ff->data, ff->size);
}
else {
bool aes = (f->flags | ff->flags) & FARC_AES;
bool gzip = (f->flags | ff->flags) & FARC_GZIP;
if (!aes && !gzip) {
ff->data_compressed = 0;
ff->data = force_malloc(ff->size);
s.read(ff->data, ff->size);
}
else if (ff->data_compressed)
deflate::decompress(ff->data_compressed, ff->size_compressed,
&ff->data, &ff->size, deflate::MODE_GZIP);
else {
size_t temp_s = aes ? align_val(ff->size_compressed, 0x10) : ff->size_compressed;
void* temp = force_malloc(temp_s);
s.read(temp, temp_s);
else if (f->signature == FARC_FArC) {
ff->data_compressed = force_malloc(ff->size_compressed);
s.read(ff->data_compressed, ff->size_compressed);
deflate::decompress(ff->data_compressed, ff->size_compressed,
&ff->data, &ff->size, deflate::MODE_GZIP);
}
else if (ff->encrypted || ff->compressed) {
size_t temp_s = ff->encrypted ? align_val(ff->size_compressed, 0x10) : ff->size_compressed;
void* temp = force_malloc(temp_s);
s.read(temp, temp_s);
void* t = temp;
if (aes)
if (f->ft) {
ff->size_compressed -= 0x10;
temp_s -= 0x10;
t = (void*)((uint64_t)t + 0x10);
void* t = temp;
if (ff->encrypted)
if (f->ft) {
temp_s -= 0x10;
t = (void*)((uint64_t)t + 0x10);
aes128_ctx ctx;
aes128_init_ctx_iv(&ctx, key_ft, (uint8_t*)temp);
aes128_cbc_decrypt_buffer(&ctx, (uint8_t*)t, temp_s);
}
else {
aes128_ctx ctx;
aes128_init_ctx(&ctx, key);
aes128_ecb_decrypt_buffer(&ctx, (uint8_t*)t, temp_s);
}
aes128_ctx ctx;
aes128_init_ctx_iv(&ctx, key_ft, (uint8_t*)temp);
aes128_cbc_decrypt_buffer(&ctx, (uint8_t*)t, temp_s);
if (!gzip) {
ff->data_compressed = 0;
ff->data = force_malloc(ff->size);
memcpy(ff->data, t, ff->size);
ff->size_compressed = temp_s - ((uint8_t*)t)[temp_s - 1]; // PKCS7 Padding
}
else {
ff->data_compressed = force_malloc(ff->size_compressed);
memcpy(ff->data_compressed, t, ff->size_compressed);
deflate::decompress(ff->data_compressed, ff->size_compressed,
&ff->data, &ff->size, deflate::MODE_GZIP);
aes128_ctx ctx;
aes128_init_ctx(&ctx, key);
aes128_ecb_decrypt_buffer(&ctx, (uint8_t*)t, temp_s);
}
free(temp);
if (!ff->compressed) {
ff->data_compressed = 0;
ff->data = force_malloc(ff->size);
memcpy(ff->data, t, ff->size);
}
else {
ff->data_compressed = force_malloc(ff->size_compressed);
memcpy(ff->data_compressed, t, ff->size_compressed);
deflate::decompress(ff->data_compressed, ff->size_compressed,
&ff->data, &ff->size, deflate::MODE_GZIP);
}
free(temp);
}
else {
ff->data_compressed = 0;
ff->data = force_malloc(ff->size);
s.read(ff->data, ff->size);
}
ff->data_changed = false;
if (!save)
return;
if (ff->data) {
if (ff->name.size()) {
memcpy(temp_path + dir_len + 1, ff->name.c_str(), ff->name.size());
temp_path[dir_len + 1 + ff->name.size()] = '\0';
stream temp_s;
temp_s.open(temp_path, "wb");
if (temp_s.io.stream)
temp_s.write(ff->data, ff->size);
}
free(ff->data);
ff->data = 0;
}
if (ff->data_compressed) {
free(ff->data_compressed);
ff->data_compressed = 0;
}
}
+3 -2
View File
@@ -31,13 +31,14 @@ enum farc_compress_mode {
};
struct farc_file {
std::string name;
size_t offset;
size_t size;
size_t size_compressed;
std::string name;
void* data;
void* data_compressed;
farc_flags flags;
bool compressed;
bool encrypted;
bool data_changed;
farc_file();
+15
View File
@@ -4,6 +4,9 @@
*/
#include "half_t.hpp"
#include <immintrin.h>
extern bool f16c;
inline half_t load_reverse_endianness_half_t(void* ptr) {
return (half_t)_byteswap_ushort(*(uint16_t*)ptr);
@@ -18,6 +21,9 @@ inline half_t reverse_endianness_half_t(half_t value) {
}
float_t half_to_float(half_t h) {
if (f16c)
return _mm_cvtss_f32( _mm_cvtph_ps(_mm_cvtsi32_si128((uint16_t)h)));
int32_t si32;
uint16_t sign = (h >> 15) & 0x001;
uint16_t exponent = (h >> 10) & 0x01F;
@@ -33,6 +39,9 @@ float_t half_to_float(half_t h) {
}
half_t float_to_half(float_t val) {
if (f16c)
return (half_t)_mm_cvtsi128_si32(_mm_cvtps_ph(_mm_set_ss(val), _MM_FROUND_CUR_DIRECTION));
int32_t si32 = *(int32_t*)&val;
if (si32 == 0x00000000)
return FLOAT16_POSITIVE_ZERO;
@@ -56,6 +65,9 @@ half_t float_to_half(float_t val) {
}
double_t half_to_double(half_t h) {
if (f16c)
return _mm_cvtss_f32(_mm_cvtph_ps(_mm_cvtsi32_si128((uint16_t)h)));
int64_t si64;
uint16_t sign = (h >> 15) & 0x001;
uint16_t exponent = (h >> 10) & 0x01F;
@@ -71,6 +83,9 @@ double_t half_to_double(half_t h) {
}
half_t double_to_half(double_t val) {
if (f16c)
return (half_t)_mm_cvtsi128_si32(_mm_cvtps_ph(_mm_cvtpd_ps(_mm_set_sd(val)), _MM_FROUND_CUR_DIRECTION));
int64_t si64 = *(int64_t*)&val;
if (si64 == 0x0000000000000000)
return FLOAT16_POSITIVE_ZERO;
+11 -6
View File
@@ -40,8 +40,13 @@ static const uint16_t hash_crc16_ccitt_table[] = {
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0,
};
// Empty string
const uint64_t hash_fnv1a64m_empty = 0xCBF29CE44FD0BFC1;
// Empty string
const uint32_t hash_murmurhash_empty = 0x0CAD3078;
// "NULL" string
const uint32_t hash_murmurhash_null = 0x5A009B23;
// Empty string
const uint32_t hash_crc16_ccitt_empty = 0xFFFF;
// FNV 1a 64-bit Modified
@@ -78,8 +83,8 @@ inline uint64_t hash_utf16_fnv1a64m(const wchar_t* data, bool make_upper) {
return hash;
}
inline uint64_t hash_string_fnv1a64m(const std::string* data, bool make_upper) {
return hash_fnv1a64m(data->c_str(), data->size(), make_upper);
inline uint64_t hash_string_fnv1a64m(const std::string& data, bool make_upper) {
return hash_fnv1a64m(data.c_str(), data.size(), make_upper);
}
// MurmurHash
@@ -226,8 +231,8 @@ inline uint32_t hash_utf16_murmurhash(const wchar_t* data, uint32_t seed, bool u
return hash;
}
inline uint32_t hash_string_murmurhash(const std::string* data, uint32_t seed, bool upper) {
return hash_murmurhash(data->c_str(), data->size(), seed, upper);
inline uint32_t hash_string_murmurhash(const std::string& data, uint32_t seed, bool upper) {
return hash_murmurhash(data.c_str(), data.size(), seed, upper);
}
// CRC16-CCITT
@@ -260,6 +265,6 @@ inline uint16_t hash_utf16_crc16_ccitt(const wchar_t* data, bool make_upper) {
return hash;
}
inline uint16_t hash_string_crc16_ccitt(const std::string* data, bool make_upper) {
return hash_crc16_ccitt(data->c_str(), data->size(), make_upper);
inline uint16_t hash_string_crc16_ccitt(const std::string& data, bool make_upper) {
return hash_crc16_ccitt(data.c_str(), data.size(), make_upper);
}
+8 -3
View File
@@ -8,19 +8,24 @@
#include <string>
#include "default.hpp"
// Empty string
extern const uint64_t hash_fnv1a64m_empty;
// Empty string
extern const uint32_t hash_murmurhash_empty;
// "NULL" string
extern const uint32_t hash_murmurhash_null;
// Empty string
extern const uint32_t hash_crc16_ccitt_empty;
extern uint64_t hash_fnv1a64m(const void* data, size_t size, bool make_upper = false);
extern uint64_t hash_utf8_fnv1a64m(const char* data, bool make_upper = false);
extern uint64_t hash_utf16_fnv1a64m(const wchar_t* data, bool make_upper = false);
extern uint64_t hash_string_fnv1a64m(const std::string* data, bool make_upper = false);
extern uint64_t hash_string_fnv1a64m(const std::string& data, bool make_upper = false);
extern uint32_t hash_murmurhash(const void* data, size_t size, uint32_t seed = 0, bool upper = false, bool big_endian = false);
extern uint32_t hash_utf8_murmurhash(const char* data, uint32_t seed = 0, bool upper = false);
extern uint32_t hash_utf16_murmurhash(const wchar_t* data, uint32_t seed = 0, bool upper = false);
extern uint32_t hash_string_murmurhash(const std::string* data, uint32_t seed = 0, bool upper = false);
extern uint32_t hash_string_murmurhash(const std::string& data, uint32_t seed = 0, bool upper = false);
extern uint16_t hash_crc16_ccitt(const void* data, size_t size, bool make_upper = false);
extern uint16_t hash_utf8_crc16_ccitt(const char* data, bool make_upper = false);
extern uint16_t hash_utf16_crc16_ccitt(const wchar_t* data, bool make_upper = false);
extern uint16_t hash_string_crc16_ccitt(const std::string* data, bool make_upper = false);
extern uint16_t hash_string_crc16_ccitt(const std::string& data, bool make_upper = false);
@@ -3,7 +3,7 @@
GitHub/GitLab: korenkonder
*/
#include "interpolation.h"
#include "interpolation.hpp"
inline float_t interpolate_linear_value(float_t p1, float_t p2, float_t f1, float_t f2, float_t f) {
float_t t = (f - f1) / (f2 - f1);
@@ -58,18 +58,18 @@ inline void interpolate_linear_value_vec4(vec4* p1, vec4* p2, vec4* f1, vec4* f2
__m128 _f1;
__m128 _f2;
__m128 _f;
_p1 = p1->data;
_p2 = p2->data;
_f1 = f1->data;
_f2 = f2->data;
_f = f->data;
_p1 = _mm_loadu_ps((float*)p1);
_p2 = _mm_loadu_ps((float*)p2);
_f1 = _mm_loadu_ps((float*)f1);
_f2 = _mm_loadu_ps((float*)f2);
_f = _mm_loadu_ps((float*)f);
const __m128 _1 = _mm_set_ps1(1.0f);
__m128 df = _mm_sub_ps(_f2, _f1);
__m128 t = _mm_div_ps(_mm_sub_ps(_f, _f1), df);
__m128 t1 = _mm_sub_ps(_1, t);
value->data = _mm_add_ps(_mm_mul_ps(_p1, t1), _mm_mul_ps(_p2, t));
_mm_storeu_ps((float*)value, _mm_add_ps(_mm_mul_ps(_p1, t1), _mm_mul_ps(_p2, t)));
}
inline void interpolate_linear(float_t p1, float_t p2,
@@ -163,13 +163,13 @@ inline void interpolate_chs_value_vec4(vec4* p1, vec4* p2,
__m128 _f1;
__m128 _f2;
__m128 _f;
_p1 = p1->data;
_p2 = p2->data;
_t1 = t1->data;
_t2 = t2->data;
_f1 = f1->data;
_f2 = f2->data;
_f = f->data;
_p1 = _mm_loadu_ps((float*)p1);
_p2 = _mm_loadu_ps((float*)p2);
_t1 = _mm_loadu_ps((float*)t1);
_t2 = _mm_loadu_ps((float*)t2);
_f1 = _mm_loadu_ps((float*)f1);
_f2 = _mm_loadu_ps((float*)f2);
_f = _mm_loadu_ps((float*)f);
const __m128 _1 = _mm_set_ps1(1.0f);
const __m128 _2 = _mm_set_ps1(2.0f);
@@ -181,7 +181,7 @@ inline void interpolate_chs_value_vec4(vec4* p1, vec4* p2,
__m128 delta = _mm_mul_ps(_mm_mul_ps(_mm_mul_ps(t, t), _mm_sub_ps(_3, _mm_mul_ps(_2, t))), _mm_sub_ps(_p2, _p1));
__m128 tangent = _mm_mul_ps(_mm_add_ps(_mm_mul_ps(t_1, _t1), _mm_mul_ps(t, _t2)), _mm_mul_ps(df, t_1));
value->data = _mm_add_ps(_mm_add_ps(_p1, delta), tangent);
_mm_storeu_ps((float*)value, _mm_add_ps(_mm_add_ps(_p1, delta), tangent));
}
inline void interpolate_chs(float_t p1, float_t p2,
+1 -1
View File
@@ -808,7 +808,7 @@ static int64_t key_val_get_key_index(key_val* kv, std::string& str) {
if (curr_scope->key_hash_index.size() < 1)
return -1;
uint64_t hash = hash_string_fnv1a64m(&str);
uint64_t hash = hash_string_fnv1a64m(str);
std::vector<key_val_hash_index_pair>::iterator key = curr_scope->key_hash_index.begin();
size_t len = curr_scope->count;
+1 -1
View File
@@ -48,7 +48,7 @@ struct key_val {
char* buf;
key_val();
~key_val();
virtual ~key_val();
void close_scope();
void file_read(const char* path);
+4 -4
View File
@@ -18,6 +18,10 @@ light_param_face::light_param_face() : ready(), offset(), scale(), position(), d
}
light_param_face::~light_param_face() {
}
void light_param_face::read(const char* path) {
char* path_txt = str_utils_add(path, ".txt");
if (path_check_file_exists(path_txt)) {
@@ -80,10 +84,6 @@ void light_param_face::write(void** data, size_t* size) {
s.copy(data, size);
}
light_param_face::~light_param_face() {
}
bool light_param_face::load_file(void* data, const char* path, const char* file, uint32_t hash) {
size_t file_len = utf8_length(file);
+2 -1
View File
@@ -17,13 +17,14 @@ struct light_param_face {
vec3 direction;
light_param_face();
virtual ~light_param_face();
void read(const char* path);
void read(const wchar_t* path);
void read(const void* data, size_t size);
void write(const char* path);
void write(const wchar_t* path);
void write(void** data, size_t* size);
~light_param_face();
static bool load_file(void* data, const char* path, const char* file, uint32_t hash);
};
+7 -7
View File
@@ -168,9 +168,9 @@ static void light_param_fog_read_inner(light_param_fog* fog, stream& s) {
group->has_linear = true;
}
else if (!str_utils_compare_length(buf, sizeof(buf), "color", 5)) {
vec4u* color = &group->color;
vec4& color = group->color;
if (buf[5] != ' ' || sscanf_s(buf + 6, "%f %f %f %f",
&color->x, &color->y, &color->z, &color->w) != 4)
&color.x, &color.y, &color.z, &color.w) != 4)
goto End;
group->has_color = true;
@@ -214,12 +214,12 @@ static void light_param_fog_write_inner(light_param_fog* fog, stream& s) {
}
if (group->has_color) {
vec4u* color = &group->color;
vec4& color = group->color;
s.write("color", 5);
light_param_fog_write_float_t(s, buf, sizeof(buf), color->x);
light_param_fog_write_float_t(s, buf, sizeof(buf), color->y);
light_param_fog_write_float_t(s, buf, sizeof(buf), color->z);
light_param_fog_write_float_t(s, buf, sizeof(buf), color->w);
light_param_fog_write_float_t(s, buf, sizeof(buf), color.x);
light_param_fog_write_float_t(s, buf, sizeof(buf), color.y);
light_param_fog_write_float_t(s, buf, sizeof(buf), color.z);
light_param_fog_write_float_t(s, buf, sizeof(buf), color.w);
s.write_char('\n');
}

Some files were not shown because too many files have changed in this diff Show More