Added some missing code for Liar Betty PV

This commit is contained in:
korenkonder
2024-06-16 23:49:06 +03:00
parent b3d225f929
commit 885da8ff9e
10 changed files with 123 additions and 58 deletions
+1 -1
View File
@@ -3151,7 +3151,7 @@ void EffectRipple::draw() {
glClear(GL_DEPTH_BUFFER_BIT);
if (rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_USER)) {
gl_state_active_bind_texture_2d(7, rt[counter % 3]->GetColorTex());
rctx->disp_manager->draw(mdl::OBJ_TYPE_USER, 0, true);
rctx->disp_manager->draw(mdl::OBJ_TYPE_USER);
gl_state_active_bind_texture_2d(7, 0);
}
+70 -3
View File
@@ -32,6 +32,8 @@ static const GLuint BONE_INDEX_INDEX = 15;
static void object_data_get_vertex_attrib_buffer_bindings(const mdl::ObjSubMeshArgs* args,
int32_t texcoord_array[2], GLuint vertex_attrib_buffer_binding[16]);
static void sub_140436760();
material_list_struct::material_list_struct() : blend_color(), has_blend_color(), emission(), has_emission() {
hash = (uint32_t)-1;
}
@@ -1994,7 +1996,7 @@ namespace mdl {
i.reset_vertex_attrib();
}
void DispManager::draw(ObjType type, int32_t depth_mask, bool a4) {
void DispManager::draw(ObjType type, int32_t depth_mask, bool reflect_texture_mask) {
if (type < 0 || type >= mdl::OBJ_TYPE_MAX || get_obj_count(type) < 1)
return;
@@ -2082,7 +2084,7 @@ namespace mdl {
break;
case OBJ_TYPE_REFLECT_OPAQUE:
alpha_test = 1;
if (!a4)
if (!reflect_texture_mask)
func = draw_sub_mesh_reflect_reflect_map;
break;
case OBJ_TYPE_REFLECT_TRANSLUCENT:
@@ -3108,11 +3110,14 @@ namespace mdl {
return wet_param;
}
void DispManager::obj_sort(const mat4* view, ObjType type, int32_t compare_func) {
void DispManager::obj_sort(const mat4* view, ObjType type, int32_t compare_func, bool a3) {
std::list<ObjData*>& list = obj[type];
if (list.size() < 1)
return;
if (a3 && type == mdl::OBJ_TYPE_TRANSLUCENT)
sub_140436760();
calc_obj_radius(view, type);
switch (compare_func) {
@@ -3296,3 +3301,65 @@ static void object_data_get_vertex_attrib_buffer_bindings(const mdl::ObjSubMeshA
vertex_attrib_buffer_binding[MORPH_COLOR_INDEX] = morph_vertex_buffer;
}
}
static void sub_140436760() {
camera* cam = rctx_ptr->camera;
mat4* view = &cam->view;
for (auto& i : rctx_ptr->disp_manager->obj[mdl::OBJ_TYPE_TRANSLUCENT]) {
if (i->kind != mdl::OBJ_KIND_NORMAL)
continue;
const obj_mesh* mesh = i->args.sub_mesh.mesh;
if (!mesh)
continue;
const obj_sub_mesh* sub_mesh = i->args.sub_mesh.sub_mesh;
const obj_axis_aligned_bounding_box* aabb = &sub_mesh->axis_aligned_bounding_box;
if (mesh->attrib.m.billboard_y_axis && aabb->size.y > 1.0f && aabb->size.y < 1.2f) {
if (!strcmp(mesh->name, "STGD2NS064_EFF_WATESMOKE_A_BMZ_000"))
i->view_z += sub_mesh->bounding_sphere.radius;
continue;
}
if (i->args.sub_mesh.material->material.attrib.m.src_blend_factor == OBJ_MATERIAL_BLEND_ZERO
&& i->args.sub_mesh.material->material.attrib.m.dst_blend_factor == OBJ_MATERIAL_BLEND_ONE
&& aabb->size.y > 2.0f && aabb->size.y < 2.5f) {
if (strcmp(mesh->name, "STGD2NS064_EFF_DISPLAY_MZ_000") && strcmp(mesh->name, "STGD2NS064_EFF_RAY_B_MZ_000"))
continue;
}
else if (aabb->size.y > 3.0f && aabb->size.x > 3.6f && aabb->size.x < 3.7f) {
if (strcmp(mesh->name, "STGD2NS064_EFF_WATERFALL_A_MZ_000"))
continue;
}
else
continue;
mat4 mat;
mat4_mul_translate(&i->mat, &aabb->center, &mat);
mat4_mul(&mat, view, &mat);
mat4_transpose(&mat, &mat);
vec4 t;
*(vec3*)&t = aabb->size;
t.w = 1.0f;
float_t view_z = vec4::dot(t ^ vec4( 0.0f, 0.0f, 0.0f, 0.0f ), mat.row2);
if (view_z < vec4::dot(t ^ vec4( 0.0f, 0.0f, -0.0f, 0.0f ), mat.row2))
view_z = vec4::dot(t ^ vec4( 0.0f, 0.0f, -0.0f, 0.0f ), mat.row2);
if (view_z < vec4::dot(t ^ vec4( 0.0f, -0.0f, 0.0f, 0.0f ), mat.row2))
view_z = -t.y;
if (view_z < vec4::dot(t ^ vec4( 0.0f, -0.0f, -0.0f, 0.0f ), mat.row2))
view_z = vec4::dot(t ^ vec4( 0.0f, -0.0f, -0.0f, 0.0f ), mat.row2);
if (view_z < vec4::dot(t ^ vec4( -0.0f, 0.0f, 0.0f, 0.0f ), mat.row2))
view_z = -t.x;
if (view_z < vec4::dot(t ^ vec4( -0.0f, 0.0f, -0.0f, 0.0f ), mat.row2))
view_z = vec4::dot(t ^ vec4( -0.0f, 0.0f, -0.0f, 0.0f ), mat.row2);
if (view_z < vec4::dot(t ^ vec4( -0.0f, -0.0f, 0.0f, 0.0f ), mat.row2))
view_z = vec4::dot(t ^ vec4( -0.0f, -0.0f, 0.0f, 0.0f ), mat.row2);
if (view_z < vec4::dot(t ^ vec4( -0.0f, -0.0f, -0.0f, 0.0f ), mat.row2))
view_z = vec4::dot(t ^ vec4( -0.0f, -0.0f, -0.0f, 0.0f ), mat.row2);
i->view_z = view_z;
}
}
+2 -2
View File
@@ -448,7 +448,7 @@ namespace mdl {
void check_index_buffer(GLuint buffer);
void check_vertex_arrays();
void check_vertex_buffer(GLuint buffer);
void draw(mdl::ObjType type, int32_t depth_mask = 0, bool a4 = true);
void draw(mdl::ObjType type, int32_t depth_mask = 0, bool reflect_texture_mask = true);
void draw_translucent(mdl::ObjType type, int32_t alpha);
/*void draw_show_vector(mdl::ObjType type, int32_t show_vector);*/
void entry_list(ObjType type, ObjData* data);
@@ -498,7 +498,7 @@ namespace mdl {
void get_texture_specular_offset(vec4& value);
void get_texture_transform(int32_t& count, texture_transform_struct*& value);
float_t get_wet_param();
void obj_sort(const mat4* view, ObjType type, int32_t compare_func);
void obj_sort(const mat4* view, ObjType type, int32_t compare_func, bool a3 = false);
void refresh();
void set_chara_color(bool value = false);
void set_culling_finc(bool(*func)(const obj_bounding_sphere*, const mat4*) = 0);
+21 -23
View File
@@ -86,9 +86,9 @@ namespace rndr {
RenderManager::RenderManager() : pass_sw(), reflect_blur_num(), reflect_blur_filter(),
render(), sync_gpu(), cpu_time(), gpu_time(), draw_pass_3d(), field_11E(), field_11F(),
field_120(), show_ref_map(), reflect_type(), clear(), tex_index(), width(), height(),
multisample_framebuffer(), multisample_renderbuffer(), multisample(), check_state(),
show_vector_flags(), show_vector_length(), show_vector_z_offset(), show_stage_shadow(),
effect_texture(), npr_param(), field_31C(), field_31D(), field_31E(), field_31F(), field_320(), npr() {
multisample_framebuffer(), multisample_renderbuffer(), multisample(), check_state(), show_vector_flags(),
show_vector_length(), show_vector_z_offset(), show_stage_shadow(), effect_texture(), npr_param(),
field_31C(), reflect_texture_mask(), reflect_tone_curve(), field_31F(), light_stage_ambient(), npr() {
for (bool& i : pass_sw)
i = true;
@@ -165,10 +165,10 @@ namespace rndr {
refract = false;
npr_param = 0;
field_31C = false;
field_31D = false;
field_31E = false;
reflect_texture_mask = false;
reflect_tone_curve = false;
field_31F = false;
field_320 = false;
light_stage_ambient = false;
for (bool& i : draw_pass_3d)
i = true;
@@ -595,7 +595,7 @@ namespace rndr {
gl_state_enable_depth_test();
gl_state_set_depth_func(GL_LEQUAL);
gl_state_set_depth_mask(GL_TRUE);
rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_OPAQUE, 0, field_31D);
rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_OPAQUE, 0, reflect_texture_mask);
if (reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) {
gl_state_enable_blend();
gl_state_set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -605,7 +605,7 @@ namespace rndr {
}
if (reflect_type == STAGE_DATA_REFLECT_REFLECT_MAP) {
uniform_value[U_REFLECT] = field_31E;
uniform_value[U_REFLECT] = reflect_tone_curve ? 1 : 0;
uniform_value[U_CLIP_PLANE] = clip_plane.data[0];
rctx->disp_manager->draw(mdl::OBJ_TYPE_REFLECT_CHARA_OPAQUE);
}
@@ -811,15 +811,21 @@ namespace rndr {
gl_state_bind_sampler(15, rctx->render_samplers[0]);
gl_state_bind_sampler(16, rctx->render_samplers[0]);
uniform_value[U12] = field_320 ? 1 : 0;
uniform_value[U_STAGE_AMBIENT] = light_stage_ambient ? 1 : 0;
if (alpha_z_sort) {
rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT, 1);
rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, 2);
rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1, 1);
rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2, 1);
rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3, 1);
rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL, 1);
rctx->disp_manager->obj_sort(&rctx->view_mat,
mdl::OBJ_TYPE_TRANSLUCENT, 1, field_31F);
rctx->disp_manager->obj_sort(&rctx->view_mat,
mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, 2);
rctx->disp_manager->obj_sort(&rctx->view_mat,
mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_1, 1, field_31F);
rctx->disp_manager->obj_sort(&rctx->view_mat,
mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2, 1, field_31F);
rctx->disp_manager->obj_sort(&rctx->view_mat,
mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_3, 1, field_31F);
rctx->disp_manager->obj_sort(&rctx->view_mat,
mdl::OBJ_TYPE_TRANSLUCENT_ALPHA_ORDER_2_LOCAL, 1, field_31F);
}
if (opaque_z_sort)
@@ -969,14 +975,6 @@ namespace rndr {
rctx->obj_scene_ubo.WriteMemory(rctx->obj_scene);
if (alpha_z_sort) {
rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT, 1);
rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS, 2);
}
if (opaque_z_sort)
rctx->disp_manager->obj_sort(&rctx->view_mat, mdl::OBJ_TYPE_OPAQUE, 0);
//shaders_ft.env_vert_set(20, show_vector_length, show_vector_z_offset, 0.0f, 0.0f);
for (int32_t i = 1; i < 4; i++) {
if (!(show_vector_flags & (1 << (i - 1))))
+3 -3
View File
@@ -81,10 +81,10 @@ namespace rndr {
texture* effect_texture;
int32_t npr_param;
bool field_31C;
bool field_31D;
bool field_31E;
bool reflect_texture_mask;
bool reflect_tone_curve;
bool field_31F;
bool field_320;
bool light_stage_ambient;
bool npr;
RenderManager();
+1 -1
View File
@@ -2087,7 +2087,7 @@ static const std::pair<uniform_name, bool> STAGE_uniform[] = {
{ U_NORMAL , false },
{ U_FOG_HEIGHT , false },
{ U_LIGHT_1 , false },
{ U12 , false },
{ U_STAGE_AMBIENT, false },
{ U_ALPHA_TEST , true }, // 11th added
};
+14 -14
View File
@@ -576,10 +576,10 @@ static void stage_free(stage* s) {
render_manager->set_shadow_true();
rctx_ptr->render.set_cam_blur(0);
npr_cloth_spec_color.w = 1.0f;
render_manager->field_31D = false;
render_manager->field_31E = false;
render_manager->reflect_texture_mask = false;
render_manager->reflect_tone_curve = false;
render_manager->field_31F = false;
render_manager->field_320 = false;
render_manager->light_stage_ambient = false;
light_chara_ambient = false;
if (s->auth_3d_loaded) {
@@ -664,10 +664,10 @@ static void stage_set(stage* s, stage* other) {
render_manager->set_reflect(false);
render_manager->set_pass_sw(rndr::RND_PASSID_REFRACT, false);
render_manager->set_refract(true);
render_manager->field_31D = false;
render_manager->field_31E = false;
render_manager->reflect_texture_mask = false;
render_manager->reflect_tone_curve = false;
render_manager->field_31F = false;
render_manager->field_320 = false;
render_manager->light_stage_ambient = false;
render_manager->set_shadow_true();
rctx_ptr->render.set_cam_blur(0);
npr_cloth_spec_color.w = 1.0f;
@@ -698,16 +698,16 @@ static void stage_set(stage* s, stage* other) {
render_manager->set_refract(true);
}
if (other->stage_data->flags & STAGE_DATA_FLAG_1)
render_manager->field_31D = true;
if (other->stage_data->flags & STAGE_DATA_FLAG_4)
render_manager->field_31E = true;
if (other->stage_data->flags & STAGE_DATA_FLAG_8)
render_manager->field_320 = true;
if (other->stage_data->flags & STAGE_DATA_REFLECT_TEXTURE_MASK)
render_manager->reflect_texture_mask = true;
if (other->stage_data->flags & STAGE_DATA_REFLECT_TONE_CURVE)
render_manager->reflect_tone_curve = true;
if (other->stage_data->flags & STAGE_DATA_LIGHT_STAGE_AMBIENT)
render_manager->light_stage_ambient = true;
if (other->stage_data->flags & STAGE_DATA_LIGHT_CHARA_AMBIENT)
light_chara_ambient = true;
//if (stru_14CC92630.pv_id == 421)
//render_manager->field_31F = true;
//if (stage_param_data_coli_data.pv_id == 421)
// render_manager->field_31F = true;
//sub_14064DC10();
effect_manager_set_current_stage_index(other->index);
}
+6 -6
View File
@@ -574,10 +574,10 @@ static void stage_modern_free(stage_modern* s) {
render_manager->set_shadow_true();
rctx_ptr->render.set_cam_blur(0);
npr_cloth_spec_color.w = 1.0f;
render_manager->field_31D = false;
render_manager->field_31E = false;
render_manager->reflect_texture_mask = false;
render_manager->reflect_tone_curve = false;
render_manager->field_31F = false;
render_manager->field_320 = false;
render_manager->light_stage_ambient = false;
light_chara_ambient = false;
if (s->auth_3d_loaded) {
@@ -655,10 +655,10 @@ static void stage_modern_set(stage_modern* s, stage_modern* other) {
render_manager->set_reflect(false);
render_manager->set_pass_sw(rndr::RND_PASSID_REFRACT, false);
render_manager->set_refract(true);
render_manager->field_31D = false;
render_manager->field_31E = false;
render_manager->reflect_texture_mask = false;
render_manager->reflect_tone_curve = false;
render_manager->field_31F = false;
render_manager->field_320 = false;
render_manager->light_stage_ambient = false;
render_manager->set_shadow_true();
rctx_ptr->render.set_cam_blur(0);
npr_cloth_spec_color.w = 1.0f;
+1 -1
View File
@@ -46,7 +46,7 @@ enum uniform_name {
U_EXPOSURE,
U_SCENE_FADE,
U_FADE,
U12,
U_STAGE_AMBIENT,
U_FLARE,
U_FOG_HEIGHT,
U_FOG,
+4 -4
View File
@@ -19,10 +19,10 @@ enum stage_data_format {
};
enum stage_data_flags {
STAGE_DATA_FLAG_1 = 0x01,
STAGE_DATA_LIGHT_CHARA_AMBIENT = 0x02,
STAGE_DATA_FLAG_4 = 0x04,
STAGE_DATA_FLAG_8 = 0x08,
STAGE_DATA_REFLECT_TEXTURE_MASK = 0x01,
STAGE_DATA_LIGHT_CHARA_AMBIENT = 0x02,
STAGE_DATA_REFLECT_TONE_CURVE = 0x04,
STAGE_DATA_LIGHT_STAGE_AMBIENT = 0x08,
};
enum stage_data_reflect_resolution_mode {