rabidus-test/Assets/BNG Framework/HandPoser/Scripts/SkeletonVisualizer.cs

130 lines
4.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace BNG {
[ExecuteInEditMode]
public class SkeletonVisualizer : MonoBehaviour {
public bool ShowGizmos = true;
[Range(0.0f, 1f)]
public float JointRadius = 0.00875f;
[Range(0.0f, 5f)]
public float BoneThickness = 3f;
public Color GizmoColor = new Color(255f, 255f, 255f, 0.5f);
public bool ShowTransformNames = false;
bool isQuiting;
void OnApplicationQuit() {
isQuiting = true;
}
void OnDestroy() {
if (isQuiting) {
return;
}
#if UNITY_EDITOR
// Remove any components we had added
if (Application.isEditor && !Application.isPlaying) {
ResetEditorHandles();
UnityEditor.SceneView.RepaintAll();
}
#endif
}
#if UNITY_EDITOR
void OnDrawGizmos() {
// Show Gizmos indicating bones / joints
if (ShowGizmos) {
Transform[] children = GetComponentsInChildren<Transform>();
int childCount = children.Length;
for (int x = 0; x < childCount; x++) {
Transform child = children[x];
// Don't count the root object
if(child == transform ) {
continue;
}
bool isFingerTip = IsTipOfBone(child);
float opacity = isFingerTip ? 0.5f : 0.1f;
EditorHandle handle = child.gameObject.GetComponent<EditorHandle>();
// Create the editor handle if not available
if (handle == null) {
handle = child.gameObject.AddComponent<EditorHandle>();
// Hide in Inspector
child.gameObject.hideFlags = HideFlags.None;
handle.hideFlags = HideFlags.HideInInspector;
}
handle.Radius = JointRadius / 1000f;
handle.BaseColor = new Color(GizmoColor.r, GizmoColor.g, GizmoColor.b, opacity);
handle.ShowTransformName = ShowTransformNames;
// Connect with Lines
if (child.parent != null) {
// Line way of drawing
// Gizmos.DrawLine(child.position, child.parent.position);
// Smoothed line way of drawing
// Only show if the line goes far enough
if(Vector3.Distance(child.position, child.parent.position) > 0.001f) {
UnityEditor.Handles.DrawBezier(child.position, child.parent.position, child.position, child.parent.position, GizmoColor, null, BoneThickness);
}
}
}
}
else {
ResetEditorHandles();
}
}
void OnDrawGizmosSelected() {
// Update every frame even while in editor
if (!Application.isPlaying) {
UnityEditor.EditorApplication.QueuePlayerLoopUpdate();
UnityEditor.SceneView.RepaintAll();
}
}
#endif
/// <summary>
/// I.e. a finger tip, tip of toe, etc.
/// </summary>
/// <param name="fingerJoint"></param>
/// <returns></returns>
public virtual bool IsTipOfBone(Transform fingerJoint) {
if (fingerJoint.childCount == 0 && fingerJoint != transform && fingerJoint.parent != transform) {
return true;
}
return false;
}
public void ResetEditorHandles() {
EditorHandle[] handles = GetComponentsInChildren<EditorHandle>();
for (int x = 0; x < handles.Length; x++) {
if (handles[x] != null && handles[x].gameObject != null) {
GameObject.DestroyImmediate((handles[x]));
}
}
}
}
}