minor cleanups

This commit is contained in:
Josh Deprez 2021-09-20 14:36:00 +10:00
parent f1adaead81
commit a9d6c8827f
2 changed files with 18 additions and 10 deletions

View file

@ -131,15 +131,18 @@ func (d *DrawDAG) Update() error {
func (d *DrawDAG) Add(x DrawBoxer) {
πsign := d.proj.Sign()
// Ensure vertex is present
d.dag.addVertex(x)
// Update the box cache
bb := x.BoundingBox()
d.boxCache[x] = bb
xb := x.BoundingBox()
d.boxCache[x] = xb
// Update the reverse chunk map
br := bb.BoundingRect(d.proj)
xbr := xb.BoundingRect(d.proj)
revr := image.Rectangle{
Min: br.Min.Div(d.ChunkSize),
Max: br.Max.Sub(image.Pt(1, 1)).Div(d.ChunkSize),
Min: xbr.Min.Div(d.ChunkSize),
Max: xbr.Max.Sub(image.Pt(1, 1)).Div(d.ChunkSize),
}
d.chunksRev[x] = revr
@ -167,14 +170,14 @@ func (d *DrawDAG) Add(x DrawBoxer) {
y := c.(DrawBoxer)
// Bounding rectangle overlap test
// No overlap, no edge.
if ybr := y.BoundingBox().BoundingRect(d.proj); !br.Overlaps(ybr) {
if ybr := y.BoundingBox().BoundingRect(d.proj); !xbr.Overlaps(ybr) {
continue
}
switch {
case drawOrderConstraint(y, x, πsign):
d.dag.addEdge(y, x)
case drawOrderConstraint(x, y, πsign):
d.dag.addEdge(x, y)
case drawOrderConstraint(y, x, πsign):
d.dag.addEdge(y, x)
}
}
}
@ -291,6 +294,11 @@ func (d *dag) removeEdge(u, v Drawer) {
}
*/
// addVertex ensures the vertex is present, even if there are no edges.
func (d *dag) addVertex(v Drawer) {
d.all[v] = struct{}{}
}
// removeVertex removes all in and out edges associated with v in O(degree(v)).
func (d *dag) removeVertex(v Drawer) {
for u := range d.in[v] {

View file

@ -20,8 +20,6 @@ func (d *DrawDFS) DrawAll(screen *ebiten.Image, opts *ebiten.DrawImageOptions) {
}
}
func (d *DrawDFS) Scan() []interface{} { return d.Components }
func (d *DrawDFS) draw(component interface{}, screen *ebiten.Image, opts ebiten.DrawImageOptions) {
// Hidden? stop drawing
if h, ok := component.(Hider); ok && h.Hidden() {
@ -48,3 +46,5 @@ func (d *DrawDFS) draw(component interface{}, screen *ebiten.Image, opts ebiten.
}
}
}
func (d *DrawDFS) Scan() []interface{} { return d.Components }