Refactor of Shadow struct

This commit is contained in:
korenkonder
2023-09-13 12:53:53 +03:00
parent 6fb094093a
commit 298ebedef2
9 changed files with 119 additions and 93 deletions
+2 -2
View File
@@ -4470,7 +4470,7 @@ static void auth_3d_m_object_hrc_disp(auth_3d_m_object_hrc* moh, auth_3d* auth,
disp_manager.set_obj_flags(flags);
disp_manager.set_shadow_type(shadow_type);
shadow* shad = rctx->render_manager.shadow_ptr;
Shadow* shad = rctx->render_manager.shadow_ptr;
if (shad && flags & mdl::OBJ_SHADOW) {
disp_manager.set_shadow_type(SHADOW_STAGE);
@@ -6330,7 +6330,7 @@ static void auth_3d_object_hrc_disp(auth_3d_object_hrc* oh, auth_3d* auth, rende
break;
}
shadow* shad = rctx->render_manager.shadow_ptr;
Shadow* shad = rctx->render_manager.shadow_ptr;
if (shad) {
vec3 pos = *(vec3*)&m->row3;
pos.y -= 0.2f;
+59 -43
View File
@@ -3092,9 +3092,9 @@ namespace rndr {
for (bool& i : draw_pass_3d)
i = true;
shadow_ptr = new ::shadow;
shadow_ptr = new Shadow;
if (shadow_ptr)
shadow_ptr->init_data();
shadow_ptr->InitData();
for (int32_t i = 0; i < 9; i++) {
const struc_189* v2 = &stru_140A24420[i];
@@ -3565,7 +3565,7 @@ void render_context::disp() {
draw_state.stats_prev = draw_state.stats;
draw_state.stats.reset();
app::TaskWork::Disp();
render_manager.shadow_ptr->ctrl(this);
render_manager.shadow_ptr->Ctrl(this);
int32_t sprite_index = sprite_manager_get_index();
//sprite_manager_set_index(3);
sprite_manager_set_index(0);
@@ -3780,47 +3780,18 @@ void render_context::light_param_data_face_set(light_param_face* face) {
this->face.set_direction(face->direction);
}
shadow::shadow() : field_8(), field_158(), view_point(), interest(),
field_1A8(), view_point_shared(), interest_shared(), field_2F0() {
view_region = 1.2f;
range = 1.0f;
for (int32_t i = 0; i < 2; i++) {
view_point[i] = 1.0f;
field_1C0[i] = 0.0f;
field_1C8[i] = 0.0f;
field_200[i] = i;
}
view_mat[0] = mat4_identity;
view_mat[1] = mat4_identity;
blur_filter = BLUR_FILTER_9;
near_blur = 1;
field_2BC = 2;
far_blur = 1;
distance = 4.0f;
field_2C4 = 0.4f;
z_near = 0.1f;
z_far = 20.0f;
field_2D0 = 1.4f;
field_2D4 = 10000.0f;
field_2D8 = 80.0f;
field_2DC = 2.0f;
field_2E0 = 0.05f;
ambient = 0.4f;
field_2EC = 0;
direction = vec3(0.0f, -1.0f, -1.0f) * (1.0f / sqrtf(2.0f));
field_2E8 = false;
self_shadow = true;
blur_filter_enable[0] = true;
blur_filter_enable[1] = true;
field_2F5 = false;
field_208 = (z_far - z_near) * 0.5f;
Shadow::Shadow() : curr_render_textures(), view_region(), range(), field_1C0(), field_1C8(),
field_200(), field_208(), near_blur(), blur_filter(), far_blur(), field_2BC(), distance(),
field_2C4(), z_near(), z_far(), field_2D0(), field_2D4(), field_2D8(), field_2DC(), field_2E0(),
ambient(), field_2E8(), field_2EC(), field_2F0(), self_shadow(), blur_filter_enable(), field_2F5() {
ResetData();
}
shadow::~shadow() {
Shadow::~Shadow() {
Reset();
}
void shadow::ctrl(render_context* rctx) {
void Shadow::Ctrl(render_context* rctx) {
for (int32_t i = 0; i < 2; i++)
field_2F0[i] = false;
@@ -4065,7 +4036,7 @@ void shadow::ctrl(render_context* rctx) {
i.clear();
}
int32_t shadow::init_data() {
int32_t Shadow::InitData() {
struct shadow_texture_init_params {
int32_t width;
int32_t height;
@@ -4085,12 +4056,12 @@ int32_t shadow::init_data() {
shadow_texture_init_params* v3 = init_params;
for (int32_t i = 0; i < 8; i++, v3++)
if (field_8[i].init(v3->width, v3->height,
if (render_textures[i].init(v3->width, v3->height,
v3->max_level, v3->color_format, v3->depth_format) < 0)
return -1;
for (int32_t i = 0; i < 4; i++) {
gl_state_bind_texture_2d(field_8[i == 3 ? 7 : i].color_texture->tex);
gl_state_bind_texture_2d(render_textures[i == 3 ? 7 : i].color_texture->tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
static const vec4 border_color = 1.0f;
@@ -4101,6 +4072,51 @@ int32_t shadow::init_data() {
return 0;
}
void Shadow::Reset() {
for (render_texture& i : render_textures)
i.free();
ResetData();
}
void Shadow::ResetData() {
view_region = 1.2f;
range = 1.0f;
for (int32_t i = 0; i < 2; i++) {
view_point[i] = 1.0f;
field_1C0[i] = 0.0f;
field_1C8[i] = 0.0f;
field_200[i] = i;
}
for (render_texture*& i : curr_render_textures)
i = 0;
view_mat[0] = mat4_identity;
view_mat[1] = mat4_identity;
blur_filter = BLUR_FILTER_9;
near_blur = 1;
field_2BC = 2;
far_blur = 1;
distance = 4.0f;
field_2C4 = 0.4f;
z_near = 0.1f;
z_far = 20.0f;
field_2D0 = 1.4f;
field_2D4 = 10000.0f;
field_2D8 = 80.0f;
field_2DC = 2.0f;
field_2E0 = 0.05f;
ambient = 0.4f;
field_2EC = 0;
direction = vec3(0.0f, -1.0f, -1.0f) * (1.0f / sqrtf(2.0f));
field_2E8 = false;
self_shadow = true;
field_2F5 = false;
field_208 = (z_far - z_near) * 0.5f;
}
static void object_data_get_vertex_attrib_buffer_bindings(const mdl::ObjSubMeshArgs* args,
int32_t texcoord_array[2], GLuint vertex_attrib_buffer_binding[16]) {
const obj_mesh* mesh = args->mesh;
+11 -9
View File
@@ -169,7 +169,7 @@ namespace rndr {
}
struct render_context;
struct shadow;
struct Shadow;
struct draw_state_stats {
int32_t object_draw_count;
@@ -625,7 +625,7 @@ namespace mdl {
namespace rndr {
struct RenderManager {
bool pass_sw[rndr::RND_PASSID_NUM];
shadow* shadow_ptr;
Shadow* shadow_ptr;
bool reflect;
bool refract;
int32_t reflect_blur_num;
@@ -927,9 +927,9 @@ struct render_context {
void light_param_data_face_set(light_param_face* face);
};
struct shadow {
render_texture field_8[8]; // Extra for buf
render_texture* field_158[4]; // Extra for buf
struct Shadow {
render_texture render_textures[8]; // Extra for buf
render_texture* curr_render_textures[4]; // Extra for buf
float_t view_region;
float_t range;
vec3 view_point[2];
@@ -965,9 +965,11 @@ struct shadow {
bool blur_filter_enable[2];
bool field_2F5;
shadow();
~shadow();
Shadow();
~Shadow();
void ctrl(render_context* rctx);
int32_t init_data();
void Ctrl(render_context* rctx);
int32_t InitData();
void Reset();
void ResetData();
};
+29 -27
View File
@@ -22,9 +22,9 @@
static void blur_filter_apply(render_context* rctx, GLuint tex_0, GLuint tex_1,
blur_filter_mode filter, const vec2 res_scale, const vec4 scale, const vec4 offset);
static void draw_pass_shadow_begin_make_shadowmap(render_context* rctx,
shadow* shad, int32_t index, int32_t a3);
Shadow* shad, int32_t index, int32_t a3);
static void draw_pass_shadow_end_make_shadowmap(render_context* rctx,
shadow* shad, int32_t index, int32_t a3);
Shadow* shad, int32_t index, int32_t a3);
static void draw_pass_shadow_filter(render_context* rctx, render_texture* a1, render_texture* a2,
render_texture* a3, float_t sigma, float_t far_texel_offset, bool enable_lit_proj);
static void draw_pass_shadow_esm_filter(render_context* rctx,
@@ -34,7 +34,7 @@ static void draw_pass_sss_contour(render_context* rctx, post_process* pp);
static void draw_pass_sss_filter(render_context* rctx, sss_data* sss);
static int32_t draw_pass_3d_get_translucent_count(render_context* rctx);
static void draw_pass_3d_shadow_reset(render_context* rctx);
static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx);
static void draw_pass_3d_shadow_set(Shadow* shad, render_context* rctx);
extern void draw_pass_3d_translucent(render_context* rctx, bool opaque_enable,
bool transparent_enable, bool translucent_enable, mdl::ObjType opaque,
mdl::ObjType transparent, mdl::ObjType translucent);
@@ -194,15 +194,15 @@ namespace rndr {
v3 = true;
}
::shadow* shad = shadow_ptr;
Shadow* shad = shadow_ptr;
if (shadow && v3) {
int32_t v11[2];
v11[0] = shad->field_200[0];
v11[1] = shad->field_200[1];
shad->field_158[0] = &shad->field_8[0];
shad->field_158[1] = &shad->field_8[1];
shad->field_158[2] = &shad->field_8[2];
shad->field_158[3] = &shad->field_8[7]; // Extra for buf
shad->curr_render_textures[0] = &shad->render_textures[0];
shad->curr_render_textures[1] = &shad->render_textures[1];
shad->curr_render_textures[2] = &shad->render_textures[2];
shad->curr_render_textures[3] = &shad->render_textures[7]; // Extra for buf
for (int32_t i = 0, j = 0; i < 2; i++) {
if (!v10[i])
@@ -220,14 +220,14 @@ namespace rndr {
}
}
else {
shad->field_158[0] = &shad->field_8[0];
shad->field_158[1] = &shad->field_8[1];
shad->field_158[2] = &shad->field_8[2];
shad->field_158[3] = &shad->field_8[7]; // Extra for buf
shad->curr_render_textures[0] = &shad->render_textures[0];
shad->curr_render_textures[1] = &shad->render_textures[1];
shad->curr_render_textures[2] = &shad->render_textures[2];
shad->curr_render_textures[3] = &shad->render_textures[7]; // Extra for buf
for (int32_t i = 1; i < 3; i++)
for (int32_t j = 0; j < 4; j++) {
shad->field_158[i]->bind(j);
shad->curr_render_textures[i]->bind(j);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
@@ -926,9 +926,9 @@ void draw_pass_set_camera(render_context* rctx) {
}
static void draw_pass_shadow_begin_make_shadowmap(render_context* rctx,
shadow* shad, int32_t index, int32_t a3) {
texture* tex = shad->field_158[0]->color_texture;
shad->field_158[0]->bind();
Shadow* shad, int32_t index, int32_t a3) {
texture* tex = shad->curr_render_textures[0]->color_texture;
shad->curr_render_textures[0]->bind();
glViewport(0, 0, tex->width, tex->height);
glScissor(0, 0, tex->width, tex->height);
gl_state_enable_depth_test();
@@ -970,22 +970,24 @@ static void draw_pass_shadow_begin_make_shadowmap(render_context* rctx,
}
static void draw_pass_shadow_end_make_shadowmap(render_context* rctx,
shadow* shad, int32_t index, int32_t a3) {
Shadow* shad, int32_t index, int32_t a3) {
gl_state_disable_depth_test();
gl_state_disable_scissor_test();
rctx->draw_state.shader_index = -1;
if (a3 == shad->field_2EC - 1) {
draw_pass_shadow_filter(rctx, &shad->field_8[3], &shad->field_8[4], shad->field_158[0],
draw_pass_shadow_filter(rctx, &shad->render_textures[3],
&shad->render_textures[4], shad->curr_render_textures[0],
shad->field_2DC, shad->field_2E0 / (shad->field_208 * 2.0f), false);
draw_pass_shadow_esm_filter(rctx, &shad->field_8[5], &shad->field_8[6], &shad->field_8[3]);
draw_pass_shadow_esm_filter(rctx, &shad->render_textures[5],
&shad->render_textures[6], &shad->render_textures[3]);
}
render_texture* rend_tex = shad->field_158[1 + index];
render_texture* rend_buf_tex = shad->field_158[3];
render_texture* rend_tex = shad->curr_render_textures[1 + index];
render_texture* rend_buf_tex = shad->curr_render_textures[3];
rend_tex->bind();
render_texture* src = shad->field_158[0];
render_texture* src = shad->curr_render_textures[0];
image_filter_scale(rctx, rend_tex->color_texture->tex, src->color_texture->tex, 1.0f);
if (shad->blur_filter_enable[index]) {
@@ -1363,10 +1365,10 @@ static void draw_pass_3d_shadow_reset(render_context* rctx) {
rctx->draw_state.light = false;
}
static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) {
static void draw_pass_3d_shadow_set(Shadow* shad, render_context* rctx) {
if (shad->self_shadow && shad->field_2EC > 0) {
gl_state_active_bind_texture_2d(19, shad->field_8[3].color_texture->tex);
gl_state_active_bind_texture_2d(20, shad->field_8[5].color_texture->tex);
gl_state_active_bind_texture_2d(19, shad->render_textures[3].color_texture->tex);
gl_state_active_bind_texture_2d(20, shad->render_textures[5].color_texture->tex);
gl_state_active_texture(0);
float_t esm_param = (shad->field_2D8 * shad->field_208 * 2.0f) * 1.442695f;
rctx->obj_scene.g_esm_param = { esm_param, 0.0f, 0.0f, 0.0f };
@@ -1420,7 +1422,7 @@ static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) {
continue;
}
gl_state_active_bind_texture_2d(6 + j, shad->field_158[1 + i]->color_texture->tex);
gl_state_active_bind_texture_2d(6 + j, shad->curr_render_textures[1 + i]->color_texture->tex);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
j++;
}
@@ -1445,7 +1447,7 @@ static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) {
rctx->draw_state.light = false;
for (int32_t i = 0; i < 2; i++)
gl_state_active_bind_texture_2d(6 + i, shad->field_158[1 + i]->color_texture->tex);
gl_state_active_bind_texture_2d(6 + i, shad->curr_render_textures[1 + i]->color_texture->tex);
gl_state_active_texture(0);
rctx->obj_scene.g_shadow_ambient = 1.0f;
+1 -1
View File
@@ -13412,7 +13412,7 @@ void rob_chara_item_equip::disp(int32_t chara_id, render_context* rctx) {
enum_or(flags, mdl::OBJ_REFRACT);
mdl::DispManager& disp_manager = rctx->disp_manager;
shadow* shad = rctx->render_manager.shadow_ptr;
Shadow* shad = rctx->render_manager.shadow_ptr;
if (shadow_type != -1) {
if (field_A0 & 0x04) {
vec3 pos = position;
+3 -3
View File
@@ -434,7 +434,7 @@ static bool object_bounding_sphere_check_visibility_shadow(obj_bounding_sphere*
mat4_mult_vec3_trans(view, &center, &center);
float_t radius = sphere->radius;
shadow* shad = rctx_ptr->render_manager.shadow_ptr;
Shadow* shad = rctx_ptr->render_manager.shadow_ptr;
float_t v9 = shad->view_region * shad->range;
if ((center.x + radius) < -v9
|| (center.x - radius) > v9
@@ -448,14 +448,14 @@ static bool object_bounding_sphere_check_visibility_shadow(obj_bounding_sphere*
static bool object_bounding_sphere_check_visibility_shadow_chara(obj_bounding_sphere* sphere, mat4* view) {
mat4 mat;
shadow* shad = rctx_ptr->render_manager.shadow_ptr;
Shadow* shad = rctx_ptr->render_manager.shadow_ptr;
mat4_look_at(&shad->view_point[0], &shad->interest[0], &mat);
return object_bounding_sphere_check_visibility_shadow(sphere, view, &mat);
}
static bool object_bounding_sphere_check_visibility_shadow_stage(obj_bounding_sphere* sphere, mat4* view) {
mat4 mat;
shadow* shad = rctx_ptr->render_manager.shadow_ptr;
Shadow* shad = rctx_ptr->render_manager.shadow_ptr;
mat4_look_at(&shad->view_point[1], &shad->interest[1], &mat);
return object_bounding_sphere_check_visibility_shadow(sphere, view, &mat);
}
+3 -3
View File
@@ -450,7 +450,7 @@ static bool object_bounding_sphere_check_visibility_shadow(obj_bounding_sphere*
mat4_mult_vec3_trans(view, &center, &center);
float_t radius = sphere->radius;
shadow* shad = rctx_ptr->render_manager.shadow_ptr;
Shadow* shad = rctx_ptr->render_manager.shadow_ptr;
float_t view_region = shad->view_region * shad->range;
if ((center.x + radius) < -view_region
|| (center.x - radius) > view_region
@@ -464,14 +464,14 @@ static bool object_bounding_sphere_check_visibility_shadow(obj_bounding_sphere*
static bool object_bounding_sphere_check_visibility_shadow_chara(obj_bounding_sphere* sphere, mat4* view) {
mat4 mat;
shadow* shad = rctx_ptr->render_manager.shadow_ptr;
Shadow* shad = rctx_ptr->render_manager.shadow_ptr;
mat4_look_at(&shad->view_point[0], &shad->interest[0], &mat);
return object_bounding_sphere_check_visibility_shadow(sphere, view, &mat);
}
static bool object_bounding_sphere_check_visibility_shadow_stage(obj_bounding_sphere* sphere, mat4* view) {
mat4 mat;
shadow* shad = rctx_ptr->render_manager.shadow_ptr;
Shadow* shad = rctx_ptr->render_manager.shadow_ptr;
mat4_look_at(&shad->view_point[1], &shad->interest[1], &mat);
return object_bounding_sphere_check_visibility_shadow(sphere, view, &mat);
}
+5 -5
View File
@@ -1293,7 +1293,7 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time,
playdata->shadow = enable == 1;
shadow* shad = rctx_ptr->render_manager.shadow_ptr;
Shadow* shad = rctx_ptr->render_manager.shadow_ptr;
if (shad)
if (chara_id == 1)
shad->blur_filter_enable[1] = playdata->shadow;
@@ -2439,10 +2439,10 @@ void pv_game_pv_data::init(::pv_game* pv_game, bool music_play) {
sub_14013C8C0()->difficulty, sub_14013C8C0()->edition);
find_set_motion(diff);
shadow* shad = rctx_ptr->render_manager.shadow_ptr;
Shadow* shad = rctx_ptr->render_manager.shadow_ptr;
if (shad) {
shad->blur_filter_enable[0] = 0x1;
shad->blur_filter_enable[1] = 0x1;
shad->blur_filter_enable[0] = true;
shad->blur_filter_enable[1] = true;
}
pv_game->data.play_data.lyric_color = 0xFFFFFFFF;
@@ -2543,7 +2543,7 @@ void pv_game_pv_data::reset_camera_post_process() {
pp->tone_map->set_tone_trans(0.0f, 1.0f);
pp->tone_map->set_saturate_coeff(1.0f);
shadow* shad = rctx_ptr->render_manager.shadow_ptr;
Shadow* shad = rctx_ptr->render_manager.shadow_ptr;
if (shad)
for (bool& i : shad->blur_filter_enable)
i = true;
+6
View File
@@ -4659,6 +4659,12 @@ bool x_pv_game::Ctrl() {
dsc_data.dsc_data_ptr = dsc_data.dsc.data.data();
dsc_data.dsc_data_ptr_end = dsc_data.dsc_data_ptr + dsc_data.dsc.data.size();
Shadow* shad = rctx_ptr->render_manager.shadow_ptr;
if (shad) {
shad->blur_filter_enable[0] = true;
shad->blur_filter_enable[1] = true;
}
state_old = 9;
} break;
case 9: {