Theater-ECS/src/SystemMethodAttribute.bf
Booklordofthedings 171b36d571 Initial Commit (#2)
Move to this branch for ecs changes

Reviewed-on: #2
2024-11-11 19:47:09 +01:00

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");
}
}
}