Skip to content

Commit 4e1ed6b

Browse files
committed
Merge pull request godotengine#90668 from timothyqiu/owner-id
Store `ObjectID` instead of pointer for KinematicCollision owner
2 parents 88033ea + 4176102 commit 4e1ed6b

12 files changed

+8
-44
lines changed

scene/2d/physics/character_body_2d.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@ Ref<KinematicCollision2D> CharacterBody2D::_get_slide_collision(int p_bounce) {
501501
// Create a new instance when the cached reference is invalid or still in use in script.
502502
if (slide_colliders[p_bounce].is_null() || slide_colliders[p_bounce]->get_reference_count() > 1) {
503503
slide_colliders.write[p_bounce].instantiate();
504-
slide_colliders.write[p_bounce]->owner = this;
504+
slide_colliders.write[p_bounce]->owner_id = get_instance_id();
505505
}
506506

507507
slide_colliders.write[p_bounce]->result = motion_results[p_bounce];
@@ -745,11 +745,3 @@ void CharacterBody2D::_bind_methods() {
745745
CharacterBody2D::CharacterBody2D() :
746746
PhysicsBody2D(PhysicsServer2D::BODY_MODE_KINEMATIC) {
747747
}
748-
749-
CharacterBody2D::~CharacterBody2D() {
750-
for (int i = 0; i < slide_colliders.size(); i++) {
751-
if (slide_colliders[i].is_valid()) {
752-
slide_colliders.write[i]->owner = nullptr;
753-
}
754-
}
755-
}

scene/2d/physics/character_body_2d.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ class CharacterBody2D : public PhysicsBody2D {
111111
PlatformOnLeave get_platform_on_leave() const;
112112

113113
CharacterBody2D();
114-
~CharacterBody2D();
115114

116115
private:
117116
real_t margin = 0.08;

scene/2d/physics/kinematic_collision_2d.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ real_t KinematicCollision2D::get_depth() const {
5959
}
6060

6161
Object *KinematicCollision2D::get_local_shape() const {
62+
PhysicsBody2D *owner = Object::cast_to<PhysicsBody2D>(ObjectDB::get_instance(owner_id));
6263
if (!owner) {
6364
return nullptr;
6465
}

scene/2d/physics/kinematic_collision_2d.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class PhysicsBody2D;
4040
class KinematicCollision2D : public RefCounted {
4141
GDCLASS(KinematicCollision2D, RefCounted);
4242

43-
PhysicsBody2D *owner = nullptr;
43+
ObjectID owner_id;
4444
friend class PhysicsBody2D;
4545
friend class CharacterBody2D;
4646
PhysicsServer2D::MotionResult result;

scene/2d/physics/physics_body_2d.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030

3131
#include "physics_body_2d.h"
3232

33-
#include "scene/scene_string_names.h"
34-
3533
void PhysicsBody2D::_bind_methods() {
3634
ClassDB::bind_method(D_METHOD("move_and_collide", "motion", "test_only", "safe_margin", "recovery_as_collision"), &PhysicsBody2D::_move, DEFVAL(false), DEFVAL(0.08), DEFVAL(false));
3735
ClassDB::bind_method(D_METHOD("test_move", "from", "motion", "collision", "safe_margin", "recovery_as_collision"), &PhysicsBody2D::test_move, DEFVAL(Variant()), DEFVAL(0.08), DEFVAL(false));
@@ -48,12 +46,6 @@ PhysicsBody2D::PhysicsBody2D(PhysicsServer2D::BodyMode p_mode) :
4846
set_pickable(false);
4947
}
5048

51-
PhysicsBody2D::~PhysicsBody2D() {
52-
if (motion_cache.is_valid()) {
53-
motion_cache->owner = nullptr;
54-
}
55-
}
56-
5749
Ref<KinematicCollision2D> PhysicsBody2D::_move(const Vector2 &p_motion, bool p_test_only, real_t p_margin, bool p_recovery_as_collision) {
5850
PhysicsServer2D::MotionParameters parameters(get_global_transform(), p_motion, p_margin);
5951
parameters.recovery_as_collision = p_recovery_as_collision;
@@ -64,7 +56,7 @@ Ref<KinematicCollision2D> PhysicsBody2D::_move(const Vector2 &p_motion, bool p_t
6456
// Create a new instance when the cached reference is invalid or still in use in script.
6557
if (motion_cache.is_null() || motion_cache->get_reference_count() > 1) {
6658
motion_cache.instantiate();
67-
motion_cache->owner = this;
59+
motion_cache->owner_id = get_instance_id();
6860
}
6961

7062
motion_cache->result = result;

scene/2d/physics/physics_body_2d.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ class PhysicsBody2D : public CollisionObject2D {
5656
TypedArray<PhysicsBody2D> get_collision_exceptions();
5757
void add_collision_exception_with(Node *p_node); //must be physicsbody
5858
void remove_collision_exception_with(Node *p_node);
59-
60-
virtual ~PhysicsBody2D();
6159
};
6260

6361
#endif // PHYSICS_BODY_2D_H

scene/3d/physics/character_body_3d.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,7 @@ Ref<KinematicCollision3D> CharacterBody3D::_get_slide_collision(int p_bounce) {
704704
// Create a new instance when the cached reference is invalid or still in use in script.
705705
if (slide_colliders[p_bounce].is_null() || slide_colliders[p_bounce]->get_reference_count() > 1) {
706706
slide_colliders.write[p_bounce].instantiate();
707-
slide_colliders.write[p_bounce]->owner = this;
707+
slide_colliders.write[p_bounce]->owner_id = get_instance_id();
708708
}
709709

710710
slide_colliders.write[p_bounce]->result = motion_results[p_bounce];
@@ -936,11 +936,3 @@ void CharacterBody3D::_validate_property(PropertyInfo &p_property) const {
936936
CharacterBody3D::CharacterBody3D() :
937937
PhysicsBody3D(PhysicsServer3D::BODY_MODE_KINEMATIC) {
938938
}
939-
940-
CharacterBody3D::~CharacterBody3D() {
941-
for (int i = 0; i < slide_colliders.size(); i++) {
942-
if (slide_colliders[i].is_valid()) {
943-
slide_colliders.write[i]->owner = nullptr;
944-
}
945-
}
946-
}

scene/3d/physics/character_body_3d.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ class CharacterBody3D : public PhysicsBody3D {
113113
PlatformOnLeave get_platform_on_leave() const;
114114

115115
CharacterBody3D();
116-
~CharacterBody3D();
117116

118117
private:
119118
real_t margin = 0.001;

scene/3d/physics/kinematic_collision_3d.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ real_t KinematicCollision3D::get_angle(int p_collision_index, const Vector3 &p_u
6767

6868
Object *KinematicCollision3D::get_local_shape(int p_collision_index) const {
6969
ERR_FAIL_INDEX_V(p_collision_index, result.collision_count, nullptr);
70+
PhysicsBody3D *owner = Object::cast_to<PhysicsBody3D>(ObjectDB::get_instance(owner_id));
7071
if (!owner) {
7172
return nullptr;
7273
}

scene/3d/physics/kinematic_collision_3d.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class PhysicsBody3D;
4040
class KinematicCollision3D : public RefCounted {
4141
GDCLASS(KinematicCollision3D, RefCounted);
4242

43-
PhysicsBody3D *owner = nullptr;
43+
ObjectID owner_id;
4444
friend class PhysicsBody3D;
4545
friend class CharacterBody3D;
4646
PhysicsServer3D::MotionResult result;

0 commit comments

Comments
 (0)