forked from Misaki/GhostEngine
Major architectural update to graphics/material/shader system: - Introduced strongly-typed key structs (Key64/Key128) for passes, variants, and pipelines; removed legacy key types. - Implemented robust hashing and key generation utilities for efficient variant and pipeline lookup/caching. - Shader compiler now compiles/caches all keyword variants using new key system; includes handled as lists. - Switched to push constant root signature for per-draw data; updated HLSL and C# codegen accordingly. - Refactored Material, Shader, and Pass data structures for cache efficiency and variant support. - Pipeline library and PSO management now use 128-bit keys and variant-specific caching. - Replaced WorldNode with SceneNode in editor/scene graph; introduced ComponentManager for archetype/query management. - Migrated math utilities to Misaki.HighPerformance.Mathematics; updated editor controls. - Updated all HLSL and codegen for new buffer/push constant layouts and macros. - Misc: project reference cleanup, D3D12 Work Graph support, doc updates, and code modernization.
125 lines
3.3 KiB
C#
125 lines
3.3 KiB
C#
using Ghost.Editor.Core.Controls.Internal;
|
|
using Ghost.Editor.Core.Inspector;
|
|
using Ghost.Editor.Core.Resources;
|
|
using Ghost.Engine.Editor;
|
|
using Ghost.Entities;
|
|
using Microsoft.UI.Text;
|
|
using Microsoft.UI.Xaml;
|
|
using Microsoft.UI.Xaml.Controls;
|
|
using Microsoft.UI.Xaml.Data;
|
|
using System.Reflection;
|
|
|
|
namespace Ghost.Editor.Core.SceneGraph;
|
|
|
|
public partial class EntityNode : SceneGraphNode
|
|
{
|
|
public SceneNode Owner
|
|
{
|
|
get;
|
|
set;
|
|
}
|
|
|
|
public Entity Entity
|
|
{
|
|
get;
|
|
}
|
|
|
|
public override SceneGraphNodeType NodeType => SceneGraphNodeType.Entity;
|
|
|
|
public EntityNode(SceneNode owner, Entity entity, string name)
|
|
{
|
|
Owner = owner;
|
|
Entity = entity;
|
|
Name = name;
|
|
}
|
|
}
|
|
|
|
public partial class EntityNode : IInspectable
|
|
{
|
|
public IconSource? Icon => EditorIconSource.entity_24;
|
|
|
|
public UIElement? HeaderContent
|
|
{
|
|
get
|
|
{
|
|
var root = new StackPanel()
|
|
{
|
|
HorizontalAlignment = HorizontalAlignment.Stretch,
|
|
VerticalAlignment = VerticalAlignment.Center
|
|
};
|
|
|
|
var nameText = new TextBox
|
|
{
|
|
Text = Name,
|
|
FontWeight = FontWeights.Bold,
|
|
};
|
|
var idText = new TextBlock
|
|
{
|
|
Text = $"ID: {Entity.ID} Generation: {Entity.Generation}",
|
|
Margin = new Thickness(5, 7, 0, 0),
|
|
Opacity = 0.75,
|
|
Style = Application.Current.Resources["CaptionTextBlockStyle"] as Style
|
|
};
|
|
|
|
nameText.SetBinding(TextBox.TextProperty, new Binding
|
|
{
|
|
Source = this,
|
|
Path = new PropertyPath(nameof(Name)),
|
|
Mode = BindingMode.TwoWay,
|
|
UpdateSourceTrigger = UpdateSourceTrigger.LostFocus,
|
|
});
|
|
|
|
root.Children.Add(nameText);
|
|
root.Children.Add(idText);
|
|
|
|
return root;
|
|
}
|
|
}
|
|
|
|
public unsafe UIElement? InspectorContent
|
|
{
|
|
get
|
|
{
|
|
var r = Owner.Scene.World.EntityManager.GetEntityLocation(Entity);
|
|
if (!r)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
var root = new StackPanel()
|
|
{
|
|
HorizontalAlignment = HorizontalAlignment.Stretch,
|
|
VerticalAlignment = VerticalAlignment.Top
|
|
};
|
|
|
|
var location = r.Value;
|
|
ref var archetype = ref Owner.Scene.World.ComponentManager.GetArchetypeReference(location.archetypeID);
|
|
|
|
var it = archetype._signature.GetIterator();
|
|
while (it.Next(out var typeID))
|
|
{
|
|
var pComponent = archetype.GetComponentData(location.chunkIndex, location.rowIndex, typeID);
|
|
if (pComponent == null)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (!ComponentRegistry.s_runtimeIDToType.TryGetValue(typeID, out var t))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (t.GetCustomAttribute<HideEditorAttribute>() != null)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var componentView = new ComponentView(t.Name, Owner.Scene.World, Entity, t);
|
|
root.Children.Add(componentView);
|
|
}
|
|
|
|
return root;
|
|
}
|
|
}
|
|
}
|