You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.5 KiB
70 lines
2.5 KiB
using System.Runtime.InteropServices; |
|
using gaemstone.ECS; |
|
using gaemstone.ECS.Utility; |
|
using static flecs_hub.flecs; |
|
|
|
namespace gaemstone.Flecs; |
|
|
|
[BuiltIn, Module, Path("/flecs/doc")] |
|
public partial class Doc |
|
{ |
|
[Tag] public struct Brief { } |
|
[Tag] public struct Detail { } |
|
[Tag] public struct Link { } |
|
[Tag] public struct Color { } |
|
|
|
[Relation, Component] |
|
public struct Description |
|
{ |
|
internal unsafe void* Value; |
|
|
|
public override string? ToString() |
|
{ unsafe { return Marshal.PtrToStringUTF8((nint)Value); } } |
|
public static implicit operator string?(Description desc) |
|
=> desc.ToString(); |
|
} |
|
} |
|
|
|
public static unsafe class DocExtensions |
|
{ |
|
private static Entity<TContext> Set<TContext, T>(Entity<TContext> entity, string? value) |
|
{ |
|
var id = entity.World.Pair<Doc.Description, T>(); |
|
|
|
if (value != null) { |
|
var str = GlobalHeapAllocator.Instance.AllocateCString(value); |
|
var desc = new Doc.Description { Value = (void*)(nint)str }; |
|
entity.Set(id, desc); |
|
} else { |
|
entity.Remove(id); |
|
} |
|
|
|
return entity; |
|
} |
|
|
|
public static string? GetDocName<TContext>(this Entity<TContext> entity, bool fallbackToEntityName = true) |
|
=> fallbackToEntityName || entity.Has<Doc.Description, Core.Name>() |
|
? ecs_doc_get_name(entity.World, entity).FlecsToString() : null; |
|
public static Entity<TContext> SetDocName<TContext>(this Entity<TContext> entity, string? value) |
|
=> Set<TContext, Core.Name>(entity, value); |
|
|
|
public static string? GetDocBrief<TContext>(this Entity<TContext> entity) |
|
=> ecs_doc_get_brief(entity.World, entity).FlecsToString()!; |
|
public static Entity<TContext> SetDocBrief<TContext>(this Entity<TContext> entity, string? value) |
|
=> Set<TContext, Doc.Brief>(entity, value); |
|
|
|
public static string? GetDocDetail<TContext>(this Entity<TContext> entity) |
|
=> ecs_doc_get_detail(entity.World, entity).FlecsToString()!; |
|
public static Entity<TContext> SetDocDetail<TContext>(this Entity<TContext> entity, string? value) |
|
=> Set<TContext, Doc.Detail>(entity, value); |
|
|
|
public static string? GetDocLink<TContext>(this Entity<TContext> entity) |
|
=> ecs_doc_get_link(entity.World, entity).FlecsToString()!; |
|
public static Entity<TContext> SetDocLink<TContext>(this Entity<TContext> entity, string? value) |
|
=> Set<TContext, Doc.Link>(entity, value); |
|
|
|
public static string? GetDocColor<TContext>(this Entity<TContext> entity) |
|
=> ecs_doc_get_color(entity.World, entity).FlecsToString()!; |
|
public static Entity<TContext> SetDocColor<TContext>(this Entity<TContext> entity, string? value) |
|
=> Set<TContext, Doc.Color>(entity, value); |
|
}
|
|
|