update world constructor

This commit is contained in:
Mikhail 2024-03-07 03:17:51 +08:00
parent e0a3d54979
commit 04691e1716
4 changed files with 33 additions and 25 deletions

View File

@ -305,7 +305,6 @@ namespace DCFApixels.DragonECS
return obj is IEcsTypeMetaProvider intr ? intr.MetaSource : obj; return obj is IEcsTypeMetaProvider intr ? intr.MetaSource : obj;
} }
#endregion #endregion
} }
public interface ITypeMeta public interface ITypeMeta

View File

@ -33,7 +33,7 @@ namespace DCFApixels.DragonECS
{ {
if (string.IsNullOrEmpty(name)) if (string.IsNullOrEmpty(name))
{ {
Name = string.Empty; Name = string.Empty;
return; return;
} }
name = name.Replace('\\', '/'); name = name.Replace('\\', '/');

View File

@ -8,25 +8,6 @@ namespace DCFApixels.DragonECS
{ {
public partial class EcsWorld : IEntityStorage public partial class EcsWorld : IEntityStorage
{ {
[StructLayout(LayoutKind.Explicit, Pack = 4, Size = 4 * 3)]
private struct EntitySlot
{
public static readonly EntitySlot Empty = new EntitySlot(SLEEPING_GEN_FLAG, 0, false);
[FieldOffset(0)]
public short gen;
[FieldOffset(2)]
public short componentsCount;
[FieldOffset(4)]
public bool isUsed;
//[FieldOffset(5)]
//public bool isLocked;
public EntitySlot(short gen, short componentsCount, bool isUsed)
{
this.gen = gen;
this.componentsCount = componentsCount;
this.isUsed = isUsed;
}
}
public readonly short id; public readonly short id;
private IEcsWorldConfig _config; private IEcsWorldConfig _config;
@ -120,9 +101,14 @@ namespace DCFApixels.DragonECS
{ {
config = EcsWorldConfig.Empty; config = EcsWorldConfig.Empty;
} }
bool nullWorld = this is NullWorld;
if(nullWorld == false && worldID == NULL_WORLD_ID)
{
EcsDebug.PrintWarning($"The world identifier cannot be {NULL_WORLD_ID}");
}
_config = config; _config = config;
if (worldID < 0) if (worldID < 0 || (worldID == NULL_WORLD_ID && nullWorld == false))
{ {
worldID = (short)_worldIdDispenser.UseFree(); worldID = (short)_worldIdDispenser.UseFree();
} }
@ -686,6 +672,28 @@ namespace DCFApixels.DragonECS
return count; return count;
} }
#endregion #endregion
#region EntitySlot
[StructLayout(LayoutKind.Explicit, Pack = 4, Size = 4 * 3)]
private struct EntitySlot
{
public static readonly EntitySlot Empty = new EntitySlot(SLEEPING_GEN_FLAG, 0, false);
[FieldOffset(0)]
public short gen;
[FieldOffset(2)]
public short componentsCount;
[FieldOffset(4)]
public bool isUsed;
//[FieldOffset(5)]
//public bool isLocked;
public EntitySlot(short gen, short componentsCount, bool isUsed)
{
this.gen = gen;
this.componentsCount = componentsCount;
this.isUsed = isUsed;
}
}
#endregion
} }
#region Callbacks Interface #region Callbacks Interface

View File

@ -16,6 +16,8 @@ namespace DCFApixels.DragonECS
} }
public partial class EcsWorld public partial class EcsWorld
{ {
private const short NULL_WORLD_ID = 0;
private const short GEN_MASK = 0x7fff; private const short GEN_MASK = 0x7fff;
private const short SLEEPING_GEN_FLAG = short.MinValue; private const short SLEEPING_GEN_FLAG = short.MinValue;
private const int DEL_ENT_BUFFER_SIZE_OFFSET = 5; private const int DEL_ENT_BUFFER_SIZE_OFFSET = 5;
@ -29,7 +31,7 @@ namespace DCFApixels.DragonECS
static EcsWorld() static EcsWorld()
{ {
_worlds[0] = new NullWorld(); _worlds[NULL_WORLD_ID] = new NullWorld();
} }
private static void ReleaseData(int worldID) private static void ReleaseData(int worldID)
{ {
@ -78,8 +80,7 @@ namespace DCFApixels.DragonECS
public static ref T GetForWorldUnchecked(int worldID) public static ref T GetForWorldUnchecked(int worldID)
{ {
#if (DEBUG && !DISABLE_DEBUG) #if (DEBUG && !DISABLE_DEBUG)
if (_mapping[worldID] <= 0) if (_mapping[worldID] <= 0) { Throw.UndefinedException(); }
throw new Exception();
#endif #endif
return ref _items[_mapping[worldID]]; return ref _items[_mapping[worldID]];
} }