put evolutioin drawing out of Draw(), handle history only if enabled

This commit is contained in:
2024-06-06 19:36:51 +02:00
parent 9fb2779c02
commit 1574e03085
2 changed files with 43 additions and 39 deletions

View File

@@ -1,14 +1,10 @@
- add all other options like size etc - add all other options like size etc
- do not process history if turned off
- add gif export - add gif export
- add toolbar - add toolbar
- turn input ifs to switch - turn input ifs to switch
- add insert mode for edit like vi - only draw visible part of the world
- 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
- print current mode to the bottom like pause, insert and mark - print current mode to the bottom like pause, insert and mark
- add https://www.ibiblio.org/lifepatterns/october1970.html - 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 - 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 - maybe pre calc neighbors as 8 slice of pointers to neighboring cells to faster do the count
- https://mattnakama.com/blog/go-branchless-coding/ - https://mattnakama.com/blog/go-branchless-coding/

View File

@@ -131,16 +131,18 @@ func (scene *ScenePlay) UpdateCells() {
// change state of current cell in next grid // change state of current cell in next grid
scene.Grids[next].Data[y][x] = nextstate scene.Grids[next].Data[y][x] = nextstate
// set history to current generation so we can infer the if scene.Config.ShowEvolution {
// age of the cell's state during rendering and use it to // set history to current generation so we can infer the
// deduce the color to use if evolution tracing is enabled // age of the cell's state during rendering and use it to
// 60FPS: // deduce the color to use if evolution tracing is enabled
if state != nextstate { // 60FPS:
scene.History[y][x] = scene.Generations if state != nextstate {
} scene.History[y][x] = scene.Generations
}
// 10FPS: // 10FPS:
//scene.History.Data[y][x] = (state ^ (1 ^ nextstate)) * (scene.Generations - scene.History.Data[y][x]) //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) op.GeoM.Translate(0, 0)
scene.World.DrawImage(scene.Cache, op) scene.World.DrawImage(scene.Cache, op)
var age int64
for y := 0; y < scene.Config.Height; y++ { for y := 0; y < scene.Config.Height; y++ {
for x := 0; x < scene.Config.Width; x++ { for x := 0; x < scene.Config.Width; x++ {
op.GeoM.Reset() op.GeoM.Reset()
@@ -469,31 +469,12 @@ func (scene *ScenePlay) Draw(screen *ebiten.Image) {
float64(y*scene.Config.Cellsize), float64(y*scene.Config.Cellsize),
) )
//age = scene.Generations - scene.History.Data[y][x] if scene.Config.ShowEvolution {
age = scene.History[y][x] scene.DrawEvolution(screen, x, y, op)
} else {
switch scene.Grids[scene.Index].Data[y][x] { if 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) 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) 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) { func (scene *ScenePlay) DrawMark(screen *ebiten.Image) {
if scene.Config.Markmode && scene.MarkTaken { if scene.Config.Markmode && scene.MarkTaken {
x := float32(scene.Mark.X * scene.Config.Cellsize) x := float32(scene.Mark.X * scene.Config.Cellsize)