mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-10 16:18:35 +03:00
X Pack preparations
This commit is contained in:
+142
-38
@@ -90,6 +90,11 @@ static void a3dc_write_a3da_vec3(stream& s, a3da_vec3& value);
|
||||
static void a3dc_read_a3da_vec3_f16(void* data, size_t size, a3da_vec3* value, a3da_compress_f16 f16);
|
||||
static void a3dc_write_a3da_vec3_f16(stream& s, a3da_vec3& value, a3da_compress_f16 f16);
|
||||
|
||||
static void a3da_key_make_raw_data_binary(a3da_key* value);
|
||||
static void a3da_model_transform_make_raw_data_binary(a3da_model_transform* value);
|
||||
static void a3da_rgba_make_raw_data_binary(a3da_rgba* value);
|
||||
static void a3da_vec3_make_raw_data_binary(a3da_vec3* value);
|
||||
|
||||
a3da_key::a3da_key() : flags(), bin_offset(), type(), ep_type_pre(), ep_type_post(), max_frame(),
|
||||
raw_data(), raw_data_binary(), raw_data_value_list_size(), raw_data_value_list_offset(), value() {
|
||||
}
|
||||
@@ -482,9 +487,9 @@ static void a3da_read_inner(a3da* a, stream& s) {
|
||||
}
|
||||
|
||||
static void a3da_write_inner(a3da* a, stream& s) {
|
||||
bool a3dc = a->compressed || a->format > A3DA_FORMAT_AFT;
|
||||
bool a3dc = a->compressed || a->format > A3DA_FORMAT_AFT && a->format != A3DA_FORMAT_AFT_X_PACK;
|
||||
|
||||
if (a->format <= A3DA_FORMAT_AFT)
|
||||
if (a->format <= A3DA_FORMAT_AFT || a->format == A3DA_FORMAT_AFT_X_PACK)
|
||||
a->_compress_f16 = A3DA_COMPRESS_F32F32F32F32;
|
||||
|
||||
void* a3dc_data = 0;
|
||||
@@ -498,7 +503,7 @@ static void a3da_write_inner(a3da* a, stream& s) {
|
||||
|
||||
memory_stream s_a3da;
|
||||
stream& _s = s;
|
||||
if (a->format > A3DA_FORMAT_AFT) {
|
||||
if (a->format > A3DA_FORMAT_AFT && a->format != A3DA_FORMAT_AFT_X_PACK) {
|
||||
s_a3da.open();
|
||||
_s = s_a3da;
|
||||
}
|
||||
@@ -537,7 +542,7 @@ static void a3da_write_inner(a3da* a, stream& s) {
|
||||
_s.write(a3da_data, a3da_data_length);
|
||||
free_def(a3da_data);
|
||||
|
||||
if (a->format > A3DA_FORMAT_AFT) {
|
||||
if (a->format > A3DA_FORMAT_AFT && a->format != A3DA_FORMAT_AFT_X_PACK) {
|
||||
f2_struct st;
|
||||
s_a3da.align_write(0x10);
|
||||
s_a3da.copy(st.data);
|
||||
@@ -1126,7 +1131,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* size, bool a3dc) {
|
||||
{
|
||||
kv.open_scope("_");
|
||||
|
||||
if (a3dc && a->format > A3DA_FORMAT_AFT)
|
||||
if (a3dc && a->format > A3DA_FORMAT_AFT && a->format != A3DA_FORMAT_AFT_X_PACK)
|
||||
kv.write(s, "compress_f16", a->_compress_f16);
|
||||
kv.write(s, "converter.version", a->_converter_version);
|
||||
kv.write(s, "file_name", a->_file_name);
|
||||
@@ -1184,7 +1189,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* size, bool a3dc) {
|
||||
kv.open_scope("camera_auxiliary");
|
||||
|
||||
a3da_camera_auxiliary* ca = &a->camera_auxiliary;
|
||||
if (a->format == A3DA_FORMAT_F || a->format > A3DA_FORMAT_AFT) {
|
||||
if (a->format == A3DA_FORMAT_F || a->format > A3DA_FORMAT_AFT && a->format != A3DA_FORMAT_AFT_X_PACK) {
|
||||
if (ca->flags & A3DA_CAMERA_AUXILIARY_EXPOSURE_RATE)
|
||||
key_val_out_write(&kv, s, "exposure_rate", ca->exposure_rate);
|
||||
if (ca->flags & A3DA_CAMERA_AUXILIARY_GAMMA_RATE)
|
||||
@@ -1276,7 +1281,44 @@ static void a3da_write_text(a3da* a, void** data, size_t* size, bool a3dc) {
|
||||
kv.close_scope();
|
||||
}
|
||||
|
||||
if (a->curve.size() > 0) {
|
||||
if (a->format == A3DA_FORMAT_AFT_X_PACK && (a->curve.size() > 0 || a->material_list.size() > 0)) {
|
||||
kv.open_scope("curve");
|
||||
|
||||
int32_t curve_count = (int32_t)a->curve.size();
|
||||
int32_t mat_list_count = (int32_t)a->material_list.size();
|
||||
a3da_curve* vc = a->curve.data();
|
||||
a3da_material_list* vml = a->material_list.data();
|
||||
|
||||
std::vector<int32_t> sort_index;
|
||||
key_val_out::get_lexicographic_order(sort_index, curve_count + mat_list_count);
|
||||
int32_t* sort_index_data = sort_index.data();
|
||||
for (int32_t i = 0; i < curve_count + mat_list_count; i++) {
|
||||
kv.open_scope_fmt(sort_index_data[i]);
|
||||
|
||||
if (sort_index_data[i] < curve_count) {
|
||||
a3da_curve* c = &vc[sort_index_data[i]];
|
||||
key_val_out_write(&kv, s, "cv", c->curve);
|
||||
kv.write(s, "name", c->name);
|
||||
}
|
||||
else {
|
||||
a3da_material_list* ml = &vml[sort_index_data[i] - curve_count];
|
||||
kv.open_scope("ml");
|
||||
kv.write(s, "true");
|
||||
if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR)
|
||||
key_val_out_write(&kv, s, "blend_color", ml->blend_color);
|
||||
if (ml->flags & A3DA_MATERIAL_LIST_EMISSION)
|
||||
key_val_out_write(&kv, s, "emission", ml->emission);
|
||||
kv.close_scope();
|
||||
kv.write(s, "name", ml->name);
|
||||
}
|
||||
|
||||
kv.close_scope();
|
||||
}
|
||||
|
||||
kv.write(s, "length", curve_count + mat_list_count);
|
||||
kv.close_scope();
|
||||
}
|
||||
else if (a->curve.size() > 0) {
|
||||
kv.open_scope("curve");
|
||||
|
||||
int32_t count = (int32_t)a->curve.size();
|
||||
@@ -1299,7 +1341,7 @@ static void a3da_write_text(a3da* a, void** data, size_t* size, bool a3dc) {
|
||||
kv.close_scope();
|
||||
}
|
||||
|
||||
if (a->dof.has_dof && a->format == A3DA_FORMAT_AFT) {
|
||||
if (a->dof.has_dof && (a->format == A3DA_FORMAT_AFT || a->format == A3DA_FORMAT_AFT_X_PACK)) {
|
||||
kv.open_scope("dof");
|
||||
|
||||
a3da_dof* d = &a->dof;
|
||||
@@ -1556,10 +1598,10 @@ static void a3da_write_text(a3da* a, void** data, size_t* size, bool a3dc) {
|
||||
a3da_material_list* ml = &vml[sort_index_data[i]];
|
||||
if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR)
|
||||
key_val_out_write(&kv, s, "blend_color", ml->blend_color);
|
||||
if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR)
|
||||
if (ml->flags & A3DA_MATERIAL_LIST_GLOW_INTENSITY)
|
||||
key_val_out_write(&kv, s, "glow_intensity", ml->glow_intensity);
|
||||
kv.write(s, "hash_name", hash_string_murmurhash(ml->name));
|
||||
if (ml->flags & A3DA_MATERIAL_LIST_BLEND_COLOR)
|
||||
if (ml->flags & A3DA_MATERIAL_LIST_EMISSION)
|
||||
key_val_out_write(&kv, s, "incandescence", ml->emission);
|
||||
kv.write(s, "name", ml->name);
|
||||
|
||||
@@ -1796,11 +1838,11 @@ static void a3da_write_text(a3da* a, void** data, size_t* size, bool a3dc) {
|
||||
|
||||
a3da_play_control* pc = &a->play_control;
|
||||
kv.write(s, "begin", pc->begin);
|
||||
if (pc->flags & A3DA_PLAY_CONTROL_DIV && a->format > A3DA_FORMAT_AFT)
|
||||
if (pc->flags & A3DA_PLAY_CONTROL_DIV && a->format > A3DA_FORMAT_AFT && a->format != A3DA_FORMAT_AFT_X_PACK)
|
||||
kv.write(s, "div", pc->div);
|
||||
kv.write(s, "fps", pc->fps);
|
||||
if (pc->flags & A3DA_PLAY_CONTROL_OFFSET) {
|
||||
if (a->format > A3DA_FORMAT_AFT) {
|
||||
if (a->format > A3DA_FORMAT_AFT && a->format != A3DA_FORMAT_AFT_X_PACK) {
|
||||
kv.write(s, "offset", pc->offset);
|
||||
kv.write(s, "size", pc->size);
|
||||
}
|
||||
@@ -2030,6 +2072,8 @@ static void a3da_write_data(a3da* a, void** data, size_t* size) {
|
||||
memory_stream s;
|
||||
s.open();
|
||||
|
||||
bool aft_rgba = a->format == A3DA_FORMAT_AFT || a->format == A3DA_FORMAT_AFT_X_PACK;
|
||||
|
||||
for (a3da_camera_root& i : a->camera_root) {
|
||||
a3dc_write_a3da_model_transform_offset(s, i.model_transform);
|
||||
a3dc_write_a3da_model_transform_offset(s, i.view_point.model_transform);
|
||||
@@ -2067,9 +2111,9 @@ static void a3da_write_data(a3da* a, void** data, size_t* size) {
|
||||
a3dc_write_a3da_model_transform_offset(s, i.model_transform);
|
||||
|
||||
for (a3da_ambient& i : a->ambient) {
|
||||
if (i.flags & A3DA_AMBIENT_LIGHT_DIFFUSE)
|
||||
if ((i.flags & A3DA_AMBIENT_LIGHT_DIFFUSE) && !aft_rgba)
|
||||
a3dc_write_a3da_rgba(s, i.light_diffuse);
|
||||
if (i.flags & A3DA_AMBIENT_RIM_LIGHT_DIFFUSE)
|
||||
if ((i.flags & A3DA_AMBIENT_RIM_LIGHT_DIFFUSE) && !aft_rgba)
|
||||
a3dc_write_a3da_rgba(s, i.rim_light_diffuse);
|
||||
}
|
||||
|
||||
@@ -2111,18 +2155,24 @@ static void a3da_write_data(a3da* a, void** data, size_t* size) {
|
||||
for (a3da_curve& i : a->curve)
|
||||
a3dc_write_a3da_key(s, i.curve);
|
||||
|
||||
if (a->dof.has_dof && a->format == A3DA_FORMAT_AFT_X_PACK) {
|
||||
a3da_dof* d = &a->dof;
|
||||
a3da_model_transform_make_raw_data_binary(&d->model_transform);
|
||||
a3dc_write_a3da_model_transform(s, d->model_transform, _compress_f16);
|
||||
}
|
||||
|
||||
for (a3da_light& i : a->light) {
|
||||
if (i.flags & A3DA_LIGHT_POSITION)
|
||||
a3dc_write_a3da_model_transform(s, i.position, _compress_f16);
|
||||
if (i.flags & A3DA_LIGHT_SPOT_DIRECTION)
|
||||
a3dc_write_a3da_model_transform(s, i.spot_direction, _compress_f16);
|
||||
if (i.flags & A3DA_LIGHT_AMBIENT)
|
||||
if ((i.flags & A3DA_LIGHT_AMBIENT) && !aft_rgba)
|
||||
a3dc_write_a3da_rgba(s, i.ambient);
|
||||
if (i.flags & A3DA_LIGHT_DIFFUSE)
|
||||
if ((i.flags & A3DA_LIGHT_DIFFUSE) && !aft_rgba)
|
||||
a3dc_write_a3da_rgba(s, i.diffuse);
|
||||
if (i.flags & A3DA_LIGHT_SPECULAR)
|
||||
if ((i.flags & A3DA_LIGHT_SPECULAR) && !aft_rgba)
|
||||
a3dc_write_a3da_rgba(s, i.specular);
|
||||
if (i.flags & A3DA_LIGHT_TONE_CURVE)
|
||||
if ((i.flags & A3DA_LIGHT_TONE_CURVE) && !aft_rgba)
|
||||
a3dc_write_a3da_rgba(s, i.tone_curve);
|
||||
if (a->format == A3DA_FORMAT_XHD) {
|
||||
if (i.flags & A3DA_LIGHT_INTENSITY)
|
||||
@@ -2149,7 +2199,7 @@ static void a3da_write_data(a3da* a, void** data, size_t* size) {
|
||||
a3dc_write_a3da_key(s, i.end);
|
||||
if (i.flags & A3DA_FOG_START)
|
||||
a3dc_write_a3da_key(s, i.start);
|
||||
if (i.flags & A3DA_FOG_COLOR)
|
||||
if ((i.flags & A3DA_FOG_COLOR) && !aft_rgba)
|
||||
a3dc_write_a3da_rgba(s, i.color);
|
||||
}
|
||||
|
||||
@@ -2163,14 +2213,27 @@ static void a3da_write_data(a3da* a, void** data, size_t* size) {
|
||||
a3dc_write_a3da_model_transform(s, j.model_transform, _compress_f16);
|
||||
}
|
||||
|
||||
for (a3da_material_list& i : a->material_list) {
|
||||
if (i.flags & A3DA_MATERIAL_LIST_GLOW_INTENSITY)
|
||||
a3dc_write_a3da_key(s, i.glow_intensity);
|
||||
if (i.flags & A3DA_MATERIAL_LIST_BLEND_COLOR)
|
||||
a3dc_write_a3da_rgba(s, i.blend_color);
|
||||
if (i.flags & A3DA_MATERIAL_LIST_EMISSION)
|
||||
a3dc_write_a3da_rgba(s, i.emission);
|
||||
}
|
||||
if (a->format == A3DA_FORMAT_X || a->format == A3DA_FORMAT_XHD)
|
||||
for (a3da_material_list& i : a->material_list) {
|
||||
if (i.flags & A3DA_MATERIAL_LIST_GLOW_INTENSITY)
|
||||
a3dc_write_a3da_key(s, i.glow_intensity);
|
||||
if (i.flags & A3DA_MATERIAL_LIST_BLEND_COLOR)
|
||||
a3dc_write_a3da_rgba(s, i.blend_color);
|
||||
if (i.flags & A3DA_MATERIAL_LIST_EMISSION)
|
||||
a3dc_write_a3da_rgba(s, i.emission);
|
||||
}
|
||||
else if (a->format == A3DA_FORMAT_AFT_X_PACK)
|
||||
for (a3da_material_list& i : a->material_list) {
|
||||
if (i.flags & A3DA_MATERIAL_LIST_BLEND_COLOR) {
|
||||
a3da_rgba_make_raw_data_binary(&i.blend_color);
|
||||
a3dc_write_a3da_rgba(s, i.blend_color);
|
||||
}
|
||||
|
||||
if (i.flags & A3DA_MATERIAL_LIST_EMISSION) {
|
||||
a3da_rgba_make_raw_data_binary(&i.emission);
|
||||
a3dc_write_a3da_rgba(s, i.emission);
|
||||
}
|
||||
}
|
||||
|
||||
for (a3da_object& i : a->object) {
|
||||
a3dc_write_a3da_model_transform(s, i.model_transform, _compress_f16);
|
||||
@@ -2215,11 +2278,11 @@ static void a3da_write_data(a3da* a, void** data, size_t* size) {
|
||||
a3dc_write_a3da_key(s, pp->lens_ghost);
|
||||
if (pp->flags & A3DA_POST_PROCESS_LENS_SHAFT)
|
||||
a3dc_write_a3da_key(s, pp->lens_shaft);
|
||||
if (pp->flags & A3DA_POST_PROCESS_INTENSITY)
|
||||
if ((pp->flags & A3DA_POST_PROCESS_INTENSITY) && !aft_rgba)
|
||||
a3dc_write_a3da_rgba(s, pp->intensity);
|
||||
if (pp->flags & A3DA_POST_PROCESS_RADIUS)
|
||||
if ((pp->flags & A3DA_POST_PROCESS_RADIUS) && !aft_rgba)
|
||||
a3dc_write_a3da_rgba(s, pp->radius);
|
||||
if (pp->flags & A3DA_POST_PROCESS_SCENE_FADE)
|
||||
if ((pp->flags & A3DA_POST_PROCESS_SCENE_FADE) && !aft_rgba)
|
||||
a3dc_write_a3da_rgba(s, pp->scene_fade);
|
||||
}
|
||||
|
||||
@@ -2486,7 +2549,7 @@ static bool key_val_read_raw_data(key_val* kv,
|
||||
kv->read("raw_data.value_list_size", value_list_size);
|
||||
|
||||
int32_t value_list_offset;
|
||||
if (kv->read( "raw_data.value_list_offset", value_list_offset)) {
|
||||
if (kv->read("raw_data.value_list_offset", value_list_offset)) {
|
||||
if (key_type != 3)
|
||||
return false;
|
||||
|
||||
@@ -2724,14 +2787,16 @@ static void key_val_out_write(key_val_out* kv, stream& s,
|
||||
|
||||
kv->open_scope(key);
|
||||
|
||||
if (value.flags & A3DA_RGBA_R)
|
||||
key_val_out_write(kv, s, "r", value.r);
|
||||
if (value.flags & A3DA_RGBA_G)
|
||||
key_val_out_write(kv, s, "g", value.g);
|
||||
if (value.flags & A3DA_RGBA_B)
|
||||
key_val_out_write(kv, s, "b", value.b);
|
||||
kv->write(s, "true");
|
||||
|
||||
if (value.flags & A3DA_RGBA_A)
|
||||
key_val_out_write(kv, s, "a", value.a);
|
||||
if (value.flags & A3DA_RGBA_B)
|
||||
key_val_out_write(kv, s, "b", value.b);
|
||||
if (value.flags & A3DA_RGBA_G)
|
||||
key_val_out_write(kv, s, "g", value.g);
|
||||
if (value.flags & A3DA_RGBA_R)
|
||||
key_val_out_write(kv, s, "r", value.r);
|
||||
|
||||
kv->close_scope();
|
||||
}
|
||||
@@ -2853,11 +2918,17 @@ static void a3dc_read_a3da_key_f16(void* data, size_t size, a3da_key* value, a3d
|
||||
|
||||
static void a3dc_write_a3da_key_f16(stream& s, a3da_key& value, a3da_compress_f16 f16) {
|
||||
if (value.raw_data) {
|
||||
if (value.keys.size() < 1) {
|
||||
if (value.type == A3DA_KEY_NONE || value.type == A3DA_KEY_STATIC) {
|
||||
value.raw_data = false;
|
||||
value.raw_data_binary = false;
|
||||
return;
|
||||
}
|
||||
else if (value.keys.size() < 1) {
|
||||
value.raw_data = false;
|
||||
value.raw_data_binary = false;
|
||||
value.type = A3DA_KEY_NONE;
|
||||
value.keys.resize(0);
|
||||
return;
|
||||
}
|
||||
else if (value.keys.size() == 1) {
|
||||
value.raw_data = false;
|
||||
@@ -2865,6 +2936,7 @@ static void a3dc_write_a3da_key_f16(stream& s, a3da_key& value, a3da_compress_f1
|
||||
value.type = A3DA_KEY_STATIC;
|
||||
value.value = value.keys[0].value;
|
||||
value.keys.resize(0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3082,3 +3154,35 @@ static void a3dc_write_a3da_vec3_f16(stream& s, a3da_vec3& value, a3da_compress_
|
||||
a3dc_write_a3da_key_f16(s, value.y, f16);
|
||||
a3dc_write_a3da_key_f16(s, value.z, f16);
|
||||
}
|
||||
|
||||
inline static void a3da_key_make_raw_data_binary(a3da_key* value) {
|
||||
value->raw_data = true;
|
||||
value->raw_data_binary = true;
|
||||
}
|
||||
|
||||
inline static void a3da_model_transform_make_raw_data_binary(a3da_model_transform* value) {
|
||||
a3da_vec3_make_raw_data_binary(&value->rotation);
|
||||
a3da_vec3_make_raw_data_binary(&value->scale);
|
||||
a3da_vec3_make_raw_data_binary(&value->scale);
|
||||
a3da_key_make_raw_data_binary(&value->visibility);
|
||||
}
|
||||
|
||||
inline static void a3da_rgba_make_raw_data_binary(a3da_rgba* value) {
|
||||
if (value->flags & A3DA_RGBA_R)
|
||||
a3da_key_make_raw_data_binary(&value->r);
|
||||
|
||||
if (value->flags & A3DA_RGBA_G)
|
||||
a3da_key_make_raw_data_binary(&value->g);
|
||||
|
||||
if (value->flags & A3DA_RGBA_B)
|
||||
a3da_key_make_raw_data_binary(&value->b);
|
||||
|
||||
if (value->flags & A3DA_RGBA_A)
|
||||
a3da_key_make_raw_data_binary(&value->a);
|
||||
}
|
||||
|
||||
inline static void a3da_vec3_make_raw_data_binary(a3da_vec3* value) {
|
||||
a3da_key_make_raw_data_binary(&value->x);
|
||||
a3da_key_make_raw_data_binary(&value->y);
|
||||
a3da_key_make_raw_data_binary(&value->z);
|
||||
}
|
||||
|
||||
+7
-6
@@ -63,12 +63,13 @@ enum a3da_fog_flags {
|
||||
|
||||
enum a3da_format {
|
||||
A3DA_FORMAT_DT = 0,
|
||||
A3DA_FORMAT_F = 1,
|
||||
A3DA_FORMAT_AFT = 2,
|
||||
A3DA_FORMAT_F2 = 3,
|
||||
A3DA_FORMAT_MGF = 4,
|
||||
A3DA_FORMAT_X = 5,
|
||||
A3DA_FORMAT_XHD = 6,
|
||||
A3DA_FORMAT_F,
|
||||
A3DA_FORMAT_AFT,
|
||||
A3DA_FORMAT_F2,
|
||||
A3DA_FORMAT_MGF,
|
||||
A3DA_FORMAT_X,
|
||||
A3DA_FORMAT_XHD,
|
||||
A3DA_FORMAT_AFT_X_PACK,
|
||||
};
|
||||
|
||||
enum a3da_key_flags {
|
||||
|
||||
+258
-89
@@ -256,13 +256,16 @@ static void x_pv_game_reset_field(x_pv_game* xpvgm);
|
||||
|
||||
static void x_pv_game_update_object_set(ObjsetInfo* info);
|
||||
static void x_pv_game_write_auth_3d(auth_3d* auth);
|
||||
static void x_pv_game_write_object_set(ObjsetInfo* info);
|
||||
static void x_pv_game_write_glitter(Glitter::EffectGroup* eff_group);
|
||||
static void x_pv_game_write_object_set(ObjsetInfo* info, object_database* obj_db, texture_database* tex_db);
|
||||
|
||||
static void print_dsc_command(dsc& dsc, dsc_data* dsc_data_ptr, int64_t time);
|
||||
static void print_dsc_command(dsc& dsc, dsc_data* dsc_data_ptr, int64_t* time);
|
||||
|
||||
static void replace_pv832(char* str);
|
||||
static void replace_pv832(std::string& str);
|
||||
static void replace_stgpv(char* str);
|
||||
static void replace_stgpv(std::string& str);
|
||||
|
||||
bool x_pv_bar_beat_data::compare_bar_time_less(float_t time) {
|
||||
return (time + 0.0001f) < bar_time;
|
||||
@@ -985,6 +988,9 @@ void x_pv_game_effect::ctrl(object_database* obj_db, texture_database* tex_db) {
|
||||
eff_group->LoadModel(x_data);
|
||||
}
|
||||
|
||||
for (string_hash& i : pv_glitter)
|
||||
Glitter::glt_particle_manager->SetSceneName(i.hash_murmurhash, i.c_str());
|
||||
|
||||
state = 12;
|
||||
break;
|
||||
}
|
||||
@@ -1447,9 +1453,6 @@ void x_pv_game_chara_effect::load(int32_t pv_id, pvpp* play_param,
|
||||
const char* src_chara_str = chara_index_get_auth_3d_name(src_chara);
|
||||
const char* dst_chara_str = chara_index_get_auth_3d_name(dst_chara);
|
||||
const char* dst_chara_mei_str = chara_index_get_auth_3d_name(dst_chara_mei);
|
||||
#if BAKE_PV826
|
||||
std::string mik_chara_str = chara_index_get_auth_3d_name(CHARA_MIKU);
|
||||
#endif
|
||||
|
||||
for (pvpp_chara_effect_auth_3d& j : chara_effect.auth_3d) {
|
||||
std::string file(j.auth_3d.str);
|
||||
@@ -1490,15 +1493,12 @@ void x_pv_game_chara_effect::load(int32_t pv_id, pvpp* play_param,
|
||||
}
|
||||
else {
|
||||
char buf[0x200];
|
||||
sprintf_s(buf, sizeof(buf), "EFFCHRPV%03d", pv_id);
|
||||
if (j.auth_3d.str.find(buf) == -1)
|
||||
sprintf_s(buf, sizeof(buf), , pv_id);
|
||||
if (!j.auth_3d.str.find("EFFCHRPV826"))
|
||||
continue;
|
||||
|
||||
file.assign(j.auth_3d.str);
|
||||
file.replace(utf8_length(buf), mik_chara_str.size(), mik_chara_str);
|
||||
|
||||
sprintf_s(buf, sizeof(buf), "EFFCHRPV%03dMIK001", pv_id);
|
||||
object_set.assign(buf);
|
||||
file.assign("EFFCHRPV826MIK001");
|
||||
object_set.assign("EFFCHRPV826MIK001");
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -4761,6 +4761,9 @@ void x_pv_game_stage::ctrl(float_t delta_time) {
|
||||
eff_group->LoadModel(x_data);
|
||||
}
|
||||
|
||||
for (pvsr_effect& i : stage_resource->effect)
|
||||
Glitter::glt_particle_manager->SetSceneName(i.name.hash_murmurhash, i.name.c_str());
|
||||
|
||||
size_t stage_effect_count = stage_resource->stage_effect.size();
|
||||
|
||||
for (int32_t i = 0; i < X_PV_GAME_STAGE_EFFECT_COUNT && i < stage_effect_count; i++) {
|
||||
@@ -6288,9 +6291,11 @@ bool x_pv_game::ctrl() {
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<uint32_t> object_set_ids;
|
||||
std::vector<uint32_t> pv_object_set_ids;
|
||||
std::vector<uint32_t> stage_object_set_ids;
|
||||
std::vector<Glitter::EffectGroup*> glitter_eff_groups;
|
||||
|
||||
auto add_auth_3d_object_set_id = [&](auth_3d* auth) {
|
||||
auto add_auth_3d_object_set_id = [&](auth_3d* auth, std::vector<uint32_t>& object_set_ids) {
|
||||
for (auth_3d_object& i : auth->object)
|
||||
object_set_ids.push_back(i.object_info.set_id);
|
||||
|
||||
@@ -6298,34 +6303,45 @@ bool x_pv_game::ctrl() {
|
||||
object_set_ids.push_back(i.object_info.set_id);
|
||||
};
|
||||
|
||||
auto add_glitter_object_set_id = [&](uint32_t eff_group_hash) {
|
||||
auto add_glitter_object_set_id = [&](uint32_t eff_group_hash, std::vector<uint32_t>& object_set_ids) {
|
||||
Glitter::EffectGroup* eff_group = Glitter::glt_particle_manager->GetEffectGroup(eff_group_hash);
|
||||
if (eff_group && eff_group->CheckModel())
|
||||
object_set_ids.insert(object_set_ids.end(),
|
||||
eff_group->object_set_ids.begin(), eff_group->object_set_ids.end());
|
||||
if (eff_group) {
|
||||
glitter_eff_groups.push_back(eff_group);
|
||||
|
||||
if (eff_group->CheckModel())
|
||||
object_set_ids.insert(object_set_ids.end(),
|
||||
eff_group->object_set_ids.begin(), eff_group->object_set_ids.end());
|
||||
}
|
||||
};
|
||||
|
||||
for (auth_3d*& i : chara_effect_auth_3ds)
|
||||
add_auth_3d_object_set_id(i);
|
||||
add_auth_3d_object_set_id(i, pv_object_set_ids);
|
||||
|
||||
for (auth_3d*& i : song_effect_auth_3ds)
|
||||
add_auth_3d_object_set_id(i);
|
||||
add_auth_3d_object_set_id(i, pv_object_set_ids);
|
||||
|
||||
for (auth_3d*& i : stage_data_effect_auth_3ds)
|
||||
add_auth_3d_object_set_id(i);
|
||||
add_auth_3d_object_set_id(i, stage_object_set_ids);
|
||||
|
||||
for (auth_3d*& i : stage_data_change_effect_auth_3ds)
|
||||
add_auth_3d_object_set_id(i);
|
||||
add_auth_3d_object_set_id(i, stage_object_set_ids);
|
||||
|
||||
for (string_hash& i : pv_data.effect.pv_glitter)
|
||||
add_glitter_object_set_id(i.hash_murmurhash);
|
||||
add_glitter_object_set_id(i.hash_murmurhash, pv_object_set_ids);
|
||||
|
||||
for (x_pv_game_song_effect& i : pv_data.effect.song_effect)
|
||||
for (x_pv_game_song_effect_glitter& j : i.glitter)
|
||||
add_glitter_object_set_id(j.name.hash_murmurhash);
|
||||
add_glitter_object_set_id(j.name.hash_murmurhash, pv_object_set_ids);
|
||||
|
||||
for (uint32_t& i : stage_data.stage_glitter)
|
||||
add_glitter_object_set_id(i);
|
||||
add_glitter_object_set_id(i, stage_object_set_ids);
|
||||
|
||||
prj::sort_unique(pv_object_set_ids);
|
||||
prj::sort_unique(stage_object_set_ids);
|
||||
|
||||
std::vector<uint32_t> object_set_ids;
|
||||
object_set_ids.insert(object_set_ids.end(), pv_object_set_ids.begin(), pv_object_set_ids.end());
|
||||
object_set_ids.insert(object_set_ids.end(), stage_object_set_ids.begin(), stage_object_set_ids.end());
|
||||
|
||||
prj::sort_unique(object_set_ids);
|
||||
|
||||
@@ -6388,24 +6404,41 @@ bool x_pv_game::ctrl() {
|
||||
objib[j].load(obj_data[j]);
|
||||
}
|
||||
|
||||
for (uint32_t& i : object_set_ids) {
|
||||
object_set_ids.clear();
|
||||
|
||||
for (uint32_t& i : pv_object_set_ids) {
|
||||
ObjsetInfo* info = object_storage_get_objset_info(i);
|
||||
if (!info)
|
||||
continue;
|
||||
|
||||
x_pv_game_update_object_set(info);
|
||||
x_pv_game_write_object_set(info);
|
||||
x_pv_game_write_object_set(info, &pv_data.obj_db, &pv_data.tex_db);
|
||||
}
|
||||
|
||||
for (uint32_t& i : stage_object_set_ids) {
|
||||
ObjsetInfo* info = object_storage_get_objset_info(i);
|
||||
if (!info)
|
||||
continue;
|
||||
|
||||
x_pv_game_update_object_set(info);
|
||||
x_pv_game_write_object_set(info, &stage_data.obj_db, &stage_data.tex_db);
|
||||
}
|
||||
|
||||
for (auto& i : chara_effect_auth_3ds)
|
||||
x_pv_game_write_auth_3d(i);
|
||||
|
||||
for (auto& i : song_effect_auth_3ds)
|
||||
x_pv_game_write_auth_3d(i);
|
||||
|
||||
for (auto& i : stage_data_effect_auth_3ds)
|
||||
x_pv_game_write_auth_3d(i);
|
||||
|
||||
for (auto& i : stage_data_change_effect_auth_3ds)
|
||||
x_pv_game_write_auth_3d(i);
|
||||
|
||||
for (auto& i : glitter_eff_groups)
|
||||
x_pv_game_write_glitter(i);
|
||||
|
||||
state_old = 19;
|
||||
} break;
|
||||
case 19: {
|
||||
@@ -6668,7 +6701,7 @@ bool x_pv_game::ctrl() {
|
||||
|
||||
a.ready = true;
|
||||
a.compressed = true;
|
||||
a.format = A3DA_FORMAT_AFT;
|
||||
a.format = A3DA_FORMAT_AFT_X_PACK;
|
||||
a.dof = {};
|
||||
a.dof.has_dof = true;
|
||||
|
||||
@@ -6680,6 +6713,8 @@ bool x_pv_game::ctrl() {
|
||||
std::ref(a.dof.model_transform.translation.z), std::ref(dof_cam_data.position_z));
|
||||
std::thread focus_range(a3da_key_rev,
|
||||
std::ref(a.dof.model_transform.scale.x), std::ref(dof_cam_data.focus_range));
|
||||
//std::thread focus(a3da_key_rev,
|
||||
// std::ref(a.dof.model_transform.scale.y), std::ref(dof_cam_data.focus));
|
||||
std::thread fuzzing_range(a3da_key_rev,
|
||||
std::ref(a.dof.model_transform.rotation.x), std::ref(dof_cam_data.fuzzing_range));
|
||||
std::thread ratio(a3da_key_rev,
|
||||
@@ -6688,6 +6723,7 @@ bool x_pv_game::ctrl() {
|
||||
SetThreadDescription((HANDLE)position_y.native_handle(), L"DoF A3DA Bake Thread: Position Y");
|
||||
SetThreadDescription((HANDLE)position_z.native_handle(), L"DoF A3DA Bake Thread: Position Z");
|
||||
SetThreadDescription((HANDLE)focus_range.native_handle(), L"DoF A3DA Bake Thread: Focus Range");
|
||||
//SetThreadDescription((HANDLE)focus.native_handle(), L"DoF A3DA Bake Thread: Focus");
|
||||
SetThreadDescription((HANDLE)fuzzing_range.native_handle(), L"DoF A3DA Bake Thread: Fuzzing Range");
|
||||
SetThreadDescription((HANDLE)ratio.native_handle(), L"DoF A3DA Bake Thread: Ratio");
|
||||
|
||||
@@ -6702,6 +6738,9 @@ bool x_pv_game::ctrl() {
|
||||
|
||||
if (focus_range.joinable())
|
||||
focus_range.join();
|
||||
|
||||
//if (focus.joinable())
|
||||
// focus.join();
|
||||
|
||||
if (fuzzing_range.joinable())
|
||||
fuzzing_range.join();
|
||||
@@ -8404,21 +8443,25 @@ static void x_pv_game_write_auth_3d(auth_3d* auth) {
|
||||
|
||||
char* ext = 0;
|
||||
char* temp = name;
|
||||
while (temp)
|
||||
if (temp = strstr(temp, a3da_ext))
|
||||
ext = temp++;
|
||||
while (temp = strstr(temp, a3da_ext))
|
||||
ext = temp++;
|
||||
|
||||
if (!ext) {
|
||||
strcat_s(name, sizeof(name), a3da_ext);
|
||||
ext = strstr(name, a3da_ext);
|
||||
}
|
||||
|
||||
replace_stgpv(name);
|
||||
|
||||
for (char* i = name; *i && i != ext; i++) {
|
||||
char c = *i;
|
||||
if (c >= 'A' && c <= 'Z')
|
||||
*i += 0x20;
|
||||
}
|
||||
|
||||
if (strstr(name, "effchrpv826"))
|
||||
return;
|
||||
|
||||
char buf[0x200];
|
||||
file_stream s;
|
||||
|
||||
@@ -8432,13 +8475,47 @@ static void x_pv_game_write_auth_3d(auth_3d* auth) {
|
||||
}
|
||||
|
||||
a3da a;
|
||||
float_t max_frame = auth->max_frame;
|
||||
auth->max_frame = auth->play_control.size;
|
||||
auth->store(&a);
|
||||
auth->max_frame = max_frame;
|
||||
a._converter_version.assign("20111019");
|
||||
a._file_name.assign(name);
|
||||
a._property_version.assign("20110526");
|
||||
a.ready = true;
|
||||
a.compressed = true;
|
||||
a.format = A3DA_FORMAT_AFT;
|
||||
a.format = A3DA_FORMAT_AFT_X_PACK;
|
||||
|
||||
for (a3da_m_object_hrc& i : a.m_object_hrc) {
|
||||
for (a3da_object_instance& j : i.instance) {
|
||||
replace_stgpv(j.name);
|
||||
replace_stgpv(j.uid_name);
|
||||
}
|
||||
|
||||
replace_stgpv(i.name);
|
||||
}
|
||||
|
||||
for (std::string& i : a.m_object_hrc_list)
|
||||
replace_stgpv(i);
|
||||
|
||||
for (a3da_object& i : a.object) {
|
||||
replace_stgpv(i.name);
|
||||
replace_stgpv(i.parent_name);
|
||||
replace_stgpv(i.uid_name);
|
||||
}
|
||||
|
||||
for (a3da_object_hrc& i : a.object_hrc) {
|
||||
replace_stgpv(i.name);
|
||||
replace_stgpv(i.parent_name);
|
||||
replace_stgpv(i.uid_name);
|
||||
}
|
||||
|
||||
for (std::string& i : a.object_hrc_list)
|
||||
replace_stgpv(i);
|
||||
|
||||
|
||||
for (std::string& i : a.object_list)
|
||||
replace_stgpv(i);
|
||||
|
||||
void* a3da_data = 0;
|
||||
size_t a3da_length = 0;
|
||||
@@ -8451,9 +8528,36 @@ static void x_pv_game_write_auth_3d(auth_3d* auth) {
|
||||
free_def(a3da_data);
|
||||
}
|
||||
|
||||
static void x_pv_game_write_object_set(ObjsetInfo* info) {
|
||||
obj_set* set = info->obj_set;
|
||||
static void x_pv_game_write_glitter(Glitter::EffectGroup* eff_group) {
|
||||
char name[0x200];
|
||||
strcpy_s(name, sizeof(name), eff_group->name.c_str());
|
||||
|
||||
replace_stgpv(name);
|
||||
|
||||
data_struct* x_data = &data_list[DATA_X];
|
||||
auto& hashes = x_data->glitter_list_murmurhash;
|
||||
for (Glitter::Effect*& i : eff_group->effects) {
|
||||
if (!i)
|
||||
continue;
|
||||
|
||||
Glitter::Effect* e = i;
|
||||
e->name.clear();
|
||||
if (e->data.name_hash == hash_murmurhash_empty)
|
||||
continue;
|
||||
|
||||
auto elem = hashes.find(e->data.name_hash);
|
||||
if (elem != hashes.end()) {
|
||||
e->name.assign(elem->second);
|
||||
replace_stgpv(e->name);
|
||||
}
|
||||
else
|
||||
printf_debug("Couldn't find name for hash 0x%08X\n", e->data.name_hash);
|
||||
}
|
||||
|
||||
Glitter::FileWriter::Write(Glitter::X, eff_group, "patch\\!temp\\particle\\", name, true, true);
|
||||
}
|
||||
|
||||
static void x_pv_game_write_object_set(ObjsetInfo* info, object_database* obj_db, texture_database* tex_db) {
|
||||
char name[0x200];
|
||||
strcpy_s(name, sizeof(name), info->name.c_str());
|
||||
|
||||
@@ -8463,79 +8567,115 @@ static void x_pv_game_write_object_set(ObjsetInfo* info) {
|
||||
name[j] += 0x20;
|
||||
}
|
||||
|
||||
char buf[0x200];
|
||||
file_stream s;
|
||||
replace_stgpv(name);
|
||||
|
||||
strcpy_s(buf, sizeof(buf), "patch\\!temp\\objset\\");
|
||||
strcat_s(buf, sizeof(buf), name);
|
||||
strcat_s(buf, sizeof(buf), "_obj.bin");
|
||||
if (strstr(name, "effchrpv826"))
|
||||
return;
|
||||
|
||||
uint32_t obj_num = set->obj_num;
|
||||
for (uint32_t j = 0; j < obj_num; j++) {
|
||||
obj* obj = set->obj_data[j];
|
||||
{
|
||||
data_struct* aft_data = &data_list[DATA_AFT];
|
||||
object_database* aft_obj_db = &aft_data->data_ft.obj_db;
|
||||
texture_database* aft_tex_db = &aft_data->data_ft.tex_db;
|
||||
|
||||
uint32_t num_material = obj->num_material;
|
||||
for (uint32_t k = 0; k < num_material; k++) {
|
||||
obj_material& material = obj->material_array[k].material;
|
||||
char buf[0x200];
|
||||
strcpy_s(buf, sizeof(buf), "patch\\!temp\\objset\\");
|
||||
strcat_s(buf, sizeof(buf), name);
|
||||
strcat_s(buf, sizeof(buf), "_obj.bin");
|
||||
|
||||
if (*(int32_t*)&material.shader.name[4] == 0xDEADFF) {
|
||||
*(int32_t*)&material.shader.name[4] = 0;
|
||||
const char* shader_name = shaders_ft.get_name_by_index(material.shader.index);
|
||||
strcpy_s(material.shader.name, sizeof(material.shader.name), shader_name);
|
||||
prj::shared_ptr<prj::stack_allocator> alloc(new prj::stack_allocator);
|
||||
obj_set* set = alloc->allocate<obj_set>();
|
||||
set->move_data(info->obj_set, alloc);
|
||||
|
||||
uint32_t obj_num = set->obj_num;
|
||||
for (uint32_t i = 0; i < obj_num; i++) {
|
||||
obj* obj = set->obj_data[i];
|
||||
|
||||
replace_stgpv((char*)obj->name);
|
||||
obj->id = aft_obj_db->get_object_info(obj->name).id;
|
||||
|
||||
uint32_t num_material = obj->num_material;
|
||||
for (uint32_t j = 0; j < num_material; j++) {
|
||||
obj_material& material = obj->material_array[j].material;
|
||||
|
||||
for (obj_material_texture_data& k : material.texdata) {
|
||||
k.texture_index = 0;
|
||||
if (k.tex_index == -1)
|
||||
continue;
|
||||
|
||||
const char* tex_name = tex_db->get_texture_name(k.tex_index);
|
||||
if (tex_name) {
|
||||
char name_buf[0x200];
|
||||
strcpy_s(name_buf, sizeof(name_buf), tex_name);
|
||||
replace_stgpv(name_buf);
|
||||
k.tex_index = aft_tex_db->get_texture_id(name_buf);
|
||||
}
|
||||
else
|
||||
k.tex_index = -1;
|
||||
|
||||
}
|
||||
|
||||
if (*(int32_t*)&material.shader.name[4] == 0xDEADFF) {
|
||||
*(int32_t*)&material.shader.name[4] = 0;
|
||||
const char* shader_name = shaders_ft.get_name_by_index(material.shader.index);
|
||||
strcpy_s(material.shader.name, sizeof(material.shader.name), shader_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool modern = set->modern;
|
||||
set->modern = false;
|
||||
uint32_t tex_id_num = set->tex_id_num;
|
||||
for (uint32_t i = 0; i < tex_id_num; i++) {
|
||||
uint32_t& id = set->tex_id_data[i];
|
||||
const char* tex_name = tex_db->get_texture_name(id);
|
||||
if (tex_name) {
|
||||
char name_buf[0x200];
|
||||
strcpy_s(name_buf, sizeof(name_buf), tex_name);
|
||||
replace_stgpv(name_buf);
|
||||
|
||||
void* obj_data = 0;
|
||||
size_t obj_length = 0;
|
||||
set->pack_file(&obj_data, &obj_length);
|
||||
|
||||
set->modern = modern;
|
||||
|
||||
for (uint32_t j = 0; j < obj_num; j++) {
|
||||
obj* obj = set->obj_data[j];
|
||||
|
||||
uint32_t num_material = obj->num_material;
|
||||
for (uint32_t k = 0; k < num_material; k++) {
|
||||
obj_material& material = obj->material_array[k].material;
|
||||
|
||||
if (*(int32_t*)&material.shader.name[4] != 0xDEADFF) {
|
||||
material.shader.index = shaders_ft.get_index_by_name(material.shader.name);
|
||||
*(int32_t*)&material.shader.name[4] = 0xDEADFF;
|
||||
id = aft_tex_db->get_texture_id(name_buf);
|
||||
}
|
||||
else
|
||||
id = -1;
|
||||
}
|
||||
|
||||
set->modern = false;
|
||||
|
||||
void* obj_data = 0;
|
||||
size_t obj_length = 0;
|
||||
set->pack_file(&obj_data, &obj_length);
|
||||
|
||||
file_stream s;
|
||||
s.open(buf, "wb");
|
||||
s.write(obj_data, obj_length);
|
||||
s.close();
|
||||
|
||||
free_def(obj_data);
|
||||
}
|
||||
|
||||
s.open(buf, "wb");
|
||||
s.write(obj_data, obj_length);
|
||||
s.close();
|
||||
{
|
||||
char buf[0x200];
|
||||
strcpy_s(buf, sizeof(buf), "patch\\!temp\\objset\\");
|
||||
strcat_s(buf, sizeof(buf), name);
|
||||
strcat_s(buf, sizeof(buf), "_tex.bin");
|
||||
|
||||
free_def(obj_data);
|
||||
uint32_t tex_num = info->tex_num;
|
||||
texture** tex_data = info->tex_data;
|
||||
|
||||
strcpy_s(buf, sizeof(buf), "patch\\!temp\\objset\\");
|
||||
strcat_s(buf, sizeof(buf), name);
|
||||
strcat_s(buf, sizeof(buf), "_tex.bin");
|
||||
txp_set txp;
|
||||
txp.textures.resize(tex_num);
|
||||
for (uint32_t j = 0; j < tex_num; j++)
|
||||
texture_txp_store(tex_data[j], &txp.textures[j]);
|
||||
|
||||
uint32_t tex_num = info->tex_num;
|
||||
texture** tex_data = info->tex_data;
|
||||
void* txp_data = 0;
|
||||
size_t txp_length = 0;
|
||||
txp.pack_file(&txp_data, &txp_length, false);
|
||||
|
||||
txp_set txp;
|
||||
txp.textures.resize(tex_num);
|
||||
for (uint32_t j = 0; j < tex_num; j++)
|
||||
texture_txp_store(tex_data[j], &txp.textures[j]);
|
||||
file_stream s;
|
||||
s.open(buf, "wb");
|
||||
s.write(txp_data, txp_length);
|
||||
s.close();
|
||||
|
||||
void* txp_data = 0;
|
||||
size_t txp_length = 0;
|
||||
txp.pack_file(&txp_data, &txp_length, false);
|
||||
|
||||
s.open(buf, "wb");
|
||||
s.write(txp_data, txp_length);
|
||||
s.close();
|
||||
|
||||
free_def(txp_data);
|
||||
free_def(txp_data);
|
||||
}
|
||||
}
|
||||
|
||||
static void print_dsc_command(dsc& dsc, dsc_data* dsc_data_ptr, int64_t time) {
|
||||
@@ -8600,4 +8740,33 @@ static void replace_pv832(char* str) {
|
||||
inline static void replace_pv832(std::string& str) {
|
||||
replace_pv832((char*)str.data());
|
||||
}
|
||||
|
||||
static void replace_stgpv(char* str) {
|
||||
char* stgpv;
|
||||
stgpv = str;
|
||||
while (true) {
|
||||
stgpv = strstr(stgpv, "STGPV0");
|
||||
if (!stgpv)
|
||||
break;
|
||||
|
||||
stgpv[5] = '8';
|
||||
stgpv += 6;
|
||||
}
|
||||
|
||||
stgpv = str;
|
||||
while (true) {
|
||||
stgpv = strstr(stgpv, "stgpv0");
|
||||
if (!stgpv)
|
||||
break;
|
||||
|
||||
stgpv[5] = '8';
|
||||
stgpv += 6;
|
||||
}
|
||||
|
||||
replace_pv832(str);
|
||||
}
|
||||
|
||||
inline static void replace_stgpv(std::string& str) {
|
||||
replace_stgpv((char*)str.data());
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user