@@ -4,7 +4,7 @@ import { getEntityId } from '../../entity/utils/pack-entity';
44import { isRelation } from '../../relation/utils/is-relation' ;
55import { hasTrait , registerTrait } from '../../trait/trait' ;
66import { getTraitInstance , hasTraitInstance } from '../../trait/trait-instance' ;
7- import type { Trait , TraitOrRelation } from '../../trait/types' ;
7+ import type { ExtractTraits , Trait , TraitOrRelation } from '../../trait/types' ;
88import { universe } from '../../universe/universe' ;
99import type { World } from '../../world' ;
1010import { createModifier } from '../modifier' ;
@@ -13,73 +13,75 @@ import { checkQueryTrackingWithRelations } from '../utils/check-query-tracking-w
1313import { createTrackingId , setTrackingMasks } from '../utils/tracking-cursor' ;
1414
1515export function createChanged ( ) {
16- const id = createTrackingId ( ) ;
16+ const id = createTrackingId ( ) ;
1717
18- for ( const world of universe . worlds ) {
19- if ( ! world ) continue ;
20- setTrackingMasks ( world , id ) ;
21- }
18+ for ( const world of universe . worlds ) {
19+ if ( ! world ) continue ;
20+ setTrackingMasks ( world , id ) ;
21+ }
2222
23- return < T extends TraitOrRelation [ ] = TraitOrRelation [ ] > (
24- ...inputs : T
25- ) : Modifier < Trait [ ] , `changed-${number } `> => {
26- const traits = inputs . map ( ( input ) => ( isRelation ( input ) ? input [ $internal ] . trait : input ) ) ;
27- return createModifier ( `changed-${ id } ` , id , traits ) ;
28- } ;
23+ return < T extends TraitOrRelation [ ] > (
24+ ...inputs : T
25+ ) : Modifier < ExtractTraits < T > , `changed-${number } `> => {
26+ const traits = inputs . map ( ( input ) =>
27+ isRelation ( input ) ? input [ $internal ] . trait : input
28+ ) as ExtractTraits < T > ;
29+ return createModifier ( `changed-${ id } ` , id , traits ) ;
30+ } ;
2931}
3032
3133/** @inline */
3234function markChanged ( world : World , entity : Entity , trait : Trait ) {
33- const ctx = world [ $internal ] ;
35+ const ctx = world [ $internal ] ;
3436
35- // Early exit if the trait is not on the entity.
36- if ( ! hasTrait ( world , entity , trait ) ) return ;
37+ // Early exit if the trait is not on the entity.
38+ if ( ! hasTrait ( world , entity , trait ) ) return ;
3739
38- // Register the trait if it's not already registered.
39- if ( ! hasTraitInstance ( ctx . traitInstances , trait ) ) registerTrait ( world , trait ) ;
40- const data = getTraitInstance ( ctx . traitInstances , trait ) ! ;
40+ // Register the trait if it's not already registered.
41+ if ( ! hasTraitInstance ( ctx . traitInstances , trait ) ) registerTrait ( world , trait ) ;
42+ const data = getTraitInstance ( ctx . traitInstances , trait ) ! ;
4143
42- // Mark the trait as changed in bitmasks for Changed modifiers.
43- const eid = getEntityId ( entity ) ;
44- const { generationId, bitflag } = data ;
44+ // Mark the trait as changed in bitmasks for Changed modifiers.
45+ const eid = getEntityId ( entity ) ;
46+ const { generationId, bitflag } = data ;
4547
46- for ( const changedMask of ctx . changedMasks . values ( ) ) {
47- if ( ! changedMask [ generationId ] ) changedMask [ generationId ] = [ ] ;
48- if ( ! changedMask [ generationId ] [ eid ] ) changedMask [ generationId ] [ eid ] = 0 ;
49- changedMask [ generationId ] [ eid ] |= bitflag ;
50- }
48+ for ( const changedMask of ctx . changedMasks . values ( ) ) {
49+ if ( ! changedMask [ generationId ] ) changedMask [ generationId ] = [ ] ;
50+ if ( ! changedMask [ generationId ] [ eid ] ) changedMask [ generationId ] [ eid ] = 0 ;
51+ changedMask [ generationId ] [ eid ] |= bitflag ;
52+ }
5153
52- // Update tracking queries with change event
53- for ( const query of data . trackingQueries ) {
54- if ( ! query . hasChangedModifiers ) continue ;
55- if ( ! query . changedTraits . has ( trait ) ) continue ;
54+ // Update tracking queries with change event
55+ for ( const query of data . trackingQueries ) {
56+ if ( ! query . hasChangedModifiers ) continue ;
57+ if ( ! query . changedTraits . has ( trait ) ) continue ;
5658
57- const match =
58- query . relationFilters && query . relationFilters . length > 0
59- ? checkQueryTrackingWithRelations (
60- world ,
61- query ,
62- entity ,
63- 'change' ,
64- generationId ,
65- bitflag
66- )
67- : query . checkTracking ( world , entity , 'change' , generationId , bitflag ) ;
68- if ( match ) query . add ( entity ) ;
69- else query . remove ( world , entity ) ;
70- }
59+ const match =
60+ query . relationFilters && query . relationFilters . length > 0
61+ ? checkQueryTrackingWithRelations (
62+ world ,
63+ query ,
64+ entity ,
65+ 'change' ,
66+ generationId ,
67+ bitflag
68+ )
69+ : query . checkTracking ( world , entity , 'change' , generationId , bitflag ) ;
70+ if ( match ) query . add ( entity ) ;
71+ else query . remove ( world , entity ) ;
72+ }
7173
72- return data ;
74+ return data ;
7375}
7476
7577export function setChanged ( world : World , entity : Entity , trait : Trait ) {
76- const data = markChanged ( world , entity , trait ) ;
77- if ( ! data ) return ;
78- for ( const sub of data . changeSubscriptions ) sub ( entity ) ;
78+ const data = markChanged ( world , entity , trait ) ;
79+ if ( ! data ) return ;
80+ for ( const sub of data . changeSubscriptions ) sub ( entity ) ;
7981}
8082
8183export function setPairChanged ( world : World , entity : Entity , trait : Trait , target : Entity ) {
82- const data = markChanged ( world , entity , trait ) ;
83- if ( ! data ) return ;
84- for ( const sub of data . changeSubscriptions ) sub ( entity , target ) ;
84+ const data = markChanged ( world , entity , trait ) ;
85+ if ( ! data ) return ;
86+ for ( const sub of data . changeSubscriptions ) sub ( entity , target ) ;
8587}
0 commit comments