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_cache;
 
  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;