mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-09 01:54:04 +09:00
terraingen candidate 1
This commit is contained in:
@@ -16,6 +16,7 @@ import com.sudoplay.joise.module.*
|
|||||||
import net.torvald.random.HQRNG
|
import net.torvald.random.HQRNG
|
||||||
import net.torvald.terrarum.concurrent.ThreadParallel
|
import net.torvald.terrarum.concurrent.ThreadParallel
|
||||||
import net.torvald.terrarum.concurrent.mapToThreadPoolDirectly
|
import net.torvald.terrarum.concurrent.mapToThreadPoolDirectly
|
||||||
|
import net.torvald.terrarum.floorInt
|
||||||
import net.torvald.terrarum.gameworld.fmod
|
import net.torvald.terrarum.gameworld.fmod
|
||||||
import net.torvald.terrarum.inUse
|
import net.torvald.terrarum.inUse
|
||||||
import kotlin.math.cos
|
import kotlin.math.cos
|
||||||
@@ -44,6 +45,9 @@ class WorldgenNoiseSandbox : ApplicationAdapter() {
|
|||||||
private var generationDone = false
|
private var generationDone = false
|
||||||
private var generateKeyLatched = false
|
private var generateKeyLatched = false
|
||||||
|
|
||||||
|
private var generationTimeInMeasure = false
|
||||||
|
private var generationStartTime = 0L
|
||||||
|
|
||||||
override fun create() {
|
override fun create() {
|
||||||
batch = SpriteBatch()
|
batch = SpriteBatch()
|
||||||
camera = OrthographicCamera(WIDTH.toFloat(), HEIGHT.toFloat())
|
camera = OrthographicCamera(WIDTH.toFloat(), HEIGHT.toFloat())
|
||||||
@@ -84,6 +88,13 @@ class WorldgenNoiseSandbox : ApplicationAdapter() {
|
|||||||
if (ThreadParallel.allFinished()) {
|
if (ThreadParallel.allFinished()) {
|
||||||
generateKeyLatched = false
|
generateKeyLatched = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// finish time measurement
|
||||||
|
if (ThreadParallel.allFinished() && generationTimeInMeasure) {
|
||||||
|
generationTimeInMeasure = false
|
||||||
|
val time = System.nanoTime() - generationStartTime
|
||||||
|
println("Generation time in sec: ${time / 1000000000f}")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val NOISE_MAKER = AccidentalCave
|
private val NOISE_MAKER = AccidentalCave
|
||||||
@@ -95,6 +106,9 @@ class WorldgenNoiseSandbox : ApplicationAdapter() {
|
|||||||
val colourNull = Color(0x1b3281ff)
|
val colourNull = Color(0x1b3281ff)
|
||||||
|
|
||||||
private fun renderNoise() {
|
private fun renderNoise() {
|
||||||
|
generationStartTime = System.nanoTime()
|
||||||
|
generationTimeInMeasure = true
|
||||||
|
|
||||||
// erase first
|
// erase first
|
||||||
testTex.setColor(colourNull)
|
testTex.setColor(colourNull)
|
||||||
testTex.fill()
|
testTex.fill()
|
||||||
@@ -201,14 +215,25 @@ object AccidentalCave : NoiseMaker {
|
|||||||
|
|
||||||
override val sampleDensity = 333.0 // fixed value for fixed size of features
|
override val sampleDensity = 333.0 // fixed value for fixed size of features
|
||||||
|
|
||||||
|
private val notationColours = arrayOf(
|
||||||
|
Color.WHITE,
|
||||||
|
Color.MAGENTA,
|
||||||
|
Color(0f, 186f/255f, 1f, 1f),
|
||||||
|
Color(.5f, 1f, .5f, 1f),
|
||||||
|
Color(1f, 0.93f, 0.07f, 1f),
|
||||||
|
Color(0.97f, 0.6f, 0.56f, 1f)
|
||||||
|
)
|
||||||
|
|
||||||
override fun draw(x: Int, y: Int, noiseValue: Double, outTex: Pixmap) {
|
override fun draw(x: Int, y: Int, noiseValue: Double, outTex: Pixmap) {
|
||||||
val c = noiseValue.toFloat()
|
val c = noiseValue.toFloat()
|
||||||
if (c > 1f)
|
val selector = c.minus(0.0001).floorInt() fmod notationColours.size
|
||||||
outTex.setColor(0f, c, c, 1f)
|
val selecteeColour = Color(c - selector, c - selector, c - selector, 1f)
|
||||||
else if (c >= 0f)
|
if (noiseValue < 0) {
|
||||||
outTex.setColor(c, c, c, 1f)
|
|
||||||
else
|
|
||||||
outTex.setColor(-c, 0f, 0f, 1f)
|
outTex.setColor(-c, 0f, 0f, 1f)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
outTex.setColor(selecteeColour.mul(notationColours[selector]))
|
||||||
|
}
|
||||||
outTex.drawPixel(x, y)
|
outTex.drawPixel(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,7 +300,7 @@ object AccidentalCave : NoiseMaker {
|
|||||||
|
|
||||||
val highlandYScale = ModuleScaleDomain()
|
val highlandYScale = ModuleScaleDomain()
|
||||||
highlandYScale.setSource(highlandScale)
|
highlandYScale.setSource(highlandScale)
|
||||||
highlandYScale.setScaleY(0.2) // greater = more distortion, overhangs
|
highlandYScale.setScaleY(0.14) // greater = more distortion, overhangs
|
||||||
|
|
||||||
val highlandTerrain = ModuleTranslateDomain()
|
val highlandTerrain = ModuleTranslateDomain()
|
||||||
highlandTerrain.setSource(groundGradient)
|
highlandTerrain.setSource(groundGradient)
|
||||||
@@ -302,7 +327,7 @@ object AccidentalCave : NoiseMaker {
|
|||||||
|
|
||||||
val mountainYScale = ModuleScaleDomain()
|
val mountainYScale = ModuleScaleDomain()
|
||||||
mountainYScale.setSource(mountainScale)
|
mountainYScale.setSource(mountainScale)
|
||||||
mountainYScale.setScaleY(0.74) // greater = more distortion, overhangs
|
mountainYScale.setScaleY(0.7) // greater = more distortion, overhangs
|
||||||
|
|
||||||
val mountainTerrain = ModuleTranslateDomain()
|
val mountainTerrain = ModuleTranslateDomain()
|
||||||
mountainTerrain.setSource(groundGradient)
|
mountainTerrain.setSource(groundGradient)
|
||||||
@@ -360,13 +385,12 @@ object AccidentalCave : NoiseMaker {
|
|||||||
caveShape.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.GRADIENT)
|
caveShape.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.GRADIENT)
|
||||||
caveShape.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
|
caveShape.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
|
||||||
caveShape.setNumOctaves(1)
|
caveShape.setNumOctaves(1)
|
||||||
//caveShape.setFrequency(4.0)
|
caveShape.setFrequency(7.4) // TODO adjust the "density" of the caves
|
||||||
caveShape.setFrequency(7.4) // TODO adjust this to change the "density" of the caves
|
|
||||||
caveShape.seed = seed shake caveMagic
|
caveShape.seed = seed shake caveMagic
|
||||||
|
|
||||||
val caveAttenuateBias = ModuleBias()
|
val caveAttenuateBias = ModuleBias()
|
||||||
caveAttenuateBias.setSource(highlandLowlandSelectCache)
|
caveAttenuateBias.setSource(highlandLowlandSelectCache)
|
||||||
caveAttenuateBias.setBias(0.91) // TODO adjust this (0.5..0.9999999) to adjust the "concentration" of the cave gen?
|
caveAttenuateBias.setBias(0.90) // TODO (0.5+) adjust the "concentration" of the cave gen. Lower = larger voids
|
||||||
|
|
||||||
val caveShapeAttenuate = ModuleCombiner()
|
val caveShapeAttenuate = ModuleCombiner()
|
||||||
caveShapeAttenuate.setType(ModuleCombiner.CombinerType.MULT)
|
caveShapeAttenuate.setType(ModuleCombiner.CombinerType.MULT)
|
||||||
@@ -378,7 +402,6 @@ object AccidentalCave : NoiseMaker {
|
|||||||
cavePerturbFractal.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.GRADIENT)
|
cavePerturbFractal.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.GRADIENT)
|
||||||
cavePerturbFractal.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
|
cavePerturbFractal.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
|
||||||
cavePerturbFractal.setNumOctaves(6)
|
cavePerturbFractal.setNumOctaves(6)
|
||||||
//cavePerturbFractal.setFrequency(3.0)
|
|
||||||
cavePerturbFractal.setFrequency(3.0)
|
cavePerturbFractal.setFrequency(3.0)
|
||||||
cavePerturbFractal.seed = seed shake cavePerturbMagic
|
cavePerturbFractal.seed = seed shake cavePerturbMagic
|
||||||
|
|
||||||
@@ -395,7 +418,7 @@ object AccidentalCave : NoiseMaker {
|
|||||||
caveSelect.setLowSource(1.0)
|
caveSelect.setLowSource(1.0)
|
||||||
caveSelect.setHighSource(0.0)
|
caveSelect.setHighSource(0.0)
|
||||||
caveSelect.setControlSource(cavePerturb)
|
caveSelect.setControlSource(cavePerturb)
|
||||||
caveSelect.setThreshold(0.94) // TODO also adjust this if you've touched the bias value. Number can be greater than 1.0
|
caveSelect.setThreshold(0.89) // TODO also adjust this if you've touched the bias value. Number can be greater than 1.0
|
||||||
caveSelect.setFalloff(0.0)
|
caveSelect.setFalloff(0.0)
|
||||||
|
|
||||||
val caveBlockageFractal = ModuleFractal()
|
val caveBlockageFractal = ModuleFractal()
|
||||||
@@ -403,14 +426,20 @@ object AccidentalCave : NoiseMaker {
|
|||||||
caveBlockageFractal.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.GRADIENT)
|
caveBlockageFractal.setAllSourceBasisTypes(ModuleBasisFunction.BasisType.GRADIENT)
|
||||||
caveBlockageFractal.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
|
caveBlockageFractal.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
|
||||||
caveBlockageFractal.setNumOctaves(2)
|
caveBlockageFractal.setNumOctaves(2)
|
||||||
caveBlockageFractal.setFrequency(7.4) // TODO same as caveShape frequency?
|
caveBlockageFractal.setFrequency(8.88) // TODO same as caveShape frequency?
|
||||||
caveBlockageFractal.seed = seed shake caveBlockageMagic
|
caveBlockageFractal.seed = seed shake caveBlockageMagic
|
||||||
|
|
||||||
|
// will only close-up deeper caves. Shallow caves will be less likely to be closed up
|
||||||
|
val caveBlockageAttenuate = ModuleCombiner()
|
||||||
|
caveBlockageAttenuate.setType(ModuleCombiner.CombinerType.MULT)
|
||||||
|
caveBlockageAttenuate.setSource(0, caveBlockageFractal)
|
||||||
|
caveBlockageAttenuate.setSource(1, caveAttenuateBias)
|
||||||
|
|
||||||
val caveBlockageSelect = ModuleSelect()
|
val caveBlockageSelect = ModuleSelect()
|
||||||
caveBlockageSelect.setLowSource(1.0)
|
caveBlockageSelect.setLowSource(0.0)
|
||||||
caveBlockageSelect.setHighSource(0.0)
|
caveBlockageSelect.setHighSource(1.0)
|
||||||
caveBlockageSelect.setControlSource(caveBlockageFractal)
|
caveBlockageSelect.setControlSource(caveBlockageAttenuate)
|
||||||
caveBlockageSelect.setThreshold(1.33) // TODO size of cave-in. For some reason, [0.7, 2.0?]
|
caveBlockageSelect.setThreshold(1.40) // TODO adjust cave cloing-up strength. Larger = more closing
|
||||||
caveBlockageSelect.setFalloff(0.0)
|
caveBlockageSelect.setFalloff(0.0)
|
||||||
|
|
||||||
// note: gradient-multiply DOESN'T generate "naturally cramped" cave entrance
|
// note: gradient-multiply DOESN'T generate "naturally cramped" cave entrance
|
||||||
@@ -423,6 +452,7 @@ object AccidentalCave : NoiseMaker {
|
|||||||
val groundCaveMult = ModuleCombiner()
|
val groundCaveMult = ModuleCombiner()
|
||||||
groundCaveMult.setType(ModuleCombiner.CombinerType.MULT)
|
groundCaveMult.setType(ModuleCombiner.CombinerType.MULT)
|
||||||
groundCaveMult.setSource(0, caveInMix)
|
groundCaveMult.setSource(0, caveInMix)
|
||||||
|
//groundCaveMult.setSource(0, caveSelect) // disables the cave-in for quick cavegen testing
|
||||||
groundCaveMult.setSource(1, groundSelect)
|
groundCaveMult.setSource(1, groundSelect)
|
||||||
|
|
||||||
// this noise tree WILL generate noise value greater than 1.0
|
// this noise tree WILL generate noise value greater than 1.0
|
||||||
@@ -433,7 +463,7 @@ object AccidentalCave : NoiseMaker {
|
|||||||
finalClamp.setRange(0.0, 1.0)
|
finalClamp.setRange(0.0, 1.0)
|
||||||
finalClamp.setSource(groundCaveMult)
|
finalClamp.setSource(groundCaveMult)
|
||||||
|
|
||||||
//return Joise(groundCaveMult)
|
//return Joise(caveInMix)
|
||||||
return Joise(finalClamp)
|
return Joise(finalClamp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user