Files
voxel-game/src/worldgen.zig

51 lines
1.4 KiB
Zig

const std = @import("std");
const math = @import("math.zig");
const vm = @import("vecmath");
const Noise = struct {
horizontal_scale: f32,
value_median: f32,
value_amplitude: f32,
pub fn sample(self: Noise, seed: u64, pos: vm.Vector2) f32 {
return math.noise2(seed, pos.divScalar(self.horizontal_scale)) * self.value_amplitude + self.value_median;
}
pub fn samplev(self: Noise, seed: u64, pos: vm.Vector2x8) vm.f32x8 {
return math.noise2x8(seed, pos.divScalarSingle(self.horizontal_scale)) * vm.ps(self.value_amplitude) + vm.ps(self.value_median);
}
};
const noise_main: Noise = .{
.horizontal_scale = 80,
.value_median = 7,
.value_amplitude = 5,
};
const noise_secondary: Noise = .{
.horizontal_scale = 15,
.value_median = 0,
.value_amplitude = 0.5,
};
pub fn heightF(seed: u64, pos: vm.Vector2) f32 {
const main = noise_main.sample(seed, pos);
const secondary = noise_secondary.sample(seed, pos);
return @round(main + secondary);
}
pub fn heightFv(seed: u64, pos: vm.Vector2x8) vm.f32x8 {
const main = noise_main.samplev(seed, pos);
const secondary = noise_secondary.samplev(seed, pos);
return @round(main + secondary);
}
pub fn heightI(seed: u64, pos: vm.Vector2) i32 {
return @intFromFloat(heightF(seed, pos));
}
pub fn heightIv(seed: u64, pos: vm.Vector2x8) vm.i32x8 {
return @intFromFloat(heightFv(seed, pos));
}