Skip to content

Commit 4a8250a

Browse files
committed
Add .column
1 parent 7476952 commit 4a8250a

File tree

1 file changed

+104
-109
lines changed

1 file changed

+104
-109
lines changed

src/init.luau

Lines changed: 104 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ type Archetype = {
2424
type: string | number,
2525
entities: { number },
2626
columns: { Column },
27-
records: { [number]: number },
27+
records: { ArchetypeRecord },
2828
}
2929
type Record = {
3030
archetype: Archetype,
@@ -35,17 +35,12 @@ type Record = {
3535

3636
type EntityIndex = { dense: { [i24]: i53 }, sparse: { [i53]: Record } }
3737

38-
type ArchetypeRecord = number
39-
--[[
40-
TODO:
41-
{
38+
type ArchetypeRecord = {
4239
index: number,
4340
count: number,
4441
column: number
4542
}
4643

47-
]]
48-
4944
type ArchetypeMap = {
5045
cache: { ArchetypeRecord },
5146
first: ArchetypeMap,
@@ -191,17 +186,17 @@ local function archetype_move(entityIndex: EntityIndex, to: Archetype,
191186
local sourceEntities = from.entities
192187
local destinationEntities = to.entities
193188
local destinationColumns = to.columns
194-
local tr = to.records
189+
local records = to.records
195190
local types = from.types
196191

197192
for i, column in columns do
198193
-- Retrieves the new column index from the source archetype's record from each component
199194
-- 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]]
201196

202197
-- 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]
205200
end
206201
-- If the entity is the last row in the archetype then swapping it would be meaningless.
207202
local last = #column
@@ -293,12 +288,13 @@ local function archetype_create(world: any, types: { i24 }, prev: Archetype?): A
293288
local columns = (table.create(length) :: any) :: { Column }
294289
local componentIndex = world.componentIndex
295290

296-
local records = {}
291+
local records: { ArchetypeRecord } = {}
297292
for i, componentId in types do
293+
local tr = { column = i, count = 1, index = 1 }
298294
local idr = id_record_ensure(componentIndex, componentId)
299-
idr.cache[id] = i
295+
idr.cache[id] = tr
300296
idr.size += 1
301-
records[componentId] = i
297+
records[componentId] = tr
302298
if ECS_IS_PAIR(componentId) then
303299
local relation = ecs_pair_relation(world.entityIndex, componentId)
304300
local object = ecs_pair_object(world.entityIndex, componentId)
@@ -309,11 +305,11 @@ local function archetype_create(world: any, types: { i24 }, prev: Archetype?): A
309305
local o = ECS_PAIR(EcsWildcard, object)
310306
local idr_o = id_record_ensure(componentIndex, o)
311307

312-
records[r] = i
313-
records[o] = i
308+
records[r] = tr
309+
records[o] = tr
314310

315-
idr_r.cache[id] = i
316-
idr_o.cache[id] = i
311+
idr_r.cache[id] = tr
312+
idr_o.cache[id] = tr
317313

318314
idr_r.size += 1
319315
idr_o.size += 1
@@ -375,7 +371,7 @@ local function world_target(world: World, entity: i53, relation: i24--[[, nth: n
375371
return nil
376372
end
377373

378-
return ecs_pair_object(entityIndex, archetype.types[archetypeRecord])
374+
return ecs_pair_object(entityIndex, archetype.types[archetypeRecord.column])
379375
end
380376

381377
local function world_parent(world: World, entity: i53)
@@ -478,7 +474,7 @@ local function world_set(world: World, entityId: i53, componentId: i53, data: un
478474
-- If the archetypes are the same it can avoid moving the entity
479475
-- and just set the data directly.
480476
local archetypeRecord = to.records[componentId]
481-
from.columns[archetypeRecord][record.row] = data
477+
from.columns[archetypeRecord.column][record.row] = data
482478
-- Should fire an OnSet event here.
483479
return
484480
end
@@ -494,7 +490,7 @@ local function world_set(world: World, entityId: i53, componentId: i53, data: un
494490
end
495491

496492
local archetypeRecord = to.records[componentId]
497-
to.columns[archetypeRecord][record.row] = data
493+
to.columns[archetypeRecord.column][record.row] = data
498494
end
499495

500496
local function world_component(world: World): i53
@@ -630,14 +626,14 @@ end
630626
local world_get: (world: World, entityId: i53, a: i53, b: i53?, c: i53?, d: i53?, e: i53?) -> (...any)
631627
do
632628
-- 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
634630
local tr = records[id]
635631

636632
if not tr then
637633
return nil
638634
end
639635

640-
return columns[tr][row]
636+
return columns[tr.column][row]
641637
end
642638

643639
function world_get(world: World, entityId: i53, a: i53, b: i53?, c: i53?, d: i53?, e: i53?): ...any
@@ -766,56 +762,55 @@ do
766762
end
767763

768764
queryOutput = {}
769-
queryLength = #ids
770765

771766
entities = archetype.entities
772767
i = #entities
773768
columns = archetype.columns
774769

775770
local records = archetype.records
776771
if not B then
777-
a = columns[records[A]]
772+
a = columns[records[A].column]
778773
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]
781776
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]
785780
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]
790785
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]
796791
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]
803798
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]
811806
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]
819814
end
820815
end
821816

@@ -840,7 +835,7 @@ do
840835
entityId = entities[i]
841836
columns = archetype.columns
842837
local records = archetype.records
843-
a = columns[records[A]]
838+
a = columns[records[A].column]
844839
end
845840

846841
local row = i
@@ -866,8 +861,8 @@ do
866861
entityId = entities[i]
867862
columns = archetype.columns
868863
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]
871866
end
872867

873868
local row = i
@@ -893,9 +888,9 @@ do
893888
entityId = entities[i]
894889
columns = archetype.columns
895890
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]
899894
end
900895

901896
local row = i
@@ -921,16 +916,15 @@ do
921916
entityId = entities[i]
922917
columns = archetype.columns
923918
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]
928923
end
929924

930925
local row = i
931926
i-=1
932927

933-
934928
return entityId, a[row], b[row], c[row], d[row]
935929
end
936930
else
@@ -953,34 +947,35 @@ do
953947
local records = archetype.records
954948

955949
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]
961955
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]
968962
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]
984979
end
985980
end
986981

@@ -999,7 +994,7 @@ do
999994

1000995
local field = archetype.records
1001996
for j, id in ids do
1002-
queryOutput[j] = columns[field[id]][row]
997+
queryOutput[j] = columns[field[id].column][row]
1003998
end
1004999

10051000
return entityId, unpack(queryOutput)
@@ -1047,34 +1042,34 @@ do
10471042
local tr = archetype.records
10481043
for row in archetype.entities do
10491044
if not B then
1050-
local va = columns[tr[A]]
1045+
local va = columns[tr[A].column]
10511046
local pa = fn(va[row])
10521047

10531048
va[row] = pa
10541049
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]
10571052

10581053
va[row], vb[row] = fn(va[row], vb[row])
10591054
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]
10631058

10641059
va[row], vb[row], vc[row] = fn(va[row], vb[row], vc[row])
10651060
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]
10701065

10711066
va[row], vb[row], vc[row], vd[row] = fn(
10721067
va[row], vb[row], vc[row], vd[row])
10731068
else
10741069
local field = archetype.records
10751070
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
10781073
world_query_replace_values(row, columns,
10791074
fn(unpack(queryOutput)))
10801075
end

0 commit comments

Comments
 (0)