Switching to Pixel for Grpahics (much faster!)

This commit is contained in:
Sarah Jamie Lewis 2019-11-17 13:08:02 -08:00
parent 3ba02dfb02
commit faa2a7cc96
19 changed files with 258 additions and 138 deletions

View File

@ -4,8 +4,13 @@ import (
"fmt"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"github.com/wcharczuk/go-chart"
"image/color"
"math/rand"
"os"
"os/signal"
"runtime/pprof"
"strconv"
)
@ -177,7 +182,7 @@ func (b *Ball) Reset(env *core.Environment, t *core.Turtle) {
env.Occupy(t, 50, 50)
}
func main() {
func mainrun() {
ball := new(Ball)
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
@ -198,44 +203,40 @@ func main() {
experiment.InitPheromone("2", color.RGBA{0x00, 0x00, 0xFF, 0x00})
experiment.InitPheromone("ball", color.RGBA{0xff, 0xff, 0xff, 0xff})
// x := []float64{-2}
// team1 := []float64{0}
// team2 := []float64{1}
x := []float64{-2}
team1 := []float64{0}
team2 := []float64{1}
// var graph chart.Chart
/**experiment.AddPlot("Goals Scored", func(environment *core.Environment, turtles []*core.Turtle) *chart.Chart {
var graph chart.Chart
experiment.AddPlot("Goals Scored", func(environment *core.Environment, turtles []*core.Turtle) *chart.Chart {
x = append(x, float64(environment.Step))
team1 = append(team1, float64(ball.Team1Score))
team2 = append(team2, float64(ball.Team2Score))
if environment.Step % 10 == 0 {
graph = chart.Chart{
Background: chart.Style{
Padding: chart.Box{
Top: 50,
},
graph = chart.Chart{
Background: chart.Style{
Padding: chart.Box{
Top: 50,
},
XAxis: chart.XAxis{Name: "Time Step", NameStyle: chart.Style{Show: true}, Style: chart.Style{Show: true, TextRotationDegrees: 90}, ValueFormatter: func(v interface{}) string {
return fmt.Sprintf("%d", int(v.(float64)))
},},
YAxis: chart.YAxis{Name: "Goals Scored", NameStyle: chart.Style{Show: true}, Style: chart.Style{Show: true}, ValueFormatter: func(v interface{}) string {
return fmt.Sprintf("%d", int(v.(float64)))
},},
Series: []chart.Series{
chart.ContinuousSeries{
XValues: x,
YValues: team1,
},
chart.ContinuousSeries{
XValues: x,
YValues: team2,
},
},
XAxis: chart.XAxis{Name: "Time Step", NameStyle: chart.Style{Show: true}, Style: chart.Style{Show: true, TextRotationDegrees: 90}, ValueFormatter: func(v interface{}) string {
return fmt.Sprintf("%d", int(v.(float64)))
}},
YAxis: chart.YAxis{Name: "Goals Scored", NameStyle: chart.Style{Show: true}, Style: chart.Style{Show: true}, ValueFormatter: func(v interface{}) string {
return fmt.Sprintf("%d", int(v.(float64)))
}},
Series: []chart.Series{
chart.ContinuousSeries{
XValues: x,
YValues: team1,
},
}
chart.ContinuousSeries{
XValues: x,
YValues: team2,
},
},
}
return &graph
})*/
})
gamelengths := []int{}
gamewins := []int{}
@ -346,9 +347,23 @@ func main() {
}
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
for sig := range c {
fmt.Printf("Got Signal %v", sig)
pprof.StopCPUProfile()
os.Exit(0)
}
}()
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}
func GetTeams(turtles []*core.Turtle) (redTeam, blueTeam []*core.Turtle) {
for _, turtle := range turtles {
if turtle.GetAttribute("team") == "1" {

View File

@ -94,6 +94,7 @@ func (e *Experiment) InitTurtles(f func() core.Actor) {
func (e *Experiment) AddPlot(title string, plotfunc func(environment *core.Environment, turtles []*core.Turtle) *chart.Chart) {
plot := graphics.NewPlot(title, int32(*width), int32(*height), int32(*pxsize))
plot.GeneratePlot = plotfunc
go plot.RenderAsync()
e.plots = append(e.plots, plot)
}

View File

@ -4,6 +4,7 @@ import (
"flag"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"image/color"
)
@ -45,7 +46,7 @@ func (sm *Bird) Run(env *core.Environment, t *core.Turtle) {
}
}
func main() {
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
experiment.InitTurtles(func() core.Actor {
@ -59,3 +60,7 @@ func main() {
}
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

View File

@ -4,6 +4,7 @@ import (
"flag"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"image/color"
"math"
)
@ -46,7 +47,7 @@ func (sm *SlimeMold) Run(env *core.Environment, t *core.Turtle) {
}
}
func main() {
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
n := 0
@ -62,3 +63,7 @@ func main() {
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

View File

@ -4,6 +4,7 @@ import (
"flag"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"image/color"
"math/rand"
"strconv"
@ -70,7 +71,7 @@ func (sm *Isolate) Run(env *core.Environment, t *core.Turtle) {
}
}
func main() {
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
honestTurtles := experiment.GetNumTurtles() - (*byzantineTurtles)
@ -89,3 +90,7 @@ func main() {
experiment.InitPheromone("2", color.RGBA{0xFF, 0x00, 0xFF, 0x00})
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

View File

@ -5,6 +5,7 @@ import (
"fmt"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"github.com/foolusion/quadtree"
"github.com/wcharczuk/go-chart"
"image/color"
@ -67,7 +68,7 @@ func (sm *LightningBug) Run(env *core.Environment, t *core.Turtle) {
}
func main() {
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
num := 0
@ -135,3 +136,7 @@ func main() {
experiment.InitPheromone("light", color.RGBA{0xff, 0xff, 0x00, 0x00})
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

View File

@ -4,6 +4,7 @@ import (
"flag"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"image/color"
)
@ -25,7 +26,7 @@ func (sm *MazeGeneration) Run(env *core.Environment, t *core.Turtle) {
t.Drop(env, 1, "trail")
}
func main() {
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
experiment.InitTurtles(func() core.Actor {
@ -36,3 +37,7 @@ func main() {
experiment.InitPheromone("trail", color.RGBA{0x81, 0x00, 0x81, 0x00})
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

View File

@ -5,6 +5,7 @@ import (
"fmt"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"github.com/wcharczuk/go-chart"
"image/color"
"math"
@ -92,7 +93,7 @@ func (sm *Prey) Run(env *core.Environment, t *core.Turtle) {
}
}
func main() {
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
experiment.InitEnvironment(func(env *core.Environment) {
@ -201,3 +202,7 @@ func main() {
}
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

View File

@ -4,6 +4,7 @@ import (
"flag"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"image/color"
)
@ -34,7 +35,7 @@ func (sm *SlimeMold) Run(env *core.Environment, t *core.Turtle) {
t.Drop(env, 1, "trail")
}
func main() {
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
experiment.InitTurtles(func() core.Actor {
@ -46,3 +47,7 @@ func main() {
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

View File

@ -4,10 +4,11 @@ import (
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"git.openprivacy.ca/sarah/microworlds/models"
"github.com/faiface/pixel/pixelgl"
"image/color"
)
func main() {
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
@ -51,3 +52,7 @@ func main() {
}
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

View File

@ -4,6 +4,7 @@ import (
"flag"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"image/color"
"math/rand"
"strconv"
@ -48,7 +49,7 @@ func (sm *Slush) Run(env *core.Environment, t *core.Turtle) {
t.Step(env)
}
func main() {
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
experiment.InitTurtles(NewSlushTurtle)
@ -56,3 +57,7 @@ func main() {
experiment.InitPheromone("2", color.RGBA{0xFF, 0x00, 0xFF, 0x00})
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

View File

@ -5,6 +5,7 @@ import (
"fmt"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"image/color"
"math/rand"
"strconv"
@ -130,7 +131,7 @@ func (sm *Snowball) Run(env *core.Environment, t *core.Turtle) {
}
}
func main() {
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
experiment.InitNTurtles(func() core.Actor {
@ -191,3 +192,7 @@ func main() {
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

View File

@ -5,6 +5,7 @@ import (
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"git.openprivacy.ca/sarah/microworlds/models"
"github.com/faiface/pixel/pixelgl"
"image/color"
"math"
)
@ -284,9 +285,9 @@ var utrap = [][]int{
{W, W, W, W, W, W, W, W, W, W, W, W, W, W, W},
}
func main() {
func mainrun() {
maze = maze0
//maze = maze0
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
@ -361,3 +362,7 @@ func main() {
}
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

View File

@ -4,6 +4,7 @@ import (
"flag"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"image/color"
)
@ -60,7 +61,7 @@ func (sm *Turtle) Run(env *core.Environment, t *core.Turtle) {
t.Drop(env, 1, "turtle-scent")
}
func main() {
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
num := -1
@ -83,3 +84,7 @@ func main() {
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

View File

@ -4,6 +4,7 @@ import (
"flag"
"git.openprivacy.ca/sarah/microworlds/core"
"git.openprivacy.ca/sarah/microworlds/experiments"
"github.com/faiface/pixel/pixelgl"
"image/color"
"math/rand"
)
@ -17,6 +18,7 @@ type WoodChips struct {
}
func (a *WoodChips) Setup(env *core.Environment, t *core.Turtle) {
t.SetColor(color.RGBA{0x00, 0xFF, 0xFF, 0x88})
}
func (a *WoodChips) Run(env *core.Environment, t *core.Turtle) {
@ -43,7 +45,7 @@ func (a *WoodChips) Run(env *core.Environment, t *core.Turtle) {
t.Step(env)
}
func main() {
func mainrun() {
experiment := new(experiments.Experiment)
experiment.InitializeExperiment()
experiment.InitEnvironment(func(environment *core.Environment) {
@ -65,3 +67,7 @@ func main() {
experiment.InitPheromone("trail", color.RGBA{0x80, 0xFF, 0x00, 0x00})
experiment.Run()
}
func main() {
pixelgl.Run(mainrun)
}

7
go.mod
View File

@ -5,9 +5,16 @@ go 1.13
require (
github.com/BurntSushi/toml v0.3.1 // indirect
github.com/asim/quadtree v0.0.0-20190907063054-ae2e556e6bb4
github.com/faiface/glhf v0.0.0-20181018222622-82a6317ac380 // indirect
github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3 // indirect
github.com/faiface/pixel v0.8.0
github.com/foolusion/quadtree v0.0.0-20140826014210-88d124c993be
github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 // indirect
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 // indirect
github.com/go-gl/mathgl v0.0.0-20190713194549-592312d8590a // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
github.com/nickng/bibtex v1.0.1 // indirect
github.com/pkg/errors v0.8.1 // indirect
github.com/veandco/go-sdl2 v0.3.3
github.com/wcharczuk/go-chart v2.0.1+incompatible
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 // indirect

15
go.sum
View File

@ -2,12 +2,26 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/asim/quadtree v0.0.0-20190907063054-ae2e556e6bb4 h1:ilm6YOZRb8ZA/ulKbNcL+AC/fbpkM3dRZ9kWXhBwx8U=
github.com/asim/quadtree v0.0.0-20190907063054-ae2e556e6bb4/go.mod h1:K2M5YTG4dpIXvuERd53snM5THchZczdy+k9gH02Shww=
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/foolusion/quadtree v0.0.0-20140826014210-88d124c993be h1:fLLJtjJ2bdBHXLPtRsDVdnVEr9zBmw9be/WF751O0Gg=
github.com/foolusion/quadtree v0.0.0-20140826014210-88d124c993be/go.mod h1:Gk+3NkBZRly4/GnVRU95Wwv+JmmyoVGmdcEDwA5Wm1M=
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-20190713194549-592312d8590a h1:yoAEv7yeWqfL/l9A/J5QOndXIJCldv+uuQB1DSNQbS0=
github.com/go-gl/mathgl v0.0.0-20190713194549-592312d8590a/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/nickng/bibtex v1.0.1 h1:Uop3DVOdQdrTamXfxr65f9KyHrd4RhttXwHi1BY6Wk0=
github.com/nickng/bibtex v1.0.1/go.mod h1:0qHZj8RRrLaGXyPoF9odM3M1EX1HnWiwACyR3wgGf8U=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/veandco/go-sdl2 v0.3.0 h1:IWYkHMp8V3v37NsKjszln8FFnX2+ab0538J371t+rss=
github.com/veandco/go-sdl2 v0.3.0/go.mod h1:FB+kTpX9YTE+urhYiClnRzpOXbiWgaU3+5F2AB78DPg=
github.com/veandco/go-sdl2 v0.3.1 h1:WMQ72+BeCj2o/zOO/wsB4MMpqHr1Y67m6QNFxp053ug=
@ -16,6 +30,7 @@ github.com/veandco/go-sdl2 v0.3.3 h1:4/TirgB2MQ7oww3pM3Yfgf1YbChMlAQAmiCPe5koK0I
github.com/veandco/go-sdl2 v0.3.3/go.mod h1:FB+kTpX9YTE+urhYiClnRzpOXbiWgaU3+5F2AB78DPg=
github.com/wcharczuk/go-chart v2.0.1+incompatible h1:0pz39ZAycJFF7ju/1mepnk26RLVLBCWz1STcD3doU0A=
github.com/wcharczuk/go-chart v2.0.1+incompatible/go.mod h1:PF5tmL4EIx/7Wf+hEkpCqYi5He4u90sw+0+6FhrryuE=
golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

View File

@ -1,18 +1,20 @@
package graphics
import (
"fmt"
"git.openprivacy.ca/sarah/microworlds/core"
"github.com/veandco/go-sdl2/sdl"
"github.com/faiface/pixel"
"github.com/faiface/pixel/imdraw"
"github.com/faiface/pixel/pixelgl"
"image"
"image/color"
"math"
"os"
// "strconv"
)
type Graphics struct {
window *sdl.Window
renderer *sdl.Renderer
window *pixelgl.Window
width, height, pxsize int32
imd *imdraw.IMDraw
t int
colorMap map[string][4]uint8
}
@ -22,27 +24,31 @@ func NewGraphics(width, height, pxsize int32) *Graphics {
graphics.width = width
graphics.height = height
graphics.pxsize = pxsize
window, err := sdl.CreateWindow("Microworlds", sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED,
width*pxsize, height*pxsize, sdl.WINDOW_SHOWN)
cfg := pixelgl.WindowConfig{
Title: "Microworlds",
Bounds: pixel.R(0, 0, float64(width*pxsize), float64(height*pxsize)),
VSync: true,
Resizable: false,
}
win, err := pixelgl.NewWindow(cfg)
if err != nil {
panic(err)
}
graphics.window = window
surface, _ := window.GetSurface()
renderer, err := sdl.CreateSoftwareRenderer(surface)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to create renderer: %s\n", err)
panic(err)
}
graphics.imd = imdraw.New(nil)
graphics.window = win
graphics.colorMap = make(map[string][4]uint8)
graphics.renderer = renderer
return graphics
}
func (g *Graphics) DrawTileColor(x, y int32) {
g.renderer.FillRect(&sdl.Rect{X: x * g.pxsize, Y: y * g.pxsize, W: g.pxsize, H: g.pxsize})
func (g *Graphics) DrawTileColor(imd *imdraw.IMDraw, x, y int32, rgba color.RGBA) {
imd.Color = rgba
imd.Push(pixel.V(float64(x*g.pxsize), float64(y*g.pxsize)))
imd.Push(pixel.V(float64((x*g.pxsize)+g.pxsize), float64(y*g.pxsize)))
imd.Push(pixel.V(float64(x*g.pxsize), float64((y*g.pxsize)+g.pxsize)))
imd.Push(pixel.V(float64((x*g.pxsize)+g.pxsize), float64((y*g.pxsize)+g.pxsize)))
imd.Rectangle(0)
}
func (g *Graphics) ColorPheromone(name string, color [4]uint8) {
@ -50,58 +56,55 @@ func (g *Graphics) ColorPheromone(name string, color [4]uint8) {
}
func (g *Graphics) Render(env *core.Environment, turtles []*core.Turtle) {
g.renderer.SetDrawColor(0x00, 0x00, 0x0, 0xff)
g.renderer.FillRect(&sdl.Rect{X: 0, Y: 0, W: g.width * g.pxsize, H: g.width * g.pxsize})
g.imd.Clear()
//g.window.Clear(color.RGBA{0,0,0,0})
pheromoneImage := image.NewRGBA(image.Rect(0, 0, int(g.width), int(g.height)))
for x := 0; x < int(g.width); x++ {
for y := 0; y < int(g.height); y++ {
scaledamountRedTotal := 0
scaledamountGreenTotal := 0
scaledamountBlueTotal := 0
for name, color := range g.colorMap {
amount := math.Min(float64(env.Sniff(name, x, y)), 255)
if amount > 2 {
amount = 2
}
if amount > 0 {
scaledamountRed := uint8(float64(color[0]) * (amount / 2))
scaledamountGreen := uint8(float64(color[1]) * (amount / 2))
scaledamountBlue := uint8(float64(color[2]) * (amount / 2))
scaledamountRedTotal += int(scaledamountRed)
scaledamountGreenTotal += int(scaledamountGreen)
scaledamountBlueTotal += int(scaledamountBlue)
}
}
g.renderer.SetDrawColor(uint8(scaledamountRedTotal/len(g.colorMap)), uint8(scaledamountGreenTotal/len(g.colorMap)), uint8(scaledamountBlueTotal/len(g.colorMap)), uint8(0xF0))
g.DrawTileColor(int32(x), int32(y))
if env.HasValue(x, y) {
g.renderer.SetDrawColor(255, 255, 255, uint8(255))
g.DrawTileColor(int32(x), int32(y))
}
g.DrawTileColor(g.imd, int32(x), int32(y), color.RGBA{255, 255, 255, uint8(255)})
} else {
scaledamountRedTotal := 0
scaledamountGreenTotal := 0
scaledamountBlueTotal := 0
for name, color := range g.colorMap {
amount := math.Min(float64(env.Sniff(name, x, y)), 255)
g.renderer.SetDrawColor(0x4b, 0x35, 0x57, uint8(255))
if env.Get(x, y) != nil {
g.DrawTileColor(int32(x), int32(y))
if amount > 2 {
amount = 2
}
if amount > 0 {
scaledamountRed := uint8(float64(color[0]) * (amount / 2))
scaledamountGreen := uint8(float64(color[1]) * (amount / 2))
scaledamountBlue := uint8(float64(color[2]) * (amount / 2))
scaledamountRedTotal += int(scaledamountRed)
scaledamountGreenTotal += int(scaledamountGreen)
scaledamountBlueTotal += int(scaledamountBlue)
}
}
pheromoneImage.SetRGBA(x, y, color.RGBA{uint8(scaledamountRedTotal / len(g.colorMap)), uint8(scaledamountGreenTotal / len(g.colorMap)), uint8(scaledamountBlueTotal / len(g.colorMap)), uint8(0xF0)})
}
}
}
pd := pixel.PictureDataFromImage(pheromoneImage)
sprite := pixel.NewSprite(pd, pd.Bounds())
mat := pixel.IM
mat = mat.Moved(g.window.Bounds().Center())
mat = mat.ScaledXY(pixel.V(float64(g.width*g.pxsize)/2, float64(g.height*g.pxsize)/2), pixel.V(float64(g.pxsize), float64(-g.pxsize)))
sprite.Draw(g.window, mat)
for _, t := range turtles {
if t.GetAttribute("status") == "dead" {
continue
}
x, y := t.Pos()
col := t.GetColor()
g.renderer.SetDrawColor(col.R, col.G, col.B, col.A)
g.DrawTileColor(int32(x), int32(y))
g.DrawTileColor(g.imd, int32(x), int32(y), t.GetColor())
}
g.renderer.Present()
g.window.UpdateSurface()
g.imd.Draw(g.window)
g.window.Update()
// surface, _ := g.window.GetSurface()
// surface.SaveBMP("./images/" + strconv.Itoa(g.t) + ".bmp")
g.t++

View File

@ -2,70 +2,83 @@ package graphics
import (
"bytes"
"fmt"
"git.openprivacy.ca/sarah/microworlds/core"
"github.com/veandco/go-sdl2/sdl"
"github.com/faiface/pixel"
"github.com/faiface/pixel/pixelgl"
"github.com/wcharczuk/go-chart"
"image"
"log"
"os"
)
type Plot struct {
Graphics
GeneratePlot func(*core.Environment, []*core.Turtle) *chart.Chart
GeneratePlot func(*core.Environment, []*core.Turtle) *chart.Chart
async chan chart.Chart
width, height int32
window *pixelgl.Window
}
func NewPlot(title string, width, height, pxsize int32) *Plot {
graphics := new(Plot)
graphics.width = width
graphics.height = height
window, err := sdl.CreateWindow(title, sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED,
width, height, sdl.WINDOW_SHOWN|sdl.WINDOW_RESIZABLE)
cfg := pixelgl.WindowConfig{
Title: title,
Bounds: pixel.R(0, 0, float64(width), float64(height)),
VSync: true,
Resizable: true,
}
win, err := pixelgl.NewWindow(cfg)
if err != nil {
panic(err)
}
graphics.window = window
surface, _ := window.GetSurface()
renderer, err := sdl.CreateSoftwareRenderer(surface)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to create renderer: %s\n", err)
panic(err)
}
graphics.colorMap = make(map[string][4]uint8)
graphics.renderer = renderer
graphics.window = win
graphics.async = make(chan chart.Chart)
return graphics
}
func (p *Plot) Render(env *core.Environment, turtles []*core.Turtle) {
graph := p.GeneratePlot(env, turtles)
// graph.Elements = []chart.Renderable{chart.Legend(graph)}
w, h := p.window.GetSize()
surface, _ := p.window.GetSurface()
renderer, _ := sdl.CreateSoftwareRenderer(surface)
p.renderer = renderer
graph.Width = int(w)
graph.Height = int(h)
if env.Step > 2 {
func (p *Plot) RenderAsync() {
w := p.window.Bounds().W()
h := p.window.Bounds().H()
for {
graph := <-p.async
nw := p.window.Bounds().W()
nh := p.window.Bounds().H()
if nw != w || nh != h {
w = nw
h = nh
}
graph.Width = int(w)
graph.Height = int(h)
buffer := bytes.NewBuffer([]byte{})
err := graph.Render(chart.PNG, buffer)
if err != nil {
log.Fatal(err)
}
graph, _, _ := image.Decode(buffer)
graphimg, _, _ := image.Decode(buffer)
pd := pixel.PictureDataFromImage(graphimg)
sprite := pixel.NewSprite(pd, pd.Bounds())
sprite.Draw(p.window, pixel.IM.Moved(p.window.Bounds().Center()))
for x := 0; x < int(w); x++ {
/**for x := 0; x < int(w); x++ {
for y := 0; y < int(h); y++ {
col := graph.At(x, y)
col := graphimg.At(x, y)
r, g, b, a := col.RGBA()
p.renderer.SetDrawColor(uint8(r), uint8(g), uint8(b), uint8(a))
p.renderer.DrawPoint(int32(x), int32(y))
if r != 0xff && g != 0xff && b != 0xff {
p.renderer.SetDrawColor(uint8(r), uint8(g), uint8(b), uint8(a))
p.renderer.DrawPoint(int32(x), int32(y))
}
}
}
}*/
p.window.Update()
}
}
func (p *Plot) Render(env *core.Environment, turtles []*core.Turtle) {
graph := p.GeneratePlot(env, turtles)
if env.Step > 2 {
p.async <- *graph
}
p.window.UpdateSurface()
}