Made planet shader 3d, added sprite to selected point, fixed collision stress calculation
This commit is contained in:
parent
930ed42150
commit
a780ef479d
5 changed files with 82 additions and 54 deletions
|
|
@ -4,6 +4,7 @@ using Godot;
|
|||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using adatonic;
|
||||
using Node = adatonic.Node;
|
||||
using Timer = System.Timers.Timer;
|
||||
|
|
@ -23,7 +24,8 @@ public class PlanetHelper
|
|||
|
||||
public int CenterVertexId = -1;
|
||||
public float PlateExpansion { get; set; } = RandF(0.5f, 2f);
|
||||
public Vector3 Dir { get; set; } = Vector3.Zero;
|
||||
public Vector3 MovementAxis { get; set; } = Vector3.Zero;
|
||||
public float MovementSpeed { get; set; } = RandF(0f, 1f);
|
||||
}
|
||||
|
||||
public class VertexData(int Id = 0, int PlateId = 0, List<int> Neighbours = null, bool StageComplete = false)
|
||||
|
|
@ -152,7 +154,7 @@ public class PlanetHelper
|
|||
ColorVertex(vertex.Id, color);
|
||||
PlateData plate = new PlateData(i, color, false, [vertex.Id]);
|
||||
|
||||
plate.Dir = GetRandomTangentialVelocity(Mdt.GetVertex(vertex.Id), RandF(0f, 1f));
|
||||
plate.MovementAxis = GetRandomVector3();
|
||||
Plates.Add(plate);
|
||||
}
|
||||
|
||||
|
|
@ -172,7 +174,14 @@ public class PlanetHelper
|
|||
return verts.Except([vertexId]);
|
||||
return verts.Where(v => Mdt.GetVertexColor(v) == Colors.Black).Except([vertexId]);
|
||||
}
|
||||
|
||||
|
||||
public Vector3 GetRandomVector3()
|
||||
{
|
||||
Vector3 vec = Vector3.Up;
|
||||
vec = vec.Rotated(Vector3.Forward, Mathf.DegToRad(RandF(0, 180f)));
|
||||
vec = vec.Rotated(Vector3.Up, Mathf.DegToRad(RandF(0, 360f)));
|
||||
return vec.Normalized();
|
||||
}
|
||||
public Vector3 GetRandomTangentialVelocity(Vector3 pointOnSphere, float speed)
|
||||
{
|
||||
Vector3 normal = pointOnSphere.Normalized();
|
||||
|
|
@ -392,12 +401,15 @@ public class PlanetHelper
|
|||
VertexData centerA = Vertices[plateA.CenterVertexId];
|
||||
VertexData centerB = Vertices[plateB.CenterVertexId];
|
||||
Vector3 p1, p2;
|
||||
p1 = Mdt.GetVertex(vertexData.Id).Cross(Mdt.GetVertex(centerA.Id));
|
||||
p2 = Mdt.GetVertex(neighbour).Cross(Mdt.GetVertex(centerB.Id));
|
||||
vertexData.StrainSamples.Add(CalculateStrainMagnitude(p1, p2, plateA.Dir, plateB.Dir));
|
||||
p1 = Mdt.GetVertex(vertexData.Id);
|
||||
p2 = Mdt.GetVertex(neighbour);
|
||||
Vector3 vel1 = ((p1 - p1.Rotated(plateA.MovementAxis, Mathf.DegToRad(1))).Normalized()) * plateA.MovementSpeed;
|
||||
Vector3 vel2 = ((p2 - p2.Rotated(plateB.MovementAxis, Mathf.DegToRad(1))).Normalized()) * plateB.MovementSpeed;
|
||||
vertexData.StrainSamples.Add(CalculateStrainMagnitude(p1, p2, vel1, vel2));
|
||||
}
|
||||
vertexData.StageComplete = true;
|
||||
var majorStrain = AverageStrainList(vertexData.StrainSamples);
|
||||
vertexData.StrainSamples = [majorStrain];
|
||||
switch (majorStrain.Type)
|
||||
{
|
||||
case StrainType.Compression:
|
||||
|
|
@ -422,41 +434,41 @@ public class PlanetHelper
|
|||
}
|
||||
public void SpreadStress()
|
||||
{
|
||||
var availableVerts = Vertices.Where(d => d.StageComplete == false && d.IsEdge && d.StrainSamples.Any()).OrderBy(d => Mathf.Abs(d.StrainSamples.Max(s => s.Magnitude))).Take(2500).ToList();
|
||||
var availableVerts = Vertices.Where(d => d.StageComplete == false && d.IsEdge && d.StrainSamples.Any()).OrderByDescending(d => Mathf.Abs(d.StrainSamples.Max(s => s.Magnitude))).Take(500).ToList();
|
||||
foreach (VertexData vertexData in availableVerts)
|
||||
{
|
||||
var neighbours = GetNeighboringVertices(vertexData.Id, false).ToList();
|
||||
var majorStrain = AverageStrainList(vertexData.StrainSamples);
|
||||
List<StrainAnalysis> localStrains = [];
|
||||
foreach (int neighbour in neighbours)
|
||||
{
|
||||
localStrains.AddRange(Vertices[neighbour].StrainSamples);
|
||||
}
|
||||
localStrains.AddRange(vertexData.StrainSamples);
|
||||
var averageStrain = AverageStrainList(localStrains);
|
||||
averageStrain.Magnitude *= 0.9f;
|
||||
averageStrain.NormalRate *= 0.9f;
|
||||
averageStrain.ShearRate *= 0.9f;
|
||||
foreach (int neighbour in neighbours)
|
||||
{
|
||||
VertexData neighbourVert = Vertices[neighbour];
|
||||
neighbourVert.IsEdge = true;
|
||||
|
||||
var newStrain = new StrainAnalysis();
|
||||
newStrain.Magnitude = majorStrain.Magnitude * 0.9f;
|
||||
newStrain.Type = majorStrain.Type;
|
||||
newStrain.NormalRate = majorStrain.NormalRate * 0.9f;
|
||||
newStrain.ShearRate = majorStrain.ShearRate * 0.9f;
|
||||
neighbourVert.StrainSamples.Add(newStrain);
|
||||
var newAverage = AverageStrainList(neighbourVert.StrainSamples);;
|
||||
neighbourVert.StrainSamples.Add(averageStrain);
|
||||
switch (majorStrain.Type)
|
||||
{
|
||||
case StrainType.Compression:
|
||||
ColorVertex(neighbourVert.Id, Colors.Red * newAverage.Magnitude);
|
||||
ColorVertex(neighbourVert.Id, Colors.Red * averageStrain.Magnitude);
|
||||
break;
|
||||
case StrainType.Shear:
|
||||
ColorVertex(neighbourVert.Id, Colors.Yellow * newAverage.Magnitude);
|
||||
ColorVertex(neighbourVert.Id, Colors.Yellow * averageStrain.Magnitude);
|
||||
break;
|
||||
case StrainType.Tension:
|
||||
ColorVertex(neighbourVert.Id, Colors.Blue * newAverage.Magnitude);
|
||||
ColorVertex(neighbourVert.Id, Colors.Blue * averageStrain.Magnitude);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (neighbours.All(n => Vertices[n].IsEdge))
|
||||
{
|
||||
vertexData.StageComplete = true;
|
||||
}
|
||||
vertexData.StrainSamples = [AverageStrainList(vertexData.StrainSamples)];
|
||||
vertexData.StageComplete = true;
|
||||
}
|
||||
|
||||
if (!availableVerts.Any())
|
||||
|
|
@ -631,10 +643,11 @@ public class PlanetHelper
|
|||
|
||||
double bestDiff = double.MaxValue;
|
||||
int bestMask = 0;
|
||||
|
||||
object lobject = new();
|
||||
int combinations = 1 << n;
|
||||
|
||||
for (int mask = 0; mask < combinations; mask++)
|
||||
var combs = Enumerable.Range(0, combinations / 4).Select(value => value * 4).ToList();
|
||||
combinations = combs.Count;
|
||||
Parallel.ForEach(combs, mask =>
|
||||
{
|
||||
int oceanArea = 0;
|
||||
|
||||
|
|
@ -645,13 +658,15 @@ public class PlanetHelper
|
|||
}
|
||||
|
||||
double diff = Math.Abs(oceanArea - targetOcean);
|
||||
|
||||
if (diff < bestDiff)
|
||||
lock (lobject)
|
||||
{
|
||||
bestDiff = diff;
|
||||
bestMask = mask;
|
||||
if (diff < bestDiff)
|
||||
{
|
||||
bestDiff = diff;
|
||||
bestMask = mask;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue