diff --git a/.forgejo/01plates.png b/.forgejo/01plates.png
deleted file mode 100644
index e4f2679..0000000
--- a/.forgejo/01plates.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4474dfe2656785d8df368dfc61a0b6dd11021c229669c64f9eddd2f790fb6c68
-size 126061
diff --git a/.forgejo/02oceans.png b/.forgejo/02oceans.png
deleted file mode 100644
index 2103f65..0000000
--- a/.forgejo/02oceans.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c8d2626d214f70432668b55e5a17960f3519a8ef0f3f2cf968f7f4d5147220ea
-size 137088
diff --git a/.forgejo/03stresses.png b/.forgejo/03stresses.png
deleted file mode 100644
index 67479dd..0000000
--- a/.forgejo/03stresses.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:53835e85efba47bcaa1a281bae7ae418260a521bb6bf3264a895d8f850656707
-size 140915
diff --git a/.forgejo/04planet.png b/.forgejo/04planet.png
deleted file mode 100644
index b731a90..0000000
--- a/.forgejo/04planet.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:283cfaaec5b21c34108035f533be87dcb4a13cef421427830f4a0a800291c6b6
-size 224211
diff --git a/.forgejo/export.png b/.forgejo/export.png
index c35cfe3..7fc3e36 100644
--- a/.forgejo/export.png
+++ b/.forgejo/export.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:41ae2d919475771f50b155aab54e2dc6b2c3add357f3883908701f67c6922348
-size 613281
+oid sha256:47b72f11557cf5b2060054f1d640bb42279a58ba34b3d9b37e25af10101e6bbb
+size 102368
diff --git a/.forgejo/planet.png b/.forgejo/planet.png
new file mode 100644
index 0000000..99fb00b
--- /dev/null
+++ b/.forgejo/planet.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2ce30336f743e552d2820d9b328c530d2de2666d0fa748c27a9255917c6b1909
+size 262214
diff --git a/.forgejo/projection.png b/.forgejo/projection.png
index 6d39d60..8b2fe90 100644
--- a/.forgejo/projection.png
+++ b/.forgejo/projection.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:71b10ccdc61002f7d6bd9ed1c6e0276db0422b5216cd0dbff92b026d70c9dc3f
-size 601515
+oid sha256:5a3dc6ce3038331d578f5f804ce02cda5cc4e7a722c0dc8bf63240a23b7e5839
+size 770350
diff --git a/.forgejo/time.png b/.forgejo/time.png
deleted file mode 100644
index 77424a3..0000000
--- a/.forgejo/time.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9afa68b8851ca555076b0780734b0a03fe7af1ef4bfd6fed168d2c3c59518cd7
-size 208412
diff --git a/PlanetLow.mtl b/PlanetLow.mtl
new file mode 100644
index 0000000..84f636a
--- /dev/null
+++ b/PlanetLow.mtl
@@ -0,0 +1,2 @@
+# Blender 5.0.1 MTL File: 'None'
+# www.blender.org
diff --git a/README.md b/README.md
index de93358..c8dfb02 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,5 @@
# Adatonics
-
-
-
-
-
+

