mirror of
https://github.com/Ukendio/jecs.git
synced 2025-04-25 01:20:04 +00:00
Update newMatter.lua
This commit is contained in:
parent
c5daddd505
commit
32381c9cf6
1 changed files with 98 additions and 10 deletions
108
newMatter.lua
108
newMatter.lua
|
@ -383,6 +383,16 @@ local function assertValidComponentInstance(value, position)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--!optimize 2
|
||||||
|
--!native
|
||||||
|
--!strict
|
||||||
|
local component = require(script.Parent.component)
|
||||||
|
local topoRuntime = require(script.Parent.topoRuntime)
|
||||||
|
local Component = require(script.Parent.component)
|
||||||
|
|
||||||
|
local assertValidComponentInstance = Component.assertValidComponentInstance
|
||||||
|
local assertValidComponent = Component.assertValidComponent
|
||||||
|
|
||||||
local ERROR_NO_ENTITY = "Entity doesn't exist, use world:contains to check if needed"
|
local ERROR_NO_ENTITY = "Entity doesn't exist, use world:contains to check if needed"
|
||||||
local ERROR_DUPLICATE_ENTITY =
|
local ERROR_DUPLICATE_ENTITY =
|
||||||
"The world already contains an entity with ID %d. Use World:replace instead if this is intentional."
|
"The world already contains an entity with ID %d. Use World:replace instead if this is intentional."
|
||||||
|
@ -434,11 +444,6 @@ local function transitionArchetype(
|
||||||
from: Archetype,
|
from: Archetype,
|
||||||
sourceRow: i24
|
sourceRow: i24
|
||||||
)
|
)
|
||||||
-- local columns = sourceArchetype.columns
|
|
||||||
-- local sourceEntities = sourceArchetype.entities
|
|
||||||
-- local destinationEntities = destinationArchetype.entities
|
|
||||||
-- local destinationColumns = destinationArchetype.columns
|
|
||||||
|
|
||||||
local columns = from.columns
|
local columns = from.columns
|
||||||
local sourceEntities = from.entities
|
local sourceEntities = from.entities
|
||||||
local destinationEntities = to.entities
|
local destinationEntities = to.entities
|
||||||
|
@ -550,6 +555,7 @@ function World.new()
|
||||||
local self = setmetatable({
|
local self = setmetatable({
|
||||||
entityIndex = {},
|
entityIndex = {},
|
||||||
componentIndex = {},
|
componentIndex = {},
|
||||||
|
componentIdToComponent = {},
|
||||||
archetypes = {},
|
archetypes = {},
|
||||||
archetypeIndex = {},
|
archetypeIndex = {},
|
||||||
nextId = 0,
|
nextId = 0,
|
||||||
|
@ -623,7 +629,12 @@ local function archetypeTraverseAdd(world: World, componentId: i53, archetype: A
|
||||||
end
|
end
|
||||||
|
|
||||||
local function componentAdd(world: World, entityId: i53, componentInstance)
|
local function componentAdd(world: World, entityId: i53, componentInstance)
|
||||||
local componentId = #getmetatable(componentInstance)
|
local component = getmetatable(componentInstance)
|
||||||
|
local componentId = #component
|
||||||
|
|
||||||
|
-- TODO:
|
||||||
|
-- This never gets cleaned up
|
||||||
|
world.componentIdToComponent[componentId] = component
|
||||||
|
|
||||||
local record = world:ensureRecord(entityId)
|
local record = world:ensureRecord(entityId)
|
||||||
local sourceArchetype = record.archetype
|
local sourceArchetype = record.archetype
|
||||||
|
@ -792,7 +803,29 @@ function World.entity(world: World)
|
||||||
end
|
end
|
||||||
|
|
||||||
function World:__iter()
|
function World:__iter()
|
||||||
return error("NOT IMPLEMENTED YET")
|
local previous = nil
|
||||||
|
return function()
|
||||||
|
local entityId, data = next(self.entityIndex, previous)
|
||||||
|
previous = entityId
|
||||||
|
|
||||||
|
if entityId == nil then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local archetype = data.archetype
|
||||||
|
if not archetype then
|
||||||
|
return entityId, {}
|
||||||
|
end
|
||||||
|
|
||||||
|
local columns = archetype.columns
|
||||||
|
local components = {}
|
||||||
|
for i, map in columns do
|
||||||
|
local componentId = archetype.types[i]
|
||||||
|
components[self.componentIdToComponent[componentId]] = map[data.row]
|
||||||
|
end
|
||||||
|
|
||||||
|
return entityId, components
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function World._trackChanged(world: World, metatable, id, old, new)
|
function World._trackChanged(world: World, metatable, id, old, new)
|
||||||
|
@ -921,7 +954,7 @@ local emptyQueryResult = setmetatable({
|
||||||
})
|
})
|
||||||
|
|
||||||
local function queryResult(compatibleArchetypes, components: { number }, queryLength, ...): any
|
local function queryResult(compatibleArchetypes, components: { number }, queryLength, ...): any
|
||||||
local a: any, b: any, c: any, d: any, e: any = ...
|
local a: any, b: any, c: any, d: any, e: any, f: any, g: any, h: any = ...
|
||||||
local lastArchetype, archetype = next(compatibleArchetypes)
|
local lastArchetype, archetype = next(compatibleArchetypes)
|
||||||
if not lastArchetype then
|
if not lastArchetype then
|
||||||
return emptyQueryResult
|
return emptyQueryResult
|
||||||
|
@ -967,6 +1000,31 @@ local function queryResult(compatibleArchetypes, components: { number }, queryLe
|
||||||
columns[archetypeRecords[c]][row],
|
columns[archetypeRecords[c]][row],
|
||||||
columns[archetypeRecords[d]][row],
|
columns[archetypeRecords[d]][row],
|
||||||
columns[archetypeRecords[e]][row]
|
columns[archetypeRecords[e]][row]
|
||||||
|
elseif queryLength == 6 then
|
||||||
|
return entityId,
|
||||||
|
columns[archetypeRecords[a]][row],
|
||||||
|
columns[archetypeRecords[b]][row],
|
||||||
|
columns[archetypeRecords[c]][row],
|
||||||
|
columns[archetypeRecords[d]][row],
|
||||||
|
columns[archetypeRecords[e]][row],
|
||||||
|
columns[archetypeRecords[f]][row]
|
||||||
|
elseif queryLength == 7 then
|
||||||
|
return columns[archetypeRecords[a]][row],
|
||||||
|
columns[archetypeRecords[b]][row],
|
||||||
|
columns[archetypeRecords[c]][row],
|
||||||
|
columns[archetypeRecords[d]][row],
|
||||||
|
columns[archetypeRecords[e]][row],
|
||||||
|
columns[archetypeRecords[f]][row],
|
||||||
|
columns[archetypeRecords[g]][row]
|
||||||
|
elseif queryLength == 8 then
|
||||||
|
return columns[archetypeRecords[a]][row],
|
||||||
|
columns[archetypeRecords[b]][row],
|
||||||
|
columns[archetypeRecords[c]][row],
|
||||||
|
columns[archetypeRecords[d]][row],
|
||||||
|
columns[archetypeRecords[e]][row],
|
||||||
|
columns[archetypeRecords[f]][row],
|
||||||
|
columns[archetypeRecords[g]][row],
|
||||||
|
columns[archetypeRecords[h]][row]
|
||||||
end
|
end
|
||||||
|
|
||||||
for i, componentId in components do
|
for i, componentId in components do
|
||||||
|
@ -1229,7 +1287,7 @@ function World.query(world: World, ...: Component): any
|
||||||
local components = { ... }
|
local components = { ... }
|
||||||
local archetypes = world.archetypes
|
local archetypes = world.archetypes
|
||||||
local queryLength = select("#", ...)
|
local queryLength = select("#", ...)
|
||||||
local a: any, b: any, c: any, d: any, e: any = ...
|
local a: any, b: any, c: any, d: any, e: any, f: any, g: any, h: any = ...
|
||||||
|
|
||||||
if queryLength == 0 then
|
if queryLength == 0 then
|
||||||
return emptyQueryResult
|
return emptyQueryResult
|
||||||
|
@ -1319,6 +1377,36 @@ function World.query(world: World, ...: Component): any
|
||||||
e = #e
|
e = #e
|
||||||
|
|
||||||
components = { a, b, c, d, e }
|
components = { a, b, c, d, e }
|
||||||
|
elseif queryLength == 6 then
|
||||||
|
a = #a
|
||||||
|
b = #b
|
||||||
|
c = #c
|
||||||
|
d = #d
|
||||||
|
e = #e
|
||||||
|
f = #f
|
||||||
|
|
||||||
|
components = { a, b, c, d, e, f }
|
||||||
|
elseif queryLength == 7 then
|
||||||
|
a = #a
|
||||||
|
b = #b
|
||||||
|
c = #c
|
||||||
|
d = #d
|
||||||
|
e = #e
|
||||||
|
f = #f
|
||||||
|
g = #g
|
||||||
|
|
||||||
|
components = { a, b, c, d, e, f, g }
|
||||||
|
elseif queryLength == 8 then
|
||||||
|
a = #a
|
||||||
|
b = #b
|
||||||
|
c = #c
|
||||||
|
d = #d
|
||||||
|
e = #e
|
||||||
|
f = #f
|
||||||
|
g = #g
|
||||||
|
h = #h
|
||||||
|
|
||||||
|
components = { a, b, c, d, e, f, g, h }
|
||||||
else
|
else
|
||||||
for i, component in components do
|
for i, component in components do
|
||||||
components[i] = (#component) :: any
|
components[i] = (#component) :: any
|
||||||
|
@ -1354,7 +1442,7 @@ function World.query(world: World, ...: Component): any
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return queryResult(compatibleArchetypes, components :: any, queryLength, a, b, c, d, e)
|
return queryResult(compatibleArchetypes, components :: any, queryLength, a, b, c, d, e, f, g, h)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function cleanupQueryChanged(hookState)
|
local function cleanupQueryChanged(hookState)
|
||||||
|
|
Loading…
Reference in a new issue