// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. using FlaxEditor.GUI.Input; using FlaxEngine; using FlaxEngine.GUI; namespace FlaxEditor.Surface.Elements { /// /// Floating point value editing element. /// /// /// [HideInEditor] public sealed class FloatValue : FloatValueBox, ISurfaceNodeElement { /// public SurfaceNode ParentNode { get; } /// public NodeElementArchetype Archetype { get; } /// /// Gets the surface. /// public VisjectSurface Surface => ParentNode.Surface; /// public FloatValue(SurfaceNode parentNode, NodeElementArchetype archetype) : base(Get(parentNode, archetype), archetype.Position.X, archetype.Position.Y, 50, archetype.ValueMin, archetype.ValueMax, 0.01f) { ParentNode = parentNode; Archetype = archetype; ParentNode.ValuesChanged += OnNodeValuesChanged; } private void OnNodeValuesChanged() { Value = Get(ParentNode, Archetype); } /// public override void Draw() { base.Draw(); // Draw border if (!IsFocused) Render2D.DrawRectangle(new Rectangle(Vector2.Zero, Size), Style.Current.BorderNormal); } /// protected override void OnValueChanged() { base.OnValueChanged(); Set(ParentNode, Archetype, Value); } /// /// Gets the floating point value from the specified parent node. Handles type casting and components gather. /// /// The parent node. /// The node element archetype. /// The result value. public static float Get(SurfaceNode parentNode, NodeElementArchetype arch) { if (arch.ValueIndex < 0) return 0; float result; var value = parentNode.Values[arch.ValueIndex]; // Note: this value box may edit on component of the vector like Vector3.Y, BoxID from Archetype tells which component pick if (value is int valueInt) { result = (float)valueInt; } else if (value is float valueFloat) { result = valueFloat; } else if (value is double valueDouble) { result = (float)valueDouble; } else if (value is Vector2 valueVec2) { result = (arch.BoxID == 0 ? valueVec2.X : valueVec2.Y); } else if (value is Vector3 valueVec3) { result = (arch.BoxID == 0 ? valueVec3.X : arch.BoxID == 1 ? valueVec3.Y : valueVec3.Z); } else if (value is Vector4 valueVec4) { result = (arch.BoxID == 0 ? valueVec4.X : arch.BoxID == 1 ? valueVec4.Y : arch.BoxID == 2 ? valueVec4.Z : valueVec4.W); } else { result = 0; } return result; } /// /// Sets the floating point value of the specified parent node. Handles type casting and components assignment. /// /// The parent node. /// The node element archetype. /// The value to set. public static void Set(SurfaceNode parentNode, NodeElementArchetype arch, float toSet) { if (arch.ValueIndex < 0) return; var value = parentNode.Values[arch.ValueIndex]; if (value is int) { value = (int)toSet; } else if (value is float) { value = toSet; } else if (value is double) { value = (double)toSet; } else if (value is Vector2 valueVec2) { if (arch.BoxID == 0) valueVec2.X = toSet; else valueVec2.Y = toSet; value = valueVec2; } else if (value is Vector3 valueVec3) { if (arch.BoxID == 0) valueVec3.X = toSet; else if (arch.BoxID == 1) valueVec3.Y = toSet; else valueVec3.Z = toSet; value = valueVec3; } else if (value is Vector4 valueVec4) { if (arch.BoxID == 0) valueVec4.X = toSet; else if (arch.BoxID == 1) valueVec4.Y = toSet; else if (arch.BoxID == 2) valueVec4.Z = toSet; else valueVec4.W = toSet; value = valueVec4; } else { value = 0; } parentNode.SetValue(arch.ValueIndex, value); } /// /// Sets all the values to the given value (eg. all components of the vector). /// /// The parent node. /// The node element archetype. /// The value to assign. public static void SetAllValues(SurfaceNode parentNode, NodeElementArchetype arch, float toSet) { if (arch.ValueIndex < 0) return; var value = parentNode.Values[arch.ValueIndex]; if (value is int) { value = (int)toSet; } else if (value is float) { value = toSet; } else if (value is double) { value = (double)toSet; } else if (value is Vector2) { value = new Vector2(toSet); } else if (value is Vector3) { value = new Vector3(toSet); } else if (value is Vector4) { value = new Vector4(toSet); } else { value = 0; } parentNode.SetValue(arch.ValueIndex, value); } } }