Planet generation with simple plate tectonics.
diff --git a/adatonic.sln.DotSettings.user b/adatonic.sln.DotSettings.user
index 5f589d5..ceb9423 100644
--- a/adatonic.sln.DotSettings.user
+++ b/adatonic.sln.DotSettings.user
@@ -1,8 +1,6 @@
- ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
- ForceIncluded
- ForceIncluded
\ No newline at end of file
+ ForceIncluded
\ No newline at end of file
diff --git a/project.godot b/project.godot
index 414f41a..23d21db 100644
--- a/project.godot
+++ b/project.godot
@@ -50,3 +50,5 @@ mouse_secondary={
[rendering]
rendering_device/driver.windows="d3d12"
+renderer/rendering_method="gl_compatibility"
+renderer/rendering_method.mobile="gl_compatibility"
diff --git a/shaders/compute/PlateExpansion.glsl b/shaders/compute/PlateExpansion.glsl
deleted file mode 100644
index 32990c4..0000000
--- a/shaders/compute/PlateExpansion.glsl
+++ /dev/null
@@ -1,40 +0,0 @@
-#[compute]
-#version 450
-// Invocations in the (x, y, z) dimension
-layout(local_size_x = 25, local_size_y = 1, local_size_z = 1) in;
-
-// A binding to the buffer we create in our script
-layout(set = 0, binding = 0, std430) restrict buffer PointBuffer {
- int points[];
-}
-pointbuffer;
-layout(set = 0, binding = 1, std430) restrict buffer NeighborBuffer {
- int neighbors[];
-}
-neighborbuffer;
-layout(set = 0, binding = 2, std430) restrict buffer PlateBuffer {
- int plateid[];
-}
-platebuffer;
-
-// The code we want to execute in each invocation
-void main() {
- // Iteration is gl_GlobalInvocationID.x
- // Neighbors for Point gl_GlobalInvocationID.y
- for (int point = 0; point < int(gl_WorkGroupSize.x); point++)
- {
- int localpoint = int(gl_WorkGroupID.x)*int(gl_WorkGroupSize.x) + point;
- for (int neighbor = 0; neighbor < 6; neighbor++) {
- if (neighborbuffer.neighbors[localpoint*6+neighbor] == -1)
- {
- continue;
- }
- if (platebuffer.plateid[localpoint] != -1 && platebuffer.plateid[neighborbuffer.neighbors[localpoint*6+neighbor]] == -1)
- {
- // Neighbor unclaimed, and we can claim it.
- platebuffer.plateid[neighborbuffer.neighbors[localpoint*6+neighbor]] = platebuffer.plateid[localpoint];
- }
- }
- }
-
-}
diff --git a/shaders/compute/PlateExpansion.glsl.import b/shaders/compute/PlateExpansion.glsl.import
deleted file mode 100644
index 8be2164..0000000
--- a/shaders/compute/PlateExpansion.glsl.import
+++ /dev/null
@@ -1,14 +0,0 @@
-[remap]
-
-importer="glsl"
-type="RDShaderFile"
-uid="uid://cypd2lshixd17"
-path="res://.godot/imported/PlateExpansion.glsl-9047ef54068b6d1a50f93c2cd303b382.res"
-
-[deps]
-
-source_file="res://shaders/compute/PlateExpansion.glsl"
-dest_files=["res://.godot/imported/PlateExpansion.glsl-9047ef54068b6d1a50f93c2cd303b382.res"]
-
-[params]
-
diff --git a/shaders/compute/compute_example.glsl b/shaders/compute/compute_example.glsl
deleted file mode 100644
index c3e3ce3..0000000
--- a/shaders/compute/compute_example.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-#[compute]
-#version 450
-
-// Invocations in the (x, y, z) dimension
-layout(local_size_x = 2, local_size_y = 1, local_size_z = 1) in;
-
-// A binding to the buffer we create in our script
-layout(set = 0, binding = 0, std430) restrict buffer MyDataBuffer {
- float data[];
-}
-my_data_buffer;
-
-// The code we want to execute in each invocation
-void main() {
- // gl_GlobalInvocationID.x uniquely identifies this invocation across all work groups
- my_data_buffer.data[gl_GlobalInvocationID.x] *= 2.0;
-}
diff --git a/shaders/compute/compute_example.glsl.import b/shaders/compute/compute_example.glsl.import
deleted file mode 100644
index 4dbf9d7..0000000
--- a/shaders/compute/compute_example.glsl.import
+++ /dev/null
@@ -1,14 +0,0 @@
-[remap]
-
-importer="glsl"
-type="RDShaderFile"
-uid="uid://du2kf2vmf800w"
-path="res://.godot/imported/compute_example.glsl-3f04b63d0b43774004ed10776fd05117.res"
-
-[deps]
-
-source_file="res://shaders/compute/compute_example.glsl"
-dest_files=["res://.godot/imported/compute_example.glsl-3f04b63d0b43774004ed10776fd05117.res"]
-
-[params]
-
diff --git a/src/Main.cs b/src/Main.cs
index 9932642..7d79a6d 100644
--- a/src/Main.cs
+++ b/src/Main.cs
@@ -1,13 +1,10 @@
#nullable enable
using Godot;
using System;
-using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
-using System.Threading.Tasks;
using Godot.Collections;
-using Array = System.Array;
public partial class Main : Control
{
@@ -42,43 +39,6 @@ public partial class Main : Control
Projector.GatherPoints(_planetHelper, int.Parse(GetNode("%Resolution").Text));
AxialTiltChanged(GetNode("%AxialTilt").Text);
UpdateTime();
-
- _planetHelper.InitializeGeneration();
- _planetHelper.Plates[0].Color = _planetHelper.GetInitialColor(true);
- //_planetHelper.Plates[1].Color = _planetHelper.GetInitialColor(true);
- //_planetHelper.Plates[2].Color = _planetHelper.GetInitialColor(false);
- //_planetHelper.Plates[3].Color = _planetHelper.GetInitialColor(false);
-
- // for (int i = 0; i < 1; i++)
- // {
- // for (int point = 0; point < points.Length; point++)
- // {
- // for (int neighbor = 0; neighbor < 6; neighbor++)
- // {
- // if (neighbors[point * 6 + neighbor] == -1)
- // {
- // continue;
- // }
- //
- // int x = plateids[point];
- // int y = neighbors[point * 6 + neighbor];
- // int z = plateids[y];
- // if (x != -1 && z == -1)
- // {
- // // Neighbor unclaimed, and we can claim it.
- // plateids[neighbors[point * 6 +neighbor]] = plateids[point];
- // }
- // }
- // }
- // }
- // int index = 0;
- // foreach (int plate in plateids)
- // {
- // if (plate != -1)
- // _planetHelper.Mdt.SetVertexColor(index, _planetHelper.Plates[plate].Color);
- // index++;
- // }
- // _planetHelper.UpdateMesh();
}
Vector3 _pointerPosition = Vector3.Zero;
diff --git a/src/Oct.cs b/src/Oct.cs
index f1bf1fb..ce1722a 100644
--- a/src/Oct.cs
+++ b/src/Oct.cs
@@ -139,10 +139,6 @@ public class Oct
}
public bool IsInside(Vector3 position)
{
- Vector3 max = Start + Extent;
-
- return position.X >= Start.X && position.X <= max.X &&
- position.Y >= Start.Y && position.Y <= max.Y &&
- position.Z >= Start.Z && position.Z <= max.Z;
+ return position > Start && position < Start + Extent;
}
}
\ No newline at end of file
diff --git a/src/PlanetHelper.cs b/src/PlanetHelper.cs
index 04f9a71..29efbf0 100644
--- a/src/PlanetHelper.cs
+++ b/src/PlanetHelper.cs
@@ -56,7 +56,7 @@ public class PlanetHelper
}
private bool StageComplete = true;
- private int _plateCount = 12;
+ private int _plateCount = 14;
private float _landRatio = 0.4f;
public List Plates = new List();
@@ -101,9 +101,6 @@ public class PlanetHelper
public Oct Octree = new Oct();
private Curve _remapCurve;
- private RenderingDevice _rd;
- private Rid _shader;
-
public PlanetHelper(MeshInstance3D meshInstance, TextureRect textureRect, Curve remapCurve)
{
_meshInstance = meshInstance;
@@ -135,11 +132,6 @@ public class PlanetHelper
textureShaderMaterial.SetShaderParameter("mode", 1);
}
UpdateMesh();
-
- _rd = RenderingServer.CreateLocalRenderingDevice();
- var shaderFile = GD.Load("res://shaders/compute/PlateExpansion.glsl");
- var shaderBytecode = shaderFile.GetSpirV();
- _shader = _rd.ShaderCreateFromSpirV(shaderBytecode);
}
public void InitializeGeneration()
@@ -164,6 +156,7 @@ public class PlanetHelper
VertexData vertex = Vertices.Where(v => v.PlateId == -1).OrderBy(v => Guid.NewGuid()).First();
vertex.PlateId = i;
var color = new Color(RandF(0f, 1f), RandF(0f, 1f), RandF(0f, 1f));
+ ColorVertex(vertex.Id, color);
PlateData plate = new PlateData(i, color, false, [vertex.Id]);
plate.MovementAxis = GetRandomVector3();
@@ -175,7 +168,7 @@ public class PlanetHelper
public IEnumerable GetNeighboringVertices(int vertexId, bool blackOnly = true)
{
- if (Stage != GenerationStage.Initialization && Stage != GenerationStage.NotStarted)
+ if (Stage != GenerationStage.Initialization)
{
if (blackOnly)
return Vertices[vertexId].Neighbours.Where(n => Vertices[n].PlateId == -1);
@@ -303,84 +296,33 @@ public class PlanetHelper
public void PlateGeneration()
{
- // Prepare our data. We use floats in the shader, so we need 32 bit.
- int[] points = Enumerable.Range(0, Mdt.GetVertexCount()).ToArray();
- var sizePoints = points.Length * sizeof(int);
-
- int[] neighbors = Vertices.SelectMany(v => v.Neighbours.Count < 6 ? [..v.Neighbours.ToArray(),-1] : v.Neighbours.ToArray()).ToArray();
- var sizeNeighbors = neighbors.Length * sizeof(int);
- int[] plateids = Vertices.Select(v => v.PlateId).ToArray();
-
- var sizePlateids = plateids.Length * sizeof(int);
-
- var pointBytes = new byte[sizePoints];
- byte[] neighborBytes = new byte[sizeNeighbors];
- var plateBytes = new byte[sizePlateids];
- Buffer.BlockCopy(points, 0, pointBytes, 0, pointBytes.Length);
- Buffer.BlockCopy(neighbors, 0, neighborBytes, 0, neighborBytes.Length);
- Buffer.BlockCopy(plateids, 0, plateBytes, 0, plateBytes.Length);
-
- // Create a uniform to assign the buffer to the rendering device
- var pointUniform = new RDUniform
+ var availableVerts = Vertices.Where(d => d.StageComplete == false && d.PlateId != -1).OrderBy(v => Guid.NewGuid()).ToList();
+ foreach (PlateData plateData in Plates)
{
- UniformType = RenderingDevice.UniformType.StorageBuffer,
- Binding = 0
- };
- var pointBuffer = _rd.StorageBufferCreate((uint)pointBytes.Length, pointBytes);
- pointUniform.AddId(pointBuffer);
-
- var neighborUniform = new RDUniform
- {
- UniformType = RenderingDevice.UniformType.StorageBuffer,
- Binding = 1
- };
- var neighborBuffer = _rd.StorageBufferCreate((uint)neighborBytes.Length, neighborBytes);
- neighborUniform.AddId(neighborBuffer);
-
- var plateUniform = new RDUniform
- {
- UniformType = RenderingDevice.UniformType.StorageBuffer,
- Binding = 2
- };
- var plateBuffer = _rd.StorageBufferCreate((uint)plateBytes.Length, plateBytes);
- plateUniform.AddId(plateBuffer);
-
- var uniformSet = _rd.UniformSetCreate([pointUniform, neighborUniform, plateUniform], _shader, 0);
-
- // Create a compute pipeline
- var pipeline = _rd.ComputePipelineCreate(_shader);
- var computeList = _rd.ComputeListBegin();
- _rd.ComputeListBindComputePipeline(computeList, pipeline);
- _rd.ComputeListBindUniformSet(computeList, uniformSet, 0);
- uint xgroups = (uint)(Mathf.Ceil((double)points.Length / 25.0));
- _rd.ComputeListDispatch(computeList, xGroups: xgroups, yGroups: 50, zGroups: 1);
- _rd.ComputeListEnd();
- _rd.Submit();
- _rd.Sync();
- // Read back the data from the buffers
- var outputBytes = _rd.BufferGetData(plateBuffer);
- var output = new int[plateids.Length];
- Buffer.BlockCopy(outputBytes, 0, output, 0, plateBytes.Length);
-
- int index = 0;
- foreach (int plate in output)
- {
- if (plate != -1)
+ var plateVerts = availableVerts.Where(d => d.PlateId == plateData.Id);
+ foreach (VertexData vertexData in plateVerts.Take((int)((5 + plateVerts.Count() / 4) * plateData.PlateExpansion)))
{
- Mdt.SetVertexColor(index, Plates[plate].Color);
- Vertices[index].PlateId = plate;
+ int expandTo = GetFreeNeighbourIndex(vertexData);
+ if (expandTo != -1)
+ {
+ Vertices[expandTo].PlateId = plateData.Id;
+ plateData.Vertices.Add(expandTo);
+ ColorVertex(expandTo, plateData.Color);
+ }
+ else
+ {
+ vertexData.StageComplete = true;
+ }
}
- index++;
}
-
- _rd.FreeRid(pipeline);
- _rd.FreeRid(uniformSet);
- _rd.FreeRid(pointBuffer);
- _rd.FreeRid(plateBuffer);
- _rd.FreeRid(neighborBuffer);
-
- AssignOceanPlates(Plates);
- CompleteStage();
+
+ if (!availableVerts.Any())
+ {
+ foreach (VertexData vertexData in Vertices)
+ vertexData.StageComplete = false;
+ AssignOceanPlates(Plates);
+ CompleteStage();
+ }
}
public void BorderSearch()
{