namespace ExampleWorld; using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using ExampleWorld.wit.imports.lyra.api; [StructLayout(LayoutKind.Sequential)] struct Vec3(float x, float y, float z) { /// /// Unique TypeId of Vec3 that the host can use. This corresponds to the type id of vec3 on the host. /// public const ulong TypeId = 4124409524; /// /// 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 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 size = new IEcs.WasmTypeId((Vec3.TypeId, 0)); var info = new IEcs.ComponentInfo("Vec3", (ulong) Marshal.SizeOf(), (ulong) AlignmentOf(), size); var pos = new Vec3(7.0f, 30.0f, 18.0f); var infos = new List { info }; IEcs.Entity entity = gameWorld.Spawn(GetBytes(pos), infos); Console.WriteLine("C#: Spawned {0}", entity.id.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(); } }