Skip to content

Commit 5d00f8f

Browse files
Improve texture gen
1 parent 043e972 commit 5d00f8f

File tree

1 file changed

+35
-10
lines changed

1 file changed

+35
-10
lines changed

src/server/terrain/systems.rs

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,34 +39,57 @@ mod visualizer {
3939

4040
use super::{terrain_events, terrain_resources::{self, NoiseFunctionParams, NoiseTexture, TextureType}};
4141

42+
fn map_range(value: f64, min: f64, max: f64, new_min: f64, new_max: f64) -> f64 {
43+
((value - min) / (max - min)) * (new_max - new_min) + new_min
44+
}
45+
4246
fn generate_terrain_heightmap(
4347
generator: &terrain_resources::Generator,
48+
texture_type: &TextureType,
4449
origin: Vec3,
4550
size: Vec3,
51+
draw_chunk_border: bool,
4652
) -> ImageData {
4753
let mut data = vec![0; (size.x * size.z) as usize];
4854

4955
let width = size.x as usize;
5056
let height = size.z as usize;
5157

52-
let draw_chunk_border = false;
53-
5458
for x in 0..width {
5559
for z in 0..height {
56-
let sample_position =
57-
Vec2::new((origin.x + x as f32) / 1.0, (origin.z + z as f32) / 1.0);
58-
// let value = generator.sample_2d(sample_position, &generator.params.height_params);
59-
let value = generator.normalized_spline_terrain_sample(sample_position);
60-
let value = ( value * size.y as f64 ) / 2.0 + 0.5;
61-
let mut value = value as u8;
60+
let index = x + z * width;
6261

6362
if draw_chunk_border {
6463
if x % CHUNK_SIZE == 0 || z % CHUNK_SIZE == 0 {
65-
value = 255;
64+
data[index] = 255;
65+
continue;
6666
}
6767
}
6868

69-
data[x + z * width] = value;
69+
match texture_type {
70+
TextureType::Height => {
71+
let sample_position = Vec2::new((origin.x + x as f32) / 1.0, (origin.z + z as f32) / 1.0);
72+
let value = generator.normalized_spline_terrain_sample(sample_position);
73+
let value = ( value * size.y as f64 ) / 2.0 + 0.5;
74+
75+
data[index] = value as u8;
76+
}
77+
TextureType::HeightAdjust => {
78+
let sample_position = Vec2::new((origin.x + x as f32) / 1.0, (origin.z + z as f32) / 1.0);
79+
let value = generator.sample_2d(sample_position, &generator.params.height_adjust_params);
80+
let value = map_range(value, -1.0, 1.0, 0.0, 255.0);
81+
82+
data[index] = value as u8;
83+
}
84+
TextureType::Density => {
85+
// TODO: change to sample3D
86+
let pos = Vec2::new(origin.x + x as f32, origin.z + z as f32);
87+
let value = generator.sample_2d(pos, &generator.params.density_params);
88+
let value = map_range(value, -1.0, 1.0, 0.0, 255.0);
89+
90+
data[index] = value as u8;
91+
}
92+
};
7093
}
7194
}
7295

@@ -137,8 +160,10 @@ mod visualizer {
137160

138161
let image_data = generate_terrain_heightmap(
139162
&generator,
163+
&texture_type,
140164
Vec3::ZERO,
141165
Vec3::new(width as f32, height as f32, depth as f32),
166+
true
142167
);
143168

144169
let entry = noise_texture_list.noise_textures.get_mut(&texture_type).expect("Noise texture not loaded, please initialize the resource properly.");

0 commit comments

Comments
 (0)