Merge branch 'dev'

This commit is contained in:
BlackMATov
2025-03-10 08:14:38 +07:00
4 changed files with 451 additions and 436 deletions

View File

@@ -34,7 +34,6 @@ ON_SET :: fragment
ON_ASSIGN :: fragment ON_ASSIGN :: fragment
ON_INSERT :: fragment ON_INSERT :: fragment
ON_REMOVE :: fragment ON_REMOVE :: fragment
ON_DESTROY :: fragment
PHASE :: fragment PHASE :: fragment
AFTER :: fragment AFTER :: fragment
@@ -45,8 +44,9 @@ EXECUTE :: fragment
PROLOGUE :: fragment PROLOGUE :: fragment
EPILOGUE :: fragment EPILOGUE :: fragment
DESTROY_ENTITY_POLICY :: id DESTROY_POLICY :: fragment
REMOVE_FRAGMENT_POLICY :: id DESTROY_POLICY_DESTROY_ENTITY :: id
DESTROY_POLICY_REMOVE_FRAGMENT :: id
``` ```
## Functions ## Functions
@@ -104,6 +104,10 @@ execute :: query -> {execute_state? -> chunk?, entity[]?, integer?}, execute_sta
process :: phase... -> () process :: phase... -> ()
``` ```
```
debug :: boolean -> ()
```
``` ```
spawn_at :: chunk?, fragment[]?, component[]? -> entity, boolean spawn_at :: chunk?, fragment[]?, component[]? -> entity, boolean
spawn_with :: fragment[]?, component[]? -> entity, boolean spawn_with :: fragment[]?, component[]? -> entity, boolean
@@ -126,7 +130,7 @@ fragment_builder:on_set :: {entity, fragment, component, component?} -> fragment
fragment_builder:on_assign :: {entity, fragment, component, component} -> fragment_builder fragment_builder:on_assign :: {entity, fragment, component, component} -> fragment_builder
fragment_builder:on_insert :: {entity, fragment, component} -> fragment_builder fragment_builder:on_insert :: {entity, fragment, component} -> fragment_builder
fragment_builder:on_remove :: {entity, fragment} -> fragment_builder fragment_builder:on_remove :: {entity, fragment} -> fragment_builder
fragment_builder:on_destroy :: id -> fragment_builder fragment_builder:destroy_policy :: id -> fragment_builder
fragment_builder:build :: fragment, boolean fragment_builder:build :: fragment, boolean
``` ```

View File

@@ -2,15 +2,7 @@
## Backlog ## Backlog
- add manual gc for unreachable chunks - collect unreachable chunks
- add destroing policies (fragments, phases, systems)
- add debug view for chunks with help of NAME fragment traits
## Known issues
- destroying of fragments leave chunks with dead fragments (destroing policies)
- destroying of systems can leave dead systems in the library state (destroying policies)
- destroying of phases can leave dead phases in the library state (destroying policies)
## After first release ## After first release

View File

