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_INSERT :: fragment
ON_REMOVE :: fragment
ON_DESTROY :: fragment
PHASE :: fragment
AFTER :: fragment
@@ -45,8 +44,9 @@ EXECUTE :: fragment
PROLOGUE :: fragment
EPILOGUE :: fragment
DESTROY_ENTITY_POLICY :: id
REMOVE_FRAGMENT_POLICY :: id
DESTROY_POLICY :: fragment
DESTROY_POLICY_DESTROY_ENTITY :: id
DESTROY_POLICY_REMOVE_FRAGMENT :: id
```
## Functions
@@ -104,6 +104,10 @@ execute :: query -> {execute_state? -> chunk?, entity[]?, integer?}, execute_sta
process :: phase... -> ()
```
```
debug :: boolean -> ()
```
```
spawn_at :: chunk?, 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_insert :: {entity, fragment, component} -> 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
```

View File

@@ -2,15 +2,7 @@
## Backlog
- add manual gc for 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)
- collect unreachable chunks
## After first release

View File

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

File diff suppressed because it is too large Load Diff