WIP: still fixing heighmap and colormap mismatch.

WorldChunkRefactoring
Martin Felis 2023-05-20 21:36:32 +02:00
parent e84fddf102
commit 55da2346d3
3 changed files with 36 additions and 18 deletions

View File

@ -15,6 +15,7 @@ public class Game : Spatial
private Label _numCoordsAddedLabel; private Label _numCoordsAddedLabel;
private Label _numCoordsRemovedLabel; private Label _numCoordsRemovedLabel;
private TextureRect _worldTextureRect; private TextureRect _worldTextureRect;
private TextureRect _heightTextureRect;
private Button _generateWorldButton; private Button _generateWorldButton;
// scene nodes // scene nodes
@ -52,6 +53,7 @@ public class Game : Spatial
_numCoordsAddedLabel = GetNode<Label>("Control/HBoxContainer/GridContainer/num_coords_added_label"); _numCoordsAddedLabel = GetNode<Label>("Control/HBoxContainer/GridContainer/num_coords_added_label");
_numCoordsRemovedLabel = GetNode<Label>("Control/HBoxContainer/GridContainer/num_coords_removed_label"); _numCoordsRemovedLabel = GetNode<Label>("Control/HBoxContainer/GridContainer/num_coords_removed_label");
_worldTextureRect = (TextureRect)FindNode("WorldTextureRect"); _worldTextureRect = (TextureRect)FindNode("WorldTextureRect");
_heightTextureRect = (TextureRect)FindNode("HeightTextureRect");
_generateWorldButton = (Button)FindNode("WorldGenerateButton"); _generateWorldButton = (Button)FindNode("WorldGenerateButton");
// scene nodes // scene nodes
@ -85,6 +87,7 @@ public class Game : Spatial
// update data // update data
_worldTextureRect.RectSize = Vector2.One * _tileWorld.Size; _worldTextureRect.RectSize = Vector2.One * _tileWorld.Size;
_heightTextureRect.RectSize = Vector2.One * _tileWorld.Size;
// connect signals // connect signals
_streamContainerArea.Connect("input_event", this, nameof(OnAreaInputEvent)); _streamContainerArea.Connect("input_event", this, nameof(OnAreaInputEvent));
@ -244,13 +247,17 @@ public class Game : Spatial
public void OnWorldGenerated() public void OnWorldGenerated()
{ {
GD.Print("Using new map"); GD.Print("Using new map");
ImageTexture new_world_texture = new ImageTexture(); ImageTexture newWorldTexture = new ImageTexture();
new_world_texture.CreateFromImage(_tileWorld.Colormap, (uint) (Texture.FlagsEnum.Mipmaps | Texture.FlagsEnum.Repeat)); newWorldTexture.CreateFromImage(_tileWorld.Colormap, (uint) (Texture.FlagsEnum.Mipmaps | Texture.FlagsEnum.Repeat));
ImageTexture newHeightTexture = new ImageTexture();
newHeightTexture.CreateFromImage(_tileWorld.Heightmap, (uint) (Texture.FlagsEnum.Mipmaps | Texture.FlagsEnum.Repeat));
_worldTextureRect.Texture = new_world_texture; _worldTextureRect.Texture = newWorldTexture;
_tileMaterial.SetShaderParam("MapAlbedoTexture", new_world_texture); _tileMaterial.SetShaderParam("MapAlbedoTexture", newWorldTexture);
_tileMaterial.SetShaderParam("TextureSize", (int)_tileWorld.Colormap.GetSize().x); _tileMaterial.SetShaderParam("TextureSize", (int)_tileWorld.Colormap.GetSize().x);
_heightTextureRect.Texture = newHeightTexture;
_streamContainer.OnWorldGenerated(); _streamContainer.OnWorldGenerated();
// Reset player transform to offset 0,0 and at current height // Reset player transform to offset 0,0 and at current height

View File

@ -70,27 +70,34 @@ alignment = 2
[node name="VBoxContainer" type="VBoxContainer" parent="Control/HBoxContainer"] [node name="VBoxContainer" type="VBoxContainer" parent="Control/HBoxContainer"]
margin_right = 100.0 margin_right = 100.0
margin_bottom = 158.0 margin_bottom = 228.0
alignment = 2 alignment = 2
[node name="WorldTextureRect" type="TextureRect" parent="Control/HBoxContainer/VBoxContainer"] [node name="WorldTextureRect" type="TextureRect" parent="Control/HBoxContainer/VBoxContainer"]
margin_top = 34.0
margin_right = 100.0 margin_right = 100.0
margin_bottom = 134.0 margin_bottom = 100.0
rect_min_size = Vector2( 100, 100 )
stretch_mode = 1
flip_v = true
[node name="HeightTextureRect" type="TextureRect" parent="Control/HBoxContainer/VBoxContainer"]
margin_top = 104.0
margin_right = 100.0
margin_bottom = 204.0
rect_min_size = Vector2( 100, 100 ) rect_min_size = Vector2( 100, 100 )
stretch_mode = 1 stretch_mode = 1
flip_v = true flip_v = true
[node name="WorldGenerateButton" type="Button" parent="Control/HBoxContainer/VBoxContainer"] [node name="WorldGenerateButton" type="Button" parent="Control/HBoxContainer/VBoxContainer"]
margin_top = 138.0 margin_top = 208.0
margin_right = 100.0 margin_right = 100.0
margin_bottom = 158.0 margin_bottom = 228.0
text = "Generate" text = "Generate"
[node name="GridContainer" type="GridContainer" parent="Control/HBoxContainer"] [node name="GridContainer" type="GridContainer" parent="Control/HBoxContainer"]
margin_left = 104.0 margin_left = 104.0
margin_right = 231.0 margin_right = 231.0
margin_bottom = 158.0 margin_bottom = 228.0
mouse_filter = 2 mouse_filter = 2
columns = 2 columns = 2

View File

@ -14,8 +14,8 @@ public class TileWorld : Spatial
delegate void WorldGenerated(); delegate void WorldGenerated();
// public members // public members
public float Size = 125; public float Size = 5;
public float HeightScale = 10; public float HeightScale = 10.0f;
public Image Heightmap; public Image Heightmap;
public Image Colormap; public Image Colormap;
public int Seed = 0; public int Seed = 0;
@ -63,19 +63,18 @@ public class TileWorld : Spatial
Heightmap = new Image(); Heightmap = new Image();
Heightmap.Create((int)Size, (int)Size, false, Image.Format.Rf); Heightmap.Create((int)Size, (int)Size, false, Image.Format.Rf);
Heightmap.Lock(); Heightmap.Lock();
Colormap.Lock(); Colormap.Lock();
foreach (int coord_x in Enumerable.Range(0, (int)Size)) foreach (int coord_x in Enumerable.Range(0, (int)Size))
{ {
foreach (int coord_y in Enumerable.Range(0, (int)Size)) foreach (int coord_y in Enumerable.Range(0, (int)Size))
{ {
Colormap.SetPixel(coord_x, coord_y, new Color((float) coord_x, (float) coord_y, 0, 1)); // Colormap.SetPixel(coord_x, coord_y, new Color((float) coord_x, (float) coord_y, 0, 1));
float coord_to_height = float coord_to_height =
(float)coord_y / Size * 0f; (float)coord_y / Size * 0f;
// Heightmap.SetPixel(coord_x, coord_y, new Color(coord_to_height, 0, 0, 1));
if (coord_x == 3 && coord_y == 3) if (coord_x == 1 && coord_y == 4)
{ {
coord_to_height = 1; coord_to_height = 1;
} }
@ -84,6 +83,12 @@ public class TileWorld : Spatial
} }
Colormap.Unlock(); Colormap.Unlock();
ImageTexture imageTexture = new ImageTexture();
imageTexture.CreateFromImage(Heightmap);
imageTexture.Flags = 0;
_offscreenTextureRect.Texture = imageTexture;
Colormap.CopyFrom(imageTexture.GetData());
} }
private void GenerateSimpleMap() private void GenerateSimpleMap()
@ -135,7 +140,6 @@ public class TileWorld : Spatial
noiseGenerator.Lacunarity = 4; noiseGenerator.Lacunarity = 4;
ImageTexture imageTexture = new ImageTexture(); ImageTexture imageTexture = new ImageTexture();
//Heightmap.Unlock();
Heightmap = noiseGenerator.GetSeamlessImage((int)Size); Heightmap = noiseGenerator.GetSeamlessImage((int)Size);
imageTexture.CreateFromImage(Heightmap); imageTexture.CreateFromImage(Heightmap);
imageTexture.Flags = 0; imageTexture.Flags = 0;
@ -179,7 +183,7 @@ public class TileWorld : Spatial
public Vector2 OffsetToTextureCoord(Vector2 offsetCoord) public Vector2 OffsetToTextureCoord(Vector2 offsetCoord)
{ {
Vector2 textureCoord = (offsetCoord - Vector2.One * Mathf.Floor(Size / 2)) % (Vector2.One * Size); Vector2 textureCoord = (offsetCoord - Vector2.One * (Mathf.Floor(Size / 2) + 1)) % (Vector2.One * Size);
if (textureCoord[0] < 0) if (textureCoord[0] < 0)
{ {
textureCoord[0] += Size; textureCoord[0] += Size;