public bool HasTags(EntityID entity, TagMask mask) { bool has; entitiesLock.Enter(READ_LOCK_MODE); { has = entities[entity].Has(mask); } entitiesLock.Exit(); return(has); }
public void RemoveTags(EntityID entity, TagMask mask) { entitiesLock.Enter(WRITE_LOCK_MODE); { //Locks this particular entity for modification. lock (entityWriteLocks[entity]) { entities[entity].Remove(mask); } } entitiesLock.Exit(); }
public EntityTagContainer() { entities = new TagMask[EntityID.MaxValue]; entityWriteLocks = new object[EntityID.MaxValue]; entitiesLock = new ModeLock(); //Create a tag-mask and a lock object for each entity for (EntityID entity = 0; entity < EntityID.MaxValue; entity++) { entities[entity] = new TagMask(); entityWriteLocks[entity] = new object(); } }
public void Query(TagMask requiredTags, TagMask illegalTags, EntitySet outputSet) { outputSet.Clear(); bool noIllegalComps = illegalTags.IsEmpty; entitiesLock.Enter(READ_LOCK_MODE); { for (EntityID entity = 0; entity < EntityID.MaxValue; entity++) { if (entities[entity].Has(requiredTags) && (noIllegalComps || entities[entity].NotHas(illegalTags))) { outputSet.Add(entity); } } } entitiesLock.Exit(); }
public int Query(TagMask requiredTags, TagMask illegalTags) { int count = 0; bool noIllegalComps = illegalTags.IsEmpty; entitiesLock.Enter(READ_LOCK_MODE); { for (EntityID entity = 0; entity < EntityID.MaxValue; entity++) { if (entities[entity].Has(requiredTags) && (noIllegalComps || entities[entity].NotHas(illegalTags))) { count++; } } } entitiesLock.Exit(); return(count); }
public TagMask Remove(TagMask other) { val &= ~other.val; return(this); }
public TagMask Add(TagMask other) { val |= other.val; return(this); }
public bool NotHas(TagMask other) => (other.val & val) == 0;
public bool Has(TagMask other) => (other.val & val) == other.val;
public bool HasTags(EntityID entity, TagMask mask) => tagContainer.HasTags(entity, mask);
public int GetEntityCount(TagMask requiredTags, TagMask illegalTags) => tagContainer.Query(requiredTags, illegalTags);
public void GetEntities(TagMask requiredTags, TagMask illegalTags, EntitySet outputSet) => tagContainer.Query(requiredTags, illegalTags, outputSet);