diff --git a/core/input/input.cpp b/core/input/input.cpp index 3f0e524d9a6..6d79c065161 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -415,9 +415,9 @@ bool Input::is_action_just_pressed(const StringName &p_action, bool p_exact) con } } -bool Input::is_action_just_pressed_by_event(const StringName &p_action, const Ref &p_event, bool p_exact) const { +bool Input::is_action_just_pressed_by_event(const StringName &p_action, RequiredParam rp_event, bool p_exact) const { ERR_FAIL_COND_V_MSG(!InputMap::get_singleton()->has_action(p_action), false, InputMap::get_singleton()->suggest_actions(p_action)); - ERR_FAIL_COND_V(p_event.is_null(), false); + EXTRACT_PARAM_OR_FAIL_V(p_event, rp_event, false); if (disable_input) { return false; @@ -472,9 +472,9 @@ bool Input::is_action_just_released(const StringName &p_action, bool p_exact) co } } -bool Input::is_action_just_released_by_event(const StringName &p_action, const Ref &p_event, bool p_exact) const { +bool Input::is_action_just_released_by_event(const StringName &p_action, RequiredParam rp_event, bool p_exact) const { ERR_FAIL_COND_V_MSG(!InputMap::get_singleton()->has_action(p_action), false, InputMap::get_singleton()->suggest_actions(p_action)); - ERR_FAIL_COND_V(p_event.is_null(), false); + EXTRACT_PARAM_OR_FAIL_V(p_event, rp_event, false); if (disable_input) { return false; @@ -1227,10 +1227,10 @@ void Input::set_custom_mouse_cursor(const Ref &p_cursor, CursorShape p set_custom_mouse_cursor_func(p_cursor, p_shape, p_hotspot); } -void Input::parse_input_event(const Ref &p_event) { +void Input::parse_input_event(RequiredParam rp_event) { _THREAD_SAFE_METHOD_ - ERR_FAIL_COND(p_event.is_null()); + EXTRACT_PARAM_OR_FAIL(p_event, rp_event); #ifdef DEBUG_ENABLED uint64_t curr_frame = Engine::get_singleton()->get_process_frames(); diff --git a/core/input/input.h b/core/input/input.h index 2e0e5ab730b..f8e1462d378 100644 --- a/core/input/input.h +++ b/core/input/input.h @@ -321,8 +321,8 @@ public: bool is_action_pressed(const StringName &p_action, bool p_exact = false) const; bool is_action_just_pressed(const StringName &p_action, bool p_exact = false) const; bool is_action_just_released(const StringName &p_action, bool p_exact = false) const; - bool is_action_just_pressed_by_event(const StringName &p_action, const Ref &p_event, bool p_exact = false) const; - bool is_action_just_released_by_event(const StringName &p_action, const Ref &p_event, bool p_exact = false) const; + bool is_action_just_pressed_by_event(const StringName &p_action, RequiredParam p_event, bool p_exact = false) const; + bool is_action_just_released_by_event(const StringName &p_action, RequiredParam p_event, bool p_exact = false) const; float get_action_strength(const StringName &p_action, bool p_exact = false) const; float get_action_raw_strength(const StringName &p_action, bool p_exact = false) const; @@ -350,7 +350,7 @@ public: void warp_mouse(const Vector2 &p_position); Point2 warp_mouse_motion(const Ref &p_motion, const Rect2 &p_rect); - void parse_input_event(const Ref &p_event); + void parse_input_event(RequiredParam p_event); void set_gravity(const Vector3 &p_gravity); void set_accelerometer(const Vector3 &p_accel); diff --git a/core/input/input_event.cpp b/core/input/input_event.cpp index ed865807fcb..12f9f7c1d7b 100644 --- a/core/input/input_event.cpp +++ b/core/input/input_event.cpp @@ -88,7 +88,7 @@ bool InputEvent::is_echo() const { return false; } -Ref InputEvent::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { +RequiredResult InputEvent::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { return Ref(const_cast(this)); } @@ -736,7 +736,7 @@ bool InputEventMouseButton::is_double_click() const { return double_click; } -Ref InputEventMouseButton::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { +RequiredResult InputEventMouseButton::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { Vector2 g = get_global_position(); Vector2 l = p_xform.xform(get_position() + p_local_ofs); @@ -958,7 +958,7 @@ Vector2 InputEventMouseMotion::get_screen_velocity() const { return screen_velocity; } -Ref InputEventMouseMotion::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { +RequiredResult InputEventMouseMotion::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { Ref mm; mm.instantiate(); @@ -1364,7 +1364,7 @@ bool InputEventScreenTouch::is_double_tap() const { return double_tap; } -Ref InputEventScreenTouch::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { +RequiredResult InputEventScreenTouch::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { Ref st; st.instantiate(); st->set_device(get_device()); @@ -1487,7 +1487,7 @@ Vector2 InputEventScreenDrag::get_screen_velocity() const { return screen_velocity; } -Ref InputEventScreenDrag::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { +RequiredResult InputEventScreenDrag::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { Ref sd; sd.instantiate(); @@ -1706,7 +1706,7 @@ real_t InputEventMagnifyGesture::get_factor() const { return factor; } -Ref InputEventMagnifyGesture::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { +RequiredResult InputEventMagnifyGesture::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { Ref ev; ev.instantiate(); @@ -1748,7 +1748,7 @@ Vector2 InputEventPanGesture::get_delta() const { return delta; } -Ref InputEventPanGesture::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { +RequiredResult InputEventPanGesture::xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs) const { Ref ev; ev.instantiate(); diff --git a/core/input/input_event.h b/core/input/input_event.h index 61e00954aee..ea163230d3f 100644 --- a/core/input/input_event.h +++ b/core/input/input_event.h @@ -80,7 +80,7 @@ public: virtual String as_text() const = 0; - virtual Ref xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const; + virtual RequiredResult xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const; virtual bool action_match(const Ref &p_event, bool p_exact_match, float p_deadzone, bool *r_pressed, float *r_strength, float *r_raw_strength) const; virtual bool is_match(const Ref &p_event, bool p_exact_match = true) const; @@ -246,7 +246,7 @@ public: void set_double_click(bool p_double_click); bool is_double_click() const; - virtual Ref xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; + virtual RequiredResult xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; virtual bool action_match(const Ref &p_event, bool p_exact_match, float p_deadzone, bool *r_pressed, float *r_strength, float *r_raw_strength) const override; virtual bool is_match(const Ref &p_event, bool p_exact_match = true) const override; @@ -294,7 +294,7 @@ public: void set_screen_velocity(const Vector2 &p_velocity); Vector2 get_screen_velocity() const; - virtual Ref xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; + virtual RequiredResult xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; virtual String as_text() const override; virtual String _to_string() override; @@ -384,7 +384,7 @@ public: void set_double_tap(bool p_double_tap); bool is_double_tap() const; - virtual Ref xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; + virtual RequiredResult xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; virtual String as_text() const override; virtual String _to_string() override; @@ -434,7 +434,7 @@ public: void set_screen_velocity(const Vector2 &p_velocity); Vector2 get_screen_velocity() const; - virtual Ref xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; + virtual RequiredResult xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; virtual String as_text() const override; virtual String _to_string() override; @@ -502,7 +502,7 @@ public: void set_factor(real_t p_factor); real_t get_factor() const; - virtual Ref xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; + virtual RequiredResult xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; virtual String as_text() const override; virtual String _to_string() override; @@ -520,7 +520,7 @@ public: void set_delta(const Vector2 &p_delta); Vector2 get_delta() const; - virtual Ref xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; + virtual RequiredResult xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const override; virtual String as_text() const override; virtual String _to_string() override; diff --git a/core/input/input_map.cpp b/core/input/input_map.cpp index 2f19ffaa101..461fb1dfc38 100644 --- a/core/input/input_map.cpp +++ b/core/input/input_map.cpp @@ -196,8 +196,8 @@ void InputMap::action_set_deadzone(const StringName &p_action, float p_deadzone) input_map[p_action].deadzone = p_deadzone; } -void InputMap::action_add_event(const StringName &p_action, const Ref &p_event) { - ERR_FAIL_COND_MSG(p_event.is_null(), "It's not a reference to a valid InputEvent object."); +void InputMap::action_add_event(const StringName &p_action, RequiredParam rp_event) { + EXTRACT_PARAM_OR_FAIL_MSG(p_event, rp_event, "It's not a reference to a valid InputEvent object."); ERR_FAIL_COND_MSG(!input_map.has(p_action), suggest_actions(p_action)); if (_find_event(input_map[p_action], p_event, true)) { return; // Already added. @@ -206,12 +206,14 @@ void InputMap::action_add_event(const StringName &p_action, const Ref &p_event) { +bool InputMap::action_has_event(const StringName &p_action, RequiredParam rp_event) { + EXTRACT_PARAM_OR_FAIL_V(p_event, rp_event, false); ERR_FAIL_COND_V_MSG(!input_map.has(p_action), false, suggest_actions(p_action)); return (_find_event(input_map[p_action], p_event, true) != nullptr); } -void InputMap::action_erase_event(const StringName &p_action, const Ref &p_event) { +void InputMap::action_erase_event(const StringName &p_action, RequiredParam rp_event) { + EXTRACT_PARAM_OR_FAIL(p_event, rp_event); ERR_FAIL_COND_MSG(!input_map.has(p_action), suggest_actions(p_action)); List>::Element *E = _find_event(input_map[p_action], p_event, true); @@ -251,7 +253,8 @@ const List> *InputMap::action_get_events(const StringName &p_act return &E->value.inputs; } -bool InputMap::event_is_action(const Ref &p_event, const StringName &p_action, bool p_exact_match) const { +bool InputMap::event_is_action(RequiredParam rp_event, const StringName &p_action, bool p_exact_match) const { + EXTRACT_PARAM_OR_FAIL_V(p_event, rp_event, false); return event_get_action_status(p_event, p_action, p_exact_match); } diff --git a/core/input/input_map.h b/core/input/input_map.h index aaea049cd3b..02fe15d1384 100644 --- a/core/input/input_map.h +++ b/core/input/input_map.h @@ -87,13 +87,13 @@ public: float action_get_deadzone(const StringName &p_action); void action_set_deadzone(const StringName &p_action, float p_deadzone); - void action_add_event(const StringName &p_action, const Ref &p_event); - bool action_has_event(const StringName &p_action, const Ref &p_event); - void action_erase_event(const StringName &p_action, const Ref &p_event); + void action_add_event(const StringName &p_action, RequiredParam p_event); + bool action_has_event(const StringName &p_action, RequiredParam p_event); + void action_erase_event(const StringName &p_action, RequiredParam p_event); void action_erase_events(const StringName &p_action); const List> *action_get_events(const StringName &p_action); - bool event_is_action(const Ref &p_event, const StringName &p_action, bool p_exact_match = false) const; + bool event_is_action(RequiredParam p_event, const StringName &p_action, bool p_exact_match = false) const; int event_get_index(const Ref &p_event, const StringName &p_action, bool p_exact_match = false) const; bool event_get_action_status(const Ref &p_event, const StringName &p_action, bool p_exact_match = false, bool *r_pressed = nullptr, float *r_strength = nullptr, float *r_raw_strength = nullptr, int *r_event_index = nullptr) const; diff --git a/core/object/make_virtuals.py b/core/object/make_virtuals.py index 818fb15f2d8..9ba6330c432 100644 --- a/core/object/make_virtuals.py +++ b/core/object/make_virtuals.py @@ -147,11 +147,9 @@ def generate_version(argcount, const=False, returns=False, required=False, compa callptrargsptr += ", " argtext += f"m_type{i + 1}" callargtext += f"m_type{i + 1} arg{i + 1}" - callsiargs += f"arg{i + 1}" + callsiargs += f"VariantInternal::make(arg{i + 1})" callsiargptrs += f"&vargs[{i}]" - callptrargs += ( - f"PtrToArg::EncodeT argval{i + 1} = (PtrToArg::EncodeT)arg{i + 1};\\\n" - ) + callptrargs += f"PtrToArg::EncodeT argval{i + 1}; PtrToArg::encode(arg{i + 1}, &argval{i + 1});\\\n" callptrargsptr += f"&argval{i + 1}" if argcount: diff --git a/core/variant/binder_common.h b/core/variant/binder_common.h index 08eb38eaac9..dbdb9bc7fe4 100644 --- a/core/variant/binder_common.h +++ b/core/variant/binder_common.h @@ -670,9 +670,9 @@ void call_with_variant_args_ret_helper(T *p_instance, R (T::*p_method)(P...), co r_error.error = Callable::CallError::CALL_OK; #ifdef DEBUG_ENABLED - r_ret = (p_instance->*p_method)(VariantCasterAndValidate

::cast(p_args, Is, r_error)...); + r_ret = VariantInternal::make((p_instance->*p_method)(VariantCasterAndValidate

::cast(p_args, Is, r_error)...)); #else - r_ret = (p_instance->*p_method)(VariantCaster

::cast(*p_args[Is])...); + r_ret = VariantInternal::make((p_instance->*p_method)(VariantCaster

::cast(*p_args[Is])...)); #endif } @@ -681,9 +681,9 @@ void call_with_variant_args_static_ret(R (*p_method)(P...), const Variant **p_ar r_error.error = Callable::CallError::CALL_OK; #ifdef DEBUG_ENABLED - r_ret = (p_method)(VariantCasterAndValidate

::cast(p_args, Is, r_error)...); + r_ret = VariantInternal::make((p_method)(VariantCasterAndValidate

::cast(p_args, Is, r_error)...)); #else - r_ret = (p_method)(VariantCaster

::cast(*p_args[Is])...); + r_ret = VariantInternal::make((p_method)(VariantCaster

::cast(*p_args[Is])...)); #endif // DEBUG_ENABLED } @@ -721,9 +721,9 @@ void call_with_variant_args_retc_helper(T *p_instance, R (T::*p_method)(P...) co r_error.error = Callable::CallError::CALL_OK; #ifdef DEBUG_ENABLED - r_ret = (p_instance->*p_method)(VariantCasterAndValidate

::cast(p_args, Is, r_error)...); + r_ret = VariantInternal::make((p_instance->*p_method)(VariantCasterAndValidate

::cast(p_args, Is, r_error)...)); #else - r_ret = (p_instance->*p_method)(VariantCaster

::cast(*p_args[Is])...); + r_ret = VariantInternal::make((p_instance->*p_method)(VariantCaster

::cast(*p_args[Is])...)); #endif // DEBUG_ENABLED (void)p_args; } @@ -787,9 +787,9 @@ void call_with_variant_args_retc_static_helper(T *p_instance, R (*p_method)(T *, r_error.error = Callable::CallError::CALL_OK; #ifdef DEBUG_ENABLED - r_ret = (p_method)(p_instance, VariantCasterAndValidate

