68 lines
1.9 KiB
Go
68 lines
1.9 KiB
Go
package gen
|
|
|
|
type Octave []PerlinNoise
|
|
|
|
var octaveStrHashes = []Xoroshiro{
|
|
XoroshiroFromString("octave_-16"),
|
|
XoroshiroFromString("octave_-15"),
|
|
XoroshiroFromString("octave_-14"),
|
|
XoroshiroFromString("octave_-13"),
|
|
XoroshiroFromString("octave_-12"),
|
|
XoroshiroFromString("octave_-11"),
|
|
XoroshiroFromString("octave_-10"),
|
|
XoroshiroFromString("octave_-9"),
|
|
XoroshiroFromString("octave_-8"),
|
|
XoroshiroFromString("octave_-7"),
|
|
XoroshiroFromString("octave_-6"),
|
|
XoroshiroFromString("octave_-5"),
|
|
XoroshiroFromString("octave_-4"),
|
|
XoroshiroFromString("octave_-3"),
|
|
XoroshiroFromString("octave_-2"),
|
|
XoroshiroFromString("octave_-1"),
|
|
XoroshiroFromString("octave_0"),
|
|
}
|
|
|
|
var octaveLacunaInits = []float64{1, .5, .25, 1. / 8, 1. / 16, 1. / 32, 1. / 64, 1. / 128, 1. / 256, 1. / 512, 1. / 1024,
|
|
1. / 2048, 1. / 4096, 1. / 8192, 1. / 16384, 1. / 32768, 1. / 65536}
|
|
|
|
var octavePersistInits = []float64{0, 1, 2. / 3, 4. / 7, 8. / 15, 16. / 31, 32. / 63, 64. / 127, 128. / 255, 256. / 511, 512. / 1023,
|
|
1024. / 2047, 2048. / 4095, 4096. / 8191, 8192. / 16383, 16384. / 32767, 32768. / 65535}
|
|
|
|
func OctaveFromXoroshiro(x *Xoroshiro, amplitudes []float64, omin int, lenn int, nmax int) (o Octave) {
|
|
if (-omin < 0 || -omin >= len(octaveLacunaInits)) || (lenn < 0 || lenn >= len(octavePersistInits)) {
|
|
panic("octave initialization out of range")
|
|
}
|
|
octaveX := x.Split()
|
|
i := 0
|
|
n := 0
|
|
lacuna := octaveLacunaInits[-omin]
|
|
persist := octavePersistInits[lenn]
|
|
|
|
for i < lenn && n != nmax {
|
|
if amplitudes[i] == 0 {
|
|
i++
|
|
lacuna *= 2
|
|
persist *= 0.5
|
|
continue
|
|
}
|
|
copyX := octaveX
|
|
copyX.Xor(octaveStrHashes[16+omin+i])
|
|
p := PerlinNoiseFromXoroshiro(copyX)
|
|
p.amplitude = amplitudes[i] * persist
|
|
p.lacunarity = lacuna
|
|
o = append(o, p)
|
|
i++
|
|
n++
|
|
lacuna *= 2
|
|
persist *= 0.5
|
|
}
|
|
return
|
|
}
|
|
|
|
func (o *Octave) Sample(x, y, z float64) (v float64) {
|
|
for _, n := range *o {
|
|
v += n.Sample(x*n.lacunarity, y*n.lacunarity, z*n.lacunarity, 0, 0) * n.amplitude
|
|
}
|
|
return
|
|
}
|