mirror of
https://github.com/Relintai/utilities_gamedev.git
synced 2024-11-14 10:37:19 +01:00
121 lines
2.7 KiB
GDScript
121 lines
2.7 KiB
GDScript
tool
|
|
extends Control
|
|
|
|
enum State {
|
|
STATE_OFF = 0,
|
|
STATE_FLIP_PHASE_1 = 1,
|
|
STATE_FLIP_PHASE_2 = 2,
|
|
};
|
|
|
|
export(Texture) var texture_from : Texture = null
|
|
export(Texture) var texture_back : Texture = null
|
|
export(bool) var flip : bool = false
|
|
|
|
var tex_mirror : bool = false
|
|
var angle : float = 0
|
|
|
|
export(bool) var start_flip : bool = false setget set_flip
|
|
|
|
var _state : int = 0
|
|
var mesh : ArrayMesh = ArrayMesh.new()
|
|
|
|
func start():
|
|
_state = State.STATE_FLIP_PHASE_1
|
|
|
|
set_process(true)
|
|
|
|
func _draw() -> void:
|
|
var tex : Texture = null
|
|
|
|
if flip:
|
|
tex = texture_back
|
|
else:
|
|
tex = texture_from
|
|
|
|
var tf_top : Transform2D = Transform2D()
|
|
tf_top.x = Vector2(1, 0).rotated(angle)
|
|
var tf_bottom : Transform2D = Transform2D()
|
|
tf_bottom.x = Vector2(1, 0).rotated(-angle)
|
|
|
|
var arr : Array = Array()
|
|
|
|
arr.resize(ArrayMesh.ARRAY_MAX)
|
|
|
|
var rhx : float = rect_size.x / 2
|
|
|
|
var v : PoolVector2Array = PoolVector2Array()
|
|
v.push_back(tf_top.xform(Vector2(-rhx, 0)) + Vector2(rhx, 0))
|
|
v.push_back(tf_top.xform(Vector2(rhx, 0)) + Vector2(rhx, 0))
|
|
v.push_back(tf_bottom.xform(Vector2(-rhx, rect_size.y)) + Vector2(rhx, 0))
|
|
v.push_back(tf_bottom.xform(Vector2(rhx, rect_size.y)) + Vector2(rhx, 0))
|
|
arr[ArrayMesh.ARRAY_VERTEX] = v
|
|
|
|
var c : PoolColorArray = PoolColorArray()
|
|
c.push_back(Color(1, 1, 1, 1))
|
|
c.push_back(Color(1, 1, 1, 1))
|
|
c.push_back(Color(1, 1, 1, 1))
|
|
c.push_back(Color(1, 1, 1, 1))
|
|
arr[ArrayMesh.ARRAY_COLOR] = c
|
|
|
|
if !tex_mirror:
|
|
var uv : PoolVector2Array = PoolVector2Array()
|
|
uv.push_back(Vector2(0, 0))
|
|
uv.push_back(Vector2(1, 0))
|
|
uv.push_back(Vector2(0, 1))
|
|
uv.push_back(Vector2(1, 1))
|
|
arr[ArrayMesh.ARRAY_TEX_UV] = uv
|
|
else:
|
|
var uv : PoolVector2Array = PoolVector2Array()
|
|
uv.push_back(Vector2(1, 0))
|
|
uv.push_back(Vector2(0, 0))
|
|
uv.push_back(Vector2(1, 1))
|
|
uv.push_back(Vector2(0, 1))
|
|
arr[ArrayMesh.ARRAY_TEX_UV] = uv
|
|
|
|
var indices : PoolIntArray = PoolIntArray()
|
|
indices.push_back(0)
|
|
indices.push_back(1)
|
|
indices.push_back(2)
|
|
indices.push_back(1)
|
|
indices.push_back(2)
|
|
indices.push_back(3)
|
|
arr[ArrayMesh.ARRAY_INDEX] = indices
|
|
|
|
mesh.clear_surfaces()
|
|
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arr)
|
|
|
|
draw_mesh(mesh, tex, null, Transform2D())
|
|
|
|
func _process(delta: float) -> void:
|
|
if _state == State.STATE_OFF:
|
|
set_process(false)
|
|
elif _state == State.STATE_FLIP_PHASE_1:
|
|
angle += 0.01
|
|
|
|
if angle >= PI / 2:
|
|
angle = PI / 2
|
|
_state = State.STATE_FLIP_PHASE_2
|
|
flip = !flip
|
|
tex_mirror = true
|
|
|
|
update()
|
|
elif _state == State.STATE_FLIP_PHASE_2:
|
|
angle += 0.01
|
|
|
|
if angle >= PI:
|
|
angle = 0
|
|
_state = State.STATE_FLIP_PHASE_1
|
|
tex_mirror = false
|
|
|
|
|
|
update()
|
|
|
|
func _ready() -> void:
|
|
set_process(false)
|
|
|
|
start()
|
|
|
|
func set_flip(val):
|
|
if val:
|
|
start()
|