CharacterBody2D colliding with a CollisionObject queued for deletion causes a crash
jjanella opened this issue · 1 comments
jjanella commented
Description
CharacterBody2D colliding with a CollisionObject queued for deletion causes the project to crash
To Reproduce
Steps to reproduce the behavior:
- Install Rapier Engine
- Collide a CharactedBody2D with a node queued for deletion using
move_and_slide()
- The project crashes
Expected behavior
CharacterBody2D colliding with CollisionObject queued for deletion should not cause a crash, and does not crash with the default physics engine.
Environment (please complete the following information):
- OS: Arch Linux
- Version 0.6.18
- Godot Version 4.2.2
- Type SIMD
Example project
Open a new project using Rapier physics and insert this code into a Node2D
extends Node2D
var plat: StaticBody2D
var body: CharacterBody2D
# To see whats going on go to debug -> visible collision shapes on
func _ready():
# Add a character body to the scene
add_char_body()
plat = StaticBody2D.new()
plat.add_child(CollisionPolygon2D.new())
add_child(plat)
func add_char_body():
body = CharacterBody2D.new()
var cb = RectangleShape2D.new()
cb.size = Vector2(10, 10)
var shape = CollisionShape2D.new()
shape.shape = cb
body.add_child(shape)
body.global_position = Vector2(150, 50)
add_child(body)
func _physics_process(delta):
body.velocity += Vector2(0, 100) * delta
body.move_and_slide() # The line that causes the crash
# Reset the platforms shape
plat.get_child(0).queue_free()
var pg = CollisionPolygon2D.new()
pg.polygon = [Vector2(100, 100), Vector2(200, 100), Vector2(200, 110), Vector2(100, 110)]
plat.add_child(pg)
Result from running Godot from the terminal:
ERROR: FATAL: Index p_index = 1 is out of bounds ((int)shapes.size() = 1).
at: get_shape (src/servers/../bodies/rapier_collision_object_2d.h:94)
================================================================
handle_crash: Program crashed with signal 4
Engine version: Godot Engine v4.2.2.stable.arch_linux
Dumping the backtrace. Please include this when reporting the bug to the project developer.
[1] /usr/lib/libc.so.6(+0x3ce20) [0x7ab1bb658e20] (??:0)
[2] RapierBodyUtils2D::body_motion_recover(RapierSpace2D const&, RapierBody2D&, godot::Transform2D&, godot::Vector2 const&, float, godot::Vector2&) (??:0)
[3] RapierSpace2D::test_body_motion(RapierBody2D*, godot::Transform2D const&, godot::Vector2 const&, double, bool, bool, godot::PhysicsServer2DExtensionMotionResult*) const (??:0)
[4] RapierPhysicsServer2D::_body_test_motion(godot::RID const&, godot::Transform2D const&, godot::Vector2 const&, double, bool, bool, godot::PhysicsServer2DExtensionMotionResult*) const (??:0)
[5] godot::PhysicsServer2DExtension::register_virtuals<RapierPhysicsServer2D, godot::PhysicsServer2DExtension>()::{lambda(void*, void const* const*, void*)#112}::_FUN(void*, void const* const*, void*) (??:0)
[6] /usr/bin/godot(+0x30a57bf) [0x5ef85a8247bf] (??:?)
[7] /usr/bin/godot(+0x238bbc8) [0x5ef859b0abc8] (??:?)
[8] /usr/bin/godot(+0x238c3ce) [0x5ef859b0b3ce] (??:?)
[9] /usr/bin/godot(+0x1b1662) [0x5ef857930662] (??:?)
[10] /usr/bin/godot(+0x3b86e6) [0x5ef857b376e6] (??:?)
[11] /usr/bin/godot(+0x2a8adf) [0x5ef857a27adf] (??:?)
[12] /usr/bin/godot(+0x1c9256c) [0x5ef85941156c] (??:?)
[13] /usr/bin/godot(+0x23c2538) [0x5ef859b41538] (??:?)
[14] /usr/bin/godot(+0x384fe98) [0x5ef85afcee98] (??:?)
[15] /usr/bin/godot(+0x1cad4f0) [0x5ef85942c4f0] (??:?)
[16] /usr/bin/godot(+0x1cdd267) [0x5ef85945c267] (??:?)
[17] /usr/bin/godot(+0x1ce33f1) [0x5ef8594623f1] (??:?)
[18] /usr/bin/godot(+0x17d581) [0x5ef8578fc581] (??:?)
[19] /usr/bin/godot(+0x90c2e) [0x5ef85780fc2e] (??:?)
[20] /usr/lib/libc.so.6(+0x25d4a) [0x7ab1bb641d4a] (??:0)
[21] /usr/lib/libc.so.6(__libc_start_main+0x8c) [0x7ab1bb641e0c] (??:0)
[22] /usr/bin/godot(+0x9d8a5) [0x5ef85781c8a5] (??:?)
-- END OF BACKTRACE --
================================================================```
jjanella commented
I should note this doesn't crash with regular rigid body collisions, I believe it is unique to the move_and_slide()
method of CharacterBody2D.