Files
przygody-pana-cegly/addons/rmsmartshape/materials/edge_material.gd

157 lines
4.3 KiB
GDScript

@tool
extends Resource
class_name SS2D_Material_Edge
## This material represents the set of textures used for a single edge.
##
## This consists of: [br]
## - textures [br]
## - corner_textures [br]
## - taper_textures [br]
## All variations of the main edge texture.[br]
## _textures[0] is considered the "main" texture for the EdgeMaterial.[br][br]
## [b]Note:[/b] Will be used to generate an icon representing an edge texture.[br]
@export var textures: Array[Texture2D] = [] : set = _set_textures
# Textures for the final left and right quad of the edge when the angle is steep
@export var textures_corner_outer: Array[Texture2D] = [] : set = _set_textures_corner_outer
@export var textures_corner_inner: Array[Texture2D] = [] : set = _set_textures_corner_inner
# Textures for the final left and right quad of the edge when the angle is shallow
# Named as such because the desired look is that the texture "tapers-off"
@export var textures_taper_left: Array[Texture2D] = [] : set = _set_textures_taper_left
@export var textures_taper_right: Array[Texture2D] = [] : set = _set_textures_taper_right
## Textures that will be used for the sharp_corner_tapering feature
@export var textures_taper_corner_left: Array[Texture2D] = [] : set = _set_textures_taper_corner_left
@export var textures_taper_corner_right: Array[Texture2D] = [] : set = _set_textures_taper_corner_right
## If the texture choice should be randomized instead of the choice by point setup
@export var randomize_texture: bool = false : set = _set_randomize_texture
## If corner textures should be used
@export var use_corner_texture: bool = true : set = _set_use_corner
## If taper textures should be used
@export var use_taper_texture: bool = true : set = _set_use_taper
## Whether squishing can occur when texture doesn't fit nicely into total length.
enum FITMODE {SQUISH_AND_STRETCH, CROP}
@export var fit_mode: FITMODE = FITMODE.SQUISH_AND_STRETCH : set = _set_fit_texture
@export var material: Material = null : set = _set_material
###########
# SETTERS #
###########
func _set_textures(ta: Array[Texture2D]) -> void:
textures = ta
emit_changed()
func _set_textures_corner_outer(a: Array[Texture2D]) -> void:
textures_corner_outer = a
emit_changed()
func _set_textures_corner_inner(a: Array[Texture2D]) -> void:
textures_corner_inner = a
emit_changed()
func _set_textures_taper_left(a: Array[Texture2D]) -> void:
textures_taper_left = a
emit_changed()
func _set_textures_taper_right(a: Array[Texture2D]) -> void:
textures_taper_right = a
emit_changed()
func _set_textures_taper_corner_left(a: Array[Texture2D]) -> void:
textures_taper_corner_left = a
emit_changed()
func _set_textures_taper_corner_right(a: Array[Texture2D]) -> void:
textures_taper_corner_right = a
emit_changed()
func _set_randomize_texture(b: bool) -> void:
randomize_texture = b
emit_changed()
func _set_use_corner(b: bool) -> void:
use_corner_texture = b
emit_changed()
func _set_use_taper(b: bool) -> void:
use_taper_texture = b
emit_changed()
func _set_fit_texture(fitmode: FITMODE) -> void:
fit_mode = fitmode
emit_changed()
func _set_material(m: Material) -> void:
material = m
emit_changed()
###########
# GETTERS #
###########
func get_texture(idx: int) -> Texture2D:
return _get_element(idx, textures)
func get_texture_corner_inner(idx: int) -> Texture2D:
return _get_element(idx, textures_corner_inner)
func get_texture_corner_outer(idx: int) -> Texture2D:
return _get_element(idx, textures_corner_outer)
func get_texture_taper_left(idx: int) -> Texture2D:
return _get_element(idx, textures_taper_left)
func get_texture_taper_right(idx: int) -> Texture2D:
return _get_element(idx, textures_taper_right)
func get_texture_taper_corner_left(idx: int) -> Texture2D:
return _get_element(idx, textures_taper_corner_left)
func get_texture_taper_corner_right(idx: int) -> Texture2D:
return _get_element(idx, textures_taper_corner_right)
#########
# USAGE #
#########
## Returns main texture used to visually identify this edge material
func get_icon_texture() -> Texture2D:
if not textures.is_empty():
return textures[0]
return null
############
# INTERNAL #
############
func _get_element(idx: int, a: Array) -> Variant:
if a.is_empty():
return null
return a[_adjust_idx(idx, a)]
func _adjust_idx(idx: int, a: Array) -> int:
return idx % a.size()