Aetheria/Assets/Plugins/Celestial Body/Scripts/Shape/MoonShape.cs
Reinier Vens 53a91351b7 Procedural Planets
Integrated Sebastian Lague's Planet Generator
Created Tour function in SectorRenderer which makes the camera follow each terrestrial planet in turn
2020-12-05 23:43:02 +00:00

99 lines
No EOL
3.5 KiB
C#

using UnityEngine;
[CreateAssetMenu (menuName = "Celestial Body/Moon/Moon Shape")]
public class MoonShape : CelestialBodyShape {
public CraterSettings craterSettings;
public SimpleNoiseSettings shapeNoise;
public RidgeNoiseSettings ridgeNoise;
public RidgeNoiseSettings ridgeNoise2;
public Vector4 testParams;
protected override void SetShapeData () {
var prng = new PRNG (seed);
SetCraterSettings (prng, seed, randomize);
SetShapeNoiseSettings (prng, randomize);
SetRidgeNoiseSettings (prng, randomize);
heightMapCompute.SetVector ("testParams", testParams);
}
void SetCraterSettings (PRNG prng, int seed, bool randomizeValues) {
if (randomizeValues) {
var chance = new Chance (prng);
if (chance.Percent (70)) { // Medium amount of mostly small to medium craters
craterSettings.SetComputeValues (heightMapCompute, seed, prng.Range (100, 700), new Vector2 (0.01f, 0.1f), 0.57f);
} else if (chance.Percent (15)) { // Many small craters
craterSettings.SetComputeValues (heightMapCompute, seed, prng.Range (800, 1800), new Vector2 (0.01f, 0.08f), 0.74f);
} else if (chance.Percent (15)) { // A few large craters
craterSettings.SetComputeValues (heightMapCompute, seed, prng.Range (50, 150), new Vector2 (0.01f, 0.2f), 0.4f);
}
} else {
craterSettings.SetComputeValues (heightMapCompute, seed);
}
}
void SetShapeNoiseSettings (PRNG prng, bool randomizeValues) {
const string suffix = "_shape";
if (randomizeValues) {
var chance = new Chance (prng);
SimpleNoiseSettings randomizedShapeNoise = new SimpleNoiseSettings () {
numLayers = 4, lacunarity = 2, persistence = 0.5f
};
if (chance.Percent (80)) { // Minor deformation
randomizedShapeNoise.elevation = Mathf.Lerp (0.2f, 3, prng.ValueBiasLower (0.3f));
randomizedShapeNoise.scale = prng.Range (1.5f, 2.5f);
} else if (chance.Percent (20)) { // Major deformation
randomizedShapeNoise.elevation = Mathf.Lerp (3, 8, prng.ValueBiasLower (0.4f));
randomizedShapeNoise.scale = prng.Range (0.3f, 1);
}
// Assign settings
randomizedShapeNoise.SetComputeValues (heightMapCompute, prng, suffix);
} else {
shapeNoise.SetComputeValues (heightMapCompute, prng, suffix);
}
}
void SetRidgeNoiseSettings (PRNG prng, bool randomizeValues) {
const string ridgeSuffix = "_ridge";
const string detailSuffix = "_ridge2";
if (randomizeValues) {
// Randomize ridge mask
var randomizedMaskNoise = new SimpleNoiseSettings () {
numLayers = 4, lacunarity = 2, persistence = 0.6f, elevation = 1
};
randomizedMaskNoise.scale = prng.Range (0.5f, 2f);
// Randomize ridge noise
var chance = new Chance (prng);
var randomizedRidgeNoise = new RidgeNoiseSettings () {
numLayers = 4, power = 3, gain = 1, peakSmoothing = 2
};
randomizedRidgeNoise.elevation = Mathf.Lerp (1, 7, prng.ValueBiasLower (0.3f));
randomizedRidgeNoise.scale = prng.Range (1f, 3f);
randomizedRidgeNoise.lacunarity = prng.Range (1f, 5f);
randomizedRidgeNoise.persistence = 0.42f;
randomizedRidgeNoise.power = prng.Range (1.5f, 3.5f);
randomizedRidgeNoise.SetComputeValues (heightMapCompute, prng, ridgeSuffix);
randomizedMaskNoise.SetComputeValues (heightMapCompute, prng, detailSuffix);
} else {
ridgeNoise.SetComputeValues (heightMapCompute, prng, ridgeSuffix);
ridgeNoise2.SetComputeValues (heightMapCompute, prng, detailSuffix);
}
}
public override void ReleaseBuffers () {
base.ReleaseBuffers ();
craterSettings.ReleaseBuffers ();
}
}