Zoom Improvements

* Doodad outline while dragging is now sized properly for the zoom level
* Make doodad hitboxes for Actor/Link Tool more accurate while zoomed
* Fix chunks low on the level not loading while zoomed in
* Fix Link lines drawn between doodads while zoomed - they point to the
  correct position and their DrawLine calls have been optimized so they
  don't lag out the level when lots of them are drawn at once.
This commit is contained in:
Noah 2021-09-12 15:26:51 -07:00
parent 6f5bd910c8
commit fd730483b0
5 changed files with 49 additions and 28 deletions

14
go.mod
View File

@ -16,22 +16,10 @@ require (
github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac
github.com/tomnomnom/xtermcolor v0.0.0-20160428124646-b78803f00a7e // indirect github.com/tomnomnom/xtermcolor v0.0.0-20160428124646-b78803f00a7e // indirect
github.com/urfave/cli/v2 v2.3.0 github.com/urfave/cli/v2 v2.3.0
github.com/veandco/go-sdl2 v0.4.8 github.com/veandco/go-sdl2 v0.4.10
github.com/vmihailenco/msgpack v3.3.3+incompatible github.com/vmihailenco/msgpack v3.3.3+incompatible
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d
google.golang.org/appengine v1.6.7 // indirect google.golang.org/appengine v1.6.7 // indirect
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
gopkg.in/sourcemap.v1 v1.0.5 // indirect gopkg.in/sourcemap.v1 v1.0.5 // indirect
) )
// replace git.kirsle.net/go/render => /home/kirsle/SketchyMaze/deps/render
// replace git.kirsle.net/go/ui => /home/kirsle/SketchyMaze/deps/ui
// replace git.kirsle.net/go/audio => /home/kirsle/SketchyMaze/deps/audio
// replace git.kirsle.net/go/render => /run/build/sketchymaze/deps/render
// replace git.kirsle.net/go/ui => /run/build/sketchymaze/deps/ui
// replace git.kirsle.net/go/audio => /run/build/sketchymaze/deps/audio

View File

@ -39,10 +39,16 @@ func (u *EditorUI) startDragActor(doodad *doodads.Doodad, actor *level.Actor) {
} }
} }
// Size and scale this doodad according to the zoom level.
size := doodad.Rect()
size.W = u.Canvas.ZoomMultiply(size.W)
size.H = u.Canvas.ZoomMultiply(size.H)
// Create the canvas to render on the mouse cursor. // Create the canvas to render on the mouse cursor.
drawing := uix.NewCanvas(doodad.Layers[0].Chunker.Size, false) drawing := uix.NewCanvas(doodad.Layers[0].Chunker.Size, false)
drawing.LoadDoodad(doodad) drawing.LoadDoodad(doodad)
drawing.Resize(doodad.Rect()) drawing.Resize(size)
drawing.Zoom = u.Canvas.Zoom
drawing.SetBackground(render.RGBA(0, 0, 1, 0)) // TODO: invisible becomes white drawing.SetBackground(render.RGBA(0, 0, 1, 0)) // TODO: invisible becomes white
drawing.MaskColor = balance.DragColor // blueprint effect drawing.MaskColor = balance.DragColor // blueprint effect
u.DraggableActor = &DraggableActor{ u.DraggableActor = &DraggableActor{

View File

@ -316,8 +316,8 @@ func (w *Canvas) loopEditable(ev *event.State) error {
scrollBias.Y = w.ZoomDivide(scrollBias.Y) scrollBias.Y = w.ZoomDivide(scrollBias.Y)
} }
box := render.Rect{ box := render.Rect{
X: actor.Actor.Point.X - P.X - scrollBias.X, X: actor.Actor.Point.X - scrollBias.X - w.ZoomDivide(P.X),
Y: actor.Actor.Point.Y - P.Y - scrollBias.Y, Y: actor.Actor.Point.Y - scrollBias.Y - w.ZoomDivide(P.Y),
W: actor.Canvas.Size().W, W: actor.Canvas.Size().W,
H: actor.Canvas.Size().H, H: actor.Canvas.Size().H,
} }
@ -378,8 +378,8 @@ func (w *Canvas) loopEditable(ev *event.State) error {
scrollBias.Y = w.ZoomDivide(scrollBias.Y) scrollBias.Y = w.ZoomDivide(scrollBias.Y)
} }
box := render.Rect{ box := render.Rect{
X: actor.Actor.Point.X - P.X - scrollBias.X, X: actor.Actor.Point.X - scrollBias.X - w.ZoomDivide(P.X),
Y: actor.Actor.Point.Y - P.Y - scrollBias.Y, Y: actor.Actor.Point.Y - scrollBias.Y - w.ZoomDivide(P.Y),
W: actor.Canvas.Size().W, W: actor.Canvas.Size().W,
H: actor.Canvas.Size().H, H: actor.Canvas.Size().H,
} }

