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
- 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/

View File

@@ -131,6 +131,7 @@ func (scene *ScenePlay) UpdateCells() {
// change state of current cell in next grid
scene.Grids[next].Data[y][x] = nextstate
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
@@ -143,6 +144,7 @@ func (scene *ScenePlay) UpdateCells() {
//scene.History.Data[y][x] = (state ^ (1 ^ nextstate)) * (scene.Generations - scene.History.Data[y][x])
}
}
}
// switch grid for rendering
scene.Index ^= 1
@@ -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,14 +469,35 @@ 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]
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)
}
}
}
}
scene.DrawMark(scene.World)
scene.Camera.Render(scene.World, screen)
scene.DrawDebug(screen)
op.GeoM.Reset()
op.GeoM.Translate(0, 0)
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)
}
@@ -495,19 +516,6 @@ func (scene *ScenePlay) Draw(screen *ebiten.Image) {
}
}
}
}
}
scene.DrawMark(scene.World)
scene.Camera.Render(scene.World, screen)
scene.DrawDebug(screen)
op.GeoM.Reset()
op.GeoM.Translate(0, 0)
scene.Game.Screen.DrawImage(screen, op)
}
func (scene *ScenePlay) DrawMark(screen *ebiten.Image) {