// SDK Transform Modify|Utilities|90150
namespace VRTK
{
using UnityEngine;
using System;
using System.Collections.Generic;
using System.Linq;
[Serializable]
public class VRTK_SDKTransformModifiers
{
[Header("SDK settings")]
[Tooltip("An optional SDK Setup to use to determine when to modify the transform.")]
public VRTK_SDKSetup loadedSDKSetup = null;
[Tooltip("An optional SDK controller type to use to determine when to modify the transform.")]
public SDK_BaseController.ControllerType controllerType = SDK_BaseController.ControllerType.Undefined;
[Header("Transform Override Settings")]
[Tooltip("The new local position to change the transform to.")]
public Vector3 position = Vector3.zero;
[Tooltip("The new local rotation in eular angles to change the transform to.")]
public Vector3 rotation = Vector3.zero;
[Tooltip("The new local scale to change the transform to.")]
public Vector3 scale = Vector3.one;
}
///
/// The SDK Transform Modify can be used to change a transform orientation at runtime based on the currently used SDK or SDK controller.
///
[AddComponentMenu("VRTK/Scripts/Utilities/VRTK_SDKTransformModify")]
public class VRTK_SDKTransformModify : VRTK_SDKControllerReady
{
[Tooltip("The target Transform to modify on enable. If this is left blank then the Transform the script is attached to will be used.")]
public Transform target;
[Tooltip("If this is checked then the target Transform will be reset to the original orientation when this script is disabled.")]
public bool resetOnDisable = true;
[Tooltip("A collection of SDK Transform overrides to change the given target Transform for each specified SDK.")]
public List sdkOverrides = new List();
protected Vector3 originalPosition;
protected Quaternion originalRotation;
protected Vector3 originalScale;
///
/// The UpdateTransform method updates the Transform data on the current GameObject for the specified settings.
///
/// An optional reference to the controller to update the transform with.
public virtual void UpdateTransform(VRTK_ControllerReference controllerReference = null)
{
if (target == null)
{
return;
}
VRTK_SDKTransformModifiers selectedModifier = GetSelectedModifier(controllerReference);
//If a modifier is found then change the transform
if (selectedModifier != null)
{
target.localPosition = selectedModifier.position;
target.localEulerAngles = selectedModifier.rotation;
target.localScale = selectedModifier.scale;
}
}
///
/// The SetOrigins method sets the original position, rotation, scale of the target Transform.
///
public virtual void SetOrigins()
{
if (target != null)
{
originalPosition = target.position;
originalRotation = target.rotation;
originalScale = target.localScale;
}
}
protected override void OnEnable()
{
target = (target != null ? target : transform);
SetOrigins();
base.OnEnable();
}
protected override void OnDisable()
{
base.OnDisable();
if (resetOnDisable)
{
target.position = originalPosition;
target.rotation = originalRotation;
target.localScale = originalScale;
}
}
protected override void ControllerReady(VRTK_ControllerReference controllerReference)
{
if (VRTK_SDKManager.GetLoadedSDKSetup() != null && gameObject.activeInHierarchy)
{
UpdateTransform(controllerReference);
}
}
protected virtual VRTK_SDKTransformModifiers GetSelectedModifier(VRTK_ControllerReference controllerReference)
{
//attempt to find by the overall SDK set up to start with
VRTK_SDKTransformModifiers selectedModifier = sdkOverrides.FirstOrDefault(item => item.loadedSDKSetup == VRTK_SDKManager.GetLoadedSDKSetup());
//If no sdk set up is found or it is null then try and find by the SDK controller
if (selectedModifier == null)
{
SDK_BaseController.ControllerType currentControllerType = VRTK_DeviceFinder.GetCurrentControllerType(controllerReference);
selectedModifier = sdkOverrides.FirstOrDefault(item => item.controllerType == currentControllerType);
}
return selectedModifier;
}
}
}