79 lines
2.4 KiB
GDScript
79 lines
2.4 KiB
GDScript
extends Node
|
||
## Autoload — pre-warms custom shaders on startup by rendering each
|
||
## ShaderMaterial once in a hidden 64×64 viewport.
|
||
##
|
||
## StandardMaterial3D is covered by ubershaders (already enabled).
|
||
## This catches the custom .gdshader materials that ubershaders miss.
|
||
|
||
# Paths to all ShaderMaterial .tres files with custom shaders
|
||
const MATERIAL_PATHS: Array[String] = [
|
||
"res://core/daynight/environment_dust_material.tres",
|
||
"res://core/daynight/environment_shadows.tres",
|
||
"res://core/daynight/godrays.tres",
|
||
"res://core/daynight/weather_overlay.tres",
|
||
"res://core/daynight/weather_plain_shader.tres",
|
||
"res://core/biome_generator/wires.tres",
|
||
"res://tgcc/chunk/prop/grass/grass_chunk.tres",
|
||
"res://tgcc/chunk/prop/grass/grass_chunk_weeds.tres",
|
||
"res://tgcc/chunk/prop/grass/grass_chunk_weeds2.tres",
|
||
"res://tgcc/chunk/prop/grass/grass_bank.tres",
|
||
"res://tgcc/chunk/prop/tree/leaves_tree1.tres",
|
||
"res://tgcc/chunk/prop/tree/leaves_tree_small.tres",
|
||
"res://tgcc/chunk/prop/tree/trunk.tres",
|
||
"res://tgcc/chunk/prop/flower/flower.tres",
|
||
"res://tgcc/chunk/prop/flower/bush.tres",
|
||
"res://tgcc/chunk/prop/house/house_emissiv.tres",
|
||
"res://tgcc/chunk/prop/tenda noren/tenda.tres",
|
||
"res://tgcc/chunk/prop/Tori/Tori.tres",
|
||
"res://tgcc/chunk/prop/zen garden/zengardenCircle.tres",
|
||
"res://tgcc/chunk/prop/zen garden/zengarden.tres",
|
||
]
|
||
|
||
|
||
func _ready() -> void:
|
||
await get_tree().process_frame
|
||
warmup()
|
||
|
||
|
||
func warmup() -> void:
|
||
var valid: Array[ShaderMaterial] = []
|
||
for path in MATERIAL_PATHS:
|
||
if not ResourceLoader.exists(path):
|
||
continue
|
||
var mat := load(path)
|
||
if mat is ShaderMaterial:
|
||
valid.append(mat)
|
||
|
||
if valid.is_empty():
|
||
return
|
||
|
||
print("[ShaderWarmup] Pre-warming %d custom ShaderMaterials..." % valid.size())
|
||
|
||
# Tiny hidden viewport — 64×64 is cheap to render
|
||
var vp := SubViewport.new()
|
||
vp.size = Vector2i(64, 64)
|
||
vp.render_target_update_mode = SubViewport.UPDATE_ALWAYS
|
||
add_child(vp)
|
||
|
||
var cam := Camera3D.new()
|
||
cam.current = true
|
||
cam.environment = null
|
||
vp.add_child(cam)
|
||
|
||
var quad := MeshInstance3D.new()
|
||
quad.mesh = QuadMesh.new()
|
||
quad.mesh.size = Vector2(1, 1)
|
||
quad.position = Vector3(0, 0, -2)
|
||
cam.add_child(quad)
|
||
|
||
for mat in valid:
|
||
quad.material_override = mat
|
||
await get_tree().process_frame # one frame renders the quad with this material
|
||
|
||
quad.material_override = null
|
||
quad.mesh = null
|
||
valid.clear()
|
||
vp.queue_free()
|
||
await get_tree().process_frame
|
||
print("[ShaderWarmup] Done.")
|