mirror of
https://github.com/BlackMATov/evolved.lua.git
synced 2025-12-14 12:10:23 +07:00
defer component construction
This commit is contained in:
@@ -555,6 +555,8 @@ end
|
||||
do
|
||||
local f1, f2, f3 = evo.id(3)
|
||||
|
||||
evo.set(f1, evo.DEFAULT, 42)
|
||||
|
||||
local e1, e2, e3, e4 = evo.id(4)
|
||||
|
||||
assert(evo.insert(e1, f3, 44))
|
||||
@@ -570,7 +572,7 @@ do
|
||||
assert(evo.defer())
|
||||
assert(not evo.defer())
|
||||
|
||||
evo.set(e1, f1, 42)
|
||||
evo.set(e1, f1)
|
||||
evo.set(e1, f2, 43)
|
||||
evo.remove(e2, f1, f2)
|
||||
evo.assign(e2, f3, 48)
|
||||
|
||||
88
evolved.lua
88
evolved.lua
@@ -655,23 +655,23 @@ local __defer_ops = {
|
||||
[__defer_op.set] = function(bytes, index)
|
||||
local entity = bytes[index + 0]
|
||||
local fragment = bytes[index + 1]
|
||||
local component = bytes[index + 2]
|
||||
evolved.set(entity, fragment, component)
|
||||
return 3
|
||||
local argument_count = bytes[index + 2]
|
||||
evolved.set(entity, fragment, __lua_unpack(bytes, index + 3, index + 2 + argument_count))
|
||||
return 3 + argument_count
|
||||
end,
|
||||
[__defer_op.assign] = function(bytes, index)
|
||||
local entity = bytes[index + 0]
|
||||
local fragment = bytes[index + 1]
|
||||
local component = bytes[index + 2]
|
||||
evolved.assign(entity, fragment, component)
|
||||
return 3
|
||||
local argument_count = bytes[index + 2]
|
||||
evolved.assign(entity, fragment, __lua_unpack(bytes, index + 3, index + 2 + argument_count))
|
||||
return 3 + argument_count
|
||||
end,
|
||||
[__defer_op.insert] = function(bytes, index)
|
||||
local entity = bytes[index + 0]
|
||||
local fragment = bytes[index + 1]
|
||||
local component = bytes[index + 2]
|
||||
evolved.insert(entity, fragment, component)
|
||||
return 3
|
||||
local argument_count = bytes[index + 2]
|
||||
evolved.insert(entity, fragment, __lua_unpack(bytes, index + 3, index + 2 + argument_count))
|
||||
return 3 + argument_count
|
||||
end,
|
||||
[__defer_op.remove] = function(bytes, index)
|
||||
local entity = bytes[index + 0]
|
||||
@@ -726,51 +726,63 @@ end
|
||||
---@param fragment evolved.fragment
|
||||
---@param ... any component arguments
|
||||
local function __defer_set(entity, fragment, ...)
|
||||
local component = __construct(entity, fragment, ...)
|
||||
|
||||
local length = __defer_length
|
||||
local bytecode = __defer_bytecode
|
||||
|
||||
local argument_count = select('#', ...)
|
||||
|
||||
bytecode[length + 1] = __defer_op.set
|
||||
bytecode[length + 2] = entity
|
||||
bytecode[length + 3] = fragment
|
||||
bytecode[length + 4] = component
|
||||
bytecode[length + 4] = argument_count
|
||||
|
||||
__defer_length = length + 4
|
||||
for i = 1, argument_count do
|
||||
bytecode[length + 4 + i] = select(i, ...)
|
||||
end
|
||||
|
||||
__defer_length = length + 4 + argument_count
|
||||
end
|
||||
|
||||
---@param entity evolved.entity
|
||||
---@param fragment evolved.fragment
|
||||
---@param ... any component arguments
|
||||
local function __defer_assign(entity, fragment, ...)
|
||||
local component = __construct(entity, fragment, ...)
|
||||
|
||||
local length = __defer_length
|
||||
local bytecode = __defer_bytecode
|
||||
|
||||
local argument_count = select('#', ...)
|
||||
|
||||
bytecode[length + 1] = __defer_op.assign
|
||||
bytecode[length + 2] = entity
|
||||
bytecode[length + 3] = fragment
|
||||
bytecode[length + 4] = component
|
||||
bytecode[length + 4] = argument_count
|
||||
|
||||
__defer_length = length + 4
|
||||
for i = 1, argument_count do
|
||||
bytecode[length + 4 + i] = select(i, ...)
|
||||
end
|
||||
|
||||
__defer_length = length + 4 + argument_count
|
||||
end
|
||||
|
||||
---@param entity evolved.entity
|
||||
---@param fragment evolved.fragment
|
||||
---@param ... any component arguments
|
||||
local function __defer_insert(entity, fragment, ...)
|
||||
local component = __construct(entity, fragment, ...)
|
||||
|
||||
local length = __defer_length
|
||||
local bytecode = __defer_bytecode
|
||||
|
||||
local argument_count = select('#', ...)
|
||||
|
||||
bytecode[length + 1] = __defer_op.insert
|
||||
bytecode[length + 2] = entity
|
||||
bytecode[length + 3] = fragment
|
||||
bytecode[length + 4] = component
|
||||
bytecode[length + 4] = argument_count
|
||||
|
||||
__defer_length = length + 4
|
||||
for i = 1, argument_count do
|
||||
bytecode[length + 4 + i] = select(i, ...)
|
||||
end
|
||||
|
||||
__defer_length = length + 4 + argument_count
|
||||
end
|
||||
|
||||
---@param entity evolved.entity
|
||||
@@ -1002,10 +1014,8 @@ end
|
||||
---@return boolean is_set
|
||||
---@return boolean is_deferred
|
||||
function evolved.set(entity, fragment, ...)
|
||||
local component = __construct(entity, fragment, ...)
|
||||
|
||||
if __defer_depth > 0 then
|
||||
__defer_set(entity, fragment, component)
|
||||
__defer_set(entity, fragment, ...)
|
||||
return false, true
|
||||
end
|
||||
|
||||
@@ -1024,16 +1034,19 @@ function evolved.set(entity, fragment, ...)
|
||||
if old_chunk == new_chunk then
|
||||
local old_chunk_fragment_components = old_chunk.__components[fragment]
|
||||
local old_component = old_chunk_fragment_components[old_place]
|
||||
old_chunk_fragment_components[old_place] = component
|
||||
__on_assign(entity, fragment, component, old_component)
|
||||
local new_component = __construct(entity, fragment, ...)
|
||||
old_chunk_fragment_components[old_place] = new_component
|
||||
__on_assign(entity, fragment, new_component, old_component)
|
||||
return true, false
|
||||
end
|
||||
|
||||
local new_component = __construct(entity, fragment, ...)
|
||||
|
||||
local new_chunk_entities = new_chunk.__entities
|
||||
local new_chunk_components = new_chunk.__components
|
||||
|
||||
new_chunk_entities[new_place] = entity
|
||||
new_chunk_components[fragment][new_place] = component
|
||||
new_chunk_components[fragment][new_place] = new_component
|
||||
|
||||
if old_chunk then
|
||||
local old_chunk_components = old_chunk.__components
|
||||
@@ -1051,7 +1064,7 @@ function evolved.set(entity, fragment, ...)
|
||||
|
||||
__structural_changes = __structural_changes + 1
|
||||
|
||||
__on_insert(entity, fragment, component)
|
||||
__on_insert(entity, fragment, new_component)
|
||||
return true, false
|
||||
end
|
||||
|
||||
@@ -1061,10 +1074,8 @@ end
|
||||
---@return boolean is_assigned
|
||||
---@return boolean is_deferred
|
||||
function evolved.assign(entity, fragment, ...)
|
||||
local component = __construct(entity, fragment, ...)
|
||||
|
||||
if __defer_depth > 0 then
|
||||
__defer_assign(entity, fragment, component)
|
||||
__defer_assign(entity, fragment, ...)
|
||||
return false, true
|
||||
end
|
||||
|
||||
@@ -1083,8 +1094,9 @@ function evolved.assign(entity, fragment, ...)
|
||||
|
||||
local old_chunk_fragment_components = old_chunk.__components[fragment]
|
||||
local old_component = old_chunk_fragment_components[old_place]
|
||||
old_chunk_fragment_components[old_place] = component
|
||||
__on_assign(entity, fragment, component, old_component)
|
||||
local new_component = __construct(entity, fragment, ...)
|
||||
old_chunk_fragment_components[old_place] = new_component
|
||||
__on_assign(entity, fragment, new_component, old_component)
|
||||
return true, false
|
||||
end
|
||||
|
||||
@@ -1094,10 +1106,8 @@ end
|
||||
---@return boolean is_inserted
|
||||
---@return boolean is_deferred
|
||||
function evolved.insert(entity, fragment, ...)
|
||||
local component = __construct(entity, fragment, ...)
|
||||
|
||||
if __defer_depth > 0 then
|
||||
__defer_insert(entity, fragment, component)
|
||||
__defer_insert(entity, fragment, ...)
|
||||
return false, true
|
||||
end
|
||||
|
||||
@@ -1117,11 +1127,13 @@ function evolved.insert(entity, fragment, ...)
|
||||
return false, false
|
||||
end
|
||||
|
||||
local new_component = __construct(entity, fragment, ...)
|
||||
|
||||
local new_chunk_entities = new_chunk.__entities
|
||||
local new_chunk_components = new_chunk.__components
|
||||
|
||||
new_chunk_entities[new_place] = entity
|
||||
new_chunk_components[fragment][new_place] = component
|
||||
new_chunk_components[fragment][new_place] = new_component
|
||||
|
||||
if old_chunk then
|
||||
local old_chunk_components = old_chunk.__components
|
||||
@@ -1139,7 +1151,7 @@ function evolved.insert(entity, fragment, ...)
|
||||
|
||||
__structural_changes = __structural_changes + 1
|
||||
|
||||
__on_insert(entity, fragment, component)
|
||||
__on_insert(entity, fragment, new_component)
|
||||
return true, false
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user