Better Autofocus DoF code

This commit is contained in:
korenkonder
2024-01-04 00:44:27 +03:00
parent a8e0468275
commit 8c0ae744dd
11 changed files with 136 additions and 131 deletions
+4 -8
View File
@@ -4242,7 +4242,7 @@ static void auth_3d_dof_restore_prev_value(auth_3d_dof* d, render_context* rctx)
if (!d->has_dof)
return;
dof_pv_set(0);
rctx->render.set_dof_enable(false);
}
static void auth_3d_dof_set(auth_3d_dof* d, render_context* rctx) {
@@ -4254,13 +4254,9 @@ static void auth_3d_dof_set(auth_3d_dof* d, render_context* rctx) {
float_t focus = vec3::distance(d->model_transform.translation_value, view_point);
dof_pv pv;
pv.enable = fabsf(d->model_transform.rotation_value.z) > 0.000001f;
pv.f2.focus = focus;
pv.f2.focus_range = d->model_transform.scale_value.x;
pv.f2.fuzzing_range = d->model_transform.rotation_value.x;
pv.f2.ratio = d->model_transform.rotation_value.y;
dof_pv_set(&pv);
rctx->render.set_dof_enable(fabsf(d->model_transform.translation_value.x) > 0.000001f);
rctx->render.set_dof_data(focus, d->model_transform.scale_value.x,
d->model_transform.rotation_value.x, d->model_transform.rotation_value.y);
}
static void auth_3d_dof_store(auth_3d* auth, auth_3d_dof* d, auth_3d_dof_file* df) {
+29 -89
View File
@@ -1097,29 +1097,25 @@ namespace pv_param_task {
float_t& focus, float_t& focus_range, float_t& fuzzing_range, float_t& ratio) {
float_t v5 = tanf(fov * DEG_TO_RAD_FLOAT * 0.5f);
float_t v6 = distance * 1000.0f;
float_t v7 = 36.0f / (v5 * 2.0f);
v7 *= v7;
float_t v7 = (36.0f / (v5 * 2.0f)) * (36.0f / (v5 * 2.0f));
float_t _focus_range = (v6 * 0.36608f * v6) / (v7 - v6 * 0.36608f) * 0.001f;
if (_focus_range >= 0.0f) {
float_t _ratio = (v7 * 20000.0f) / (v6 * 220000.0f + v6 * 11.0f * v6) * 3.0048077f;
float_t range;
if (_ratio >= 1.0f) {
float_t _ratio;
float_t v11 = (v7 * 20000.0f) / (v6 * 220000.0f + v6 * 11.0f * v6);
if (v11 >= 0.3328f) {
range = (v6 * 3.6608f * v6) / (v7 - v6 * 3.6608f) * 0.001f;
if (range < 0.2f)
range = 0.2f;
_ratio = 1.0f;
}
else
else {
range = 20.0f;
_ratio = v11 * 3.0048077f;
}
if (_focus_range < 0.2f)
_focus_range = 0.2f;
float_t _fuzzing_range = range - _focus_range;
if (_fuzzing_range < 0.01f)
_fuzzing_range = 0.01f;
range = max_def(range, 0.2f);
_focus_range = max_def(_focus_range, 0.2f);
float_t _fuzzing_range = max_def(range - _focus_range, 0.01f);
enable = true;
focus = distance;
@@ -1127,35 +1123,18 @@ namespace pv_param_task {
fuzzing_range = _fuzzing_range;
ratio = _ratio;
}
else {
else
enable = false;
focus = 0.0f;
focus_range = 0.0f;
fuzzing_range = 0.0f;
ratio = 0.0f;
}
}
#define DOF_FIX 1
void PostProcessCtrlDof::Set() {
float_t focus;
float_t focus_range;
float_t fuzzing_range;
float_t ratio;
#if DOF_FIX
float_t auto_focus;
float_t auto_focus_range;
#endif
bool enable = true;
bool autofocus = data.data.chara_id != -1;
#if DOF_FIX
if (true) {
#else
if (autofocus) {
#endif
if (!rctx_ptr->render.get_dof_update())
return;
vec3 trans = 0.0f;
rob_chara* rob_chr = rob_chara_array_get(autofocus ? data.data.chara_id : 0);
rob_chara* rob_chr = rob_chara_array_get(data.data.chara_id);
if (rob_chr) {
motion_blend_mot* mot = rob_chr->bone_data->motion_loaded.front();
::bone_data* bone_data = mot->bone_data.bones.data();
@@ -1165,32 +1144,22 @@ namespace pv_param_task {
camera* cam = rctx_ptr->camera;
bool enable = true;
vec3 view_point;
cam->get_view_point(view_point);
float_t fov = (float_t)cam->get_fov();
float_t distance = vec3::distance(trans, view_point);
get_autofocus_data(distance, fov, enable, focus, focus_range, fuzzing_range, ratio);
if (autofocus) {
data.data.focus = focus;
data.data.focus_range = focus_range;
data.data.fuzzing_range = fuzzing_range;
data.data.ratio = ratio;
}
#if DOF_FIX
auto_focus = focus;
auto_focus_range = focus_range;
}
#else
get_autofocus_data(vec3::distance(trans, view_point), cam->get_fov(),
enable, data.data.focus, data.data.focus_range,
data.data.fuzzing_range, data.data.ratio);
rctx_ptr->render.set_dof_enable(enable);
}
else if (frame < 0.0f)
return;
#endif
if (fabsf(duration) <= 0.000001f || autofocus && duration < 0.0f) {
float_t focus;
float_t focus_range;
float_t fuzzing_range;
float_t ratio;
if (fabsf(duration) <= 0.000001f || autofocus) {
focus = data.data.focus;
focus_range = data.data.focus_range;
fuzzing_range = data.data.fuzzing_range;
@@ -1210,31 +1179,7 @@ namespace pv_param_task {
ratio = lerp_def(data.data_prev.ratio, data.data.ratio, t);
}
#if DOF_FIX
bool ret = true;
if (ratio > 0.0f) {
if (focus == 0.0f && auto_focus >= 0.0f) {
focus = auto_focus;
ret = false;
}
if (focus_range == 0.0f && auto_focus_range >= 0.0f) {
focus_range = auto_focus_range;
ret = false;
}
}
if (!autofocus && ret && frame < 0.0f)
return;
#endif
dof_pv pv;
dof_pv_get(&pv);
pv.enable = enable;
pv.f2.focus = focus;
pv.f2.focus_range = focus_range;
pv.f2.fuzzing_range = fuzzing_range;
pv.f2.ratio = ratio;
dof_pv_set(&pv);
rctx_ptr->render.set_dof_data(focus, focus_range, fuzzing_range, ratio);
frame += get_delta_frame();
if (frame > duration) {
@@ -1249,14 +1194,9 @@ namespace pv_param_task {
this->duration = duration;
data.data = *dof;
if (fabsf(duration) > 0.000001f) {
dof_pv pv;
dof_pv_get(&pv);
data.data_prev.focus = pv.f2.focus;
data.data_prev.focus_range = pv.f2.focus_range;
data.data_prev.fuzzing_range = pv.f2.fuzzing_range;
data.data_prev.ratio = pv.f2.ratio;
}
if (fabsf(duration) > 0.000001f)
rctx_ptr->render.get_dof_data(data.data_prev.focus,
data.data_prev.focus_range, data.data_prev.fuzzing_range, data.data_prev.ratio);
else
data.data_prev = data.data;
}
+32
View File
@@ -17,6 +17,8 @@ extern bool task_stage_is_modern;
extern render_context* rctx_ptr;
extern dof_pv dof_pv_data;
#define MLAA_MAX_EDGE_DETECTION_LEN (3)
#define MLAA_GRID_SIDE_LEN (2 * MLAA_MAX_EDGE_DETECTION_LEN + 1)
#define MLAA_SIDE_LEN (5 * MLAA_GRID_SIDE_LEN)
@@ -736,6 +738,21 @@ namespace rndr {
return cam_blur;
}
void Render::get_dof_data(float_t& focus, float_t& focus_range, float_t& fuzzing_range, float_t& ratio) {
focus = dof_pv_data.f2.focus;
focus_range = dof_pv_data.f2.focus_range;
fuzzing_range = dof_pv_data.f2.fuzzing_range;
ratio = dof_pv_data.f2.ratio;
}
bool Render::get_dof_enable() {
return dof_pv_data.enable;
}
bool Render::get_dof_update() {
return dof_pv_data.update;
}
float_t Render::get_exposure() {
return exposure;
}
@@ -1138,6 +1155,21 @@ namespace rndr {
update = 1;
}
void Render::set_dof_data(float_t focus, float_t focus_range, float_t fuzzing_range, float_t ratio) {
dof_pv_data.f2.focus = focus;
dof_pv_data.f2.focus_range = focus_range;
dof_pv_data.f2.ratio = ratio;
dof_pv_data.f2.fuzzing_range = fuzzing_range;
}
void Render::set_dof_enable(bool value) {
dof_pv_data.enable = value;
}
void Render::set_dof_update(bool value) {
dof_pv_data.update = value;
}
void Render::set_exposure(float_t value) {
exposure = value;
update = 1;
+6
View File
@@ -197,6 +197,9 @@ namespace rndr {
void free();
bool get_auto_exposure();
int32_t get_cam_blur();
void get_dof_data(float_t& focus, float_t& focus_range, float_t& fuzzing_range, float_t& ratio);
bool get_dof_enable();
bool get_dof_update();
float_t get_exposure();
float_t get_exposure_rate();
float_t get_gamma();
@@ -229,6 +232,9 @@ namespace rndr {
void resize(int32_t width, int32_t height);
void set_auto_exposure(bool value);
void set_cam_blur(int32_t value);
void set_dof_data(float_t focus, float_t focus_range, float_t fuzzing_range, float_t ratio);
void set_dof_enable(bool value);
void set_dof_update(bool value);
void set_exposure(float_t value);
void set_exposure_rate(float_t value);
void set_gamma(float_t value);
+1 -12
View File
@@ -30,6 +30,7 @@ static const dof_debug dof_debug_default = {
};
static const dof_pv dof_pv_default = {
false,
false,
{
10.0f,
@@ -422,15 +423,3 @@ void dof_debug_set(dof_debug* debug) {
else
dof_debug_data = dof_debug_default;
}
void dof_pv_get(dof_pv* pv) {
if (pv)
*pv = dof_pv_data;
}
void dof_pv_set(dof_pv* pv) {
if (pv)
dof_pv_data = *pv;
else
dof_pv_data = dof_pv_default;
}
+1 -5
View File
@@ -35,6 +35,7 @@ struct dof_debug {
struct dof_pv {
bool enable;
bool update;
dof_f2 f2;
};
@@ -80,10 +81,5 @@ namespace renderer {
};
}
extern dof_debug dof_debug_data;
extern dof_pv dof_pv_data;
extern void dof_debug_get(dof_debug* debug);
extern void dof_debug_set(dof_debug* debug = 0);
extern void dof_pv_get(dof_pv* pv);
extern void dof_pv_set(dof_pv* pv = 0);
+20
View File
@@ -254,6 +254,26 @@ int32_t interpolate_chs_reverse_sequence(
values.push_back({ (float_t)(int64_t)(count - 1), arr[count - 1], t2_old, 0.0f });
if (values.size() > 2) {
kft3* keys = values.data();
size_t length = values.size();
for (size_t i = 0; i < length - 3; i++)
if (*(uint32_t*)&keys[i + 0].value == *(uint32_t*)&keys[i + 1].value
&& *(uint32_t*)&keys[i + 1].value == *(uint32_t*)&keys[i + 2].value
&& *(uint32_t*)&keys[i + 0].tangent2 == 0
&& *(uint32_t*)&keys[i + 1].tangent1 == 0
&& *(uint32_t*)&keys[i + 1].tangent2 == 0
&& *(uint32_t*)&keys[i + 2].tangent1 == 0) {
keys[i + 1].frame = keys[i + 2].frame;
keys[i + 1].tangent2 = keys[i + 2].tangent2;
values.erase(values.begin() + (i + 2));
keys = values.data();
length = values.size();
if (length < 3)
break;
}
}
kft3* keys = values.data();
size_t length = values.size();
for (size_t i = 0; i < count; i++) {
+6 -1
View File
@@ -4,6 +4,7 @@
*/
#include "post_process.hpp"
#include "../../../CRE/render_context.hpp"
#include "../../../CRE/stage.hpp"
#include "../../imgui_helper.hpp"
@@ -171,6 +172,8 @@ void graphics_post_process_imgui(class_data* data) {
ImGui::SetDefaultColumnSpace();
if (ImGui::TreeNodeEx("DOF", ImGuiTreeNodeFlags_DefaultOpen)) {
dof_debug dof_debug_data;
dof_debug_get(&dof_debug_data);
bool use_ui_params = dof_debug_data.flags & DOF_DEBUG_USE_UI_PARAMS;
bool phys = use_ui_params && dof_debug_data.flags & DOF_DEBUG_ENABLE_PHYS_DOF;
bool f2 = use_ui_params && ~dof_debug_data.flags & DOF_DEBUG_ENABLE_PHYS_DOF;
@@ -240,6 +243,7 @@ void graphics_post_process_imgui(class_data* data) {
ImGui::PopItemFlag();
ImGui::PopStyleVar();
}
dof_debug_set(&dof_debug_data);
ImGui::SetDefaultColumnSpace();
ImGui::TreePop();
}
@@ -249,7 +253,8 @@ void graphics_post_process_imgui(class_data* data) {
if (stg)
light_param_data_storage_data_set_stage(stg->index);
dof_debug_set();
dof_pv_set();
extern render_context* rctx_ptr;
rctx_ptr->render.set_dof_enable(false);
}
data->imgui_focus |= ImGui::IsWindowFocused();
+3 -1
View File
@@ -4380,6 +4380,8 @@ bool pv_game::set_pv_param_post_process_color_correction_data(bool set, int32_t
}
bool pv_game::set_pv_param_post_process_dof_data(bool set, int32_t id, float_t duration) {
rctx_ptr->render.set_dof_enable(set);
pv_param::dof& dof = pv_param::post_process_data_get_dof_data(id);
if (set)
pv_param_task::post_process_task_set_dof_data(dof, duration);
@@ -4674,7 +4676,7 @@ bool pv_game::unload() {
rndr::Render& rend = rctx_ptr->render;
rend.reset_saturate_coeff(0, true);
dof_pv_set();
rend.set_dof_enable(false);
rend.reset_scene_fade(0);
rend.set_taa(1);
+31 -15
View File
@@ -2950,27 +2950,21 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time,
int32_t id = data[0];
float_t duration = (float_t)data[1];
pv_param_task::post_process_task_set_bloom_data(
pv_param::post_process_data_get_bloom_data(id), duration);
set_pv_param_post_process_bloom_data(true, id, duration);
} break;
case DSC_X_COLOR_CORRECTION: {
int32_t enable = data[0];
int32_t id = data[1];
float_t duration = (float_t)data[2];
if (enable == 1)
pv_param_task::post_process_task_set_color_correction_data(
pv_param::post_process_data_get_color_correction_data(id), duration);
set_pv_param_post_process_color_correction_data(enable == 1, id, duration);
} break;
case DSC_X_DOF: {
int32_t enable = data[0];
int32_t id = data[1];
float_t duration = (float_t)data[2];
dof_pv_data.enable = enable == 1;
if (enable == 1)
pv_param_task::post_process_task_set_dof_data(
pv_param::post_process_data_get_dof_data(id), duration);
set_pv_param_post_process_dof_data(enable == 1, id, duration);
} break;
case DSC_X_CHARA_ALPHA: {
chara_id = data[0];
@@ -3606,6 +3600,30 @@ void x_pv_game_pv_data::reset() {
dsc_time = -1;
}
bool x_pv_game_pv_data::set_pv_param_post_process_bloom_data(bool set, int32_t id, float_t duration) {
pv_param::bloom& bloom = pv_param::post_process_data_get_bloom_data(id);
if (set)
pv_param_task::post_process_task_set_bloom_data(bloom, duration);
return true;
}
bool x_pv_game_pv_data::set_pv_param_post_process_color_correction_data(bool set, int32_t id, float_t duration) {
pv_param::color_correction& color_correction = pv_param::post_process_data_get_color_correction_data(id);
if (set)
pv_param_task::post_process_task_set_color_correction_data(color_correction, duration);
return true;
}
bool x_pv_game_pv_data::set_pv_param_post_process_dof_data(bool set, int32_t id, float_t duration) {
rctx_ptr->render.set_dof_enable(set);
rctx_ptr->render.set_dof_update(set);
pv_param::dof& dof = pv_param::post_process_data_get_dof_data(id);
if (set)
pv_param_task::post_process_task_set_dof_data(dof, duration);
return true;
}
void x_pv_game_pv_data::set_motion_max_frame(int32_t chara_id, int32_t motion_index, int64_t time) {
if (chara_id < 0 || chara_id >= ROB_CHARA_COUNT || motion_index < 0)
return;
@@ -6577,9 +6595,6 @@ bool x_pv_game::ctrl() {
a3da_key_rev(a.dof.model_transform.translation.x, dof_cam_data.position_x);
a3da_key_rev(a.dof.model_transform.translation.y, dof_cam_data.position_y);
a3da_key_rev(a.dof.model_transform.translation.z, dof_cam_data.position_z);
a.dof.model_transform.translation.x.raw_data = true;
a.dof.model_transform.translation.y.raw_data = true;
a.dof.model_transform.translation.z.raw_data = true;
a3da_key_rev(a.dof.model_transform.scale.x, dof_cam_data.focus_range);
a3da_key_rev(a.dof.model_transform.rotation.x, dof_cam_data.fuzzing_range);
a3da_key_rev(a.dof.model_transform.rotation.y, dof_cam_data.ratio);
@@ -6654,8 +6669,8 @@ void x_pv_game::basic() {
camera* cam = rctx_ptr->camera;
renderer::DOF3* dof = rctx_ptr->render.dof;
dof_pv pv;
dof_pv_get(&dof_pv_data);
dof_pv pv = {};
dof_pv_get(&pv);
vec3 interest;
vec3 view_point;
@@ -7383,7 +7398,8 @@ bool x_pv_game::unload() {
rndr::Render& rend = rctx_ptr->render;
rend.reset_saturate_coeff(0, true);
dof_pv_set();
rend.set_dof_enable(false);
rend.set_dof_update(false);
rend.reset_scene_fade(0);
rend.set_taa(1);
+3
View File
@@ -485,6 +485,9 @@ struct x_pv_game_pv_data {
void find_stage_effects(prj::vector_pair<int64_t, int32_t>& stage_effects);
void init(class x_pv_game* pv_game, bool music_play);
void reset();
bool set_pv_param_post_process_bloom_data(bool set, int32_t id, float_t duration);
bool set_pv_param_post_process_color_correction_data(bool set, int32_t id, float_t duration);
bool set_pv_param_post_process_dof_data(bool set, int32_t id, float_t duration);
void set_motion_max_frame(int32_t chara_id, int32_t motion_index, int64_t time);
void unload();
};