-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathhook.go
69 lines (55 loc) · 1.66 KB
/
hook.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package ecs
type OnAdd struct {
compId CompId
}
var _onAddId = NewEvent[OnAdd]()
func (p OnAdd) EventId() EventId {
return _onAddId
}
//--------------------------------------------------------------------------------
func (e *archEngine) runFinalizedHooks(id Id) {
// Run, then clear add hooks
for i := range e.finalizeOnAdd {
e.runAddHook(id, e.finalizeOnAdd[i])
}
e.finalizeOnAdd = e.finalizeOnAdd[:0]
// TODO: Run other hooks?
}
func (e *archEngine) runAddHook(id Id, compId CompId) {
current := e.onAddHooks[compId]
if current == nil {
return
}
current.Run(id, OnAdd{compId})
}
// Marks all provided components
func markComponents(slice []CompId, comp ...Component) []CompId {
for i := range comp {
slice = append(slice, comp[i].CompId())
}
return slice
}
// Marks the provided components, excluding ones that are already set by the old mask
func markNewComponents(slice []CompId, oldMask archetypeMask, comp ...Component) []CompId {
for i := range comp {
compId := comp[i].CompId()
if oldMask.hasComponent(compId) {
continue // Skip: Component already set in oldMask
}
slice = append(slice, compId)
}
return slice
}
func markComponentMask(slice []CompId, mask archetypeMask) []CompId {
// TODO: Optimization: Technically this only has to loop to the max registered compId, not the max possible. Also see optimization note in archEngine
for compId := CompId(0); compId <= maxComponentId; compId++ {
if mask.hasComponent(compId) {
slice = append(slice, compId)
}
}
return slice
}
func markComponentDiff(slice []CompId, newMask, oldMask archetypeMask) []CompId {
mask := newMask.bitwiseClear(oldMask)
return markComponentMask(slice, mask)
}