material-maker/material_maker/widgets/render_counter/render_counter.gd

142 lines
5.4 KiB
GDScript

extends Control
var last_value : int = 0
var start_time : int = 0
var max_render_queue_size : int = 0
var auto : bool = true
var fast_counter : int = 0
onready var menu : PopupMenu = $PopupMenu
onready var renderers_menu : PopupMenu = $PopupMenu/Renderers
onready var render_menu : PopupMenu = $PopupMenu/MaxRenderSize
onready var buffers_menu : PopupMenu = $PopupMenu/MaxBufferSize
const ITEM_AUTO : int = 1000
const ITEM_RENDER_ENABLED : int = 1001
func _ready() -> void:
menu.add_check_item("Render", ITEM_RENDER_ENABLED)
menu.set_item_checked(menu.get_item_index(ITEM_RENDER_ENABLED), true)
menu.add_check_item("Auto", ITEM_AUTO)
menu.set_item_checked(menu.get_item_index(ITEM_AUTO), true)
# Renderers menu
menu.add_submenu_item("Renderers", "Renderers")
for i in range(8):
renderers_menu.add_radio_check_item("%d" % (i+1), i+1)
renderers_menu.set_item_checked(renderers_menu.get_item_index(mm_renderer.max_renderers), true)
menu.add_separator()
# Render size limit menu
menu.add_submenu_item("Maximum render size", "MaxRenderSize")
var render_size = mm_globals.get_config("max_viewport_size")
for i in range(4):
var size : int = 512 << i
render_menu.add_radio_check_item("%dx%d" % [ size, size ], size)
mm_renderer.max_viewport_size = render_size
render_menu.set_item_checked(render_menu.get_item_index(render_size), true)
# Buffer size limit menu
menu.add_submenu_item("Maximum buffer size", "MaxBufferSize")
buffers_menu.add_radio_check_item("Unlimited", 0)
for i in range(7):
var size : int = 32 << i
buffers_menu.add_radio_check_item("%dx%d" % [ size, size ], size)
buffers_menu.set_item_checked(buffers_menu.get_item_index(0), true)
$GpuRam.hint_tooltip = "Adapter: %s\nVendor: %s" % [ VisualServer.get_video_adapter_name(), VisualServer.get_video_adapter_vendor() ]
func on_counter_change(count : int, pending : int) -> void:
if count == 0 and pending == 0:
$ProgressBar.max_value = 1
$ProgressBar.value = 1
$ProgressBar/Label.text = ""
start_time = OS.get_ticks_msec()
else:
if count > last_value:
if $ProgressBar.value == $ProgressBar.max_value:
$ProgressBar.value = 0
max_render_queue_size = 1
else:
max_render_queue_size += 1
else:
$ProgressBar.value += 1
assert(max_render_queue_size-$ProgressBar.value == count)
$ProgressBar.max_value = max_render_queue_size + pending
if $ProgressBar.value > 0:
var remaining_time_msec = (OS.get_ticks_msec()-start_time)*(count+pending)/$ProgressBar.value
$ProgressBar/Label.text = "%d/%d - %d s" % [ $ProgressBar.value, $ProgressBar.max_value, remaining_time_msec/1000 ]
else:
$ProgressBar/Label.text = "%d/%d - ? s" % [ $ProgressBar.value, $ProgressBar.max_value ]
last_value = count
func e3tok(value : float) -> String:
var unit_modifier : String = ""
if value > 100000000:
value *= 0.000000001
unit_modifier = "G"
elif value > 100000:
value *= 0.000001
unit_modifier = "M"
elif value > 100:
value *= 0.001
unit_modifier = "k"
return "%.1f %sb " % [ value, unit_modifier ]
func _process(_delta):
var fps : float = Performance.get_monitor(Performance.TIME_FPS)
$FpsCounter.text = "%.1f FPS " % fps
if auto:
if fps > 50.0:
fast_counter += 1
if fast_counter > 5:
set_max_renderers(int(min(mm_renderer.max_renderers+1, 8)))
else:
fast_counter = 0
if fps < 20.0:
set_max_renderers(1)
func _on_MemUpdateTimer_timeout():
$GpuRam.text = e3tok(Performance.get_monitor(Performance.RENDER_VIDEO_MEM_USED))
var tooltip : String = "Adapter: %s\nVendor: %s" % [ VisualServer.get_video_adapter_name(), VisualServer.get_video_adapter_vendor() ]
tooltip += "\nVideo mem.: "+e3tok(Performance.get_monitor(Performance.RENDER_VIDEO_MEM_USED))
tooltip += "\nTexture mem.: "+e3tok(Performance.get_monitor(Performance.RENDER_TEXTURE_MEM_USED))
tooltip += "\nVertex mem.: "+e3tok(Performance.get_monitor(Performance.RENDER_VERTEX_MEM_USED))
$GpuRam.hint_tooltip = tooltip
func set_max_renderers(max_renderers : int):
if mm_renderer.max_renderers == max_renderers:
return
renderers_menu.set_item_checked(renderers_menu.get_item_index(mm_renderer.max_renderers), false)
mm_renderer.max_renderers = max_renderers
renderers_menu.set_item_checked(renderers_menu.get_item_index(mm_renderer.max_renderers), true)
func _on_PopupMenu_id_pressed(id):
var index = menu.get_item_index(id)
match id:
ITEM_AUTO:
auto = ! menu.is_item_checked(index)
menu.set_item_checked(index, auto)
ITEM_RENDER_ENABLED:
var b : bool = ! menu.is_item_checked(index)
menu.set_item_checked(index, b)
mm_renderer.enable_renderers(b)
func _on_Renderers_id_pressed(id):
set_max_renderers(id)
func _on_MaxRenderSize_id_pressed(id):
render_menu.set_item_checked(render_menu.get_item_index(mm_renderer.max_viewport_size), false)
mm_renderer.max_viewport_size = id
render_menu.set_item_checked(render_menu.get_item_index(id), true)
mm_globals.set_config("max_viewport_size", id)
func _on_MaxBufferSize_id_pressed(id):
if mm_renderer.max_buffer_size == id:
return
buffers_menu.set_item_checked(buffers_menu.get_item_index(mm_renderer.max_buffer_size), false)
mm_renderer.max_buffer_size = id
buffers_menu.set_item_checked(buffers_menu.get_item_index(mm_renderer.max_buffer_size), true)
func _on_RenderCounter_gui_input(event):
if event is InputEventMouseButton and event.button_index == BUTTON_RIGHT and event.pressed:
menu.rect_global_position = get_global_mouse_position()
menu.popup()