NateTheGreatt / bitECS

Functional, minimal, data-oriented, ultra-high performance ECS library written in JavaScript
Mozilla Public License 2.0
902 stars 83 forks source link

`registerComponent` in wrong order, breaks queries/queues in alpha3 #161

Open geirmarius opened 1 month ago

geirmarius commented 1 month ago

Version: v0.0.1-alpha.3

Example code:

import {
    createWorld,
    query,
    defineEnterQueue,
    enterQuery,
    addEntity,
    addComponent,
    defineComponent,
    defineQuery,
    registerComponents
} from 'bitecs';

const world = createWorld()
const Component = defineComponent()

// (ref1) Works if registered here
// registerComponents(world, [Component])

const enterQueue = defineEnterQueue([Component])
const globalQuery = defineQuery([Component])
const globalEnterQuery = enterQuery(globalQuery);

// (ref2) Breaks queries and queues if registered here
registerComponents(world, [Component])

const eid = addEntity(world)

function system(world) {
    const oldAll = globalQuery(world)
    const oldEnter = globalEnterQuery(world)

    const newAll = query(world, [Component])
    const newEnter = enterQueue(world)

    console.log({
        oldAll,
        oldEnter,
        newAll,
        newEnter,
    })
}

system(world)
addComponent(world, Component, eid)
system(world)
system(world)

Console output ref1:

{ oldAll: [], oldEnter: [], newAll: [], newEnter: [] }
{ oldAll: [ 0 ], oldEnter: [ 0 ], newAll: [ 0 ], newEnter: [ 0 ] }
{ oldAll: [ 0 ], oldEnter: [], newAll: [ 0 ], newEnter: [] }

Console output ref2:

{ oldAll: [], oldEnter: [], newAll: [], newEnter: [] }
{ oldAll: [], oldEnter: [], newAll: [ 0 ], newEnter: [] }
{ oldAll: [], oldEnter: [], newAll: [ 0 ], newEnter: [] }