Skip to content

Commit 2dacad0

Browse files
authored
Merge pull request #26 from mbienkowsk/9-modele-bazowe
9 modele bazowe
2 parents f4f7fd4 + 60cdd6c commit 2dacad0

11 files changed

Lines changed: 225 additions & 44 deletions

File tree

assets/models/branch.mtl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
newmtl Material_Branch
2+
Ns 96.078431
3+
Ka 1.000000 1.000000 1.000000
4+
Kd 0.400000 0.250000 0.150000
5+
Ks 0.100000 0.100000 0.100000
6+
Ke 0.000000 0.000000 0.000000
7+
Ni 1.450000
8+
d 1.000000
9+
illum 2

assets/models/branch.obj

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
mtllib branch.mtl
2+
o Branch
3+
v 0.0 0.0 0.0
4+
v 0.1 0.0 0.0
5+
v 0.1 0.0 0.1
6+
v 0.0 0.0 0.1
7+
v 0.05 1.0 0.05
8+
v 0.0 0.5 0.0
9+
v 0.1 0.5 0.0
10+
v 0.1 0.5 0.1
11+
v 0.0 0.5 0.1
12+
vn 0.0 -1.0 0.0
13+
vn 0.0 1.0 0.0
14+
vn -1.0 0.0 0.0
15+
vn 1.0 0.0 0.0
16+
vn 0.0 0.0 -1.0
17+
vn 0.0 0.0 1.0
18+
usemtl Material_Branch
19+
f 1//1 2//1 3//1
20+
f 1//1 3//1 4//1
21+
f 1//3 4//3 8//3
22+
f 1//3 8//3 6//3
23+
f 2//4 7//4 3//4
24+
f 7//4 8//4 3//4
25+
f 4//6 3//6 8//6
26+
f 1//5 6//5 7//5
27+
f 1//5 7//5 2//5
28+
f 6//3 8//3 5//3
29+
f 7//4 5//4 8//4
30+
f 8//6 5//6 9//6
31+
f 6//5 5//5 7//5
32+
f 5//2 9//2 5//2

assets/models/leaf.mtl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
newmtl Material_Leaf
2+
Ns 96.078431
3+
Ka 1.000000 1.000000 1.000000
4+
Kd 0.200000 0.600000 0.150000
5+
Ks 0.100000 0.100000 0.100000
6+
Ke 0.000000 0.000000 0.000000
7+
Ni 1.450000
8+
d 1.000000
9+
illum 2

assets/models/leaf.obj

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
mtllib leaf.mtl
2+
o Leaf
3+
v -0.1 0.0 0.0
4+
v 0.1 0.0 0.0
5+
v 0.05 0.5 0.0
6+
v -0.05 0.5 0.0
7+
v 0.0 0.8 0.0
8+
vn 0.0 0.0 1.0
9+
vn 0.0 0.0 -1.0
10+
usemtl Material_Leaf
11+
f 1//1 2//1 3//1
12+
f 1//1 3//1 4//1
13+
f 4//1 3//1 5//1
14+
f 2//2 1//2 3//2
15+
f 3//2 1//2 4//2
16+
f 3//2 4//2 5//2

assets/models/twig.mtl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
newmtl Material_Twig
2+
Ns 96.078431
3+
Ka 1.000000 1.000000 1.000000
4+
Kd 0.350000 0.200000 0.100000
5+
Ks 0.100000 0.100000 0.100000
6+
Ke 0.000000 0.000000 0.000000
7+
Ni 1.450000
8+
d 1.000000
9+
illum 2

