From 4db1ed716b5c4f5cfbb2e15b9a8ca65284b11afb Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 9 Jul 2021 13:19:05 -0400 Subject: [PATCH] Add 2D pixel-based demo --- examples/canvas/main.go | 88 +++++++++++++++++++++++++++++++++++++++++ examples/go.mod | 11 ++++++ examples/go.sum | 24 +++++++++++ 3 files changed, 123 insertions(+) create mode 100644 examples/canvas/main.go create mode 100644 examples/go.mod create mode 100644 examples/go.sum diff --git a/examples/canvas/main.go b/examples/canvas/main.go new file mode 100644 index 0000000..cafa15d --- /dev/null +++ b/examples/canvas/main.go @@ -0,0 +1,88 @@ +package main + +import ( + "time" + + "github.com/charmbracelet/harmonica" + "github.com/h8gi/canvas" +) + +const ( + width = 1024 + height = 768 + fps = 60 + bgColor = "#111111" +) + +func main() { + var ( + circ = newCircle() + clickedYet bool + ) + + c := canvas.NewCanvas(&canvas.CanvasConfig{ + Width: width, + Height: height, + FrameRate: fps, + Title: "Harmonica", + }) + + c.Draw(func(ctx *canvas.Context) { + ctx.SetHexColor(bgColor) + ctx.Clear() + + if ctx.IsMouseDragged { + if !clickedYet { + // Set starting positions. + circ.x = ctx.Mouse.X + circ.y = ctx.Mouse.Y + + circ.Radius = 100 + clickedYet = true + } + circ.X = ctx.Mouse.X + circ.Y = ctx.Mouse.Y + } + + if clickedYet { + circ.draw(ctx) + } + }) +} + +type circle struct { + // Target values. This is what the spring will seek. + X, Y, Radius float64 + + // Managed values. These are the initial + x, xVel float64 + y, yVel float64 + rad, radVel float64 + + spring harmonica.Spring +} + +func newCircle() circle { + const ( + frequency = 0.8 + damping = 0.99 + ) + + return circle{ + spring: harmonica.NewSpring(harmonica.TimeDelta(time.Second/fps), frequency, damping), + } +} + +func (c *circle) draw(ctx *canvas.Context) { + // Update + c.spring.Update(&c.x, &c.xVel, c.X) + c.spring.Update(&c.y, &c.yVel, c.Y) + c.spring.Update(&c.rad, &c.radVel, c.Radius) + + const color = "#f1f1f1" + + ctx.Push() + ctx.DrawCircle(c.x, c.y, c.rad) + ctx.SetHexColor(color) + ctx.Fill() +} diff --git a/examples/go.mod b/examples/go.mod new file mode 100644 index 0000000..f408763 --- /dev/null +++ b/examples/go.mod @@ -0,0 +1,11 @@ +module examples + +go 1.16 + +replace github.com/charmbracelet/harmonica => ../ + +require ( + github.com/charmbracelet/harmonica v0.0.0-20210709144143-16876a63b30d // indirect + github.com/h8gi/canvas v0.0.0-20200710004640-a6361a06ab49 + golang.org/x/image v0.0.0-20190523035834-f03afa92d3ff +) diff --git a/examples/go.sum b/examples/go.sum new file mode 100644 index 0000000..62fd2f4 --- /dev/null +++ b/examples/go.sum @@ -0,0 +1,24 @@ +github.com/faiface/glhf v0.0.0-20181018222622-82a6317ac380 h1:FvZ0mIGh6b3kOITxUnxS3tLZMh7yEoHo75v3/AgUqg0= +github.com/faiface/glhf v0.0.0-20181018222622-82a6317ac380/go.mod h1:zqnPFFIuYFFxl7uH2gYByJwIVKG7fRqlqQCbzAnHs9g= +github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3 h1:baVdMKlASEHrj19iqjARrPbaRisD7EuZEVJj6ZMLl1Q= +github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3/go.mod h1:VEPNJUlxl5KdWjDvz6Q1l+rJlxF2i6xqDeGuGAxa87M= +github.com/faiface/pixel v0.8.0 h1:phOHW6ixfMAKRamjnvhI6FFI2VRyPEq7+LmmkDGXB/4= +github.com/faiface/pixel v0.8.0/go.mod h1:CEUU/s9E82Kqp01Boj1O67KnBskqiLghANqvUJGgDAM= +github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw= +github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/mathgl v0.0.0-20190416160123-c4601bc793c7 h1:THttjeRn1iiz69E875U6gAik8KTWk/JYAHoSVpUxBBI= +github.com/go-gl/mathgl v0.0.0-20190416160123-c4601bc793c7/go.mod h1:yhpkQzEiH9yPyxDUGzkmgScbaBVlhC06qodikEM0ZwQ= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/h8gi/canvas v0.0.0-20200710004640-a6361a06ab49 h1:svddC2dRqy+Y1zGH4+AvvCFZLKuPhAfEvlgYSNP4lcg= +github.com/h8gi/canvas v0.0.0-20200710004640-a6361a06ab49/go.mod h1:7iSUKfOcA+GiWc+LpxXggMogUFIo8pm1FZcYTUmL3YY= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190523035834-f03afa92d3ff h1:+2zgJKVDVAz/BWSsuniCmU1kLCjL88Z8/kv39xCI9NQ= +golang.org/x/image v0.0.0-20190523035834-f03afa92d3ff/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=