116class DebugDraw3D :
public Object,
public IScopeStorage<DebugDraw3DScopeConfig, DebugDraw3DScopeConfig::Data> {
117 GDCLASS(DebugDraw3D, Object)
119 friend DebugDrawManager;
121#ifndef DISABLE_DEBUG_RENDERING
122 friend DebugGeometryContainer;
123 friend NodesContainer;
124 friend _DD3D_WorldWatcher;
139 String root_settings_section;
140 const static char *s_use_icosphere;
141 const static char *s_use_icosphere_hd;
142 const static char *s_add_bevel_to_volumetric;
143 const static char *s_default_frustum_scale;
145 const static char *s_default_thickness;
146 const static char *s_default_center_brightness;
147 const static char *s_default_hd_spheres;
148 const static char *s_default_plane_size;
150 const static char *s_render_priority;
151 const static char *s_render_mode;
152 const static char *s_render_fog_disabled;
154 std::vector<SubViewport *> custom_editor_viewports;
157 Ref<DebugDraw3DScopeConfig> default_scoped_config;
159#ifndef DISABLE_DEBUG_RENDERING
160 ProfiledMutex(std::recursive_mutex, datalock,
"3D Geometry lock");
162 struct ScopedPairIdConfig {
166 id(id), scfg(scfg) {}
169 std::unordered_map<uint64_t, std::vector<ScopedPairIdConfig> > scoped_configs;
171 std::unordered_map<uint64_t, std::shared_ptr<DebugDraw3DScopeConfig::Data> > cached_scoped_configs;
172 uint64_t created_scoped_configs = 0;
176 } scoped_stats_3d = {};
179 const DebugDraw3DScopeConfig::Data *scoped_config_for_current_thread()
override;
183 std::vector<std::array<Ref<ArrayMesh>, (int)MeshMaterialVariant::MAX> > shared_generated_meshes;
186 struct ViewportToDebugContainerItem {
188 _DD3D_WorldWatcher *world_watcher;
189 std::unique_ptr<DebugGeometryContainer> dgcs[(int)MeshMaterialVariant::MAX];
190 std::unique_ptr<NodesContainer> ncs[(int)MeshMaterialVariant::MAX];
192 ViewportToDebugContainerItem();
193 ViewportToDebugContainerItem(ViewportToDebugContainerItem &&other)
noexcept;
194 ~ViewportToDebugContainerItem();
197 std::unordered_map<uint64_t , ViewportToDebugContainerItem> debug_containers;
199 std::unordered_map<const Viewport *, ViewportToDebugContainerItem *> viewport_to_world_cache;
200 std::unordered_map<uint64_t , Ref<World3D> > world3ds_found_for_threads_сache;
203 Ref<ShaderMaterial> mesh_shaders[(int)MeshMaterialType::MAX][(
int)MeshMaterialVariant::MAX];
206 void _register_scoped_config(uint64_t p_thread_id, uint64_t p_guard_id, DebugDraw3DScopeConfig *p_cfg)
override;
207 void _unregister_scoped_config(uint64_t p_thread_id, uint64_t p_guard_id)
override;
208 void _clear_scoped_configs()
override;
210 std::array<Ref<ArrayMesh>, (int)MeshMaterialVariant::MAX> *get_shared_meshes();
211 DebugDraw3D::ViewportToDebugContainerItem *get_debug_container(
const DebugDraw3DScopeConfig::DebugContainerDependent &p_dgcd,
const bool p_generate_new_container);
212 void _deferred_find_world_in_viewport(uint64_t p_viewport_id);
213 void _register_viewport_world_deferred(uint64_t p_viewport_id,
const uint64_t p_world_id, _DD3D_WorldWatcher *watcher);
214 Node *_get_root_world_node(Node *p_scene_root, Viewport *p_vp);
215 void _remove_debug_container(
const uint64_t &p_world_id);
217 _FORCE_INLINE_ Vector3 get_up_vector(
const Vector3 &p_dir);
218 void add_or_update_line_with_thickness(real_t p_exp_time, std::unique_ptr<Vector3[]> p_lines,
const size_t p_line_count,
const Color &p_col,
const std::function<
void(DelayedRendererLine *)> p_custom_upd =
nullptr);
219 Node *get_root_node();
221 void create_arrow(
const Vector3 &p_a,
const Vector3 &p_b,
const Color &p_color,
const real_t &p_arrow_size,
const bool &p_is_absolute_size,
const real_t &p_duration = 0);
224 void _save_generated_meshes();
229 void init(DebugDrawManager *p_root);
231 void set_custom_editor_viewport(std::vector<SubViewport *> p_viewports);
232 std::vector<SubViewport *> get_custom_editor_viewports();
234 Ref<ShaderMaterial> get_material_variant(MeshMaterialType p_type, MeshMaterialVariant p_var);
236 void _load_materials();
237 inline bool _is_enabled_override()
const;
239 void process_start(
double delta);
240 void process_end(
double delta);
241 void physics_process_start(
double p_delta);
242 void physics_process_end(
double p_delta);
244#pragma region Exposed Parameter Values
247 bool debug_enabled =
true;
249 Ref<DebugDraw3DConfig> config;
255 static void _bind_methods();
268#pragma region Configs
295#pragma region Exposed Parameters
297 void set_empty_color(
const Color &col) {};
307 bool is_debug_enabled()
const;
311#pragma region Exposed Draw Methods
327#ifndef DISABLE_DEBUG_RENDERING
328#define FAKE_FUNC_IMPL
330#define FAKE_FUNC_IMPL \
347#pragma region Spheres
350 void draw_sphere_base(
const Transform3D &transform,
const Color &color = Colors::empty_color,
const real_t &duration = 0) FAKE_FUNC_IMPL;
361 void draw_sphere(const Vector3 &position, const real_t &radius = 0.5f, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
371 void draw_sphere_xf(const Transform3D &transform, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
375#pragma region Cylinders
386 void draw_cylinder(
const Transform3D &transform,
const Color &color = Colors::empty_color,
const real_t &duration = 0) FAKE_FUNC_IMPL;
399 void draw_cylinder_ab(const Vector3 &a, const Vector3 &b, const real_t &radius = 0.5f, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
419 void draw_box(
const Vector3 &position,
const Quaternion &rotation,
const Vector3 &size,
const Color &color = Colors::empty_color,
const bool &is_box_centered =
false,
const real_t &duration = 0) FAKE_FUNC_IMPL;
435 void draw_box_ab(const Vector3 &a, const Vector3 &b, const Vector3 &up, const Color &color = Colors::empty_color, const
bool &is_ab_diagonal = true, const real_t &duration = 0) FAKE_FUNC_IMPL;
445 void draw_box_xf(const Transform3D &transform, const Color &color = Colors::empty_color, const
bool &is_box_centered = true, const real_t &duration = 0) FAKE_FUNC_IMPL;
454 void draw_aabb(const AABB &aabb, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
464 void draw_aabb_ab(const Vector3 &a, const Vector3 &b, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
486 void draw_line_hit(
const Vector3 &start,
const Vector3 &end,
const Vector3 &hit,
const bool &is_hit,
const real_t &hit_size = 0.25f,
const Color &hit_color = Colors::empty_color,
const Color &after_hit_color = Colors::empty_color,
const real_t &duration = 0) FAKE_FUNC_IMPL;
504 void draw_line_hit_offset(const Vector3 &start, const Vector3 &end, const
bool &is_hit, const real_t &unit_offset_of_hit = 0.5f, const real_t &hit_size = 0.25f, const Color &hit_color = Colors::empty_color, const Color &after_hit_color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
509 void draw_lines_c(
const std::vector<Vector3> &lines,
const Color &color = Colors::empty_color,
const real_t &duration = 0) FAKE_FUNC_IMPL;
520 void draw_line(const Vector3 &a, const Vector3 &b, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
533 void draw_ray(const Vector3 &origin, const Vector3 &direction, const real_t &length, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
544 void draw_lines(const PackedVector3Array &lines, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
557 void draw_line_path(const PackedVector3Array &path, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
570 void draw_arrowhead(
const Transform3D &transform,
const Color &color = Colors::empty_color,
const real_t &duration = 0) FAKE_FUNC_IMPL;
584 void draw_arrow(const Vector3 &a, const Vector3 &b, const Color &color = Colors::empty_color, const real_t &arrow_size = 0.5f, const
bool &is_absolute_size = false, const real_t &duration = 0) FAKE_FUNC_IMPL;
597 void draw_arrow_ray(const Vector3 &origin, const Vector3 &direction, const real_t &length, const Color &color = Colors::empty_color, const real_t &arrow_size = 0.5f, const
bool &is_absolute_size = false, const real_t &duration = 0) FAKE_FUNC_IMPL;
610 void draw_arrow_path(const PackedVector3Array &path, const Color &color = Colors::empty_color, const real_t &arrow_size = 0.75f, const
bool &is_absolute_size = true, const real_t &duration = 0) FAKE_FUNC_IMPL;
629 void draw_point_path(
const PackedVector3Array &path,
const PointType type = PointType::POINT_TYPE_SQUARE,
const real_t &size = 0.25f,
const Color &points_color = Colors::empty_color,
const Color &lines_color = Colors::empty_color,
const real_t &duration = 0) FAKE_FUNC_IMPL;
647 void draw_points(
const PackedVector3Array &points,
const PointType type = PointType::POINT_TYPE_SQUARE,
const real_t &size = 0.25f,
const Color &color = Colors::empty_color,
const real_t &duration = 0) FAKE_FUNC_IMPL;
657 void draw_square(const Vector3 &position, const real_t &size = 0.2f, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
671 void draw_plane(const Plane &plane, const Color &color = Colors::empty_color, const Vector3 &anchor_point = Vector3(INFINITY, INFINITY, INFINITY), const real_t &duration = 0) FAKE_FUNC_IMPL;
682 void draw_position(const Transform3D &transform, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
696 void draw_gizmo(const Transform3D &transform, const Color &color = Colors::empty_color, const
bool &is_centered = false, const real_t &duration = 0) FAKE_FUNC_IMPL;
711 void draw_grid(const Vector3 &origin, const Vector3 &x_size, const Vector3 &y_size, const Vector2i &subdivision, const Color &color = Colors::empty_color, const
bool &is_centered = true, const real_t &duration = 0) FAKE_FUNC_IMPL;
724 void draw_grid_xf(const Transform3D &transform, const Vector2i &p_subdivision, const Color &color = Colors::empty_color, const
bool &is_centered = true, const real_t &duration = 0) FAKE_FUNC_IMPL;
726#pragma region Camera Frustum
729 void draw_camera_frustum_planes_c(
const std::array<Plane, 6> &planes,
const Color &color = Colors::empty_color,
const real_t &duration = 0) FAKE_FUNC_IMPL;
739 void draw_camera_frustum(const class godot::Camera3D *camera, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
748 void draw_camera_frustum_planes(const Array &camera_frustum, const Color &color = Colors::empty_color, const real_t &duration = 0) FAKE_FUNC_IMPL;
768 void draw_text(
const Vector3 &position,
const String text,
const int size = 32,
const Color &color = Colors::empty_color,
const real_t &duration = 0) FAKE_FUNC_IMPL;