Started populating generated islands.
parent
fdddc7d2ef
commit
f21db2ac4f
|
@ -0,0 +1,5 @@
|
||||||
|
[gd_scene load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://assets/KenneySurvivalKit/Models/grass.glb" type="PackedScene" id=1]
|
||||||
|
|
||||||
|
[node name="grass" instance=ExtResource( 1 )]
|
|
@ -0,0 +1,8 @@
|
||||||
|
[gd_scene load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://assets/KenneySurvivalKit/Models/grassLarge.glb" type="PackedScene" id=1]
|
||||||
|
|
||||||
|
[node name="grassLarge" instance=ExtResource( 1 )]
|
||||||
|
|
||||||
|
[node name="grassLarge" parent="." index="0"]
|
||||||
|
transform = Transform( 1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 0, 0 )
|
|
@ -0,0 +1,19 @@
|
||||||
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://assets/KenneySurvivalKit/Models/rockA.glb" type="PackedScene" id=1]
|
||||||
|
|
||||||
|
[sub_resource type="CylinderShape" id=1]
|
||||||
|
height = 0.736755
|
||||||
|
radius = 0.4
|
||||||
|
|
||||||
|
[node name="rockA" instance=ExtResource( 1 )]
|
||||||
|
|
||||||
|
[node name="rockA" parent="." index="0"]
|
||||||
|
transform = Transform( 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0 )
|
||||||
|
|
||||||
|
[node name="StaticBody" type="StaticBody" parent="." index="1"]
|
||||||
|
input_ray_pickable = false
|
||||||
|
|
||||||
|
[node name="CollisionShape" type="CollisionShape" parent="StaticBody" index="0"]
|
||||||
|
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.373712, 0 )
|
||||||
|
shape = SubResource( 1 )
|
|
@ -0,0 +1,19 @@
|
||||||
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://assets/KenneySurvivalKit/Models/rockB.glb" type="PackedScene" id=1]
|
||||||
|
|
||||||
|
[sub_resource type="CylinderShape" id=1]
|
||||||
|
height = 0.679261
|
||||||
|
radius = 0.4
|
||||||
|
|
||||||
|
[node name="rockB" instance=ExtResource( 1 )]
|
||||||
|
|
||||||
|
[node name="rockB" parent="." index="0"]
|
||||||
|
transform = Transform( 1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.6, 0, 0, 0 )
|
||||||
|
|
||||||
|
[node name="StaticBody" type="StaticBody" parent="." index="1"]
|
||||||
|
input_ray_pickable = false
|
||||||
|
|
||||||
|
[node name="CollisionShape" type="CollisionShape" parent="StaticBody" index="0"]
|
||||||
|
transform = Transform( 1, 0, 0, 0, 0.999997, -0.00240855, 0, 0.00240855, 0.999997, 0, 0.376176, 0 )
|
||||||
|
shape = SubResource( 1 )
|
|
@ -0,0 +1,19 @@
|
||||||
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://assets/KenneySurvivalKit/Models/rockC.glb" type="PackedScene" id=1]
|
||||||
|
|
||||||
|
[sub_resource type="CylinderShape" id=1]
|
||||||
|
height = 1.38848
|
||||||
|
radius = 0.4
|
||||||
|
|
||||||
|
[node name="rockC" instance=ExtResource( 1 )]
|
||||||
|
|
||||||
|
[node name="rockC" parent="." index="0"]
|
||||||
|
transform = Transform( 1.7, 0, 0, 0, 1.7, 0, 0, 0, 1.7, 0, 0, 0 )
|
||||||
|
|
||||||
|
[node name="StaticBody" type="StaticBody" parent="." index="1"]
|
||||||
|
input_ray_pickable = false
|
||||||
|
|
||||||
|
[node name="CollisionShape" type="CollisionShape" parent="StaticBody" index="0"]
|
||||||
|
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.746043, 0 )
|
||||||
|
shape = SubResource( 1 )
|
|
@ -0,0 +1,22 @@
|
||||||
|
|
||||||
|
|
||||||
|
Survival Kit 1.1
|
||||||
|
|
||||||
|
Created/distributed by Kenney (www.kenney.nl)
|
||||||
|
Creation date: 25-05-2022 11:00
|
||||||
|
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
License: (Creative Commons Zero, CC0)
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
|
||||||
|
This content is free to use in personal, educational and commercial projects.
|
||||||
|
Support us by crediting Kenney or www.kenney.nl (this is not mandatory)
|
||||||
|
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Donate: http://support.kenney.nl
|
||||||
|
Patreon: http://patreon.com/kenney/
|
||||||
|
|
||||||
|
Follow on Twitter for updates:
|
||||||
|
http://twitter.com/KenneyNL
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -16,12 +16,10 @@ vec3 color_ramp(float h) {
|
||||||
return vec3(0.8, 0.8, 0.1);
|
return vec3(0.8, 0.8, 0.1);
|
||||||
} else if (h < 0.6){
|
} else if (h < 0.6){
|
||||||
return vec3(0, 0.6, 0);
|
return vec3(0, 0.6, 0);
|
||||||
} else if (h < 0.68){
|
} else if (h < 0.78){
|
||||||
return vec3(0, 0.4, 0);
|
return vec3(0, 0.4, 0);
|
||||||
} else if (h <= 0.78){
|
|
||||||
return vec3(0.6, 0.6, 0.6);
|
|
||||||
} else if (h < 1.0){
|
} else if (h < 1.0){
|
||||||
return vec3(0.8, 0.8, 0.8);
|
return vec3(0.5, 0.5, 0.4);
|
||||||
}
|
}
|
||||||
|
|
||||||
return vec3(1.0);
|
return vec3(1.0);
|
||||||
|
|
|
@ -18,12 +18,10 @@ vec3 color_ramp(float h) {
|
||||||
return vec3(0.8, 0.8, 0.1);
|
return vec3(0.8, 0.8, 0.1);
|
||||||
} else if (h < 0.65){
|
} else if (h < 0.65){
|
||||||
return vec3(0, 0.6, 0);
|
return vec3(0, 0.6, 0);
|
||||||
} else if (h < 0.75){
|
|
||||||
return vec3(0, 0.4, 0);
|
|
||||||
} else if (h <= 0.85){
|
} else if (h <= 0.85){
|
||||||
return vec3(0.6, 0.6, 0.6);
|
return vec3(0, 0.4, 0);
|
||||||
} else if (h < 1.0){
|
} else if (h < 1.0){
|
||||||
return vec3(0.8, 0.8, 0.8);
|
return vec3(0.6, 0.6, 0.6);
|
||||||
}
|
}
|
||||||
|
|
||||||
return vec3(1.0);
|
return vec3(1.0);
|
||||||
|
|
|
@ -199,7 +199,6 @@ margin_left = 10.0
|
||||||
margin_top = 10.0
|
margin_top = 10.0
|
||||||
margin_right = 110.0
|
margin_right = 110.0
|
||||||
margin_bottom = 258.0
|
margin_bottom = 258.0
|
||||||
alignment = 2
|
|
||||||
script = ExtResource( 12 )
|
script = ExtResource( 12 )
|
||||||
|
|
||||||
[node name="HBoxContainer" type="HBoxContainer" parent="Generator Container/WorldGeneratorContainer"]
|
[node name="HBoxContainer" type="HBoxContainer" parent="Generator Container/WorldGeneratorContainer"]
|
||||||
|
@ -228,6 +227,7 @@ margin_bottom = 40.0
|
||||||
text = "Generate"
|
text = "Generate"
|
||||||
|
|
||||||
[node name="WorldTextureRect" type="TextureRect" parent="Generator Container/WorldGeneratorContainer"]
|
[node name="WorldTextureRect" type="TextureRect" parent="Generator Container/WorldGeneratorContainer"]
|
||||||
|
visible = false
|
||||||
margin_top = 44.0
|
margin_top = 44.0
|
||||||
margin_right = 100.0
|
margin_right = 100.0
|
||||||
margin_bottom = 144.0
|
margin_bottom = 144.0
|
||||||
|
@ -236,6 +236,7 @@ stretch_mode = 1
|
||||||
flip_v = true
|
flip_v = true
|
||||||
|
|
||||||
[node name="HeightTextureRect" type="TextureRect" parent="Generator Container/WorldGeneratorContainer"]
|
[node name="HeightTextureRect" type="TextureRect" parent="Generator Container/WorldGeneratorContainer"]
|
||||||
|
visible = false
|
||||||
margin_top = 148.0
|
margin_top = 148.0
|
||||||
margin_right = 100.0
|
margin_right = 100.0
|
||||||
margin_bottom = 248.0
|
margin_bottom = 248.0
|
||||||
|
|
|
@ -2,6 +2,8 @@ using Godot;
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using Godot.Collections;
|
||||||
|
using Array = Godot.Collections.Array;
|
||||||
using Vector2 = Godot.Vector2;
|
using Vector2 = Godot.Vector2;
|
||||||
using Vector3 = Godot.Vector3;
|
using Vector3 = Godot.Vector3;
|
||||||
|
|
||||||
|
@ -11,9 +13,14 @@ public class TileWorld : Spatial
|
||||||
{
|
{
|
||||||
Heightmap,
|
Heightmap,
|
||||||
Color,
|
Color,
|
||||||
|
Objects,
|
||||||
Done
|
Done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// constants
|
||||||
|
private static readonly Color RockColor = new Color (0.5f, 0.5f, 0.4f, 1f);
|
||||||
|
private static readonly Color GrassColor = new Color (0, 0.4f, 0, 1f);
|
||||||
|
|
||||||
private GenerationState _currentGenerationState = GenerationState.Heightmap;
|
private GenerationState _currentGenerationState = GenerationState.Heightmap;
|
||||||
|
|
||||||
// signals
|
// signals
|
||||||
|
@ -34,7 +41,9 @@ public class TileWorld : Spatial
|
||||||
private TextureRect _worldOffscreenTextureRect;
|
private TextureRect _worldOffscreenTextureRect;
|
||||||
private Viewport _heightmapOffscreenViewport;
|
private Viewport _heightmapOffscreenViewport;
|
||||||
private TextureRect _heightmapOffscreenTextureRect;
|
private TextureRect _heightmapOffscreenTextureRect;
|
||||||
|
private Array<Spatial> _rockAssets = new Array<Spatial>();
|
||||||
|
private Array<Spatial> _grassAssets = new Array<Spatial>();
|
||||||
|
private Spatial _environmentNode;
|
||||||
|
|
||||||
// Called when the node enters the scene tree for the first time.
|
// Called when the node enters the scene tree for the first time.
|
||||||
public override void _Ready()
|
public override void _Ready()
|
||||||
|
@ -56,6 +65,21 @@ public class TileWorld : Spatial
|
||||||
Debug.Assert(_heightmapOffscreenTextureRect != null);
|
Debug.Assert(_heightmapOffscreenTextureRect != null);
|
||||||
_heightmapOffscreenTextureRect.SetSize(new Vector2(Size, Size));
|
_heightmapOffscreenTextureRect.SetSize(new Vector2(Size, Size));
|
||||||
|
|
||||||
|
GetNode<Spatial>("Assets").Visible = false;
|
||||||
|
|
||||||
|
foreach (Spatial asset in GetNode<Node>("Assets/Rocks").GetChildren())
|
||||||
|
{
|
||||||
|
_rockAssets.Add(asset);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (Spatial asset in GetNode<Node>("Assets/Grass").GetChildren())
|
||||||
|
{
|
||||||
|
_grassAssets.Add(asset);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_environmentNode = GetNode<Spatial>("Environment");
|
||||||
|
|
||||||
Generate(Size);
|
Generate(Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,6 +91,8 @@ public class TileWorld : Spatial
|
||||||
_worldOffscreenViewport.Size = new Vector2(size, size);
|
_worldOffscreenViewport.Size = new Vector2(size, size);
|
||||||
_heightmapOffscreenViewport.Size = new Vector2(size, size);
|
_heightmapOffscreenViewport.Size = new Vector2(size, size);
|
||||||
|
|
||||||
|
OnMapGenerationStart();
|
||||||
|
|
||||||
GenerateNoiseMap();
|
GenerateNoiseMap();
|
||||||
// GenerateDebugMap();
|
// GenerateDebugMap();
|
||||||
|
|
||||||
|
@ -122,6 +148,13 @@ public class TileWorld : Spatial
|
||||||
OnHeightMapChanged();
|
OnHeightMapChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnMapGenerationStart()
|
||||||
|
{
|
||||||
|
foreach (Node child in _environmentNode.GetChildren())
|
||||||
|
{
|
||||||
|
child.QueueFree();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void OnHeightMapChanged()
|
private void OnHeightMapChanged()
|
||||||
{
|
{
|
||||||
|
@ -134,6 +167,62 @@ public class TileWorld : Spatial
|
||||||
EmitSignal("WorldGenerated");
|
EmitSignal("WorldGenerated");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Spatial SelectAsset(Vector2 offsetCoord, Array<Spatial> assets, Random randomGenerator, double probability)
|
||||||
|
{
|
||||||
|
if (randomGenerator.NextDouble() < 1.0 - probability)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int assetIndex = randomGenerator.Next(assets.Count);
|
||||||
|
Spatial assetInstance = (Spatial) assets[assetIndex].Duplicate();
|
||||||
|
Transform assetTransform = Transform.Identity;
|
||||||
|
assetTransform.origin = GetTileWorldCenterFromOffset(offsetCoord);
|
||||||
|
assetTransform.origin.y += 1.2f;
|
||||||
|
assetTransform.basis = assetTransform.basis.Rotated(Vector3.Up, (float)(randomGenerator.NextDouble() * Mathf.Pi * 2));
|
||||||
|
assetInstance.Transform = assetTransform;
|
||||||
|
|
||||||
|
return assetInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsColorEqualApprox(Color colorA, Color colorB)
|
||||||
|
{
|
||||||
|
Vector3 colorDifference = new Vector3(colorA.r - colorB.r, colorA.g - colorB.g, colorA.b - colorB.b);
|
||||||
|
return colorDifference.LengthSquared() < 0.1 * 0.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PopulateEnvironment()
|
||||||
|
{
|
||||||
|
Random environmentRandom = new Random(Seed);
|
||||||
|
|
||||||
|
Colormap.Lock();
|
||||||
|
foreach (int coord_x in Enumerable.Range(0, Size))
|
||||||
|
{
|
||||||
|
foreach (int coord_y in Enumerable.Range(0, Size))
|
||||||
|
{
|
||||||
|
Vector2 offsetCoord = new Vector2(coord_x, coord_y);
|
||||||
|
Color colorValue = Colormap.GetPixel(coord_x, coord_y);
|
||||||
|
|
||||||
|
if (IsColorEqualApprox(colorValue, RockColor))
|
||||||
|
{
|
||||||
|
Spatial rockAsset = SelectAsset(offsetCoord, _rockAssets, environmentRandom, 0.15);
|
||||||
|
if (rockAsset != null)
|
||||||
|
{
|
||||||
|
_environmentNode.AddChild(rockAsset);
|
||||||
|
}
|
||||||
|
} else if (IsColorEqualApprox(colorValue, GrassColor))
|
||||||
|
{
|
||||||
|
Spatial grassAsset = SelectAsset(offsetCoord, _grassAssets, environmentRandom, 0.35);
|
||||||
|
if (grassAsset != null)
|
||||||
|
{
|
||||||
|
_environmentNode.AddChild(grassAsset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Colormap.Unlock();
|
||||||
|
}
|
||||||
|
|
||||||
public override void _Process(float delta)
|
public override void _Process(float delta)
|
||||||
{
|
{
|
||||||
if (_currentGenerationState == GenerationState.Heightmap)
|
if (_currentGenerationState == GenerationState.Heightmap)
|
||||||
|
@ -147,14 +236,17 @@ public class TileWorld : Spatial
|
||||||
else if (_currentGenerationState == GenerationState.Color)
|
else if (_currentGenerationState == GenerationState.Color)
|
||||||
{
|
{
|
||||||
Colormap = new Image();
|
Colormap = new Image();
|
||||||
Colormap.Create(Size, Size, false, Image.Format.Rgba8);
|
Colormap.Create(Size, Size, false, Image.Format.Rgb8);
|
||||||
Colormap.CopyFrom(_worldOffscreenViewport.GetTexture().GetData());
|
Colormap.CopyFrom(_worldOffscreenViewport.GetTexture().GetData());
|
||||||
Heightmap.Lock();
|
Heightmap.Lock();
|
||||||
|
|
||||||
_currentGenerationState = GenerationState.Done;
|
_currentGenerationState = GenerationState.Objects;
|
||||||
|
|
||||||
|
PopulateEnvironment();
|
||||||
|
|
||||||
OnMapGenerationComplete();
|
OnMapGenerationComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsOffsetCoordValid(Vector2 offsetCoord)
|
public bool IsOffsetCoordValid(Vector2 offsetCoord)
|
||||||
|
@ -223,9 +315,10 @@ public class TileWorld : Spatial
|
||||||
{
|
{
|
||||||
Vector2 tileCenter = _hexGrid.GetHexCenterFromOffset(offsetCoord);
|
Vector2 tileCenter = _hexGrid.GetHexCenterFromOffset(offsetCoord);
|
||||||
|
|
||||||
|
// TODO: coordinates do not match for bigger maps
|
||||||
return new Vector3(
|
return new Vector3(
|
||||||
tileCenter.x,
|
tileCenter.x - Size * 0.75f * 0.5f,
|
||||||
GetHeightAtOffset(offsetCoord),
|
GetHeightAtOffset(offsetCoord),
|
||||||
tileCenter.y);
|
tileCenter.y + (Mathf.Sqrt(3) / 2) * Size * 0.5f);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,9 +1,13 @@
|
||||||
[gd_scene load_steps=5 format=2]
|
[gd_scene load_steps=9 format=2]
|
||||||
|
|
||||||
[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/IslandColorRampShader.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://assets/Environment/rockB.tscn" type="PackedScene" id=5]
|
||||||
|
[ext_resource path="res://assets/Environment/rockC.tscn" type="PackedScene" id=6]
|
||||||
|
[ext_resource path="res://assets/Environment/rockA.tscn" type="PackedScene" id=7]
|
||||||
|
[ext_resource path="res://assets/Environment/grassLarge.tscn" type="PackedScene" id=8]
|
||||||
|
|
||||||
[node name="TileWorld" type="Spatial"]
|
[node name="TileWorld" type="Spatial"]
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
@ -44,3 +48,20 @@ material = ExtResource( 4 )
|
||||||
texture = ExtResource( 2 )
|
texture = ExtResource( 2 )
|
||||||
|
|
||||||
[node name="Camera2D" type="Camera2D" parent="HeightmapOffscreenViewport"]
|
[node name="Camera2D" type="Camera2D" parent="HeightmapOffscreenViewport"]
|
||||||
|
|
||||||
|
[node name="Assets" type="Spatial" parent="."]
|
||||||
|
visible = false
|
||||||
|
|
||||||
|
[node name="Rocks" type="Spatial" parent="Assets"]
|
||||||
|
|
||||||
|
[node name="rockA" parent="Assets/Rocks" instance=ExtResource( 7 )]
|
||||||
|
|
||||||
|
[node name="rockB" parent="Assets/Rocks" instance=ExtResource( 5 )]
|
||||||
|
|
||||||
|
[node name="rockC" parent="Assets/Rocks" instance=ExtResource( 6 )]
|
||||||
|
|
||||||
|
[node name="Grass" type="Spatial" parent="Assets"]
|
||||||
|
|
||||||
|
[node name="grassLarge" parent="Assets/Grass" instance=ExtResource( 8 )]
|
||||||
|
|
||||||
|
[node name="Environment" type="Spatial" parent="."]
|
||||||
|
|
Loading…
Reference in New Issue