Files
unity-application/Packages/com.github.homuler.mediapipe/Runtime/Scripts/Unity/Annotation/Arrow.cs
2023-03-12 20:34:16 +00:00

154 lines
3.4 KiB
C#

// Copyright (c) 2021 homuler
//
// Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.
using System;
using UnityEngine;
namespace Mediapipe.Unity
{
#pragma warning disable IDE0065
using Color = UnityEngine.Color;
#pragma warning restore IDE0065
public class Arrow : MonoBehaviour
{
[SerializeField] private Color _color = Color.white;
[SerializeField] private Vector3 _direction = Vector3.right;
[SerializeField] private float _magnitude = 0.0f;
[SerializeField] private float _capScale = 1.0f;
[SerializeField, Range(0, 1)] private float _lineWidth = 1.0f;
private void Start()
{
ApplyColor(color);
ApplyDirection(_direction);
ApplyCapScale(_capScale);
ApplyLineWidth(_lineWidth);
ApplyMagnitude(_magnitude); // magnitude must be set after _capScale
}
#if UNITY_EDITOR
private void OnValidate()
{
if (!UnityEditor.PrefabUtility.IsPartOfAnyPrefab(this))
{
ApplyDirection(_direction);
ApplyCapScale(_capScale);
ApplyLineWidth(_lineWidth);
ApplyMagnitude(_magnitude); // magnitude must be set after _capScale
}
}
#endif
private Transform _cone;
private Transform cone
{
get
{
if (_cone == null)
{
_cone = transform.Find("Cone");
}
return _cone;
}
}
private LineRenderer lineRenderer => gameObject.GetComponent<LineRenderer>();
public Vector3 direction
{
get => _direction;
set
{
_direction = value.normalized;
ApplyDirection(_direction);
}
}
public float magnitude
{
get => _magnitude;
set
{
if (value < 0)
{
throw new ArgumentException("Magnitude must be positive");
}
_magnitude = value;
ApplyMagnitude(value);
}
}
public Color color
{
get => _color;
set
{
_color = value;
ApplyColor(value);
}
}
public void SetVector(Vector3 v)
{
direction = v;
magnitude = v.magnitude;
}
public void SetCapScale(float capScale)
{
_capScale = capScale;
ApplyCapScale(_capScale);
}
public void SetLineWidth(float lineWidth)
{
_lineWidth = lineWidth;
ApplyLineWidth(_lineWidth);
}
private void ApplyColor(Color color)
{
lineRenderer.startColor = color;
lineRenderer.endColor = color;
cone.GetComponent<Renderer>().material.color = color;
}
private void ApplyDirection(Vector3 direction)
{
lineRenderer.SetPosition(1, _magnitude * direction);
cone.localRotation = Quaternion.FromToRotation(Vector3.up, direction);
}
private void ApplyMagnitude(float magnitude)
{
lineRenderer.SetPosition(1, magnitude * direction);
if (magnitude == 0)
{
cone.localScale = Vector3.zero;
cone.localPosition = Vector3.zero;
}
else
{
ApplyCapScale(_capScale);
cone.localPosition = (cone.localScale.y + magnitude) * direction; // pivot is at the center of cone
}
}
private void ApplyCapScale(float capScale)
{
cone.localScale = capScale * Vector3.one;
}
private void ApplyLineWidth(float lineWidth)
{
lineRenderer.startWidth = lineWidth;
lineRenderer.endWidth = lineWidth;
}
}
}