117 lines
No EOL
2.4 KiB
Beef
117 lines
No EOL
2.4 KiB
Beef
namespace Theater_ECS;
|
|
|
|
using System;
|
|
using System.Reflection;
|
|
using System.Collections;
|
|
|
|
[AttributeUsage(.Method)]
|
|
struct SystemMethodAttribute : Attribute, IOnTypeInit
|
|
{
|
|
private StringView _Name;
|
|
private Span<Type> _Types;
|
|
|
|
public this(StringView name, params Span<Type> types)
|
|
{
|
|
_Name = name;
|
|
_Types = types;
|
|
}
|
|
|
|
[Comptime]
|
|
public void OnTypeInit(Type type, Self* prev)
|
|
{
|
|
//InitializeFunction
|
|
Compiler.EmitTypeBody(type, scope $"""
|
|
public override bool IntializeSystem(ECS ecs)
|
|
\{
|
|
{InitializeSystemTypes( .. scope .())}
|
|
return true;
|
|
\}
|
|
|
|
""");
|
|
|
|
|
|
Compiler.EmitTypeBody(type, scope $"""
|
|
[System.DisableChecks]
|
|
public override void RunSystem(ECS ecs)
|
|
\{
|
|
Lock(ecs);
|
|
|
|
Component lowest = System.int_cosize.MaxValue;
|
|
System.int_cosize lowestAmount = System.int_cosize.MaxValue;
|
|
for(var c in _ComponentMap)
|
|
\{
|
|
if(ecs.[System.Friend]_ComponentsPacked[c.value].Count < lowestAmount)
|
|
\{
|
|
lowest = c.value;
|
|
lowestAmount = ecs.[System.Friend]_ComponentsPacked[c.value].Count;
|
|
\}
|
|
\}
|
|
|
|
|
|
ecs.GetEntityFromComponent(lowest, _Target);
|
|
|
|
{CacheComponentData(.. scope .())}
|
|
|
|
|
|
for(var e in _Target)
|
|
\{
|
|
|
|
{_Name}(
|
|
{GetComponentData(.. scope .())}
|
|
);
|
|
\}
|
|
|
|
_Target.Clear();
|
|
|
|
Unlock(ecs);
|
|
|
|
\}
|
|
|
|
private void Lock(ECS ecs)
|
|
\{
|
|
for(var i in _ComponentMap)
|
|
ecs.[System.Friend]_ComponentsPacked[i.value].Use();
|
|
\}
|
|
|
|
private void Unlock(ECS ecs)
|
|
\{
|
|
for(var i in _ComponentMap)
|
|
ecs.[System.Friend]_ComponentsPacked[i.value].StopUsing();
|
|
\}
|
|
""");
|
|
}
|
|
|
|
private void InitializeSystemTypes(String buffer)
|
|
{
|
|
for(var i in _Types)
|
|
{
|
|
buffer.Append(scope $"""
|
|
if(ecs.GetComponent<{i.GetName( .. scope .())}>() == -1)
|
|
return false;
|
|
_ComponentMap.Add(typeof({i.GetName(.. scope .())}), ecs.GetComponent<{i.GetName( .. scope .())}>());
|
|
|
|
|
|
""");
|
|
}
|
|
}
|
|
|
|
private void GetComponentData(String buffer)
|
|
{
|
|
for(var i in _Types)
|
|
{
|
|
buffer.Append(scope $"""
|
|
ref *ecs.[System.Friend]_ComponentsPacked[_{i.GetName(.. scope .())}].Get<{i.GetName(.. scope .())}>(ecs.[System.Friend]_EntityList[_{i.GetName(.. scope .())}][e])
|
|
""");
|
|
if(@i.Index+1 < _Types.Length)
|
|
buffer.Append(",\n");
|
|
}
|
|
}
|
|
|
|
private void CacheComponentData(String buffer)
|
|
{
|
|
for(var i in _Types)
|
|
{
|
|
buffer.Append(scope $"Component _{i.GetName(.. scope .())} = _ComponentMap[typeof({i.GetName(.. scope .())})];\n");
|
|
}
|
|
}
|
|
} |