rust/lib-hedgewars-engine/src/world.rs
changeset 14705 19122a329774
parent 14704 12db7e435ea6
child 14708 19358c313ebb
--- a/rust/lib-hedgewars-engine/src/world.rs	Fri Mar 22 20:01:47 2019 +0300
+++ b/rust/lib-hedgewars-engine/src/world.rs	Fri Mar 22 20:26:29 2019 +0300
@@ -1,19 +1,14 @@
-use fpnum::{FPNum, fp};
+use fpnum::{fp, FPNum};
+use hwphysics as hwp;
 use integral_geometry::{Point, Rect, Size};
 use land2d::Land2D;
 use landgen::{
-    outline_template::OutlineTemplate,
-    template_based::TemplatedLandGenerator,
-    LandGenerationParameters,
-    LandGenerator,
+    outline_template::OutlineTemplate, template_based::TemplatedLandGenerator,
+    LandGenerationParameters, LandGenerator,
 };
 use lfprng::LaggedFibonacciPRNG;
-use hwphysics as hwp;
 
-use crate::render::{
-    MapRenderer,
-    camera::Camera
-};
+use crate::render::{camera::Camera, MapRenderer};
 
 struct GameState {
     land: Land2D<u32>,
@@ -22,10 +17,7 @@
 
 impl GameState {
     fn new(land: Land2D<u32>, physics: hwp::World) -> Self {
-        Self {
-            land,
-            physics,
-        }
+        Self { land, physics }
     }
 }
 
@@ -33,8 +25,8 @@
     random_numbers_gen: LaggedFibonacciPRNG,
     preview: Option<Land2D<u8>>,
     game_state: Option<GameState>,
-    renderer: MapRenderer,
-    camera: Camera
+    renderer: Option<MapRenderer>,
+    camera: Camera,
 }
 
 impl World {
@@ -43,11 +35,16 @@
             random_numbers_gen: LaggedFibonacciPRNG::new(&[]),
             preview: None,
             game_state: None,
-            renderer: MapRenderer::new(512, 512),
-            camera: Camera::new()
+            renderer: None,
+            camera: Camera::new(),
         }
     }
 
+    pub fn create_renderer(&mut self, width: u16, height: u16) {
+        self.renderer = Some(MapRenderer::new(512, 512));
+        self.camera = Camera::with_size(Size::new(width as usize, height as usize));
+    }
+
     pub fn set_seed(&mut self, seed: &[u8]) {
         self.random_numbers_gen = LaggedFibonacciPRNG::new(seed);
     }
@@ -87,16 +84,17 @@
         let land = landgen.generate_land(&params, &mut self.random_numbers_gen);
 
         use mapgen::{
+            theme::{slice_u32_to_u8, Theme},
             MapGenerator,
-            theme::{Theme, slice_u32_to_u8}
         };
 
         use std::path::Path;
-        
+
         let theme = Theme::load(Path::new("../../share/hedgewars/Data/Themes/Cheese/")).unwrap();
         let texture = MapGenerator::new().make_texture32(&land, &theme);
-        self.renderer.init(&texture);
-        
+        if let Some(ref mut renderer) = self.renderer {
+            renderer.init(&texture);
+        }
         self.game_state = Some(GameState::new(land, physics));
     }
 
@@ -106,13 +104,14 @@
     }
 
     pub fn render(&mut self) {
+        if let Some(ref mut renderer) = self.renderer {
+            unsafe {
+                gl::ClearColor(0.4f32, 0f32, 0.2f32, 1f32);
+                gl::Clear(gl::COLOR_BUFFER_BIT);
+            }
 
-        unsafe {
-            gl::ClearColor(0.4f32, 0f32, 0.2f32, 1f32);
-            gl::Clear(gl::COLOR_BUFFER_BIT);
+            renderer.render(self.camera.viewport());
         }
-
-        self.renderer.render(self.camera.viewport());
     }
 
     pub fn step(&mut self) {
@@ -121,6 +120,3 @@
         }
     }
 }
-
-
-