Files
GhostEngine/Ghost.App/Components/LocalToWorldEditor.cs
Misaki 1724072f7e Add component editors and UI controls
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.
2025-06-20 20:19:14 +09:00

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)
{
}
}