Skip to content

Commit 787e16d

Browse files
HydrogenCAR
andcommitted
Add motion blur support
Squashed commit. Graphics part by @HydrogenC, editor part mainly by @AR-DEV-1 Co-Authored-By: AR <mail.ardev1@protonmail.com>
1 parent a4bbad2 commit 787e16d

17 files changed

+1519
-1
lines changed

scene/resources/camera_attributes.cpp

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,91 @@ CameraAttributes::~CameraAttributes() {
145145
//////////////////////////////////////////////////////
146146
/* CameraAttributesPractical */
147147

148+
void CameraAttributesPractical::set_motion_blur_enabled(bool p_enabled) {
149+
if (motion_blur_enabled == p_enabled) {
150+
return;
151+
}
152+
motion_blur_enabled = p_enabled;
153+
_update_motion_blur();
154+
notify_property_list_changed();
155+
}
156+
157+
bool CameraAttributesPractical::is_motion_blur_enabled() const {
158+
return motion_blur_enabled;
159+
}
160+
161+
void CameraAttributesPractical::set_motion_blur_intensity(float p_intensity) {
162+
p_intensity = MAX(0.0f, p_intensity);
163+
motion_blur_intensity = p_intensity;
164+
_update_motion_blur();
165+
}
166+
167+
float CameraAttributesPractical::get_motion_blur_intensity() const {
168+
return motion_blur_intensity;
169+
}
170+
171+
void CameraAttributesPractical::set_motion_blur_clamp_velocities_to_tile(bool p_clamp_velocities_to_tile) {
172+
if (motion_blur_clamp_velocities_to_tile == p_clamp_velocities_to_tile) {
173+
return;
174+
}
175+
motion_blur_clamp_velocities_to_tile = p_clamp_velocities_to_tile;
176+
_update_motion_blur();
177+
}
178+
179+
bool CameraAttributesPractical::is_motion_blur_clamp_velocities_to_tile() const {
180+
return motion_blur_clamp_velocities_to_tile;
181+
}
182+
183+
void CameraAttributesPractical::set_motion_blur_object_velocity_multiplier(float p_multiplier) {
184+
p_multiplier = MAX(0.0f, p_multiplier);
185+
motion_blur_object_velocity_multiplier = p_multiplier;
186+
_update_motion_blur();
187+
}
188+
189+
float CameraAttributesPractical::get_motion_blur_object_velocity_multiplier() const {
190+
return motion_blur_object_velocity_multiplier;
191+
}
192+
193+
void CameraAttributesPractical::set_motion_blur_movement_velocity_multiplier(float p_multiplier) {
194+
p_multiplier = MAX(0.0f, p_multiplier);
195+
motion_blur_movement_velocity_multiplier = p_multiplier;
196+
_update_motion_blur();
197+
}
198+
199+
float CameraAttributesPractical::get_motion_blur_movement_velocity_multiplier() const {
200+
return motion_blur_movement_velocity_multiplier;
201+
}
202+
203+
void CameraAttributesPractical::set_motion_blur_rotation_velocity_multiplier(float p_multiplier) {
204+
p_multiplier = MAX(0.0f, p_multiplier);
205+
motion_blur_rotation_velocity_multiplier = p_multiplier;
206+
_update_motion_blur();
207+
}
208+
209+
float CameraAttributesPractical::get_motion_blur_rotation_velocity_multiplier() const {
210+
return motion_blur_rotation_velocity_multiplier;
211+
}
212+
213+
void CameraAttributesPractical::set_motion_blur_velocity_lower_threshold(float p_threshold) {
214+
p_threshold = MAX(0.0f, p_threshold);
215+
motion_blur_velocity_lower_threshold = p_threshold;
216+
_update_motion_blur();
217+
}
218+
219+
float CameraAttributesPractical::get_motion_blur_velocity_lower_threshold() const {
220+
return motion_blur_velocity_lower_threshold;
221+
}
222+
223+
void CameraAttributesPractical::set_motion_blur_velocity_upper_threshold(float p_threshold) {
224+
p_threshold = MAX(0.0f, p_threshold);
225+
motion_blur_velocity_upper_threshold = p_threshold;
226+
_update_motion_blur();
227+
}
228+
229+
float CameraAttributesPractical::get_motion_blur_velocity_upper_threshold() const {
230+
return motion_blur_velocity_upper_threshold;
231+
}
232+
148233
void CameraAttributesPractical::set_dof_blur_far_enabled(bool p_enabled) {
149234
dof_blur_far_enabled = p_enabled;
150235
_update_dof_blur();
@@ -210,6 +295,19 @@ float CameraAttributesPractical::get_dof_blur_amount() const {
210295
return dof_blur_amount;
211296
}
212297

298+
void CameraAttributesPractical::_update_motion_blur() {
299+
RS::get_singleton()->camera_attributes_set_motion_blur(
300+
get_rid(),
301+
motion_blur_enabled,
302+
motion_blur_intensity,
303+
motion_blur_clamp_velocities_to_tile,
304+
motion_blur_object_velocity_multiplier,
305+
motion_blur_movement_velocity_multiplier,
306+
motion_blur_rotation_velocity_multiplier,
307+
motion_blur_velocity_lower_threshold,
308+
motion_blur_velocity_upper_threshold);
309+
}
310+
213311
void CameraAttributesPractical::_update_dof_blur() {
214312
RS::get_singleton()->camera_attributes_set_dof_blur(
215313
get_rid(),
@@ -259,13 +357,38 @@ void CameraAttributesPractical::_validate_property(PropertyInfo &p_property) con
259357
if (!Engine::get_singleton()->is_editor_hint()) {
260358
return;
261359
}
360+
262361
if ((p_property.name != "dof_blur_far_enabled" && !dof_blur_far_enabled && p_property.name.begins_with("dof_blur_far_")) ||
263362
(p_property.name != "dof_blur_near_enabled" && !dof_blur_near_enabled && p_property.name.begins_with("dof_blur_near_"))) {
264363
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
265364
}
365+
366+
if (p_property.name.begins_with("motion_blur_") && p_property.name != "motion_blur_enabled" && !motion_blur_enabled) {
367+
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
368+
return;
369+
}
266370
}
267371

268372
void CameraAttributesPractical::_bind_methods() {
373+
// Motion blur
374+
375+
ClassDB::bind_method(D_METHOD("set_motion_blur_enabled", "enabled"), &CameraAttributesPractical::set_motion_blur_enabled);
376+
ClassDB::bind_method(D_METHOD("is_motion_blur_enabled"), &CameraAttributesPractical::is_motion_blur_enabled);
377+
ClassDB::bind_method(D_METHOD("set_motion_blur_intensity", "intensity"), &CameraAttributesPractical::set_motion_blur_intensity);
378+
ClassDB::bind_method(D_METHOD("get_motion_blur_intensity"), &CameraAttributesPractical::get_motion_blur_intensity);
379+
ClassDB::bind_method(D_METHOD("set_motion_blur_clamp_velocities_to_tile", "clamp_velocities_to_tile"), &CameraAttributesPractical::set_motion_blur_clamp_velocities_to_tile);
380+
ClassDB::bind_method(D_METHOD("is_motion_blur_clamp_velocities_to_tile"), &CameraAttributesPractical::is_motion_blur_clamp_velocities_to_tile);
381+
ClassDB::bind_method(D_METHOD("set_motion_blur_object_velocity_multiplier", "multiplier"), &CameraAttributesPractical::set_motion_blur_object_velocity_multiplier);
382+
ClassDB::bind_method(D_METHOD("get_motion_blur_object_velocity_multiplier"), &CameraAttributesPractical::get_motion_blur_object_velocity_multiplier);
383+
ClassDB::bind_method(D_METHOD("set_motion_blur_movement_velocity_multiplier", "multiplier"), &CameraAttributesPractical::set_motion_blur_movement_velocity_multiplier);
384+
ClassDB::bind_method(D_METHOD("get_motion_blur_movement_velocity_multiplier"), &CameraAttributesPractical::get_motion_blur_movement_velocity_multiplier);
385+
ClassDB::bind_method(D_METHOD("set_motion_blur_rotation_velocity_multiplier", "multiplier"), &CameraAttributesPractical::set_motion_blur_rotation_velocity_multiplier);
386+
ClassDB::bind_method(D_METHOD("get_motion_blur_rotation_velocity_multiplier"), &CameraAttributesPractical::get_motion_blur_rotation_velocity_multiplier);
387+
ClassDB::bind_method(D_METHOD("set_motion_blur_velocity_lower_threshold", "threshold"), &CameraAttributesPractical::set_motion_blur_velocity_lower_threshold);
388+
ClassDB::bind_method(D_METHOD("get_motion_blur_velocity_lower_threshold"), &CameraAttributesPractical::get_motion_blur_velocity_lower_threshold);
389+
ClassDB::bind_method(D_METHOD("set_motion_blur_velocity_upper_threshold", "threshold"), &CameraAttributesPractical::set_motion_blur_velocity_upper_threshold);
390+
ClassDB::bind_method(D_METHOD("get_motion_blur_velocity_upper_threshold"), &CameraAttributesPractical::get_motion_blur_velocity_upper_threshold);
391+
269392
// DOF blur
270393

271394
ClassDB::bind_method(D_METHOD("set_dof_blur_far_enabled", "enabled"), &CameraAttributesPractical::set_dof_blur_far_enabled);
@@ -289,6 +412,16 @@ void CameraAttributesPractical::_bind_methods() {
289412
ClassDB::bind_method(D_METHOD("set_auto_exposure_min_sensitivity", "min_sensitivity"), &CameraAttributesPractical::set_auto_exposure_min_sensitivity);
290413
ClassDB::bind_method(D_METHOD("get_auto_exposure_min_sensitivity"), &CameraAttributesPractical::get_auto_exposure_min_sensitivity);
291414

415+
ADD_GROUP("Motion Blur", "motion_blur_");
416+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "motion_blur_enabled", PROPERTY_HINT_GROUP_ENABLE), "set_motion_blur_enabled", "is_motion_blur_enabled");
417+
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "motion_blur_intensity", PROPERTY_HINT_RANGE, "0.0,5.0,0.01,or_greater"), "set_motion_blur_intensity", "get_motion_blur_intensity");
418+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "motion_blur_clamp_velocities_to_tile"), "set_motion_blur_clamp_velocities_to_tile", "is_motion_blur_clamp_velocities_to_tile");
419+
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "motion_blur_object_velocity_multiplier", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_motion_blur_object_velocity_multiplier", "get_motion_blur_object_velocity_multiplier");
420+
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "motion_blur_movement_velocity_multiplier", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_motion_blur_movement_velocity_multiplier", "get_motion_blur_movement_velocity_multiplier");
421+
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "motion_blur_rotation_velocity_multiplier", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_motion_blur_rotation_velocity_multiplier", "get_motion_blur_rotation_velocity_multiplier");
422+
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "motion_blur_velocity_lower_threshold", PROPERTY_HINT_RANGE, "0.0,10.0,0.01,or_greater"), "set_motion_blur_velocity_lower_threshold", "get_motion_blur_velocity_lower_threshold");
423+
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "motion_blur_velocity_upper_threshold", PROPERTY_HINT_RANGE, "0.0,10.0,0.01,or_greater"), "set_motion_blur_velocity_upper_threshold", "get_motion_blur_velocity_upper_threshold");
424+
292425
ADD_GROUP("DOF Blur", "dof_blur_");
293426
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "dof_blur_far_enabled"), "set_dof_blur_far_enabled", "is_dof_blur_far_enabled");
294427
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "dof_blur_far_distance", PROPERTY_HINT_RANGE, "0.01,8192,0.01,exp,suffix:m"), "set_dof_blur_far_distance", "get_dof_blur_far_distance");
@@ -304,6 +437,7 @@ void CameraAttributesPractical::_bind_methods() {
304437
}
305438

