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