Added the `HierarchyEditor` and `LocalToWorldEditor` classes to implement custom component editing functionality. Added the `Vector3Field` control for 3D vector manipulation and its corresponding XAML definition. Added the `ComponentDataView` and `ComponentObject` classes to manage component data display and access. Added the `CustomEditorAttribute` to mark classes as custom editors for specific components. Changed the `IInspectable` interface to use properties for `Icon`, `HeaderContent`, and `InspectorContent`. Changed the `PropertyField` class to enhance UI control binding capabilities. Changed the `EditorWorldManager` to improve world data loading and deserialization processes. Changed the `EntityNode` and `WorldNode` classes to update entity construction and component querying. Changed the `StaticResource` class to include new binding flags for component properties. Changed the `InspectorService` to remove old contract references and adopt new interfaces. Changed the `QueryEnumerable` and related files to update generic constraints for improved type safety. Changed the `QueryItem` class to reflect new generic constraints and enhance deconstruction. Changed the `World.Query` methods to utilize the updated generic constraints. Updated the `SerializationTest` to align with new entity creation and management practices.
72 lines
2.8 KiB
C#
72 lines
2.8 KiB
C#
using Ghost.Editor.Controls;
|
|
using Ghost.Editor.Core.Inspector;
|
|
using Ghost.Engine.Components;
|
|
using Ghost.Engine.Utilities;
|
|
using Microsoft.UI.Xaml.Controls;
|
|
|
|
namespace Ghost.Editor.Components;
|
|
|
|
[CustomEditor(typeof(LocalToWorld))]
|
|
internal class LocalToWorldEditor : IComponentEditor
|
|
{
|
|
private Vector3Field _translationField = null!;
|
|
private Vector3Field _rotationField = null!;
|
|
private Vector3Field _scaleField = null!;
|
|
|
|
public void Create(ComponentObject componentObject, StackPanel container)
|
|
{
|
|
_translationField = new Vector3Field();
|
|
_rotationField = new Vector3Field();
|
|
_scaleField = new Vector3Field();
|
|
|
|
_translationField.OnValueChanged += (s, e) =>
|
|
{
|
|
var data = componentObject.GetData<LocalToWorld>();
|
|
MatrixUtility.GetTRS(data.ValueRO.matrix, out var oldTranslation, out var oldRotation, out var oldScale);
|
|
data.ValueRW.matrix = MatrixUtility.CreateTRS(e.NewValue, oldRotation, oldScale);
|
|
};
|
|
|
|
_rotationField.OnValueChanged += (s, e) =>
|
|
{
|
|
var data = componentObject.GetData<LocalToWorld>();
|
|
MatrixUtility.GetTRS(data.ValueRO.matrix, out var oldTranslation, out var oldRotation, out var oldScale);
|
|
data.ValueRW.matrix = MatrixUtility.CreateTRS(oldTranslation, e.NewValue.ToQuaternion(), oldScale);
|
|
};
|
|
|
|
_scaleField.OnValueChanged += (s, e) =>
|
|
{
|
|
var data = componentObject.GetData<LocalToWorld>();
|
|
MatrixUtility.GetTRS(data.ValueRO.matrix, out var oldTranslation, out var oldRotation, out var oldScale);
|
|
data.ValueRW.matrix = MatrixUtility.CreateTRS(oldTranslation, oldRotation, e.NewValue);
|
|
};
|
|
|
|
container.Children.Add(new PropertyField() { Label = "Position", Content = _translationField });
|
|
container.Children.Add(new PropertyField() { Label = "Rotation", Content = _rotationField });
|
|
container.Children.Add(new PropertyField() { Label = "Scale", Content = _scaleField });
|
|
}
|
|
|
|
public void Update(ComponentObject componentObject)
|
|
{
|
|
var data = componentObject.GetData<LocalToWorld>();
|
|
MatrixUtility.GetTRS(data.ValueRO.matrix, out var translation, out var rotation, out var scale);
|
|
|
|
if (_translationField.FocusState == Microsoft.UI.Xaml.FocusState.Unfocused)
|
|
{
|
|
_translationField.Value = translation;
|
|
}
|
|
|
|
if (_rotationField.FocusState == Microsoft.UI.Xaml.FocusState.Unfocused)
|
|
{
|
|
_rotationField.Value = VectorUtility.CreateFromQuaternion(rotation);
|
|
}
|
|
|
|
if (_scaleField.FocusState == Microsoft.UI.Xaml.FocusState.Unfocused)
|
|
{
|
|
_scaleField.Value = scale;
|
|
}
|
|
}
|
|
|
|
public void Destroy(ComponentObject componentObject)
|
|
{
|
|
}
|
|
} |