View File

@ -43,10 +43,12 @@ func (w *Canvas) Present(e render.Engine, p render.Point) {
// Zoomed out (level go tiny) // Zoomed out (level go tiny)
// TODO: seems unstable as shit on Zoom In?? // TODO: seems unstable as shit on Zoom In??
Viewport.W = w.ZoomDivide(Viewport.W) Viewport.W = w.ZoomDivide(Viewport.W)
Viewport.H = w.ZoomDivide(Viewport.W) Viewport.H = w.ZoomDivide(Viewport.H)
if w.Zoom > 0 { if w.Zoom > 0 {
Viewport.X = w.ZoomDivide(w.chunks.Size) // Viewport.X = w.ZoomDivide(w.chunks.Size)
Viewport.Y = w.ZoomDivide(w.chunks.Size) // Viewport.Y = w.ZoomDivide(w.chunks.Size)
Viewport.X = w.ZoomDivide(Viewport.X)
Viewport.Y = w.ZoomDivide(Viewport.Y)
} }
} }
@ -73,6 +75,7 @@ func (w *Canvas) Present(e render.Engine, p render.Point) {
// Viewport.X = w.ZoomDivide(w.chunks.Size) // Viewport.X = w.ZoomDivide(w.chunks.Size)
// Viewport.Y = w.ZoomDivide(w.chunks.Size) // Viewport.Y = w.ZoomDivide(w.chunks.Size)
// } // }
// Seems resolved now?
// Get the chunks in the viewport and cache their textures. // Get the chunks in the viewport and cache their textures.
for coord := range w.chunks.IterViewportChunks(Viewport) { for coord := range w.chunks.IterViewportChunks(Viewport) {

View File

@ -186,9 +186,14 @@ func (w *Canvas) presentActorLinks(e render.Engine) {
bS = actorMap[linkID].Size() bS = actorMap[linkID].Size()
) )
// Adapt actor positions per the zoom level.
aP.X = w.ZoomMultiply(aP.X)
aP.Y = w.ZoomMultiply(aP.Y)
bP.X = w.ZoomMultiply(bP.X)
bP.Y = w.ZoomMultiply(bP.Y)
// Draw a line connecting the centers of each actor together. // Draw a line connecting the centers of each actor together.
stroke := drawtool.NewStroke(drawtool.Line, color) stroke := drawtool.NewStroke(drawtool.Line, color)
stroke.Thickness = 1
stroke.PointA = render.Point{ stroke.PointA = render.Point{
X: aP.X + (aS.W / 2), X: aP.X + (aS.W / 2),
Y: aP.Y + (aS.H / 2), Y: aP.Y + (aS.H / 2),
@ -275,13 +280,36 @@ func (w *Canvas) DrawStrokes(e render.Engine, strokes []*drawtool.Stroke) {
} }
} }
} else { } else {
var color = stroke.Color
if balance.DebugCanvasStrokeColor != render.Invisible {
color = balance.DebugCanvasStrokeColor
}
// TODO: iterating all the points is very costly!
// Strokes don't properly render your Pattern anyway (glitchy mess),
// so let them just be simple DrawLine etc. calls.
// This optimization specifically speeds up the Actor Link Lines.
if stroke.Shape == drawtool.Line {
var (
pointA = render.Point{
X: P.X + w.Scroll.X + w.BoxThickness(1) + stroke.PointA.X,
Y: P.Y + w.Scroll.Y + w.BoxThickness(1) + stroke.PointA.Y,
}
pointB = render.Point{
X: P.X + w.Scroll.X + w.BoxThickness(1) + stroke.PointB.X,
Y: P.Y + w.Scroll.Y + w.BoxThickness(1) + stroke.PointB.Y,
}
)
e.DrawLine(color, pointA, pointB)
continue
}
for point := range stroke.IterPoints() { for point := range stroke.IterPoints() {
if !point.Inside(VP) { if !point.Inside(VP) {
continue continue
} }
// Does the swatch have a pattern to sample? // Does the swatch have a pattern to sample?
color := stroke.Color
if stroke.Pattern != "" { if stroke.Pattern != "" {
color = pattern.SampleColor(stroke.Pattern, color, point) color = pattern.SampleColor(stroke.Pattern, color, point)
} }
@ -291,12 +319,8 @@ func (w *Canvas) DrawStrokes(e render.Engine, strokes []*drawtool.Stroke) {
Y: P.Y + w.Scroll.Y + w.BoxThickness(1) + point.Y, Y: P.Y + w.Scroll.Y + w.BoxThickness(1) + point.Y,
} }
if balance.DebugCanvasStrokeColor != render.Invisible {
e.DrawPoint(balance.DebugCanvasStrokeColor, dest)
} else {
e.DrawPoint(color, dest) e.DrawPoint(color, dest)
} }
} }
} }
} }
}