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();
}
}
}
}