material-maker/material_maker/panels/preview_3d/preview_mesh.gd

79 lines
2.2 KiB
GDScript

extends MeshInstance
export var can_tesselate : bool = true
export var uv_scale : Vector2 = Vector2(1, 1) setget set_uv_scale
export var tesselated : bool = false setget set_tesselated
func _ready():
update_material()
func set_uv_scale(s : Vector2) -> void:
if s != uv_scale:
uv_scale = s
var material = get_surface_material(0)
if material != null:
if material is SpatialMaterial:
material.uv1_scale.x = uv_scale.x
material.uv1_scale.y = uv_scale.y
elif material is ShaderMaterial:
material.set_shader_param("uv1_scale", Vector3(uv_scale.x, uv_scale.y, 1))
func set_tesselated(t : bool) -> void:
var new_tesselated = t && can_tesselate
if new_tesselated == tesselated:
return
tesselated = new_tesselated
update_material()
# Force material update (this is not need at startup)
var parent = self
while ! (parent is ViewportContainer):
parent = parent.get_parent()
parent.emit_signal("need_update", [ parent ])
func update_material() -> void:
if mesh == null:
return
var material
if tesselated:
material = preload("res://material_maker/panels/preview_3d/materials/shader_material_tesselated.tres").duplicate()
material.set_shader_param("uv1_scale", Vector3(uv_scale.x, uv_scale.y, 1))
match mesh.get_class():
"CubeMesh","PrismMesh":
mesh.subdivide_width = 128
mesh.subdivide_height = 128
mesh.subdivide_depth = 128
"PlaneMesh":
mesh.subdivide_width = 128
mesh.subdivide_depth = 128
"CylinderMesh":
mesh.radial_segments = 128
mesh.rings = 128
"SphereMesh":
mesh.radial_segments = 128
mesh.rings = 64
_:
print(mesh.get_class())
else:
material = preload("res://material_maker/panels/preview_3d/materials/spatial_material.tres").duplicate()
material.uv1_scale.x = uv_scale.x
material.uv1_scale.y = uv_scale.y
match mesh.get_class():
"CubeMesh","PrismMesh":
mesh.subdivide_width = 0
mesh.subdivide_height = 0
mesh.subdivide_depth = 0
"PlaneMesh":
mesh.subdivide_width = 0
mesh.subdivide_depth = 0
"CylinderMesh":
mesh.radial_segments = 32
mesh.rings = 1
"SphereMesh":
mesh.radial_segments = 32
mesh.rings = 16
_:
#print(mesh.get_class())
pass
set_surface_material(0, material)