Bugbot/Scenes/bug_marker.gd

54 lines
2.1 KiB
GDScript

class_name BugMarker
extends Node3D
enum BugStatus { NEUTRAL, UNRESOLVED, IN_PROGRESS, RESOLVED }
@export var marker_status : BugStatus = BugStatus.NEUTRAL : set = __set_marker_status
const NEUTRAL_COLOUR = Color.CORNFLOWER_BLUE
const UNRESOLVED_COLOUR = Color(0.1, 0.0, 0.0)
const IN_PROGRESS_COLOUR = Color(0.5, 0.5, 0.0)
const RESOLVED_COLOUR = Color(0.0, 1.0, 0.0)
@export var enable_info : bool = true : set = set_info_enabled
@onready var __arrow : MeshInstance3D = $Arrow as MeshInstance3D
@onready var __billboard : MeshInstance3D = $Billboard as MeshInstance3D
@onready var __info_collider : Area3D = $Billboard/Info as Area3D
var __arrow_material : ShaderMaterial
var __billboard_material : ShaderMaterial
func _ready() -> void:
__arrow_material = __arrow.mesh.surface_get_material(0) as ShaderMaterial
__billboard_material = __billboard.mesh.surface_get_material(0) as ShaderMaterial
set_info_enabled(enable_info)
__set_marker_status(marker_status)
func set_rotation_to_normal(_normal:Vector3) -> void:
global_transform.basis.y = _normal
global_transform.basis.x = global_transform.basis.z.cross(_normal)
global_transform.basis = global_transform.basis.orthonormalized()
func set_info_enabled(_enable:bool):
if __info_collider:
__info_collider.collision_layer = 0xFFFFFFFF if _enable else 0x00000000
func __set_marker_status(_status:BugStatus) -> void:
if __arrow_material and __billboard_material:
match _status:
BugStatus.NEUTRAL:
__arrow_material.set_shader_parameter("colour", NEUTRAL_COLOUR)
__billboard_material.set_shader_parameter("colour", NEUTRAL_COLOUR)
BugStatus.UNRESOLVED:
__arrow_material.set_shader_parameter("colour", UNRESOLVED_COLOUR)
__billboard_material.set_shader_parameter("colour", UNRESOLVED_COLOUR)
BugStatus.IN_PROGRESS:
__arrow_material.set_shader_parameter("colour", IN_PROGRESS_COLOUR)
__billboard_material.set_shader_parameter("colour", IN_PROGRESS_COLOUR)
BugStatus.RESOLVED:
__arrow_material.set_shader_parameter("colour", RESOLVED_COLOUR)
__billboard_material.set_shader_parameter("colour", RESOLVED_COLOUR)
marker_status = _status