godot-demo-projects/3d/occlusion_culling_mesh_lod/node_3d.gd

56 lines
1.9 KiB
GDScript

extends Node3D
func _input(event: InputEvent) -> void:
if event.is_action_pressed("toggle_occlusion_culling"):
get_viewport().use_occlusion_culling = not get_viewport().use_occlusion_culling
update_labels()
if event.is_action_pressed("toggle_mesh_lod"):
get_viewport().mesh_lod_threshold = 1.0 if is_zero_approx(get_viewport().mesh_lod_threshold) else 0.0
update_labels()
if event.is_action_pressed("cycle_draw_mode"):
get_viewport().debug_draw = wrapi(get_viewport().debug_draw + 1, 0, 5) as Viewport.DebugDraw
update_labels()
if event.is_action_pressed("toggle_vsync"):
if DisplayServer.window_get_vsync_mode() == DisplayServer.VSYNC_DISABLED:
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED)
else:
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
func _process(_delta: float) -> void:
$Performance.text = """%d FPS (%.2f mspf)
Currently rendering:
%d objects
%dK primitive indices
%d draw calls
""" % [
Engine.get_frames_per_second(),
1000.0 / Engine.get_frames_per_second(),
RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_OBJECTS_IN_FRAME),
roundi(RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_PRIMITIVES_IN_FRAME) * 0.001),
RenderingServer.get_rendering_info(RenderingServer.RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME),
]
func update_labels() -> void:
$OcclusionCulling.text = "Occlusion culling: %s" % ("Enabled" if get_viewport().use_occlusion_culling else "Disabled")
$MeshLOD.text = "Mesh LOD: %s" % ("Enabled" if not is_zero_approx(get_viewport().mesh_lod_threshold) else "Disabled")
$DrawMode.text = "Draw mode: %s" % get_draw_mode_string(get_viewport().debug_draw)
func get_draw_mode_string(draw_mode: int) -> String:
match draw_mode:
0:
return "Normal"
1:
return "Unshaded"
2:
return "Lighting"
3:
return "Overdraw"
4:
return "Wireframe"
_:
return "(unknown)"