author | unC0Rr |
Wed, 28 Aug 2024 15:31:51 +0200 | |
branch | transitional_engine |
changeset 16021 | 6a3dc15b78b9 |
parent 15924 | 9502611bffc1 |
child 16022 | 2003b466b279 |
permissions | -rw-r--r-- |
14716 | 1 |
use fpnum::{fp, FPNum, FPPoint}; |
15275 | 2 |
use hwphysics::{ |
3 |
self as hwp, |
|
4 |
common::{GearId, Millis}, |
|
15755 | 5 |
physics::{PositionData, VelocityData}, |
15275 | 6 |
}; |
14154
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
7 |
use integral_geometry::{Point, Rect, Size}; |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
8 |
use land2d::Land2D; |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
9 |
use landgen::{ |
15924 | 10 |
outline_template_based::outline_template::OutlineTemplate, |
11 |
outline_template_based::template_based::TemplatedLandGenerator, LandGenerationParameters, |
|
12 |
LandGenerator, |
|
14154
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
13 |
}; |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
14 |
use lfprng::LaggedFibonacciPRNG; |
15890 | 15 |
use std::path::{Path, PathBuf}; |
14295 | 16 |
|
15762 | 17 |
use crate::render::{camera::Camera, GearEntry, GearRenderer, MapRenderer}; |
14702 | 18 |
|
14295 | 19 |
struct GameState { |
20 |
land: Land2D<u32>, |
|
21 |
physics: hwp::World, |
|
22 |
} |
|
23 |
||
24 |
impl GameState { |
|
25 |
fn new(land: Land2D<u32>, physics: hwp::World) -> Self { |
|
14705 | 26 |
Self { land, physics } |
14295 | 27 |
} |
28 |
} |
|
14154
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
29 |
|
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
30 |
pub struct World { |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
31 |
random_numbers_gen: LaggedFibonacciPRNG, |
15809
c3971b38bbfa
hedgewars-engine (rust)/preview: recognise feature_size cmd and do something with it
sheepluva
parents:
15764
diff
changeset
|
32 |
feature_size: u8, |
14373
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14295
diff
changeset
|
33 |
preview: Option<Land2D<u8>>, |
14295 | 34 |
game_state: Option<GameState>, |
15190 | 35 |
map_renderer: Option<MapRenderer>, |
36 |
gear_renderer: Option<GearRenderer>, |
|
14705 | 37 |
camera: Camera, |
15762 | 38 |
gear_entries: Vec<GearEntry>, |
15890 | 39 |
data_path: PathBuf, |
14154
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
40 |
} |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
41 |
|
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
42 |
impl World { |
15891 | 43 |
pub fn new(data_path: &Path) -> Self { |
14154
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
44 |
Self { |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
45 |
random_numbers_gen: LaggedFibonacciPRNG::new(&[]), |
15809
c3971b38bbfa
hedgewars-engine (rust)/preview: recognise feature_size cmd and do something with it
sheepluva
parents:
15764
diff
changeset
|
46 |
feature_size: 5, |
14373
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14295
diff
changeset
|
47 |
preview: None, |
14295 | 48 |
game_state: None, |
15190 | 49 |
map_renderer: None, |
50 |
gear_renderer: None, |
|
14705 | 51 |
camera: Camera::new(), |
15762 | 52 |
gear_entries: vec![], |
15891 | 53 |
data_path: data_path.to_owned(), |
14154
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
54 |
} |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
55 |
} |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
56 |
|
14705 | 57 |
pub fn create_renderer(&mut self, width: u16, height: u16) { |
14714 | 58 |
let land_tile_size = Size::square(512); |
15190 | 59 |
self.map_renderer = Some(MapRenderer::new(land_tile_size)); |
15890 | 60 |
self.gear_renderer = Some(GearRenderer::new(&self.data_path.as_path())); |
14705 | 61 |
self.camera = Camera::with_size(Size::new(width as usize, height as usize)); |
14708 | 62 |
|
63 |
use mapgen::{theme::Theme, MapGenerator}; |
|
64 |
||
65 |
if let Some(ref state) = self.game_state { |
|
14711 | 66 |
self.camera.position = state.land.play_box().center(); |
14714 | 67 |
|
15924 | 68 |
let parameters = LandGenerationParameters::new(0u32, 0x8000u32, 0, false, false); |
14708 | 69 |
let theme = |
15890 | 70 |
Theme::load(self.data_path.join(Path::new("Themes/Cheese/")).as_path()).unwrap(); |
15924 | 71 |
let texture = MapGenerator::<OutlineTemplate>::new().make_texture( |
72 |
&state.land, |
|
73 |
¶meters, |
|
74 |
&theme, |
|
75 |
); |
|
15190 | 76 |
if let Some(ref mut renderer) = self.map_renderer { |
14708 | 77 |
renderer.init(&texture); |
78 |
} |
|
79 |
} |
|
14705 | 80 |
} |
81 |
||
14272 | 82 |
pub fn set_seed(&mut self, seed: &[u8]) { |
83 |
self.random_numbers_gen = LaggedFibonacciPRNG::new(seed); |
|
84 |
} |
|
85 |
||
15809
c3971b38bbfa
hedgewars-engine (rust)/preview: recognise feature_size cmd and do something with it
sheepluva
parents:
15764
diff
changeset
|
86 |
pub fn set_feature_size(&mut self, feature_size: u8) { |
c3971b38bbfa
hedgewars-engine (rust)/preview: recognise feature_size cmd and do something with it
sheepluva
parents:
15764
diff
changeset
|
87 |
self.feature_size = feature_size; |
c3971b38bbfa
hedgewars-engine (rust)/preview: recognise feature_size cmd and do something with it
sheepluva
parents:
15764
diff
changeset
|
88 |
} |
c3971b38bbfa
hedgewars-engine (rust)/preview: recognise feature_size cmd and do something with it
sheepluva
parents:
15764
diff
changeset
|
89 |
|
14373
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14295
diff
changeset
|
90 |
pub fn preview(&self) -> &Option<Land2D<u8>> { |
14154
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
91 |
&self.preview |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
92 |
} |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
93 |
|
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
94 |
pub fn generate_preview(&mut self) { |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
95 |
fn template() -> OutlineTemplate { |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
96 |
let mut template = OutlineTemplate::new(Size::new(4096, 2048)); |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
97 |
template.islands = vec![vec![ |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
98 |
Rect::from_size_coords(100, 2050, 1, 1), |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
99 |
Rect::from_size_coords(100, 500, 400, 1200), |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
100 |
Rect::from_size_coords(3600, 500, 400, 1200), |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
101 |
Rect::from_size_coords(3900, 2050, 1, 1), |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
102 |
]]; |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
103 |
template.fill_points = vec![Point::new(1, 0)]; |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
104 |
|
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
105 |
template |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
106 |
} |
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
107 |
|
15809
c3971b38bbfa
hedgewars-engine (rust)/preview: recognise feature_size cmd and do something with it
sheepluva
parents:
15764
diff
changeset
|
108 |
// based on old engine min_distance... dunno if this is the correct place tho |
c3971b38bbfa
hedgewars-engine (rust)/preview: recognise feature_size cmd and do something with it
sheepluva
parents:
15764
diff
changeset
|
109 |
let distance_divisor = (self.feature_size as u32).pow(2) / 8 + 10; |
c3971b38bbfa
hedgewars-engine (rust)/preview: recognise feature_size cmd and do something with it
sheepluva
parents:
15764
diff
changeset
|
110 |
|
15828 | 111 |
let params = LandGenerationParameters::new(0u8, u8::MAX, distance_divisor, false, false); |
14154
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
112 |
let landgen = TemplatedLandGenerator::new(template()); |
14373
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14295
diff
changeset
|
113 |
self.preview = Some(landgen.generate_land(¶ms, &mut self.random_numbers_gen)); |
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14295
diff
changeset
|
114 |
} |
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14295
diff
changeset
|
115 |
|
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14295
diff
changeset
|
116 |
pub fn dispose_preview(&mut self) { |
4409344db447
Rework EngineInstance::generatePreview, add preview cleanup function in enginelib
unC0Rr
parents:
14295
diff
changeset
|
117 |
self.preview = None |
14154
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
118 |
} |
14295 | 119 |
|
120 |
pub fn init(&mut self, template: OutlineTemplate) { |
|
15828 | 121 |
let params = LandGenerationParameters::new(0u32, u32::MAX, 5, false, false); |
14295 | 122 |
let landgen = TemplatedLandGenerator::new(template); |
123 |
let land = landgen.generate_land(¶ms, &mut self.random_numbers_gen); |
|
124 |
||
15828 | 125 |
let physics = hwp::World::new(land.size()); |
126 |
||
14295 | 127 |
self.game_state = Some(GameState::new(land, physics)); |
128 |
} |
|
129 |
||
14704 | 130 |
pub fn move_camera(&mut self, position_shift: Point, zoom_shift: f32) { |
131 |
self.camera.zoom += zoom_shift; |
|
14709 | 132 |
self.camera.position += Point::new( |
133 |
(position_shift.x as f32 / self.camera.zoom) as i32, |
|
134 |
(position_shift.y as f32 / self.camera.zoom) as i32, |
|
135 |
); |
|
14704 | 136 |
} |
137 |
||
138 |
pub fn render(&mut self) { |
|
15190 | 139 |
if let Some(ref mut renderer) = self.map_renderer { |
14705 | 140 |
unsafe { |
141 |
gl::ClearColor(0.4f32, 0f32, 0.2f32, 1f32); |
|
142 |
gl::Clear(gl::COLOR_BUFFER_BIT); |
|
143 |
} |
|
14704 | 144 |
|
14718 | 145 |
renderer.render(&self.camera); |
14702 | 146 |
} |
15762 | 147 |
|
148 |
self.gear_entries.clear(); |
|
149 |
let mut gear_entries = std::mem::take(&mut self.gear_entries); |
|
150 |
||
15190 | 151 |
if let Some(ref mut renderer) = self.gear_renderer { |
15762 | 152 |
if let Some(ref mut state) = self.game_state { |
153 |
state |
|
154 |
.physics |
|
155 |
.iter_data() |
|
156 |
.run(|(pos,): (&mut PositionData,)| { |
|
157 |
gear_entries.push(GearEntry::new( |
|
158 |
f64::from(pos.0.x()) as f32, |
|
159 |
f64::from(pos.0.y()) as f32, |
|
15764 | 160 |
Size::square(256), |
15762 | 161 |
)) |
162 |
}); |
|
163 |
} |
|
164 |
renderer.render(&self.camera, &gear_entries); |
|
15190 | 165 |
} |
15762 | 166 |
self.gear_entries = gear_entries; |
14702 | 167 |
} |
168 |
||
14716 | 169 |
fn create_gear(&mut self, position: Point) { |
170 |
if let Some(ref mut state) = self.game_state { |
|
15274 | 171 |
let id = state.physics.new_gear().unwrap(); |
14716 | 172 |
let fp_position = FPPoint::new(position.x.into(), position.y.into()); |
15759 | 173 |
state.physics.add_gear_data(id, &PositionData(fp_position)); |
174 |
state |
|
175 |
.physics |
|
176 |
.add_gear_data(id, &VelocityData(FPPoint::zero())) |
|
14716 | 177 |
} |
178 |
} |
|
179 |
||
14295 | 180 |
pub fn step(&mut self) { |
181 |
if let Some(ref mut state) = self.game_state { |
|
14716 | 182 |
let next = self.random_numbers_gen.next().unwrap(); |
15758 | 183 |
if next % 32 == 0 { |
14716 | 184 |
let position = Point::new( |
185 |
(self.random_numbers_gen.next().unwrap() % state.land.width() as u32) as i32, |
|
186 |
0, |
|
187 |
); |
|
188 |
self.create_gear(position); |
|
15758 | 189 |
} |
14716 | 190 |
} |
191 |
||
192 |
if let Some(ref mut state) = self.game_state { |
|
15275 | 193 |
state.physics.step(Millis::new(1), &state.land); |
14295 | 194 |
} |
195 |
} |
|
14154
8354b390f1a2
Some refactoring of qmlfrontend. It now shows land preview generated by hedgewars-engine
unC0Rr
parents:
diff
changeset
|
196 |
} |