Added TileTypeInfo to store tile masks.
parent
883e256101
commit
7d0e0b23bd
|
@ -1,6 +1,17 @@
|
||||||
|
using System;
|
||||||
using Godot;
|
using Godot;
|
||||||
|
|
||||||
public class Entity : KinematicBody {
|
public class Entity : KinematicBody {
|
||||||
|
[Flags]
|
||||||
|
public enum EntityMaskEnum {
|
||||||
|
Obstacle = 1 << 1,
|
||||||
|
Ground = 1 << 2,
|
||||||
|
Water = 1 << 3
|
||||||
|
}
|
||||||
|
|
||||||
|
[Export(PropertyHint.Flags, "Obstacle,Ground,Water")]
|
||||||
|
public int EntityMask { get; set; }
|
||||||
|
|
||||||
public Vector3 Velocity { get; set; } = Vector3.Zero;
|
public Vector3 Velocity { get; set; } = Vector3.Zero;
|
||||||
public float RotationalVelocity { get; set; } = 0;
|
public float RotationalVelocity { get; set; } = 0;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
[resource]
|
[resource]
|
||||||
shader = ExtResource( 1 )
|
shader = ExtResource( 1 )
|
||||||
shader_param/DeepWaterColor = Color( 0, 0, 0.6, 1 )
|
shader_param/DeepWaterColor = Color( 0, 0, 0.6, 1 )
|
||||||
shader_param/WaterColor = Color( 0, 0, 0.7, 1 )
|
shader_param/WaterColor = Color( 0, 0, 0.698039, 1 )
|
||||||
shader_param/LightWaterColor = Color( 0, 0, 1, 1 )
|
shader_param/LightWaterColor = Color( 0, 0, 1, 1 )
|
||||||
shader_param/SandColor = Color( 0.8, 0.8, 0.1, 1 )
|
shader_param/SandColor = Color( 0.8, 0.8, 0.1, 1 )
|
||||||
shader_param/GrassColor = Color( 0, 0.6, 0, 1 )
|
shader_param/GrassColor = Color( 0, 0.6, 0, 1 )
|
||||||
|
|
|
@ -56,7 +56,7 @@ void fragment() {
|
||||||
|
|
||||||
// COLOR.rgb = color_ramp(texture_color.r * borderFalloffCircle(UV) * 1.8);
|
// COLOR.rgb = color_ramp(texture_color.r * borderFalloffCircle(UV) * 1.8);
|
||||||
COLOR.rgb = color_ramp(texture_color.r * texture(TextureMask, UV).r);
|
COLOR.rgb = color_ramp(texture_color.r * texture(TextureMask, UV).r);
|
||||||
COLOR.a = 0.8;
|
COLOR.a = 1.0;
|
||||||
// COLOR.rgb = vec3(1, 0, 0);
|
// COLOR.rgb = vec3(1, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -114,6 +114,11 @@ Right={
|
||||||
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":0,"physical_scancode":68,"unicode":0,"echo":false,"script":null)
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":0,"physical_scancode":68,"unicode":0,"echo":false,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
ToggleMainMenu={
|
||||||
|
"deadzone": 0.5,
|
||||||
|
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":0,"physical_scancode":16777217,"unicode":0,"echo":false,"script":null)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
[layer_names]
|
[layer_names]
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[gd_scene load_steps=14 format=2]
|
[gd_scene load_steps=15 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://ui/WorldGeneratorWidget.gd" type="Script" id=1]
|
[ext_resource path="res://ui/WorldGeneratorWidget.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://entities/Player.tscn" type="PackedScene" id=2]
|
[ext_resource path="res://entities/Player.tscn" type="PackedScene" id=2]
|
||||||
|
@ -7,6 +7,7 @@
|
||||||
[ext_resource path="res://utils/TileHighlight.tscn" type="PackedScene" id=5]
|
[ext_resource path="res://utils/TileHighlight.tscn" type="PackedScene" id=5]
|
||||||
[ext_resource path="res://ui/DebugStatsContainer.gd" type="Script" id=6]
|
[ext_resource path="res://ui/DebugStatsContainer.gd" type="Script" id=6]
|
||||||
[ext_resource path="res://scenes/World.tscn" type="PackedScene" id=7]
|
[ext_resource path="res://scenes/World.tscn" type="PackedScene" id=7]
|
||||||
|
[ext_resource path="res://ui/WorldGeneratorUI.tscn" type="PackedScene" id=8]
|
||||||
[ext_resource path="res://scenes/Game.cs" type="Script" id=9]
|
[ext_resource path="res://scenes/Game.cs" type="Script" id=9]
|
||||||
[ext_resource path="res://entities/Chest.tscn" type="PackedScene" id=11]
|
[ext_resource path="res://entities/Chest.tscn" type="PackedScene" id=11]
|
||||||
[ext_resource path="res://entities/Axe.tscn" type="PackedScene" id=14]
|
[ext_resource path="res://entities/Axe.tscn" type="PackedScene" id=14]
|
||||||
|
@ -352,6 +353,7 @@ script = ExtResource( 15 )
|
||||||
[node name="NavigationSystem" type="Node" parent="."]
|
[node name="NavigationSystem" type="Node" parent="."]
|
||||||
|
|
||||||
[node name="Player" parent="." instance=ExtResource( 2 )]
|
[node name="Player" parent="." instance=ExtResource( 2 )]
|
||||||
|
EntityMask = 2
|
||||||
WorldNode = NodePath("../World")
|
WorldNode = NodePath("../World")
|
||||||
|
|
||||||
[node name="WorldInfo" parent="Player" index="2"]
|
[node name="WorldInfo" parent="Player" index="2"]
|
||||||
|
@ -371,6 +373,7 @@ input_ray_pickable = false
|
||||||
|
|
||||||
[node name="Chest" parent="Entities" instance=ExtResource( 11 )]
|
[node name="Chest" parent="Entities" instance=ExtResource( 11 )]
|
||||||
transform = Transform( -0.825665, 0, 0.56416, 0, 1, 0, -0.56416, 0, -0.825665, -3.27709, 0, 1.02593 )
|
transform = Transform( -0.825665, 0, 0.56416, 0, 1, 0, -0.56416, 0, -0.825665, -3.27709, 0, 1.02593 )
|
||||||
|
EntityMask = 3
|
||||||
|
|
||||||
[node name="World" parent="." instance=ExtResource( 7 )]
|
[node name="World" parent="." instance=ExtResource( 7 )]
|
||||||
|
|
||||||
|
@ -379,9 +382,60 @@ transform = Transform( 0.328059, -0.878387, 0.347583, 0, 0.367946, 0.929847, -0.
|
||||||
shadow_enabled = true
|
shadow_enabled = true
|
||||||
directional_shadow_mode = 0
|
directional_shadow_mode = 0
|
||||||
|
|
||||||
|
[node name="GameMenu" type="Control" parent="."]
|
||||||
|
visible = false
|
||||||
|
anchor_left = 0.1
|
||||||
|
anchor_top = 0.1
|
||||||
|
anchor_right = 0.9
|
||||||
|
anchor_bottom = 0.9
|
||||||
|
|
||||||
|
[node name="Panel" type="Panel" parent="GameMenu"]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
|
||||||
|
[node name="MainMenu" type="VBoxContainer" parent="GameMenu/Panel"]
|
||||||
|
visible = false
|
||||||
|
anchor_left = 0.5
|
||||||
|
anchor_top = 0.5
|
||||||
|
anchor_right = 0.5
|
||||||
|
anchor_bottom = 0.5
|
||||||
|
margin_left = -41.0
|
||||||
|
margin_top = -10.0
|
||||||
|
margin_right = 41.0
|
||||||
|
margin_bottom = 10.0
|
||||||
|
|
||||||
|
[node name="NewGameButton" type="Button" parent="GameMenu/Panel/MainMenu"]
|
||||||
|
margin_right = 82.0
|
||||||
|
margin_bottom = 20.0
|
||||||
|
text = "New Game"
|
||||||
|
|
||||||
|
[node name="QuitButton" type="Button" parent="GameMenu/Panel/MainMenu"]
|
||||||
|
margin_top = 24.0
|
||||||
|
margin_right = 82.0
|
||||||
|
margin_bottom = 44.0
|
||||||
|
text = "Quit"
|
||||||
|
|
||||||
|
[node name="WorldGeneratorUI" parent="GameMenu/Panel" instance=ExtResource( 8 )]
|
||||||
|
anchor_left = 0.5
|
||||||
|
anchor_top = 0.5
|
||||||
|
anchor_right = 0.5
|
||||||
|
anchor_bottom = 0.5
|
||||||
|
margin_left = -143.5
|
||||||
|
margin_top = -160.0
|
||||||
|
margin_right = 143.5
|
||||||
|
margin_bottom = 160.0
|
||||||
|
|
||||||
|
[node name="VBoxContainer" parent="GameMenu/Panel/WorldGeneratorUI" index="0"]
|
||||||
|
margin_left = 0.0
|
||||||
|
margin_top = 41.0
|
||||||
|
margin_right = 287.0
|
||||||
|
margin_bottom = 279.0
|
||||||
|
|
||||||
[connection signal="toggled" from="DebugContainer/DebugStatsContainer/DebugMenuButton" to="DebugContainer/DebugStatsContainer" method="_on_DebugMenuButton_toggled"]
|
[connection signal="toggled" from="DebugContainer/DebugStatsContainer/DebugMenuButton" to="DebugContainer/DebugStatsContainer" method="_on_DebugMenuButton_toggled"]
|
||||||
[connection signal="value_changed" from="Generator Container/WorldGeneratorWidget/HBoxContainer/WorldSizeSlider" to="Generator Container/WorldGeneratorWidget" method="_on_HSlider_value_changed"]
|
[connection signal="value_changed" from="Generator Container/WorldGeneratorWidget/HBoxContainer/WorldSizeSlider" to="Generator Container/WorldGeneratorWidget" method="_on_HSlider_value_changed"]
|
||||||
[connection signal="toggled" from="Generator Container/WorldGeneratorWidget/ShowTexturesCheckButton" to="Generator Container/WorldGeneratorWidget" method="_on_ShowTexturesCheckButton_toggled"]
|
[connection signal="toggled" from="Generator Container/WorldGeneratorWidget/ShowTexturesCheckButton" to="Generator Container/WorldGeneratorWidget" method="_on_ShowTexturesCheckButton_toggled"]
|
||||||
|
|
||||||
[editable path="Player"]
|
[editable path="Player"]
|
||||||
[editable path="Player/Geometry/PirateAsset"]
|
[editable path="Player/Geometry/PirateAsset"]
|
||||||
|
[editable path="World"]
|
||||||
|
[editable path="GameMenu/Panel/WorldGeneratorUI"]
|
||||||
|
|
|
@ -2,14 +2,17 @@ using System.Diagnostics;
|
||||||
using Godot;
|
using Godot;
|
||||||
|
|
||||||
public class HexTile3D : Spatial {
|
public class HexTile3D : Spatial {
|
||||||
public enum TileType {
|
public class TileTypeInfo {
|
||||||
Undefined,
|
public readonly string Name;
|
||||||
Sand,
|
public readonly Color Color;
|
||||||
Grass,
|
public readonly ushort TileTypeMask;
|
||||||
DeepGrass
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TileType[] ValidTileTypes = { TileType.Sand, TileType.Grass, TileType.DeepGrass };
|
public TileTypeInfo(string name, Color color, ushort tileTypeMask) {
|
||||||
|
Name = name;
|
||||||
|
Color = color;
|
||||||
|
TileTypeMask = tileTypeMask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// scene nodes
|
// scene nodes
|
||||||
private MeshInstance _mesh;
|
private MeshInstance _mesh;
|
||||||
|
@ -44,8 +47,6 @@ public class HexTile3D : Spatial {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public TileType Type { get; set; }
|
|
||||||
|
|
||||||
private HexTile3D() {
|
private HexTile3D() {
|
||||||
_hexGrid = new HexGrid();
|
_hexGrid = new HexGrid();
|
||||||
}
|
}
|
||||||
|
@ -61,8 +62,6 @@ public class HexTile3D : Spatial {
|
||||||
|
|
||||||
Mesh = GetNode<MeshInstance>("Mesh");
|
Mesh = GetNode<MeshInstance>("Mesh");
|
||||||
Debug.Assert(Mesh != null);
|
Debug.Assert(Mesh != null);
|
||||||
|
|
||||||
Type = TileType.Undefined;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[gd_scene load_steps=4 format=2]
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://materials/IslandColorRampShader.tres" type="Material" id=1]
|
[ext_resource path="res://materials/WorldTileTypeMaterial.tres" type="Material" id=1]
|
||||||
|
|
||||||
[sub_resource type="OpenSimplexNoise" id=3]
|
[sub_resource type="OpenSimplexNoise" id=3]
|
||||||
seed = 57
|
seed = 57
|
||||||
|
|
|
@ -161,7 +161,6 @@ public class StreamContainer : Spatial {
|
||||||
} else {
|
} else {
|
||||||
HexTile3D tile3D = _unusedTiles.Dequeue();
|
HexTile3D tile3D = _unusedTiles.Dequeue();
|
||||||
tile3D.OffsetCoords = coord;
|
tile3D.OffsetCoords = coord;
|
||||||
tile3D.Type = TileWorld.GetTileTypeAtOffset(coord);
|
|
||||||
Transform tileTransform = tile3D.Transform;
|
Transform tileTransform = tile3D.Transform;
|
||||||
tileTransform.origin.y = TileWorld.GetHeightAtOffset(coord);
|
tileTransform.origin.y = TileWorld.GetHeightAtOffset(coord);
|
||||||
tile3D.Transform = tileTransform;
|
tile3D.Transform = tileTransform;
|
||||||
|
@ -191,7 +190,6 @@ public class StreamContainer : Spatial {
|
||||||
Transform tileTransform = tile3D.Transform;
|
Transform tileTransform = tile3D.Transform;
|
||||||
tileTransform.origin.y = TileWorld.GetHeightAtOffset(offsetCoords);
|
tileTransform.origin.y = TileWorld.GetHeightAtOffset(offsetCoords);
|
||||||
tile3D.Transform = tileTransform;
|
tile3D.Transform = tileTransform;
|
||||||
tile3D.Type = TileWorld.GetTileTypeAtOffset(offsetCoords);
|
|
||||||
|
|
||||||
_tileToInstanceIndex[tile3D] = _tileToInstanceIndex.Count;
|
_tileToInstanceIndex[tile3D] = _tileToInstanceIndex.Count;
|
||||||
|
|
||||||
|
@ -238,7 +236,6 @@ public class StreamContainer : Spatial {
|
||||||
int instanceIndex = _tileToInstanceIndex[tile3D];
|
int instanceIndex = _tileToInstanceIndex[tile3D];
|
||||||
_tileMultiMesh.Multimesh.SetInstanceTransform(instanceIndex, _deactivatedTileTransform);
|
_tileMultiMesh.Multimesh.SetInstanceTransform(instanceIndex, _deactivatedTileTransform);
|
||||||
|
|
||||||
tile3D.Type = HexTile3D.TileType.Undefined;
|
|
||||||
_unusedTiles.Enqueue(tile3D);
|
_unusedTiles.Enqueue(tile3D);
|
||||||
_coordToTile.Remove(coord);
|
_coordToTile.Remove(coord);
|
||||||
RemovedCoords.Add(coord);
|
RemovedCoords.Add(coord);
|
||||||
|
|
|
@ -372,16 +372,6 @@ public class TileWorld : Spatial {
|
||||||
&& (int)Math.Clamp(offsetCoord.y, -(float)Size / 2, (float)Size / 2 - 1) == (int)offsetCoord.y);
|
&& (int)Math.Clamp(offsetCoord.y, -(float)Size / 2, (float)Size / 2 - 1) == (int)offsetCoord.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public HexTile3D.TileType GetTileTypeAtOffset(Vector2 offsetCoord) {
|
|
||||||
if (!IsOffsetCoordValid(offsetCoord)) {
|
|
||||||
return HexTile3D.TileType.Undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
return HexTile3D.ValidTileTypes[_tileTypeRandom.Next(HexTile3D.ValidTileTypes.Length)];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Vector2 OffsetToTextureCoord(Vector2 offsetCoord) {
|
public Vector2 OffsetToTextureCoord(Vector2 offsetCoord) {
|
||||||
Vector2 mapSize = Vector2.One * Size;
|
Vector2 mapSize = Vector2.One * Size;
|
||||||
Vector2 textureCoord = (offsetCoord + mapSize / 2).PosMod(mapSize);
|
Vector2 textureCoord = (offsetCoord + mapSize / 2).PosMod(mapSize);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
[ext_resource path="res://scenes/TileWorld.cs" type="Script" id=1]
|
[ext_resource path="res://scenes/TileWorld.cs" type="Script" id=1]
|
||||||
[ext_resource path="res://icon.png" type="Texture" id=2]
|
[ext_resource path="res://icon.png" type="Texture" id=2]
|
||||||
[ext_resource path="res://materials/IslandColorRampShader.tres" type="Material" id=3]
|
[ext_resource path="res://materials/WorldTileTypeMaterial.tres" type="Material" id=3]
|
||||||
[ext_resource path="res://materials/IslandHeightmapFalloffShader.tres" type="Material" id=4]
|
[ext_resource path="res://materials/IslandHeightmapFalloffShader.tres" type="Material" id=4]
|
||||||
[ext_resource path="res://entities/rockB.tscn" type="PackedScene" id=5]
|
[ext_resource path="res://entities/rockB.tscn" type="PackedScene" id=5]
|
||||||
[ext_resource path="res://entities/rockC.tscn" type="PackedScene" id=6]
|
[ext_resource path="res://entities/rockC.tscn" type="PackedScene" id=6]
|
||||||
|
|
|
@ -19,10 +19,9 @@ public class World : Spatial {
|
||||||
public int ChunkSize = 14;
|
public int ChunkSize = 14;
|
||||||
public const int NumChunkRows = 3;
|
public const int NumChunkRows = 3;
|
||||||
public const int NumChunkColumns = NumChunkRows;
|
public const int NumChunkColumns = NumChunkRows;
|
||||||
private static readonly Color RockColor = new(0.5f, 0.5f, 0.4f);
|
|
||||||
private static readonly Color GrassColor = new(0, 0.4f, 0);
|
|
||||||
private static readonly Color DarkGrassColor = new(0.05882353f, 0.5411765f, 0.05882353f);
|
private readonly System.Collections.Generic.Dictionary<int, HexTile3D.TileTypeInfo> _tileTypeInfos = new();
|
||||||
private static readonly Color LightWaterColor = new(0.05882353f, 0.05882353f, 0.8627451f);
|
|
||||||
|
|
||||||
private readonly Godot.Collections.Dictionary<Vector2, WorldChunk> _cachedWorldChunks;
|
private readonly Godot.Collections.Dictionary<Vector2, WorldChunk> _cachedWorldChunks;
|
||||||
private readonly List<Vector2> _addedChunkIndices = new();
|
private readonly List<Vector2> _addedChunkIndices = new();
|
||||||
|
@ -41,7 +40,6 @@ public class World : Spatial {
|
||||||
// delegate void OnCoordClicked(Vector2 world_pos);
|
// delegate void OnCoordClicked(Vector2 world_pos);
|
||||||
|
|
||||||
// other members
|
// other members
|
||||||
private Vector2 _centerPlaneCoord;
|
|
||||||
private Vector2 _chunkIndexNorthEast;
|
private Vector2 _chunkIndexNorthEast;
|
||||||
private Vector2 _chunkIndexSouthWest;
|
private Vector2 _chunkIndexSouthWest;
|
||||||
private Array<Spatial> _grassAssets;
|
private Array<Spatial> _grassAssets;
|
||||||
|
@ -62,7 +60,6 @@ public class World : Spatial {
|
||||||
public GenerationState State = GenerationState.Empty;
|
public GenerationState State = GenerationState.Empty;
|
||||||
public Vector2 WorldTextureCoordinateOffset;
|
public Vector2 WorldTextureCoordinateOffset;
|
||||||
|
|
||||||
|
|
||||||
// ui elements
|
// ui elements
|
||||||
|
|
||||||
// scene nodes
|
// scene nodes
|
||||||
|
@ -124,6 +121,24 @@ public class World : Spatial {
|
||||||
foreach (Spatial asset in GetNode<Node>("Assets/Trees").GetChildren()) {
|
foreach (Spatial asset in GetNode<Node>("Assets/Trees").GetChildren()) {
|
||||||
_treeAssets.Add(asset);
|
_treeAssets.Add(asset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_tileTypeInfos[0] = new HexTile3D.TileTypeInfo("Undefined", Colors.Black, 0xffff);
|
||||||
|
LoadTileTypeInfo("DeepWater", (int)Entity.EntityMaskEnum.Water);
|
||||||
|
LoadTileTypeInfo("Water", (int)Entity.EntityMaskEnum.Water);
|
||||||
|
LoadTileTypeInfo("LightWater", (int)Entity.EntityMaskEnum.Water);
|
||||||
|
LoadTileTypeInfo("Sand", (int)Entity.EntityMaskEnum.Ground);
|
||||||
|
LoadTileTypeInfo("Grass", (int)Entity.EntityMaskEnum.Ground);
|
||||||
|
LoadTileTypeInfo("Forest", (int)Entity.EntityMaskEnum.Ground);
|
||||||
|
LoadTileTypeInfo("Rock", (int)Entity.EntityMaskEnum.Ground);
|
||||||
|
LoadTileTypeInfo("Sand", (int)Entity.EntityMaskEnum.Ground);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadTileTypeInfo(string tileTypeName, ushort tileTypeMask) {
|
||||||
|
ShaderMaterial worldTileTypeShaderMaterial =
|
||||||
|
GD.Load<ShaderMaterial>("res://materials/WorldTileTypeMaterial.tres");
|
||||||
|
|
||||||
|
Color tileTypeColor = (Color)worldTileTypeShaderMaterial.GetShaderParam(tileTypeName + "Color");
|
||||||
|
_tileTypeInfos[tileTypeColor.ToRgba32()] = new HexTile3D.TileTypeInfo(tileTypeName, tileTypeColor, tileTypeMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void InitNoiseGenerator() {
|
public void InitNoiseGenerator() {
|
||||||
|
@ -232,18 +247,18 @@ public class World : Spatial {
|
||||||
|
|
||||||
foreach (int textureCoordU in Enumerable.Range(0, chunk.Size)) {
|
foreach (int textureCoordU in Enumerable.Range(0, chunk.Size)) {
|
||||||
foreach (int textureCoordV in Enumerable.Range(0, chunk.Size)) {
|
foreach (int textureCoordV in Enumerable.Range(0, chunk.Size)) {
|
||||||
Color colorValue = chunk.TileTypeImage.GetPixel(textureCoordU, textureCoordV);
|
|
||||||
Vector2 textureCoord = new(textureCoordU, textureCoordV);
|
Vector2 textureCoord = new(textureCoordU, textureCoordV);
|
||||||
Vector2 offsetCoord = chunk.ChunkIndex * ChunkSize + textureCoord;
|
Vector2 offsetCoord = chunk.ChunkIndex * ChunkSize + textureCoord;
|
||||||
|
|
||||||
if (IsColorEqualApprox(colorValue, RockColor)) {
|
HexTile3D.TileTypeInfo tileTypeInfo = GetTileTypeInfoAtOffset(offsetCoord);
|
||||||
|
|
||||||
|
if (tileTypeInfo.Name == "Rock") {
|
||||||
Spatial rockAsset = SelectAsset(textureCoord, _rockAssets, environmentRandom, 0.15);
|
Spatial rockAsset = SelectAsset(textureCoord, _rockAssets, environmentRandom, 0.15);
|
||||||
if (rockAsset != null) {
|
if (rockAsset != null) {
|
||||||
chunk.Entities.AddChild(rockAsset);
|
chunk.Entities.AddChild(rockAsset);
|
||||||
MarkCellUnwalkable(HexGrid.GetHexAtOffset(offsetCoord));
|
MarkCellUnwalkable(HexGrid.GetHexAtOffset(offsetCoord));
|
||||||
}
|
}
|
||||||
} else if (IsColorEqualApprox(colorValue, GrassColor) ||
|
} else if (tileTypeInfo.Name == "Grass" || tileTypeInfo.Name == "DarkGrass") {
|
||||||
IsColorEqualApprox(colorValue, DarkGrassColor)) {
|
|
||||||
Spatial grassAsset = SelectAsset(textureCoord, _grassAssets, environmentRandom, 0.15);
|
Spatial grassAsset = SelectAsset(textureCoord, _grassAssets, environmentRandom, 0.15);
|
||||||
if (grassAsset != null) {
|
if (grassAsset != null) {
|
||||||
chunk.Entities.AddChild(grassAsset);
|
chunk.Entities.AddChild(grassAsset);
|
||||||
|
@ -431,7 +446,7 @@ public class World : Spatial {
|
||||||
_heightmapTexture.CreateFromImage(_heightmapImage);
|
_heightmapTexture.CreateFromImage(_heightmapImage);
|
||||||
|
|
||||||
_viewTileTypeTexture = new ImageTexture();
|
_viewTileTypeTexture = new ImageTexture();
|
||||||
_viewTileTypeTexture.CreateFromImage(_tileTypeMapImage);
|
_viewTileTypeTexture.CreateFromImage(_tileTypeMapImage, (uint)Texture.FlagsEnum.ConvertToLinear);
|
||||||
|
|
||||||
WorldTextureCoordinateOffset = _chunkIndexSouthWest * worldChunkSize;
|
WorldTextureCoordinateOffset = _chunkIndexSouthWest * worldChunkSize;
|
||||||
|
|
||||||
|
@ -463,27 +478,46 @@ public class World : Spatial {
|
||||||
|
|
||||||
public float GetHexCost(Entity entity, HexCell cell) {
|
public float GetHexCost(Entity entity, HexCell cell) {
|
||||||
float nextHexCost = HexGrid.GetHexCost(cell);
|
float nextHexCost = HexGrid.GetHexCost(cell);
|
||||||
|
|
||||||
if (nextHexCost != 0) {
|
if (nextHexCost != 0) {
|
||||||
Vector2 nextOffset = cell.OffsetCoords;
|
Vector2 nextOffset = cell.OffsetCoords;
|
||||||
Vector2 chunkIndex = GetChunkIndexFromOffsetCoord(nextOffset);
|
Color tileTypeColor = GetTileTypeColorAtOffset(nextOffset);
|
||||||
|
|
||||||
if (!_cachedWorldChunks.ContainsKey(chunkIndex)) {
|
if (_tileTypeInfos.TryGetValue(tileTypeColor.ToRgba32(), out HexTile3D.TileTypeInfo info)) {
|
||||||
return 0;
|
int tileTypeMask = info.TileTypeMask;
|
||||||
}
|
if ((entity.EntityMask ^ tileTypeMask) != 0) {
|
||||||
|
|
||||||
WorldChunk chunk = _cachedWorldChunks[chunkIndex];
|
|
||||||
Vector2 textureCoordinate = nextOffset - Vector2.One * ChunkSize * chunkIndex;
|
|
||||||
|
|
||||||
Color tileTypeColor = chunk.TileTypeImage.GetPixel((int)textureCoordinate.x, (int)textureCoordinate.y);
|
|
||||||
if (!IsColorEqualApprox(tileTypeColor, GrassColor) &&
|
|
||||||
!IsColorEqualApprox(tileTypeColor, DarkGrassColor)) {
|
|
||||||
nextHexCost = 0;
|
nextHexCost = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// GD.Print("Could not find tile type info for color " + tileTypeColor);
|
||||||
|
}
|
||||||
|
|
||||||
return nextHexCost;
|
return nextHexCost;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private HexTile3D.TileTypeInfo GetTileTypeInfoAtOffset(Vector2 offsetCoord) {
|
||||||
|
Color tileTypeColor = GetTileTypeColorAtOffset(offsetCoord);
|
||||||
|
if (_tileTypeInfos.TryGetValue(tileTypeColor.ToRgba32(), out HexTile3D.TileTypeInfo info)) {
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _tileTypeInfos[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color GetTileTypeColorAtOffset(Vector2 offsetCoord) {
|
||||||
|
Vector2 chunkIndex = GetChunkIndexFromOffsetCoord(offsetCoord);
|
||||||
|
|
||||||
|
if (!_cachedWorldChunks.ContainsKey(chunkIndex)) {
|
||||||
|
return Colors.Black;
|
||||||
|
}
|
||||||
|
|
||||||
|
WorldChunk chunk = _cachedWorldChunks[chunkIndex];
|
||||||
|
Vector2 textureCoordinate = offsetCoord - Vector2.One * ChunkSize * chunkIndex;
|
||||||
|
|
||||||
|
Color tileTypeColor = chunk.TileTypeImage.GetPixel((int)textureCoordinate.x, (int)textureCoordinate.y);
|
||||||
|
return tileTypeColor;
|
||||||
|
}
|
||||||
|
|
||||||
public float GetMoveCost(Entity entity, HexCell currentHex, HexCell nextHex) {
|
public float GetMoveCost(Entity entity, HexCell currentHex, HexCell nextHex) {
|
||||||
if (GetHexCost(entity, nextHex) == 0) {
|
if (GetHexCost(entity, nextHex) == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -706,11 +740,21 @@ public class World : Spatial {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnTileClicked(HexTile3D tile) {
|
public void OnTileClicked(HexTile3D tile) {
|
||||||
|
if (State != GenerationState.Done) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
EmitSignal("TileClicked", tile);
|
EmitSignal("TileClicked", tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnTileHovered(HexTile3D tile) {
|
public void OnTileHovered(HexTile3D tile) {
|
||||||
|
if (State != GenerationState.Done) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
EmitSignal("TileHovered", tile);
|
EmitSignal("TileHovered", tile);
|
||||||
|
HexTile3D.TileTypeInfo tileTypeInfo = GetTileTypeInfoAtOffset(tile.OffsetCoords);
|
||||||
|
GD.Print("Hover on TileType " + tileTypeInfo.Name + " color: " + tileTypeInfo.Color);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnBlockingSpatialRemoved(Spatial spatialNode) {
|
public void OnBlockingSpatialRemoved(Spatial spatialNode) {
|
||||||
|
|
|
@ -31,7 +31,7 @@ public class WorldChunk : Spatial {
|
||||||
public Viewport HeightmapOffscreenViewport;
|
public Viewport HeightmapOffscreenViewport;
|
||||||
[Export] public Texture NavigationMap;
|
[Export] public Texture NavigationMap;
|
||||||
|
|
||||||
public bool NoiseTextureCheckerboardOverlay = true;
|
public bool NoiseTextureCheckerboardOverlay = false;
|
||||||
|
|
||||||
// signals
|
// signals
|
||||||
[Signal]
|
[Signal]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
[gd_scene load_steps=10 format=2]
|
[gd_scene load_steps=10 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://scenes/WorldChunk.cs" type="Script" id=1]
|
[ext_resource path="res://scenes/WorldChunk.cs" type="Script" id=1]
|
||||||
[ext_resource path="res://materials/IslandColorRampShader.tres" type="Material" id=2]
|
[ext_resource path="res://materials/WorldTileTypeMaterial.tres" type="Material" id=2]
|
||||||
[ext_resource path="res://assets/TestHeightmap.tres" type="Texture" id=3]
|
[ext_resource path="res://assets/TestHeightmap.tres" type="Texture" id=3]
|
||||||
[ext_resource path="res://assets/4x4checkerColor.png" type="Texture" id=4]
|
[ext_resource path="res://assets/4x4checkerColor.png" type="Texture" id=4]
|
||||||
[ext_resource path="res://addons/gdhexgrid/icon.png" type="Texture" id=6]
|
[ext_resource path="res://addons/gdhexgrid/icon.png" type="Texture" id=6]
|
||||||
|
|
|
@ -12,7 +12,6 @@ public class NavigationTests : Spatial {
|
||||||
|
|
||||||
private EditorUI _editorUi;
|
private EditorUI _editorUi;
|
||||||
private World _world;
|
private World _world;
|
||||||
private StreamContainer _streamContainer;
|
|
||||||
private Player _player;
|
private Player _player;
|
||||||
private NavigationComponent _playerNavigationComponent;
|
private NavigationComponent _playerNavigationComponent;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ extends CenterContainer
|
||||||
|
|
||||||
onready var SeedLineEdit: LineEdit
|
onready var SeedLineEdit: LineEdit
|
||||||
onready var ChunkSizeSpinBox: SpinBox
|
onready var ChunkSizeSpinBox: SpinBox
|
||||||
onready var GameScene: PackedScene = preload ("res://scenes/Game.tscn")
|
#onready var GameScene: PackedScene = preload ("res://scenes/Game.tscn")
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
SeedLineEdit = find_node("SeedLineEdit")
|
SeedLineEdit = find_node("SeedLineEdit")
|
||||||
|
@ -19,8 +19,8 @@ func _on_RefreshSeedButton_pressed():
|
||||||
|
|
||||||
|
|
||||||
func _on_GenerateButton_pressed():
|
func _on_GenerateButton_pressed():
|
||||||
var game_scene_instance = GameScene.instance()
|
# var game_scene_instance = GameScene.instance()
|
||||||
|
|
||||||
self.visible = false
|
self.visible = false
|
||||||
get_tree().get_root().add_child(game_scene_instance)
|
# get_tree().get_root().add_child(game_scene_instance)
|
||||||
game_scene_instance.StartNewGame(int(SeedLineEdit.text), int(ChunkSizeSpinBox.value))
|
# game_scene_instance.StartNewGame(int(SeedLineEdit.text), int(ChunkSizeSpinBox.value))
|
||||||
|
|
Loading…
Reference in New Issue