Adds missing data
This commit is contained in:
parent
e6391d9fdd
commit
53cdcc3433
620 changed files with 47293 additions and 151 deletions
621
examples_dd3d/DebugDrawDemoScene.gd
Normal file
621
examples_dd3d/DebugDrawDemoScene.gd
Normal file
|
|
@ -0,0 +1,621 @@
|
|||
@tool
|
||||
extends Node3D
|
||||
|
||||
@export var custom_font : Font
|
||||
@export var zylann_example := false
|
||||
@export var update_in_physics := false
|
||||
@export var test_text := true
|
||||
@export var test_graphs := false
|
||||
@export var test_fps_graph := true
|
||||
@export var more_test_cases := true
|
||||
@export var draw_array_of_boxes := false
|
||||
@export var draw_1m_boxes := false
|
||||
@export_range(0, 5, 0.001) var debug_thickness := 0.1
|
||||
@export_range(0, 1, 0.001) var debug_center_brightness := 0.8
|
||||
@export_range(0, 1) var camera_frustum_scale := 0.9
|
||||
|
||||
@export_group("Text groups", "text_groups")
|
||||
@export var text_groups_show_hints := true
|
||||
@export var text_groups_show_stats := false
|
||||
@export var text_groups_show_stats_2d := false
|
||||
@export var text_groups_position := DebugDraw2DConfig.POSITION_LEFT_TOP
|
||||
@export var text_groups_offset := Vector2i(8, 8)
|
||||
@export var text_groups_padding := Vector2i(3, 1)
|
||||
@export_range(1, 100) var text_groups_default_font_size := 15
|
||||
@export_range(1, 100) var text_groups_title_font_size := 20
|
||||
@export_range(1, 100) var text_groups_text_font_size := 17
|
||||
|
||||
@export_group("Graphs", "graph")
|
||||
@export var graph_offset := Vector2i(8, 8)
|
||||
@export var graph_size := Vector2i(200, 80)
|
||||
@export_range(1, 100) var graph_title_font_size := 14
|
||||
@export_range(1, 100) var graph_text_font_size := 12
|
||||
@export_range(0, 64) var graph_text_precision := 1
|
||||
@export_range(1, 32) var graph_line_width := 1.0
|
||||
@export_range(1, 512) var graph_buffer_size := 128
|
||||
@export var graph_frame_time_mode := true
|
||||
@export var graph_is_enabled := true
|
||||
|
||||
var button_presses := {}
|
||||
var frame_rendered := false
|
||||
var physics_tick_processed := false
|
||||
|
||||
var timer_1 := 0.0
|
||||
var timer_cubes := 0.0
|
||||
var timer_3 := 0.0
|
||||
var timer_text := 0.0
|
||||
|
||||
# TODO remove after moving to 4.2
|
||||
var is_4_2_and_higher = Engine.get_version_info()["major"] >= 4 && Engine.get_version_info()["minor"] >= 2
|
||||
|
||||
|
||||
func _process(delta) -> void:
|
||||
$OtherWorld.mesh.material.set_shader_parameter("albedo_texture", $OtherWorld/SubViewport.get_texture())
|
||||
|
||||
physics_tick_processed = false
|
||||
if !update_in_physics:
|
||||
main_update(delta)
|
||||
_update_timers(delta)
|
||||
|
||||
|
||||
## Since physics frames may not be called every frame or may be called multiple times in one frame,
|
||||
## there is an additional check to ensure that a new frame has been drawn before updating the data.
|
||||
func _physics_process(delta: float) -> void:
|
||||
if !physics_tick_processed:
|
||||
physics_tick_processed = true
|
||||
if update_in_physics:
|
||||
main_update(delta)
|
||||
_update_timers(delta)
|
||||
|
||||
# Physics specific:
|
||||
if not zylann_example:
|
||||
DebugDraw3D.draw_line($"Lines/8".global_position, $Lines/Target.global_position, Color.YELLOW)
|
||||
|
||||
if more_test_cases:
|
||||
_draw_rays_casts()
|
||||
|
||||
## Additional drawing in the Viewport
|
||||
if true:
|
||||
var _w1 = DebugDraw3D.new_scoped_config().set_viewport(%OtherWorldBox.get_viewport()).set_thickness(0.01).set_center_brightness(1).set_no_depth_test(true)
|
||||
DebugDraw3D.draw_box_xf(Transform3D(Basis()
|
||||
.scaled(Vector3.ONE*0.3)
|
||||
.rotated(Vector3(0,0,1), PI/4)
|
||||
.rotated(Vector3(0,1,0), wrapf(Time.get_ticks_msec() / -1500.0, 0, TAU) - PI/4), %OtherWorldBox.global_transform.origin),
|
||||
Color.BROWN, true, 0.4)
|
||||
|
||||
|
||||
func main_update(delta: float) -> void:
|
||||
DebugDraw3D.scoped_config().set_thickness(debug_thickness).set_center_brightness(debug_center_brightness)
|
||||
if false: #test
|
||||
var _s11 = DebugDraw3D.new_scoped_config().set_thickness(1)
|
||||
if true:
|
||||
pass
|
||||
var _s13 = DebugDraw3D.new_scoped_config()
|
||||
_s13.set_thickness(3)
|
||||
|
||||
_update_keys_just_press()
|
||||
|
||||
if _is_key_just_pressed(KEY_F1):
|
||||
zylann_example = !zylann_example
|
||||
|
||||
# Zylann's example :D
|
||||
if zylann_example:
|
||||
DebugDraw2D.clear_graphs()
|
||||
var _time = Time.get_ticks_msec() / 1000.0
|
||||
var box_pos = Vector3(0, sin(_time * 4), 0)
|
||||
var line_begin = Vector3(-1, sin(_time * 4), 0)
|
||||
var line_end = Vector3(1, cos(_time * 4), 0)
|
||||
|
||||
DebugDraw3D.draw_box(box_pos, Quaternion.IDENTITY, Vector3(1, 2, 1), Color(0, 1, 0))
|
||||
DebugDraw3D.draw_line(line_begin, line_end, Color(1, 1, 0))
|
||||
DebugDraw2D.set_text("Time", _time)
|
||||
DebugDraw2D.set_text("Frames drawn", Engine.get_frames_drawn())
|
||||
DebugDraw2D.set_text("FPS", Engine.get_frames_per_second())
|
||||
DebugDraw2D.set_text("delta", delta)
|
||||
|
||||
$HitTest.visible = false
|
||||
$LagTest.visible = false
|
||||
$PlaneOrigin.visible = false
|
||||
$OtherWorld.visible = false
|
||||
%ZDepthTestCube.visible = false
|
||||
return
|
||||
|
||||
$HitTest.visible = true
|
||||
$LagTest.visible = true
|
||||
$PlaneOrigin.visible = true
|
||||
$OtherWorld.visible = true
|
||||
%ZDepthTestCube.visible = true
|
||||
|
||||
# Testing the rendering layers by showing the image from the second camera inside the 2D panel
|
||||
DebugDraw3D.config.geometry_render_layers = 1 if !Input.is_key_pressed(KEY_ALT) else 0b10010
|
||||
$Panel.visible = Input.is_key_pressed(KEY_ALT)
|
||||
DebugDraw2D.custom_canvas = %CustomCanvas if Input.is_key_pressed(KEY_ALT) else null
|
||||
|
||||
# More property toggles
|
||||
DebugDraw3D.config.freeze_3d_render = Input.is_key_pressed(KEY_DOWN)
|
||||
DebugDraw3D.config.visible_instance_bounds = Input.is_key_pressed(KEY_RIGHT)
|
||||
|
||||
# Regenerate meshes
|
||||
if Input.is_action_just_pressed("ui_end"):
|
||||
DebugDraw3D.regenerate_geometry_meshes()
|
||||
|
||||
# Some property toggles
|
||||
if _is_key_just_pressed(KEY_LEFT):
|
||||
DebugDraw3D.config.use_frustum_culling = !DebugDraw3D.config.use_frustum_culling
|
||||
if _is_key_just_pressed(KEY_UP):
|
||||
DebugDraw3D.config.force_use_camera_from_scene = !DebugDraw3D.config.force_use_camera_from_scene
|
||||
if _is_key_just_pressed(KEY_CTRL):
|
||||
if !Engine.is_editor_hint():
|
||||
get_viewport().msaa_3d = Viewport.MSAA_DISABLED if get_viewport().msaa_3d == Viewport.MSAA_4X else Viewport.MSAA_4X
|
||||
|
||||
if !Engine.is_editor_hint():
|
||||
if _is_key_just_pressed(KEY_1):
|
||||
DebugDraw3D.debug_enabled = !DebugDraw3D.debug_enabled
|
||||
if _is_key_just_pressed(KEY_2):
|
||||
DebugDraw2D.debug_enabled = !DebugDraw2D.debug_enabled
|
||||
if _is_key_just_pressed(KEY_3):
|
||||
DebugDrawManager.debug_enabled = !DebugDrawManager.debug_enabled
|
||||
|
||||
|
||||
DebugDraw3D.config.frustum_length_scale = camera_frustum_scale
|
||||
|
||||
# Zones with black borders
|
||||
for z in $Zones.get_children():
|
||||
DebugDraw3D.draw_box_xf(z.global_transform, Color.BLACK)
|
||||
|
||||
# Spheres
|
||||
DebugDraw3D.draw_sphere_xf($Spheres/SphereTransform.global_transform, Color.CRIMSON)
|
||||
if true:
|
||||
var _shd = DebugDraw3D.new_scoped_config().set_hd_sphere(true)
|
||||
DebugDraw3D.draw_sphere_xf($Spheres/SphereHDTransform.global_transform, Color.ORANGE_RED)
|
||||
|
||||
# Delayed spheres
|
||||
if timer_1 < 0:
|
||||
DebugDraw3D.draw_sphere($Spheres/SpherePosition.global_position, 2.0, Color.BLUE_VIOLET, 2.0)
|
||||
var _shd = DebugDraw3D.new_scoped_config().set_hd_sphere(true)
|
||||
DebugDraw3D.draw_sphere($Spheres/SpherePosition.global_position + Vector3.FORWARD * 4, 2.0, Color.CORNFLOWER_BLUE, 2.0)
|
||||
timer_1 = 2
|
||||
|
||||
# Cylinders
|
||||
DebugDraw3D.draw_cylinder($Cylinders/Cylinder1.global_transform, Color.CRIMSON)
|
||||
DebugDraw3D.draw_cylinder(Transform3D(Basis.IDENTITY.scaled(Vector3(1,2,1)), $Cylinders/Cylinder2.global_position), Color.RED)
|
||||
DebugDraw3D.draw_cylinder_ab($"Cylinders/Cylinder3/1".global_position, $"Cylinders/Cylinder3/2".global_position, 0.7)
|
||||
|
||||
# Boxes
|
||||
DebugDraw3D.draw_box_xf($Boxes/Box1.global_transform, Color.MEDIUM_PURPLE)
|
||||
DebugDraw3D.draw_box($Boxes/Box2.global_position, Quaternion.from_euler(Vector3(0, deg_to_rad(45), deg_to_rad(45))), Vector3.ONE, Color.REBECCA_PURPLE)
|
||||
DebugDraw3D.draw_box_xf(Transform3D(Basis(Vector3.UP, PI * 0.25).scaled(Vector3.ONE * 2), $Boxes/Box3.global_position), Color.ROSY_BROWN)
|
||||
|
||||
DebugDraw3D.draw_aabb(AABB($Boxes/AABB_fixed.global_position, Vector3(2, 1, 2)), Color.AQUA)
|
||||
DebugDraw3D.draw_aabb_ab($Boxes/AABB/a.global_position, $Boxes/AABB/b.global_position, Color.DEEP_PINK)
|
||||
|
||||
# Boxes AB
|
||||
DebugDraw3D.draw_arrow($Boxes/BoxAB.global_position, $Boxes/BoxAB/o/up.global_position, Color.GOLD, 0.1, true)
|
||||
DebugDraw3D.draw_box_ab($Boxes/BoxAB/a.global_position, $Boxes/BoxAB/b.global_position, $Boxes/BoxAB/o/up.global_position - $Boxes/BoxAB.global_position, Color.PERU)
|
||||
|
||||
DebugDraw3D.draw_arrow($Boxes/BoxABEdge.global_position, $Boxes/BoxABEdge/o/up.global_position, Color.DARK_RED, 0.1, true)
|
||||
DebugDraw3D.draw_box_ab($Boxes/BoxABEdge/a.global_position, $Boxes/BoxABEdge/b.global_position, $Boxes/BoxABEdge/o/up.global_position - $Boxes/BoxABEdge.global_position, Color.DARK_OLIVE_GREEN, false)
|
||||
|
||||
# Lines
|
||||
var target = $Lines/Target
|
||||
DebugDraw3D.draw_square(target.global_position, 0.5, Color.RED)
|
||||
|
||||
DebugDraw3D.draw_line($"Lines/1".global_position, target.global_position, Color.FUCHSIA)
|
||||
DebugDraw3D.draw_ray($"Lines/3".global_position, (target.global_position - $"Lines/3".global_position).normalized(), 3.0, Color.CRIMSON)
|
||||
|
||||
if timer_3 < 0:
|
||||
DebugDraw3D.draw_line($"Lines/6".global_position, target.global_position, Color.FUCHSIA, 2.0)
|
||||
timer_3 = 2
|
||||
|
||||
# Test UP vector
|
||||
DebugDraw3D.draw_line($"Lines/7".global_position, target.global_position, Color.RED)
|
||||
|
||||
# Lines with Arrow
|
||||
DebugDraw3D.draw_arrow($"Lines/2".global_position, target.global_position, Color.BLUE, 0.5, true)
|
||||
DebugDraw3D.draw_arrow_ray($"Lines/4".global_position, (target.global_position - $"Lines/4".global_position).normalized(), 8.0, Color.LAVENDER, 0.5, true)
|
||||
|
||||
DebugDraw3D.draw_line_hit_offset($"Lines/5".global_position, target.global_position, true, abs(sin(Time.get_ticks_msec() / 1000.0)), 0.25, Color.AQUA)
|
||||
|
||||
# Path
|
||||
|
||||
## preparing data
|
||||
var points: PackedVector3Array = []
|
||||
var points_below: PackedVector3Array = []
|
||||
var points_below2: PackedVector3Array = []
|
||||
var points_below3: PackedVector3Array = []
|
||||
var points_below4: PackedVector3Array = []
|
||||
var lines_above: PackedVector3Array = []
|
||||
|
||||
for c in $LinePath.get_children():
|
||||
if not c is Node3D:
|
||||
break
|
||||
points.append(c.global_position)
|
||||
points_below.append(c.global_position + Vector3.DOWN)
|
||||
points_below2.append(c.global_position + Vector3.DOWN * 2)
|
||||
points_below3.append(c.global_position + Vector3.DOWN * 3)
|
||||
points_below4.append(c.global_position + Vector3.DOWN * 4)
|
||||
|
||||
for x in points.size()-1:
|
||||
lines_above.append(points[x] + Vector3.UP)
|
||||
lines_above.append(points[x+1] + Vector3.UP)
|
||||
|
||||
## drawing lines
|
||||
DebugDraw3D.draw_lines(lines_above)
|
||||
DebugDraw3D.draw_line_path(points, Color.BEIGE)
|
||||
DebugDraw3D.draw_points(points_below, DebugDraw3D.POINT_TYPE_SQUARE, 0.2, Color.DARK_GREEN)
|
||||
DebugDraw3D.draw_point_path(points_below2, DebugDraw3D.POINT_TYPE_SQUARE, 0.25, Color.BLUE, Color.TOMATO)
|
||||
DebugDraw3D.draw_arrow_path(points_below3, Color.GOLD, 0.5)
|
||||
if true:
|
||||
var _sl = DebugDraw3D.new_scoped_config().set_thickness(0.05)
|
||||
DebugDraw3D.draw_point_path(points_below4, DebugDraw3D.POINT_TYPE_SPHERE, 0.25, Color.MEDIUM_SEA_GREEN, Color.MEDIUM_VIOLET_RED)
|
||||
|
||||
# Other world
|
||||
|
||||
if true:
|
||||
var _w1 = DebugDraw3D.new_scoped_config().set_viewport(%OtherWorldBox.get_viewport())
|
||||
DebugDraw3D.draw_box_xf(%OtherWorldBox.global_transform.rotated_local(Vector3(1,1,-1).normalized(), wrapf(Time.get_ticks_msec() / 1000.0, 0, TAU)), Color.SANDY_BROWN)
|
||||
DebugDraw3D.draw_box_xf(%OtherWorldBox.global_transform.rotated_local(Vector3(-1,1,-1).normalized(), wrapf(Time.get_ticks_msec() / -1000.0, 0, TAU) - PI/4), Color.SANDY_BROWN)
|
||||
|
||||
# Misc
|
||||
if Engine.is_editor_hint():
|
||||
#for i in 1000:
|
||||
var _a11 = DebugDraw3D.new_scoped_config().set_thickness(0)
|
||||
DebugDraw3D.draw_camera_frustum($Camera, Color.DARK_ORANGE)
|
||||
|
||||
if true:
|
||||
var _s123 = DebugDraw3D.new_scoped_config().set_center_brightness(0.1)
|
||||
DebugDraw3D.draw_arrowhead($Misc/Arrow.global_transform, Color.YELLOW_GREEN)
|
||||
|
||||
DebugDraw3D.draw_square($Misc/Billboard.global_position, 0.5, Color.GREEN)
|
||||
|
||||
DebugDraw3D.draw_position($Misc/Position.global_transform, Color.BROWN)
|
||||
|
||||
DebugDraw3D.draw_gizmo($Misc/GizmoTransform.global_transform, DebugDraw3D.empty_color, true)
|
||||
DebugDraw3D.draw_gizmo($Misc/GizmoOneColor.global_transform, Color.BROWN, true)
|
||||
if true:
|
||||
var _s123 = DebugDraw3D.new_scoped_config().set_center_brightness(0.5).set_no_depth_test(true)
|
||||
DebugDraw3D.draw_gizmo($Misc/GizmoNormal.global_transform.orthonormalized(), DebugDraw3D.empty_color, false)
|
||||
|
||||
var tg : Transform3D = $Grids/Grid.global_transform
|
||||
var tn : Vector3 = $Grids/Grid/Subdivision.transform.origin
|
||||
DebugDraw3D.draw_grid(tg.origin, tg.basis.x, tg.basis.z, Vector2i(int(tn.x*10), int(tn.z*10)), Color.LIGHT_CORAL, false)
|
||||
|
||||
var tn1 = $Grids/GridCentered/Subdivision.transform.origin
|
||||
DebugDraw3D.draw_grid_xf($Grids/GridCentered.global_transform, Vector2i(tn1.x*10, tn1.z*10))
|
||||
|
||||
if true:
|
||||
var _s32 = DebugDraw3D.new_scoped_config().set_thickness(0.05)
|
||||
DebugDraw3D.draw_box_xf($PostProcess.global_transform, Color.SEA_GREEN)
|
||||
|
||||
# 2D
|
||||
DebugDraw2D.config.text_default_size = text_groups_default_font_size
|
||||
DebugDraw2D.config.text_block_offset = text_groups_offset
|
||||
DebugDraw2D.config.text_block_position = text_groups_position
|
||||
DebugDraw2D.config.text_padding = text_groups_padding
|
||||
|
||||
DebugDraw2D.config.text_custom_font = custom_font
|
||||
|
||||
if test_text:
|
||||
_text_tests()
|
||||
|
||||
# Graphs
|
||||
# Enable FPSGraph if not exists
|
||||
_create_graph(&"FPS", true, false, DebugDraw2DGraph.TEXT_CURRENT | DebugDraw2DGraph.TEXT_AVG | DebugDraw2DGraph.TEXT_MAX | DebugDraw2DGraph.TEXT_MIN, &"", DebugDraw2DGraph.SIDE_BOTTOM, DebugDraw2DGraph.POSITION_LEFT_TOP if Engine.is_editor_hint() else DebugDraw2DGraph.POSITION_RIGHT_TOP, Vector2i(200, 80), custom_font)
|
||||
if Engine.is_editor_hint():
|
||||
if DebugDraw2D.get_graph(&"FPS"):
|
||||
DebugDraw2D.get_graph(&"FPS").offset = Vector2i(0, 64)
|
||||
|
||||
# Adding more graphs
|
||||
if test_graphs and DebugDraw2D.debug_enabled:
|
||||
_graph_test()
|
||||
else:
|
||||
_remove_graphs()
|
||||
_upd_graph_params()
|
||||
|
||||
# Lag Test
|
||||
$LagTest.position = $LagTest/RESET.get_animation("RESET").track_get_key_value(0,0) + Vector3(sin(Time.get_ticks_msec() / 100.0) * 2.5, 0, 0)
|
||||
DebugDraw3D.draw_box($LagTest.global_position, Quaternion.IDENTITY, Vector3.ONE * 2.01, Color.CHOCOLATE, true)
|
||||
|
||||
if more_test_cases:
|
||||
for ray in $HitTest/RayEmitter.get_children():
|
||||
ray.set_physics_process_internal(true)
|
||||
|
||||
_more_tests()
|
||||
else:
|
||||
for ray in $HitTest/RayEmitter.get_children():
|
||||
ray.set_physics_process_internal(false)
|
||||
|
||||
if draw_array_of_boxes:
|
||||
_draw_array_of_boxes()
|
||||
|
||||
|
||||
func _text_tests():
|
||||
if timer_text < 0:
|
||||
DebugDraw2D.set_text("Some delayed text", "for 2.5s", -1, Color.BLACK, 2.5) # it's supposed to show text for 2.5 seconds
|
||||
timer_text = 5
|
||||
|
||||
DebugDraw2D.set_text("FPS", "%.2f" % Engine.get_frames_per_second(), 0, Color.GOLD)
|
||||
|
||||
DebugDraw2D.begin_text_group("-- First Group --", 2, Color.LIME_GREEN, true, text_groups_title_font_size, text_groups_text_font_size)
|
||||
DebugDraw2D.set_text("Simple text")
|
||||
DebugDraw2D.set_text("Text", "Value", 0, Color.AQUAMARINE)
|
||||
DebugDraw2D.set_text("Text out of order", null, -1, Color.SILVER)
|
||||
DebugDraw2D.begin_text_group("-- Second Group --", 1, Color.BEIGE)
|
||||
DebugDraw2D.set_text("Rendered frames", Engine.get_frames_drawn())
|
||||
DebugDraw2D.end_text_group()
|
||||
|
||||
if text_groups_show_stats or text_groups_show_stats_2d:
|
||||
DebugDraw2D.begin_text_group("-- Stats --", 3, Color.WHEAT)
|
||||
|
||||
var render_stats := DebugDraw3D.get_render_stats()
|
||||
if render_stats && text_groups_show_stats:
|
||||
DebugDraw2D.set_text("Total", render_stats.total_geometry)
|
||||
DebugDraw2D.set_text("Instances", render_stats.instances + render_stats.instances_physics, 1)
|
||||
DebugDraw2D.set_text("Lines", render_stats.lines + render_stats.lines_physics, 2)
|
||||
DebugDraw2D.set_text("Total Visible", render_stats.total_visible, 3)
|
||||
DebugDraw2D.set_text("Visible Instances", render_stats.visible_instances, 4)
|
||||
DebugDraw2D.set_text("Visible Lines", render_stats.visible_lines, 5)
|
||||
|
||||
DebugDraw2D.set_text("---", null, 6)
|
||||
|
||||
DebugDraw2D.set_text("Culling time", "%.2f ms" % (render_stats.total_time_culling_usec / 1000.0), 7)
|
||||
DebugDraw2D.set_text("Filling instances buffer", "%.2f ms" % (render_stats.time_filling_buffers_instances_usec / 1000.0), 8)
|
||||
DebugDraw2D.set_text("Filling lines buffer", "%.2f ms" % (render_stats.time_filling_buffers_lines_usec / 1000.0), 9)
|
||||
DebugDraw2D.set_text("Filling time", "%.2f ms" % (render_stats.total_time_filling_buffers_usec / 1000.0), 10)
|
||||
DebugDraw2D.set_text("Total time", "%.2f ms" % (render_stats.total_time_spent_usec / 1000.0), 11)
|
||||
|
||||
DebugDraw2D.set_text("---", null, 14)
|
||||
|
||||
DebugDraw2D.set_text("Created scoped configs", "%d" % render_stats.created_scoped_configs, 15)
|
||||
|
||||
if text_groups_show_stats && text_groups_show_stats_2d:
|
||||
DebugDraw2D.set_text("----", null, 19)
|
||||
|
||||
var render_stats_2d := DebugDraw2D.get_render_stats()
|
||||
if render_stats_2d && text_groups_show_stats_2d:
|
||||
DebugDraw2D.set_text("Text groups", render_stats_2d.overlay_text_groups, 20)
|
||||
DebugDraw2D.set_text("Text lines", render_stats_2d.overlay_text_lines, 21)
|
||||
DebugDraw2D.set_text("Graphs total", render_stats_2d.overlay_graphs_total, 22)
|
||||
DebugDraw2D.set_text("Graphs enabled", render_stats_2d.overlay_graphs_enabled, 23)
|
||||
|
||||
DebugDraw2D.end_text_group()
|
||||
|
||||
if text_groups_show_hints:
|
||||
DebugDraw2D.begin_text_group("controls", 1024, Color.WHITE, false)
|
||||
if not Engine.is_editor_hint():
|
||||
DebugDraw2D.set_text("WASD QE, LMB", "To move", 0)
|
||||
DebugDraw2D.set_text("Alt: change render layers", DebugDraw3D.config.geometry_render_layers, 1)
|
||||
if not OS.has_feature("web"):
|
||||
DebugDraw2D.set_text("Ctrl: toggle anti-aliasing", "MSAA 4x" if get_viewport().msaa_3d == Viewport.MSAA_4X else "Disabled", 2)
|
||||
DebugDraw2D.set_text("Down: freeze render", DebugDraw3D.config.freeze_3d_render, 3)
|
||||
if Engine.is_editor_hint():
|
||||
DebugDraw2D.set_text("Up: use scene camera", DebugDraw3D.config.force_use_camera_from_scene, 4)
|
||||
DebugDraw2D.set_text("1,2,3: toggle debug", "%s, %s 😐, %s 😏" % [DebugDraw3D.debug_enabled, DebugDraw2D.debug_enabled, DebugDrawManager.debug_enabled], 5)
|
||||
DebugDraw2D.set_text("Left: toggle frustum culling", DebugDraw3D.config.use_frustum_culling, 6)
|
||||
DebugDraw2D.set_text("Right: draw bounds for culling", DebugDraw3D.config.visible_instance_bounds, 7)
|
||||
DebugDraw2D.end_text_group()
|
||||
|
||||
|
||||
func _draw_rays_casts():
|
||||
# Line hits render
|
||||
for ray in $HitTest/RayEmitter.get_children():
|
||||
if ray is RayCast3D:
|
||||
ray.force_raycast_update()
|
||||
DebugDraw3D.draw_line_hit(ray.global_position, ray.to_global(ray.target_position), ray.get_collision_point(), ray.is_colliding(), 0.3)
|
||||
|
||||
|
||||
func _more_tests():
|
||||
# Delayed line render
|
||||
if true:
|
||||
var _a12 = DebugDraw3D.new_scoped_config().set_thickness(0.035)
|
||||
DebugDraw3D.draw_line($LagTest.global_position + Vector3.UP, $LagTest.global_position + Vector3(0,3,sin(Time.get_ticks_msec() / 50.0)), DebugDraw3D.empty_color, 0.5)
|
||||
|
||||
# Draw plane
|
||||
if true:
|
||||
var _s11 = DebugDraw3D.new_scoped_config().set_thickness(0.02).set_plane_size(10)
|
||||
|
||||
var pl_node: Node3D = $PlaneOrigin
|
||||
var xf: Transform3D = pl_node.global_transform
|
||||
var normal: = xf.basis.y.normalized()
|
||||
var plane = Plane(normal, xf.origin.dot(normal))
|
||||
|
||||
var vp: Viewport = get_viewport()
|
||||
if is_4_2_and_higher:
|
||||
if Engine.is_editor_hint() and Engine.get_singleton(&"EditorInterface").get_editor_viewport_3d(0):
|
||||
vp = Engine.get_singleton(&"EditorInterface").get_editor_viewport_3d(0)
|
||||
|
||||
var cam = vp.get_camera_3d()
|
||||
if cam:
|
||||
var dir = vp.get_camera_3d().project_ray_normal(vp.get_mouse_position())
|
||||
var intersect = plane.intersects_ray(cam.global_position, dir)
|
||||
|
||||
DebugDraw3D.draw_plane(plane, Color.CORAL * Color(1,1,1, 0.4), pl_node.global_position)
|
||||
if is_4_2_and_higher:
|
||||
if intersect and intersect.distance_to(pl_node.global_position) < _s11.get_plane_size() * 0.5:
|
||||
# Need to test different colors on both sides of the plane
|
||||
var col = Color.FIREBRICK if plane.is_point_over(cam.global_position) else Color.AQUAMARINE
|
||||
DebugDraw3D.draw_sphere(intersect, 0.3, col)
|
||||
|
||||
|
||||
func _draw_array_of_boxes():
|
||||
# Lots of boxes to check performance..
|
||||
var x_size := 50
|
||||
var y_size := 50
|
||||
var z_size := 3
|
||||
var mul := 1
|
||||
var cubes_max_time := 1.25
|
||||
var cfg = DebugDraw3D.new_scoped_config()
|
||||
|
||||
if draw_1m_boxes:
|
||||
x_size = 100
|
||||
y_size = 100
|
||||
z_size = 100
|
||||
mul = 4
|
||||
cubes_max_time = 60
|
||||
|
||||
if timer_cubes < 0:
|
||||
var _start_time = Time.get_ticks_usec()
|
||||
for x in x_size:
|
||||
for y in y_size:
|
||||
for z in z_size:
|
||||
var size = Vector3.ONE
|
||||
cfg.set_thickness(randf_range(0, 0.1))
|
||||
#var size = Vector3(randf_range(0.1, 100),randf_range(0.1, 100),randf_range(0.1, 100))
|
||||
DebugDraw3D.draw_box(Vector3(x * mul, (-4-z) * mul, y * mul) + global_position, Quaternion.IDENTITY, size, DebugDraw3D.empty_color, false, cubes_max_time)
|
||||
#print("Draw Cubes: %fms" % ((Time.get_ticks_usec() - _start_time) / 1000.0))
|
||||
timer_cubes = cubes_max_time
|
||||
|
||||
|
||||
func _graph_test():
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"fps", true, true, DebugDraw2DGraph.TEXT_CURRENT, &"", DebugDraw2DGraph.SIDE_LEFT, DebugDraw2DGraph.POSITION_RIGHT_TOP)
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"fps2", true, false, DebugDraw2DGraph.TEXT_CURRENT, &"fps", DebugDraw2DGraph.SIDE_BOTTOM, 0, Vector2i(200, 100))
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"Sin Wave!", false, true, DebugDraw2DGraph.TEXT_CURRENT, &"fps2", DebugDraw2DGraph.SIDE_BOTTOM)
|
||||
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"randf", false, true, DebugDraw2DGraph.TEXT_AVG, &"", DebugDraw2DGraph.SIDE_LEFT, DebugDraw2DGraph.POSITION_RIGHT_BOTTOM, Vector2i(256, 60), custom_font)
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"fps5", true, true, DebugDraw2DGraph.TEXT_ALL, &"randf", DebugDraw2DGraph.SIDE_TOP)
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"fps6", true, true, DebugDraw2DGraph.TEXT_ALL, &"fps5", DebugDraw2DGraph.SIDE_TOP)
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"fps12", true, true, DebugDraw2DGraph.TEXT_ALL, &"fps5", DebugDraw2DGraph.SIDE_LEFT)
|
||||
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"fps7", true, false, DebugDraw2DGraph.TEXT_ALL, &"FPS", DebugDraw2DGraph.SIDE_BOTTOM)
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"fps8", true, true, DebugDraw2DGraph.TEXT_ALL, &"", DebugDraw2DGraph.SIDE_TOP, DebugDraw2DGraph.POSITION_LEFT_BOTTOM)
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"fps9", true, false, DebugDraw2DGraph.TEXT_ALL, &"fps8", DebugDraw2DGraph.SIDE_RIGHT)
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"fps10", true, false, DebugDraw2DGraph.TEXT_ALL, &"fps8", DebugDraw2DGraph.SIDE_TOP)
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"fps11", true, true, DebugDraw2DGraph.TEXT_ALL, &"fps9", DebugDraw2DGraph.SIDE_RIGHT)
|
||||
# warning-ignore:return_value_discarded
|
||||
_create_graph(&"fps13", true, true, DebugDraw2DGraph.TEXT_ALL, &"", DebugDraw2DGraph.SIDE_RIGHT)
|
||||
if not DebugDraw2D.get_graph(&"fps13"):
|
||||
return
|
||||
|
||||
DebugDraw2D.get_graph(&"fps13").enabled = false
|
||||
|
||||
# If graphs exists, then more tests are done
|
||||
DebugDraw2D.get_graph(&"Sin Wave!").data_getter = Callable(self, &"_get_sin_wave_for_graph")
|
||||
DebugDraw2D.get_graph(&"Sin Wave!").upside_down =false
|
||||
|
||||
DebugDraw2D.get_graph(&"randf").text_suffix = "utf8 ноль zéro"
|
||||
#DebugDraw2D.get_graph(&"fps9").line_position = DebugDraw2DGraph.LINE_TOP
|
||||
DebugDraw2D.get_graph(&"fps9").offset = Vector2i(0, 0)
|
||||
#DebugDraw2D.get_graph(&"fps11").line_position = DebugDraw2DGraph.LINE_BOTTOM
|
||||
DebugDraw2D.get_graph(&"fps11").offset = Vector2i(16, 0)
|
||||
DebugDraw2D.get_graph(&"fps6").offset = Vector2i(0, 32)
|
||||
DebugDraw2D.get_graph(&"fps").offset = Vector2i(16, 72)
|
||||
|
||||
DebugDraw2D.get_graph(&"fps9").enabled = graph_is_enabled
|
||||
if !Engine.is_editor_hint():
|
||||
DebugDraw2D.get_graph(&"fps").corner = DebugDraw2DGraph.POSITION_LEFT_TOP
|
||||
|
||||
# Just sending random data to the graph
|
||||
DebugDraw2D.graph_update_data(&"randf", randf())
|
||||
|
||||
|
||||
func _upd_graph_params():
|
||||
DebugDraw2D.config.graphs_base_offset = graph_offset
|
||||
for g in [&"FPS", &"fps5", &"fps8"]:
|
||||
var graph := DebugDraw2D.get_graph(g) as DebugDraw2DFPSGraph
|
||||
if graph:
|
||||
graph.size = graph_size
|
||||
graph.title_size = graph_title_font_size
|
||||
graph.text_size = graph_text_font_size
|
||||
graph.line_width = graph_line_width
|
||||
graph.text_precision = graph_text_precision
|
||||
graph.buffer_size = graph_buffer_size
|
||||
if Engine.is_editor_hint() or g != &"FPS":
|
||||
graph.frame_time_mode = graph_frame_time_mode
|
||||
|
||||
|
||||
func _get_sin_wave_for_graph() -> float:
|
||||
var mul = 4 if Input.is_key_pressed(KEY_END) else 2
|
||||
return sin(Engine.get_frames_drawn() * 0.5) * mul
|
||||
|
||||
|
||||
func _remove_graphs():
|
||||
if not test_fps_graph:
|
||||
DebugDraw2D.remove_graph(&"FPS")
|
||||
DebugDraw2D.remove_graph(&"randf")
|
||||
DebugDraw2D.remove_graph(&"fps")
|
||||
DebugDraw2D.remove_graph(&"fps2")
|
||||
DebugDraw2D.remove_graph(&"Sin Wave!")
|
||||
DebugDraw2D.remove_graph(&"fps5")
|
||||
DebugDraw2D.remove_graph(&"fps6")
|
||||
DebugDraw2D.remove_graph(&"fps7")
|
||||
DebugDraw2D.remove_graph(&"fps8")
|
||||
DebugDraw2D.remove_graph(&"fps9")
|
||||
DebugDraw2D.remove_graph(&"fps10")
|
||||
DebugDraw2D.remove_graph(&"fps11")
|
||||
DebugDraw2D.remove_graph(&"fps12")
|
||||
DebugDraw2D.remove_graph(&"fps13")
|
||||
|
||||
|
||||
func _create_graph(title, is_fps, show_title, flags, parent := &"", parent_side := DebugDraw2DGraph.SIDE_BOTTOM, pos = DebugDraw2DGraph.POSITION_LEFT_BOTTOM, size := Vector2i(256, 60), font = null) -> DebugDraw2DGraph:
|
||||
var graph := DebugDraw2D.get_graph(title)
|
||||
if !graph:
|
||||
if is_fps:
|
||||
graph = DebugDraw2D.create_fps_graph(title)
|
||||
else:
|
||||
graph = DebugDraw2D.create_graph(title)
|
||||
|
||||
if graph:
|
||||
graph.size = size
|
||||
graph.buffer_size = 50
|
||||
graph.corner = pos
|
||||
graph.show_title = show_title
|
||||
graph.show_text_flags = flags
|
||||
graph.custom_font = font
|
||||
graph.set_parent(parent, parent_side)
|
||||
|
||||
return graph
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_update_keys_just_press()
|
||||
|
||||
await get_tree().process_frame
|
||||
|
||||
# this check is required for inherited scenes, because an instance of this
|
||||
# script is created first, and then overridden by another
|
||||
if !is_inside_tree():
|
||||
return
|
||||
|
||||
|
||||
func _is_key_just_pressed(key):
|
||||
if (button_presses[key] == 1):
|
||||
button_presses[key] = 2
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func _update_keys_just_press():
|
||||
var set_key = func (k: Key):
|
||||
if Input.is_key_pressed(k) and button_presses.has(k):
|
||||
if button_presses[k] == 0:
|
||||
return 1
|
||||
else:
|
||||
return button_presses[k]
|
||||
else:
|
||||
return 0
|
||||
button_presses[KEY_LEFT] = set_key.call(KEY_LEFT)
|
||||
button_presses[KEY_UP] = set_key.call(KEY_UP)
|
||||
button_presses[KEY_CTRL] = set_key.call(KEY_CTRL)
|
||||
button_presses[KEY_F1] = set_key.call(KEY_F1)
|
||||
button_presses[KEY_1] = set_key.call(KEY_1)
|
||||
button_presses[KEY_2] = set_key.call(KEY_2)
|
||||
button_presses[KEY_3] = set_key.call(KEY_3)
|
||||
|
||||
|
||||
func _update_timers(delta : float):
|
||||
timer_1 -= delta
|
||||
timer_cubes -= delta
|
||||
timer_3 -= delta
|
||||
timer_text -= delta
|
||||
979
examples_dd3d/DebugDrawDemoScene.tscn
Normal file
979
examples_dd3d/DebugDrawDemoScene.tscn
Normal file
|
|
@ -0,0 +1,979 @@
|
|||
[gd_scene load_steps=39 format=3 uid="uid://c3sccy6x0ht5j"]
|
||||
|
||||
[ext_resource type="Script" path="res://examples_dd3d/DebugDrawDemoScene.gd" id="1"]
|
||||
[ext_resource type="FontFile" uid="uid://erdgllynwqkw" path="res://examples_dd3d/Roboto-Bold.ttf" id="2_aedbq"]
|
||||
[ext_resource type="Script" path="res://examples_dd3d/demo_camera_movement.gd" id="3_3m1mp"]
|
||||
[ext_resource type="Script" path="res://examples_dd3d/demo_music_visualizer.gd" id="4_eq2lt"]
|
||||
[ext_resource type="Script" path="res://examples_dd3d/demo_settings_panel.gd" id="5_31v5h"]
|
||||
[ext_resource type="Script" path="res://examples_dd3d/demo_web_docs_version_select.gd" id="6_07f7q"]
|
||||
|
||||
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_87638"]
|
||||
sky_horizon_color = Color(0.64625, 0.65575, 0.67075, 1)
|
||||
ground_horizon_color = Color(0.64625, 0.65575, 0.67075, 1)
|
||||
|
||||
[sub_resource type="Sky" id="Sky_4jfme"]
|
||||
sky_material = SubResource("ProceduralSkyMaterial_87638")
|
||||
|
||||
[sub_resource type="Environment" id="Environment_38m85"]
|
||||
sky = SubResource("Sky_4jfme")
|
||||
tonemap_mode = 2
|
||||
fog_light_energy = 0.41
|
||||
fog_density = 0.0757
|
||||
fog_height = 0.5
|
||||
fog_height_density = 4.6102
|
||||
|
||||
[sub_resource type="Animation" id="9"]
|
||||
resource_name = "New Anim"
|
||||
length = 1.5
|
||||
loop_mode = 1
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("Spatial2:transform")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0, 0.7),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, 1), Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0.31558, 1)]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("Spatial5:transform")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/keys = {
|
||||
"times": PackedFloat32Array(0, 0.5),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -1, 1), Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -1.5801, 1)]
|
||||
}
|
||||
tracks/2/type = "value"
|
||||
tracks/2/imported = false
|
||||
tracks/2/enabled = true
|
||||
tracks/2/path = NodePath("Spatial4:transform")
|
||||
tracks/2/interp = 1
|
||||
tracks/2/loop_wrap = true
|
||||
tracks/2/keys = {
|
||||
"times": PackedFloat32Array(0, 1),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.443643, 0, 1.53767), Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.443643, -0.791383, 1.53767)]
|
||||
}
|
||||
tracks/3/type = "value"
|
||||
tracks/3/imported = false
|
||||
tracks/3/enabled = true
|
||||
tracks/3/path = NodePath("Spatial7:position")
|
||||
tracks/3/interp = 1
|
||||
tracks/3/loop_wrap = true
|
||||
tracks/3/keys = {
|
||||
"times": PackedFloat32Array(0.4, 1),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [Vector3(1.33, -0.119, -0.025), Vector3(1.32989, -0.583818, -0.025198)]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id="10"]
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("Spatial2:transform")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, 1)]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("Spatial5:transform")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -1, 1)]
|
||||
}
|
||||
tracks/2/type = "value"
|
||||
tracks/2/imported = false
|
||||
tracks/2/enabled = true
|
||||
tracks/2/path = NodePath("Spatial4:transform")
|
||||
tracks/2/interp = 1
|
||||
tracks/2/loop_wrap = true
|
||||
tracks/2/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.443643, 0, 1.53767)]
|
||||
}
|
||||
tracks/3/type = "value"
|
||||
tracks/3/imported = false
|
||||
tracks/3/enabled = true
|
||||
tracks/3/path = NodePath("Spatial7:position")
|
||||
tracks/3/interp = 1
|
||||
tracks/3/loop_wrap = true
|
||||
tracks/3/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [Vector3(1.32989, -0.583818, -0.025198)]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_nj4nv"]
|
||||
_data = {
|
||||
"New Anim": SubResource("9"),
|
||||
"RESET": SubResource("10")
|
||||
}
|
||||
|
||||
[sub_resource type="Shader" id="Shader_621vv"]
|
||||
code = "shader_type spatial;
|
||||
render_mode unshaded;
|
||||
|
||||
uniform sampler2D albedo_texture : source_color;
|
||||
|
||||
void fragment() {
|
||||
ALBEDO = texture(albedo_texture,UV).rgb;
|
||||
}
|
||||
"
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_ho0aq"]
|
||||
render_priority = 0
|
||||
shader = SubResource("Shader_621vv")
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_c6mie"]
|
||||
material = SubResource("ShaderMaterial_ho0aq")
|
||||
size = Vector2(4, 4)
|
||||
|
||||
[sub_resource type="Animation" id="Animation_ucqh5"]
|
||||
resource_name = "RESET"
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath(".:mesh:material:shader_parameter/albedo_texture")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 1,
|
||||
"values": [null]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_cq37i"]
|
||||
_data = {
|
||||
"RESET": SubResource("Animation_ucqh5")
|
||||
}
|
||||
|
||||
[sub_resource type="CapsuleMesh" id="CapsuleMesh_tigpa"]
|
||||
radius = 0.395
|
||||
height = 1.825
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_b14rm"]
|
||||
|
||||
[sub_resource type="SphereShape3D" id="4"]
|
||||
radius = 1.0
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="5"]
|
||||
transparency = 1
|
||||
albedo_color = Color(0.54902, 0.54902, 0.729412, 0.403922)
|
||||
emission_enabled = true
|
||||
emission = Color(0.752941, 0.741176, 0.862745, 1)
|
||||
|
||||
[sub_resource type="Animation" id="6"]
|
||||
resource_name = "New Anim"
|
||||
length = 3.0
|
||||
loop_mode = 1
|
||||
tracks/0/type = "rotation_3d"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("RayEmitter")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = PackedFloat32Array(0, 1, 0, 0, 0, 1, 1.3, 1, 1.31237e-06, -9.55543e-07, -2.2333e-06, 1, 2.3, 1, -0.158418, 0.0315871, 0.980558, -0.111409)
|
||||
tracks/1/type = "position_3d"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("RayEmitter")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/keys = PackedFloat32Array(0, 1, -1.03574, 2.47907, -0.819963, 0.5, 1, 0.914907, 1.78507, -0.103575, 1.3, 1, 0.00863326, 2.47907, -0.595551, 2.3, 1, 1.00051, 1.4046, 1.02585)
|
||||
|
||||
[sub_resource type="Animation" id="7"]
|
||||
length = 0.001
|
||||
tracks/0/type = "position_3d"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("RayEmitter")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = PackedFloat32Array(0, 1, -1.03574, 2.47907, -0.819963)
|
||||
tracks/1/type = "rotation_3d"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("RayEmitter")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/keys = PackedFloat32Array(0, 1, 0, 0, 0, 1)
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_vh8ml"]
|
||||
_data = {
|
||||
"New Anim": SubResource("6"),
|
||||
"RESET": SubResource("7")
|
||||
}
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rbfyn"]
|
||||
transparency = 1
|
||||
cull_mode = 2
|
||||
shading_mode = 0
|
||||
albedo_color = Color(0.215686, 0.215686, 0.215686, 0.764706)
|
||||
|
||||
[sub_resource type="QuadMesh" id="QuadMesh_1t0id"]
|
||||
material = SubResource("StandardMaterial3D_rbfyn")
|
||||
orientation = 1
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="1"]
|
||||
shading_mode = 0
|
||||
albedo_color = Color(0.533333, 0.105882, 0.105882, 1)
|
||||
|
||||
[sub_resource type="Animation" id="8"]
|
||||
resource_name = "RESET"
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath(".:position")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 0,
|
||||
"values": [Vector3(7, -2, 0)]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_a7f1a"]
|
||||
_data = {
|
||||
"RESET": SubResource("8")
|
||||
}
|
||||
|
||||
[sub_resource type="Shader" id="Shader_3cmiq"]
|
||||
code = "shader_type spatial;
|
||||
render_mode unshaded;
|
||||
|
||||
uniform sampler2D screen_texture : hint_screen_texture, repeat_disable, filter_nearest;
|
||||
|
||||
void fragment() {
|
||||
vec4 col = texture(screen_texture, SCREEN_UV);
|
||||
ALBEDO = col.brg;
|
||||
ALPHA = col.a;
|
||||
}
|
||||
"
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_t3isk"]
|
||||
render_priority = 0
|
||||
shader = SubResource("Shader_3cmiq")
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_0xv07"]
|
||||
material = SubResource("ShaderMaterial_t3isk")
|
||||
|
||||
[sub_resource type="Gradient" id="Gradient_tup4c"]
|
||||
offsets = PackedFloat32Array(0.00471698, 0.316038, 0.646226, 1)
|
||||
colors = PackedColorArray(0, 0.0156863, 1, 1, 0.0988327, 1, 0.122977, 1, 1, 0.111986, 0.118936, 1, 0, 0.0156863, 1, 1)
|
||||
|
||||
[sub_resource type="Animation" id="Animation_n750a"]
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/path = NodePath("../MusicPlayer:stream")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"update": 1,
|
||||
"values": [null]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_0ity1"]
|
||||
_data = {
|
||||
"RESET": SubResource("Animation_n750a")
|
||||
}
|
||||
|
||||
[sub_resource type="Theme" id="3"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_oj5gf"]
|
||||
content_margin_top = 5.0
|
||||
content_margin_bottom = 7.0
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_boyhr"]
|
||||
content_margin_left = 5.0
|
||||
content_margin_top = 5.0
|
||||
content_margin_right = 5.0
|
||||
content_margin_bottom = 5.0
|
||||
bg_color = Color(0.0705882, 0.0705882, 0.0705882, 0.784314)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[node name="DebugDrawDemoScene" type="Node3D"]
|
||||
process_priority = 1
|
||||
script = ExtResource("1")
|
||||
custom_font = ExtResource("2_aedbq")
|
||||
text_groups_position = 2
|
||||
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
|
||||
transform = Transform3D(-0.866023, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.749999, -0.43301, 0, 0, 0)
|
||||
visible = false
|
||||
directional_shadow_max_distance = 200.0
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||
environment = SubResource("Environment_38m85")
|
||||
|
||||
[node name="Camera" type="Camera3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.953191, 0.30237, 0, -0.30237, 0.953191, -6.988, 10.986, 29.2059)
|
||||
cull_mask = 1
|
||||
current = true
|
||||
fov = 53.0
|
||||
far = 100.0
|
||||
script = ExtResource("3_3m1mp")
|
||||
|
||||
[node name="Panel" type="PanelContainer" parent="."]
|
||||
visible = false
|
||||
custom_minimum_size = Vector2(300, 300)
|
||||
anchors_preset = 2
|
||||
anchor_top = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_top = -300.0
|
||||
offset_right = 300.0
|
||||
grow_vertical = 0
|
||||
|
||||
[node name="ViewportContainer" type="SubViewportContainer" parent="Panel"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Viewport" type="SubViewport" parent="Panel/ViewportContainer"]
|
||||
handle_input_locally = false
|
||||
size = Vector2i(300, 300)
|
||||
render_target_update_mode = 0
|
||||
|
||||
[node name="CameraLayer2_5" type="Camera3D" parent="Panel/ViewportContainer/Viewport"]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.34202, 0.939693, 0, -0.939693, 0.34202, -3.988, 39.474, 14.053)
|
||||
cull_mask = 2
|
||||
current = true
|
||||
fov = 38.8
|
||||
near = 2.63
|
||||
far = 52.5
|
||||
|
||||
[node name="Zones" type="Node3D" parent="."]
|
||||
|
||||
[node name="Spheres" type="Node3D" parent="Zones"]
|
||||
transform = Transform3D(8.3761, 0, 0, 0, 4.89771, 0, 0, 0, 9.36556, -11.1864, 0.645876, -7.86506)
|
||||
|
||||
[node name="Path" type="Node3D" parent="Zones"]
|
||||
transform = Transform3D(5.95153, 0, 0, 0, 7.71864, 0, 0, 0, 6.31617, 0.184938, 1.12881, -7.18731)
|
||||
|
||||
[node name="Boxes" type="Node3D" parent="Zones"]
|
||||
transform = Transform3D(10.0513, 0, 0, 0, 5.99877, 0, 0, 0, 12.1174, -16.0257, -0.206735, 6.27643)
|
||||
|
||||
[node name="Misc" type="Node3D" parent="Zones"]
|
||||
transform = Transform3D(4.38886, 0, 0, 0, 2.72083, 0, 0, 0, 7.17107, -5.69728, -0.206735, 4.4244)
|
||||
|
||||
[node name="Cylinders" type="Node3D" parent="Zones"]
|
||||
transform = Transform3D(9.78549, 0, 0, 0, 4.20302, 0, 0, 0, 5.62455, -23.6827, -0.015712, -6.19233)
|
||||
|
||||
[node name="Lines" type="Node3D" parent="Zones"]
|
||||
transform = Transform3D(10.7186, 0, 0, 0, 3.9777, 0, 0, 0, 7.05487, 10.6302, 1.91174, -7.11416)
|
||||
|
||||
[node name="Label3D" type="Label3D" parent="."]
|
||||
transform = Transform3D(1, -1.93359e-07, -8.48396e-08, -1.17881e-07, 1, 5.96046e-08, 6.22839e-09, 0, 1, 0, 0, 0)
|
||||
visible = false
|
||||
pixel_size = 0.0025
|
||||
billboard = 1
|
||||
double_sided = false
|
||||
modulate = Color(0, 0, 0, 1)
|
||||
outline_modulate = Color(1, 1, 1, 1)
|
||||
text = "TestTestTestTest
|
||||
TestTestTest"
|
||||
font_size = 80
|
||||
|
||||
[node name="LinesAnim" type="AnimationPlayer" parent="."]
|
||||
root_node = NodePath("../LinePath")
|
||||
libraries = {
|
||||
"": SubResource("AnimationLibrary_nj4nv")
|
||||
}
|
||||
autoplay = "New Anim"
|
||||
|
||||
[node name="LinePath" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.0543, -8)
|
||||
|
||||
[node name="Spatial" type="Node3D" parent="LinePath"]
|
||||
|
||||
[node name="Spatial2" type="Node3D" parent="LinePath"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 1, 1)
|
||||
|
||||
[node name="Spatial3" type="Node3D" parent="LinePath"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.462435, 0, 3)
|
||||
|
||||
[node name="Spatial4" type="Node3D" parent="LinePath"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.443643, 0, 1.53767)
|
||||
|
||||
[node name="Spatial5" type="Node3D" parent="LinePath"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -1, 1)
|
||||
|
||||
[node name="Spatial6" type="Node3D" parent="LinePath"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, -1)
|
||||
|
||||
[node name="Spatial7" type="Node3D" parent="LinePath"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.32989, -0.583818, -0.025198)
|
||||
|
||||
[node name="Cylinders" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.5266, 4.76837e-07, -5.82213)
|
||||
|
||||
[node name="Cylinder1" type="Node3D" parent="Cylinders"]
|
||||
transform = Transform3D(1.20775, 0.591481, -3.4521e-07, 0.554162, -1.12986, 0.858242, 0.208031, -0.424147, -2.28622, -3.03832, 0, -0.377882)
|
||||
|
||||
[node name="Cylinder2" type="Node3D" parent="Cylinders"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.234978, -0.4237, 0.332998)
|
||||
|
||||
[node name="Cylinder3" type="Node3D" parent="Cylinders"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.35527, -0.655492, -0.352802)
|
||||
|
||||
[node name="1" type="Node3D" parent="Cylinders/Cylinder3"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.419773, -2.38419e-07, -1.40591)
|
||||
|
||||
[node name="2" type="Node3D" parent="Cylinders/Cylinder3"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.01018, 0.486778, 1.32635)
|
||||
|
||||
[node name="Spheres" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.1201, 0.166728, -7.893)
|
||||
|
||||
[node name="SphereTransform" type="Node3D" parent="Spheres"]
|
||||
transform = Transform3D(3.018, 0, 0, 0, 0.945452, -3.30182, 0, 1.04515, 2.98686, -2.14465, 4.76837e-07, 2.11952)
|
||||
|
||||
[node name="SphereHDTransform" type="Node3D" parent="Spheres"]
|
||||
transform = Transform3D(1.26984, 1.16629, -2.42095, 0.098772, 0.80937, 4.21576, -2.65493, 0.587941, -1.00109, -2.13175, 4.76837e-07, -2.62531)
|
||||
|
||||
[node name="SpherePosition" type="Node3D" parent="Spheres"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.76745, 0.458486, 1.95921)
|
||||
|
||||
[node name="Boxes" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -15.2493, 0, 6.42043)
|
||||
|
||||
[node name="Box1" type="Node3D" parent="Boxes"]
|
||||
transform = Transform3D(2.90583, -0.000527017, -5.34615, 0.00469241, 3.92788, 0.0141019, 0.556318, -0.0303774, 1.91619, -0.961557, 0, -3.78672)
|
||||
rotation_edit_mode = 2
|
||||
|
||||
[node name="Box2" type="Node3D" parent="Boxes"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.531922, -1.34723, 1.44924)
|
||||
|
||||
[node name="Box3" type="Node3D" parent="Boxes"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.34837, -1.08298, 4.36414)
|
||||
|
||||
[node name="AABB_fixed" type="Node3D" parent="Boxes"]
|
||||
transform = Transform3D(0.834492, 0, -0.551019, 0, 1, 0, 0.55102, 0, 0.834493, -3.71325, -1.03995, 0.470324)
|
||||
|
||||
[node name="AABB" type="Node3D" parent="Boxes"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.99963, -0.869998, 0.205034)
|
||||
|
||||
[node name="a" type="Node3D" parent="Boxes/AABB"]
|
||||
transform = Transform3D(0.864099, 0.258702, 0.431747, -1.49012e-08, 0.857796, -0.51399, -0.503322, 0.444139, 0.741221, 1.48526, -1.45318, 1.96619)
|
||||
|
||||
[node name="b" type="Node3D" parent="Boxes/AABB"]
|
||||
transform = Transform3D(0.864099, 0.258702, 0.431747, -1.49012e-08, 0.857796, -0.51399, -0.503322, 0.444139, 0.741221, -1.24128, 1.47773, -2.13102)
|
||||
|
||||
[node name="BoxAB" type="Node3D" parent="Boxes"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.66169, -2.2624, 4.04042)
|
||||
|
||||
[node name="a" type="Node3D" parent="Boxes/BoxAB"]
|
||||
transform = Transform3D(0.864099, 0.258702, 0.431747, -1.49012e-08, 0.857796, -0.51399, -0.503322, 0.444139, 0.741221, 0.556136, -0.666145, 0.951601)
|
||||
|
||||
[node name="b" type="Node3D" parent="Boxes/BoxAB"]
|
||||
transform = Transform3D(0.864099, 0.258702, 0.431747, -1.49012e-08, 0.857796, -0.51399, -0.503322, 0.444139, 0.741221, -0.548804, 0.715255, -0.942184)
|
||||
|
||||
[node name="o" type="Node3D" parent="Boxes/BoxAB"]
|
||||
transform = Transform3D(0.826805, 0.360538, 0.431748, -0.102949, 0.851596, -0.51399, -0.552988, 0.380522, 0.741221, 0, 0, 0)
|
||||
metadata/_edit_group_ = true
|
||||
|
||||
[node name="up" type="Node3D" parent="Boxes/BoxAB/o"]
|
||||
transform = Transform3D(1, -1.49012e-08, 0, -1.04308e-07, 1, 0, 0, 0, 1, 0, 0.553809, -0.331842)
|
||||
|
||||
[node name="BoxABEdge" type="Node3D" parent="Boxes"]
|
||||
transform = Transform3D(0.965926, -0.0669873, -0.25, 0, 0.965926, -0.258819, 0.258819, 0.25, 0.933013, 0.348115, -1.30239, 4.88007)
|
||||
|
||||
[node name="a" type="Node3D" parent="Boxes/BoxABEdge"]
|
||||
transform = Transform3D(0.241143, 0.650584, 0.720132, -0.123077, 0.756539, -0.642262, -0.962654, 0.066246, 0.262507, 0.384618, -0.635015, 0.0956135)
|
||||
|
||||
[node name="b" type="Node3D" parent="Boxes/BoxABEdge"]
|
||||
transform = Transform3D(0.241143, 0.650584, 0.720133, -0.123077, 0.756539, -0.642261, -0.962654, 0.0662459, 0.262507, -0.287622, 0.997905, -0.144578)
|
||||
|
||||
[node name="o" type="Node3D" parent="Boxes/BoxABEdge"]
|
||||
transform = Transform3D(1, 1.49012e-08, 2.98023e-08, 7.45058e-09, 1, -1.49012e-08, -1.49012e-08, -1.49012e-08, 1, 0, 0, 0)
|
||||
metadata/_edit_group_ = true
|
||||
|
||||
[node name="up" type="Node3D" parent="Boxes/BoxABEdge/o"]
|
||||
transform = Transform3D(1, -7.45058e-09, 0, -7.45058e-09, 1, 0, 2.98023e-08, -1.49012e-08, 1, -9.53674e-07, 0.6, 0)
|
||||
|
||||
[node name="OtherWorld" type="MeshInstance3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.53219, -2.5, 5.30229)
|
||||
mesh = SubResource("PlaneMesh_c6mie")
|
||||
skeleton = NodePath("")
|
||||
|
||||
[node name="RESET" type="AnimationPlayer" parent="OtherWorld"]
|
||||
libraries = {
|
||||
"": SubResource("AnimationLibrary_cq37i")
|
||||
}
|
||||
|
||||
[node name="SubViewport" type="SubViewport" parent="OtherWorld"]
|
||||
own_world_3d = true
|
||||
render_target_update_mode = 4
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="OtherWorld/SubViewport"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.57063, 0.6, 7.25557)
|
||||
current = true
|
||||
far = 5.0
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="OtherWorld/SubViewport"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.57063, 0.6, 5.72253)
|
||||
mesh = SubResource("CapsuleMesh_tigpa")
|
||||
|
||||
[node name="OtherWorldBox" type="Node3D" parent="OtherWorld/SubViewport"]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.57063, 0.6, 5.72253)
|
||||
|
||||
[node name="Misc" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.68259, 0, 4.46741)
|
||||
|
||||
[node name="Billboard" type="Node3D" parent="Misc"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.403353, -0.331599, 2.22542)
|
||||
|
||||
[node name="Arrow" type="Node3D" parent="Misc"]
|
||||
transform = Transform3D(0.802141, -0.286294, -0.524028, -0.539546, 0.0285125, -0.841473, 0.25585, 0.957718, -0.131597, -0.475607, -0.670307, 2.30581)
|
||||
|
||||
[node name="Position" type="Node3D" parent="Misc"]
|
||||
transform = Transform3D(1.51514, 0.589536, 1.00858, -1.34875, 0.662262, 1.133, 0, -0.462445, 2.90833, 0.853743, 0.0843356, -1.73676)
|
||||
|
||||
[node name="GizmoNormal" type="Node3D" parent="Misc"]
|
||||
transform = Transform3D(0.965926, 0, -0.258819, 0, 1, 0, 0.258819, 0, 0.965926, 0.890203, -0.306246, 0.356159)
|
||||
|
||||
[node name="ZDepthTestCube" type="MeshInstance3D" parent="Misc/GizmoNormal"]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(0.591801, 0, 4.47035e-08, 0, 0.591801, 0, -4.47035e-08, 0, 0.591801, 0, 0, 0)
|
||||
mesh = SubResource("BoxMesh_b14rm")
|
||||
|
||||
[node name="GizmoTransform" type="Node3D" parent="Misc"]
|
||||
transform = Transform3D(0.879881, 0.248446, -0.405072, -0.346604, 0.918688, -0.189411, 0.325077, 0.307059, 0.894449, -0.838587, -0.458, -0.176491)
|
||||
|
||||
[node name="GizmoOneColor" type="Node3D" parent="Misc"]
|
||||
transform = Transform3D(0.385568, 0.0415614, 0.921743, 0.082879, 0.993386, -0.0794599, -0.91895, 0.107031, 0.379573, -0.838587, -0.139425, -1.93055)
|
||||
|
||||
[node name="HitTest" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.724359, -1.03227, 7.85404)
|
||||
|
||||
[node name="StaticBody" type="StaticBody3D" parent="HitTest"]
|
||||
|
||||
[node name="CollisionShape" type="CollisionShape3D" parent="HitTest/StaticBody"]
|
||||
shape = SubResource("4")
|
||||
|
||||
[node name="CSGSphere" type="CSGSphere3D" parent="HitTest/StaticBody"]
|
||||
radius = 1.0
|
||||
radial_segments = 16
|
||||
rings = 10
|
||||
material = SubResource("5")
|
||||
|
||||
[node name="RayEmitter" type="Node3D" parent="HitTest"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.03574, 2.47907, -0.819963)
|
||||
|
||||
[node name="RayCast" type="RayCast3D" parent="HitTest/RayEmitter"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.732104, 0, -0.814761)
|
||||
enabled = false
|
||||
target_position = Vector3(0, -3.464, 0)
|
||||
|
||||
[node name="RayCast2" type="RayCast3D" parent="HitTest/RayEmitter"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.684873, 0, -0.791145)
|
||||
enabled = false
|
||||
target_position = Vector3(0, -3.464, 0)
|
||||
|
||||
[node name="RayCast3" type="RayCast3D" parent="HitTest/RayEmitter"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.708488, 0, 0.543175)
|
||||
enabled = false
|
||||
target_position = Vector3(0, -3.464, 0)
|
||||
|
||||
[node name="RayCast4" type="RayCast3D" parent="HitTest/RayEmitter"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.708489, 0, 0.566791)
|
||||
enabled = false
|
||||
target_position = Vector3(0, -3.464, 0)
|
||||
|
||||
[node name="RayCast5" type="RayCast3D" parent="HitTest/RayEmitter"]
|
||||
transform = Transform3D(0.974217, -0.225614, 0, 0.225614, 0.974217, 0, 0, 0, 1, -0.447564, 0, -0.259778)
|
||||
enabled = false
|
||||
target_position = Vector3(0, -3.464, 0)
|
||||
|
||||
[node name="RayCast6" type="RayCast3D" parent="HitTest/RayEmitter"]
|
||||
transform = Transform3D(0.935992, 0.352021, 0, -0.352021, 0.935992, 0, 0, 0, 1, 0.35227, -0.245904, -0.25849)
|
||||
enabled = false
|
||||
target_position = Vector3(0, -3.464, 0)
|
||||
|
||||
[node name="RayEmitterAnimationPlayer" type="AnimationPlayer" parent="HitTest"]
|
||||
unique_name_in_owner = true
|
||||
libraries = {
|
||||
"": SubResource("AnimationLibrary_vh8ml")
|
||||
}
|
||||
autoplay = "New Anim"
|
||||
|
||||
[node name="Grids" type="Node3D" parent="."]
|
||||
transform = Transform3D(0.707106, 0, -0.707108, 0, 1, 0, 0.707108, 0, 0.707106, 0.730597, -2.5, 2.76274)
|
||||
|
||||
[node name="GridCentered" type="Node3D" parent="Grids"]
|
||||
transform = Transform3D(1.74492, 0.723785, -1.74493, -1.24976, -7.72562e-08, -1.24975, -1.74493, 0.723783, 1.74493, 1.74919, -0.0010004, 1.75466)
|
||||
rotation_edit_mode = 2
|
||||
|
||||
[node name="Subdivision" type="Node3D" parent="Grids/GridCentered"]
|
||||
transform = Transform3D(1, -6.03961e-14, -2.68221e-07, 3.55271e-13, 1, 1.42109e-14, -1.19209e-07, 1.1724e-13, 1, -0.2, 4.76837e-07, 0.4)
|
||||
|
||||
[node name="Grid" type="Node3D" parent="Grids"]
|
||||
transform = Transform3D(5, 0, 2.38419e-07, 0, 1, 0, -2.38419e-07, 0, 5, 0, 0, 0)
|
||||
|
||||
[node name="Subdivision" type="Node3D" parent="Grids/Grid"]
|
||||
transform = Transform3D(1, 0, -2.98023e-08, 0, 0.999999, 1.90735e-05, 0, 4.65661e-10, 0.999999, 1, 0, 1)
|
||||
|
||||
[node name="PlaneOrigin" type="MeshInstance3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 11.0482, 7.33669, -13.1715)
|
||||
mesh = SubResource("QuadMesh_1t0id")
|
||||
|
||||
[node name="Lines" type="Node3D" parent="."]
|
||||
transform = Transform3D(1.51514, 0.589536, 1.00858, -1.34875, 0.662262, 1.133, 0, -0.462445, 2.90833, 10.2488, -0.331599, -10.3326)
|
||||
|
||||
[node name="1" type="Node3D" parent="Lines"]
|
||||
transform = Transform3D(1, 6.61592e-09, 2.23038e-08, 9.40939e-07, 1, 0, -2.76085e-08, -1.49012e-08, 1, -1.46213, -4.03317, 0.61692)
|
||||
|
||||
[node name="2" type="Node3D" parent="Lines"]
|
||||
transform = Transform3D(1, 6.61592e-09, 2.23038e-08, 9.40939e-07, 1, 0, -2.76085e-08, -1.49012e-08, 1, -1.01875, -1.79584, -0.163045)
|
||||
|
||||
[node name="3" type="Node3D" parent="Lines"]
|
||||
transform = Transform3D(1, 6.61592e-09, 2.23038e-08, 6.87561e-07, 1, 0, -2.87275e-08, -1.49012e-08, 1, -0.1559, -0.407045, 0.0523388)
|
||||
|
||||
[node name="4" type="Node3D" parent="Lines"]
|
||||
transform = Transform3D(1, 6.61592e-09, 2.23038e-08, 4.9239e-07, 1, 0, -3.40677e-08, -1.49012e-08, 1, 1.18591, 1.8987, 0.301906)
|
||||
|
||||
[node name="5" type="Node3D" parent="Lines"]
|
||||
transform = Transform3D(-0.998871, -0.0207882, -0.0355643, 0.0855375, -0.5714, -2.68836, 0.0136011, -0.249864, 0.572532, 1.43126, 0.26242, 1.92347)
|
||||
|
||||
[node name="6" type="Node3D" parent="Lines"]
|
||||
transform = Transform3D(-0.998872, -0.0207882, -0.0355643, 0.085537, -0.5714, -2.68836, 0.0136012, -0.249864, 0.572533, 1.43441, 1.50606, 1.20028)
|
||||
|
||||
[node name="7" type="Node3D" parent="Lines"]
|
||||
transform = Transform3D(-0.998873, -0.0207882, -0.0355641, 0.0855357, -0.5714, -2.68836, 0.0136014, -0.249864, 0.572533, 0.0511096, -1.3236, 1.06745)
|
||||
|
||||
[node name="8" type="Node3D" parent="Lines"]
|
||||
transform = Transform3D(-0.998873, -0.0207882, -0.0355641, 0.0855353, -0.5714, -2.68836, 0.0136016, -0.249864, 0.572533, -1.01372, -3.80486, 1.25019)
|
||||
|
||||
[node name="Target" type="Node3D" parent="Lines"]
|
||||
transform = Transform3D(1, -2.7352e-06, 2.60722e-07, 4.10378e-06, 1, 0, -4.28605e-07, -1.49012e-08, 1, -0.69134, 0.176475, 1.30597)
|
||||
|
||||
[node name="LagTest" type="CSGBox3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7, -2, 0)
|
||||
size = Vector3(2, 2, 2)
|
||||
material = SubResource("1")
|
||||
|
||||
[node name="RESET" type="AnimationPlayer" parent="LagTest"]
|
||||
libraries = {
|
||||
"": SubResource("AnimationLibrary_a7f1a")
|
||||
}
|
||||
|
||||
[node name="PostProcess" type="MeshInstance3D" parent="."]
|
||||
transform = Transform3D(-2.18557e-07, 0, 1.5, 0, 5, 0, -5, 0, -6.55671e-08, 16, 0, 0)
|
||||
mesh = SubResource("BoxMesh_0xv07")
|
||||
skeleton = NodePath("../Lines")
|
||||
|
||||
[node name="MusicVisualizer" type="VBoxContainer" parent="."]
|
||||
offset_left = 10.0
|
||||
offset_top = 10.0
|
||||
offset_right = 50.0
|
||||
offset_bottom = 50.0
|
||||
script = ExtResource("4_eq2lt")
|
||||
colors = SubResource("Gradient_tup4c")
|
||||
|
||||
[node name="OpenFile" type="Button" parent="MusicVisualizer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 0
|
||||
text = "Open music"
|
||||
|
||||
[node name="RESET" type="AnimationPlayer" parent="MusicVisualizer"]
|
||||
root_node = NodePath("../OpenFile")
|
||||
libraries = {
|
||||
"": SubResource("AnimationLibrary_0ity1")
|
||||
}
|
||||
|
||||
[node name="MusicPlayer" type="AudioStreamPlayer" parent="MusicVisualizer"]
|
||||
unique_name_in_owner = true
|
||||
autoplay = true
|
||||
bus = &"MusicAnalyzer"
|
||||
|
||||
[node name="VBox" type="VBoxContainer" parent="MusicVisualizer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="MusicVisualizer/VBox"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="VolumeSlider" type="HSlider" parent="MusicVisualizer/VBox/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 4
|
||||
max_value = 1.0
|
||||
step = 0.01
|
||||
value = 0.1
|
||||
|
||||
[node name="MuteMaster" type="CheckBox" parent="MusicVisualizer/VBox/HBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
button_pressed = true
|
||||
text = "Mute"
|
||||
|
||||
[node name="AudioVisualizer" type="Node3D" parent="."]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(0.2, 0, 0, 0, 5, 0, 0, 0, 0.2, -5.31036, -1.422, 14.14)
|
||||
|
||||
[node name="CustomCanvas" type="Control" parent="."]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 3
|
||||
anchors_preset = 1
|
||||
anchor_left = 1.0
|
||||
anchor_right = 1.0
|
||||
offset_left = -545.0
|
||||
offset_top = 46.0
|
||||
offset_right = -37.0
|
||||
offset_bottom = 638.0
|
||||
grow_horizontal = 0
|
||||
mouse_filter = 2
|
||||
metadata/_edit_lock_ = true
|
||||
|
||||
[node name="Settings" type="Control" parent="."]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 2
|
||||
theme = SubResource("3")
|
||||
script = ExtResource("5_31v5h")
|
||||
switch_to_scene = "res://examples_dd3d/DebugDrawDemoSceneCS.tscn"
|
||||
metadata/_edit_lock_ = true
|
||||
|
||||
[node name="HBox" type="HBoxContainer" parent="Settings"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 3
|
||||
anchor_left = 1.0
|
||||
anchor_top = 1.0
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_left = -497.0
|
||||
offset_top = -372.0
|
||||
offset_right = -10.0006
|
||||
offset_bottom = -10.0
|
||||
grow_horizontal = 0
|
||||
grow_vertical = 0
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="Settings/HBox"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 8
|
||||
|
||||
[node name="VersionBlock" type="HBoxContainer" parent="Settings/HBox/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
script = ExtResource("6_07f7q")
|
||||
|
||||
[node name="Label" type="Label" parent="Settings/HBox/VBoxContainer/VersionBlock"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 10
|
||||
theme_override_font_sizes/font_size = 13
|
||||
text = "Demo version:"
|
||||
|
||||
[node name="OptionButton" type="OptionButton" parent="Settings/HBox/VBoxContainer/VersionBlock"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 8
|
||||
theme_override_font_sizes/font_size = 13
|
||||
item_count = 1
|
||||
popup/item_0/text = "1.0.0"
|
||||
popup/item_0/id = 0
|
||||
|
||||
[node name="Label" type="Label" parent="Settings/HBox/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 8
|
||||
theme_override_styles/normal = SubResource("StyleBoxEmpty_oj5gf")
|
||||
text = "GDScript example"
|
||||
horizontal_alignment = 2
|
||||
metadata/_edit_use_anchors_ = true
|
||||
|
||||
[node name="VBox" type="VBoxContainer" parent="Settings/HBox"]
|
||||
layout_mode = 2
|
||||
alignment = 2
|
||||
|
||||
[node name="HideShowPanelButton" type="Button" parent="Settings/HBox/VBox"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
theme_override_font_sizes/font_size = 13
|
||||
text = "Hide panel"
|
||||
|
||||
[node name="SettingsPanel" type="PanelContainer" parent="Settings/HBox/VBox"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 8
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_boyhr")
|
||||
|
||||
[node name="VBox" type="VBoxContainer" parent="Settings/HBox/VBox/SettingsPanel"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
alignment = 2
|
||||
|
||||
[node name="Label" type="Label" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0.792157, 0.792157, 0.792157, 1)
|
||||
text = "Common:"
|
||||
|
||||
[node name="HBox3" type="HBoxContainer" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label" type="Label" parent="Settings/HBox/VBox/SettingsPanel/VBox/HBox3"]
|
||||
layout_mode = 2
|
||||
text = "Thickness "
|
||||
|
||||
[node name="ThicknessSlider" type="HSlider" parent="Settings/HBox/VBox/SettingsPanel/VBox/HBox3"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 4
|
||||
max_value = 0.5
|
||||
step = 0.001
|
||||
value = 0.05
|
||||
|
||||
[node name="HBox5" type="HBoxContainer" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label" type="Label" parent="Settings/HBox/VBox/SettingsPanel/VBox/HBox5"]
|
||||
layout_mode = 2
|
||||
text = "Frustum Scale"
|
||||
|
||||
[node name="FrustumScaleSlider" type="HSlider" parent="Settings/HBox/VBox/SettingsPanel/VBox/HBox5"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 4
|
||||
max_value = 1.0
|
||||
step = 0.001
|
||||
value = 0.5
|
||||
|
||||
[node name="UpdateInPhysics" type="CheckBox" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Update in physics (15 Ticks) *"
|
||||
|
||||
[node name="Label2" type="Label" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0.792157, 0.792157, 0.792157, 1)
|
||||
text = "FPS Graph:"
|
||||
|
||||
[node name="FPSEnabled" type="CheckBox" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
button_pressed = true
|
||||
text = "FPS Graph enabled"
|
||||
|
||||
[node name="FPSMS" type="CheckBox" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
button_pressed = true
|
||||
text = "FPS Graph ms or FPS"
|
||||
|
||||
[node name="HBox" type="HBoxContainer" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label" type="Label" parent="Settings/HBox/VBox/SettingsPanel/VBox/HBox"]
|
||||
layout_mode = 2
|
||||
text = "Width "
|
||||
|
||||
[node name="WidthSlider" type="HSlider" parent="Settings/HBox/VBox/SettingsPanel/VBox/HBox"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 4
|
||||
min_value = 50.0
|
||||
max_value = 1000.0
|
||||
value = 200.0
|
||||
|
||||
[node name="HBox2" type="HBoxContainer" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label" type="Label" parent="Settings/HBox/VBox/SettingsPanel/VBox/HBox2"]
|
||||
layout_mode = 2
|
||||
text = "BufferSize"
|
||||
|
||||
[node name="BufferSlider" type="HSlider" parent="Settings/HBox/VBox/SettingsPanel/VBox/HBox2"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 4
|
||||
min_value = 50.0
|
||||
max_value = 1000.0
|
||||
value = 128.0
|
||||
|
||||
[node name="Label3" type="Label" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
layout_mode = 2
|
||||
theme_override_colors/font_color = Color(0.792157, 0.792157, 0.792157, 1)
|
||||
text = "Misc:"
|
||||
|
||||
[node name="ShowStats" type="CheckBox" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Show debug stats"
|
||||
|
||||
[node name="HBox4" type="HBoxContainer" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="DrawBoxes" type="CheckBox" parent="Settings/HBox/VBox/SettingsPanel/VBox/HBox4"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Draw an array of boxes"
|
||||
|
||||
[node name="Draw1MBoxes" type="CheckBox" parent="Settings/HBox/VBox/SettingsPanel/VBox/HBox4"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
tooltip_text = "Draw 1 Million boxes, otherwise 7500pcs."
|
||||
text = "1M"
|
||||
|
||||
[node name="SwitchLang" type="Button" parent="Settings/HBox/VBox/SettingsPanel/VBox"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Switch to C#"
|
||||
|
||||
[connection signal="pressed" from="MusicVisualizer/OpenFile" to="MusicVisualizer" method="_pressed"]
|
||||
[connection signal="value_changed" from="MusicVisualizer/VBox/HBoxContainer/VolumeSlider" to="MusicVisualizer" method="_on_volume_slider_value_changed"]
|
||||
[connection signal="toggled" from="MusicVisualizer/VBox/HBoxContainer/MuteMaster" to="MusicVisualizer" method="_on_mute_master_toggled"]
|
||||
[connection signal="pressed" from="Settings/HBox/VBox/HideShowPanelButton" to="Settings" method="_on_hide_show_panel_pressed"]
|
||||
[connection signal="value_changed" from="Settings/HBox/VBox/SettingsPanel/VBox/HBox3/ThicknessSlider" to="Settings" method="_on_thickness_slider_value_changed"]
|
||||
[connection signal="value_changed" from="Settings/HBox/VBox/SettingsPanel/VBox/HBox5/FrustumScaleSlider" to="Settings" method="_on_frustum_scale_slider_value_changed"]
|
||||
[connection signal="toggled" from="Settings/HBox/VBox/SettingsPanel/VBox/UpdateInPhysics" to="Settings" method="_on_update_in_physics_toggled"]
|
||||
[connection signal="toggled" from="Settings/HBox/VBox/SettingsPanel/VBox/FPSEnabled" to="Settings" method="_on_CheckBox_toggled"]
|
||||
[connection signal="toggled" from="Settings/HBox/VBox/SettingsPanel/VBox/FPSMS" to="Settings" method="_on_FPSMS_toggled"]
|
||||
[connection signal="value_changed" from="Settings/HBox/VBox/SettingsPanel/VBox/HBox/WidthSlider" to="Settings" method="_on_width_slider_value_changed"]
|
||||
[connection signal="value_changed" from="Settings/HBox/VBox/SettingsPanel/VBox/HBox2/BufferSlider" to="Settings" method="_on_buffer_slider_value_changed"]
|
||||
[connection signal="toggled" from="Settings/HBox/VBox/SettingsPanel/VBox/ShowStats" to="Settings" method="_on_show_stats_toggled"]
|
||||
[connection signal="toggled" from="Settings/HBox/VBox/SettingsPanel/VBox/HBox4/DrawBoxes" to="Settings" method="_on_draw_boxes_toggled"]
|
||||
[connection signal="toggled" from="Settings/HBox/VBox/SettingsPanel/VBox/HBox4/Draw1MBoxes" to="Settings" method="_on_draw_1m_boxes_toggled"]
|
||||
[connection signal="pressed" from="Settings/HBox/VBox/SettingsPanel/VBox/SwitchLang" to="Settings" method="_on_Button_pressed"]
|
||||
871
examples_dd3d/DebugDrawDemoSceneCS.cs
Normal file
871
examples_dd3d/DebugDrawDemoSceneCS.cs
Normal file
|
|
@ -0,0 +1,871 @@
|
|||
|
||||
using Godot;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
[Tool]
|
||||
public partial class DebugDrawDemoSceneCS : Node3D
|
||||
{
|
||||
Random random = new Random();
|
||||
|
||||
[Export] Font custom_font;
|
||||
[Export] bool zylann_example = false;
|
||||
[Export] bool update_in_physics = false;
|
||||
[Export] bool test_text = true;
|
||||
[Export] bool test_graphs = false;
|
||||
[Export] bool test_fps_graph = true;
|
||||
[Export] bool more_test_cases = true;
|
||||
[Export] bool draw_array_of_boxes = false;
|
||||
[Export] bool draw_1m_boxes = false;
|
||||
[Export(PropertyHint.Range, "0, 5, 0.001")] float debug_thickness = 0.1f;
|
||||
[Export(PropertyHint.Range, "0, 1")] float camera_frustum_scale = 0.9f;
|
||||
|
||||
[ExportGroup("Text groups", "text_groups")]
|
||||
[Export] bool text_groups_show_hints = true;
|
||||
[Export] bool text_groups_show_stats = true;
|
||||
[Export] bool text_groups_show_stats_2d = true;
|
||||
[Export] DebugDraw2DConfig.BlockPosition text_groups_position = DebugDraw2DConfig.BlockPosition.LeftTop;
|
||||
[Export] Vector2I text_groups_offset = new Vector2I(8, 8);
|
||||
[Export] Vector2I text_groups_padding = new Vector2I(3, 1);
|
||||
[Export(PropertyHint.Range, "1, 100")] int text_groups_default_font_size = 15;
|
||||
[Export(PropertyHint.Range, "1, 100")] int text_groups_title_font_size = 20;
|
||||
[Export(PropertyHint.Range, "1, 100")] int text_groups_text_font_size = 17;
|
||||
|
||||
[ExportGroup("Graphs", "graph")]
|
||||
[Export] Vector2I graph_offset = new Vector2I(8, 8);
|
||||
[Export] Vector2I graph_size = new Vector2I(200, 80);
|
||||
[Export(PropertyHint.Range, "1, 100")] int graph_title_font_size = 14;
|
||||
[Export(PropertyHint.Range, "1, 100")] int graph_text_font_size = 12;
|
||||
[Export(PropertyHint.Range, "0, 64")] int graph_text_precision = 1;
|
||||
[Export(PropertyHint.Range, "1, 32")] float graph_line_width = 1.0f;
|
||||
[Export(PropertyHint.Range, "1, 512")] int graph_buffer_size = 128;
|
||||
[Export] bool graph_frame_time_mode = true;
|
||||
[Export] bool graph_is_enabled = true;
|
||||
|
||||
Dictionary<Key, int> button_presses = new Dictionary<Key, int>() {
|
||||
{ Key.Left, 0 },
|
||||
{ Key.Up, 0 },
|
||||
{ Key.Ctrl, 0 },
|
||||
{ Key.F1, 0 },
|
||||
{ Key.Key1, 0 },
|
||||
{ Key.Key2, 0 },
|
||||
{ Key.Key3, 0 },
|
||||
};
|
||||
|
||||
double timer_1 = 0.0;
|
||||
double timer_cubes = 0.0;
|
||||
double timer_3 = 0.0;
|
||||
double timer_text = 0.0;
|
||||
|
||||
// TODO remove after moving to 4.2
|
||||
bool is_4_2_and_higher = ((int)Engine.GetVersionInfo()["major"]) >= 4 && ((int)Engine.GetVersionInfo()["minor"]) >= 2;
|
||||
|
||||
Node3D dHitTest;
|
||||
CsgBox3D dLagTest;
|
||||
PanelContainer dPanel;
|
||||
Node3D dZones;
|
||||
Node3D dSpherePosition;
|
||||
Node3D dSphereTransform;
|
||||
Node3D dSphereHDTransform;
|
||||
Node3D dAABB;
|
||||
Node3D dAABB_fixed;
|
||||
Node3D dBox1;
|
||||
Node3D dBox2;
|
||||
Node3D dBox3;
|
||||
Node3D dBoxAB;
|
||||
Node3D dBoxABa;
|
||||
Node3D dBoxABb;
|
||||
Node3D dBoxABup;
|
||||
Node3D dBoxABEdge;
|
||||
Node3D dBoxABEdgea;
|
||||
Node3D dBoxABEdgeb;
|
||||
Node3D dBoxABEdgeup;
|
||||
Node3D dLines_1;
|
||||
Node3D dLines_2;
|
||||
Node3D dLines_3;
|
||||
Node3D dLines_4;
|
||||
Node3D dLines_5;
|
||||
Node3D dLines_6;
|
||||
Node3D dLines_7;
|
||||
Node3D dLines_8;
|
||||
Node3D dLines_Target;
|
||||
Node3D dLinePath;
|
||||
Node3D dCylinder1;
|
||||
Node3D dCylinder2;
|
||||
Node3D dCylinder3a;
|
||||
Node3D dCylinder3b;
|
||||
|
||||
MeshInstance3D dPlaneOrigin;
|
||||
MeshInstance3D pZDepthTestCube;
|
||||
|
||||
MeshInstance3D dOtherWorld;
|
||||
SubViewport dOtherWorldViewport;
|
||||
Node3D dOtherWorldBox;
|
||||
|
||||
Control dCustomCanvas;
|
||||
Node3D dMisc_Arrow;
|
||||
Camera3D dCamera;
|
||||
Node3D dMisc_Billboard;
|
||||
Node3D dMisc_Position;
|
||||
Node3D dMisc_GizmoTransform;
|
||||
Node3D dMisc_GizmoNormal;
|
||||
Node3D dMisc_GizmoOneColor;
|
||||
|
||||
Node3D dMisc_Grids_Grid;
|
||||
Node3D dMisc_Grids_Grid_Subdivision;
|
||||
Node3D dMisc_Grids_GridCentered_Subdivision;
|
||||
Node3D dMisc_Grids_GridCentered;
|
||||
|
||||
MeshInstance3D dPostProcess;
|
||||
AnimationPlayer dLagTest_RESET;
|
||||
Node3D dHitTest_RayEmitter;
|
||||
|
||||
|
||||
public override async void _Ready()
|
||||
{
|
||||
dHitTest = GetNode<Node3D>("HitTest");
|
||||
dLagTest = GetNode<CsgBox3D>("LagTest");
|
||||
dPanel = GetNode<PanelContainer>("Panel");
|
||||
dZones = GetNode<Node3D>("Zones");
|
||||
dSpherePosition = GetNode<Node3D>("Spheres/SpherePosition");
|
||||
dSphereTransform = GetNode<Node3D>("Spheres/SphereTransform");
|
||||
dSphereHDTransform = GetNode<Node3D>("Spheres/SphereHDTransform");
|
||||
dAABB = GetNode<Node3D>("Boxes/AABB");
|
||||
dAABB_fixed = GetNode<Node3D>("Boxes/AABB_fixed");
|
||||
dBox1 = GetNode<Node3D>("Boxes/Box1");
|
||||
dBox2 = GetNode<Node3D>("Boxes/Box2");
|
||||
dBox3 = GetNode<Node3D>("Boxes/Box3");
|
||||
dBoxAB = GetNode<Node3D>("Boxes/BoxAB");
|
||||
dBoxABa = GetNode<Node3D>("Boxes/BoxAB/a");
|
||||
dBoxABb = GetNode<Node3D>("Boxes/BoxAB/b");
|
||||
dBoxABup = GetNode<Node3D>("Boxes/BoxAB/o/up");
|
||||
dBoxABEdge = GetNode<Node3D>("Boxes/BoxABEdge");
|
||||
dBoxABEdgea = GetNode<Node3D>("Boxes/BoxABEdge/a");
|
||||
dBoxABEdgeb = GetNode<Node3D>("Boxes/BoxABEdge/b");
|
||||
dBoxABEdgeup = GetNode<Node3D>("Boxes/BoxABEdge/o/up");
|
||||
dLines_1 = GetNode<Node3D>("Lines/1");
|
||||
dLines_2 = GetNode<Node3D>("Lines/2");
|
||||
dLines_3 = GetNode<Node3D>("Lines/3");
|
||||
dLines_4 = GetNode<Node3D>("Lines/4");
|
||||
dLines_5 = GetNode<Node3D>("Lines/5");
|
||||
dLines_6 = GetNode<Node3D>("Lines/6");
|
||||
dLines_7 = GetNode<Node3D>("Lines/7");
|
||||
dLines_8 = GetNode<Node3D>("Lines/8");
|
||||
dLines_Target = GetNode<Node3D>("Lines/Target");
|
||||
dLinePath = GetNode<Node3D>("LinePath");
|
||||
dCylinder1 = GetNode<Node3D>("Cylinders/Cylinder1");
|
||||
dCylinder2 = GetNode<Node3D>("Cylinders/Cylinder2");
|
||||
dCylinder3a = GetNode<Node3D>("Cylinders/Cylinder3/1");
|
||||
dCylinder3b = GetNode<Node3D>("Cylinders/Cylinder3/2");
|
||||
|
||||
dPlaneOrigin = GetNode<MeshInstance3D>("PlaneOrigin");
|
||||
pZDepthTestCube = GetNode<MeshInstance3D>("%ZDepthTestCube");
|
||||
|
||||
dOtherWorld = GetNode<MeshInstance3D>("OtherWorld");
|
||||
dOtherWorldViewport = GetNode<SubViewport>("OtherWorld/SubViewport");
|
||||
dOtherWorldBox = GetNode<Node3D>("OtherWorld/SubViewport/OtherWorldBox");
|
||||
|
||||
dCustomCanvas = GetNode<Control>("CustomCanvas");
|
||||
dMisc_Arrow = GetNode<Node3D>("Misc/Arrow");
|
||||
dCamera = GetNode<Camera3D>("Camera");
|
||||
dMisc_Billboard = GetNode<Node3D>("Misc/Billboard");
|
||||
dMisc_Position = GetNode<Node3D>("Misc/Position");
|
||||
dMisc_GizmoTransform = GetNode<Node3D>("Misc/GizmoTransform");
|
||||
dMisc_GizmoNormal = GetNode<Node3D>("Misc/GizmoNormal");
|
||||
dMisc_GizmoOneColor = GetNode<Node3D>("Misc/GizmoOneColor");
|
||||
|
||||
dMisc_Grids_Grid = GetNode<Node3D>("Grids/Grid");
|
||||
dMisc_Grids_Grid_Subdivision = GetNode<Node3D>("Grids/Grid/Subdivision");
|
||||
dMisc_Grids_GridCentered_Subdivision = GetNode<Node3D>("Grids/GridCentered/Subdivision");
|
||||
dMisc_Grids_GridCentered = GetNode<Node3D>("Grids/GridCentered");
|
||||
|
||||
dPostProcess = GetNode<MeshInstance3D>("PostProcess");
|
||||
|
||||
dLagTest_RESET = GetNode<AnimationPlayer>("LagTest/RESET");
|
||||
dHitTest_RayEmitter = GetNode<Node3D>("HitTest/RayEmitter");
|
||||
|
||||
_update_keys_just_press();
|
||||
|
||||
await new SignalAwaiter(GetTree(), "process_frame", this);
|
||||
|
||||
// this check is required for inherited scenes, because an instance of this
|
||||
// script is created first, and then overridden by another
|
||||
if (!IsInsideTree())
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
bool _is_key_just_pressed(Key key)
|
||||
{
|
||||
if (button_presses[key] == 1)
|
||||
{
|
||||
button_presses[key] = 2;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void _update_timers(double delta)
|
||||
{
|
||||
timer_1 -= delta;
|
||||
timer_cubes -= delta;
|
||||
timer_3 -= delta;
|
||||
timer_text -= delta;
|
||||
}
|
||||
|
||||
void _update_keys_just_press()
|
||||
{
|
||||
var set = (Key k) => Input.IsKeyPressed(k) ? (button_presses[k] == 0 ? 1 : button_presses[k]) : 0;
|
||||
button_presses[Key.Left] = set(Key.Left);
|
||||
button_presses[Key.Up] = set(Key.Up);
|
||||
button_presses[Key.Ctrl] = set(Key.Ctrl);
|
||||
button_presses[Key.F1] = set(Key.F1);
|
||||
button_presses[Key.Key1] = set(Key.Key1);
|
||||
button_presses[Key.Key2] = set(Key.Key2);
|
||||
button_presses[Key.Key3] = set(Key.Key3);
|
||||
}
|
||||
|
||||
bool phys_frame_called = false;
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
((ShaderMaterial)((PrimitiveMesh)dOtherWorld.Mesh).Material).SetShaderParameter("albedo_texture", dOtherWorldViewport.GetTexture());
|
||||
|
||||
phys_frame_called = false;
|
||||
if (!update_in_physics)
|
||||
{
|
||||
MainUpdate(delta);
|
||||
_update_timers(delta);
|
||||
}
|
||||
}
|
||||
|
||||
public override void _PhysicsProcess(double delta)
|
||||
{
|
||||
if (!phys_frame_called)
|
||||
{
|
||||
phys_frame_called = true;
|
||||
if (update_in_physics)
|
||||
{
|
||||
MainUpdate(delta);
|
||||
_update_timers(delta);
|
||||
}
|
||||
}
|
||||
|
||||
// Physics specific:
|
||||
if (!zylann_example)
|
||||
{
|
||||
DebugDraw3D.DrawLine(dLines_8.GlobalPosition, dLines_Target.GlobalPosition, Colors.Yellow);
|
||||
if (more_test_cases)
|
||||
{
|
||||
_draw_rays_casts();
|
||||
}
|
||||
|
||||
// Additional drawing in the Viewport
|
||||
using (var _w1 = DebugDraw3D.NewScopedConfig().SetViewport(dOtherWorldBox.GetViewport()).SetThickness(0.01f).SetCenterBrightness(1).SetNoDepthTest(true))
|
||||
{
|
||||
DebugDraw3D.DrawBoxXf(new Transform3D(Basis.Identity
|
||||
.Scaled(Vector3.One * 0.3f)
|
||||
.Rotated(new Vector3(0, 0, 1), Mathf.Pi / 4)
|
||||
.Rotated(new Vector3(0, 1, 0), Mathf.Wrap(Time.GetTicksMsec() / -1500.0f, 0, Mathf.Tau) - Mathf.Pi / 4), dOtherWorldBox.GlobalPosition),
|
||||
Colors.Brown, true, 0.4f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainUpdate(double delta)
|
||||
{
|
||||
DebugDraw3D.ScopedConfig().SetThickness(debug_thickness);
|
||||
#pragma warning disable CS0162 // Unreachable code detected
|
||||
if (false) // #test
|
||||
{
|
||||
using var s11 = DebugDraw3D.NewScopedConfig().SetThickness(1);
|
||||
using var s13 = DebugDraw3D.NewScopedConfig();
|
||||
s13.SetThickness(3);
|
||||
}
|
||||
#pragma warning restore CS0162 // Unreachable code detected
|
||||
|
||||
_update_keys_just_press();
|
||||
|
||||
if (_is_key_just_pressed(Key.F1))
|
||||
zylann_example = !zylann_example;
|
||||
|
||||
// Zylann's example :D
|
||||
if (zylann_example)
|
||||
{
|
||||
DebugDraw2D.ClearGraphs();
|
||||
var _time = Time.GetTicksMsec() / 1000.0f;
|
||||
var box_pos = new Vector3(0, Mathf.Sin(_time * 4f), 0);
|
||||
var line_begin = new Vector3(-1, Mathf.Sin(_time * 4f), 0);
|
||||
var line_end = new Vector3(1, Mathf.Cos(_time * 4f), 0);
|
||||
DebugDraw3D.DrawBox(box_pos, Quaternion.Identity, new Vector3(1, 2, 1), new Color(0, 1, 0));
|
||||
DebugDraw3D.DrawLine(line_begin, line_end, new Color(1, 1, 0));
|
||||
DebugDraw2D.SetText("Time", _time);
|
||||
DebugDraw2D.SetText("Frames drawn", Engine.GetFramesDrawn());
|
||||
DebugDraw2D.SetText("FPS", Engine.GetFramesPerSecond());
|
||||
DebugDraw2D.SetText("delta", delta);
|
||||
|
||||
dHitTest.Visible = false;
|
||||
dLagTest.Visible = false;
|
||||
dPlaneOrigin.Visible = false;
|
||||
pZDepthTestCube.Visible = false;
|
||||
dOtherWorld.Visible = false;
|
||||
return;
|
||||
}
|
||||
|
||||
dHitTest.Visible = true;
|
||||
dLagTest.Visible = true;
|
||||
dPlaneOrigin.Visible = true;
|
||||
pZDepthTestCube.Visible = true;
|
||||
dOtherWorld.Visible = true;
|
||||
|
||||
// Testing the rendering layers by showing the image from the second camera inside the 2D panel
|
||||
DebugDraw3D.Config.GeometryRenderLayers = !Input.IsKeyPressed(Key.Alt) ? 1 : 0b10010;
|
||||
dPanel.Visible = Input.IsKeyPressed(Key.Alt);
|
||||
DebugDraw2D.CustomCanvas = Input.IsKeyPressed(Key.Alt) ? dCustomCanvas : null;
|
||||
|
||||
// More property toggles
|
||||
DebugDraw3D.Config.Freeze3dRender = Input.IsKeyPressed(Key.Down);
|
||||
DebugDraw3D.Config.VisibleInstanceBounds = Input.IsKeyPressed(Key.Right);
|
||||
|
||||
// Regenerate meshes
|
||||
if (Input.IsActionJustPressed("ui_end"))
|
||||
DebugDraw3D.RegenerateGeometryMeshes();
|
||||
|
||||
// Some property toggles
|
||||
if (_is_key_just_pressed(Key.Left))
|
||||
DebugDraw3D.Config.UseFrustumCulling = !DebugDraw3D.Config.UseFrustumCulling;
|
||||
|
||||
if (_is_key_just_pressed(Key.Up))
|
||||
DebugDraw3D.Config.ForceUseCameraFromScene = !DebugDraw3D.Config.ForceUseCameraFromScene;
|
||||
|
||||
if (_is_key_just_pressed(Key.Ctrl))
|
||||
if (!Engine.IsEditorHint())
|
||||
GetViewport().Msaa3D = GetViewport().Msaa3D == Viewport.Msaa.Msaa4X ? Viewport.Msaa.Disabled : Viewport.Msaa.Msaa4X;
|
||||
|
||||
if (!Engine.IsEditorHint())
|
||||
{
|
||||
if (_is_key_just_pressed(Key.Key1))
|
||||
DebugDraw3D.DebugEnabled = !DebugDraw3D.DebugEnabled;
|
||||
if (_is_key_just_pressed(Key.Key2))
|
||||
DebugDraw2D.DebugEnabled = !DebugDraw2D.DebugEnabled;
|
||||
if (_is_key_just_pressed(Key.Key3))
|
||||
DebugDrawManager.DebugEnabled = !DebugDrawManager.DebugEnabled;
|
||||
}
|
||||
|
||||
|
||||
DebugDraw3D.Config.FrustumLengthScale = camera_frustum_scale;
|
||||
|
||||
// Zones with black borders
|
||||
foreach (var node in dZones.GetChildren())
|
||||
{
|
||||
if (node is Node3D z)
|
||||
{
|
||||
DebugDraw3D.DrawBoxXf(z.GlobalTransform, Colors.Black);
|
||||
}
|
||||
}
|
||||
|
||||
// Spheres
|
||||
DebugDraw3D.DrawSphereXf(dSphereTransform.GlobalTransform, Colors.Crimson);
|
||||
using (var _s1 = DebugDraw3D.NewScopedConfig().SetHdSphere(true))
|
||||
DebugDraw3D.DrawSphereXf(dSphereHDTransform.GlobalTransform, Colors.OrangeRed);
|
||||
|
||||
// Delayed spheres
|
||||
if (timer_1 <= 0)
|
||||
{
|
||||
DebugDraw3D.DrawSphere(dSpherePosition.GlobalPosition, 2.0f, Colors.BlueViolet, 2.0f);
|
||||
using (var _s1 = DebugDraw3D.NewScopedConfig().SetHdSphere(true))
|
||||
DebugDraw3D.DrawSphere(dSpherePosition.GlobalPosition + Vector3.Forward * 4, 2.0f, Colors.CornflowerBlue, 2.0f);
|
||||
timer_1 = 2;
|
||||
}
|
||||
|
||||
timer_1 -= delta;
|
||||
|
||||
// Cylinders
|
||||
DebugDraw3D.DrawCylinder(dCylinder1.GlobalTransform, Colors.Crimson);
|
||||
DebugDraw3D.DrawCylinder(new Transform3D(Basis.Identity.Scaled(new Vector3(1, 2, 1)), dCylinder2.GlobalPosition), Colors.Red);
|
||||
DebugDraw3D.DrawCylinderAb(dCylinder3a.GlobalPosition, dCylinder3b.GlobalPosition, 0.7f);
|
||||
|
||||
// Boxes
|
||||
DebugDraw3D.DrawBoxXf(dBox1.GlobalTransform, Colors.MediumPurple);
|
||||
DebugDraw3D.DrawBox(dBox2.GlobalPosition, Quaternion.FromEuler(new Vector3(0, Mathf.DegToRad(45), Mathf.DegToRad(45))), Vector3.One, Colors.RebeccaPurple);
|
||||
DebugDraw3D.DrawBoxXf(new Transform3D(new Basis(Vector3.Up, Mathf.Pi * 0.25f).Scaled(Vector3.One * 2), dBox3.GlobalPosition), Colors.RosyBrown);
|
||||
|
||||
DebugDraw3D.DrawAabb(new Aabb(dAABB_fixed.GlobalPosition, new Vector3(2, 1, 2)), Colors.Aqua);
|
||||
DebugDraw3D.DrawAabbAb(dAABB.GetChild<Node3D>(0).GlobalPosition, dAABB.GetChild<Node3D>(1).GlobalPosition, Colors.DeepPink);
|
||||
|
||||
// Boxes AB
|
||||
|
||||
DebugDraw3D.DrawArrow(dBoxAB.GlobalPosition, dBoxABup.GlobalPosition, Colors.Gold, 0.1f, true);
|
||||
DebugDraw3D.DrawBoxAb(dBoxABa.GlobalPosition, dBoxABb.GlobalPosition, dBoxABup.GlobalPosition - dBoxAB.GlobalPosition, Colors.Peru);
|
||||
|
||||
DebugDraw3D.DrawArrow(dBoxABEdge.GlobalPosition, dBoxABEdgeup.GlobalPosition, Colors.DarkRed, 0.1f, true);
|
||||
DebugDraw3D.DrawBoxAb(dBoxABEdgea.GlobalPosition, dBoxABEdgeb.GlobalPosition, dBoxABEdgeup.GlobalPosition - dBoxABEdge.GlobalPosition, Colors.DarkOliveGreen, false);
|
||||
|
||||
// Lines
|
||||
DebugDraw3D.DrawSquare(dLines_Target.GlobalPosition, 0.5f, Colors.Red);
|
||||
|
||||
DebugDraw3D.DrawLine(dLines_1.GlobalPosition, dLines_Target.GlobalPosition, Colors.Fuchsia);
|
||||
DebugDraw3D.DrawRay(dLines_3.GlobalPosition, (dLines_Target.GlobalPosition - dLines_3.GlobalPosition).Normalized(), 3.0f, Colors.Crimson);
|
||||
|
||||
|
||||
if (timer_3 <= 0)
|
||||
{
|
||||
DebugDraw3D.DrawLine(dLines_6.GlobalPosition, dLines_Target.GlobalPosition, Colors.Fuchsia, 2.0f);
|
||||
timer_3 = 2;
|
||||
}
|
||||
|
||||
timer_3 -= delta;
|
||||
|
||||
// Test UP vector
|
||||
DebugDraw3D.DrawLine(dLines_7.GlobalPosition, dLines_Target.GlobalPosition, Colors.Red);
|
||||
|
||||
// Lines with Arrow
|
||||
DebugDraw3D.DrawArrow(dLines_2.GlobalPosition, dLines_Target.GlobalPosition, Colors.Blue, 0.5f, true);
|
||||
DebugDraw3D.DrawArrowRay(dLines_4.GlobalPosition, (dLines_Target.GlobalPosition - dLines_4.GlobalPosition).Normalized(), 8.0f, Colors.Lavender, 0.5f, true);
|
||||
|
||||
DebugDraw3D.DrawLineHitOffset(dLines_5.GlobalPosition, dLines_Target.GlobalPosition, true, Mathf.Abs(Mathf.Sin(Time.GetTicksMsec() / 1000.0f)), 0.25f, Colors.Aqua);
|
||||
|
||||
// Path
|
||||
|
||||
// preparing data
|
||||
List<Vector3> points = new List<Vector3>();
|
||||
List<Vector3> points_below = new List<Vector3>();
|
||||
List<Vector3> points_below2 = new List<Vector3>();
|
||||
List<Vector3> points_below3 = new List<Vector3>();
|
||||
List<Vector3> points_below4 = new List<Vector3>();
|
||||
List<Vector3> lines_above = new List<Vector3>();
|
||||
|
||||
foreach (var node in dLinePath.GetChildren())
|
||||
{
|
||||
if (node is Node3D c)
|
||||
{
|
||||
points.Add(c.GlobalPosition);
|
||||
points_below.Add(c.GlobalPosition + Vector3.Down);
|
||||
points_below2.Add(c.GlobalPosition + Vector3.Down * 2);
|
||||
points_below3.Add(c.GlobalPosition + Vector3.Down * 3);
|
||||
points_below4.Add(c.GlobalPosition + Vector3.Down * 4);
|
||||
}
|
||||
}
|
||||
|
||||
for (int x = 0; x < points.Count - 1; x++)
|
||||
{
|
||||
lines_above.Add(points[x] + Vector3.Up);
|
||||
lines_above.Add(points[x + 1] + Vector3.Up);
|
||||
}
|
||||
|
||||
// drawing lines
|
||||
DebugDraw3D.DrawLines(lines_above.ToArray());
|
||||
DebugDraw3D.DrawLinePath(points.ToArray(), Colors.Beige);
|
||||
DebugDraw3D.DrawPoints(points_below.ToArray(), DebugDraw3D.PointType.TypeSquare, 0.2f, Colors.DarkGreen);
|
||||
DebugDraw3D.DrawPointPath(points_below2.ToArray(), DebugDraw3D.PointType.TypeSquare, 0.25f, Colors.Blue, Colors.Tomato);
|
||||
DebugDraw3D.DrawArrowPath(points_below3.ToArray(), Colors.Gold, 0.5f);
|
||||
using (var _sl = DebugDraw3D.NewScopedConfig().SetThickness(0.05f))
|
||||
DebugDraw3D.DrawPointPath(points_below4.ToArray(), DebugDraw3D.PointType.TypeSphere, 0.25f, Colors.MediumSeaGreen, Colors.MediumVioletRed);
|
||||
|
||||
// Other world
|
||||
|
||||
using (var s = DebugDraw3D.NewScopedConfig().SetViewport(dOtherWorldBox.GetViewport()))
|
||||
{
|
||||
DebugDraw3D.DrawBoxXf(dOtherWorldBox.GlobalTransform.RotatedLocal(new Vector3(1, 1, -1).Normalized(), Mathf.Wrap(Time.GetTicksMsec() / 1000.0f, 0f, Mathf.Tau)), Colors.SandyBrown);
|
||||
DebugDraw3D.DrawBoxXf(dOtherWorldBox.GlobalTransform.RotatedLocal(new Vector3(-1, 1, -1).Normalized(), Mathf.Wrap(Time.GetTicksMsec() / 1000.0f, 0f, Mathf.Tau) - Mathf.Pi / 4), Colors.SandyBrown);
|
||||
}
|
||||
|
||||
// Misc
|
||||
if (Engine.IsEditorHint())
|
||||
{
|
||||
using var s = DebugDraw3D.NewScopedConfig().SetThickness(0);
|
||||
DebugDraw3D.DrawCameraFrustum(dCamera, Colors.DarkOrange);
|
||||
}
|
||||
|
||||
using (var s = DebugDraw3D.NewScopedConfig().SetCenterBrightness(0.1f))
|
||||
{
|
||||
DebugDraw3D.DrawArrowhead(dMisc_Arrow.GlobalTransform, Colors.YellowGreen);
|
||||
}
|
||||
|
||||
DebugDraw3D.DrawSquare(dMisc_Billboard.GlobalPosition, 0.5f, Colors.Green);
|
||||
|
||||
DebugDraw3D.DrawPosition(dMisc_Position.GlobalTransform, Colors.Brown);
|
||||
|
||||
DebugDraw3D.DrawGizmo(dMisc_GizmoTransform.GlobalTransform, null, true);
|
||||
DebugDraw3D.DrawGizmo(dMisc_GizmoOneColor.GlobalTransform, Colors.Brown, true);
|
||||
using (var s = DebugDraw3D.NewScopedConfig().SetCenterBrightness(0.5f).SetNoDepthTest(true))
|
||||
{
|
||||
DebugDraw3D.DrawGizmo(dMisc_GizmoNormal.GlobalTransform.Orthonormalized(), null, false);
|
||||
}
|
||||
|
||||
Transform3D tg = dMisc_Grids_Grid.GlobalTransform;
|
||||
Vector3 tn = dMisc_Grids_Grid_Subdivision.Transform.Origin;
|
||||
DebugDraw3D.DrawGrid(tg.Origin, tg.Basis.X, tg.Basis.Z, new Vector2I((int)tn.X * 10, (int)tn.Z * 10), Colors.LightCoral, false);
|
||||
|
||||
var tn1 = dMisc_Grids_GridCentered_Subdivision.Transform.Origin;
|
||||
DebugDraw3D.DrawGridXf(dMisc_Grids_GridCentered.GlobalTransform, new Vector2I((int)(tn1.X * 10), (int)(tn1.Z * 10)));
|
||||
|
||||
using (var s = DebugDraw3D.NewScopedConfig().SetThickness(0.05f))
|
||||
{
|
||||
DebugDraw3D.DrawBoxXf(dPostProcess.GlobalTransform, Colors.SeaGreen);
|
||||
}
|
||||
|
||||
// 2D
|
||||
DebugDraw2D.Config.TextDefaultSize = text_groups_default_font_size;
|
||||
DebugDraw2D.Config.TextBlockOffset = text_groups_offset;
|
||||
DebugDraw2D.Config.TextBlockPosition = text_groups_position;
|
||||
DebugDraw2D.Config.TextPadding = text_groups_padding;
|
||||
|
||||
DebugDraw2D.Config.TextCustomFont = custom_font;
|
||||
|
||||
|
||||
if (test_text)
|
||||
{
|
||||
timer_text -= delta;
|
||||
_text_tests();
|
||||
}
|
||||
|
||||
// Graphs
|
||||
// Enable FPSGraph if not exists
|
||||
_create_graph("FPS", true, false, DebugDraw2DGraph.TextFlags.Current | DebugDraw2DGraph.TextFlags.Avg | DebugDraw2DGraph.TextFlags.Max | DebugDraw2DGraph.TextFlags.Min, "", DebugDraw2DGraph.GraphSide.Bottom, Engine.IsEditorHint() ? DebugDraw2DGraph.GraphPosition.LeftTop : DebugDraw2DGraph.GraphPosition.RightTop, new Vector2I(200, 80), custom_font);
|
||||
if (Engine.IsEditorHint())
|
||||
{
|
||||
if (DebugDraw2D.GetGraph("FPS") != null)
|
||||
{
|
||||
DebugDraw2D.GetGraph("FPS").Offset = new Vector2I(0, 64);
|
||||
}
|
||||
}
|
||||
|
||||
// Adding more graphs
|
||||
if (test_graphs)
|
||||
{
|
||||
_graph_test();
|
||||
}
|
||||
else
|
||||
{
|
||||
_remove_graphs();
|
||||
}
|
||||
_upd_graph_params();
|
||||
|
||||
// Lag Test
|
||||
dLagTest.Position = ((Vector3)dLagTest_RESET.GetAnimation("RESET").TrackGetKeyValue(0, 0)) + new Vector3(Mathf.Sin(Time.GetTicksMsec() / 100.0f) * 2.5f, 0, 0);
|
||||
DebugDraw3D.DrawBox(dLagTest.GlobalPosition, Quaternion.Identity, Vector3.One * 2.01f, Colors.Chocolate, true);
|
||||
|
||||
if (more_test_cases)
|
||||
{
|
||||
foreach (var node in dHitTest_RayEmitter.GetChildren())
|
||||
{
|
||||
if (node is RayCast3D ray)
|
||||
ray.SetPhysicsProcessInternal(true);
|
||||
}
|
||||
|
||||
_more_tests();
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var node in dHitTest_RayEmitter.GetChildren())
|
||||
{
|
||||
if (node is RayCast3D ray)
|
||||
ray.SetPhysicsProcessInternal(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (draw_array_of_boxes)
|
||||
{
|
||||
_draw_array_of_boxes();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void _text_tests()
|
||||
{
|
||||
|
||||
if (timer_text < 0)
|
||||
{
|
||||
DebugDraw2D.SetText("Some delayed text", "for 2.5s", -1, Colors.Black, 2.5f); // it's supposed to show text for 2.5 seconds
|
||||
timer_text += 5;
|
||||
}
|
||||
|
||||
DebugDraw2D.SetText("FPS", $"{Engine.GetFramesPerSecond():F2}", 0, Colors.Gold);
|
||||
DebugDraw2D.BeginTextGroup("-- First Group --", 2, Colors.LimeGreen, true, text_groups_title_font_size, text_groups_text_font_size);
|
||||
DebugDraw2D.SetText("Simple text");
|
||||
DebugDraw2D.SetText("Text", "Value", 0, Colors.Aquamarine);
|
||||
DebugDraw2D.SetText("Text out of order", null, -1, Colors.Silver);
|
||||
DebugDraw2D.BeginTextGroup("-- Second Group --", 1, Colors.Beige);
|
||||
DebugDraw2D.SetText("Rendered frames", Engine.GetFramesDrawn());
|
||||
DebugDraw2D.EndTextGroup();
|
||||
|
||||
if (text_groups_show_stats)
|
||||
{
|
||||
DebugDraw2D.BeginTextGroup("-- Stats --", 3, Colors.Wheat);
|
||||
var render_stats = DebugDraw3D.GetRenderStats();
|
||||
|
||||
if (render_stats != null && text_groups_show_stats)
|
||||
{
|
||||
DebugDraw2D.SetText("Total", render_stats.TotalGeometry);
|
||||
DebugDraw2D.SetText("Instances", render_stats.Instances, 1);
|
||||
DebugDraw2D.SetText("Lines", render_stats.Lines, 2);
|
||||
DebugDraw2D.SetText("Total Visible", render_stats.TotalVisible, 3);
|
||||
DebugDraw2D.SetText("Visible Instances", render_stats.VisibleInstances, 4);
|
||||
DebugDraw2D.SetText("Visible Lines", render_stats.VisibleLines, 5);
|
||||
|
||||
DebugDraw2D.SetText("---", "", 6);
|
||||
|
||||
DebugDraw2D.SetText("Culling time", $"{(render_stats.TotalTimeCullingUsec / 1000.0):F2} ms", 7);
|
||||
DebugDraw2D.SetText("Filling instances buffer", $"{(render_stats.TimeFillingBuffersInstancesUsec / 1000.0):F2} ms", 8);
|
||||
DebugDraw2D.SetText("Filling lines buffer", $"{(render_stats.TimeFillingBuffersLinesUsec / 1000.0):F2} ms", 9);
|
||||
DebugDraw2D.SetText("Filling time", $"{(render_stats.TotalTimeFillingBuffersUsec / 1000.0):F2} ms", 10);
|
||||
DebugDraw2D.SetText("Total time", $"{(render_stats.TotalTimeSpentUsec / 1000.0):F2} ms", 11);
|
||||
|
||||
DebugDraw2D.SetText("---", null, 14);
|
||||
|
||||
DebugDraw2D.SetText("Created scoped configs", $"{render_stats.CreatedScopedConfigs}", 15);
|
||||
}
|
||||
|
||||
if (text_groups_show_stats && text_groups_show_stats_2d)
|
||||
{
|
||||
DebugDraw2D.SetText("----", null, 19);
|
||||
}
|
||||
|
||||
var render_stats_2d = DebugDraw2D.GetRenderStats();
|
||||
if (render_stats_2d != null && text_groups_show_stats_2d)
|
||||
{
|
||||
DebugDraw2D.SetText("Text groups", render_stats_2d.OverlayTextGroups, 20);
|
||||
DebugDraw2D.SetText("Text lines", render_stats_2d.OverlayTextLines, 21);
|
||||
DebugDraw2D.SetText("Graphs total", render_stats_2d.OverlayGraphsTotal, 22);
|
||||
DebugDraw2D.SetText("Graphs enabled", render_stats_2d.OverlayGraphsEnabled, 23);
|
||||
}
|
||||
DebugDraw2D.EndTextGroup();
|
||||
}
|
||||
|
||||
if (text_groups_show_hints)
|
||||
{
|
||||
DebugDraw2D.BeginTextGroup("controls", 1024, Colors.White, false);
|
||||
if (!Engine.IsEditorHint())
|
||||
{
|
||||
DebugDraw2D.SetText("WASD QE, LMB", "To move", 0);
|
||||
}
|
||||
DebugDraw2D.SetText("Alt: change render layers", DebugDraw3D.Config.GeometryRenderLayers, 1);
|
||||
if (!OS.HasFeature("web"))
|
||||
{
|
||||
DebugDraw2D.SetText("Ctrl: toggle anti-aliasing", GetViewport().Msaa3D == Viewport.Msaa.Msaa4X ? "MSAA 4x" : "Disabled", 2);
|
||||
}
|
||||
DebugDraw2D.SetText("Down: freeze render", DebugDraw3D.Config.Freeze3dRender, 3);
|
||||
if (Engine.IsEditorHint())
|
||||
{
|
||||
DebugDraw2D.SetText("Up: use scene camera", DebugDraw3D.Config.ForceUseCameraFromScene, 4);
|
||||
}
|
||||
DebugDraw2D.SetText("1,2,3: toggle debug", $"{DebugDraw3D.DebugEnabled}, {DebugDraw2D.DebugEnabled} 😐, {DebugDrawManager.DebugEnabled} 😏", 5);
|
||||
DebugDraw2D.SetText("Left: toggle frustum culling", DebugDraw3D.Config.UseFrustumCulling, 6);
|
||||
DebugDraw2D.SetText("Right: draw bounds for culling", DebugDraw3D.Config.VisibleInstanceBounds, 7);
|
||||
}
|
||||
}
|
||||
|
||||
void _draw_rays_casts()
|
||||
{
|
||||
// Line hits render
|
||||
foreach (var node in dHitTest_RayEmitter.GetChildren())
|
||||
{
|
||||
if (node is RayCast3D ray)
|
||||
{
|
||||
ray.ForceRaycastUpdate();
|
||||
DebugDraw3D.DrawLineHit(ray.GlobalPosition, ray.ToGlobal(ray.TargetPosition), ray.GetCollisionPoint(), ray.IsColliding(), 0.3f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _more_tests()
|
||||
{
|
||||
// Delayed line render
|
||||
using (var s = DebugDraw3D.NewScopedConfig().SetThickness(0.035f))
|
||||
{
|
||||
DebugDraw3D.DrawLine(dLagTest.GlobalPosition + Vector3.Up, dLagTest.GlobalPosition + new Vector3(0, 3, Mathf.Sin(Time.GetTicksMsec() / 50.0f)), null, 0.5f);
|
||||
}
|
||||
|
||||
// Draw plane
|
||||
using (var _s11 = DebugDraw3D.NewScopedConfig().SetThickness(0.02f).SetPlaneSize(10))
|
||||
{
|
||||
var pl_node = GetNode<Node3D>("PlaneOrigin");
|
||||
var xf = pl_node.GlobalTransform;
|
||||
var normal = xf.Basis.Y.Normalized();
|
||||
var plane = new Plane(normal, xf.Origin.Dot(normal));
|
||||
|
||||
var vp = GetViewport();
|
||||
if (is_4_2_and_higher)
|
||||
{
|
||||
if (Engine.IsEditorHint() && (Viewport)Engine.GetSingleton("EditorInterface").Call("get_editor_viewport_3d", 0) != null)
|
||||
{
|
||||
vp = (Viewport)Engine.GetSingleton("EditorInterface").Call("get_editor_viewport_3d", 0);
|
||||
}
|
||||
}
|
||||
|
||||
var cam = vp.GetCamera3D();
|
||||
if (cam != null)
|
||||
{
|
||||
var dir = vp.GetCamera3D().ProjectRayNormal(vp.GetMousePosition());
|
||||
Vector3? intersect = plane.IntersectsRay(cam.GlobalPosition, dir);
|
||||
|
||||
DebugDraw3D.DrawPlane(plane, Colors.Coral * new Color(1, 1, 1, 0.4f), pl_node.GlobalPosition);
|
||||
if (is_4_2_and_higher)
|
||||
{
|
||||
if (intersect.HasValue && intersect.Value.DistanceTo(pl_node.GlobalPosition) < _s11.GetPlaneSize() * 0.5f)
|
||||
{
|
||||
// Need to test different colors on both sides of the plane
|
||||
var col = plane.IsPointOver(cam.GlobalPosition) ? Colors.Firebrick : Colors.Aquamarine;
|
||||
DebugDraw3D.DrawSphere(intersect.Value, 0.3f, col);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _draw_array_of_boxes()
|
||||
{
|
||||
// Lots of boxes to check performance..
|
||||
var x_size = 50;
|
||||
var y_size = 50;
|
||||
var z_size = 3;
|
||||
var mul = 1.0f;
|
||||
var cubes_max_time = 1.25f;
|
||||
using var cfg = DebugDraw3D.NewScopedConfig();
|
||||
|
||||
if (draw_1m_boxes)
|
||||
{
|
||||
x_size = 100;
|
||||
y_size = 100;
|
||||
z_size = 100;
|
||||
mul = 4.0f;
|
||||
cubes_max_time = 60f;
|
||||
}
|
||||
|
||||
if (timer_cubes <= 0)
|
||||
{
|
||||
var start_time = Time.GetTicksUsec();
|
||||
for (int x = 0; x < x_size; x++)
|
||||
{
|
||||
for (int y = 0; y < y_size; y++)
|
||||
{
|
||||
for (int z = 0; z < z_size; z++)
|
||||
{
|
||||
var size = Vector3.One;
|
||||
cfg.SetThickness(Random.Shared.NextSingle() * 0.1f);
|
||||
//size = new Vector3(Random.Shared.NextSingle() * 100 + 0.1f, Random.Shared.NextSingle() * 100 + 0.1f, Random.Shared.NextSingle() * 100 + 0.1f);
|
||||
DebugDraw3D.DrawBox(new Vector3(x * mul, (-4 - z) * mul, y * mul) + GlobalPosition, Quaternion.Identity, size, null, false, cubes_max_time);
|
||||
}
|
||||
}
|
||||
}
|
||||
//GD.Print($"Draw Cubes: {((Time.GetTicksUsec() - start_time) / 1000.0):F2}ms");
|
||||
timer_cubes = cubes_max_time;
|
||||
}
|
||||
}
|
||||
|
||||
void _graph_test()
|
||||
{
|
||||
_create_graph("fps", true, true, DebugDraw2DGraph.TextFlags.Current, "", DebugDraw2DGraph.GraphSide.Left, DebugDraw2DGraph.GraphPosition.RightTop);
|
||||
_create_graph("fps2", true, false, DebugDraw2DGraph.TextFlags.Current, "fps", DebugDraw2DGraph.GraphSide.Bottom, 0, new Vector2I(200, 100));
|
||||
|
||||
_create_graph("Sin Wave!", false, true, DebugDraw2DGraph.TextFlags.Current, "fps2", DebugDraw2DGraph.GraphSide.Bottom);
|
||||
|
||||
_create_graph("randf", false, true, DebugDraw2DGraph.TextFlags.Avg, "", DebugDraw2DGraph.GraphSide.Left, DebugDraw2DGraph.GraphPosition.RightBottom, new Vector2I(256, 60), custom_font);
|
||||
|
||||
_create_graph("fps5", true, true, DebugDraw2DGraph.TextFlags.All, "randf", DebugDraw2DGraph.GraphSide.Top);
|
||||
_create_graph("fps6", true, true, DebugDraw2DGraph.TextFlags.All, "fps5", DebugDraw2DGraph.GraphSide.Top);
|
||||
_create_graph("fps12", true, true, DebugDraw2DGraph.TextFlags.All, "fps5", DebugDraw2DGraph.GraphSide.Left);
|
||||
|
||||
_create_graph("fps7", true, false, DebugDraw2DGraph.TextFlags.All, "FPS", DebugDraw2DGraph.GraphSide.Bottom);
|
||||
_create_graph("fps8", true, true, DebugDraw2DGraph.TextFlags.All, "", DebugDraw2DGraph.GraphSide.Top, DebugDraw2DGraph.GraphPosition.LeftBottom);
|
||||
_create_graph("fps9", true, false, DebugDraw2DGraph.TextFlags.All, "fps8", DebugDraw2DGraph.GraphSide.Right);
|
||||
_create_graph("fps10", true, false, DebugDraw2DGraph.TextFlags.All, "fps8", DebugDraw2DGraph.GraphSide.Top);
|
||||
_create_graph("fps11", true, true, DebugDraw2DGraph.TextFlags.All, "fps9", DebugDraw2DGraph.GraphSide.Right);
|
||||
|
||||
// If graphs exists, then more tests are done
|
||||
DebugDraw2D.GetGraph("Sin Wave!").DataGetter = new Callable(this, "_get_sin_wave_for_graph");
|
||||
DebugDraw2D.GetGraph("Sin Wave!").UpsideDown = false;
|
||||
|
||||
DebugDraw2D.GetGraph("randf").TextSuffix = "utf8 ноль zéro";
|
||||
//DebugDraw2D.GetGraph("fps9").line_position = DebugDraw2DGraph.LINE_TOP
|
||||
DebugDraw2D.GetGraph("fps9").Offset = new Vector2I(0, 0);
|
||||
//DebugDraw2D.GetGraph("fps11").LlinePosition = DebugDraw2DGraph.LINE_BOTTOM
|
||||
DebugDraw2D.GetGraph("fps11").Offset = new Vector2I(16, 0);
|
||||
DebugDraw2D.GetGraph("fps6").Offset = new Vector2I(0, 32);
|
||||
DebugDraw2D.GetGraph("fps").Offset = new Vector2I(16, 72);
|
||||
DebugDraw2D.GetGraph("fps9").Enabled = graph_is_enabled;
|
||||
|
||||
if (!Engine.IsEditorHint())
|
||||
{
|
||||
DebugDraw2D.GetGraph("fps").Corner = DebugDraw2DGraph.GraphPosition.LeftTop;
|
||||
}
|
||||
|
||||
// Just sending random data to the graph
|
||||
DebugDraw2D.GraphUpdateData("randf", (float)random.NextDouble());
|
||||
}
|
||||
|
||||
void _upd_graph_params()
|
||||
{
|
||||
DebugDraw2D.Config.GraphsBaseOffset = graph_offset;
|
||||
foreach (var g in new string[] { "FPS", "fps5", "fps8" })
|
||||
{
|
||||
var graph = DebugDraw2D.GetGraph(g) as DebugDraw2DFPSGraph;
|
||||
if (graph != null)
|
||||
{
|
||||
|
||||
graph.Size = graph_size;
|
||||
graph.TitleSize = graph_title_font_size;
|
||||
graph.TextSize = graph_text_font_size;
|
||||
graph.LineWidth = graph_line_width;
|
||||
graph.TextPrecision = graph_text_precision;
|
||||
graph.BufferSize = graph_buffer_size;
|
||||
if (Engine.IsEditorHint() || g != "FPS")
|
||||
{
|
||||
graph.FrameTimeMode = graph_frame_time_mode;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float _get_sin_wave_for_graph()
|
||||
{
|
||||
var mul = Input.IsKeyPressed(Key.End) ? 4 : 2;
|
||||
return (float)Mathf.Sin(Engine.GetFramesDrawn() * 0.5) * mul;
|
||||
}
|
||||
|
||||
void _remove_graphs()
|
||||
{
|
||||
if (!test_fps_graph)
|
||||
DebugDraw2D.RemoveGraph("FPS");
|
||||
DebugDraw2D.RemoveGraph("randf");
|
||||
DebugDraw2D.RemoveGraph("fps");
|
||||
DebugDraw2D.RemoveGraph("fps2");
|
||||
DebugDraw2D.RemoveGraph("Sin Wave!");
|
||||
DebugDraw2D.RemoveGraph("fps5");
|
||||
DebugDraw2D.RemoveGraph("fps6");
|
||||
DebugDraw2D.RemoveGraph("fps7");
|
||||
DebugDraw2D.RemoveGraph("fps8");
|
||||
DebugDraw2D.RemoveGraph("fps9");
|
||||
DebugDraw2D.RemoveGraph("fps10");
|
||||
DebugDraw2D.RemoveGraph("fps11");
|
||||
DebugDraw2D.RemoveGraph("fps12");
|
||||
}
|
||||
|
||||
DebugDraw2DGraph _create_graph(string title, bool is_fps, bool show_title, DebugDraw2DGraph.TextFlags flags, string parent = "", DebugDraw2DGraph.GraphSide parent_side = DebugDraw2DGraph.GraphSide.Bottom, DebugDraw2DGraph.GraphPosition pos = DebugDraw2DGraph.GraphPosition.LeftBottom, Vector2I? size = null, Font font = null)
|
||||
{
|
||||
var graph = DebugDraw2D.GetGraph(title);
|
||||
if (graph == null)
|
||||
{
|
||||
if (is_fps)
|
||||
{
|
||||
graph = DebugDraw2D.CreateFpsGraph(title);
|
||||
}
|
||||
else
|
||||
{
|
||||
graph = DebugDraw2D.CreateGraph(title);
|
||||
}
|
||||
|
||||
if (graph != null)
|
||||
{
|
||||
graph.Size = size ?? new Vector2I(256, 60);
|
||||
graph.BufferSize = 50;
|
||||
graph.Corner = pos;
|
||||
graph.ShowTitle = show_title;
|
||||
graph.ShowTextFlags = flags;
|
||||
graph.CustomFont = font;
|
||||
graph.SetParent(parent, parent_side);
|
||||
}
|
||||
}
|
||||
return graph;
|
||||
}
|
||||
}
|
||||
16
examples_dd3d/DebugDrawDemoSceneCS.tscn
Normal file
16
examples_dd3d/DebugDrawDemoSceneCS.tscn
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
[gd_scene load_steps=3 format=3 uid="uid://sxtw8fme7g63"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://c3sccy6x0ht5j" path="res://examples_dd3d/DebugDrawDemoScene.tscn" id="2"]
|
||||
[ext_resource type="Script" path="res://examples_dd3d/DebugDrawDemoSceneCS.cs" id="2_ipqea"]
|
||||
|
||||
[node name="DebugDrawDemoSceneCS" instance=ExtResource("2")]
|
||||
script = ExtResource("2_ipqea")
|
||||
|
||||
[node name="Settings" parent="." index="22"]
|
||||
switch_to_scene = "res://examples_dd3d/DebugDrawDemoScene.tscn"
|
||||
|
||||
[node name="Label" parent="Settings/HBox/VBoxContainer" index="1"]
|
||||
text = "C# example"
|
||||
|
||||
[node name="SwitchLang" parent="Settings/HBox/VBox/SettingsPanel/VBox" index="12"]
|
||||
text = "Switch to GDScript"
|
||||
BIN
examples_dd3d/Roboto-Bold.ttf
Normal file
BIN
examples_dd3d/Roboto-Bold.ttf
Normal file
Binary file not shown.
38
examples_dd3d/Roboto-Bold.ttf.import
Normal file
38
examples_dd3d/Roboto-Bold.ttf.import
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
[remap]
|
||||
|
||||
importer="font_data_dynamic"
|
||||
type="FontFile"
|
||||
uid="uid://erdgllynwqkw"
|
||||
path="res://.godot/imported/Roboto-Bold.ttf-3674de3d9ad3ee757cd4b4a89f1e126d.fontdata"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://examples_dd3d/Roboto-Bold.ttf"
|
||||
dest_files=["res://.godot/imported/Roboto-Bold.ttf-3674de3d9ad3ee757cd4b4a89f1e126d.fontdata"]
|
||||
|
||||
[params]
|
||||
|
||||
Rendering=null
|
||||
antialiasing=1
|
||||
generate_mipmaps=false
|
||||
disable_embedded_bitmaps=true
|
||||
multichannel_signed_distance_field=false
|
||||
msdf_pixel_range=8
|
||||
msdf_size=48
|
||||
allow_system_fallback=true
|
||||
force_autohinter=false
|
||||
hinting=1
|
||||
subpixel_positioning=1
|
||||
oversampling=0.0
|
||||
Fallbacks=null
|
||||
fallbacks=[]
|
||||
Compress=null
|
||||
compress=true
|
||||
preload=[{
|
||||
"chars": [],
|
||||
"glyphs": [],
|
||||
"name": "New Configuration"
|
||||
}]
|
||||
language_support={}
|
||||
script_support={}
|
||||
opentype_features={}
|
||||
17
examples_dd3d/VisualizerAudioBus.tres
Normal file
17
examples_dd3d/VisualizerAudioBus.tres
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
[gd_resource type="AudioBusLayout" load_steps=2 format=3 uid="uid://7sy4h4ibftrk"]
|
||||
|
||||
[sub_resource type="AudioEffectSpectrumAnalyzer" id="AudioEffectSpectrumAnalyzer_odciy"]
|
||||
resource_name = "SpectrumAnalyzer"
|
||||
fft_size = 3
|
||||
|
||||
[resource]
|
||||
bus/0/mute = true
|
||||
bus/0/volume_db = -20.0
|
||||
bus/1/name = &"MusicAnalyzer"
|
||||
bus/1/solo = false
|
||||
bus/1/mute = false
|
||||
bus/1/bypass_fx = false
|
||||
bus/1/volume_db = 0.0
|
||||
bus/1/send = &"Master"
|
||||
bus/1/effect/0/effect = SubResource("AudioEffectSpectrumAnalyzer_odciy")
|
||||
bus/1/effect/0/enabled = true
|
||||
11
examples_dd3d/addon_icon.gd
Normal file
11
examples_dd3d/addon_icon.gd
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
@tool
|
||||
extends Node3D
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
var a = DebugDraw3D.new_scoped_config().set_thickness(0.015)
|
||||
DebugDraw3D.draw_box_xf($box.global_transform, Color.GREEN)
|
||||
DebugDraw3D.draw_gizmo($gizmo.global_transform)
|
||||
DebugDraw3D.draw_grid_xf($gizmo/grid.global_transform, Vector2i(2,2), DebugDraw3D.empty_color, false)
|
||||
DebugDraw3D.draw_sphere_xf($sphere.global_transform, Color.RED)
|
||||
DebugDraw3D.draw_cylinder($cylinder.global_transform, Color.BLUE)
|
||||
DebugDraw3D.draw_line_hit_offset($"line/1".global_transform.origin, $"line/2".global_transform.origin, true, 0.3, 0.1)
|
||||
37
examples_dd3d/addon_icon.tscn
Normal file
37
examples_dd3d/addon_icon.tscn
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[gd_scene load_steps=3 format=3 uid="uid://1lhiwf8tgleh"]
|
||||
|
||||
[ext_resource type="Script" path="res://examples_dd3d/addon_icon.gd" id="1_bq18y"]
|
||||
|
||||
[sub_resource type="Environment" id="1"]
|
||||
background_mode = 1
|
||||
|
||||
[node name="icon" type="Node3D"]
|
||||
script = ExtResource("1_bq18y")
|
||||
|
||||
[node name="Camera" type="Camera3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 5.39732)
|
||||
environment = SubResource("1")
|
||||
current = true
|
||||
|
||||
[node name="box" type="Node3D" parent="."]
|
||||
transform = Transform3D(0.316305, 0.0204714, -0.293415, -0.239575, 0.267896, -0.239575, 0.170631, 0.338191, 0.207538, -0.410294, 0.312541, 0.243199)
|
||||
|
||||
[node name="gizmo" type="Node3D" parent="."]
|
||||
transform = Transform3D(0.707107, 0, -0.707107, -0.294265, 0.909294, -0.294265, 0.642968, 0.416154, 0.642968, 0, 0, 0)
|
||||
|
||||
[node name="grid" type="Node3D" parent="gizmo"]
|
||||
transform = Transform3D(1, -2.98023e-08, 1.19209e-07, 0, 1, 0, 1.19209e-07, -2.98023e-08, 1, -0.0263093, -0.0170284, -0.0263093)
|
||||
|
||||
[node name="sphere" type="Node3D" parent="."]
|
||||
transform = Transform3D(0.401341, 0.207831, -0.437109, -0.449118, 0.371584, -0.235691, 0.180418, 0.46267, 0.385639, 0.466197, 0.322665, 0.200436)
|
||||
|
||||
[node name="cylinder" type="Node3D" parent="."]
|
||||
transform = Transform3D(0.155034, 0.231693, -0.112783, -0.160003, 0.264761, -0.0839674, 0.0232275, 0.277352, 0.174372, -0.0566943, -0.290515, 0.905274)
|
||||
|
||||
[node name="line" type="Node3D" parent="."]
|
||||
|
||||
[node name="1" type="Node3D" parent="line"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.568458, -0.615948, 0.653444)
|
||||
|
||||
[node name="2" type="Node3D" parent="line"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0051975, 0.373791, 0.0974927)
|
||||
60
examples_dd3d/demo_camera_movement.gd
Normal file
60
examples_dd3d/demo_camera_movement.gd
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
extends Camera3D
|
||||
|
||||
@export var mouse_sensitivity := 0.25
|
||||
@export var camera_speed := 10.0
|
||||
@export var camera_speed_fast := 30.0
|
||||
|
||||
var btn_clicked := false
|
||||
const hPI := PI/2
|
||||
var rot_x := 0.0
|
||||
var rot_y := 0.0
|
||||
|
||||
|
||||
func _ready():
|
||||
reset_input_rotation()
|
||||
|
||||
|
||||
func _unhandled_input(event) -> void:
|
||||
if event is InputEventMouseButton:
|
||||
btn_clicked = event.pressed
|
||||
|
||||
|
||||
func reset_input_rotation():
|
||||
rot_x = rotation.y
|
||||
rot_y = rotation.x
|
||||
|
||||
|
||||
func _input(event) -> void:
|
||||
if btn_clicked:
|
||||
if event is InputEventMouseMotion:
|
||||
if event.button_mask == MOUSE_BUTTON_LEFT:
|
||||
rot_x += -deg_to_rad(event.relative.x * mouse_sensitivity)
|
||||
rot_y += -deg_to_rad(event.relative.y * mouse_sensitivity)
|
||||
rot_y = clamp(rot_y, -hPI, hPI)
|
||||
|
||||
transform.basis = Basis()
|
||||
rotate_object_local(Vector3.UP, rot_x)
|
||||
rotate_object_local(Vector3.RIGHT, rot_y)
|
||||
|
||||
|
||||
func get_axis(neg : Array[Key], pos : Array[Key]) -> float:
|
||||
var pressed = func (arr: Array[Key]):
|
||||
var p: float = 0
|
||||
for k in arr:
|
||||
if Input.is_physical_key_pressed(k):
|
||||
p = 1
|
||||
break
|
||||
return p
|
||||
|
||||
return pressed.call(pos) - pressed.call(neg)
|
||||
|
||||
|
||||
func _process(delta) -> void:
|
||||
var motion := Vector2(get_axis([KEY_S], [KEY_W]), get_axis([KEY_A], [KEY_D]))
|
||||
var lift := get_axis([KEY_Q, KEY_CTRL], [KEY_E, KEY_SPACE])
|
||||
var speed := camera_speed_fast if Input.is_physical_key_pressed(KEY_SHIFT) else camera_speed
|
||||
motion = motion.limit_length()
|
||||
|
||||
var b := global_transform.basis
|
||||
var v := (-b.z * motion.x) + (b.x * motion.y) + (b.y * lift)
|
||||
global_position += v.limit_length() * speed * delta
|
||||
179
examples_dd3d/demo_music_visualizer.gd
Normal file
179
examples_dd3d/demo_music_visualizer.gd
Normal file
|
|
@ -0,0 +1,179 @@
|
|||
@tool
|
||||
extends VBoxContainer
|
||||
|
||||
@export_range(1, 128) var bars_count := 32
|
||||
var transform: Transform3D:
|
||||
get:
|
||||
return %AudioVisualizer.global_transform
|
||||
@export_exp_easing("inout") var motion_smoothing := 0.025
|
||||
@export_range(0, 0.5) var bar_thickness := 0.065
|
||||
@export_range(0, 10) var bars_separation := 0.325
|
||||
@export_exp_easing("inout") var color_offset_speed := 0.4
|
||||
@export var colors: Gradient = null
|
||||
|
||||
var MusicAnalyzerBus := &"MusicAnalyzer"
|
||||
var MasterBus := &"Master"
|
||||
var MAX_HZ := 16000.0
|
||||
var MIN_HZ := 20.0
|
||||
var MIN_DB := 60.0
|
||||
var spectrum: AudioEffectSpectrumAnalyzerInstance = null
|
||||
|
||||
var smoothed_energy: Array[float] = []
|
||||
var color_offset := 0.0
|
||||
|
||||
var _on_data_loaded_callback = null
|
||||
|
||||
# TODO remove after moving to 4.2
|
||||
var is_4_2_and_higher = Engine.get_version_info()["major"] >= 4 && Engine.get_version_info()["minor"] >= 2
|
||||
|
||||
|
||||
func _ready():
|
||||
var bus = AudioServer.get_bus_index(MusicAnalyzerBus)
|
||||
if bus == -1:
|
||||
print("'MusicVisualizer' audio bus not found.\nSet 'VisualizerAudioBus.tres' as the default bus to use the audio visualizer.")
|
||||
|
||||
spectrum = AudioServer.get_bus_effect_instance(bus, 0)
|
||||
%MuteMaster.button_pressed = AudioServer.is_bus_mute(AudioServer.get_bus_index(MasterBus))
|
||||
%VolumeSlider.value = db_to_linear(AudioServer.get_bus_volume_db(AudioServer.get_bus_index(MasterBus)))
|
||||
|
||||
if OS.has_feature('web'):
|
||||
motion_smoothing = motion_smoothing * 1.5
|
||||
|
||||
_on_data_loaded_callback = JavaScriptBridge.create_callback(_on_data_loaded)
|
||||
# Retrieve the 'gd_callbacks' object
|
||||
var gdcallbacks: JavaScriptObject = JavaScriptBridge.get_interface("gd_callbacks")
|
||||
# Assign the callbacks
|
||||
gdcallbacks.dataLoaded = _on_data_loaded_callback
|
||||
|
||||
|
||||
func _process(_delta):
|
||||
if %MusicPlayer.playing:
|
||||
draw_spectrum()
|
||||
|
||||
|
||||
func _pressed():
|
||||
var open_file = func(filepath: String):
|
||||
print("Opening '%s'" % filepath)
|
||||
var file = FileAccess.open(filepath, FileAccess.READ)
|
||||
var data = file.get_buffer(file.get_length())
|
||||
open_stream(filepath.get_extension(), data)
|
||||
|
||||
if is_4_2_and_higher and DisplayServer.has_feature(DisplayServer.FEATURE_NATIVE_DIALOG):
|
||||
# TODO remove call() and get() after moving to 4.2
|
||||
DisplayServer.call("file_dialog_show", "Select audio file", "", "", true, DisplayServer.get("FILE_DIALOG_MODE_OPEN_FILE"), ["*.mp3"],
|
||||
func (status: bool, selected: PackedStringArray, _fileter: int):
|
||||
if status and selected.size():
|
||||
open_file.call(selected[0])
|
||||
)
|
||||
elif OS.has_feature('web'):
|
||||
JavaScriptBridge.eval("loadData()")
|
||||
else:
|
||||
var fd := FileDialog.new()
|
||||
add_child(fd)
|
||||
|
||||
fd.title = "Select audio file"
|
||||
fd.access = FileDialog.ACCESS_FILESYSTEM
|
||||
fd.file_mode = FileDialog.FILE_MODE_OPEN_FILE
|
||||
fd.current_dir = OS.get_system_dir(OS.SYSTEM_DIR_DOWNLOADS)
|
||||
fd.add_filter("*.mp3")
|
||||
fd.popup_centered_ratio(0.8)
|
||||
|
||||
fd.file_selected.connect(func(path: String):
|
||||
open_file.call(path)
|
||||
)
|
||||
|
||||
fd.visibility_changed.connect(func():
|
||||
if not fd.visible:
|
||||
fd.queue_free()
|
||||
)
|
||||
|
||||
|
||||
func _on_data_loaded(data: Array) -> void:
|
||||
# Make sure there is something
|
||||
if (data.size() == 0):
|
||||
return
|
||||
|
||||
var file_name: String = data[0]
|
||||
print("Opening '%s'" % file_name)
|
||||
|
||||
var arr: PackedByteArray = JavaScriptBridge.eval("gd_callbacks.dataLoadedResult;")
|
||||
open_stream(file_name.get_extension(), arr)
|
||||
|
||||
|
||||
func open_stream(file_ext: String, data: PackedByteArray):
|
||||
var stream: AudioStream = null
|
||||
if file_ext == "mp3":
|
||||
stream = AudioStreamMP3.new()
|
||||
stream.data = data
|
||||
|
||||
if not stream.data:
|
||||
print("Failed to load MP3!")
|
||||
return
|
||||
|
||||
if not stream:
|
||||
print("Failed to load music!")
|
||||
return
|
||||
|
||||
%MusicPlayer.stream = stream
|
||||
%MusicPlayer.bus = MusicAnalyzerBus
|
||||
%MusicPlayer.play()
|
||||
|
||||
# Debugging frequencies
|
||||
for ih in range(1, bars_count + 1):
|
||||
var _hz: float = log_freq(ih / float(bars_count), MIN_HZ, MAX_HZ)
|
||||
#print("%.0f hz %.2f" % [_hz, ih / float(bars_count)])
|
||||
|
||||
|
||||
func draw_spectrum():
|
||||
var _s1 = DebugDraw3D.scoped_config().set_thickness(bar_thickness).set_center_brightness(0.9)
|
||||
var prev_hz = MIN_HZ
|
||||
smoothed_energy.resize(bars_count)
|
||||
|
||||
var xf := transform
|
||||
var y := xf.basis.y
|
||||
var h := y.length()
|
||||
var x := xf.basis.x
|
||||
var z := xf.basis.z
|
||||
var origin := xf.origin - (x * bars_count + (x * bars_separation) * (bars_count - 1)) * 0.5
|
||||
var sum := 0.0
|
||||
|
||||
for ih in range(1, bars_count + 1):
|
||||
var i := ih - 1
|
||||
var hz: float = log_freq(ih / float(bars_count), MIN_HZ, MAX_HZ)
|
||||
var magnitude: float = spectrum.get_magnitude_for_frequency_range(prev_hz, hz, AudioEffectSpectrumAnalyzerInstance.MAGNITUDE_AVERAGE).length()
|
||||
var energy: float = clampf((MIN_DB + linear_to_db(magnitude)) / MIN_DB, 0, 1)
|
||||
var e: float = lerp(smoothed_energy[i], energy, clampf(get_process_delta_time() / motion_smoothing if motion_smoothing else 1.0, 0, 1))
|
||||
smoothed_energy[i] = e
|
||||
var height: float = e * h
|
||||
sum += e
|
||||
|
||||
var s := x * bars_separation
|
||||
|
||||
var a := origin + x * i + s * i + (z * 0.5)
|
||||
var b := origin + x * (i + 1) + s * i + (z * -0.5) + xf.basis.y.normalized() * clampf(height, 0.001, h)
|
||||
var c := Color.HOT_PINK
|
||||
if colors:
|
||||
c = colors.sample(wrapf(float(ih) / bars_count + color_offset, 0, 1))
|
||||
c.s = clamp(c.s - smoothed_energy[i] * 0.3, 0, 1.0)
|
||||
|
||||
DebugDraw3D.draw_box_ab(a, b, y, c)
|
||||
|
||||
prev_hz = hz
|
||||
|
||||
color_offset = wrapf(color_offset + sum / smoothed_energy.size() * clampf(get_process_delta_time() / color_offset_speed if color_offset_speed else 1.0, 0, 1), 0, 1)
|
||||
|
||||
|
||||
func log10(val: float) -> float:
|
||||
return log(val) / 2.302585
|
||||
|
||||
|
||||
func log_freq(pos: float, min_hz: float, max_hz: float) -> float:
|
||||
return pow(10, log10(min_hz) + (log10(max_hz) - log10(min_hz)) * pos)
|
||||
|
||||
|
||||
func _on_volume_slider_value_changed(value):
|
||||
AudioServer.set_bus_volume_db(AudioServer.get_bus_index(MasterBus), linear_to_db(value))
|
||||
|
||||
|
||||
func _on_mute_master_toggled(toggled_on):
|
||||
AudioServer.set_bus_mute(AudioServer.get_bus_index(MasterBus), toggled_on)
|
||||
112
examples_dd3d/demo_settings_panel.gd
Normal file
112
examples_dd3d/demo_settings_panel.gd
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
@tool
|
||||
extends Control
|
||||
|
||||
@export var switch_to_scene = ""
|
||||
var is_ready := false
|
||||
|
||||
func _ready():
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
|
||||
if ProjectSettings.has_setting("application/config/no_csharp_support"):
|
||||
%SwitchLang.visible = false
|
||||
|
||||
%SwitchLang.disabled = true
|
||||
|
||||
var test := DebugDraw2D.get_graph(&"FPS")
|
||||
if test:
|
||||
%FPSEnabled.button_pressed = test.enabled
|
||||
%FPSMS.button_pressed = test.frame_time_mode
|
||||
%WidthSlider.value = test.size.x
|
||||
%BufferSlider.value = test.buffer_size
|
||||
|
||||
%ThicknessSlider.value = get_parent().debug_thickness
|
||||
%FrustumScaleSlider.value = get_parent().camera_frustum_scale
|
||||
%UpdateInPhysics.text = "Update in physics (%d Ticks) *" % ProjectSettings.get_setting("physics/common/physics_ticks_per_second")
|
||||
%UpdateInPhysics.button_pressed = get_parent().update_in_physics
|
||||
|
||||
%ShowStats.button_pressed = get_parent().text_groups_show_stats
|
||||
%DrawBoxes.button_pressed = get_parent().draw_array_of_boxes
|
||||
%Draw1MBoxes.button_pressed = get_parent().draw_1m_boxes
|
||||
|
||||
if get_tree():
|
||||
await get_tree().create_timer(0.2).timeout
|
||||
|
||||
%SwitchLang.disabled = false
|
||||
is_ready = true
|
||||
|
||||
|
||||
func _on_CheckBox_toggled(button_pressed: bool) -> void:
|
||||
if not is_ready: return
|
||||
|
||||
var cfg = DebugDraw2D.get_graph(&"FPS")
|
||||
if cfg:
|
||||
cfg.enabled = button_pressed
|
||||
|
||||
|
||||
func _on_FPSMS_toggled(button_pressed: bool) -> void:
|
||||
if not is_ready: return
|
||||
|
||||
var cfg = DebugDraw2D.get_graph(&"FPS")
|
||||
if cfg:
|
||||
cfg.frame_time_mode = button_pressed
|
||||
|
||||
|
||||
func _on_Button_pressed() -> void:
|
||||
get_tree().call_deferred("change_scene_to_file", switch_to_scene)
|
||||
|
||||
|
||||
func _on_hide_show_panel_pressed():
|
||||
if %SettingsPanel.visible:
|
||||
%SettingsPanel.hide()
|
||||
%HideShowPanelButton.text = "Show panel"
|
||||
else:
|
||||
%SettingsPanel.show()
|
||||
%HideShowPanelButton.text = "Hide panel"
|
||||
|
||||
|
||||
func _on_width_slider_value_changed(value):
|
||||
if not is_ready: return
|
||||
|
||||
get_parent().graph_size = Vector2i(int(value), get_parent().graph_size.y)
|
||||
|
||||
|
||||
func _on_buffer_slider_value_changed(value):
|
||||
if not is_ready: return
|
||||
|
||||
get_parent().graph_buffer_size = int(value)
|
||||
|
||||
|
||||
func _on_thickness_slider_value_changed(value):
|
||||
if not is_ready: return
|
||||
|
||||
get_parent().debug_thickness = value
|
||||
|
||||
|
||||
func _on_frustum_scale_slider_value_changed(value):
|
||||
if not is_ready: return
|
||||
|
||||
get_parent().camera_frustum_scale = value
|
||||
|
||||
|
||||
func _on_update_in_physics_toggled(toggled_on):
|
||||
get_parent().update_in_physics = toggled_on
|
||||
|
||||
|
||||
func _on_show_stats_toggled(toggled_on):
|
||||
get_parent().text_groups_show_stats = toggled_on
|
||||
|
||||
|
||||
func _on_draw_boxes_toggled(toggled_on):
|
||||
get_parent().draw_array_of_boxes = toggled_on
|
||||
|
||||
DebugDraw3D.clear_all()
|
||||
get_parent().timer_cubes = 0
|
||||
|
||||
|
||||
func _on_draw_1m_boxes_toggled(toggled_on):
|
||||
get_parent().draw_1m_boxes = toggled_on
|
||||
|
||||
if get_parent().draw_array_of_boxes:
|
||||
DebugDraw3D.clear_all()
|
||||
get_parent().timer_cubes = 0
|
||||
42
examples_dd3d/demo_web_docs_version_select.gd
Normal file
42
examples_dd3d/demo_web_docs_version_select.gd
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
extends HBoxContainer
|
||||
|
||||
var _on_versions_loaded_callback = null
|
||||
@onready var btn: OptionButton = $OptionButton
|
||||
|
||||
func _enter_tree():
|
||||
hide()
|
||||
|
||||
|
||||
func _ready():
|
||||
if OS.has_feature('web'):
|
||||
_on_versions_loaded_callback = JavaScriptBridge.create_callback(_on_versions_loaded)
|
||||
var versions_callbacks: JavaScriptObject = JavaScriptBridge.get_interface("versions_callbacks")
|
||||
versions_callbacks.loaded = _on_versions_loaded_callback
|
||||
|
||||
JavaScriptBridge.eval("loadVersions()")
|
||||
|
||||
|
||||
func _on_versions_loaded(args: Array) -> void:
|
||||
if (args.size() == 0):
|
||||
return
|
||||
|
||||
var current_version: String = args[0]
|
||||
|
||||
var versions_str: String = JavaScriptBridge.eval("versions_callbacks.versions;")
|
||||
var version_urls_str: String = JavaScriptBridge.eval("versions_callbacks.version_urls;")
|
||||
var versions: PackedStringArray = versions_str.split(";", false)
|
||||
var version_urls: PackedStringArray = version_urls_str.split(";", false)
|
||||
|
||||
if versions:
|
||||
show()
|
||||
btn.clear()
|
||||
btn.item_selected.connect(func(idx):
|
||||
# move to another version
|
||||
JavaScriptBridge.eval("window.location.href = \"%s\"" % version_urls[idx])
|
||||
)
|
||||
|
||||
for i in range(versions.size()):
|
||||
btn.add_item(versions[i], i)
|
||||
|
||||
if versions[i] == current_version:
|
||||
btn.select(i)
|
||||
Loading…
Add table
Add a link
Reference in a new issue