update orderin
This commit is contained in:
parent
938fd70921
commit
fe40073407
2 changed files with 17 additions and 16 deletions
|
@ -19,7 +19,7 @@ type DrawDAG struct {
|
|||
Hides
|
||||
|
||||
*dag
|
||||
boxCache map[DrawBoxer]geom.Box
|
||||
boxCache map[DrawBoxer]geom.Box // used to find components that moved
|
||||
chunks map[image.Point]drawerSet // chunk coord -> drawers with bounding rects intersecting chunk
|
||||
chunksRev map[DrawBoxer]image.Rectangle // comopnent -> rectangle of chunk coords
|
||||
game *Game
|
||||
|
@ -45,6 +45,7 @@ func (d *DrawDAG) DrawAll(screen *ebiten.Image, opts *ebiten.DrawImageOptions) {
|
|||
},
|
||||
}
|
||||
// Draw everything in d.dag, where not hidden (itself or any parent)
|
||||
// TODO: handle descendant DrawLayers
|
||||
d.dag.topIterate(func(x Drawer) {
|
||||
// Is d hidden itself?
|
||||
if h, ok := x.(Hider); ok && h.Hidden() {
|
||||
|
@ -88,6 +89,7 @@ func (d *DrawDAG) DrawAll(screen *ebiten.Image, opts *ebiten.DrawImageOptions) {
|
|||
})
|
||||
}
|
||||
|
||||
// Prepare adds all subcomponents to the DAG.
|
||||
func (d *DrawDAG) Prepare(game *Game) error {
|
||||
d.dag = newDAG()
|
||||
d.boxCache = make(map[DrawBoxer]geom.Box)
|
||||
|
@ -109,7 +111,8 @@ func (d *DrawDAG) Scan() []interface{} { return d.Components }
|
|||
func (d *DrawDAG) Update() error {
|
||||
// Re-evaluate bounding boxes for all descendants. If a box has changed,
|
||||
// fix up the edges by removing and re-adding the vertex.
|
||||
// TODO: ensure this happens after updates for the descendants.
|
||||
// Thanks once again to postorder traversal, this happens after all
|
||||
// descendant updates.
|
||||
var readd []DrawBoxer
|
||||
for db, bb := range d.boxCache {
|
||||
nbb := db.BoundingBox()
|
||||
|
|
|
@ -81,17 +81,20 @@ func (g *Game) Update() error {
|
|||
}
|
||||
|
||||
// Update everything that is not disabled.
|
||||
// TODO: do it in a fixed order? map essentially randomises iteration order
|
||||
for u := range g.Query(g, UpdaterType) {
|
||||
return PostorderWalk(g, func(c, _ interface{}) error {
|
||||
// Skip g (note g satisfies Updater, so this would infinitely recurse)
|
||||
if u == g {
|
||||
continue
|
||||
if c == g {
|
||||
return nil
|
||||
}
|
||||
u, ok := c.(Updater)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Is u disabled itself?
|
||||
if d, ok := u.(Disabler); ok && d.Disabled() {
|
||||
cache[u] = true
|
||||
continue
|
||||
return nil
|
||||
}
|
||||
|
||||
// Walk up g.par to find the nearest state in accum.
|
||||
|
@ -117,19 +120,14 @@ func (g *Game) Update() error {
|
|||
|
||||
// Skip updating if disabled.
|
||||
if st {
|
||||
continue
|
||||
}
|
||||
|
||||
if err := u.(Updater).Update(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Sort the draw list (on every frame - this isn't as bad as it sounds)
|
||||
//g.drawList.topsort(g.Projection)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Update
|
||||
return u.Update()
|
||||
})
|
||||
}
|
||||
|
||||
// Ident returns "__GAME__".
|
||||
func (g *Game) Ident() string { return "__GAME__" }
|
||||
|
||||
|
|
Loading…
Reference in a new issue