Compare commits
	
		
			1 Commits
		
	
	
		
			3bebca8b2d
			...
			dadea16f6b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| dadea16f6b | 
| @ -4,6 +4,6 @@ | ||||
| 
 | ||||
| [resource] | ||||
| shader = ExtResource( 1 ) | ||||
| shader_param/lowColor = Color( 1, 0.960784, 0, 1 ) | ||||
| shader_param/highColor = Color( 0.921569, 0, 1, 1 ) | ||||
| shader_param/t = null | ||||
| shader_param/baseColor = Color( 0.992157, 1, 0, 1 ) | ||||
| shader_param/highlightColor = Color( 1, 0, 0.984314, 1 ) | ||||
| shader_param/isHighlighted = 0 | ||||
|  | ||||
| @ -5,6 +5,6 @@ | ||||
| [resource] | ||||
| resource_local_to_scene = true | ||||
| shader = ExtResource( 1 ) | ||||
| shader_param/lowColor = Color( 0, 0, 0, 1 ) | ||||
| shader_param/highColor = Color( 1, 0.560784, 0, 1 ) | ||||
| shader_param/t = null | ||||
| shader_param/baseColor = Color( 0.0823529, 0, 1, 1 ) | ||||
| shader_param/highlightColor = Color( 1, 0, 0, 1 ) | ||||
| shader_param/isHighlighted = null | ||||
|  | ||||
| @ -1,6 +0,0 @@ | ||||
| [gd_scene load_steps=2 format=2] | ||||
| 
 | ||||
| [ext_resource path="res://scripts/Clock.cs" type="Script" id=1] | ||||
| 
 | ||||
| [node name="Clock" type="Node"] | ||||
| script = ExtResource( 1 ) | ||||
| @ -1,22 +0,0 @@ | ||||
| [gd_scene load_steps=2 format=2] | ||||
| 
 | ||||
| [ext_resource path="res://scripts/DebugUI.cs" type="Script" id=1] | ||||
| 
 | ||||
| [node name="Debug UI" type="Control"] | ||||
| anchor_right = 1.0 | ||||
| anchor_bottom = 1.0 | ||||
| script = ExtResource( 1 ) | ||||
| TicksLabelPath = NodePath("Ticks") | ||||
| 
 | ||||
| [node name="Ticks" type="Label" parent="."] | ||||
| anchor_left = 1.0 | ||||
| anchor_top = 1.0 | ||||
| anchor_right = 1.0 | ||||
| anchor_bottom = 1.0 | ||||
| margin_right = -10.0 | ||||
| margin_bottom = -10.0 | ||||
| grow_horizontal = 0 | ||||
| grow_vertical = 0 | ||||
| text = "ticks: 0" | ||||
| align = 2 | ||||
| valign = 2 | ||||
| @ -1,20 +1,11 @@ | ||||
| [gd_scene load_steps=5 format=2] | ||||
| [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] | ||||
| [ext_resource path="res://nodes/debug_ui.tscn" type="PackedScene" id=3] | ||||
| [ext_resource path="res://nodes/clock.tscn" type="PackedScene" id=4] | ||||
| 
 | ||||
| [node name="Root" type="Node"] | ||||
| [node name="Root" type="Node2D"] | ||||
| 
 | ||||
| [node name="Grid" parent="." instance=ExtResource( 1 )] | ||||
| 
 | ||||
| [node name="Cursor" parent="." instance=ExtResource( 2 )] | ||||
| Grid = NodePath("../Grid") | ||||
| 
 | ||||
| [node name="Debug UI" parent="." instance=ExtResource( 3 )] | ||||
| 
 | ||||
| [node name="Clock" parent="." instance=ExtResource( 4 )] | ||||
| 
 | ||||
| [connection signal="OnTick" from="Clock" to="Grid" method="_on_Clock_OnTick"] | ||||
| [connection signal="OnTick" from="Clock" to="Debug UI" method="_on_Clock_OnTick"] | ||||
|  | ||||
| @ -1,31 +0,0 @@ | ||||
| using Godot; | ||||
| using System; | ||||
| 
 | ||||
