NateTheGreatt/bitECS

Query operators

thomasgauthier opened this issue · 2 comments

Is it possible to use operators like NOT, ANY, ALL in queries?

For example, in Unity one can do

var query = new EntityQueryDesc
{
   None = new ComponentType[]{ typeof(Frozen) },
   All = new ComponentType[]{ typeof(RotationQuaternion) }
}
EntityQuery m_Group = GetEntityQuery(query);

An example where I need to get tilemap tile. It has a sprite, integer position but not float position.

const query = defineQuery(
  [
    TilePositionComponent, // Vector2I
    SpriteComponent, // Sprite
    Not(PositionComponent), // Vector2
  ],
);
const entities = query(world);

Can be found in Query section of "Getting Started"
So you have the Not option, but not All and Any because that is frankly the default behavior(?).

Thank you. I had missed the Not in the docs. All is indeed the default behavior.

Any does not seem to be implemented, but using TC39 Set Methods it can be done easily.


The following fictious code

defineQuery(
  [
    TilePositionComponent
    Any(SpriteComponent, Color)
  ],
);

can be implemented as

//set methods polyfill
import "core-js/features/set"

const tileQuery = defineQuery(
  [
    TilePositionComponent
  ],
);

const spriteQuery = defineQuery(
  [
    SpriteComponent,
  ],
);

const colorQuery = defineQuery(
  [
    Color
  ],
);

const entities = new Set(tileQuery(world))
  .intersects(
    new Set(spriteQuery(world))
    .union(new Set(colorQuery(world))
  );