using System; using SMPLModel; using UnityEngine; // ReSharper disable ParameterHidesMember namespace Display { /// /// Draws a boneDisplay between two joints. /// public class BoneLine : MonoBehaviour { [SerializeField] BoneDisplaySettings defaultBoneDisplaySettings = default; LineRenderer lineRenderer; Transform childBone; Transform parentBone; BoneDisplay boneDisplay; SMPLCharacter smplCharacter; BoneDisplaySettings Settings { get { if (smplCharacter.DisplaySettings != null && smplCharacter.DisplaySettings.BoneDisplaySettings != null) return smplCharacter.DisplaySettings.BoneDisplaySettings; return defaultBoneDisplaySettings; } } void OnEnable() { lineRenderer = GetComponent(); DisableFirstFrame(); } /// /// Needs to start disabled to avoid artifacts while it awaits initialization. /// void DisableFirstFrame() { lineRenderer.enabled = false; } /// /// Replaces constructor for MonoBehaviour /// /// /// /// /// public void Init(SMPLCharacter smplCharacter, BoneDisplay boneDisplay, Transform parentBone, Transform childBone) { this.smplCharacter = smplCharacter; this.boneDisplay = boneDisplay; this.parentBone = parentBone; this.childBone = childBone; name = $"BoneLine {this.parentBone.name} to {this.childBone.name}"; } void LateUpdate() { UpdateBoneLine(); ShowOrHideBasedOnSettings(); if (Settings.DrawSidesDifferentColors) DrawSidesDifferentColors(); } void UpdateBoneLine() { Vector3[] positions = {childBone.position, parentBone.position}; lineRenderer.SetPositions(positions); lineRenderer.startWidth = Settings.BoneWidth; lineRenderer.endWidth = Settings.BoneWidth; } void ShowOrHideBasedOnSettings() { lineRenderer.enabled = boneDisplay.DisplayBones; } void DrawSidesDifferentColors() { SideOfBody sideOfBody = Bones.GetSideOfBody(childBone.name); switch (sideOfBody) { case SideOfBody.Left: lineRenderer.material = Settings.LeftSideMaterial; break; case SideOfBody.Right: lineRenderer.material = Settings.RightSideMaterial; break; case SideOfBody.Center: break; default: throw new ArgumentOutOfRangeException(); } } } }