Initial commit
This commit is contained in:
104
game-of-life-test/gol.gd
Normal file
104
game-of-life-test/gol.gd
Normal file
@@ -0,0 +1,104 @@
|
||||
extends Sprite2D
|
||||
|
||||
var n: int = 64
|
||||
var arr := []
|
||||
|
||||
var data_img: Image
|
||||
var data_tex: ImageTexture
|
||||
|
||||
@onready var mat: ShaderMaterial = material as ShaderMaterial
|
||||
|
||||
# sim. consts
|
||||
var T := 0.1
|
||||
var t := 0.0
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
data_img = Image.create(n, n, false, Image.FORMAT_R8)
|
||||
data_img.fill(Color8(0, 0, 0, 255))
|
||||
|
||||
data_tex = ImageTexture.create_from_image(data_img)
|
||||
mat.set_shader_parameter("binDataTex", data_tex)
|
||||
mat.set_shader_parameter("n", n)
|
||||
|
||||
# init
|
||||
_fill_example()
|
||||
_upload_arr()
|
||||
|
||||
|
||||
func _upload_arr() -> void:
|
||||
for y in n:
|
||||
for x in n:
|
||||
var v := int(arr[y][x]) * 255
|
||||
data_img.set_pixel(x, y, Color8(v, 0, 0, 255))
|
||||
data_tex.update(data_img)
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(_delta: float) -> void:
|
||||
t += _delta
|
||||
if t >= T:
|
||||
t = 0.0
|
||||
_game_of_life_step()
|
||||
_upload_arr()
|
||||
|
||||
func _game_of_life_step() -> void:
|
||||
var next := []
|
||||
for y in n:
|
||||
var row := []
|
||||
for x in n:
|
||||
var alive: bool = arr[y][x] == 1
|
||||
var cn := _count_neighs(x, y)
|
||||
|
||||
var newv := 0
|
||||
if alive:
|
||||
newv = int(cn == 2 or cn == 3)
|
||||
else:
|
||||
newv = int(cn == 3)
|
||||
row.append(newv)
|
||||
next.append(row)
|
||||
arr = next
|
||||
|
||||
func _count_neighs(x:int, y:int) -> int:
|
||||
var ans := 0
|
||||
for _dy in 3:
|
||||
var dy := _dy-1
|
||||
for _dx in 3:
|
||||
var dx := _dx-1
|
||||
if dx == 0 and dy == 0:
|
||||
continue
|
||||
var nx := int((x + dx + n)%n)
|
||||
var ny := int((y + dy + n)%n)
|
||||
ans += arr[ny][nx]
|
||||
return ans
|
||||
|
||||
|
||||
func _fill_example() -> void:
|
||||
arr.clear()
|
||||
#_checkerboard()
|
||||
_ship()
|
||||
|
||||
# inits
|
||||
func _checkerboard() -> void:
|
||||
for y in n:
|
||||
var row := []
|
||||
for x in n:
|
||||
row.append((x + y) % 2) # checkerboard
|
||||
arr.append(row)
|
||||
|
||||
func _ship() -> void:
|
||||
var i: int = 0
|
||||
var j: int = 0
|
||||
while (i < n):
|
||||
var row := []
|
||||
j = 0
|
||||
while (j < n):
|
||||
row.append(0)
|
||||
j+=1
|
||||
arr.append(row)
|
||||
i+=1
|
||||
|
||||
arr[0][1] = 1
|
||||
arr[1][2] = 1
|
||||
arr[2][0] = 1
|
||||
arr[2][1] = 1
|
||||
arr[2][2] = 1
|
||||
Reference in New Issue
Block a user