Files
VR-Mess/scripts/TeleportMarker.cs

60 lines
1.8 KiB
C#

using Godot;
public partial class TeleportMarker : Node3D
{
private static readonly Color IdleColor = new(0.2f, 0.55f, 0.9f);
private static readonly Color HotColor = new(0.4f, 0.95f, 1.0f);
[Export]
public string MarkerLabel { get; set; } = "1";
private StandardMaterial3D _discMaterial;
private StandardMaterial3D _beamMaterial;
private MeshInstance3D _beam;
private Label3D _label;
public bool IsNear { get; private set; }
public override void _Ready()
{
AddToGroup("teleport_marker");
_discMaterial = MakeMaterial(IdleColor, false);
_beamMaterial = MakeMaterial(new Color(IdleColor, 0.35f), true);
GetNode<MeshInstance3D>("Disc").SetSurfaceOverrideMaterial(0, _discMaterial);
_beam = GetNode<MeshInstance3D>("Beam");
_beam.SetSurfaceOverrideMaterial(0, _beamMaterial);
_label = GetNode<Label3D>("Label3D");
_label.Text = MarkerLabel;
}
public void SetNear(bool near)
{
if (IsNear == near)
return;
IsNear = near;
GetNode<MeshInstance3D>("Disc").Visible = !near;
_beam.Visible = !near;
_label.Visible = !near;
}
public void SetHighlighted(bool highlighted)
{
Color c = highlighted ? HotColor : IdleColor;
_discMaterial.AlbedoColor = c;
_discMaterial.Emission = c;
_beamMaterial.AlbedoColor = new Color(c, 0.35f);
_beamMaterial.Emission = c;
}
private static StandardMaterial3D MakeMaterial(Color color, bool transparent) => new()
{
AlbedoColor = color,
EmissionEnabled = true,
Emission = color,
EmissionEnergyMultiplier = 2.0f,
Transparency = transparent ? BaseMaterial3D.TransparencyEnum.Alpha : BaseMaterial3D.TransparencyEnum.Disabled,
};
}