assets/models/twig.obj

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
mtllib twig.mtl
2+
o Twig
3+
v -0.02 0.0 -0.02
4+
v 0.02 0.0 -0.02
5+
v 0.02 0.0 0.02
6+
v -0.02 0.0 0.02
7+
v -0.015 1.2 -0.015
8+
v 0.015 1.2 -0.015
9+
v 0.015 1.2 0.015
10+
v -0.015 1.2 0.015
11+
vn 0.0 -1.0 0.0
12+
vn 0.0 1.0 0.0
13+
vn -1.0 0.0 0.0
14+
vn 1.0 0.0 0.0
15+
vn 0.0 0.0 -1.0
16+
vn 0.0 0.0 1.0
17+
usemtl Material_Twig
18+
f 1//1 4//1 3//1
19+
f 1//1 3//1 2//1
20+
f 5//2 6//2 7//2
21+
f 5//2 7//2 8//2
22+
f 1//3 5//3 8//3
23+
f 1//3 8//3 4//3
24+
f 2//4 3//4 7//4
25+
f 2//4 7//4 6//4
26+
f 4//6 8//6 7//6
27+
f 4//6 7//6 3//6
28+
f 1//5 2//5 6//5
29+
f 1//5 6//5 5//5

src/app.rs

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ use winit::{
99
window::WindowId,
1010
};
1111

12-
// TODO: this could probably be calculated based on time since last frame instead
1312
const DELTA_TIME: f32 = 0.1;
1413

