encompass-cs/encompass-cs/UberEngine.cs

98 lines
3.6 KiB
C#
Raw Normal View History

2019-12-17 03:55:27 +00:00
using System;
2019-12-17 02:51:45 +00:00
using System.Collections.Generic;
using System.Reflection;
namespace Encompass
{
internal class UberEngine : Engine
{
2020-03-20 07:09:57 +00:00
private readonly IEnumerable<Type> _componentTypes;
private readonly IEnumerable<Type> _messageTypes;
public Entity Entity { get; private set; }
2019-12-17 02:51:45 +00:00
public UberEngine(IEnumerable<Type> componentTypes, IEnumerable<Type> messageTypes)
2019-12-17 02:51:45 +00:00
{
_componentTypes = componentTypes;
2019-12-17 03:55:27 +00:00
_messageTypes = messageTypes;
AddTypes.UnionWith(componentTypes);
2020-03-20 07:09:57 +00:00
ReadTypes.UnionWith(componentTypes);
WriteTypes.UnionWith(componentTypes);
SendTypes.UnionWith(messageTypes);
ReceiveTypes.UnionWith(messageTypes);
2019-12-17 02:51:45 +00:00
}
public void Write()
{
Entity = CreateEntity();
2019-12-17 02:51:45 +00:00
foreach (var type in _componentTypes)
{
var instance = Activator.CreateInstance(type);
var instanceParam = new object[] { Entity, instance };
2019-12-17 02:51:45 +00:00
var setComponentMethod = typeof(Engine).GetMethod("SetComponent", BindingFlags.NonPublic | BindingFlags.Instance);
var genericSetComponentMethod = setComponentMethod.MakeGenericMethod(type);
genericSetComponentMethod.Invoke(this, instanceParam);
}
}
2019-12-17 02:51:45 +00:00
public override void Update(double dt)
{
foreach (var type in _componentTypes)
{
CallGenericWrappedMethod(type, "CallAllComponentMethods", null);
}
2019-12-17 03:55:27 +00:00
foreach (var type in _messageTypes)
{
CallGenericWrappedMethod(type, "CallAllMessageMethods", null);
2020-03-22 20:41:55 +00:00
2019-12-30 07:55:48 +00:00
if (typeof(IHasEntity).IsAssignableFrom(type))
{
CallGenericWrappedMethod(type, "CallAllEntityMessageMethods", null);
2019-12-30 07:55:48 +00:00
}
2019-12-17 03:55:27 +00:00
}
}
// we can't reflect invoke on byref returns or Span returns right now... so we have non-return wrapper methods
2020-03-25 04:28:56 +00:00
protected void CallAllComponentMethods<TComponent>() where TComponent : struct
2020-03-25 04:28:56 +00:00
{
ReadComponent<TComponent>();
2020-03-25 04:28:56 +00:00
ReadComponents<TComponent>();
ReadEntity<TComponent>();
ReadEntities<TComponent>();
GetComponent<TComponent>(Entity);
HasComponent<TComponent>(Entity);
SomeComponent<TComponent>();
DestroyWith<TComponent>();
DestroyAllWith<TComponent>();
RemoveComponent<TComponent>(Entity);
AddComponent<TComponent>(Entity, default);
2020-03-25 04:28:56 +00:00
}
protected void CallAllMessageMethods<TMessage>() where TMessage : struct
2020-03-25 04:28:56 +00:00
{
SendMessageIgnoringTimeDilation<TMessage>(default, 0.1);
SendMessage<TMessage>(default);
SendMessage<TMessage>(default, 0.1);
ReadMessage<TMessage>();
2020-03-25 04:28:56 +00:00
ReadMessages<TMessage>();
SomeMessage<TMessage>();
2020-03-25 04:28:56 +00:00
}
protected void CallAllEntityMessageMethods<TMessage>() where TMessage : struct, IHasEntity
2019-12-17 02:51:45 +00:00
{
ReadMessagesWithEntity<TMessage>(Entity);
ReadMessageWithEntity<TMessage>(Entity);
SomeMessageWithEntity<TMessage>(Entity);
2019-12-17 02:51:45 +00:00
}
2020-03-25 04:28:56 +00:00
private void CallGenericWrappedMethod(Type type, string methodName, object[] parameters)
{
var readComponentMethod = typeof(UberEngine).GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
var genericReadComponentMethod = readComponentMethod.MakeGenericMethod(type);
genericReadComponentMethod.Invoke(this, parameters);
}
}
}