@tool
extends MeshInstance3D
## Proof-of-concept: programmatically build a PBR VisualShader.
## Attach to a MeshInstance3D with a SphereMesh. Check "Build Shader" in inspector.
@export var build_shader: bool = false:
set(v):
if v and Engine.is_editor_hint():
_build_pbr_vshader()
build_shader = false
func _build_pbr_vshader() -> void:
var vs := VisualShader.new()
vs.set_mode(Shader.MODE_SPATIAL)
# Node 2: Albedo color (vec3 constant)
var albedo := VisualShaderNodeVec3Constant.new()
albedo.constant = Vector3(0.8, 0.2, 0.1) # Red-ish
vs.add_node(VisualShader.TYPE_FRAGMENT, albedo, Vector2(-300, -50), 2)
# Node 3: Metallic (float constant)
var metallic := VisualShaderNodeFloatConstant.new()
metallic.constant = 0.0
vs.add_node(VisualShader.TYPE_FRAGMENT, metallic, Vector2(-300, 80), 3)
# Node 4: Roughness (float constant)
var roughness := VisualShaderNodeFloatConstant.new()
roughness.constant = 0.6
vs.add_node(VisualShader.TYPE_FRAGMENT, roughness, Vector2(-300, 160), 4)
# Node 5: Texture node (unassigned, just to prove it shows up)
var tex := VisualShaderNodeTexture.new()
vs.add_node(VisualShader.TYPE_FRAGMENT, tex, Vector2(-500, -200), 5)
# Connections to output node (id=0)
# Albedo -> Output:0 (ALBEDO)
var e1 := vs.connect_nodes(VisualShader.TYPE_FRAGMENT, 2, 0, 0, 0)
# Metallic -> Output:2 (METALLIC)
var e2 := vs.connect_nodes(VisualShader.TYPE_FRAGMENT, 3, 0, 0, 2)
# Roughness -> Output:3 (ROUGHNESS)
var e3 := vs.connect_nodes(VisualShader.TYPE_FRAGMENT, 4, 0, 0, 3)
# Texture RGB -> nothing (just floating, proves node visibility)
print("[TestVShader] Connections: e1=%d e2=%d e3=%d" % [e1, e2, e3])
var nodes := vs.get_node_list(VisualShader.TYPE_FRAGMENT)
var conns := vs.get_node_connections(VisualShader.TYPE_FRAGMENT)
print("[TestVShader] Fragment: %d nodes, %d connections" % [nodes.size(), conns.size()])
# Save to disk
ResourceSaver.save(vs, "res://test_pbr_vshader.tres")
print("[TestVShader] Saved to res://test_pbr_vshader.tres")
# Assign
var mat := ShaderMaterial.new()
mat.shader = vs
set_surface_override_material(0, mat)
print("[TestVShader] Done — click material override, open VisualShader, switch to Fragment tab")