diff --git a/half-earth/Half-earth.csproj b/half-earth/Half-earth.csproj
new file mode 100644
index 0000000..29905c2
--- /dev/null
+++ b/half-earth/Half-earth.csproj
@@ -0,0 +1,6 @@
+
+
+ net472
+ Halfearth
+
+
\ No newline at end of file
diff --git a/half-earth/Half-earth.sln b/half-earth/Half-earth.sln
new file mode 100644
index 0000000..a7cf826
--- /dev/null
+++ b/half-earth/Half-earth.sln
@@ -0,0 +1,19 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Half-earth", "Half-earth.csproj", "{C894A75C-991B-4000-9BD9-9B0B186304C4}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ ExportDebug|Any CPU = ExportDebug|Any CPU
+ ExportRelease|Any CPU = ExportRelease|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C894A75C-991B-4000-9BD9-9B0B186304C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C894A75C-991B-4000-9BD9-9B0B186304C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C894A75C-991B-4000-9BD9-9B0B186304C4}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU
+ {C894A75C-991B-4000-9BD9-9B0B186304C4}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU
+ {C894A75C-991B-4000-9BD9-9B0B186304C4}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU
+ {C894A75C-991B-4000-9BD9-9B0B186304C4}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/half-earth/materials/tile.tres b/half-earth/materials/tile.tres
new file mode 100644
index 0000000..4bc4d4a
--- /dev/null
+++ b/half-earth/materials/tile.tres
@@ -0,0 +1,8 @@
+[gd_resource type="ShaderMaterial" load_steps=2 format=2]
+
+[ext_resource path="res://shaders/tile_shader.gdshader" type="Shader" id=1]
+
+[resource]
+resource_local_to_scene = true
+shader = ExtResource( 1 )
+shader_param/c = null
diff --git a/half-earth/nodes/game.tscn b/half-earth/nodes/game.tscn
new file mode 100644
index 0000000..c7bf9d9
--- /dev/null
+++ b/half-earth/nodes/game.tscn
@@ -0,0 +1,11 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://nodes/grid.tscn" type="PackedScene" id=1]
+[ext_resource path="res://nodes/grid_cursor.tscn" type="PackedScene" id=2]
+
+[node name="Root" type="Node2D"]
+
+[node name="Grid" parent="." instance=ExtResource( 1 )]
+
+[node name="Cursor" parent="." instance=ExtResource( 2 )]
+Grid = NodePath("../Grid")
diff --git a/half-earth/nodes/grid.tscn b/half-earth/nodes/grid.tscn
new file mode 100644
index 0000000..3a19d57
--- /dev/null
+++ b/half-earth/nodes/grid.tscn
@@ -0,0 +1,10 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://scripts/WorldGrid.cs" type="Script" id=1]
+[ext_resource path="res://nodes/tile.tscn" type="PackedScene" id=2]
+
+[node name="Grid" type="Node2D"]
+script = ExtResource( 1 )
+TileScene = ExtResource( 2 )
+Size = 10
+CellSize = 64
diff --git a/half-earth/nodes/tile.tscn b/half-earth/nodes/tile.tscn
new file mode 100644
index 0000000..5861ee1
--- /dev/null
+++ b/half-earth/nodes/tile.tscn
@@ -0,0 +1,8 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://materials/tile.tres" type="Material" id=1]
+[ext_resource path="res://textures/icon.png" type="Texture" id=2]
+
+[node name="Tile" type="Sprite"]
+material = ExtResource( 1 )
+texture = ExtResource( 2 )
diff --git a/half-earth/scripts/WorldGrid.cs b/half-earth/scripts/WorldGrid.cs
new file mode 100644
index 0000000..e03923b
--- /dev/null
+++ b/half-earth/scripts/WorldGrid.cs
@@ -0,0 +1,93 @@
+using Godot;
+using System;
+
+public class WorldGrid : Node2D
+{
+ [Export]
+ private PackedScene TileScene { get; set; }
+
+ [Export]
+ public int Size { get; set; }
+
+ [Export]
+ public int CellSize { get; set; }
+
+ private struct Tile
+ {
+ public float data;
+ public ShaderMaterial material;
+ }
+ private Tile[,] _tiles;
+
+ // Called when the node enters the scene tree for the first time.
+ public override void _Ready()
+ {
+ GenerateGrid(Size);
+ }
+
+ public override void _Process(float delta)
+ {
+ base._Process(delta);
+
+ for (int x = 0; x < Size; x++)
+ {
+ for (int y = 0; y < Size; y++)
+ {
+ var tile = _tiles[x, y];
+ var material = tile.material;
+ material.SetShaderParam("c", tile.data);
+ }
+ }
+ }
+
+ public void GetGridPos(Vector2 position, out int x, out int y)
+ {
+ int GetCoord(float f) =>
+ Mathf.Clamp(Mathf.FloorToInt(f / CellSize), 0, CellSize -1);
+
+ x = GetCoord(position.x);
+ y = GetCoord(position.y);
+ }
+
+ private void Clear()
+ {
+ _tiles = null;
+
+ int children = this.GetChildCount();
+ GD.Print(children);
+ for (int i = 0; i < children; i++)
+ {
+ var child = this.GetChild(i);
+ child.QueueFree();
+ }
+ }
+
+ private void GenerateGrid(int size)
+ {
+ this.Clear();
+
+ _tiles = new Tile[size, size];
+
+ for (int x = 0; x < size; x++)
+ {
+ for (int y = 0; y < size; y++)
+ {
+ var tile = new Tile();
+ tile.data = (float)(y * size + x) / 100f;
+
+ var node = TileScene.Instance();
+ this.AddChild(node);
+ var position = new Vector2
+ {
+ x = (x + .5f) * CellSize,
+ y = (y + .5f) * CellSize
+ };
+ node.Position = position;
+ var canvasItem = (CanvasItem)node;
+ tile.material = (ShaderMaterial)canvasItem.Material;
+
+ _tiles[x, y] = tile;
+ }
+ }
+ }
+}
diff --git a/half-earth/shaders/tile_shader.gdshader b/half-earth/shaders/tile_shader.gdshader
new file mode 100644
index 0000000..e948f41
--- /dev/null
+++ b/half-earth/shaders/tile_shader.gdshader
@@ -0,0 +1,7 @@
+shader_type canvas_item;
+
+uniform float c;
+
+void fragment() {
+ COLOR = vec4(c, 0.0, 0.0, 1.0);
+}