Home | History | Annotate | Download | only in collision
      1 /*
      2  * Copyright (c) 2009-2010 jMonkeyEngine
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are
      7  * met:
      8  *
      9  * * Redistributions of source code must retain the above copyright
     10  *   notice, this list of conditions and the following disclaimer.
     11  *
     12  * * Redistributions in binary form must reproduce the above copyright
     13  *   notice, this list of conditions and the following disclaimer in the
     14  *   documentation and/or other materials provided with the distribution.
     15  *
     16  * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
     17  *   may be used to endorse or promote products derived from this software
     18  *   without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 package com.jme3.collision;
     34 
     35 import java.util.ArrayList;
     36 import java.util.Collections;
     37 import java.util.Iterator;
     38 
     39 /**
     40  * <code>CollisionResults</code> is a collection returned as a result of a
     41  * collision detection operation done by {@link Collidable}.
     42  *
     43  * @author Kirill Vainer
     44  */
     45 public class CollisionResults implements Iterable<CollisionResult> {
     46 
     47     private final ArrayList<CollisionResult> results = new ArrayList<CollisionResult>();
     48     private boolean sorted = true;
     49 
     50     /**
     51      * Clears all collision results added to this list
     52      */
     53     public void clear(){
     54         results.clear();
     55     }
     56 
     57     /**
     58      * Iterator for iterating over the collision results.
     59      *
     60      * @return the iterator
     61      */
     62     public Iterator<CollisionResult> iterator() {
     63         if (!sorted){
     64             Collections.sort(results);
     65             sorted = true;
     66         }
     67 
     68         return results.iterator();
     69     }
     70 
     71     public void addCollision(CollisionResult result){
     72         results.add(result);
     73         sorted = false;
     74     }
     75 
     76     public int size(){
     77         return results.size();
     78     }
     79 
     80     public CollisionResult getClosestCollision(){
     81         if (size() == 0)
     82             return null;
     83 
     84         if (!sorted){
     85             Collections.sort(results);
     86             sorted = true;
     87         }
     88 
     89         return results.get(0);
     90     }
     91 
     92     public CollisionResult getFarthestCollision(){
     93         if (size() == 0)
     94             return null;
     95 
     96         if (!sorted){
     97             Collections.sort(results);
     98             sorted = true;
     99         }
    100 
    101         return results.get(size()-1);
    102     }
    103 
    104     public CollisionResult getCollision(int index){
    105         if (!sorted){
    106             Collections.sort(results);
    107             sorted = true;
    108         }
    109 
    110         return results.get(index);
    111     }
    112 
    113     /**
    114      * Internal use only.
    115      * @param index
    116      * @return
    117      */
    118     public CollisionResult getCollisionDirect(int index){
    119         return results.get(index);
    120     }
    121 
    122     @Override
    123     public String toString(){
    124         StringBuilder sb = new StringBuilder();
    125         sb.append("CollisionResults[");
    126         for (CollisionResult result : results){
    127             sb.append(result).append(", ");
    128         }
    129         if (results.size() > 0)
    130             sb.setLength(sb.length()-2);
    131 
    132         sb.append("]");
    133         return sb.toString();
    134     }
    135 
    136 }
    137