37 lines
816 B
GDScript3
37 lines
816 B
GDScript3
|
@tool
|
||
|
extends Node3D
|
||
|
|
||
|
const FontTools = preload ("res://lib/utils/font_tools.gd")
|
||
|
|
||
|
@onready var label: Label3D = $Label3D
|
||
|
@onready var chat: Skeleton3D = $chat_bubble/Armature/Skeleton3D
|
||
|
@onready var model: MeshInstance3D = $chat_bubble/Armature/Skeleton3D/Cube
|
||
|
|
||
|
@export var text := "Hello, World!":
|
||
|
set(value):
|
||
|
if !is_node_ready(): await ready
|
||
|
|
||
|
text = value
|
||
|
label.text = value
|
||
|
update()
|
||
|
|
||
|
@export var flip: bool = false:
|
||
|
set(value):
|
||
|
if !is_node_ready(): await ready
|
||
|
|
||
|
flip = value
|
||
|
model.rotation_degrees.x = -90 if value else 90
|
||
|
|
||
|
const base_width = 0.8 * 0.2
|
||
|
|
||
|
func update():
|
||
|
var text_width = FontTools.get_font_size(label).x
|
||
|
|
||
|
var offset = (text_width - base_width) / 0.2
|
||
|
|
||
|
offset = max(0.0, offset)
|
||
|
|
||
|
if flip:
|
||
|
offset = -offset
|
||
|
|
||
|
chat.set_bone_pose_position(1 if flip else 0, Vector3(0, offset, 0))
|