Skip to content

Commit 4ada873

Browse files
Implement generator resource, add egui system boilerplate
1 parent a7c5806 commit 4ada873

File tree

7 files changed

+81
-98
lines changed

7 files changed

+81
-98
lines changed

src/server/networking/systems.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ pub fn receive_message_system(
88
#[cfg(feature = "chat")] mut chat_message_events: EventWriter<
99
chat_events::PlayerChatMessageSendEvent,
1010
>,
11+
generator: Res<terrain_resources::Generator>,
1112
) {
1213
for client_id in server.clients_id() {
1314
while let Some(message) = server.receive_message(client_id, DefaultChannel::ReliableOrdered)
@@ -56,9 +57,6 @@ pub fn receive_message_system(
5657
client_id, player.position
5758
);
5859
player_states.players.insert(client_id, player);
59-
}
60-
NetworkingMessage::UpdateGeneratorParams(params) => {
61-
6260
}
6361
NetworkingMessage::ChunkBatchRequest(positions) => {
6462
info!(
@@ -75,11 +73,7 @@ pub fn receive_message_system(
7573
Some(chunk) => *chunk,
7674
None => {
7775
let mut chunk = Chunk::new(position);
78-
79-
let generator = terrain_util::generator::Generator::new(0);
80-
8176
generator.generate_chunk(&mut chunk);
82-
8377
chunk
8478
}
8579
}

src/server/terrain/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ impl Plugin for TerrainPlugin {
1313
app.add_event::<terrain_events::BlockUpdateEvent>();
1414
app.insert_resource(resources::PastBlockUpdates::new());
1515
app.add_systems(Startup, terrain_systems::setup_world_system);
16-
app.insert_resource(TerrainGeneratorParams::default());
16+
app.insert_resource(resources::Generator::default());
17+
18+
// visualizer
19+
app.add_systems(Update, terrain_systems::render_visualizer_system);
1720
}
1821
}

src/server/terrain/resources.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,44 @@ impl PastBlockUpdates {
2020
}
2121
}
2222
}
23+
24+
#[derive(Resource)]
25+
pub struct Generator {
26+
pub seed: u32,
27+
pub perlin: Perlin, // TODO: reduce visibility of attributes on this struct decl
28+
pub params: TerrainGeneratorParams,
29+
}
30+
31+
impl Default for Generator {
32+
fn default() -> Self {
33+
Self::new(0)
34+
}
35+
}
36+
37+
pub struct TerrainGeneratorParams {
38+
pub height_params: NoiseFunctionParams,
39+
pub density_params: NoiseFunctionParams,
40+
}
41+
42+
impl Default for TerrainGeneratorParams {
43+
fn default() -> Self {
44+
Self {
45+
height_params: NoiseFunctionParams {
46+
octaves: 4,
47+
height: 0.0,
48+
lacuranity: 2.0,
49+
frequency: 1.0 / 60.0,
50+
amplitude: 10.0,
51+
persistence: 0.5,
52+
},
53+
density_params: NoiseFunctionParams {
54+
octaves: 4,
55+
height: 0.0,
56+
lacuranity: 2.0,
57+
frequency: 1.0 / 60.0,
58+
amplitude: 10.0,
59+
persistence: 0.5,
60+
},
61+
}
62+
}
63+
}

src/server/terrain/systems.rs

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,9 @@
1-
use bevy::ui::Node;
2-
use bevy_flair::style::components::NodeStyleSheet;
3-
41
use crate::prelude::*;
52

