From 1574e03085093b325041e6ac5ecb7716fabb4e4a Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Thu, 6 Jun 2024 19:36:51 +0200 Subject: [PATCH] put evolutioin drawing out of Draw(), handle history only if enabled --- TODO.md | 6 +---- src/play.go | 76 +++++++++++++++++++++++++++++------------------------ 2 files changed, 43 insertions(+), 39 deletions(-) diff --git a/TODO.md b/TODO.md index 59bab19..8ba32ee 100644 --- a/TODO.md +++ b/TODO.md @@ -1,14 +1,10 @@ - add all other options like size etc -- do not process history if turned off - add gif export - add toolbar - turn input ifs to switch -- add insert mode for edit like vi -- use left mouse to drag grid unless insert mode is active -- keep supporting middle mouse to drag so that dragging is possible in insert mode +- only draw visible part of the world - print current mode to the bottom like pause, insert and mark - add https://www.ibiblio.org/lifepatterns/october1970.html -- use uint8 or bool, history needs not be larger than 256 anyway - history: dont count age but do calc to get index to age tile based on cell age - maybe pre calc neighbors as 8 slice of pointers to neighboring cells to faster do the count - https://mattnakama.com/blog/go-branchless-coding/ diff --git a/src/play.go b/src/play.go index d9583e2..422e933 100644 --- a/src/play.go +++ b/src/play.go @@ -131,16 +131,18 @@ func (scene *ScenePlay) UpdateCells() { // change state of current cell in next grid scene.Grids[next].Data[y][x] = nextstate - // set history to current generation so we can infer the - // age of the cell's state during rendering and use it to - // deduce the color to use if evolution tracing is enabled - // 60FPS: - if state != nextstate { - scene.History[y][x] = scene.Generations - } + if scene.Config.ShowEvolution { + // set history to current generation so we can infer the + // age of the cell's state during rendering and use it to + // deduce the color to use if evolution tracing is enabled + // 60FPS: + if state != nextstate { + scene.History[y][x] = scene.Generations + } - // 10FPS: - //scene.History.Data[y][x] = (state ^ (1 ^ nextstate)) * (scene.Generations - scene.History.Data[y][x]) + // 10FPS: + //scene.History.Data[y][x] = (state ^ (1 ^ nextstate)) * (scene.Generations - scene.History.Data[y][x]) + } } } @@ -459,8 +461,6 @@ func (scene *ScenePlay) Draw(screen *ebiten.Image) { op.GeoM.Translate(0, 0) scene.World.DrawImage(scene.Cache, op) - var age int64 - for y := 0; y < scene.Config.Height; y++ { for x := 0; x < scene.Config.Width; x++ { op.GeoM.Reset() @@ -469,31 +469,12 @@ func (scene *ScenePlay) Draw(screen *ebiten.Image) { float64(y*scene.Config.Cellsize), ) - //age = scene.Generations - scene.History.Data[y][x] - age = scene.History[y][x] - - switch scene.Grids[scene.Index].Data[y][x] { - case Alive: - if age > 50 && scene.Config.ShowEvolution { - scene.World.DrawImage(scene.Tiles.Old, op) - - } else { + if scene.Config.ShowEvolution { + scene.DrawEvolution(screen, x, y, op) + } else { + if scene.Grids[scene.Index].Data[y][x] { scene.World.DrawImage(scene.Tiles.Black, op) } - case Dead: - // only draw dead cells in case evolution trace is enabled - if scene.History[y][x] > 1 && scene.Config.ShowEvolution { - switch { - case age < 10: - scene.World.DrawImage(scene.Tiles.Age1, op) - case age < 20: - scene.World.DrawImage(scene.Tiles.Age2, op) - case age < 30: - scene.World.DrawImage(scene.Tiles.Age3, op) - default: - scene.World.DrawImage(scene.Tiles.Age4, op) - } - } } } } @@ -510,6 +491,33 @@ func (scene *ScenePlay) Draw(screen *ebiten.Image) { scene.Game.Screen.DrawImage(screen, op) } +func (scene *ScenePlay) DrawEvolution(screen *ebiten.Image, x, y int, op *ebiten.DrawImageOptions) { + age := scene.Generations - scene.History[y][x] + + switch scene.Grids[scene.Index].Data[y][x] { + case Alive: + if age > 50 && scene.Config.ShowEvolution { + scene.World.DrawImage(scene.Tiles.Old, op) + } else { + scene.World.DrawImage(scene.Tiles.Black, op) + } + case Dead: + // only draw dead cells in case evolution trace is enabled + if scene.History[y][x] > 1 && scene.Config.ShowEvolution { + switch { + case age < 10: + scene.World.DrawImage(scene.Tiles.Age1, op) + case age < 20: + scene.World.DrawImage(scene.Tiles.Age2, op) + case age < 30: + scene.World.DrawImage(scene.Tiles.Age3, op) + default: + scene.World.DrawImage(scene.Tiles.Age4, op) + } + } + } +} + func (scene *ScenePlay) DrawMark(screen *ebiten.Image) { if scene.Config.Markmode && scene.MarkTaken { x := float32(scene.Mark.X * scene.Config.Cellsize)