rust/lib-hedgewars-engine/src/render/atlas.rs
changeset 14727 2cc36cb1c258
parent 14726 75ff5c643004
child 14728 069291842d52
equal deleted inserted replaced
14726:75ff5c643004 14727:2cc36cb1c258
   127             .collect();
   127             .collect();
   128     }
   128     }
   129 
   129 
   130     pub fn insert(&mut self, size: Size) -> Option<Rect> {
   130     pub fn insert(&mut self, size: Size) -> Option<Rect> {
   131         let (rect, _) = self.find_position(size)?;
   131         let (rect, _) = self.find_position(size)?;
   132 
   132         let mut splits = vec![];
   133         let mut rects_to_process = self.free_rects.len();
   133 
   134         let mut i = 0;
   134         for i in (0..self.free_rects.len()).rev() {
   135 
   135             if split_rect(self.free_rects[i], rect, &mut splits) {
   136         while i < rects_to_process {
   136                 self.free_rects.swap_remove(i as usize);
   137             let rects = split_rect(self.free_rects[i], rect);
   137             }
   138             if !rects.is_empty() {
   138         }
   139                 self.free_rects.remove(i);
   139         self.free_rects.extend(splits);
   140                 self.free_rects.extend(rects);
   140         self.prune();
   141                 rects_to_process -= 1
       
   142             } else {
       
   143                 i += 1;
       
   144             }
       
   145         }
       
   146 
   141 
   147         self.used_rects.push(rect);
   142         self.used_rects.push(rect);
   148         self.prune();
       
   149         Some(rect)
   143         Some(rect)
   150     }
   144     }
   151 
   145 
   152     pub fn insert_set<Iter>(&mut self, sizes: Iter) -> Vec<Rect>
   146     pub fn insert_set<Iter>(&mut self, sizes: Iter) -> Vec<Rect>
   153     where
   147     where
   223             true
   217             true
   224         }
   218         }
   225     }
   219     }
   226 }
   220 }
   227 
   221 
   228 fn split_rect(free_rect: Rect, rect: Rect) -> Vec<Rect> {
   222 fn split_rect(free_rect: Rect, rect: Rect, output: &mut Vec<Rect>) -> bool {
   229     let mut result = vec![];
   223     let split = free_rect.intersects(&rect);
   230     if free_rect.intersects(&rect) {
   224     if split {
   231         if rect.left() > free_rect.left() {
   225         if rect.left() > free_rect.left() {
   232             let trim = free_rect.right() - rect.left() + 1;
   226             let trim = free_rect.right() - rect.left() + 1;
   233             result.push(free_rect.with_margins(0, -trim, 0, 0))
   227             output.push(free_rect.with_margins(0, -trim, 0, 0))
   234         }
   228         }
   235         if rect.right() < free_rect.right() {
   229         if rect.right() < free_rect.right() {
   236             let trim = rect.right() - free_rect.left() + 1;
   230             let trim = rect.right() - free_rect.left() + 1;
   237             result.push(free_rect.with_margins(-trim, 0, 0, 0))
   231             output.push(free_rect.with_margins(-trim, 0, 0, 0))
   238         }
   232         }
   239         if rect.top() > free_rect.top() {
   233         if rect.top() > free_rect.top() {
   240             let trim = free_rect.bottom() - rect.top() + 1;
   234             let trim = free_rect.bottom() - rect.top() + 1;
   241             result.push(free_rect.with_margins(0, 0, 0, -trim));
   235             output.push(free_rect.with_margins(0, 0, 0, -trim));
   242         }
   236         }
   243         if rect.bottom() < free_rect.bottom() {
   237         if rect.bottom() < free_rect.bottom() {
   244             let trim = rect.bottom() - free_rect.top() + 1;
   238             let trim = rect.bottom() - free_rect.top() + 1;
   245             result.push(free_rect.with_margins(0, 0, -trim, 0));
   239             output.push(free_rect.with_margins(0, 0, -trim, 0));
   246         }
   240         }
   247     }
   241     }
   248     result
   242     split
   249 }
   243 }
   250 
   244 
   251 #[cfg(test)]
   245 #[cfg(test)]
   252 mod tests {
   246 mod tests {
   253     use super::Atlas;
   247     use super::Atlas;