ZeroVR/ZeroPacientVR/Assets/Octave3D World Builder/Scripts/Objects/Object Rotation/ObjectRotationRandomization.cs

104 lines
7.0 KiB
C#

#if UNITY_EDITOR
using UnityEngine;
namespace O3DWB
{
public static class ObjectRotationRandomization
{
#region Public Static Functions
public static void Randomize(GameObject gameObject, ObjectRotationRandomizationSettings randomizationSettings)
{
if(randomizationSettings.RandomizeRotation)
{
Transform objectTransform = gameObject.transform;
if (randomizationSettings.XAxisRandomizationSettings.Randomize) RandomizeRotationForAxis(objectTransform, randomizationSettings.XAxisRandomizationSettings.Axis, randomizationSettings.XAxisRandomizationSettings.RandomizationModeSettings);
if (randomizationSettings.YAxisRandomizationSettings.Randomize) RandomizeRotationForAxis(objectTransform, randomizationSettings.YAxisRandomizationSettings.Axis, randomizationSettings.YAxisRandomizationSettings.RandomizationModeSettings);
if (randomizationSettings.ZAxisRandomizationSettings.Randomize) RandomizeRotationForAxis(objectTransform, randomizationSettings.ZAxisRandomizationSettings.Axis, randomizationSettings.ZAxisRandomizationSettings.RandomizationModeSettings);
if (randomizationSettings.CustomAxisRandomizationSettings.Randomize) RandomizeRotationForAxis(objectTransform, randomizationSettings.CustomAxisRandomizationSettings.Axis, randomizationSettings.CustomAxisRandomizationSettings.RandomizationModeSettings);
}
}
public static Quaternion GenerateRandomRotationQuaternion(ObjectRotationRandomizationSettings randomizationSettings)
{
Quaternion randomRotationQuaternion = Quaternion.identity;
if (randomizationSettings.RandomizeRotation)
{
if (randomizationSettings.XAxisRandomizationSettings.Randomize) randomRotationQuaternion = GenerateRandomRotationQuaternionForAxis(Vector3.right, randomizationSettings.XAxisRandomizationSettings.RandomizationModeSettings) * randomRotationQuaternion;
if (randomizationSettings.YAxisRandomizationSettings.Randomize) randomRotationQuaternion = GenerateRandomRotationQuaternionForAxis(Vector3.up, randomizationSettings.YAxisRandomizationSettings.RandomizationModeSettings) * randomRotationQuaternion;
if (randomizationSettings.ZAxisRandomizationSettings.Randomize) randomRotationQuaternion = GenerateRandomRotationQuaternionForAxis(Vector3.forward, randomizationSettings.ZAxisRandomizationSettings.RandomizationModeSettings) * randomRotationQuaternion;
if (randomizationSettings.CustomAxisRandomizationSettings.Randomize) randomRotationQuaternion = GenerateRandomRotationQuaternionForAxis(randomizationSettings.CustomAxisRandomizationSettings.Axis, randomizationSettings.CustomAxisRandomizationSettings.RandomizationModeSettings) * randomRotationQuaternion;
}
return randomRotationQuaternion;
}
#endregion
#region Private Static Functions
private static void RandomizeRotationForAxis(Transform objectTransform, TransformAxis axis, AxisRotationRandomizationModeSettings rotationRandomizationModeSettings)
{
Vector3 axisVector = TransformAxes.GetVector(axis, TransformSpace.Global, objectTransform);
RandomizeRotationForAxis(objectTransform, axisVector, rotationRandomizationModeSettings);
}
private static void RandomizeRotationForAxis(Transform objectTransform, Vector3 axis, AxisRotationRandomizationModeSettings rotationRandomizationModeSettings)
{
if (rotationRandomizationModeSettings.RandomizationMode == AxisRotationRandomizationMode.RandomRotationStep)
RandomizeRotationForAxis(objectTransform, axis, rotationRandomizationModeSettings.RandomRotationStepAxisRandomizationSettings.StepSizeInDegrees);
else
if (rotationRandomizationModeSettings.RandomizationMode == AxisRotationRandomizationMode.RandomRotationValue)
{
RandomizeTransformRotationForAxis(objectTransform, axis,
rotationRandomizationModeSettings.RandomRotationValueAxisRandomizationSettings.MinRotationInDegrees,
rotationRandomizationModeSettings.RandomRotationValueAxisRandomizationSettings.MaxRotationInDegrees);
}
}
private static Quaternion GenerateRandomRotationQuaternionForAxis(Vector3 axis, AxisRotationRandomizationModeSettings rotationRandomizationModeSettings)
{
if (rotationRandomizationModeSettings.RandomizationMode == AxisRotationRandomizationMode.RandomRotationStep)
return GenerateRandomRotationQuaternionForAxis(axis, rotationRandomizationModeSettings.RandomRotationStepAxisRandomizationSettings.StepSizeInDegrees);
else
if (rotationRandomizationModeSettings.RandomizationMode == AxisRotationRandomizationMode.RandomRotationValue)
{
return GenerateRandomRotationQuaternionForAxis(axis,
rotationRandomizationModeSettings.RandomRotationValueAxisRandomizationSettings.MinRotationInDegrees,
rotationRandomizationModeSettings.RandomRotationValueAxisRandomizationSettings.MaxRotationInDegrees);
}
else return Quaternion.identity;
}
private static void RandomizeRotationForAxis(Transform objectTransform, Vector3 axis, float stepSizeInDegrees)
{
int numberOfStepsInFullRotation = (int)(360.0f / stepSizeInDegrees + 0.5f);
int randomMultiple = UnityEngine.Random.Range(0, numberOfStepsInFullRotation + 1);
float randomRotation = randomMultiple * stepSizeInDegrees;
objectTransform.Rotate(axis, randomRotation, Space.World);
}
private static Quaternion GenerateRandomRotationQuaternionForAxis(Vector3 axis, float stepSizeInDegrees)
{
int numberOfStepsInFullRotation = (int)(360.0f / stepSizeInDegrees + 0.5f);
int randomMultiple = UnityEngine.Random.Range(0, numberOfStepsInFullRotation + 1);
float randomRotation = randomMultiple * stepSizeInDegrees;
return Quaternion.AngleAxis(randomRotation, axis);
}
private static void RandomizeTransformRotationForAxis(Transform objectTransform, Vector3 axis, float minRotationValueInDegrees, float maxRotationValueInDegrees)
{
float randomRotation = UnityEngine.Random.Range(minRotationValueInDegrees, maxRotationValueInDegrees);
objectTransform.Rotate(axis, randomRotation, Space.World);
}
private static Quaternion GenerateRandomRotationQuaternionForAxis(Vector3 axis, float minRotationValueInDegrees, float maxRotationValueInDegrees)
{
float randomRotation = UnityEngine.Random.Range(minRotationValueInDegrees, maxRotationValueInDegrees);
return Quaternion.AngleAxis(randomRotation, axis);
}
#endregion
}
}
#endif