@@ -39,34 +39,57 @@ mod visualizer {
39
39
40
40
use super :: { terrain_events, terrain_resources:: { self , NoiseFunctionParams , NoiseTexture , TextureType } } ;
41
41
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
+
42
46
fn generate_terrain_heightmap (
43
47
generator : & terrain_resources:: Generator ,
48
+ texture_type : & TextureType ,
44
49
origin : Vec3 ,
45
50
size : Vec3 ,
51
+ draw_chunk_border : bool ,
46
52
) -> ImageData {
47
53
let mut data = vec ! [ 0 ; ( size. x * size. z) as usize ] ;
48
54
49
55
let width = size. x as usize ;
50
56
let height = size. z as usize ;
51
57
52
- let draw_chunk_border = false ;
53
-
54
58
for x in 0 ..width {
55
59
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;
62
61
63
62
if draw_chunk_border {
64
63
if x % CHUNK_SIZE == 0 || z % CHUNK_SIZE == 0 {
65
- value = 255 ;
64
+ data[ index] = 255 ;
65
+ continue ;
66
66
}
67
67
}
68
68
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
+ } ;
70
93
}
71
94
}
72
95
@@ -137,8 +160,10 @@ mod visualizer {
137
160
138
161
let image_data = generate_terrain_heightmap (
139
162
& generator,
163
+ & texture_type,
140
164
Vec3 :: ZERO ,
141
165
Vec3 :: new ( width as f32 , height as f32 , depth as f32 ) ,
166
+ true
142
167
) ;
143
168
144
169
let entry = noise_texture_list. noise_textures . get_mut ( & texture_type) . expect ( "Noise texture not loaded, please initialize the resource properly." ) ;
0 commit comments