From a5ce4a235d9f29ed3ba93fb771d428cedc1fa603 Mon Sep 17 00:00:00 2001 From: Martin Felis Date: Tue, 9 May 2023 21:51:45 +0200 Subject: [PATCH] WIP: apply generated world texture to tiles. --- .gitignore | 2 + GodotComponentTest.csproj | 4 ++ assets/4x4checker.png.import | 2 +- materials/HexTileTextureLookup.tres | 9 +++ materials/shader/HexToTexture.gdshader | 82 +++++++++++++++++++++++ project.godot | 8 +-- scenes/Game.cs | 27 ++++++-- scenes/HexTile3D.cs | 4 ++ scenes/HexTile3D.tscn | 76 +-------------------- scenes/NoiseWorldGeneration2D.tscn | 4 +- scenes/StreamContainer.cs | 24 +++++++ scenes/TileWorld.cs | 2 +- scenes/tests/HexTile3DMaterialAssign.cs | 82 +++++++++++++++++++++++ scenes/tests/HexTile3DMaterialAssign.tscn | 73 ++++++++++++++++++++ 14 files changed, 310 insertions(+), 89 deletions(-) create mode 100644 materials/HexTileTextureLookup.tres create mode 100644 materials/shader/HexToTexture.gdshader create mode 100644 scenes/tests/HexTile3DMaterialAssign.cs create mode 100644 scenes/tests/HexTile3DMaterialAssign.tscn diff --git a/.gitignore b/.gitignore index 14fafd0..b701ad0 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ mono_crash.* export/html export/android + +assets/tmp/* diff --git a/GodotComponentTest.csproj b/GodotComponentTest.csproj index 4dba522..44055d1 100644 --- a/GodotComponentTest.csproj +++ b/GodotComponentTest.csproj @@ -17,4 +17,8 @@ + + + + diff --git a/assets/4x4checker.png.import b/assets/4x4checker.png.import index 6e9265a..439a00b 100644 --- a/assets/4x4checker.png.import +++ b/assets/4x4checker.png.import @@ -22,7 +22,7 @@ compress/hdr_mode=0 compress/bptc_ldr=0 compress/normal_map=0 flags/repeat=true -flags/filter=true +flags/filter=false flags/mipmaps=true flags/anisotropic=false flags/srgb=2 diff --git a/materials/HexTileTextureLookup.tres b/materials/HexTileTextureLookup.tres new file mode 100644 index 0000000..589442b --- /dev/null +++ b/materials/HexTileTextureLookup.tres @@ -0,0 +1,9 @@ +[gd_resource type="ShaderMaterial" load_steps=3 format=2] + +[ext_resource path="res://assets/4x4checkerColor.png" type="Texture" id=1] +[ext_resource path="res://materials/shader/HexToTexture.gdshader" type="Shader" id=2] + +[resource] +shader = ExtResource( 2 ) +shader_param/TextureSize = 4 +shader_param/MapAlbedoTexture = ExtResource( 1 ) diff --git a/materials/shader/HexToTexture.gdshader b/materials/shader/HexToTexture.gdshader new file mode 100644 index 0000000..cc8b655 --- /dev/null +++ b/materials/shader/HexToTexture.gdshader @@ -0,0 +1,82 @@ +shader_type spatial; +render_mode specular_schlick_ggx, async_visible; + +uniform sampler2D MapAlbedoTexture : hint_black_albedo; +uniform int TextureSize: hint_range(0, 1024, 4); +varying vec2 map_coord; + +const mat2 _HexAffineInverse = mat2(vec2(1.333333, -0.6666667), vec2(0, -1.154701)); + +vec3 axial_to_cube(vec2 axial) { + return vec3(axial.x, axial.y, -axial.x - axial.y); +} + +ivec3 round_cube_coords(vec3 cube) { + ivec3 rounded = ivec3(cube); + + vec3 diffs = abs(vec3(rounded) - cube); + + if (diffs.x > diffs.y && diffs.x > diffs.z) { + rounded.x = -rounded.y - rounded.z; + } else if (diffs.y > diffs.z) { + rounded.y = -rounded.x - rounded.z; + } else { + rounded.z = -rounded.x - rounded.y; + } + + return rounded; +} + +vec2 axial_to_offset(vec2 axial) { + ivec3 cubeCoords = round_cube_coords(axial_to_cube(axial)); + int x = cubeCoords.x; + int y = cubeCoords.y; + int off_y = y + (x - (x % 1)) / 2; + return vec2(float(x), float(off_y)); +} + +void vertex() { +// Input:2 + mat4 model_matrix = WORLD_MATRIX; + + vec3 origin = vec4(WORLD_MATRIX * vec4(0, 0, 0, 1)).xyz; + + vec3 axial_coords = vec3(_HexAffineInverse * origin.xz, 0); + +// Output:0 + map_coord = origin.xz * 1. / float(TextureSize); + map_coord = axial_to_offset(axial_coords.xy) / float(TextureSize); +} + +void fragment() { +// Input:3 + mat4 n_out3p0 = WORLD_MATRIX; + +// TransformDecompose:5 + vec3 n_out5p0 = n_out3p0[0].xyz; + vec3 n_out5p1 = n_out3p0[1].xyz; + vec3 n_out5p2 = n_out3p0[2].xyz; + vec3 n_out5p3 = n_out3p0[3].xyz; + +// VectorOp:9 + vec3 n_in9p1 = vec3(1.00000, 1.00000, 1.00000); + vec3 n_out9p0 = n_out5p3 * n_in9p1; + +// TextureUniform:4 + vec3 n_out4p0; + float n_out4p1; + { + vec4 n_tex_read = texture(MapAlbedoTexture, map_coord); + n_out4p0 = n_tex_read.rgb; + n_out4p1 = n_tex_read.a; + } + +// Output:0 + ALBEDO = n_out4p0; + +} + +void light() { +// Output:0 + +} diff --git a/project.godot b/project.godot index afb22bb..bd0be60 100644 --- a/project.godot +++ b/project.godot @@ -9,17 +9,17 @@ config_version=4 _global_script_classes=[ { -"base": "Reference", +"base": "Node", "class": "ClickableComponent", "language": "GDScript", "path": "res://components/ClickableComponent.gd" }, { -"base": "Reference", +"base": "KinematicBody2D", "class": "CollisionLine", "language": "GDScript", "path": "res://utils/CollisionLine.gd" }, { -"base": "Reference", +"base": "Node", "class": "ColorComponent", "language": "GDScript", "path": "res://components/ColorComponent.gd" @@ -54,7 +54,7 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://utils/SpringDamper.gd" }, { -"base": "Reference", +"base": "Sprite", "class": "TintedSpriteComponent", "language": "GDScript", "path": "res://components/TintedSpriteComponent.gd" diff --git a/scenes/Game.cs b/scenes/Game.cs index 45014ac..994d680 100644 --- a/scenes/Game.cs +++ b/scenes/Game.cs @@ -30,6 +30,7 @@ public class Game : Spatial // Resources private PackedScene _tileHighlightScene; + private ShaderMaterial _tileMaterial; // other members private HexGrid _hexGrid; @@ -69,6 +70,8 @@ public class Game : Spatial // resources _tileHighlightScene = GD.Load("utils/TileHighlight.tscn"); + _tileMaterial = GD.Load("materials/HexTileTextureLookup.tres"); + Debug.Assert(_tileMaterial != null); // other members _lastTile = new HexCell(); @@ -82,6 +85,7 @@ public class Game : Spatial // connect signals _streamContainerArea.Connect("input_event", this, nameof(OnAreaInputEvent)); _streamContainer.Connect("TileClicked", this, nameof(OnTileClicked)); + _streamContainer.Connect("TileHovered", this, nameof(OnTileHovered)); _tileWorld.Connect("WorldGenerated", this, nameof(OnWorldGenerated)); _generateWorldButton.Connect("pressed", this, nameof(OnGenerateButton)); @@ -96,7 +100,7 @@ public class Game : Spatial } // perform dependency injection - //_streamContainer.SetWorld(_tileWorld); + //_streamContainer.SetWorld(_tileWorld);Clicked WorldInfoComponent worldInfoComponent = _player.GetNode("WorldInfo"); if (worldInfoComponent != null) { @@ -183,11 +187,6 @@ public class Game : Spatial { HexCell cellAtCursor = _hexGrid.GetHexAt(new Vector2(position.x, position.z)); Transform highlightTransform = Transform.Identity; - Vector2 cellPlaneCoords = _hexGrid.GetHexCenter(cellAtCursor); - cellPlaneCoords = _hexGrid.GetHexCenterFromOffset(cellAtCursor.OffsetCoords); - highlightTransform.origin.x = cellPlaneCoords.x; - highlightTransform.origin.z = cellPlaneCoords.y; - highlightTransform.origin.y = 0.1f; _mouseWorldLabel.Text = position.ToString(); _mouseTileLabel.Text = cellAtCursor.OffsetCoords.ToString(); @@ -224,6 +223,17 @@ public class Game : Spatial // } } + public void OnTileHovered(HexTile3D tile) + { + Transform highlightTransform = _tileHighlight.GlobalTransform; + highlightTransform.origin.x = tile.GlobalTranslation.x; + highlightTransform.origin.z = tile.GlobalTranslation.z; + highlightTransform.origin.y = 0.1f; + _mouseTileHighlight.Transform = highlightTransform; + _mouseWorldLabel.Text = tile.GlobalTranslation.ToString(); + _mouseTileLabel.Text = tile.OffsetCoords.ToString(); + } + public void OnEntityClicked(Entity entity) { GD.Print("Clicked on entity at " + entity.GlobalTranslation); @@ -245,9 +255,12 @@ public class Game : Spatial ImageTexture new_world_texture = new ImageTexture(); _tileWorld.Colormap.Unlock(); - new_world_texture.CreateFromImage(_tileWorld.Colormap); + new_world_texture.CreateFromImage(_tileWorld.Colormap, (uint) (Texture.FlagsEnum.Mipmaps | Texture.FlagsEnum.Repeat)); _tileWorld.Colormap.Lock(); _worldTextureRect.Texture = new_world_texture; + _tileMaterial.Set("MapAlbedoTexture", new_world_texture); + + _streamContainer.SetTileMaterial(_tileMaterial); } } \ No newline at end of file diff --git a/scenes/HexTile3D.cs b/scenes/HexTile3D.cs index 43398c6..7b97fe5 100644 --- a/scenes/HexTile3D.cs +++ b/scenes/HexTile3D.cs @@ -21,6 +21,9 @@ public class HexTile3D : Spatial [Signal] delegate void TileClicked(HexTile3D tile3d); + [Signal] + delegate void TileHovered(HexTile3D tile3d); + // other member variables private SpatialMaterial _undefinedMaterial; private SpatialMaterial _sandMaterial; @@ -125,6 +128,7 @@ public class HexTile3D : Spatial IsMouseOver = true; _previousMaterial = (SpatialMaterial)_mesh.MaterialOverride; + EmitSignal("TileHovered", this); // SpatialMaterial clonedMaterial = (SpatialMaterial)_mesh.GetSurfaceMaterial(0).Duplicate(); // clonedMaterial.AlbedoColor = new Color(1, 0, 0); // _mesh.MaterialOverride = clonedMaterial; diff --git a/scenes/HexTile3D.tscn b/scenes/HexTile3D.tscn index 45d9efb..857f640 100644 --- a/scenes/HexTile3D.tscn +++ b/scenes/HexTile3D.tscn @@ -1,7 +1,7 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://scenes/HexTile3D.cs" type="Script" id=1] -[ext_resource path="res://assets/4x4checkerColor.png" type="Texture" id=2] +[ext_resource path="res://materials/HexTileTextureLookup.tres" type="Material" id=2] [sub_resource type="CylinderMesh" id=6] top_radius = 0.5 @@ -10,76 +10,6 @@ height = 10.0 radial_segments = 6 rings = 1 -[sub_resource type="Shader" id=11] -code = "shader_type spatial; -render_mode specular_schlick_ggx, async_visible; - -uniform sampler2D MapAlbedoTexture : hint_black_albedo; -uniform mat4 HexAffineInverse; -varying vec2 map_coord; - -const mat2 _HexAffineInverse = mat2(vec2(1.333333, -0.6666667), vec2(0, -1.154701)); - -vec2 axial_to_offset(vec2 axial) { - ivec2 axial_i = ivec2(axial); - int x = axial_i.x; - int y = axial_i.y; - int off_y = y + (x - (x % 1)) / 2; - return vec2(float(x), float(off_y)); -} - -void vertex() { -// Input:2 - mat4 model_matrix = WORLD_MATRIX; - - vec3 origin = vec4(WORLD_MATRIX * vec4(0, 0, 0, 1)).xyz; - - vec3 axial_coords = vec3(_HexAffineInverse * origin.xz, 0); - -// Output:0 - map_coord = origin.xz * 0.25; - map_coord = axial_to_offset(axial_coords.xy) * 0.25; -} - -void fragment() { -// Input:3 - mat4 n_out3p0 = WORLD_MATRIX; - -// TransformDecompose:5 - vec3 n_out5p0 = n_out3p0[0].xyz; - vec3 n_out5p1 = n_out3p0[1].xyz; - vec3 n_out5p2 = n_out3p0[2].xyz; - vec3 n_out5p3 = n_out3p0[3].xyz; - -// VectorOp:9 - vec3 n_in9p1 = vec3(1.00000, 1.00000, 1.00000); - vec3 n_out9p0 = n_out5p3 * n_in9p1; - -// TextureUniform:4 - vec3 n_out4p0; - float n_out4p1; - { - vec4 n_tex_read = texture(MapAlbedoTexture, map_coord); - n_out4p0 = n_tex_read.rgb; - n_out4p1 = n_tex_read.a; - } - -// Output:0 - ALBEDO = n_out4p0; - -} - -void light() { -// Output:0 - -} -" - -[sub_resource type="ShaderMaterial" id=10] -shader = SubResource( 11 ) -shader_param/HexAffineInverse = null -shader_param/MapAlbedoTexture = ExtResource( 2 ) - [sub_resource type="CylinderShape" id=5] height = 1.0 radius = 0.5 @@ -91,7 +21,7 @@ script = ExtResource( 1 ) [node name="Mesh" type="MeshInstance" parent="."] transform = Transform( -4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0.00399733, -5, 0 ) mesh = SubResource( 6 ) -material/0 = SubResource( 10 ) +material/0 = ExtResource( 2 ) [node name="StaticBody" type="StaticBody" parent="."] diff --git a/scenes/NoiseWorldGeneration2D.tscn b/scenes/NoiseWorldGeneration2D.tscn index cda09d6..bb07411 100644 --- a/scenes/NoiseWorldGeneration2D.tscn +++ b/scenes/NoiseWorldGeneration2D.tscn @@ -10,11 +10,8 @@ persistence = 0.2 lacunarity = 4.0 [sub_resource type="NoiseTexture" id=4] -width = 128 -height = 128 seamless = true noise = SubResource( 3 ) -noise_offset = Vector2( 2.632, 0 ) [node name="Node2D" type="Node2D"] @@ -30,3 +27,4 @@ size_flags_horizontal = 3 size_flags_vertical = 3 texture = SubResource( 4 ) expand = true +stretch_mode = 5 diff --git a/scenes/StreamContainer.cs b/scenes/StreamContainer.cs index 0621cff..ebd5325 100644 --- a/scenes/StreamContainer.cs +++ b/scenes/StreamContainer.cs @@ -22,6 +22,8 @@ public class StreamContainer : Spatial [Signal] delegate void TileClicked(HexTile3D tile3d); + [Signal] + delegate void TileHovered(HexTile3D tile3d); // other members private Rect2 _worldRect; @@ -110,6 +112,7 @@ public class StreamContainer : Spatial RemovedCoords.Add(tile3D.OffsetCoords); _activeTiles.RemoveChild(tile3D); tile3D.Disconnect("TileClicked", this, nameof(OnTileClicked)); + tile3D.Disconnect("TileHovered", this, nameof(OnTileHovered)); tile3D.QueueFree(); } } @@ -189,6 +192,7 @@ public class StreamContainer : Spatial tile3D.OffsetCoords = offsetCoords; _activeTiles.AddChild(tile3D); tile3D.Connect("TileClicked", this, nameof(OnTileClicked)); + tile3D.Connect("TileHovered", this, nameof(OnTileHovered)); Transform tileTransform = tile3D.Transform; tileTransform.origin.y = _tileWorld.GetHeightAtOffset(offsetCoords); @@ -206,9 +210,29 @@ public class StreamContainer : Spatial UpdateRects(_hexGrid.GetHexCenter(cell)); } + public void SetTileMaterial(ShaderMaterial material) + { + foreach (Spatial node in _activeTiles.GetChildren()) + { + HexTile3D tile = (HexTile3D)node; + if (tile == null) + { + continue; + } + + tile.Mesh.SetSurfaceMaterial(0, material); + } + } + public void OnTileClicked(HexTile3D tile) { GD.Print("Clicked on Tile at " + tile.OffsetCoords); EmitSignal("TileClicked", tile); } + + public void OnTileHovered(HexTile3D tile) + { + GD.Print("Hovered on Tile at " + tile.OffsetCoords); + EmitSignal("TileHovered", tile); + } } \ No newline at end of file diff --git a/scenes/TileWorld.cs b/scenes/TileWorld.cs index 5811c77..70f19b2 100644 --- a/scenes/TileWorld.cs +++ b/scenes/TileWorld.cs @@ -14,7 +14,7 @@ public class TileWorld : Spatial delegate void WorldGenerated(); // public members - public Vector2 Size = new Vector2(10, 10); + public Vector2 Size = new Vector2(100, 100); public float HeightScale = 10; public Image Heightmap; public Image Colormap; diff --git a/scenes/tests/HexTile3DMaterialAssign.cs b/scenes/tests/HexTile3DMaterialAssign.cs new file mode 100644 index 0000000..a071dfa --- /dev/null +++ b/scenes/tests/HexTile3DMaterialAssign.cs @@ -0,0 +1,82 @@ +using Godot; +using System; +using System.Diagnostics; + +public class HexTile3DMaterialAssign : Spatial +{ + // Declare member variables here. Examples: + // private int a = 2; + // private string b = "text"; + + private Button _blackWhitePatternButton; + private Button _colorPatternButton; + private Button _changeMaterialButton; + private SpinBox _textureSizeSpinBox; + private HexTile3D _hexTile; + private ShaderMaterial _customTileMaterial; + private ImageTexture _blackWhitePatternTexture; + private ImageTexture _colorPatternTexture; + + // Called when the node enters the scene tree for the first time. + public override void _Ready() + { + _blackWhitePatternButton = (Button)FindNode("BlackWhitePatternButton"); + Debug.Assert(_blackWhitePatternButton != null); + _blackWhitePatternButton.Connect("pressed", this, nameof(OnBlackWhitePatternButton)); + + _colorPatternButton = (Button)FindNode("ColorPatternButton"); + Debug.Assert(_colorPatternButton != null); + _colorPatternButton.Connect("pressed", this, nameof(OnColorPatternButton)); + + _textureSizeSpinBox = (SpinBox)FindNode("TextureSizeSpinBox"); + Debug.Assert(_textureSizeSpinBox != null); + _textureSizeSpinBox.Connect("value_changed", this, nameof(OnTextureSizeChanged)); + + _hexTile = (HexTile3D)FindNode("HexTile3D"); + Debug.Assert(_hexTile != null); + + _customTileMaterial = GD.Load("materials/HexTileTextureLookup.tres"); + + _blackWhitePatternTexture = new ImageTexture(); + Image image = new Image(); + image.Load("assets/4x4checker.png"); + _blackWhitePatternTexture.CreateFromImage(image, (uint) (Texture.FlagsEnum.Mipmaps | Texture.FlagsEnum.Repeat)); + + _colorPatternTexture = new ImageTexture(); + image.Load("assets/4x4checkerColor.png"); + _colorPatternTexture.CreateFromImage(image, (uint) (Texture.FlagsEnum.Mipmaps | Texture.FlagsEnum.Repeat)); + } + + public void OnBlackWhitePatternButton() + { + GD.Print("Apply Black White Pattern!"); + ShaderMaterial currentMaterial = (ShaderMaterial) _hexTile.Mesh.GetSurfaceMaterial(0); + Debug.Assert(currentMaterial != null); + currentMaterial.SetShaderParam("MapAlbedoTexture", _blackWhitePatternTexture); + +// _customTileMaterial.SetShaderParam("MapAlbedoTexture", _imageTexture); + +// _hexTile.Mesh.SetSurfaceMaterial(0, _customTileMaterial); + } + + public void OnColorPatternButton() + { + GD.Print("Apply Collor Pattern!"); + ShaderMaterial currentMaterial = (ShaderMaterial) _hexTile.Mesh.GetSurfaceMaterial(0); + Debug.Assert(currentMaterial != null); + currentMaterial.SetShaderParam("MapAlbedoTexture", _colorPatternTexture); + +// _customTileMaterial.SetShaderParam("MapAlbedoTexture", _imageTexture); + +// _hexTile.Mesh.SetSurfaceMaterial(0, _customTileMaterial); + } + + public void OnTextureSizeChanged(float value) + { + GD.Print("Texture size: " + value); + ShaderMaterial currentMaterial = (ShaderMaterial) _hexTile.Mesh.GetSurfaceMaterial(0); + Debug.Assert(currentMaterial != null); + currentMaterial.SetShaderParam("TextureSize", (int) value); + GD.Print("Texture size: " + currentMaterial.GetShaderParam("TextureSize")); + } +} diff --git a/scenes/tests/HexTile3DMaterialAssign.tscn b/scenes/tests/HexTile3DMaterialAssign.tscn new file mode 100644 index 0000000..4e25d08 --- /dev/null +++ b/scenes/tests/HexTile3DMaterialAssign.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://scenes/HexTile3D.tscn" type="PackedScene" id=1] +[ext_resource path="res://scenes/tests/HexTile3DMaterialAssign.cs" type="Script" id=2] + +[node name="Spatial" type="Spatial"] +script = ExtResource( 2 ) + +[node name="Camera" type="Camera" parent="."] +transform = Transform( 1, 0, 0, 0, 0.806713, 0.590944, 0, -0.590944, 0.806713, 0, 0.952316, 1.84927 ) + +[node name="Control" type="Control" parent="."] +margin_left = 5.0 +margin_top = 5.0 +margin_right = 40.0 +margin_bottom = 40.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="Control"] +margin_right = 40.0 +margin_bottom = 40.0 +custom_constants/separation = 10 + +[node name="BlackWhitePatternButton" type="Button" parent="Control/HBoxContainer"] +margin_right = 88.0 +margin_bottom = 40.0 +text = "Black White" + +[node name="ColorPatternButton" type="Button" parent="Control/HBoxContainer"] +margin_left = 98.0 +margin_right = 143.0 +margin_bottom = 40.0 +text = "Color" + +[node name="TextureSizeSpinBox" type="SpinBox" parent="Control/HBoxContainer"] +margin_left = 153.0 +margin_right = 227.0 +margin_bottom = 40.0 + +[node name="HexTile3D" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.881519 ) + +[node name="HexTile3D2" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) + +[node name="HexTile3D3" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.76304 ) + +[node name="HexTile3D4" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.753439, 0, -1.31897 ) + +[node name="HexTile3D5" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.753439, 0, -0.437451 ) + +[node name="HexTile3D6" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.753439, 0, -2.20049 ) + +[node name="HexTile3D7" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1.48955, 0, -0.881519 ) + +[node name="HexTile3D8" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1.48955, 0, 0 ) + +[node name="HexTile3D9" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1.48955, 0, -1.76304 ) + +[node name="HexTile3D10" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 2.24298, 0, -1.31897 ) + +[node name="HexTile3D11" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 2.24298, 0, -0.437451 ) + +[node name="HexTile3D12" parent="." instance=ExtResource( 1 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 2.24298, 0, -2.20049 )