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.
149 lines
4.2 KiB
Plaintext
149 lines
4.2 KiB
Plaintext
<#@ template language="C#" #>
|
|
<#@ output extension=".cs" #>
|
|
<#@ assembly name="System.Core" #>
|
|
<#@ import namespace="System.Text" #>
|
|
<#@ import namespace="System.Linq" #>
|
|
<#@ include file="Helpers.ttinclude" #>
|
|
|
|
using Ghost.Entities.Components;
|
|
using Ghost.Entities.Query;
|
|
using Ghost.Entities.Utilities;
|
|
using Misaki.HighPerformance.Unsafe.Collections;
|
|
|
|
namespace Ghost.Entities;
|
|
|
|
<# for (int arity = 1; arity <= Amount; arity++) {
|
|
var generics = AppendGenerics(arity);
|
|
var restrictions = AppendGenericRestrictions(arity, "unmanaged, IComponentData");
|
|
var poolParams = Enumerable.Range(0, arity)
|
|
.Select(i => $"ComponentPool<T{i}> pool{i}")
|
|
.Aggregate((a, b) => a + ", " + b);
|
|
var constructorParams = Enumerable.Range(0, arity)
|
|
.Select(i => $"_pool{i}")
|
|
.Aggregate((a, b) => a + ", " + b);
|
|
|
|
#>
|
|
public struct QueryEnumerable<<#= generics #>>
|
|
<#= restrictions #>
|
|
{
|
|
private readonly World _world;
|
|
|
|
<# for (int i = 0; i < arity; i++){ #>
|
|
private readonly ComponentPool<T<#= i #>> _pool<#= i #>;
|
|
<# } #>
|
|
private readonly int _count;
|
|
|
|
private QueryFilter _filters;
|
|
internal readonly QueryFilter Filters => _filters;
|
|
|
|
internal QueryEnumerable(World world, <#= poolParams #>, int count)
|
|
{
|
|
_world = world;
|
|
|
|
<# for (int i = 0; i < arity; i++) { #>
|
|
_pool<#= i #> = pool<#= i #>;
|
|
<# } #>
|
|
|
|
_count = count;
|
|
|
|
_filters = new();
|
|
<# for (int i = 0; i < arity; i++) {#>
|
|
_filters._all.Add(TypeHandle.Get<T<#= i #>>());
|
|
<# } #>
|
|
}
|
|
|
|
public readonly Enumerator GetEnumerator() => new (_world, <#= constructorParams #>, _count, _filters);
|
|
|
|
public ref struct Enumerator
|
|
{
|
|
private readonly World _world;
|
|
private readonly ReadOnlySpan<Entity> _entities;
|
|
|
|
<# for (int i = 0; i < arity; i++){ #>
|
|
private readonly ComponentPool<T<#= i #>> _pool<#= i #>;
|
|
<# } #>
|
|
|
|
private int _index;
|
|
private readonly int _count;
|
|
|
|
private BitSet _filterMask;
|
|
|
|
public QueryItem<<#= generics #>> Current
|
|
{
|
|
get;
|
|
private set;
|
|
}
|
|
|
|
internal Enumerator(World world, <#= poolParams #>, int count, QueryFilter filters)
|
|
{
|
|
_world = world;
|
|
_entities = _world.EntityManager.Entities;
|
|
|
|
<# for (int i = 0; i < arity; i++){ #>
|
|
_pool<#= i #> = pool<#= i #>;
|
|
<# } #>
|
|
|
|
_count = count;
|
|
_index = -1;
|
|
_filterMask = new BitSet(_world.EntityManager.EntityCount);
|
|
filters.ComputeFilterBitMask(_world, _filterMask);
|
|
|
|
Current = default;
|
|
}
|
|
|
|
public bool MoveNext()
|
|
{
|
|
_index = _filterMask.NextSetBit(_index + 1);
|
|
if (_index < 0 || _index >= _world.EntityManager.EntityCount)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
Current = new QueryItem<<#= generics #>>(_entities[_index], <#= constructorParams #>);
|
|
return true;
|
|
}
|
|
}
|
|
<# for (int i = 1; i <= ExtensionAmount; i++) {
|
|
var compGenerics = AppendGenerics(i, "TComponent");
|
|
var compRestrictions = AppendGenericRestrictions(i, "TComponent", "unmanaged, IComponentData");
|
|
#>
|
|
|
|
public readonly QueryEnumerable<<#= generics #>> WithAll<<#= compGenerics #>>()
|
|
<#= compRestrictions #>
|
|
{
|
|
<# for (int j = 0; j < i; j++) {#>
|
|
_filters._all.Add(TypeHandle.Get<TComponent<#= j #>>());
|
|
<# } #>
|
|
return this;
|
|
}
|
|
|
|
public readonly QueryEnumerable<<#= generics #>> WithAny<<#= compGenerics #>>()
|
|
<#= compRestrictions #>
|
|
{
|
|
<# for (int j = 0; j < i; j++) {#>
|
|
_filters._any.Add(TypeHandle.Get<TComponent<#= j #>>());
|
|
<# } #>
|
|
return this;
|
|
}
|
|
|
|
public readonly QueryEnumerable<<#= generics #>> WithAbsent<<#= compGenerics #>>()
|
|
<#= compRestrictions #>
|
|
{
|
|
<# for (int j = 0; j < i; j++) {#>
|
|
_filters._absent.Add(TypeHandle.Get<TComponent<#= j #>>());
|
|
<# } #>
|
|
return this;
|
|
}
|
|
|
|
public readonly QueryEnumerable<<#= generics #>> WithDisabled<<#= compGenerics #>>()
|
|
<#= compRestrictions #>
|
|
{
|
|
<# for (int j = 0; j < i; j++) {#>
|
|
_filters._disabled.Add(TypeHandle.Get<TComponent<#= j #>>());
|
|
<# } #>
|
|
return this;
|
|
}
|
|
<# } #>
|
|
}
|
|
|
|
<# } #> |