A project I'm working relies on procedurally editing CollisionShapes. For debugging purposes, it is obviously very helpful if I can see where godot currently "thinks" each CollisionShape's boundary lies. As an example, I have a seen with 9 2x2 objects in it, each of which is composed of a StaticBody with two children, a 2x2x2 CubeMesh MeshInstance, and ConvexPolygonShape CollisionShape.
The CollisionShape's shape I set in a script. e.g., in a minimal working example:
targetRB = $TestColliders/TestFloor
targetCS = $TestColliders/TestFloor/CollisionShape
var points = 
points.append(Vector3(1.0, 1.0, 1.0))
points.append(Vector3(1.0, 1.0, -1.0))
points.append(Vector3(1.0, -1.0, 1.0))
points.append(Vector3(-1.0, 1.0, 1.0))
points.append(Vector3(-1.0, -1.0, -1.0))
points.append(Vector3(-1.0, -1.0, 1.0))
points.append(Vector3(-1.0, 1.0, -1.0))
points.append(Vector3(1.0, -1.0, -1.0))
for i in range(len(targetCS.shape.points)):
targetCS.shape.points[i] += points[i]# + 2.0*Vector3.BACK
targetRB.translation += 1.0 * Vector3.BACK
This does appear to correctly change the CollisionShape data. If I uncomment the
+ 2.0*Vector3.BACK snippet and play this scene, and move a KinematicBody player around a bit, then I now fall through the space previously occupied by that CollisionShape, but can stand on what now looks like thin air if I move 2 units "back" in space.
Unfortunately, the "Visible Collision Shape" outline still stays in the same place it was at before I altered the CollisionShape's points in my script, so I now have to "just know" that the shape was moved (and have to correctly account for parenting relationships, rotation, scale, etc myself, which can be a bit tricky without a clear visual indicator to work with, especially as I haven't found much useful documentation on how these work internally, and some of the behavior has surprised me).
Curiously, I have noticed that this behavior isn't universal: if I save my CollisionShape as a separate scene and load it (with no node as its parent when loaded and instanced), change its shape in a script, and then, also by script, add it as a child of a StaticBody, then the Visible Collision Shape indicator appears to correctly update. I thought maybe I could exploit this to properly update the visual indicators by procedurally invoking
remove_child (which is why this appears in the example script above), changing the collision shape, and then calling
add_child again, but this doesn't seem to "reset" the visual indicator as I'd hoped. The behavior is the same whether I invoke these or leave them out: in either case, the CollisionShape data clearly alters (as reflected in moving the player around and running into the CollisionShape in its new location), but the visual indicator fails to reflect this.
Is there any way to force Visible Collision Shapes to re-render correctly each time they are updated, even when parented to other nodes? Or, failing that, any way to force them to visually update by un-parenting and re-parenting or something similar?