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