diff --git a/experiments/evolution/soccer.go b/experiments/evolution/soccer.go index e3ae1f8..dba797c 100644 --- a/experiments/evolution/soccer.go +++ b/experiments/evolution/soccer.go @@ -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" { diff --git a/experiments/experiment.go b/experiments/experiment.go index 88041cb..6235f0d 100644 --- a/experiments/experiment.go +++ b/experiments/experiment.go @@ -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) } diff --git a/experiments/flocking/main.go b/experiments/flocking/main.go index ad1a4b7..1045414 100644 --- a/experiments/flocking/main.go +++ b/experiments/flocking/main.go @@ -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) +} diff --git a/experiments/fractal/fractal.go b/experiments/fractal/fractal.go index 8765726..1f68295 100644 --- a/experiments/fractal/fractal.go +++ b/experiments/fractal/fractal.go @@ -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) +} diff --git a/experiments/isolate/main.go b/experiments/isolate/main.go index 8e39af4..fe0ce0d 100644 --- a/experiments/isolate/main.go +++ b/experiments/isolate/main.go @@ -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) +} diff --git a/experiments/lightning-bugs/lightning-bugs.go b/experiments/lightning-bugs/lightning-bugs.go index c81fabe..1c61a76 100644 --- a/experiments/lightning-bugs/lightning-bugs.go +++ b/experiments/lightning-bugs/lightning-bugs.go @@ -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) +} diff --git a/experiments/maze/main.go b/experiments/maze/main.go index 2a2098a..56ed5ed 100644 --- a/experiments/maze/main.go +++ b/experiments/maze/main.go @@ -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) +} diff --git a/experiments/predatorprey/predprey.go b/experiments/predatorprey/predprey.go index 2594653..9612e7d 100644 --- a/experiments/predatorprey/predprey.go +++ b/experiments/predatorprey/predprey.go @@ -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) +} diff --git a/experiments/slimemold/main.go b/experiments/slimemold/main.go index c711280..f7d405b 100644 --- a/experiments/slimemold/main.go +++ b/experiments/slimemold/main.go @@ -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) +} diff --git a/experiments/slimemold/plasmoidiam/main.go b/experiments/slimemold/plasmoidiam/main.go index 394657e..866e304 100644 --- a/experiments/slimemold/plasmoidiam/main.go +++ b/experiments/slimemold/plasmoidiam/main.go @@ -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) +} diff --git a/experiments/slush/main.go b/experiments/slush/main.go index f72eacc..2ca956a 100644 --- a/experiments/slush/main.go +++ b/experiments/slush/main.go @@ -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) +} diff --git a/experiments/snowball/main.go b/experiments/snowball/main.go index 218b39b..11c6eb2 100644 --- a/experiments/snowball/main.go +++ b/experiments/snowball/main.go @@ -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) +} diff --git a/experiments/swarm/main.go b/experiments/swarm/main.go index 76da1bf..6abd320 100644 --- a/experiments/swarm/main.go +++ b/experiments/swarm/main.go @@ -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) +} diff --git a/experiments/turtles-and-frogs/main.go b/experiments/turtles-and-frogs/main.go index 1088dbb..9a14ab6 100644 --- a/experiments/turtles-and-frogs/main.go +++ b/experiments/turtles-and-frogs/main.go @@ -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) +} diff --git a/experiments/woodchips/main.go b/experiments/woodchips/main.go index e92c72b..6baa2b9 100644 --- a/experiments/woodchips/main.go +++ b/experiments/woodchips/main.go @@ -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) +} diff --git a/go.mod b/go.mod index 6018026..edc9936 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index 1911e7e..ca230f7 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/graphics/graphics.go b/graphics/graphics.go index a8a015e..3952a5c 100644 --- a/graphics/graphics.go +++ b/graphics/graphics.go @@ -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++ diff --git a/graphics/plotting.go b/graphics/plotting.go index 0a404d2..1a21200 100644 --- a/graphics/plotting.go +++ b/graphics/plotting.go @@ -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() }