306439
CameraAttributesPractical::CameraAttributesPractical() {
440+
_update_motion_blur();
307441
_update_dof_blur();
308442
_update_exposure();
309443
set_auto_exposure_min_sensitivity(0.0);

scene/resources/camera_attributes.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,17 @@ class CameraAttributesPractical : public CameraAttributes {
7878
GDCLASS(CameraAttributesPractical, CameraAttributes);
7979

8080
private:
81+
// Motion blur
82+
bool motion_blur_enabled = false;
83+
float motion_blur_intensity = 1.0;
84+
bool motion_blur_clamp_velocities_to_tile = true;
85+
float motion_blur_object_velocity_multiplier = 1.0;
86+
float motion_blur_movement_velocity_multiplier = 1.0;
87+
float motion_blur_rotation_velocity_multiplier = 1.0;
88+
float motion_blur_velocity_lower_threshold = 0.0;
89+
float motion_blur_velocity_upper_threshold = 0.0;
90+
void _update_motion_blur();
91+
8192
// DOF blur
8293
bool dof_blur_far_enabled = false;
8394
float dof_blur_far_distance = 10.0;
@@ -97,6 +108,24 @@ class CameraAttributesPractical : public CameraAttributes {
97108
void _validate_property(PropertyInfo &p_property) const;
98109

99110
public:
111+
// Motion blur
112+
void set_motion_blur_enabled(bool p_enabled);
113+
bool is_motion_blur_enabled() const;
114+
void set_motion_blur_intensity(float p_intensity);
115+
float get_motion_blur_intensity() const;
116+
void set_motion_blur_clamp_velocities_to_tile(bool p_clamp_velocities_to_tile);
117+
bool is_motion_blur_clamp_velocities_to_tile() const;
118+
void set_motion_blur_object_velocity_multiplier(float p_multiplier);
119+
float get_motion_blur_object_velocity_multiplier() const;
120+
void set_motion_blur_movement_velocity_multiplier(float p_multiplier);
121+
float get_motion_blur_movement_velocity_multiplier() const;
122+
void set_motion_blur_rotation_velocity_multiplier(float p_multiplier);
123+
float get_motion_blur_rotation_velocity_multiplier() const;
124+
void set_motion_blur_velocity_lower_threshold(float p_threshold);
125+
float get_motion_blur_velocity_lower_threshold() const;
126+
void set_motion_blur_velocity_upper_threshold(float p_threshold);
127+
float get_motion_blur_velocity_upper_threshold() const;
128+
100129
// DOF blur
101130
void set_dof_blur_far_enabled(bool p_enabled);
102131
bool is_dof_blur_far_enabled() const;

0 commit comments

Comments
 (0)