Ver código fonte

Add TileCoord::children_iter method and Iterator

Johannes Hofmann 7 anos atrás
pai
commit
e64385d0ca
2 arquivos alterados com 106 adições e 49 exclusões
  1. 61
    0
      src/coord.rs
  2. 45
    49
      src/globe_tile_layer.rs

+ 61
- 0
src/coord.rs Ver arquivo

@@ -343,6 +343,18 @@ impl TileCoord {
343 343
         }
344 344
     }
345 345
 
346
+    pub fn children_iter(&self, zoom_delta: u32) -> TileChildrenIter {
347
+        let zoom_level_tiles = Self::get_zoom_level_tiles(zoom_delta);
348
+        TileChildrenIter {
349
+            zoom: self.zoom + zoom_delta,
350
+            tile_base_x: self.x * zoom_level_tiles,
351
+            tile_base_y: self.y * zoom_level_tiles,
352
+            child_x: -1,
353
+            child_y: 0,
354
+            zoom_level_tiles,
355
+        }
356
+    }
357
+
346 358
     pub fn children(&self) -> [(TileCoord, SubTileCoord); 4] {
347 359
         [
348 360
             (
@@ -432,6 +444,44 @@ impl TileCoord {
432 444
     }
433 445
 }
434 446
 
447
+pub struct TileChildrenIter {
448
+    zoom: u32,
449
+    tile_base_x: i32,
450
+    tile_base_y: i32,
451
+    child_x: i32,
452
+    child_y: i32,
453
+    zoom_level_tiles: i32,
454
+}
455
+
456
+impl Iterator for TileChildrenIter {
457
+    type Item = (TileCoord, SubTileCoord);
458
+
459
+    fn next(&mut self) -> Option<Self::Item> {
460
+        self.child_x += 1;
461
+
462
+        if self.child_x >= self.zoom_level_tiles {
463
+            self.child_x = 0;
464
+            self.child_y += 1;
465
+        }
466
+        if self.child_y >= self.zoom_level_tiles {
467
+            return None;
468
+        }
469
+
470
+        Some((
471
+            TileCoord {
472
+                zoom: self.zoom,
473
+                x: self.tile_base_x + self.child_x,
474
+                y: self.tile_base_y + self.child_y,
475
+            },
476
+            SubTileCoord {
477
+                size: self.zoom_level_tiles as u32,
478
+                x: self.child_x as u32,
479
+                y: self.child_y as u32,
480
+            },
481
+        ))
482
+    }
483
+}
484
+
435 485
 //TODO include width and height of view rect to determine visibility
436 486
 #[derive(Copy, Clone, Debug, PartialEq)]
437 487
 pub struct View {
@@ -531,4 +581,15 @@ mod tests {
531 581
         assert!(approx_eq(deg.lat, -0.5 * PI));
532 582
         assert!(approx_eq(deg.lon, PI));
533 583
     }
584
+
585
+    #[test]
586
+    fn tile_children() {
587
+        let t = TileCoord::new(2, 1, 2);
588
+        for (&(a1, a2), (b1, b2)) in t.children().iter().zip(t.children_iter(1)) {
589
+            assert_eq!(a1, b1);
590
+            assert_eq!(a2, b2);
591
+        }
592
+        assert_eq!(t.children_iter(1).collect::<Vec<_>>().len(), 4);
593
+        assert_eq!(t.children_iter(2).collect::<Vec<_>>().len(), 16);
594
+    }
534 595
 }

+ 45
- 49
src/globe_tile_layer.rs Ver arquivo

@@ -123,9 +123,9 @@ impl GlobeTileLayer {
123 123
 
124 124
         let (inset_x, inset_y) = tile_atlas.texture_margins();
125 125
 
126
-        for tile_y in 0..16 {
127
-            for tile_x in 0..16 {
128
-                let tc = TileCoord::new(4, tile_x, tile_y);
126
+        for tile_y in 0..8 {
127
+            for tile_x in 0..8 {
128
+                let tc = TileCoord::new(3, tile_x, tile_y);
129 129
                 let slot = tile_atlas.store(cx, tc, source, cache, true)
130 130
                     .unwrap_or_else(TileAtlas::default_slot);
131 131
                 let texrect = tile_atlas.slot_to_texture_rect(slot);
@@ -138,53 +138,49 @@ impl GlobeTileLayer {
138 138
                     tex_minmax.y2 as f32,
139 139
                 ];
140 140
 
141
-                for &(tc, sub_tile_a) in &tc.children() {
142
-                    for &(tc, sub_tile_b) in &tc.children() {
143
-                        let sub_tile = sub_tile_a.subdivide(&sub_tile_b);
144
-
145
-                        let ll_nw = tc.latlon_rad_north_west();
146
-                        let ll_se = {
147
-                            let tc = TileCoord::new(tc.zoom, tc.x + 1, tc.y + 1);
148
-                            tc.latlon_rad_north_west()
149
-                        };
150
-
151
-                        let ll_ne = LatLonRad::new(ll_nw.lat, ll_se.lon);
152
-                        let ll_sw = LatLonRad::new(ll_se.lat, ll_nw.lon);
153
-
154
-                        let p1 = ll_nw.to_sphere_point3(1.0);
155
-                        let p2 = ll_ne.to_sphere_point3(1.0);
156
-                        let p3 = ll_se.to_sphere_point3(1.0);
157
-                        let p4 = ll_sw.to_sphere_point3(1.0);
158
-
159
-                        let p1 = transform.transform_point(p1);
160
-                        let p2 = transform.transform_point(p2);
161
-                        let p3 = transform.transform_point(p3);
162
-                        let p4 = transform.transform_point(p4);
163
-
164
-                        if p1.z > 0.0 && p2.z > 0.0 && p3.z > 0.0 && p4.z > 0.0 {
165
-                            continue;
166
-                        }
167
-
168
-                        let texrect = texrect.subdivide(&sub_tile);
169
-
170
-                        let p1 = [p1.x as f32, p1.y as f32, p1.z as f32, texrect.x1 as f32, texrect.y1 as f32];
171
-                        let p2 = [p2.x as f32, p2.y as f32, p2.z as f32, texrect.x2 as f32, texrect.y1 as f32];
172
-                        let p3 = [p3.x as f32, p3.y as f32, p3.z as f32, texrect.x2 as f32, texrect.y2 as f32];
173
-                        let p4 = [p4.x as f32, p4.y as f32, p4.z as f32, texrect.x1 as f32, texrect.y2 as f32];
174
-
175
-                        vertex_data.extend(&p1);
176
-                        vertex_data.extend(&minmax);
177
-                        vertex_data.extend(&p2);
178
-                        vertex_data.extend(&minmax);
179
-                        vertex_data.extend(&p3);
180
-                        vertex_data.extend(&minmax);
181
-                        vertex_data.extend(&p1);
182
-                        vertex_data.extend(&minmax);
183
-                        vertex_data.extend(&p3);
184
-                        vertex_data.extend(&minmax);
185
-                        vertex_data.extend(&p4);
186
-                        vertex_data.extend(&minmax);
141
+                for (tc, sub_tile) in tc.children_iter(3) {
142
+                    let ll_nw = tc.latlon_rad_north_west();
143
+                    let ll_se = {
144
+                        let tc = TileCoord::new(tc.zoom, tc.x + 1, tc.y + 1);
145
+                        tc.latlon_rad_north_west()
146
+                    };
147
+
148
+                    let ll_ne = LatLonRad::new(ll_nw.lat, ll_se.lon);
149
+                    let ll_sw = LatLonRad::new(ll_se.lat, ll_nw.lon);
150
+
151
+                    let p1 = ll_nw.to_sphere_point3(1.0);
152
+                    let p2 = ll_ne.to_sphere_point3(1.0);
153
+                    let p3 = ll_se.to_sphere_point3(1.0);
154
+                    let p4 = ll_sw.to_sphere_point3(1.0);
155
+
156
+                    let p1 = transform.transform_point(p1);
157
+                    let p2 = transform.transform_point(p2);
158
+                    let p3 = transform.transform_point(p3);
159
+                    let p4 = transform.transform_point(p4);
160
+
161
+                    if p1.z > 0.0 && p2.z > 0.0 && p3.z > 0.0 && p4.z > 0.0 {
162
+                        continue;
187 163
                     }
164
+
165
+                    let texrect = texrect.subdivide(&sub_tile);
166
+
167
+                    let p1 = [p1.x as f32, p1.y as f32, p1.z as f32, texrect.x1 as f32, texrect.y1 as f32];
168
+                    let p2 = [p2.x as f32, p2.y as f32, p2.z as f32, texrect.x2 as f32, texrect.y1 as f32];
169
+                    let p3 = [p3.x as f32, p3.y as f32, p3.z as f32, texrect.x2 as f32, texrect.y2 as f32];
170
+                    let p4 = [p4.x as f32, p4.y as f32, p4.z as f32, texrect.x1 as f32, texrect.y2 as f32];
171
+
172
+                    vertex_data.extend(&p1);
173
+                    vertex_data.extend(&minmax);
174
+                    vertex_data.extend(&p2);
175
+                    vertex_data.extend(&minmax);
176
+                    vertex_data.extend(&p3);
177
+                    vertex_data.extend(&minmax);
178
+                    vertex_data.extend(&p1);
179
+                    vertex_data.extend(&minmax);
180
+                    vertex_data.extend(&p3);
181
+                    vertex_data.extend(&minmax);
182
+                    vertex_data.extend(&p4);
183
+                    vertex_data.extend(&minmax);
188 184
                 }
189 185
             }
190 186
         }