OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / scenes / test / test_vshader.gd

59 lines · gd ref:
@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")