using System; using SMPLModel; using UnityEngine; // ReSharper disable ParameterHidesMember namespace Display { /// /// A single point light for displaying a joint's location. /// [ExecuteInEditMode] public class JointSphere : MonoBehaviour { [SerializeField] JointSphereDisplaySettings defaultPointlightDisplaySettings = default; JointSphereDisplaySettings Settings { get { if (smplCharacter != null && smplCharacter.DisplaySettings != null) { return smplCharacter.DisplaySettings.jointSphereDisplaySettings; } return defaultPointlightDisplaySettings; } } Transform linkedBone; MeshRenderer meshRenderer; PointLightDisplay pointLightDisplay; SMPLCharacter smplCharacter; void OnEnable() { meshRenderer = GetComponent(); } public void AttachBone(SMPLCharacter smplCharacter, PointLightDisplay pointLightDisplay, Transform bone) { this.smplCharacter = smplCharacter; linkedBone = bone; this.pointLightDisplay = pointLightDisplay; name = $"JointSphere for {bone.name}"; var cachedTransform = transform; cachedTransform.localPosition = Vector3.zero; cachedTransform.localScale = new Vector3(Settings.PointLightDisplaySize, Settings.PointLightDisplaySize, Settings.PointLightDisplaySize); } void LateUpdate() { if (Settings.DrawSidesDifferentColors) ColorBySideOfBody(linkedBone); this.transform.localScale = new Vector3(Settings.PointLightDisplaySize, Settings.PointLightDisplaySize, Settings.PointLightDisplaySize); if (linkedBone != null) { transform.position = linkedBone.position; meshRenderer.enabled = pointLightDisplay.DisplayPointLights; } else { meshRenderer.enabled = false; } } /// /// Colors the sides of body differently /// /// /// void ColorBySideOfBody(Transform bone) { SideOfBody side = Bones.GetSideOfBody(bone.name); switch (side) { case SideOfBody.Left: meshRenderer.sharedMaterial = Settings.LeftSideMaterial; break; case SideOfBody.Right: meshRenderer.sharedMaterial = Settings.RightSideMaterial; break; case SideOfBody.Center: break; default: throw new ArgumentOutOfRangeException(); } } } }