Skip to content

Commit e643242

Browse files
authored
Merge pull request #149 from r04423/fix/changed-mask
fix: update setChanged logic to correctly populate changedMask
2 parents c69b57a + 17b6a5f commit e643242

File tree

3 files changed

+41
-3
lines changed

3 files changed

+41
-3
lines changed

packages/core/src/query/modifiers/changed.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,21 @@ export function setChanged(world: World, entity: Entity, trait: Trait) {
3535
// This is used for filling initial values for Changed modifiers.
3636
for (const changedMask of ctx.changedMasks.values()) {
3737
const eid = getEntityId(entity);
38-
if (!changedMask[eid]) changedMask[eid] = [];
39-
const traitId = trait[$internal].id;
40-
changedMask[eid][traitId] = 1;
38+
const data = ctx.traitData.get(trait)!;
39+
const { generationId, bitflag } = data;
40+
41+
// Ensure the generation array exists
42+
if (!changedMask[generationId]) {
43+
changedMask[generationId] = [];
44+
}
45+
46+
// Ensure the entity mask exists
47+
if (!changedMask[generationId][eid]) {
48+
changedMask[generationId][eid] = 0;
49+
}
50+
51+
// Set the bit for this trait
52+
changedMask[generationId][eid] |= bitflag;
4153
}
4254

4355
// Update queries.

packages/core/tests/query-modifiers.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,4 +498,17 @@ describe('Query modifiers', () => {
498498
entity.remove(Foo);
499499
expect(world.queryFirst(Changed(Position), Not(Foo))).toBeUndefined();
500500
});
501+
502+
it('should correctly populate Changed query when trait changes happen before query initialization', () => {
503+
// Create change modifier and spawn an entity
504+
const Changed = createChanged();
505+
const entity = world.spawn(Foo, Bar);
506+
507+
// Mark Bar as changed
508+
entity.changed(Bar);
509+
510+
// Even if the query wasn't executed before,
511+
// it should pick up the trait change
512+
expect(world.queryFirst(Changed(Bar))).toBe(entity);
513+
});
501514
});

packages/publish/tests/core/query-modifiers.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,4 +498,17 @@ describe('Query modifiers', () => {
498498
entity.remove(Foo);
499499
expect(world.queryFirst(Changed(Position), Not(Foo))).toBeUndefined();
500500
});
501+
502+
it('should correctly populate Changed query when trait changes happen before query initialization', () => {
503+
// Create change modifier and spawn an entity
504+
const Changed = createChanged();
505+
const entity = world.spawn(Foo, Bar);
506+
507+
// Mark Bar as changed
508+
entity.changed(Bar);
509+
510+
// Even if the query wasn't executed before,
511+
// it should pick up the trait change
512+
expect(world.queryFirst(Changed(Bar))).toBe(entity);
513+
});
501514
});

0 commit comments

Comments
 (0)