@@ -24,7 +24,7 @@ type Archetype = {
24
24
type : string | number ,
25
25
entities : { number },
26
26
columns : { Column },
27
- records : { [ number ]: number },
27
+ records : { ArchetypeRecord },
28
28
}
29
29
type Record = {
30
30
archetype : Archetype ,
@@ -35,17 +35,12 @@ type Record = {
35
35
36
36
type EntityIndex = { dense : { [i24 ]: i53 }, sparse : { [i53 ]: Record } }
37
37
38
- type ArchetypeRecord = number
39
- --[[
40
- TODO:
41
- {
38
+ type ArchetypeRecord = {
42
39
index : number ,
43
40
count : number ,
44
41
column : number
45
42
}
46
43
47
- ]]
48
-
49
44
type ArchetypeMap = {
50
45
cache : { ArchetypeRecord },
51
46
first : ArchetypeMap ,
@@ -191,17 +186,17 @@ local function archetype_move(entityIndex: EntityIndex, to: Archetype,
191
186
local sourceEntities = from .entities
192
187
local destinationEntities = to .entities
193
188
local destinationColumns = to .columns
194
- local tr = to .records
189
+ local records = to .records
195
190
local types = from .types
196
191
197
192
for i , column in columns do
198
193
-- Retrieves the new column index from the source archetype's record from each component
199
194
-- We have to do this because the columns are tightly packed and indexes may not correspond to each other.
200
- local targetColumn = destinationColumns [ tr [ types [i ] ]]
195
+ local tr = records [ types [i ]]
201
196
202
197
-- Sometimes target column may not exist, e.g. when you remove a component.
203
- if targetColumn then
204
- targetColumn [destinationRow ] = column [sourceRow ]
198
+ if tr then
199
+ destinationColumns [ tr . column ] [destinationRow ] = column [sourceRow ]
205
200
end
206
201
-- If the entity is the last row in the archetype then swapping it would be meaningless.
207
202
local last = # column
@@ -293,12 +288,13 @@ local function archetype_create(world: any, types: { i24 }, prev: Archetype?): A
293
288
local columns = (table.create (length ) :: any ) :: { Column }
294
289
local componentIndex = world .componentIndex
295
290
296
- local records = {}
291
+ local records : { ArchetypeRecord } = {}
297
292
for i , componentId in types do
293
+ local tr = { column = i , count = 1 , index = 1 }
298
294
local idr = id_record_ensure (componentIndex , componentId )
299
- idr .cache [id ] = i
295
+ idr .cache [id ] = tr
300
296
idr .size += 1
301
- records [componentId ] = i
297
+ records [componentId ] = tr
302
298
if ECS_IS_PAIR (componentId ) then
303
299
local relation = ecs_pair_relation (world .entityIndex , componentId )
304
300
local object = ecs_pair_object (world .entityIndex , componentId )
@@ -309,11 +305,11 @@ local function archetype_create(world: any, types: { i24 }, prev: Archetype?): A
309
305
local o = ECS_PAIR (EcsWildcard , object )
310
306
local idr_o = id_record_ensure (componentIndex , o )
311
307
312
- records [r ] = i
313
- records [o ] = i
308
+ records [r ] = tr
309
+ records [o ] = tr
314
310
315
- idr_r .cache [id ] = i
316
- idr_o .cache [id ] = i
311
+ idr_r .cache [id ] = tr
312
+ idr_o .cache [id ] = tr
317
313
318
314
idr_r .size += 1
319
315
idr_o .size += 1
@@ -375,7 +371,7 @@ local function world_target(world: World, entity: i53, relation: i24--[[, nth: n
375
371
return nil
376
372
end
377
373
378
- return ecs_pair_object (entityIndex , archetype .types [archetypeRecord ])
374
+ return ecs_pair_object (entityIndex , archetype .types [archetypeRecord . column ])
379
375
end
380
376
381
377
local function world_parent (world : World , entity : i53 )
@@ -478,7 +474,7 @@ local function world_set(world: World, entityId: i53, componentId: i53, data: un
478
474
-- If the archetypes are the same it can avoid moving the entity
479
475
-- and just set the data directly.
480
476
local archetypeRecord = to .records [componentId ]
481
- from .columns [archetypeRecord ][record .row ] = data
477
+ from .columns [archetypeRecord . column ][record .row ] = data
482
478
-- Should fire an OnSet event here.
483
479
return
484
480
end
@@ -494,7 +490,7 @@ local function world_set(world: World, entityId: i53, componentId: i53, data: un
494
490
end
495
491
496
492
local archetypeRecord = to .records [componentId ]
497
- to .columns [archetypeRecord ][record .row ] = data
493
+ to .columns [archetypeRecord . column ][record .row ] = data
498
494
end
499
495
500
496
local function world_component (world : World ): i53
@@ -630,14 +626,14 @@ end
630
626
local world_get : (world : World , entityId : i53 , a : i53 , b : i53 ? , c : i53 ? , d : i53 ? , e : i53 ? ) -> (...any )
631
627
do
632
628
-- Keeping the function as small as possible to enable inlining
633
- local function fetch (id : i24 , records , columns , row ): any
629
+ local function fetch (id : i24 , records : { ArchetypeRecord } , columns , row ): any
634
630
local tr = records [id ]
635
631
636
632
if not tr then
637
633
return nil
638
634
end
639
635
640
- return columns [tr ][row ]
636
+ return columns [tr . column ][row ]
641
637
end
642
638
643
639
function world_get (world : World , entityId : i53 , a : i53 , b : i53 ? , c : i53 ? , d : i53 ? , e : i53 ? ): ...any
766
762
end
767
763
768
764
queryOutput = {}
769
- queryLength = # ids
770
765
771
766
entities = archetype .entities
772
767
i = # entities
773
768
columns = archetype .columns
774
769
775
770
local records = archetype .records
776
771
if not B then
777
- a = columns [records [A ]]
772
+ a = columns [records [A ]. column ]
778
773
elseif not C then
779
- a = columns [records [A ]]
780
- b = columns [records [B ]]
774
+ a = columns [records [A ]. column ]
775
+ b = columns [records [B ]. column ]
781
776
elseif not D then
782
- a = columns [records [A ]]
783
- b = columns [records [B ]]
784
- c = columns [records [C ]]
777
+ a = columns [records [A ]. column ]
778
+ b = columns [records [B ]. column ]
779
+ c = columns [records [C ]. column ]
785
780
elseif not E then
786
- a = columns [records [A ]]
787
- b = columns [records [B ]]
788
- c = columns [records [C ]]
789
- d = columns [records [D ]]
781
+ a = columns [records [A ]. column ]
782
+ b = columns [records [B ]. column ]
783
+ c = columns [records [C ]. column ]
784
+ d = columns [records [D ]. column ]
790
785
elseif not F then
791
- a = columns [records [A ]]
792
- b = columns [records [B ]]
793
- c = columns [records [C ]]
794
- d = columns [records [D ]]
795
- e = columns [records [E ]]
786
+ a = columns [records [A ]. column ]
787
+ b = columns [records [B ]. column ]
788
+ c = columns [records [C ]. column ]
789
+ d = columns [records [D ]. column ]
790
+ e = columns [records [E ]. column ]
796
791
elseif not G then
797
- a = columns [records [A ]]
798
- b = columns [records [B ]]
799
- c = columns [records [C ]]
800
- d = columns [records [D ]]
801
- e = columns [records [E ]]
802
- f = columns [records [F ]]
792
+ a = columns [records [A ]. column ]
793
+ b = columns [records [B ]. column ]
794
+ c = columns [records [C ]. column ]
795
+ d = columns [records [D ]. column ]
796
+ e = columns [records [E ]. column ]
797
+ f = columns [records [F ]. column ]
803
798
elseif not H then
804
- a = columns [records [A ]]
805
- b = columns [records [B ]]
806
- c = columns [records [C ]]
807
- d = columns [records [D ]]
808
- e = columns [records [E ]]
809
- f = columns [records [F ]]
810
- g = columns [records [G ]]
799
+ a = columns [records [A ]. column ]
800
+ b = columns [records [B ]. column ]
801
+ c = columns [records [C ]. column ]
802
+ d = columns [records [D ]. column ]
803
+ e = columns [records [E ]. column ]
804
+ f = columns [records [F ]. column ]
805
+ g = columns [records [G ]. column ]
811
806
elseif H then
812
- a = columns [records [A ]]
813
- b = columns [records [B ]]
814
- c = columns [records [D ]]
815
- e = columns [records [E ]]
816
- f = columns [records [F ]]
817
- g = columns [records [G ]]
818
- h = columns [records [H ]]
807
+ a = columns [records [A ]. column ]
808
+ b = columns [records [B ]. column ]
809
+ c = columns [records [D ]. column ]
810
+ e = columns [records [E ]. column ]
811
+ f = columns [records [F ]. column ]
812
+ g = columns [records [G ]. column ]
813
+ h = columns [records [H ]. column ]
819
814
end
820
815
end
821
816
840
835
entityId = entities [i ]
841
836
columns = archetype .columns
842
837
local records = archetype .records
843
- a = columns [records [A ]]
838
+ a = columns [records [A ]. column ]
844
839
end
845
840
846
841
local row = i
866
861
entityId = entities [i ]
867
862
columns = archetype .columns
868
863
local records = archetype .records
869
- a = columns [records [A ]]
870
- b = columns [records [B ]]
864
+ a = columns [records [A ]. column ]
865
+ b = columns [records [B ]. column ]
871
866
end
872
867
873
868
local row = i
893
888
entityId = entities [i ]
894
889
columns = archetype .columns
895
890
local records = archetype .records
896
- a = columns [records [A ]]
897
- b = columns [records [B ]]
898
- c = columns [records [C ]]
891
+ a = columns [records [A ]. column ]
892
+ b = columns [records [B ]. column ]
893
+ c = columns [records [C ]. column ]
899
894
end
900
895
901
896
local row = i
921
916
entityId = entities [i ]
922
917
columns = archetype .columns
923
918
local records = archetype .records
924
- a = columns [records [A ]]
925
- b = columns [records [B ]]
926
- c = columns [records [C ]]
927
- d = columns [records [D ]]
919
+ a = columns [records [A ]. column ]
920
+ b = columns [records [B ]. column ]
921
+ c = columns [records [C ]. column ]
922
+ d = columns [records [D ]. column ]
928
923
end
929
924
930
925
local row = i
931
926
i -= 1
932
927
933
-
934
928
return entityId , a [row ], b [row ], c [row ], d [row ]
935
929
end
936
930
else
953
947
local records = archetype .records
954
948
955
949
if not F then
956
- a = columns [records [A ]]
957
- b = columns [records [B ]]
958
- c = columns [records [C ]]
959
- d = columns [records [D ]]
960
- e = columns [records [E ]]
950
+ a = columns [records [A ]. column ]
951
+ b = columns [records [B ]. column ]
952
+ c = columns [records [C ]. column ]
953
+ d = columns [records [D ]. column ]
954
+ e = columns [records [E ]. column ]
961
955
elseif not G then
962
- a = columns [records [A ]]
963
- b = columns [records [B ]]
964
- c = columns [records [C ]]
965
- d = columns [records [D ]]
966
- e = columns [records [E ]]
967
- f = columns [records [F ]]
956
+ a = columns [records [A ]. column ]
957
+ b = columns [records [B ]. column ]
958
+ c = columns [records [C ]. column ]
959
+ d = columns [records [D ]. column ]
960
+ e = columns [records [E ]. column ]
961
+ f = columns [records [F ]. column ]
968
962
elseif not H then
969
- a = columns [records [A ]]
970
- b = columns [records [B ]]
971
- c = columns [records [C ]]
972
- d = columns [records [D ]]
973
- e = columns [records [E ]]
974
- f = columns [records [F ]]
975
- g = columns [records [G ]]
976
- elseif H then
977
- a = columns [records [A ]]
978
- b = columns [records [B ]]
979
- c = columns [records [D ]]
980
- e = columns [records [E ]]
981
- f = columns [records [F ]]
982
- g = columns [records [G ]]
983
- h = columns [records [H ]]
963
+ a = columns [records [A ].column ]
964
+ b = columns [records [B ].column ]
965
+ c = columns [records [C ].column ]
966
+ d = columns [records [D ].column ]
967
+ e = columns [records [E ].column ]
968
+ f = columns [records [F ].column ]
969
+ g = columns [records [G ].column ]
970
+ elseif not I then
971
+ a = columns [records [A ].column ]
972
+ b = columns [records [B ].column ]
973
+ c = columns [records [C ].column ]
974
+ d = columns [records [D ].column ]
975
+ e = columns [records [E ].column ]
976
+ f = columns [records [F ].column ]
977
+ g = columns [records [G ].column ]
978
+ h = columns [records [H ].column ]
984
979
end
985
980
end
986
981
999
994
1000
995
local field = archetype .records
1001
996
for j , id in ids do
1002
- queryOutput [j ] = columns [field [id ]][row ]
997
+ queryOutput [j ] = columns [field [id ]. column ][row ]
1003
998
end
1004
999
1005
1000
return entityId , unpack (queryOutput )
@@ -1047,34 +1042,34 @@ do
1047
1042
local tr = archetype .records
1048
1043
for row in archetype .entities do
1049
1044
if not B then
1050
- local va = columns [tr [A ]]
1045
+ local va = columns [tr [A ]. column ]
1051
1046
local pa = fn (va [row ])
1052
1047
1053
1048
va [row ] = pa
1054
1049
elseif not C then
1055
- local va = columns [tr [A ]]
1056
- local vb = columns [tr [B ]]
1050
+ local va = columns [tr [A ]. column ]
1051
+ local vb = columns [tr [B ]. column ]
1057
1052
1058
1053
va [row ], vb [row ] = fn (va [row ], vb [row ])
1059
1054
elseif not D then
1060
- local va = columns [tr [A ]]
1061
- local vb = columns [tr [B ]]
1062
- local vc = columns [tr [C ]]
1055
+ local va = columns [tr [A ]. column ]
1056
+ local vb = columns [tr [B ]. column ]
1057
+ local vc = columns [tr [C ]. column ]
1063
1058
1064
1059
va [row ], vb [row ], vc [row ] = fn (va [row ], vb [row ], vc [row ])
1065
1060
elseif not E then
1066
- local va = columns [tr [A ]]
1067
- local vb = columns [tr [B ]]
1068
- local vc = columns [tr [C ]]
1069
- local vd = columns [tr [D ]]
1061
+ local va = columns [tr [A ]. column ]
1062
+ local vb = columns [tr [B ]. column ]
1063
+ local vc = columns [tr [C ]. column ]
1064
+ local vd = columns [tr [D ]. column ]
1070
1065
1071
1066
va [row ], vb [row ], vc [row ], vd [row ] = fn (
1072
1067
va [row ], vb [row ], vc [row ], vd [row ])
1073
1068
else
1074
1069
local field = archetype .records
1075
1070
for j , id in ids do
1076
- queryOutput [j ] = columns [field [id ]][row ]
1077
- end
1071
+ queryOutput [j ] = columns [field [id ]. column ][row ]
1072
+ end
1078
1073
world_query_replace_values (row , columns ,
1079
1074
fn (unpack (queryOutput )))
1080
1075
end
0 commit comments