applets/examples/ripple/main_wasm.go

137 lines
2.1 KiB
Go

// +build js,wasm
package main
import (
"fmt"
"image/jpeg"
"math/rand"
"net/http"
"time"
"git.kirsle.net/go/render"
"git.kirsle.net/go/render/canvas"
)
// Config variables.
var (
Filename = "photo.jpg"
Width = 640
Height = 480
Quality = 4
// computed.
Size = Width * Height
)
// Runtime variables.
var (
app *App
mw *canvas.Engine
TargetFPS = 1000 / 60 // run at 60fps
)
func main() {
setup()
go mainloop()
for {
time.Sleep(10 * time.Second)
}
}
// setup the applet
func setup() {
var err error
// Seed the random number generator.
rand.Seed(time.Now().UnixNano())
// Get the HTML Canvas.
mw, err = canvas.New("canvas")
if err != nil {
panic(err)
}
// Configure the engine.
err = mw.Setup()
if err != nil {
panic(err)
}
mw.AddEventListeners()
// Fetch the image via HTTP.
r, err := http.Get(Filename)
if err != nil {
panic(err)
}
// Parse it as a jpeg.
photo, err := jpeg.Decode(r.Body)
if err != nil {
panic(err)
}
app = New(mw, photo)
}
// loop runs the applet logic for each loop.
func loop() bool {
app.Ripple()
fmt.Println("loop")
mw.Clear(render.White)
// Poll events.
ev, err := mw.Poll()
if err != nil {
panic(err)
}
// Is mouse over the drawing?
if ev.CursorX >= 0 && ev.CursorX < Width && ev.CursorY >= 0 && ev.CursorY < Width {
app.Disturb(ev.CursorX, ev.CursorY, 15000)
}
// rain
// app.Disturb(
// int(math.Floor(rand.Float64()*float64(Width))),
// int(math.Floor(rand.Float64()*float64(Height))),
// int(rand.Float64()*10000),
// )
app.Present()
// test
for pt := range render.IterLine(render.Origin, render.NewPoint(128, 128)) {
mw.DrawPoint(render.Black, pt)
}
return true
}
// mainloop runs a loop of loop() while maintaing the frame rate.
func mainloop() {
var (
start time.Time
elapsed time.Duration
ok bool
)
for {
// Record how long the frame takes.
start = time.Now()
ok = loop()
// Delay to maintain target frames per second.
var delay uint32
elapsed = time.Now().Sub(start) / time.Millisecond
if TargetFPS-int(elapsed) > 0 {
delay = uint32(TargetFPS - int(elapsed))
}
mw.Delay(delay)
if !ok {
break
}
}
}