mirror of
https://github.com/Ukendio/jecs.git
synced 2025-04-24 17:10:03 +00:00
Please the type solver overlord
This commit is contained in:
parent
a62cb370cf
commit
1553362014
1 changed files with 108 additions and 38 deletions
138
lib/init.lua
138
lib/init.lua
|
@ -23,7 +23,7 @@ type Archetype = {
|
|||
type: string | number,
|
||||
entities: { number },
|
||||
columns: { Column },
|
||||
records: {},
|
||||
records: { [number]: number },
|
||||
}
|
||||
|
||||
type Record = {
|
||||
|
@ -47,7 +47,7 @@ TODO:
|
|||
]]
|
||||
|
||||
type ArchetypeMap = {
|
||||
cache: { [number]: ArchetypeRecord },
|
||||
cache: { ArchetypeRecord },
|
||||
first: ArchetypeMap,
|
||||
second: ArchetypeMap,
|
||||
parent: ArchetypeMap,
|
||||
|
@ -136,7 +136,7 @@ local function ECS_ENTITY_T_HI(e: i53): i24
|
|||
end
|
||||
|
||||
-- SECOND
|
||||
local function ECS_ENTITY_T_LO(e: i53)
|
||||
local function ECS_ENTITY_T_LO(e: i53): i24
|
||||
if e > ECS_ENTITY_MASK then
|
||||
e = e // 0x10
|
||||
return e // ECS_ENTITY_MASK
|
||||
|
@ -145,7 +145,7 @@ local function ECS_ENTITY_T_LO(e: i53)
|
|||
end
|
||||
|
||||
local function ECS_PAIR(pred: i53, obj: i53): i53
|
||||
return ECS_COMBINE(ECS_ENTITY_T_LO(obj), ECS_ENTITY_T_LO(pred)) + addFlags(--[[isPair]] true)
|
||||
return ECS_COMBINE(ECS_ENTITY_T_LO(obj), ECS_ENTITY_T_LO(pred)) + addFlags(--[[isPair]] true) :: i53
|
||||
end
|
||||
|
||||
local function getAlive(entityIndex: EntityIndex, id: i24)
|
||||
|
@ -163,7 +163,7 @@ local function ECS_PAIR_OBJECT(entityIndex, e)
|
|||
return getAlive(entityIndex, ECS_ENTITY_T_LO(e))
|
||||
end
|
||||
|
||||
local function nextEntityId(entityIndex, index: i24): i53
|
||||
local function nextEntityId(entityIndex: EntityIndex, index: i24): i53
|
||||
--local id = ECS_COMBINE(index, 0)
|
||||
local id = index
|
||||
entityIndex.sparse[id] = {
|
||||
|
@ -219,7 +219,7 @@ local function transitionArchetype(
|
|||
sourceEntities[sourceRow] = e2
|
||||
end
|
||||
|
||||
sourceEntities[movedAway] = nil
|
||||
sourceEntities[movedAway] = nil :: any
|
||||
destinationEntities[destinationRow] = e1
|
||||
|
||||
local record1 = sparse[e1]
|
||||
|
@ -265,7 +265,7 @@ local function ensureComponentRecord(
|
|||
local archetypesMap = componentIndex[componentId]
|
||||
|
||||
if not archetypesMap then
|
||||
archetypesMap = { size = 0, cache = {}, first = {}, second = {} } :: ArchetypeMap
|
||||
archetypesMap = { size = 0, cache = {} }
|
||||
componentIndex[componentId] = archetypesMap
|
||||
end
|
||||
|
||||
|
@ -289,7 +289,7 @@ local function archetypeOf(world: any, types: { i24 }, prev: Archetype?): Archet
|
|||
world.nextArchetypeId = id
|
||||
|
||||
local length = #types
|
||||
local columns = table.create(length)
|
||||
local columns = (table.create(length) :: any) :: { Column }
|
||||
local componentIndex = world.componentIndex
|
||||
|
||||
local records = {}
|
||||
|
@ -311,7 +311,7 @@ local function archetypeOf(world: any, types: { i24 }, prev: Archetype?): Archet
|
|||
columns[i] = {}
|
||||
end
|
||||
|
||||
local archetype = {
|
||||
local archetype: Archetype = {
|
||||
columns = columns,
|
||||
edges = {},
|
||||
entities = {},
|
||||
|
@ -320,6 +320,7 @@ local function archetypeOf(world: any, types: { i24 }, prev: Archetype?): Archet
|
|||
type = ty,
|
||||
types = types,
|
||||
}
|
||||
|
||||
world.archetypeIndex[ty] = archetype
|
||||
world.archetypes[id] = archetype
|
||||
|
||||
|
@ -330,12 +331,12 @@ local World = {}
|
|||
World.__index = World
|
||||
function World.new()
|
||||
local self = setmetatable({
|
||||
archetypeIndex = {},
|
||||
archetypeIndex = {} :: { [string]: Archetype },
|
||||
archetypes = {} :: Archetypes,
|
||||
componentIndex = {} :: ComponentIndex,
|
||||
entityIndex = {
|
||||
dense = {},
|
||||
sparse = {},
|
||||
dense = {} :: { [i24]: i53 },
|
||||
sparse = {} :: { [i53]: Record },
|
||||
} :: EntityIndex,
|
||||
hooks = {
|
||||
[ON_ADD] = {},
|
||||
|
@ -349,6 +350,8 @@ function World.new()
|
|||
return self
|
||||
end
|
||||
|
||||
export type World = typeof(World.new())
|
||||
|
||||
function World.component(world: World)
|
||||
local componentId = world.nextComponentId + 1
|
||||
if componentId > HI_COMPONENT_ID then
|
||||
|
@ -391,7 +394,7 @@ function World.target(world: World, entity: i53, relation: i24): i24?
|
|||
end
|
||||
|
||||
-- should reuse this logic in World.set instead of swap removing in transition archetype
|
||||
local function destructColumns(columns, count, row)
|
||||
local function destructColumns(columns: { Column }, count: number, row: number)
|
||||
if row == count then
|
||||
for _, column in columns do
|
||||
column[count] = nil
|
||||
|
@ -415,7 +418,7 @@ local function archetypeDelete(world: World, id: i53)
|
|||
end
|
||||
end
|
||||
|
||||
componentIndex[id] = nil
|
||||
componentIndex[id] = nil :: any
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -444,20 +447,18 @@ function World.delete(world: World, entityId: i53)
|
|||
sparse[entityToMove] = record
|
||||
end
|
||||
|
||||
entities[row], entities[last] = entities[last], nil
|
||||
entities[row], entities[last] = entities[last], nil :: any
|
||||
|
||||
local columns = archetype.columns
|
||||
|
||||
destructColumns(columns, last, row)
|
||||
end
|
||||
|
||||
sparse[entityId] = nil
|
||||
dense[#dense] = nil
|
||||
sparse[entityId] = nil :: any
|
||||
dense[#dense] = nil :: any
|
||||
end
|
||||
|
||||
export type World = typeof(World.new())
|
||||
|
||||
local function ensureArchetype(world: World, types, prev)
|
||||
local function ensureArchetype(world: World, types, prev): Archetype
|
||||
if #types < 1 then
|
||||
return world.ROOT_ARCHETYPE
|
||||
end
|
||||
|
@ -859,11 +860,11 @@ export type Pair = number
|
|||
export type QueryShim<T...> = typeof(setmetatable({
|
||||
without = function(...): QueryShim<T...>
|
||||
return nil :: any
|
||||
end
|
||||
end,
|
||||
}, {
|
||||
__iter = function(): () -> (number, T...)
|
||||
return nil :: any
|
||||
end
|
||||
end,
|
||||
}))
|
||||
export type WorldShim = typeof(setmetatable(
|
||||
{} :: {
|
||||
|
@ -886,8 +887,7 @@ export type WorldShim = typeof(setmetatable(
|
|||
--- Removes a component from the given entity
|
||||
remove: (WorldShim, id: Entity, component: Entity) -> (),
|
||||
--- Retrieves the value of up to 4 components. These values may be nil.
|
||||
get:
|
||||
(<A>(WorldShim, id: any, Entity<A>) -> A)
|
||||
get: (<A>(WorldShim, id: any, Entity<A>) -> A)
|
||||
& (<A, B>(WorldShim, id: Entity, Entity<A>, Entity<B>) -> (A, B))
|
||||
& (<A, B, C>(WorldShim, id: Entity, Entity<A>, Entity<B>, Entity<C>) -> (A, B, C))
|
||||
& <A, B, C, D>(WorldShim, id: Entity, Entity<A>, Entity<B>, Entity<C>, Entity<D>) -> (A, B, C, D),
|
||||
|
@ -897,17 +897,87 @@ export type WorldShim = typeof(setmetatable(
|
|||
& (<A, B>(WorldShim, Entity<A>, Entity<B>) -> QueryShim<A, B>)
|
||||
& (<A, B, C>(WorldShim, Entity<A>, Entity<B>, Entity<C>) -> QueryShim<A, B, C>)
|
||||
& (<A, B, C, D>(WorldShim, Entity<A>, Entity<B>, Entity<C>, Entity<D>) -> QueryShim<A, B, C, D>)
|
||||
& (<A, B, C, D, E>(WorldShim, Entity<A>, Entity<B>, Entity<C>, Entity<D>, Entity<E>) -> QueryShim<A, B, C, D, E>)
|
||||
& (<A, B, C, D, E, F>(WorldShim, Entity<A>, Entity<B>, Entity<C>, Entity<D>, Entity<E>, Entity<F>) -> QueryShim<A, B, C, D, E, F>)
|
||||
& (<A, B, C, D, E, F, G>(WorldShim, Entity<A>, Entity<B>, Entity<C>, Entity<D>, Entity<E>, Entity<F>, Entity<G>) -> QueryShim<A, B, C, D, E, F, G>)
|
||||
& (<A, B, C, D, E, F, G, H>(WorldShim, Entity<A>, Entity<B>, Entity<C>, Entity<D>, Entity<E>, Entity<F>, Entity<G>, Entity<H>) -> QueryShim<A, B, C, D, E, F, G, H>)
|
||||
& (<A, B, C, D, E, F, G, H, I>(WorldShim, Entity<A>, Entity<B>, Entity<C>, Entity<D>, Entity<E>, Entity<F>, Entity<G>, Entity<H>, Entity<I>) -> QueryShim<A, B, C, D, E, F, G, H, I>)
|
||||
& (<A, B, C, D, E, F, G, H, I, J>(WorldShim, Entity<A>, Entity<B>, Entity<C>, Entity<D>, Entity<E>, Entity<F>, Entity<G>, Entity<H>, Entity<I>, Entity<J>) -> QueryShim<A, B, C, D, E, F, G, H, I, J>)
|
||||
& (<A, B, C, D, E, F, G, H, I, J, K>(WorldShim, Entity<A>, Entity<B>, Entity<C>, Entity<D>, Entity<E>, Entity<F>, Entity<G>, Entity<H>, Entity<I>, Entity<J>, Entity<K>, ...Entity<any>) -> QueryShim<A, B, C, D, E, F, G, H, I, J, K>)
|
||||
|
||||
& (<A, B, C, D, E>(
|
||||
WorldShim,
|
||||
Entity<A>,
|
||||
Entity<B>,
|
||||
Entity<C>,
|
||||
Entity<D>,
|
||||
Entity<E>
|
||||
) -> QueryShim<A, B, C, D, E>)
|
||||
& (<A, B, C, D, E, F>(
|
||||
WorldShim,
|
||||
Entity<A>,
|
||||
Entity<B>,
|
||||
Entity<C>,
|
||||
Entity<D>,
|
||||
Entity<E>,
|
||||
Entity<F>
|
||||
) -> QueryShim<A, B, C, D, E, F>)
|
||||
& (<A, B, C, D, E, F, G>(
|
||||
WorldShim,
|
||||
Entity<A>,
|
||||
Entity<B>,
|
||||
Entity<C>,
|
||||
Entity<D>,
|
||||
Entity<E>,
|
||||
Entity<F>,
|
||||
Entity<G>
|
||||
) -> QueryShim<A, B, C, D, E, F, G>)
|
||||
& (<A, B, C, D, E, F, G, H>(
|
||||
WorldShim,
|
||||
Entity<A>,
|
||||
Entity<B>,
|
||||
Entity<C>,
|
||||
Entity<D>,
|
||||
Entity<E>,
|
||||
Entity<F>,
|
||||
Entity<G>,
|
||||
Entity<H>
|
||||
) -> QueryShim<A, B, C, D, E, F, G, H>)
|
||||
& (<A, B, C, D, E, F, G, H, I>(
|
||||
WorldShim,
|
||||
Entity<A>,
|
||||
Entity<B>,
|
||||
Entity<C>,
|
||||
Entity<D>,
|
||||
Entity<E>,
|
||||
Entity<F>,
|
||||
Entity<G>,
|
||||
Entity<H>,
|
||||
Entity<I>
|
||||
) -> QueryShim<A, B, C, D, E, F, G, H, I>)
|
||||
& (<A, B, C, D, E, F, G, H, I, J>(
|
||||
WorldShim,
|
||||
Entity<A>,
|
||||
Entity<B>,
|
||||
Entity<C>,
|
||||
Entity<D>,
|
||||
Entity<E>,
|
||||
Entity<F>,
|
||||
Entity<G>,
|
||||
Entity<H>,
|
||||
Entity<I>,
|
||||
Entity<J>
|
||||
) -> QueryShim<A, B, C, D, E, F, G, H, I, J>)
|
||||
& (<A, B, C, D, E, F, G, H, I, J, K>(
|
||||
WorldShim,
|
||||
Entity<A>,
|
||||
Entity<B>,
|
||||
Entity<C>,
|
||||
Entity<D>,
|
||||
Entity<E>,
|
||||
Entity<F>,
|
||||
Entity<G>,
|
||||
Entity<H>,
|
||||
Entity<I>,
|
||||
Entity<J>,
|
||||
Entity<K>,
|
||||
...Entity<any>
|
||||
) -> QueryShim<A, B, C, D, E, F, G, H, I, J, K>),
|
||||
},
|
||||
{} :: {
|
||||
__iter: (world: WorldShim) -> () -> (number, {[unknown]: unknown?})
|
||||
__iter: (world: WorldShim) -> () -> (number, { [unknown]: unknown? }),
|
||||
}
|
||||
))
|
||||
|
||||
|
@ -930,5 +1000,5 @@ return table.freeze({
|
|||
ECS_PAIR_OBJECT = ECS_PAIR_OBJECT,
|
||||
|
||||
pair = (ECS_PAIR :: any) :: <R, T>(pred: Entity, obj: Entity) -> number,
|
||||
getAlive = getAlive
|
||||
getAlive = getAlive,
|
||||
})
|
||||
|
|
Loading…
Reference in a new issue