ichigo/engine/drawdfs.go

63 lines
1.5 KiB
Go
Raw Normal View History

2021-09-20 12:18:03 +10:00
package engine
import "github.com/hajimehoshi/ebiten/v2"
var _ interface {
Drawer
DrawManager
Scanner
} = &DrawDFS{}
2021-09-20 12:18:03 +10:00
// DrawDFS is a DrawLayer that does not add any structure. Components are
// drawn in the order in which they are encountered by a depth-first search
// through the game tree, without any extra sorting based on Z values or
// consideration for DrawOrderer).
type DrawDFS struct {
2021-09-22 14:37:00 +10:00
Child interface{}
2021-09-20 12:18:03 +10:00
Hides
}
func (d *DrawDFS) Draw(screen *ebiten.Image, opts *ebiten.DrawImageOptions) {
2021-09-20 12:18:03 +10:00
if d.Hidden() {
return
}
2021-09-22 14:37:00 +10:00
d.draw(d.Child, screen, *opts)
2021-09-20 12:18:03 +10:00
}
// exists to satisfy interface
func (DrawDFS) ManagesDrawingSubcomponents() {}
2021-09-20 12:18:03 +10:00
func (d *DrawDFS) draw(component interface{}, screen *ebiten.Image, opts ebiten.DrawImageOptions) {
// Hidden? stop drawing
if h, ok := component.(Hider); ok && h.Hidden() {
return
}
// Has a transform? apply to opts
if tf, ok := component.(Transformer); ok {
opts = concatOpts(tf.Transform(), opts)
}
// Does it draw itself? Draw
if dr, ok := component.(Drawer); ok {
dr.Draw(screen, &opts)
}
// Is it a DrawManager? return early (don't recurse)
if _, ok := component.(DrawManager); ok {
return
}
2021-09-20 12:18:03 +10:00
// Has subcomponents? recurse
if sc, ok := component.(Scanner); ok {
2021-09-22 15:48:02 +10:00
scv := func(x interface{}) error {
d.draw(x, screen, opts)
return nil
2021-09-20 12:18:03 +10:00
}
2021-09-22 15:48:02 +10:00
sc.Scan(scv)
2021-09-20 12:18:03 +10:00
}
}
2021-09-22 14:37:00 +10:00
2021-09-22 15:55:38 +10:00
// Scan visits d.Child.
2021-09-22 15:48:02 +10:00
func (d *DrawDFS) Scan(visit func(interface{}) error) error {
return visit(d.Child)
}
2021-09-23 14:17:18 +10:00
func (d *DrawDFS) String() string { return "DrawDFS" }