@@ -2,11 +2,38 @@ require 'develop.unload' 'evolved'
local evo = require 'evolved' local evo = require 'evolved'
evo.debug(true)
do do
local e1, e2 = evo.id(), evo.id() local e1, e2 = evo.id(), evo.id()
assert(e1 ~= e2) assert(e1 ~= e2)
end end
do
local i = evo.id()
for _ = 1, 0xFFE do
local _, v0 = evo.unpack(i)
evo.destroy(i)
i = evo.id()
local _, v1 = evo.unpack(i)
assert(v1 == v0 + 1)
end
do
local _, v = evo.unpack(i)
assert(v == 0xFFF)
end
evo.destroy(i)
i = evo.id()
do
local _, v = evo.unpack(i)
assert(v == 1)
end
end
do do
do do
local i0 = evo.id(0) local i0 = evo.id(0)
@@ -5055,9 +5082,9 @@ do
end end
do do
local id = evo.pack(0xFFFFF, 0x7FF) local id = evo.pack(0xFFFFF, 0xFFF)
local index, version = evo.unpack(id) local index, version = evo.unpack(id)
assert(index == 0xFFFFF and version == 0x7FF) assert(index == 0xFFFFF and version == 0xFFF)
end end
do do
@@ -6726,7 +6753,7 @@ do
local c1 = assert(evo.chunk(f1)) local c1 = assert(evo.chunk(f1))
local c2 = assert(evo.chunk(f2)) local c2 = assert(evo.chunk(f2))
local c12 = assert(evo.chunk(f1, f2)) local c12 = assert(evo.chunk(f1, f2))
assert(evo.set(f1, evo.ON_DESTROY, evo.REMOVE_FRAGMENT_POLICY)) assert(evo.set(f1, evo.DESTROY_POLICY, evo.DESTROY_POLICY_REMOVE_FRAGMENT))
assert(evo.set(f1, f1)) assert(evo.set(f1, f1))
assert(evo.set(f2, f1)) assert(evo.set(f2, f1))
assert(evo.set(f2, f2)) assert(evo.set(f2, f2))
@@ -6760,7 +6787,7 @@ do
local c1 = assert(evo.chunk(f1)) local c1 = assert(evo.chunk(f1))
local c2 = assert(evo.chunk(f2)) local c2 = assert(evo.chunk(f2))
local c12 = assert(evo.chunk(f1, f2)) local c12 = assert(evo.chunk(f1, f2))
assert(evo.set(f1, evo.ON_DESTROY, evo.DESTROY_ENTITY_POLICY)) assert(evo.set(f1, evo.DESTROY_POLICY, evo.DESTROY_POLICY_DESTROY_ENTITY))
assert(evo.set(f1, f1)) assert(evo.set(f1, f1))
assert(evo.set(f2, f1)) assert(evo.set(f2, f1))
assert(evo.set(f2, f2)) assert(evo.set(f2, f2))
@@ -6818,7 +6845,7 @@ do
local f1, f2, f3 = evo.id(3) local f1, f2, f3 = evo.id(3)
local c1 = assert(evo.chunk(f1)) local c1 = assert(evo.chunk(f1))
local c2 = assert(evo.chunk(f2)) local c2 = assert(evo.chunk(f2))
assert(evo.set(f1, evo.ON_DESTROY, evo.REMOVE_FRAGMENT_POLICY)) assert(evo.set(f1, evo.DESTROY_POLICY, evo.DESTROY_POLICY_REMOVE_FRAGMENT))
assert(evo.set(f2, f1)) assert(evo.set(f2, f1))
assert(evo.set(f3, f2)) assert(evo.set(f3, f2))
do do
@@ -6845,7 +6872,7 @@ do
local f1, f2, f3 = evo.id(3) local f1, f2, f3 = evo.id(3)
local c1 = assert(evo.chunk(f1)) local c1 = assert(evo.chunk(f1))
local c2 = assert(evo.chunk(f2)) local c2 = assert(evo.chunk(f2))
assert(evo.set(f1, evo.ON_DESTROY, evo.DESTROY_ENTITY_POLICY)) assert(evo.set(f1, evo.DESTROY_POLICY, evo.DESTROY_POLICY_DESTROY_ENTITY))
assert(evo.set(f2, f1)) assert(evo.set(f2, f1))
assert(evo.set(f3, f2)) assert(evo.set(f3, f2))
do do
@@ -6872,7 +6899,7 @@ do
assert(evo.set(f1, ft)) assert(evo.set(f1, ft))
assert(evo.set(f2, ft)) assert(evo.set(f2, ft))
assert(evo.set(f3, ft)) assert(evo.set(f3, ft))
assert(evo.set(f3, evo.ON_DESTROY, evo.DESTROY_ENTITY_POLICY)) assert(evo.set(f3, evo.DESTROY_POLICY, evo.DESTROY_POLICY_DESTROY_ENTITY))
local qt = evo.query():include(ft):build() local qt = evo.query():include(ft):build()
local c4 = assert(evo.chunk(f4)) local c4 = assert(evo.chunk(f4))
@@ -6907,7 +6934,7 @@ end
do do
local f1 = evo.id() local f1 = evo.id()
assert(evo.set(f1, evo.ON_DESTROY, evo.DESTROY_ENTITY_POLICY)) assert(evo.set(f1, evo.DESTROY_POLICY, evo.DESTROY_POLICY_DESTROY_ENTITY))
assert(evo.set(f1, f1, f1)) assert(evo.set(f1, f1, f1))
local remove_count = 0 local remove_count = 0
@@ -6933,7 +6960,7 @@ end
do do
local f1 = evo.id() local f1 = evo.id()
assert(evo.set(f1, evo.ON_DESTROY, evo.REMOVE_FRAGMENT_POLICY)) assert(evo.set(f1, evo.DESTROY_POLICY, evo.DESTROY_POLICY_REMOVE_FRAGMENT))
assert(evo.set(f1, f1, f1)) assert(evo.set(f1, f1, f1))
local remove_count = 0 local remove_count = 0
@@ -7016,7 +7043,7 @@ do
local f1, f2 = evo.id(2) local f1, f2 = evo.id(2)
evo.set(f1, f1) evo.set(f1, f1)
evo.set(f2, f1) evo.set(f2, f1)
evo.set(f1, evo.ON_DESTROY, evo.DESTROY_ENTITY_POLICY) evo.set(f1, evo.DESTROY_POLICY, evo.DESTROY_POLICY_DESTROY_ENTITY)
assert(evo.destroy(f1)) assert(evo.destroy(f1))
assert(not evo.is_alive(f1)) assert(not evo.is_alive(f1))
assert(not evo.is_alive(f2)) assert(not evo.is_alive(f2))
@@ -7026,7 +7053,7 @@ do
local f1, f2 = evo.id(2) local f1, f2 = evo.id(2)
evo.set(f1, f1) evo.set(f1, f1)
evo.set(f2, f1) evo.set(f2, f1)
evo.set(f1, evo.ON_DESTROY, evo.REMOVE_FRAGMENT_POLICY) evo.set(f1, evo.DESTROY_POLICY, evo.DESTROY_POLICY_REMOVE_FRAGMENT)
assert(evo.destroy(f1)) assert(evo.destroy(f1))
assert(not evo.is_alive(f1)) assert(not evo.is_alive(f1))
assert(evo.is_alive(f2) and evo.is_empty(f2)) assert(evo.is_alive(f2) and evo.is_empty(f2))
@@ -7036,7 +7063,7 @@ end
do do
local f1, f2 = evo.id(2) local f1, f2 = evo.id(2)
evo.set(f1, evo.ON_DESTROY, evo.DESTROY_ENTITY_POLICY) evo.set(f1, evo.DESTROY_POLICY, evo.DESTROY_POLICY_DESTROY_ENTITY)
local e12a = evo.entity():set(f1, 1):set(f2, 2):build() local e12a = evo.entity():set(f1, 1):set(f2, 2):build()
local e12b = evo.entity():set(f1, 3):set(f2, 4):build() local e12b = evo.entity():set(f1, 3):set(f2, 4):build()
@@ -7081,7 +7108,7 @@ do
assert(c12, c123) assert(c12, c123)
end end
evo.set(f1, evo.ON_DESTROY, evo.REMOVE_FRAGMENT_POLICY) evo.set(f1, evo.DESTROY_POLICY, evo.DESTROY_POLICY_REMOVE_FRAGMENT)
local e12a = evo.entity():set(f1, 1):set(f2, 2):build() local e12a = evo.entity():set(f1, 1):set(f2, 2):build()
local e12b = evo.entity():set(f1, 3):set(f2, 4):build() local e12b = evo.entity():set(f1, 3):set(f2, 4):build()
@@ -7112,12 +7139,12 @@ do
local fb = evo.fragment() local fb = evo.fragment()
local f1 = fb:build() local f1 = fb:build()
local f2 = fb:on_destroy(evo.DESTROY_ENTITY_POLICY):build() local f2 = fb:destroy_policy(evo.DESTROY_POLICY_DESTROY_ENTITY):build()
local f3 = fb:on_destroy(evo.REMOVE_FRAGMENT_POLICY):build() local f3 = fb:destroy_policy(evo.DESTROY_POLICY_REMOVE_FRAGMENT):build()
assert(evo.get(f1, evo.ON_DESTROY) == nil) assert(evo.get(f1, evo.DESTROY_POLICY) == nil)
assert(evo.get(f2, evo.ON_DESTROY) == evo.DESTROY_ENTITY_POLICY) assert(evo.get(f2, evo.DESTROY_POLICY) == evo.DESTROY_POLICY_DESTROY_ENTITY)
assert(evo.get(f3, evo.ON_DESTROY) == evo.REMOVE_FRAGMENT_POLICY) assert(evo.get(f3, evo.DESTROY_POLICY) == evo.DESTROY_POLICY_REMOVE_FRAGMENT)
end end
do do

File diff suppressed because it is too large Load Diff