::cast(p_args, Is, r_error)...); + r_ret = VariantInternal::make((p_method)(p_instance, VariantCasterAndValidate

::cast(p_args, Is, r_error)...)); #else - r_ret = (p_method)(p_instance, VariantCaster

::cast(*p_args[Is])...); + r_ret = VariantInternal::make((p_method)(p_instance, VariantCaster

::cast(*p_args[Is])...)); #endif // DEBUG_ENABLED (void)p_args; diff --git a/core/variant/method_ptrcall.h b/core/variant/method_ptrcall.h index a1a697dacc8..569dd892c8e 100644 --- a/core/variant/method_ptrcall.h +++ b/core/variant/method_ptrcall.h @@ -253,8 +253,8 @@ struct PtrToArg { return likely(p_ptr) ? *reinterpret_cast(p_ptr) : nullptr; } typedef Object *EncodeT; - _FORCE_INLINE_ static void encode(T *p_var, void *p_ptr) { - *((T **)p_ptr) = p_var; + _FORCE_INLINE_ static void encode(const T *p_var, void *p_ptr) { + *((T **)p_ptr) = const_cast(p_var); } }; @@ -264,8 +264,8 @@ struct PtrToArg { return likely(p_ptr) ? *reinterpret_cast(p_ptr) : nullptr; } typedef const Object *EncodeT; - _FORCE_INLINE_ static void encode(T *p_var, void *p_ptr) { - *((T **)p_ptr) = p_var; + _FORCE_INLINE_ static void encode(const T *p_var, void *p_ptr) { + *((T **)p_ptr) = const_cast(p_var); } }; diff --git a/core/variant/required_ptr.h b/core/variant/required_ptr.h index 5d75862ec0e..3f5154be84f 100644 --- a/core/variant/required_ptr.h +++ b/core/variant/required_ptr.h @@ -32,6 +32,9 @@ #include "core/variant/variant.h" +// Using `RequiredResult` as the return type indicates that null will only be returned in the case of an error. +// This allows GDExtension language bindings to use the appropriate error handling mechanism for that language +// when null is returned (for example, throwing an exception), rather than simply returning the value. template class RequiredResult { static_assert(!is_fully_defined_v || std::is_base_of_v, "T must be an Object subtype"); @@ -43,9 +46,9 @@ public: private: ptr_type _value = ptr_type(); +public: _FORCE_INLINE_ RequiredResult() = default; -public: RequiredResult(const RequiredResult &p_other) = default; RequiredResult(RequiredResult &&p_other) = default; RequiredResult &operator=(const RequiredResult &p_other) = default; @@ -123,12 +126,13 @@ public: return _value; } - _FORCE_INLINE_ operator ptr_type() { + _FORCE_INLINE_ operator ptr_type() const { return _value; } - _FORCE_INLINE_ operator Variant() const { - return Variant(_value); + template && std::is_base_of_v, int> = 0> + _FORCE_INLINE_ operator Ref() const { + return Ref(_value); } _FORCE_INLINE_ element_type *operator*() const { @@ -140,6 +144,10 @@ public: } }; +// Using `RequiredParam` as an argument type indicates that passing null as that parameter is an error, +// that will prevent the method from doing its intended function. +// This allows GDExtension bindings to use language-specific mechanisms to prevent users from passing null, +// because it is never valid to do so. template class RequiredParam { static_assert(!is_fully_defined_v || std::is_base_of_v, "T must be an Object subtype"); diff --git a/core/variant/variant_internal.h b/core/variant/variant_internal.h index 4d807ff8702..50205dcb5f7 100644 --- a/core/variant/variant_internal.h +++ b/core/variant/variant_internal.h @@ -40,6 +40,12 @@ class RefCounted; +template +struct GDExtensionConstPtr; + +template +struct GDExtensionPtr; + class VariantInternal { friend class Variant; @@ -539,6 +545,29 @@ public: } ERR_FAIL_V(nullptr); } + + // Used internally in GDExtension and Godot's binding system when converting to Variant + // from values that may include RequiredParam or RequiredResult. + template + _FORCE_INLINE_ static Variant make(const T &v) { + return Variant(v); + } + template + _FORCE_INLINE_ static Variant make(const GDExtensionConstPtr &v) { + return v.operator Variant(); + } + template + _FORCE_INLINE_ static Variant make(const GDExtensionPtr &v) { + return v.operator Variant(); + } + template + _FORCE_INLINE_ static Variant make(const RequiredParam &v) { + return Variant(v._internal_ptr_dont_use()); + } + template + _FORCE_INLINE_ static Variant make(const RequiredResult &v) { + return Variant(v._internal_ptr_dont_use()); + } }; template diff --git a/modules/godot_physics_2d/godot_body_direct_state_2d.cpp b/modules/godot_physics_2d/godot_body_direct_state_2d.cpp index 9c8bfdee650..3400229f76a 100644 --- a/modules/godot_physics_2d/godot_body_direct_state_2d.cpp +++ b/modules/godot_physics_2d/godot_body_direct_state_2d.cpp @@ -235,7 +235,7 @@ Vector2 GodotPhysicsDirectBodyState2D::get_contact_impulse(int p_contact_idx) co return body->contacts[p_contact_idx].impulse; } -PhysicsDirectSpaceState2D *GodotPhysicsDirectBodyState2D::get_space_state() { +RequiredResult GodotPhysicsDirectBodyState2D::get_space_state() { return body->get_space()->get_direct_state(); } diff --git a/modules/godot_physics_2d/godot_body_direct_state_2d.h b/modules/godot_physics_2d/godot_body_direct_state_2d.h index a39cee853d9..7afa6142881 100644 --- a/modules/godot_physics_2d/godot_body_direct_state_2d.h +++ b/modules/godot_physics_2d/godot_body_direct_state_2d.h @@ -101,7 +101,7 @@ public: virtual Vector2 get_contact_collider_velocity_at_position(int p_contact_idx) const override; virtual Vector2 get_contact_impulse(int p_contact_idx) const override; - virtual PhysicsDirectSpaceState2D *get_space_state() override; + virtual RequiredResult get_space_state() override; virtual real_t get_step() const override; }; diff --git a/modules/godot_physics_3d/godot_body_direct_state_3d.cpp b/modules/godot_physics_3d/godot_body_direct_state_3d.cpp index 36ea2ce7be7..a3529558570 100644 --- a/modules/godot_physics_3d/godot_body_direct_state_3d.cpp +++ b/modules/godot_physics_3d/godot_body_direct_state_3d.cpp @@ -244,7 +244,7 @@ Vector3 GodotPhysicsDirectBodyState3D::get_contact_collider_velocity_at_position return body->contacts[p_contact_idx].collider_velocity_at_pos; } -PhysicsDirectSpaceState3D *GodotPhysicsDirectBodyState3D::get_space_state() { +RequiredResult GodotPhysicsDirectBodyState3D::get_space_state() { return body->get_space()->get_direct_state(); } diff --git a/modules/godot_physics_3d/godot_body_direct_state_3d.h b/modules/godot_physics_3d/godot_body_direct_state_3d.h index b3b64f9049e..47970e3cc1c 100644 --- a/modules/godot_physics_3d/godot_body_direct_state_3d.h +++ b/modules/godot_physics_3d/godot_body_direct_state_3d.h @@ -104,7 +104,7 @@ public: virtual int get_contact_collider_shape(int p_contact_idx) const override; virtual Vector3 get_contact_collider_velocity_at_position(int p_contact_idx) const override; - virtual PhysicsDirectSpaceState3D *get_space_state() override; + virtual RequiredResult get_space_state() override; virtual real_t get_step() const override; }; diff --git a/modules/godot_physics_3d/godot_physics_server_3d.cpp b/modules/godot_physics_3d/godot_physics_server_3d.cpp index bd1c8fef6ef..66ca5ca223b 100644 --- a/modules/godot_physics_3d/godot_physics_server_3d.cpp +++ b/modules/godot_physics_3d/godot_physics_server_3d.cpp @@ -976,9 +976,10 @@ RID GodotPhysicsServer3D::soft_body_create() { return rid; } -void GodotPhysicsServer3D::soft_body_update_rendering_server(RID p_body, PhysicsServer3DRenderingServerHandler *p_rendering_server_handler) { +void GodotPhysicsServer3D::soft_body_update_rendering_server(RID p_body, RequiredParam rp_rendering_server_handler) { GodotSoftBody3D *soft_body = soft_body_owner.get_or_null(p_body); ERR_FAIL_NULL(soft_body); + EXTRACT_PARAM_OR_FAIL(p_rendering_server_handler, rp_rendering_server_handler); soft_body->update_rendering_server(p_rendering_server_handler); } diff --git a/modules/godot_physics_3d/godot_physics_server_3d.h b/modules/godot_physics_3d/godot_physics_server_3d.h index 5f0c8ddcd07..43e7c35f14b 100644 --- a/modules/godot_physics_3d/godot_physics_server_3d.h +++ b/modules/godot_physics_3d/godot_physics_server_3d.h @@ -263,7 +263,7 @@ public: virtual RID soft_body_create() override; - virtual void soft_body_update_rendering_server(RID p_body, PhysicsServer3DRenderingServerHandler *p_rendering_server_handler) override; + virtual void soft_body_update_rendering_server(RID p_body, RequiredParam p_rendering_server_handler) override; virtual void soft_body_set_space(RID p_body, RID p_space) override; virtual RID soft_body_get_space(RID p_body) const override; diff --git a/modules/jolt_physics/jolt_physics_server_3d.cpp b/modules/jolt_physics/jolt_physics_server_3d.cpp index 03aae01df05..cfb1f3b641b 100644 --- a/modules/jolt_physics/jolt_physics_server_3d.cpp +++ b/modules/jolt_physics/jolt_physics_server_3d.cpp @@ -985,9 +985,10 @@ RID JoltPhysicsServer3D::soft_body_create() { return rid; } -void JoltPhysicsServer3D::soft_body_update_rendering_server(RID p_body, PhysicsServer3DRenderingServerHandler *p_rendering_server_handler) { +void JoltPhysicsServer3D::soft_body_update_rendering_server(RID p_body, RequiredParam rp_rendering_server_handler) { JoltSoftBody3D *body = soft_body_owner.get_or_null(p_body); ERR_FAIL_NULL(body); + EXTRACT_PARAM_OR_FAIL(p_rendering_server_handler, rp_rendering_server_handler); return body->update_rendering_server(p_rendering_server_handler); } diff --git a/modules/jolt_physics/jolt_physics_server_3d.h b/modules/jolt_physics/jolt_physics_server_3d.h index c8d78a227d3..4695116055e 100644 --- a/modules/jolt_physics/jolt_physics_server_3d.h +++ b/modules/jolt_physics/jolt_physics_server_3d.h @@ -300,7 +300,7 @@ public: virtual RID soft_body_create() override; - virtual void soft_body_update_rendering_server(RID p_body, PhysicsServer3DRenderingServerHandler *p_rendering_server_handler) override; + virtual void soft_body_update_rendering_server(RID p_body, RequiredParam p_rendering_server_handler) override; virtual void soft_body_set_space(RID p_body, RID p_space) override; virtual RID soft_body_get_space(RID p_body) const override; diff --git a/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.cpp b/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.cpp index 4bfc23fa9eb..3b07d4ee760 100644 --- a/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.cpp +++ b/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.cpp @@ -256,6 +256,6 @@ void JoltPhysicsDirectBodyState3D::integrate_forces() { set_angular_velocity(angular_velocity); } -PhysicsDirectSpaceState3D *JoltPhysicsDirectBodyState3D::get_space_state() { +RequiredResult JoltPhysicsDirectBodyState3D::get_space_state() { return body->get_space()->get_direct_state(); } diff --git a/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.h b/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.h index 7a32494ce07..985394d2c86 100644 --- a/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.h +++ b/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.h @@ -115,5 +115,5 @@ public: virtual void integrate_forces() override; - virtual PhysicsDirectSpaceState3D *get_space_state() override; + virtual RequiredResult get_space_state() override; }; diff --git a/scene/2d/node_2d.cpp b/scene/2d/node_2d.cpp index 7ac698c9fcb..d07982fae7d 100644 --- a/scene/2d/node_2d.cpp +++ b/scene/2d/node_2d.cpp @@ -141,7 +141,7 @@ void Node2D::_update_transform() { _notify_transform(); } -void Node2D::reparent(Node *p_parent, bool p_keep_global_transform) { +void Node2D::reparent(RequiredParam p_parent, bool p_keep_global_transform) { ERR_THREAD_GUARD; if (p_keep_global_transform) { Transform2D temp = get_global_transform(); diff --git a/scene/2d/node_2d.h b/scene/2d/node_2d.h index be18ff82ce9..bcc8146696b 100644 --- a/scene/2d/node_2d.h +++ b/scene/2d/node_2d.h @@ -73,7 +73,7 @@ public: virtual void _edit_set_rect(const Rect2 &p_edit_rect) override; #endif - virtual void reparent(Node *p_parent, bool p_keep_global_transform = true) override; + virtual void reparent(RequiredParam p_parent, bool p_keep_global_transform = true) override; void set_position(const Point2 &p_pos); void set_rotation(real_t p_radians); diff --git a/scene/2d/physics/area_2d.cpp b/scene/2d/physics/area_2d.cpp index 3779078b9fa..d0a2deb314d 100644 --- a/scene/2d/physics/area_2d.cpp +++ b/scene/2d/physics/area_2d.cpp @@ -501,8 +501,8 @@ bool Area2D::has_overlapping_areas() const { return !area_map.is_empty(); } -bool Area2D::overlaps_area(Node *p_area) const { - ERR_FAIL_NULL_V(p_area, false); +bool Area2D::overlaps_area(RequiredParam rp_area) const { + EXTRACT_PARAM_OR_FAIL_V(p_area, rp_area, false); HashMap::ConstIterator E = area_map.find(p_area->get_instance_id()); if (!E) { return false; @@ -510,8 +510,8 @@ bool Area2D::overlaps_area(Node *p_area) const { return E->value.in_tree; } -bool Area2D::overlaps_body(Node *p_body) const { - ERR_FAIL_NULL_V(p_body, false); +bool Area2D::overlaps_body(RequiredParam rp_body) const { + EXTRACT_PARAM_OR_FAIL_V(p_body, rp_body, false); HashMap::ConstIterator E = body_map.find(p_body->get_instance_id()); if (!E) { return false; diff --git a/scene/2d/physics/area_2d.h b/scene/2d/physics/area_2d.h index b6f6288b661..2a3d99cebd6 100644 --- a/scene/2d/physics/area_2d.h +++ b/scene/2d/physics/area_2d.h @@ -185,8 +185,8 @@ public: bool has_overlapping_bodies() const; bool has_overlapping_areas() const; - bool overlaps_area(Node *p_area) const; - bool overlaps_body(Node *p_body) const; + bool overlaps_area(RequiredParam p_area) const; + bool overlaps_body(RequiredParam p_body) const; void set_audio_bus_override(bool p_override); bool is_overriding_audio_bus() const; diff --git a/scene/2d/physics/collision_object_2d.cpp b/scene/2d/physics/collision_object_2d.cpp index 802ef7c056c..e772c2270b7 100644 --- a/scene/2d/physics/collision_object_2d.cpp +++ b/scene/2d/physics/collision_object_2d.cpp @@ -418,9 +418,9 @@ Object *CollisionObject2D::shape_owner_get_owner(uint32_t p_owner) const { return ObjectDB::get_instance(shapes[p_owner].owner_id); } -void CollisionObject2D::shape_owner_add_shape(uint32_t p_owner, const Ref &p_shape) { +void CollisionObject2D::shape_owner_add_shape(uint32_t p_owner, RequiredParam rp_shape) { ERR_FAIL_COND(!shapes.has(p_owner)); - ERR_FAIL_COND(p_shape.is_null()); + EXTRACT_PARAM_OR_FAIL(p_shape, rp_shape); ShapeData &sd = shapes[p_owner]; ShapeData::Shape s; diff --git a/scene/2d/physics/collision_object_2d.h b/scene/2d/physics/collision_object_2d.h index 9264f421bf5..daba8168a2c 100644 --- a/scene/2d/physics/collision_object_2d.h +++ b/scene/2d/physics/collision_object_2d.h @@ -112,7 +112,7 @@ protected: virtual void _space_changed(const RID &p_new_space); - GDVIRTUAL3(_input_event, Viewport *, Ref, int) + GDVIRTUAL3(_input_event, RequiredParam, RequiredParam, int) GDVIRTUAL0(_mouse_enter) GDVIRTUAL0(_mouse_exit) GDVIRTUAL1(_mouse_shape_enter, int) @@ -154,7 +154,7 @@ public: void shape_owner_set_one_way_collision_margin(uint32_t p_owner, real_t p_margin); real_t get_shape_owner_one_way_collision_margin(uint32_t p_owner) const; - void shape_owner_add_shape(uint32_t p_owner, const Ref &p_shape); + void shape_owner_add_shape(uint32_t p_owner, RequiredParam p_shape); int shape_owner_get_shape_count(uint32_t p_owner) const; Ref shape_owner_get_shape(uint32_t p_owner, int p_shape) const; int shape_owner_get_shape_index(uint32_t p_owner, int p_shape) const; diff --git a/scene/2d/physics/physics_body_2d.cpp b/scene/2d/physics/physics_body_2d.cpp index ecdd1571bd7..f8313360ae1 100644 --- a/scene/2d/physics/physics_body_2d.cpp +++ b/scene/2d/physics/physics_body_2d.cpp @@ -156,15 +156,15 @@ TypedArray PhysicsBody2D::get_collision_exceptions() { return ret; } -void PhysicsBody2D::add_collision_exception_with(Node *p_node) { - ERR_FAIL_NULL(p_node); +void PhysicsBody2D::add_collision_exception_with(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL(p_node, rp_node); PhysicsBody2D *physics_body = Object::cast_to(p_node); ERR_FAIL_NULL_MSG(physics_body, "Collision exception only works between two nodes that inherit from PhysicsBody2D."); PhysicsServer2D::get_singleton()->body_add_collision_exception(get_rid(), physics_body->get_rid()); } -void PhysicsBody2D::remove_collision_exception_with(Node *p_node) { - ERR_FAIL_NULL(p_node); +void PhysicsBody2D::remove_collision_exception_with(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL(p_node, rp_node); PhysicsBody2D *physics_body = Object::cast_to(p_node); ERR_FAIL_NULL_MSG(physics_body, "Collision exception only works between two nodes that inherit from PhysicsBody2D."); PhysicsServer2D::get_singleton()->body_remove_collision_exception(get_rid(), physics_body->get_rid()); diff --git a/scene/2d/physics/physics_body_2d.h b/scene/2d/physics/physics_body_2d.h index c7929ba1a3d..56f55db2f96 100644 --- a/scene/2d/physics/physics_body_2d.h +++ b/scene/2d/physics/physics_body_2d.h @@ -54,6 +54,6 @@ public: Vector2 get_gravity() const; TypedArray get_collision_exceptions(); - void add_collision_exception_with(Node *p_node); //must be physicsbody - void remove_collision_exception_with(Node *p_node); + void add_collision_exception_with(RequiredParam p_node); //must be physicsbody + void remove_collision_exception_with(RequiredParam p_node); }; diff --git a/scene/2d/physics/ray_cast_2d.cpp b/scene/2d/physics/ray_cast_2d.cpp index 5759cf81313..af5268d958a 100644 --- a/scene/2d/physics/ray_cast_2d.cpp +++ b/scene/2d/physics/ray_cast_2d.cpp @@ -267,8 +267,8 @@ void RayCast2D::add_exception_rid(const RID &p_rid) { exclude.insert(p_rid); } -void RayCast2D::add_exception(const CollisionObject2D *p_node) { - ERR_FAIL_NULL_MSG(p_node, "The passed Node must be an instance of CollisionObject2D."); +void RayCast2D::add_exception(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL_MSG(p_node, rp_node, "The passed Node must be an instance of CollisionObject2D."); add_exception_rid(p_node->get_rid()); } @@ -276,8 +276,8 @@ void RayCast2D::remove_exception_rid(const RID &p_rid) { exclude.erase(p_rid); } -void RayCast2D::remove_exception(const CollisionObject2D *p_node) { - ERR_FAIL_NULL_MSG(p_node, "The passed Node must be an instance of CollisionObject2D."); +void RayCast2D::remove_exception(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL_MSG(p_node, rp_node, "The passed Node must be an instance of CollisionObject2D."); remove_exception_rid(p_node->get_rid()); } diff --git a/scene/2d/physics/ray_cast_2d.h b/scene/2d/physics/ray_cast_2d.h index 822e4f995de..6b53c6d0714 100644 --- a/scene/2d/physics/ray_cast_2d.h +++ b/scene/2d/physics/ray_cast_2d.h @@ -97,9 +97,9 @@ public: Vector2 get_collision_normal() const; void add_exception_rid(const RID &p_rid); - void add_exception(const CollisionObject2D *p_node); + void add_exception(RequiredParam p_node); void remove_exception_rid(const RID &p_rid); - void remove_exception(const CollisionObject2D *p_node); + void remove_exception(RequiredParam p_node); void clear_exceptions(); RayCast2D(); diff --git a/scene/2d/physics/rigid_body_2d.h b/scene/2d/physics/rigid_body_2d.h index edfdf216408..4655818ead6 100644 --- a/scene/2d/physics/rigid_body_2d.h +++ b/scene/2d/physics/rigid_body_2d.h @@ -141,7 +141,7 @@ protected: void _validate_property(PropertyInfo &p_property) const; - GDVIRTUAL1(_integrate_forces, PhysicsDirectBodyState2D *) + GDVIRTUAL1(_integrate_forces, RequiredParam) void _apply_body_mode(); diff --git a/scene/2d/physics/shape_cast_2d.cpp b/scene/2d/physics/shape_cast_2d.cpp index fedac014a53..042d79b7c18 100644 --- a/scene/2d/physics/shape_cast_2d.cpp +++ b/scene/2d/physics/shape_cast_2d.cpp @@ -347,8 +347,8 @@ void ShapeCast2D::add_exception_rid(const RID &p_rid) { exclude.insert(p_rid); } -void ShapeCast2D::add_exception(const CollisionObject2D *p_node) { - ERR_FAIL_NULL_MSG(p_node, "The passed Node must be an instance of CollisionObject2D."); +void ShapeCast2D::add_exception(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL_MSG(p_node, rp_node, "The passed Node must be an instance of CollisionObject2D."); add_exception_rid(p_node->get_rid()); } @@ -356,8 +356,8 @@ void ShapeCast2D::remove_exception_rid(const RID &p_rid) { exclude.erase(p_rid); } -void ShapeCast2D::remove_exception(const CollisionObject2D *p_node) { - ERR_FAIL_NULL_MSG(p_node, "The passed Node must be an instance of CollisionObject2D."); +void ShapeCast2D::remove_exception(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL_MSG(p_node, rp_node, "The passed Node must be an instance of CollisionObject2D."); remove_exception_rid(p_node->get_rid()); } diff --git a/scene/2d/physics/shape_cast_2d.h b/scene/2d/physics/shape_cast_2d.h index 0d23677888b..07972cefbd7 100644 --- a/scene/2d/physics/shape_cast_2d.h +++ b/scene/2d/physics/shape_cast_2d.h @@ -112,9 +112,9 @@ public: real_t get_closest_collision_unsafe_fraction() const; void add_exception_rid(const RID &p_rid); - void add_exception(const CollisionObject2D *p_node); + void add_exception(RequiredParam p_node); void remove_exception_rid(const RID &p_rid); - void remove_exception(const CollisionObject2D *p_node); + void remove_exception(RequiredParam p_node); void clear_exceptions(); PackedStringArray get_configuration_warnings() const override; diff --git a/scene/3d/node_3d.cpp b/scene/3d/node_3d.cpp index 6d2fc6e6720..67cde94a31c 100644 --- a/scene/3d/node_3d.cpp +++ b/scene/3d/node_3d.cpp @@ -1020,7 +1020,7 @@ void Node3D::set_disable_gizmos(bool p_enabled) { #endif } -void Node3D::reparent(Node *p_parent, bool p_keep_global_transform) { +void Node3D::reparent(RequiredParam p_parent, bool p_keep_global_transform) { ERR_THREAD_GUARD; if (p_keep_global_transform) { Transform3D temp = get_global_transform(); diff --git a/scene/3d/node_3d.h b/scene/3d/node_3d.h index 2936c8923e7..af7c53c94f2 100644 --- a/scene/3d/node_3d.h +++ b/scene/3d/node_3d.h @@ -289,7 +289,7 @@ public: virtual void set_transform_gizmo_visible(bool p_enabled) { data.transform_gizmo_visible = p_enabled; } virtual bool is_transform_gizmo_visible() const { return data.transform_gizmo_visible; } #endif - virtual void reparent(Node *p_parent, bool p_keep_global_transform = true) override; + virtual void reparent(RequiredParam p_parent, bool p_keep_global_transform = true) override; void set_disable_gizmos(bool p_enabled); void update_gizmos(); diff --git a/scene/3d/physics/area_3d.cpp b/scene/3d/physics/area_3d.cpp index eee27d396f7..4307777912e 100644 --- a/scene/3d/physics/area_3d.cpp +++ b/scene/3d/physics/area_3d.cpp @@ -568,8 +568,8 @@ bool Area3D::has_overlapping_areas() const { return !area_map.is_empty(); } -bool Area3D::overlaps_area(Node *p_area) const { - ERR_FAIL_NULL_V(p_area, false); +bool Area3D::overlaps_area(RequiredParam rp_area) const { + EXTRACT_PARAM_OR_FAIL_V(p_area, rp_area, false); HashMap::ConstIterator E = area_map.find(p_area->get_instance_id()); if (!E) { return false; @@ -577,8 +577,8 @@ bool Area3D::overlaps_area(Node *p_area) const { return E->value.in_tree; } -bool Area3D::overlaps_body(Node *p_body) const { - ERR_FAIL_NULL_V(p_body, false); +bool Area3D::overlaps_body(RequiredParam rp_body) const { + EXTRACT_PARAM_OR_FAIL_V(p_body, rp_body, false); HashMap::ConstIterator E = body_map.find(p_body->get_instance_id()); if (!E) { return false; diff --git a/scene/3d/physics/area_3d.h b/scene/3d/physics/area_3d.h index 1a7609684d1..22aca56e7b6 100644 --- a/scene/3d/physics/area_3d.h +++ b/scene/3d/physics/area_3d.h @@ -204,8 +204,8 @@ public: bool has_overlapping_bodies() const; bool has_overlapping_areas() const; - bool overlaps_area(Node *p_area) const; - bool overlaps_body(Node *p_body) const; + bool overlaps_area(RequiredParam p_area) const; + bool overlaps_body(RequiredParam p_body) const; void set_audio_bus_override(bool p_override); bool is_overriding_audio_bus() const; diff --git a/scene/3d/physics/collision_object_3d.cpp b/scene/3d/physics/collision_object_3d.cpp index 90449aa7ebd..b8a3fe47822 100644 --- a/scene/3d/physics/collision_object_3d.cpp +++ b/scene/3d/physics/collision_object_3d.cpp @@ -608,9 +608,9 @@ Object *CollisionObject3D::shape_owner_get_owner(uint32_t p_owner) const { return ObjectDB::get_instance(shapes[p_owner].owner_id); } -void CollisionObject3D::shape_owner_add_shape(uint32_t p_owner, const Ref &p_shape) { +void CollisionObject3D::shape_owner_add_shape(uint32_t p_owner, RequiredParam rp_shape) { ERR_FAIL_COND(!shapes.has(p_owner)); - ERR_FAIL_COND(p_shape.is_null()); + EXTRACT_PARAM_OR_FAIL(p_shape, rp_shape); ShapeData &sd = shapes[p_owner]; ShapeData::ShapeBase s; diff --git a/scene/3d/physics/collision_object_3d.h b/scene/3d/physics/collision_object_3d.h index 6fa539b03f9..24af2e15880 100644 --- a/scene/3d/physics/collision_object_3d.h +++ b/scene/3d/physics/collision_object_3d.h @@ -123,7 +123,7 @@ protected: void set_only_update_transform_changes(bool p_enable); bool is_only_update_transform_changes_enabled() const; - GDVIRTUAL5(_input_event, Camera3D *, Ref, Vector3, Vector3, int) + GDVIRTUAL5(_input_event, RequiredParam, RequiredParam, Vector3, Vector3, int) GDVIRTUAL0(_mouse_enter) GDVIRTUAL0(_mouse_exit) public: @@ -157,7 +157,7 @@ public: void shape_owner_set_disabled(uint32_t p_owner, bool p_disabled); bool is_shape_owner_disabled(uint32_t p_owner) const; - void shape_owner_add_shape(uint32_t p_owner, const Ref &p_shape); + void shape_owner_add_shape(uint32_t p_owner, RequiredParam p_shape); int shape_owner_get_shape_count(uint32_t p_owner) const; Ref shape_owner_get_shape(uint32_t p_owner, int p_shape) const; int shape_owner_get_shape_index(uint32_t p_owner, int p_shape) const; diff --git a/scene/3d/physics/physical_bone_3d.h b/scene/3d/physics/physical_bone_3d.h index 4ccbb02782e..e436a55ea61 100644 --- a/scene/3d/physics/physical_bone_3d.h +++ b/scene/3d/physics/physical_bone_3d.h @@ -197,7 +197,7 @@ protected: bool _get(const StringName &p_name, Variant &r_ret) const; void _get_property_list(List *p_list) const; void _notification(int p_what); - GDVIRTUAL1(_integrate_forces, PhysicsDirectBodyState3D *) + GDVIRTUAL1(_integrate_forces, RequiredParam) static void _body_state_changed_callback(void *p_instance, PhysicsDirectBodyState3D *p_state); void _body_state_changed(PhysicsDirectBodyState3D *p_state); diff --git a/scene/3d/physics/physics_body_3d.cpp b/scene/3d/physics/physics_body_3d.cpp index a958a95471d..a3f72a6003c 100644 --- a/scene/3d/physics/physics_body_3d.cpp +++ b/scene/3d/physics/physics_body_3d.cpp @@ -70,15 +70,15 @@ TypedArray PhysicsBody3D::get_collision_exceptions() { return ret; } -void PhysicsBody3D::add_collision_exception_with(Node *p_node) { - ERR_FAIL_NULL(p_node); +void PhysicsBody3D::add_collision_exception_with(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL(p_node, rp_node); CollisionObject3D *collision_object = Object::cast_to(p_node); ERR_FAIL_NULL_MSG(collision_object, "Collision exception only works between two nodes that inherit from CollisionObject3D (such as Area3D or PhysicsBody3D)."); PhysicsServer3D::get_singleton()->body_add_collision_exception(get_rid(), collision_object->get_rid()); } -void PhysicsBody3D::remove_collision_exception_with(Node *p_node) { - ERR_FAIL_NULL(p_node); +void PhysicsBody3D::remove_collision_exception_with(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL(p_node, rp_node); CollisionObject3D *collision_object = Object::cast_to(p_node); ERR_FAIL_NULL_MSG(collision_object, "Collision exception only works between two nodes that inherit from CollisionObject3D (such as Area3D or PhysicsBody3D)."); PhysicsServer3D::get_singleton()->body_remove_collision_exception(get_rid(), collision_object->get_rid()); diff --git a/scene/3d/physics/physics_body_3d.h b/scene/3d/physics/physics_body_3d.h index a492ecd1adb..fe51b8828e1 100644 --- a/scene/3d/physics/physics_body_3d.h +++ b/scene/3d/physics/physics_body_3d.h @@ -65,6 +65,6 @@ public: virtual real_t get_inverse_mass() const; TypedArray get_collision_exceptions(); - void add_collision_exception_with(Node *p_node); //must be physicsbody - void remove_collision_exception_with(Node *p_node); + void add_collision_exception_with(RequiredParam p_node); //must be physicsbody + void remove_collision_exception_with(RequiredParam p_node); }; diff --git a/scene/3d/physics/ray_cast_3d.cpp b/scene/3d/physics/ray_cast_3d.cpp index 4b988f69984..e71b734e1de 100644 --- a/scene/3d/physics/ray_cast_3d.cpp +++ b/scene/3d/physics/ray_cast_3d.cpp @@ -265,8 +265,8 @@ void RayCast3D::add_exception_rid(const RID &p_rid) { exclude.insert(p_rid); } -void RayCast3D::add_exception(const CollisionObject3D *p_node) { - ERR_FAIL_NULL_MSG(p_node, "The passed Node must be an instance of CollisionObject3D."); +void RayCast3D::add_exception(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL_MSG(p_node, rp_node, "The passed Node must be an instance of CollisionObject3D."); add_exception_rid(p_node->get_rid()); } @@ -274,8 +274,8 @@ void RayCast3D::remove_exception_rid(const RID &p_rid) { exclude.erase(p_rid); } -void RayCast3D::remove_exception(const CollisionObject3D *p_node) { - ERR_FAIL_NULL_MSG(p_node, "The passed Node must be an instance of CollisionObject3D."); +void RayCast3D::remove_exception(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL_MSG(p_node, rp_node, "The passed Node must be an instance of CollisionObject3D."); remove_exception_rid(p_node->get_rid()); } diff --git a/scene/3d/physics/ray_cast_3d.h b/scene/3d/physics/ray_cast_3d.h index c0fe0c945fd..2d85b3aa413 100644 --- a/scene/3d/physics/ray_cast_3d.h +++ b/scene/3d/physics/ray_cast_3d.h @@ -127,9 +127,9 @@ public: int get_collision_face_index() const; void add_exception_rid(const RID &p_rid); - void add_exception(const CollisionObject3D *p_node); + void add_exception(RequiredParam p_node); void remove_exception_rid(const RID &p_rid); - void remove_exception(const CollisionObject3D *p_node); + void remove_exception(RequiredParam p_node); void clear_exceptions(); RayCast3D(); diff --git a/scene/3d/physics/rigid_body_3d.h b/scene/3d/physics/rigid_body_3d.h index a10fa4604ee..43fe3175543 100644 --- a/scene/3d/physics/rigid_body_3d.h +++ b/scene/3d/physics/rigid_body_3d.h @@ -135,7 +135,7 @@ protected: void _validate_property(PropertyInfo &p_property) const; - GDVIRTUAL1(_integrate_forces, PhysicsDirectBodyState3D *) + GDVIRTUAL1(_integrate_forces, RequiredParam) virtual void _body_state_changed(PhysicsDirectBodyState3D *p_state); diff --git a/scene/3d/physics/shape_cast_3d.cpp b/scene/3d/physics/shape_cast_3d.cpp index 26b3ae4f9cc..ca7585fdd75 100644 --- a/scene/3d/physics/shape_cast_3d.cpp +++ b/scene/3d/physics/shape_cast_3d.cpp @@ -441,8 +441,8 @@ void ShapeCast3D::add_exception_rid(const RID &p_rid) { exclude.insert(p_rid); } -void ShapeCast3D::add_exception(const CollisionObject3D *p_node) { - ERR_FAIL_NULL_MSG(p_node, "The passed Node must be an instance of CollisionObject3D."); +void ShapeCast3D::add_exception(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL_MSG(p_node, rp_node, "The passed Node must be an instance of CollisionObject3D."); add_exception_rid(p_node->get_rid()); } @@ -450,8 +450,8 @@ void ShapeCast3D::remove_exception_rid(const RID &p_rid) { exclude.erase(p_rid); } -void ShapeCast3D::remove_exception(const CollisionObject3D *p_node) { - ERR_FAIL_NULL_MSG(p_node, "The passed Node must be an instance of CollisionObject3D."); +void ShapeCast3D::remove_exception(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL_MSG(p_node, rp_node, "The passed Node must be an instance of CollisionObject3D."); remove_exception_rid(p_node->get_rid()); } diff --git a/scene/3d/physics/shape_cast_3d.h b/scene/3d/physics/shape_cast_3d.h index 2c5a857d5f9..e0a8ee6557c 100644 --- a/scene/3d/physics/shape_cast_3d.h +++ b/scene/3d/physics/shape_cast_3d.h @@ -135,9 +135,9 @@ public: bool is_colliding() const; void add_exception_rid(const RID &p_rid); - void add_exception(const CollisionObject3D *p_node); + void add_exception(RequiredParam p_node); void remove_exception_rid(const RID &p_rid); - void remove_exception(const CollisionObject3D *p_node); + void remove_exception(RequiredParam p_node); void clear_exceptions(); virtual PackedStringArray get_configuration_warnings() const override; diff --git a/scene/3d/physics/soft_body_3d.cpp b/scene/3d/physics/soft_body_3d.cpp index 5112a4a0e27..f1ce62a549b 100644 --- a/scene/3d/physics/soft_body_3d.cpp +++ b/scene/3d/physics/soft_body_3d.cpp @@ -614,15 +614,15 @@ TypedArray SoftBody3D::get_collision_exceptions() { return ret; } -void SoftBody3D::add_collision_exception_with(Node *p_node) { - ERR_FAIL_NULL(p_node); +void SoftBody3D::add_collision_exception_with(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL(p_node, rp_node); CollisionObject3D *collision_object = Object::cast_to(p_node); ERR_FAIL_NULL_MSG(collision_object, "Collision exception only works between two nodes that inherit from CollisionObject3D (such as Area3D or PhysicsBody3D)."); PhysicsServer3D::get_singleton()->soft_body_add_collision_exception(physics_rid, collision_object->get_rid()); } -void SoftBody3D::remove_collision_exception_with(Node *p_node) { - ERR_FAIL_NULL(p_node); +void SoftBody3D::remove_collision_exception_with(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL(p_node, rp_node); CollisionObject3D *collision_object = Object::cast_to(p_node); ERR_FAIL_NULL_MSG(collision_object, "Collision exception only works between two nodes that inherit from CollisionObject3D (such as Area3D or PhysicsBody3D)."); PhysicsServer3D::get_singleton()->soft_body_remove_collision_exception(physics_rid, collision_object->get_rid()); diff --git a/scene/3d/physics/soft_body_3d.h b/scene/3d/physics/soft_body_3d.h index 3dacb2fcb32..7f7218f4ded 100644 --- a/scene/3d/physics/soft_body_3d.h +++ b/scene/3d/physics/soft_body_3d.h @@ -177,8 +177,8 @@ public: real_t get_drag_coefficient(); TypedArray get_collision_exceptions(); - void add_collision_exception_with(Node *p_node); - void remove_collision_exception_with(Node *p_node); + void add_collision_exception_with(RequiredParam p_node); + void remove_collision_exception_with(RequiredParam p_node); Vector3 get_point_transform(int p_point_index); diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp index 08c27247116..f2162d4d893 100644 --- a/scene/animation/tween.cpp +++ b/scene/animation/tween.cpp @@ -95,8 +95,8 @@ void Tween::_stop_internal(bool p_reset) { } } -RequiredResult Tween::tween_property(const Object *p_target, const NodePath &p_property, Variant p_to, double p_duration) { - ERR_FAIL_NULL_V(p_target, nullptr); +RequiredResult Tween::tween_property(RequiredParam rp_target, const NodePath &p_property, Variant p_to, double p_duration) { + EXTRACT_PARAM_OR_FAIL_V(p_target, rp_target, nullptr); CHECK_VALID(); Vector property_subnames = p_property.get_as_property_path().get_subnames(); @@ -149,11 +149,11 @@ RequiredResult Tween::tween_method(const Callable &p_callback, co return tweener; } -RequiredResult Tween::tween_subtween(const Ref &p_subtween) { +RequiredResult Tween::tween_subtween(RequiredParam rp_subtween) { CHECK_VALID(); // Ensure that the subtween being added is not null. - ERR_FAIL_COND_V(p_subtween.is_null(), nullptr); + EXTRACT_PARAM_OR_FAIL_V(p_subtween, rp_subtween, nullptr); Ref tweener; tweener.instantiate(p_subtween); @@ -221,8 +221,8 @@ void Tween::clear() { tweeners.clear(); } -RequiredResult Tween::bind_node(const Node *p_node) { - ERR_FAIL_NULL_V(p_node, this); +RequiredResult Tween::bind_node(RequiredParam rp_node) { + EXTRACT_PARAM_OR_FAIL_V(p_node, rp_node, this); bound_node = p_node->get_instance_id(); is_bound = true; diff --git a/scene/animation/tween.h b/scene/animation/tween.h index e4f77990139..e909d1aa3f3 100644 --- a/scene/animation/tween.h +++ b/scene/animation/tween.h @@ -143,11 +143,11 @@ protected: virtual String _to_string() override; public: - RequiredResult tween_property(const Object *p_target, const NodePath &p_property, Variant p_to, double p_duration); + RequiredResult tween_property(RequiredParam p_target, const NodePath &p_property, Variant p_to, double p_duration); RequiredResult tween_interval(double p_time); RequiredResult tween_callback(const Callable &p_callback); RequiredResult tween_method(const Callable &p_callback, const Variant p_from, Variant p_to, double p_duration); - RequiredResult tween_subtween(const Ref &p_subtween); + RequiredResult tween_subtween(RequiredParam p_subtween); void append(Ref p_tweener); bool custom_step(double p_delta); @@ -160,7 +160,7 @@ public: bool is_valid(); void clear(); - RequiredResult bind_node(const Node *p_node); + RequiredResult bind_node(RequiredParam p_node); RequiredResult set_process_mode(TweenProcessMode p_mode); TweenProcessMode get_process_mode() const; RequiredResult set_pause_mode(TweenPauseMode p_mode); diff --git a/scene/gui/container.cpp b/scene/gui/container.cpp index 6e67434a14c..81c7bb4dd79 100644 --- a/scene/gui/container.cpp +++ b/scene/gui/container.cpp @@ -92,8 +92,8 @@ void Container::_sort_children() { pending_sort = false; } -void Container::fit_child_in_rect(Control *p_child, const Rect2 &p_rect) { - ERR_FAIL_NULL(p_child); +void Container::fit_child_in_rect(RequiredParam rp_child, const Rect2 &p_rect) { + EXTRACT_PARAM_OR_FAIL(p_child, rp_child); ERR_FAIL_COND(p_child->get_parent() != this); bool rtl = is_layout_rtl(); diff --git a/scene/gui/container.h b/scene/gui/container.h index 8502b66f144..f928b1d5819 100644 --- a/scene/gui/container.h +++ b/scene/gui/container.h @@ -65,7 +65,7 @@ public: NOTIFICATION_SORT_CHILDREN = 51, }; - void fit_child_in_rect(Control *p_child, const Rect2 &p_rect); + void fit_child_in_rect(RequiredParam p_child, const Rect2 &p_rect); virtual Vector get_allowed_size_flags_horizontal() const; virtual Vector get_allowed_size_flags_vertical() const; diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index ecfdb28d963..edd83f3f39b 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -179,7 +179,7 @@ bool Control::_edit_use_rect() const { } #endif // DEBUG_ENABLED -void Control::reparent(Node *p_parent, bool p_keep_global_transform) { +void Control::reparent(RequiredParam p_parent, bool p_keep_global_transform) { ERR_MAIN_THREAD_GUARD; if (p_keep_global_transform) { Transform2D temp = get_global_transform(); @@ -3332,9 +3332,9 @@ bool Control::has_theme_constant(const StringName &p_name, const StringName &p_t /// Local property overrides. -void Control::add_theme_icon_override(const StringName &p_name, const Ref &p_icon) { +void Control::add_theme_icon_override(const StringName &p_name, RequiredParam rp_icon) { ERR_MAIN_THREAD_GUARD; - ERR_FAIL_COND(p_icon.is_null()); + EXTRACT_PARAM_OR_FAIL(p_icon, rp_icon); if (data.theme_icon_override.has(p_name)) { data.theme_icon_override[p_name]->disconnect_changed(callable_mp(this, &Control::_notify_theme_override_changed)); @@ -3345,9 +3345,9 @@ void Control::add_theme_icon_override(const StringName &p_name, const Ref &p_style) { +void Control::add_theme_style_override(const StringName &p_name, RequiredParam rp_style) { ERR_MAIN_THREAD_GUARD; - ERR_FAIL_COND(p_style.is_null()); + EXTRACT_PARAM_OR_FAIL(p_style, rp_style); if (data.theme_style_override.has(p_name)) { data.theme_style_override[p_name]->disconnect_changed(callable_mp(this, &Control::_notify_theme_override_changed)); @@ -3358,9 +3358,9 @@ void Control::add_theme_style_override(const StringName &p_name, const Ref