aboutsummaryrefslogtreecommitdiff
path: root/src/addons/rmsmartshape/materials/shape_material.gd
blob: cbb2abdaead2a9b000bd756a532b3c60b65523c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
tool
extends Resource
class_name SS2D_Material_Shape

"""
This material represents the set of edge materials used for a RMSmartShape2D
Each edge represents a set of textures used to render an edge
"""

# List of materials this shape can use
# Should be SS2D_Material_Edge_Metadata
export (Array, Resource) var _edge_meta_materials: Array = [] setget set_edge_meta_materials
export (Array, Texture) var fill_textures: Array = [] setget set_fill_textures
export (Array, Texture) var fill_texture_normals: Array = [] setget set_fill_texture_normals
export (int) var fill_texture_z_index: int = -10 setget set_fill_texture_z_index
export (float) var fill_mesh_offset: float = 0.0 setget set_fill_mesh_offset
export (Material) var fill_mesh_material: Material = null setget set_fill_mesh_material

# How much to offset all edges
export (float, -1.5, 1.5, 0.1) var render_offset: float = 0.0 setget set_render_offset


func set_fill_mesh_material(m: Material):
	fill_mesh_material = m
	emit_signal("changed")


func set_fill_mesh_offset(f: float):
	fill_mesh_offset = f
	emit_signal("changed")


func set_render_offset(f: float):
	render_offset = f
	emit_signal("changed")


# Get all valid edge materials for this normal
func get_edge_meta_materials(normal: Vector2) -> Array:
	var materials = []
	for e in _edge_meta_materials:
		if e == null:
			continue
		if e.normal_range.is_in_range(normal):
			materials.push_back(e)
	return materials


func get_all_edge_meta_materials() -> Array:
	return _edge_meta_materials


func get_all_edge_materials() -> Array:
	var materials = []
	for meta in _edge_meta_materials:
		if meta.edge_material != null:
			materials.push_back(meta.edge_material)
	return materials


func add_edge_material(e: SS2D_Material_Edge_Metadata):
	var new_array = _edge_meta_materials.duplicate()
	new_array.push_back(e)
	set_edge_meta_materials(new_array)


func _on_edge_material_changed():
	emit_signal("changed")


func set_fill_textures(a: Array):
	fill_textures = a
	emit_signal("changed")


func set_fill_texture_normals(a: Array):
	fill_texture_normals = a
	emit_signal("changed")


func set_fill_texture_z_index(i: int):
	fill_texture_z_index = i
	emit_signal("changed")


func set_edge_meta_materials(a: Array):
	for e in _edge_meta_materials:
		if e == null:
			continue
		if not a.has(e):
			e.disconnect("changed", self, "_on_edge_material_changed")

	for e in a:
		if e == null:
			continue
		if not e.is_connected("changed", self, "_on_edge_material_changed"):
			e.connect("changed", self, "_on_edge_material_changed")

	_edge_meta_materials = a
	emit_signal("changed")