63
pub fn setup_world_system(
74
mut chunk_manager: ResMut<ChunkManager>,
8-
params: Res<TerrainGeneratorParams>,
5+
generator: Res<terrain_resources::Generator>,
96
) {
10-
let generator = terrain_util::generator::Generator::new(
11-
0,
12-
TerrainGeneratorParams {
13-
height_params: params.height_params,
14-
density_params: params.density_params,
15-
},
16-
);
17-
187
let render_distance = Vec3::new(12.0, 2.0, 12.0);
198

209
info!("Generating chunks");
@@ -29,23 +18,15 @@ pub fn setup_world_system(
2918
chunk_manager.insert_chunks(chunks);
3019
}
3120

32-
// visualizer
21+
pub use visualizer::*;
3322

34-
struct NoiseImageNode {}
23+
mod visualizer {
3524

36-
pub fn setup_visualizer_system(
37-
mut commands: Commands,
38-
mut asset_server: ResMut<AssetServer>,
39-
) {
40-
commands.spawn((
41-
Node::default(),
42-
Name::new("visualizer"),
43-
NodeStyleSheet::new(asset_server.load("visualizer.css")),
44-
)).with_children(|parent| {
45-
parent.spawn((
46-
Node::default(),
47-
ImageNode::new(),
48-
Name::new("noise_image"),
49-
)
50-
})
25+
use bevy_inspector_egui::{bevy_egui::EguiContexts, egui};
26+
27+
pub fn render_visualizer_system(mut contexts: EguiContexts) {
28+
egui::Window::new("Hello").show(contexts.ctx_mut(), |ui| {
29+
ui.label("world");
30+
});
31+
}
5132
}

src/server/terrain/util/generator.rs

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
use crate::prelude::*;
1+
use terrain_resources::{Generator, TerrainGeneratorParams};
22

3-
pub struct Generator {
4-
pub seed: u32,
5-
perlin: Perlin,
6-
params: TerrainGeneratorParams,
7-
}
3+
use crate::prelude::*;
84

95
impl Generator {
10-
pub fn new(seed: u32, params: TerrainGeneratorParams) -> Generator {
6+
pub fn new(seed: u32) -> Generator {
7+
Self::new_with_params(seed, TerrainGeneratorParams::default())
8+
}
9+
10+
pub fn new_with_params(seed: u32, params: TerrainGeneratorParams) -> Generator {
1111
Generator {
1212
seed,
1313
perlin: Perlin::new(seed),
@@ -41,14 +41,13 @@ impl Generator {
4141
x: position.x,
4242
y: position.z,
4343
},
44-
default_params
44+
default_params,
4545
);
4646

4747
if (position.y as f64) < terrain_height + 20.0 {
4848
return BlockId::Stone;
4949
}
5050

51-
5251
// density -= position.y as f64 * 0.02;
5352
//
5453
// let base_block = BlockId::Stone;
@@ -67,7 +66,7 @@ impl Generator {
6766
// BlockId::Air
6867
// }
6968

70-
BlockId::Air
69+
BlockId::Air
7170
}
7271

7372
fn sample_3d(&self, position: Vec3, octaves: i32) -> f64 {
@@ -102,32 +101,29 @@ impl Generator {
102101
return sample;
103102
}
104103

105-
sample + self.sample_2d(position, &NoiseFunctionParams {
106-
octaves: params.octaves - 1,
107-
height: params.height + sample,
108-
lacuranity: params.lacuranity,
109-
frequency: params.frequency,
110-
amplitude: params.amplitude * params.persistence,
111-
persistence: params.persistence * 0.5,
112-
})
104+
sample
105+
+ self.sample_2d(
106+
position,
107+
&NoiseFunctionParams {
108+
octaves: params.octaves - 1,
109+
height: params.height + sample,
110+
lacuranity: params.lacuranity,
111+
frequency: params.frequency,
112+
amplitude: params.amplitude * params.persistence,
113+
persistence: params.persistence * 0.5,
114+
},
115+
)
113116
}
114117
}
115118

116119
#[cfg(test)]
117120
mod tests {
118121
use super::*;
119-
120-
#[test]
121-
fn test_generator_new() {
122-
let seed = 42;
123-
let generator = Generator::new(seed);
124-
assert_eq!(generator.seed, seed);
125-
}
122+
use terrain_resources::Generator;
126123

127124
#[test]
128125
fn test_generate_chunk() {
129-
let seed = 42;
130-
let generator = Generator::new(seed);
126+
let generator = Generator::default();
131127
let mut chunk = Chunk::new(Vec3::new(0.0, 0.0, 0.0));
132128

133129
generator.generate_chunk(&mut chunk);
@@ -137,8 +133,7 @@ mod tests {
137133

138134
#[test]
139135
fn test_sample_3d() {
140-
let seed = 42;
141-
let generator = Generator::new(seed);
136+
let generator = Generator::default();
142137

143138
let position = Vec3::new(0.0, 0.0, 0.0);
144139
let density = generator.sample_3d(position, 4);

src/server/terrain/util/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,3 @@ pub mod blocks;
22
pub mod generator;
33

44
pub use blocks::*;
5-
pub use generator::*;

src/shared/networking.rs

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::time::Duration;
22

3-
use bevy::{math::{Quat, Vec3}, prelude::Resource};
3+
use bevy::math::{Quat, Vec3};
44
use chrono::DateTime;
55
use renet::{ChannelConfig, ClientId, ConnectionConfig, SendType};
66
use serde::{Deserialize, Serialize};
@@ -50,36 +50,6 @@ pub enum NetworkingMessage {
5050
SingleChatMessageSync(ChatMessage),
5151
ChatMessageSync(Vec<ChatMessage>),
5252
BlockUpdate { position: Vec3, block: BlockId },
53-
UpdateGeneratorParams(TerrainGeneratorParams),
54-
}
55-
56-
#[derive(Serialize, Deserialize, Debug, Resource, Copy, Clone)]
57-
pub struct TerrainGeneratorParams {
58-
pub height_params: NoiseFunctionParams,
59-
pub density_params: NoiseFunctionParams,
60-
}
61-
62-
impl Default for TerrainGeneratorParams {
63-
fn default() -> Self {
64-
Self {
65-
height_params: NoiseFunctionParams {
66-
octaves: 4,
67-
height: 0.0,
68-
lacuranity: 2.0,
69-
frequency: 1.0 / 60.0,
70-
amplitude: 10.0,
71-
persistence: 0.5,
72-
},
73-
density_params: NoiseFunctionParams {
74-
octaves: 4,
75-
height: 0.0,
76-
lacuranity: 2.0,
77-
frequency: 1.0 / 60.0,
78-
amplitude: 10.0,
79-
persistence: 0.5,
80-
},
81-
}
82-
}
8353
}
8454

8555
#[derive(Serialize, Deserialize, Debug, Copy, Clone)]

0 commit comments

Comments
 (0)