Mercurial > games > semicongine
comparison src/zamikongine/thing.nim @ 28:b1b05d4efb52
big refactoring, part1
| author | Sam <sam@basx.dev> |
|---|---|
| date | Sat, 14 Jan 2023 14:08:00 +0700 |
| parents | b55d6ecde79d |
| children | 9edca5dc4e93 |
comparison
equal
deleted
inserted
replaced
| 27:8cb2d96ac28e | 28:b1b05d4efb52 |
|---|---|
| 1 {.experimental: "codeReordering".} | 1 {.experimental: "codeReordering".} |
| 2 import std/times | |
| 2 | 3 |
| 3 type | 4 type |
| 4 Part* = object of RootObj | 5 Part* = object of RootObj |
| 5 thing: ref Thing | 6 thing: ref Thing |
| 6 | 7 |
| 7 Thing* = object of RootObj | 8 Thing* = object of RootObj |
| 8 parent*: ref Thing | 9 parent*: ref Thing |
| 9 children*: seq[ref Thing] | 10 children*: seq[ref Thing] |
| 10 parts*: seq[ref Part] | 11 parts*: seq[ref Part] |
| 11 | 12 |
| 13 method update*(thing: ref Thing, dt: Duration) {.base.} = discard | |
| 14 | |
| 12 iterator partsOfType*[T: ref Part](root: ref Thing): T = | 15 iterator partsOfType*[T: ref Part](root: ref Thing): T = |
| 13 var queue = @[root] | 16 var queue = @[root] |
| 14 while queue.len > 0: | 17 while queue.len > 0: |
| 15 let thing = queue.pop | 18 let thing = queue.pop |
| 16 for part in thing.parts: | 19 for part in thing.parts: |
| 17 if part of T: | 20 if part of T: |
| 18 yield T(part) | 21 yield T(part) |
| 19 for child in thing.children: | 22 for child in thing.children: |
| 20 queue.insert(child, 0) | 23 queue.insert(child, 0) |
| 24 | |
| 25 iterator allEntities*(root: ref Thing): ref Thing = | |
| 26 var queue = @[root] | |
| 27 while queue.len > 0: | |
| 28 let next = queue.pop | |
| 29 for child in next.children: | |
| 30 queue.add child | |
| 31 yield next |
