750
750
local A , B , C , D , E , F , G , H
751
751
local a , b , c , d , e , f , g , h
752
752
753
+ local init
754
+ local drain
755
+
753
756
local function query_init (query )
757
+ if init and drain then
758
+ return
759
+ end
760
+
761
+ init = true
754
762
lastArchetype = 1
755
763
archetype = compatible_archetypes [lastArchetype ]
756
764
@@ -767,157 +775,159 @@ do
767
775
768
776
local records = archetype .records
769
777
if not B then
770
- a = records [A ]
778
+ a = columns [ records [A ] ]
771
779
elseif not C then
772
- a = records [A ]
773
- b = records [B ]
780
+ a = columns [ records [A ] ]
781
+ b = columns [ records [B ] ]
774
782
elseif not D then
775
- a = records [A ]
776
- b = records [B ]
777
- c = records [C ]
783
+ a = columns [ records [A ] ]
784
+ b = columns [ records [B ] ]
785
+ c = columns [ records [C ] ]
778
786
elseif not E then
779
- a = records [A ]
780
- b = records [B ]
781
- c = records [C ]
782
- d = records [D ]
787
+ a = columns [ records [A ] ]
788
+ b = columns [ records [B ] ]
789
+ c = columns [ records [C ] ]
790
+ d = columns [ records [D ] ]
783
791
elseif not F then
784
- a = records [A ]
785
- b = records [B ]
786
- c = records [C ]
787
- d = records [D ]
788
- e = records [E ]
792
+ a = columns [ records [A ] ]
793
+ b = columns [ records [B ] ]
794
+ c = columns [ records [C ] ]
795
+ d = columns [ records [D ] ]
796
+ e = columns [ records [E ] ]
789
797
elseif not G then
790
- a = records [A ]
791
- b = records [B ]
792
- c = records [C ]
793
- d = records [D ]
794
- e = records [E ]
795
- f = records [F ]
798
+ a = columns [ records [A ] ]
799
+ b = columns [ records [B ] ]
800
+ c = columns [ records [C ] ]
801
+ d = columns [ records [D ] ]
802
+ e = columns [ records [E ] ]
803
+ f = columns [ records [F ] ]
796
804
elseif not H then
797
- a = records [A ]
798
- b = records [B ]
799
- c = records [C ]
800
- d = records [D ]
801
- e = records [E ]
802
- f = records [F ]
803
- g = records [G ]
805
+ a = columns [ records [A ] ]
806
+ b = columns [ records [B ] ]
807
+ c = columns [ records [C ] ]
808
+ d = columns [ records [D ] ]
809
+ e = columns [ records [E ] ]
810
+ f = columns [ records [F ] ]
811
+ g = columns [ records [G ] ]
804
812
elseif H then
805
- a = records [A ]
806
- b = records [B ]
807
- c = records [C ]
808
- d = records [D ]
809
- e = records [E ]
810
- f = records [F ]
811
- g = records [G ]
812
- h = records [H ]
813
+ a = columns [records [A ]]
814
+ b = columns [records [B ]]
815
+ c = columns [records [D ]]
816
+ e = columns [records [E ]]
817
+ f = columns [records [F ]]
818
+ g = columns [records [G ]]
819
+ h = columns [records [H ]]
813
820
end
814
821
end
815
822
816
- local function world_query_next (): any
823
+ local function world_query_iter_next (): any
817
824
local entityId = entities [i ]
818
825
while entityId == nil do
819
826
lastArchetype += 1
820
827
archetype = compatible_archetypes [lastArchetype ]
821
828
if not archetype then
822
829
return nil
823
830
end
831
+
832
+ entities = archetype .entities
833
+ i = # entities
834
+ if i == 0 then
835
+ continue
836
+ end
837
+ entityId = entities [i ]
838
+ columns = archetype .columns
824
839
local records = archetype .records
825
840
if not B then
826
- a = records [A ]
841
+ a = columns [ records [A ] ]
827
842
elseif not C then
828
- a = records [A ]
829
- b = records [B ]
843
+ a = columns [ records [A ] ]
844
+ b = columns [ records [B ] ]
830
845
elseif not D then
831
- a = records [A ]
832
- b = records [B ]
833
- c = records [C ]
846
+ a = columns [ records [A ] ]
847
+ b = columns [ records [B ] ]
848
+ c = columns [ records [C ] ]
834
849
elseif not E then
835
- a = records [A ]
836
- b = records [B ]
837
- c = records [C ]
838
- d = records [D ]
850
+ a = columns [ records [A ] ]
851
+ b = columns [ records [B ] ]
852
+ c = columns [ records [C ] ]
853
+ d = columns [ records [D ] ]
839
854
elseif not F then
840
- a = records [A ]
841
- b = records [B ]
842
- c = records [C ]
843
- d = records [D ]
844
- e = records [E ]
855
+ a = columns [ records [A ] ]
856
+ b = columns [ records [B ] ]
857
+ c = columns [ records [C ] ]
858
+ d = columns [ records [D ] ]
859
+ e = columns [ records [E ] ]
845
860
elseif not G then
846
- a = records [A ]
847
- b = records [B ]
848
- c = records [C ]
849
- d = records [D ]
850
- e = records [E ]
851
- f = records [F ]
861
+ a = columns [ records [A ] ]
862
+ b = columns [ records [B ] ]
863
+ c = columns [ records [C ] ]
864
+ d = columns [ records [D ] ]
865
+ e = columns [ records [E ] ]
866
+ f = columns [ records [F ] ]
852
867
elseif not H then
853
- a = records [A ]
854
- b = records [B ]
855
- c = records [C ]
856
- d = records [D ]
857
- e = records [E ]
858
- f = records [F ]
859
- g = records [G ]
868
+ a = columns [ records [A ] ]
869
+ b = columns [ records [B ] ]
870
+ c = columns [ records [C ] ]
871
+ d = columns [ records [D ] ]
872
+ e = columns [ records [E ] ]
873
+ f = columns [ records [F ] ]
874
+ g = columns [ records [G ] ]
860
875
elseif H then
861
- a = records [A ]
862
- b = records [B ]
863
- c = records [C ]
864
- d = records [D ]
865
- e = records [E ]
866
- f = records [F ]
867
- g = records [G ]
868
- h = records [H ]
876
+ a = columns [records [A ]]
877
+ b = columns [records [B ]]
878
+ c = columns [records [D ]]
879
+ e = columns [records [E ]]
880
+ f = columns [records [F ]]
881
+ g = columns [records [G ]]
882
+ h = columns [records [H ]]
869
883
end
870
- columns = archetype .columns
871
- entities = archetype .entities
872
- i = # entities
873
- entityId = entities [i ]
874
884
end
875
885
876
886
local row = i
877
887
i -= 1
878
888
879
889
if queryLength == 1 then
880
- return entityId , columns [ a ] [row ]
890
+ return entityId , a [row ]
881
891
elseif queryLength == 2 then
882
- return entityId , columns [ a ] [row ], columns [ b ] [row ]
892
+ return entityId , a [row ], b [row ]
883
893
elseif queryLength == 3 then
884
- return entityId , columns [ a ] [row ], columns [ b ] [row ], columns [ c ] [row ]
894
+ return entityId , a [row ], b [row ], c [row ]
885
895
elseif queryLength == 4 then
886
- return entityId , columns [ a ] [row ], columns [ b ] [row ], columns [ c ] [row ], columns [ d ] [row ]
896
+ return entityId , a [row ], b [row ], c [row ], d [row ]
887
897
elseif queryLength == 5 then
888
898
return entityId ,
889
- columns [ a ] [row ],
890
- columns [ b ] [row ],
891
- columns [ c ] [row ],
892
- columns [ d ] [row ],
893
- columns [ e ] [row ]
899
+ a [row ],
900
+ b [row ],
901
+ c [row ],
902
+ d [row ],
903
+ e [row ]
894
904
elseif queryLength == 6 then
895
905
return entityId ,
896
- columns [ a ] [row ],
897
- columns [ b ] [row ],
898
- columns [ c ] [row ],
899
- columns [ d ] [row ],
900
- columns [ e ] [row ],
901
- columns [ f ] [row ]
906
+ a [row ],
907
+ b [row ],
908
+ c [row ],
909
+ d [row ],
910
+ e [row ],
911
+ f [row ]
902
912
elseif queryLength == 7 then
903
913
return entityId ,
904
- columns [ a ] [row ],
905
- columns [ b ] [row ],
906
- columns [ c ] [row ],
907
- columns [ d ] [row ],
908
- columns [ e ] [row ],
909
- columns [ f ] [row ],
910
- columns [ g ] [row ]
914
+ a [row ],
915
+ b [row ],
916
+ c [row ],
917
+ d [row ],
918
+ e [row ],
919
+ f [row ],
920
+ g [row ]
911
921
elseif queryLength == 8 then
912
922
return entityId ,
913
- columns [ a ] [row ],
914
- columns [ b ] [row ],
915
- columns [ c ] [row ],
916
- columns [ d ] [row ],
917
- columns [ e ] [row ],
918
- columns [ f ] [row ],
919
- columns [ g ] [row ],
920
- columns [ h ] [row ]
923
+ a [row ],
924
+ b [row ],
925
+ c [row ],
926
+ d [row ],
927
+ e [row ],
928
+ f [row ],
929
+ g [row ],
930
+ h [row ]
921
931
end
922
932
923
933
local field = archetype .records
968
978
local tr = archetype .records
969
979
for row in archetype .entities do
970
980
if queryLength == 1 then
971
- local va = columns [tr [a ]]
981
+ local va = columns [tr [A ]]
972
982
local pa = fn (va [row ])
973
983
974
984
va [row ] = pa
975
985
elseif queryLength == 2 then
976
- local va = columns [tr [a ]]
977
- local vb = columns [tr [b ]]
986
+ local va = columns [tr [A ]]
987
+ local vb = columns [tr [B ]]
978
988
979
989
va [row ], vb [row ] = fn (va [row ], vb [row ])
980
990
elseif queryLength == 3 then
981
- local va = columns [tr [a ]]
982
- local vb = columns [tr [b ]]
983
- local vc = columns [tr [c ]]
991
+ local va = columns [tr [A ]]
992
+ local vb = columns [tr [B ]]
993
+ local vc = columns [tr [C ]]
984
994
985
995
va [row ], vb [row ], vc [row ] = fn (va [row ], vb [row ], vc [row ])
986
996
elseif queryLength == 4 then
987
- local va = columns [tr [a ]]
988
- local vb = columns [tr [b ]]
989
- local vc = columns [tr [c ]]
990
- local vd = columns [tr [d ]]
997
+ local va = columns [tr [A ]]
998
+ local vb = columns [tr [B ]]
999
+ local vc = columns [tr [C ]]
1000
+ local vd = columns [tr [D ]]
991
1001
992
1002
va [row ], vb [row ], vc [row ], vd [row ] = fn (
993
1003
va [row ], vb [row ], vc [row ], vd [row ])
1026
1036
end
1027
1037
end
1028
1038
1039
+ query_init (query )
1040
+
1029
1041
return query
1030
1042
end
1031
1043
@@ -1036,19 +1048,22 @@ do
1036
1048
return compatible_archetypes
1037
1049
end
1038
1050
1039
- local drain
1040
-
1041
1051
local function world_query_drain (query )
1042
1052
drain = true
1043
1053
query_init (query )
1044
1054
return query
1045
1055
end
1046
1056
1047
1057
local function world_query_iter (query )
1058
+ query_init (query )
1059
+ return world_query_iter_next
1060
+ end
1061
+
1062
+ local function world_query_next ()
1048
1063
if not drain then
1049
- query_init ( query )
1064
+ error ( "Did you forget to call query:drain()?" )
1050
1065
end
1051
- return world_query_next
1066
+ return world_query_iter_next ()
1052
1067
end
1053
1068
1054
1069
local it = {
1113
1128
end
1114
1129
1115
1130
drain = false
1131
+ init = false
1116
1132
ids = components
1117
1133
1118
1134
return it
0 commit comments