Files
FlaxEngine/Source/Editor/GUI/CurveEditor.Access.cs
2022-01-14 13:31:12 +01:00

262 lines
7.8 KiB
C#

// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved.
using FlaxEngine;
// ReSharper disable RedundantAssignment
namespace FlaxEditor.GUI
{
partial class CurveEditor<T>
{
/// <summary>
/// The generic keyframe value accessor object for curve editor.
/// </summary>
/// <typeparam name="U">The keyframe value type.</typeparam>
public interface IKeyframeAccess<U> where U : new()
{
/// <summary>
/// Gets the default value.
/// </summary>
/// <param name="value">The value.</param>
void GetDefaultValue(out U value);
/// <summary>
/// Gets the curve components count. Vector types should return amount of component to use for value editing.
/// </summary>
/// <returns>The components count.</returns>
int GetCurveComponents();
/// <summary>
/// Gets the value of the component for the curve.
/// </summary>
/// <param name="value">The keyframe value.</param>
/// <param name="component">The component index.</param>
/// <returns>The curve value.</returns>
float GetCurveValue(ref U value, int component);
/// <summary>
/// Sets the curve value of the component.
/// </summary>
/// <param name="curve">The curve value to assign.</param>
/// <param name="value">The keyframe value.</param>
/// <param name="component">The component index.</param>
void SetCurveValue(float curve, ref U value, int component);
}
private class KeyframeAccess :
IKeyframeAccess<bool>,
IKeyframeAccess<int>,
IKeyframeAccess<double>,
IKeyframeAccess<float>,
IKeyframeAccess<Vector2>,
IKeyframeAccess<Vector3>,
IKeyframeAccess<Vector4>,
IKeyframeAccess<Quaternion>,
IKeyframeAccess<Color32>,
IKeyframeAccess<Color>
{
void IKeyframeAccess<bool>.GetDefaultValue(out bool value)
{
value = false;
}
int IKeyframeAccess<bool>.GetCurveComponents()
{
return 1;
}
float IKeyframeAccess<bool>.GetCurveValue(ref bool value, int component)
{
return value ? 1 : 0;
}
void IKeyframeAccess<bool>.SetCurveValue(float curve, ref bool value, int component)
{
value = curve >= 0.5f;
}
void IKeyframeAccess<int>.GetDefaultValue(out int value)
{
value = 0;
}
int IKeyframeAccess<int>.GetCurveComponents()
{
return 1;
}
float IKeyframeAccess<int>.GetCurveValue(ref int value, int component)
{
return value;
}
void IKeyframeAccess<int>.SetCurveValue(float curve, ref int value, int component)
{
value = (int)curve;
}
void IKeyframeAccess<double>.GetDefaultValue(out double value)
{
value = 0.0;
}
int IKeyframeAccess<double>.GetCurveComponents()
{
return 1;
}
float IKeyframeAccess<double>.GetCurveValue(ref double value, int component)
{
return (float)value;
}
void IKeyframeAccess<double>.SetCurveValue(float curve, ref double value, int component)
{
value = curve;
}
void IKeyframeAccess<float>.GetDefaultValue(out float value)
{
value = 0.0f;
}
int IKeyframeAccess<float>.GetCurveComponents()
{
return 1;
}
float IKeyframeAccess<float>.GetCurveValue(ref float value, int component)
{
return value;
}
void IKeyframeAccess<float>.SetCurveValue(float curve, ref float value, int component)
{
value = curve;
}
void IKeyframeAccess<Vector2>.GetDefaultValue(out Vector2 value)
{
value = Vector2.Zero;
}
int IKeyframeAccess<Vector2>.GetCurveComponents()
{
return 2;
}
float IKeyframeAccess<Vector2>.GetCurveValue(ref Vector2 value, int component)
{
return value[component];
}
void IKeyframeAccess<Vector2>.SetCurveValue(float curve, ref Vector2 value, int component)
{
value[component] = curve;
}
void IKeyframeAccess<Vector3>.GetDefaultValue(out Vector3 value)
{
value = Vector3.Zero;
}
int IKeyframeAccess<Vector3>.GetCurveComponents()
{
return 3;
}
float IKeyframeAccess<Vector3>.GetCurveValue(ref Vector3 value, int component)
{
return value[component];
}
void IKeyframeAccess<Vector3>.SetCurveValue(float curve, ref Vector3 value, int component)
{
value[component] = curve;
}
void IKeyframeAccess<Vector4>.GetDefaultValue(out Vector4 value)
{
value = Vector4.Zero;
}
int IKeyframeAccess<Vector4>.GetCurveComponents()
{
return 4;
}
float IKeyframeAccess<Vector4>.GetCurveValue(ref Vector4 value, int component)
{
return value[component];
}
void IKeyframeAccess<Vector4>.SetCurveValue(float curve, ref Vector4 value, int component)
{
value[component] = curve;
}
public void GetDefaultValue(out Quaternion value)
{
value = Quaternion.Identity;
}
int IKeyframeAccess<Quaternion>.GetCurveComponents()
{
return 3;
}
float IKeyframeAccess<Quaternion>.GetCurveValue(ref Quaternion value, int component)
{
return value.EulerAngles[component];
}
void IKeyframeAccess<Quaternion>.SetCurveValue(float curve, ref Quaternion value, int component)
{
var euler = value.EulerAngles;
euler[component] = curve;
Quaternion.Euler(euler.X, euler.Y, euler.Z, out value);
}
void IKeyframeAccess<Color>.GetDefaultValue(out Color value)
{
value = Color.Black;
}
int IKeyframeAccess<Color>.GetCurveComponents()
{
return 4;
}
float IKeyframeAccess<Color>.GetCurveValue(ref Color value, int component)
{
return value[component];
}
void IKeyframeAccess<Color>.SetCurveValue(float curve, ref Color value, int component)
{
value[component] = curve;
}
void IKeyframeAccess<Color32>.GetDefaultValue(out Color32 value)
{
value = Color32.Black;
}
int IKeyframeAccess<Color32>.GetCurveComponents()
{
return 4;
}
float IKeyframeAccess<Color32>.GetCurveValue(ref Color32 value, int component)
{
return value[component];
}
void IKeyframeAccess<Color32>.SetCurveValue(float curve, ref Color32 value, int component)
{
value[component] = (byte)Mathf.Clamp(curve, 0, 255);
}
}
}
}