Improve Raycast render debug

Fix Raycast node render debug not showing in editor camera preview.

Use dynamic mesh update to change the ray on-the-fly without too much
extra cost when collision debug is enabled.

Fixes #43571
This commit is contained in:
PouleyKetchoupp 2021-01-14 15:51:22 -07:00
parent 652105dcdd
commit 37ef04c986

View file

@ -153,11 +153,13 @@ void RayCast::_notification(int p_what) {
if (enabled && !Engine::get_singleton()->is_editor_hint()) {
set_physics_process_internal(true);
if (get_tree()->is_debugging_collisions_hint())
_update_debug_shape();
} else
} else {
set_physics_process_internal(false);
}
if (get_tree()->is_debugging_collisions_hint()) {
_update_debug_shape();
}
if (Object::cast_to<CollisionObject>(get_parent())) {
if (exclude_parent_body)
@ -359,23 +361,32 @@ void RayCast::_update_debug_shape() {
_create_debug_shape();
MeshInstance *mi = static_cast<MeshInstance *>(debug_shape);
if (!mi->get_mesh().is_valid())
return;
Ref<ArrayMesh> mesh = mi->get_mesh();
if (mesh->get_surface_count() > 0)
mesh->surface_remove(0);
Array a;
a.resize(Mesh::ARRAY_MAX);
if (!mesh.is_valid())
return;
Vector<Vector3> verts;
verts.push_back(Vector3());
verts.push_back(cast_to);
a[Mesh::ARRAY_VERTEX] = verts;
mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, a);
mesh->surface_set_material(0, debug_material);
if (mesh->get_surface_count() == 0) {
Array a;
a.resize(Mesh::ARRAY_MAX);
a[Mesh::ARRAY_VERTEX] = verts;
uint32_t flags = Mesh::ARRAY_FLAG_USE_DYNAMIC_UPDATE;
mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, a, Array(), flags);
mesh->surface_set_material(0, debug_material);
} else {
PoolByteArray byte_array;
int array_size = sizeof(Vector3) * verts.size();
byte_array.resize(array_size);
PoolByteArray::Write w = byte_array.write();
copymem(w.ptr(), verts.ptr(), array_size);
VS::get_singleton()->mesh_surface_update_region(mesh->get_rid(), 0, 0, byte_array);
}
}
void RayCast::_clear_debug_shape() {