| public class Clock : Node | ||||
| { | ||||
|     [Signal] | ||||
|     delegate void OnTick(int ticks); | ||||
|      | ||||
|     private int _ticks = 0; | ||||
| 
 | ||||
|     public override void _Input(InputEvent @event) | ||||
|     { | ||||
|         base._Input(@event); | ||||
| 
 | ||||
|         if (@event is InputEventKey keyEvent && keyEvent.Pressed) | ||||
|         { | ||||
|             switch ((KeyList)keyEvent.Scancode) | ||||
|             { | ||||
|                 case KeyList.Space: | ||||
|                     Tick(); | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     private void Tick() | ||||
|     { | ||||
|         _ticks++; | ||||
|         EmitSignal(nameof(OnTick), _ticks); | ||||
|     } | ||||
| } | ||||
| @ -1,22 +0,0 @@ | ||||
| using Godot; | ||||
| using System; | ||||
| 
 | ||||
| public class DebugUI : Control | ||||
| { | ||||
|     [Export] | ||||
|     public NodePath TicksLabelPath { private get; set; } | ||||
|     private Label _ticksLabel; | ||||
|      | ||||
|     public override void _Ready() | ||||
|     { | ||||
|         _ticksLabel = GetNode<Label>(TicksLabelPath); | ||||
|         SetTicksText(0); | ||||
|     } | ||||
|      | ||||
|     public void _on_Clock_OnTick(int ticks) => SetTicksText(ticks); | ||||
|      | ||||
|     private void SetTicksText(int ticks) | ||||
|     { | ||||
|         _ticksLabel.Text = $"ticks: {ticks}"; | ||||
|     } | ||||
| } | ||||
| @ -8,18 +8,18 @@ public class GridCursor : Sprite | ||||
|     private WorldGrid _grid; | ||||
|     private ShaderMaterial _material; | ||||
| 
 | ||||
|     private const string T = "t"; | ||||
|     private const string IS_HIGHLIGHTED = "isHighlighted"; | ||||
| 
 | ||||
|     public override void _Ready() | ||||
|     { | ||||
|         _grid = GetNode<WorldGrid>(Grid); | ||||
|         _material = (ShaderMaterial)Material; | ||||
|     } | ||||
| 
 | ||||
|      | ||||
|     public override void _Input(InputEvent @event) | ||||
|     { | ||||
|         base._Input(@event); | ||||
| 
 | ||||
|          | ||||
|         if (@event is InputEventMouseMotion mouseMoveEvent) | ||||
|         { | ||||
|             var pos = mouseMoveEvent.Position; | ||||
| @ -37,12 +37,12 @@ public class GridCursor : Sprite | ||||
|                     { | ||||
|                         var pos = mouseButtonEvent.Position; | ||||
|                         _grid.GetGridPos(pos, out var x, out var y); | ||||
|                         _grid.SetTileValue(x, y, 1.0f); | ||||
|                         _material.SetShaderParam(T, 1f); | ||||
|                         _grid.ToggleTileHighlight(x, y); | ||||
|                         _material.SetShaderParam(IS_HIGHLIGHTED, 1); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         _material.SetShaderParam(T, 0f); | ||||
|                         _material.SetShaderParam(IS_HIGHLIGHTED, 0); | ||||
|                     } | ||||
|                     break; | ||||
|             } | ||||
|  | ||||
| @ -1,8 +0,0 @@ | ||||
| using Godot; | ||||
| 
 | ||||
| public struct Tile | ||||
| { | ||||
|     public bool isHighlighted; | ||||
|     public float value; | ||||
|     public ShaderMaterial material; | ||||
| } | ||||
| @ -8,15 +8,16 @@ public class WorldGrid : Node2D | ||||
| 
 | ||||
|     [Export] | ||||
|     public int Size { get; set; } | ||||
| 
 | ||||
|      | ||||
|     [Export] | ||||
|     public int CellSize { get; set; } | ||||
| 
 | ||||
|     [Export] | ||||
|     public float DiffusionCoefficient { get; set; } = 0.01f; | ||||
| 
 | ||||
|      | ||||
|     private struct Tile | ||||
|     { | ||||
|         public bool isHighlighted; | ||||
|         public ShaderMaterial material; | ||||
|     } | ||||
|     private Tile[,] _tiles; | ||||
|     private float[,] _nextValues = null; | ||||
| 
 | ||||
|     // Called when the node enters the scene tree for the first time. | ||||
|     public override void _Ready() | ||||
| @ -27,18 +28,18 @@ public class WorldGrid : Node2D | ||||
|     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("t", tile.value); | ||||
|                 material.SetShaderParam("isHighlighted", tile.isHighlighted ? 1 : 0); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|      | ||||
|     public bool IsInBounds(int x, int y) | ||||
|     { | ||||
|         return x >= 0 && x < Size && y >= 0 && y < Size; | ||||
| @ -52,11 +53,6 @@ public class WorldGrid : Node2D | ||||
|         _tiles[x, y].isHighlighted ^= true; | ||||
|     } | ||||
| 
 | ||||
|     public void SetTileValue(int x, int y, float value) | ||||
|     { | ||||
|         _tiles[x, y].value = value; | ||||
|     } | ||||
| 
 | ||||
|     public void GetGridPos(Vector2 position, out int x, out int y) | ||||
|     { | ||||
|         x = Mathf.FloorToInt(position.x / CellSize); | ||||
| @ -79,9 +75,8 @@ public class WorldGrid : Node2D | ||||
|     private void GenerateGrid(int size) | ||||
|     { | ||||
|         this.Clear(); | ||||
| 
 | ||||
|          | ||||
|         _tiles = new Tile[size, size]; | ||||
|         _nextValues = new float[size, size]; | ||||
| 
 | ||||
|         for (int x = 0; x < size; x++) | ||||
|         { | ||||
| @ -89,8 +84,7 @@ public class WorldGrid : Node2D | ||||
|             { | ||||
|                 var tile = new Tile(); | ||||
|                 tile.isHighlighted = false; | ||||
|                 tile.value = 0.0f; | ||||
| 
 | ||||
|                  | ||||
|                 var node = TileScene.Instance<Node2D>(); | ||||
|                 this.AddChild(node); | ||||
|                 var position = new Vector2 | ||||
| @ -101,55 +95,9 @@ public class WorldGrid : Node2D | ||||
|                 node.Position = position; | ||||
|                 var canvasItem = (CanvasItem)node; | ||||
|                 tile.material = (ShaderMaterial)canvasItem.Material; | ||||
| 
 | ||||
|                  | ||||
|                 _tiles[x, y] = tile; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void _on_Clock_OnTick(int ticks) | ||||
|     { | ||||
|         Diffuse(); | ||||
|     } | ||||
| 
 | ||||
|     private float TransferHeat(float t0, float alpha, float nx, float ny, float px, float py) | ||||
|     { | ||||
|         float d2tdx2 = nx - 2 * t0 + px; | ||||
|         float d2tdy2 = ny - 2 * t0 + py; | ||||
|         return t0 + alpha * (d2tdx2 + d2tdy2); | ||||
|     } | ||||
| 
 | ||||
|     private void GetNeighbourTemperatures(int x, int y, out float nx, out float ny, out float px, out float py) | ||||
|     { | ||||
|         // default value | ||||
|         var t = _tiles[x, y].value; | ||||
| 
 | ||||
|         nx = x > 0 ? _tiles[x - 1, y].value : t; | ||||
|         px = x < Size - 1 ? _tiles[x + 1, y].value : t; | ||||
| 
 | ||||
|         ny = y > 0 ? _tiles[x, y - 1].value : t; | ||||
|         py = y < Size - 1 ? _tiles[x, y + 1].value : t; | ||||
|     } | ||||
| 
 | ||||
|     private void Diffuse() | ||||
|     { | ||||
|         for (int x = 0; x < Size; x++) | ||||
|         { | ||||
|             for (int y = 0; y < Size; y++) | ||||
|             { | ||||
|                 float t = _tiles[x, y].value; | ||||
|                 var D = DiffusionCoefficient; | ||||
| 
 | ||||
|                 GetNeighbourTemperatures( | ||||
|                     x, y, | ||||
|                     out var nx, | ||||
|                     out var ny, | ||||
|                     out var px, | ||||
|                     out var py); | ||||
| 
 | ||||
|                 // current value | ||||
|                 _nextValues[x, y] = TransferHeat(t, D, nx, ny, px, py); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,9 +1,9 @@ | ||||
| shader_type canvas_item; | ||||
| 
 | ||||
| uniform vec4 lowColor : hint_color; | ||||
| uniform vec4 highColor : hint_color; | ||||
| uniform float t; | ||||
| uniform vec4 baseColor : hint_color; | ||||
| uniform vec4 highlightColor : hint_color; | ||||
| uniform int isHighlighted; | ||||
| 
 | ||||
| void fragment() { | ||||
| 	COLOR = mix(lowColor, highColor, t); | ||||
| 	COLOR = mix(baseColor, highlightColor, float(isHighlighted)); | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user