14+
use crate::common::ModelSelection;
1515
use crate::gui::LSystemConfig;
1616
use crate::lsystem::LSystem;
17-
use crate::model_loader::{Model3D, load_cylinder, load_floor, load_monkey};
17+
use crate::model_loader::{load_floor, load_model};
1818
use crate::scene::Scene;
1919
use crate::turtle::TurtleInterpreter;
2020
use crate::{
@@ -36,7 +36,7 @@ pub struct App {
3636
pressed_keys: HashSet<KeyCode>,
3737
interaction_mode: AppInteractionMode,
3838
lsystem_config: Option<LSystemConfig>,
39-
base_models: Vec<Model3D>,
39+
model_selection: Option<ModelSelection>,
4040
scene: Option<Scene>,
4141
}
4242

@@ -51,10 +51,9 @@ impl ApplicationHandler for App {
5151
glm::vec3(0.0, 1.0, 5.0),
5252
self.renderer.as_ref().unwrap().get_aspect_ratio(),
5353
));
54-
self.base_models = vec![load_cylinder(), load_monkey()];
5554
self.scene = Some(Scene::new(
5655
load_floor(),
57-
self.base_models[0].clone(),
56+
load_model(ModelSelection::default()),
5857
Vec::new(),
5958
3.0,
6059
[10.0, 10.0, 10.0],
@@ -94,12 +93,7 @@ impl ApplicationHandler for App {
9493
return;
9594
}
9695

97-
let new_lsystem_config = self.get_current_lsystem_config();
98-
if new_lsystem_config != self.lsystem_config.as_ref().unwrap() {
99-
log::info!("L-System config changed to {new_lsystem_config:?}");
100-
self.lsystem_config = Some(new_lsystem_config.clone());
101-
self.calculate_transformations();
102-
}
96+
self.update_fractal();
10397

10498
self.render_scene();
10599
self.handle_movement();
@@ -197,17 +191,6 @@ impl App {
197191

198192
fn render_scene(&mut self) {
199193
let renderer = self.renderer.as_mut().unwrap();
200-
201-
// TODO some reasonable base models for L-systems
202-
let model = match renderer.get_gui_controller().get_model_selection() {
203-
crate::gui::ModelSelection::Monkey => &self.base_models[1],
204-
crate::gui::ModelSelection::Cylinder => &self.base_models[0],
205-
};
206-
207-
if model.geometry.name != self.scene.as_ref().unwrap().fractal_base().geometry.name {
208-
self.scene.as_mut().unwrap().set_fractal_base(model.clone());
209-
}
210-
211194
let camera = self.camera.as_ref().unwrap();
212195

213196
renderer.render_scene(
@@ -217,6 +200,55 @@ impl App {
217200
);
218201
}
219202

203+
fn update_fractal(&mut self) {
204+
let Some(renderer) = &self.renderer else {
205+
return;
206+
};
207+
208+
let gui = renderer.get_gui_controller();
209+
let config = gui.get_lsystem_config();
210+
let model_selection = gui.get_model_selection();
211+
212+
let config_changed = self.lsystem_config.as_ref() != Some(config);
213+
let model_changed = self.model_selection.as_ref() != Some(model_selection);
214+
215+
if !config_changed && !model_changed {
216+
return;
217+
}
218+
219+
log::info!(
220+
"Updating fractal - config_changed: {config_changed}, model_changed: {model_changed}"
221+
);
222+
223+
if config_changed {
224+
log::info!("L-System config changed to {config:?}");
225+
self.lsystem_config = Some(config.clone());
226+
}
227+
228+
if model_changed {
229+
log::info!("Model selection changed to {model_selection:?}");
230+
self.model_selection = Some(*model_selection);
231+
232+
let new_base = load_model(*model_selection);
233+
234+
if let Some(scene) = &mut self.scene {
235+
scene.set_fractal_base(new_base);
236+
}
237+
}
238+
239+
let production_rules: HashMap<char, String> =
240+
config.production_rules.iter().cloned().collect();
241+
let lsystem = LSystem::new(&config.axiom, production_rules);
242+
let generated = lsystem.generate(config.n_iterations);
243+
let transformations = TurtleInterpreter::interpret(&generated, config.angle);
244+
245+
if let Some(scene) = &mut self.scene {
246+
scene.update_transformations(transformations, config.fractal_height);
247+
}
248+
249+
renderer.request_redraw();
250+
}
251+
220252
fn calculate_transformations(&mut self) {
221253
let lsystem_config = self.get_current_lsystem_config();
222254
let target_height = lsystem_config.fractal_height;

src/common.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#[derive(Debug, PartialEq, Clone, Copy, Default)]
2+
pub enum ModelSelection {
3+
#[default]
4+
Cylinder,
5+
Branch,
6+
Leaf,
7+
Twig,
8+
Monkey,
9+
}

src/gui.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::common::ModelSelection;
12
use egui::Ui;
23
use egui_glium::EguiGlium;
34
use egui_glium::egui_winit::egui::ViewportId;
@@ -86,12 +87,6 @@ impl PresetSelection {
8687
}
8788
}
8889

89-
#[derive(Debug, PartialEq)]
90-
pub enum ModelSelection {
91-
Cylinder,
92-
Monkey,
93-
}
94-
9590
#[derive(Debug, PartialEq, Clone, Copy)]
9691
pub enum ShadingMode {
9792
Flat,
@@ -151,11 +146,14 @@ impl GuiController {
151146
shading_mode: &mut ShadingMode,
152147
ui: &mut Ui,
153148
) {
154-
egui::ComboBox::from_label("Selected Model")
149+
egui::ComboBox::from_label("Base Model")
155150
.selected_text(format!("{model_selection:?}"))
156151
.show_ui(ui, |ui| {
157-
ui.selectable_value(model_selection, ModelSelection::Monkey, "Monkey");
158152
ui.selectable_value(model_selection, ModelSelection::Cylinder, "Cylinder");
153+
ui.selectable_value(model_selection, ModelSelection::Branch, "Branch");
154+
ui.selectable_value(model_selection, ModelSelection::Twig, "Twig");
155+
ui.selectable_value(model_selection, ModelSelection::Leaf, "Leaf");
156+
ui.selectable_value(model_selection, ModelSelection::Monkey, "Monkey");
159157
});
160158

161159
ui.label("Shading Mode:");

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ extern crate nalgebra_glm as glm;
44

55
mod app;
66
mod camera;
7+
mod common;
78
mod gui;
89
mod lsystem;
910
mod model_loader;

0 commit comments

Comments
 (0)