namespace ExampleWorld;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices;
//using ExampleWorld.wit.imports.lyra.api;
using LyraApi;
using LyraApi.Ecs;
using ImportsWorld.wit.imports.lyra.api;
[StructLayout(LayoutKind.Sequential)]
struct Vec3(float x, float y, float z) : IComponent
{
///
/// The X component.
///
public float X { get; set; } = x;
///
/// The Y component
///
public float Y { get; set; } = y;
///
/// The Z component
///
public float Z { get; set; } = z;
public static string HostName { get => "Vec3"; }
public static ulong HostSize { get => (ulong)Marshal.SizeOf(); }
public static ulong HostAlignment { get => (ulong)Marshalling.AlignmentOf(); }
public static ulong TypeId { get => 4124409524; }
}
public class ExampleWorldImpl : IExampleWorld
{
internal struct AlignmentHelper where T : unmanaged
{
public byte Padding;
public T Target;
}
private static int AlignmentOf() where T : unmanaged
{
return (int)Marshal.OffsetOf>(nameof(AlignmentHelper.Target));
}
private static byte[] GetBytes([DisallowNull] T data) {
int size = Marshal.SizeOf(data);
byte[] arr = new byte[size];
IntPtr ptr = IntPtr.Zero;
try
{
ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(data, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
}
finally
{
Marshal.FreeHGlobal(ptr);
}
return arr;
}
private static T? FromBytes(byte[] data) where T : struct
{
var ptr = GCHandle.Alloc(data, GCHandleType.Pinned);
try {
var res = (T?) Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(T));
return res;
} finally {
ptr.Free();
}
}
public static void OnInit(IEcs.EcsWorld gameWorld, IEcs.Entity owningEntity)
{
var pos = new Vec3(7.0f, 30.0f, 18.0f);
var size = new IEcs.WasmTypeId((Vec3.TypeId, 0));
var info = new IEcs.ComponentInfo("Vec3", (ulong) Marshal.SizeOf(), (ulong) AlignmentOf(), size);
var infos = new List
{
info
};
var world = new World(gameWorld);
Entity entity = world.Spawn(pos);
Console.WriteLine("C#: Spawned {0}", entity.Id);
IEcs.EcsDynamicView res = gameWorld.View(infos);
(IEcs.Entity, byte[])? row = res.Next();
if (row.HasValue) {
Console.WriteLine("C#: Found position!!!");
var en = row.Value.Item1;
var comp = FromBytes(row.Value.Item2);
Console.WriteLine("C#: Found component at ({0}, {1}, {2})", comp?.X, comp?.Y, comp?.Z);
} else {
Console.WriteLine("C#: Could not find position");
}
}
public static void OnUpdate(IEcs.EcsWorld gameWorld, IEcs.Entity owningEntity)
{
throw new NotImplementedException();
}
}