From 9e660475a7f54978aab195f8ef55d9fa1ad47299 Mon Sep 17 00:00:00 2001 From: PouleyKetchoupp Date: Thu, 14 Jan 2021 15:52:01 -0700 Subject: [PATCH] Improve Raycast3D render debug Fix Raycast3D 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 --- scene/3d/ray_cast_3d.cpp | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/scene/3d/ray_cast_3d.cpp b/scene/3d/ray_cast_3d.cpp index 59b59c71637..0b7c15a023a 100644 --- a/scene/3d/ray_cast_3d.cpp +++ b/scene/3d/ray_cast_3d.cpp @@ -148,14 +148,14 @@ void RayCast3D::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: { if (enabled && !Engine::get_singleton()->is_editor_hint()) { set_physics_process_internal(true); - - if (get_tree()->is_debugging_collisions_hint()) { - _update_debug_shape(); - } } else { set_physics_process_internal(false); } + if (get_tree()->is_debugging_collisions_hint()) { + _update_debug_shape(); + } + if (Object::cast_to(get_parent())) { if (exclude_parent_body) { exclude.insert(Object::cast_to(get_parent())->get_rid()); @@ -348,23 +348,32 @@ void RayCast3D::_update_debug_shape() { } MeshInstance3D *mi = static_cast(debug_shape); - if (!mi->get_mesh().is_valid()) { + Ref mesh = mi->get_mesh(); + if (!mesh.is_valid()) { return; } - Ref mesh = mi->get_mesh(); - mesh->clear_surfaces(); - - Array a; - a.resize(Mesh::ARRAY_MAX); - Vector verts; verts.push_back(Vector3()); verts.push_back(target_position); - 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(), Dictionary(), flags); + mesh->surface_set_material(0, debug_material); + } else { + Vector byte_array; + int array_size = sizeof(Vector3) * verts.size(); + byte_array.resize(array_size); + copymem(byte_array.ptrw(), verts.ptr(), array_size); + + RS::get_singleton()->mesh_surface_update_region(mesh->get_rid(), 0, 0, byte_array); + } } void RayCast3D::_clear_debug_shape() {