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
33package com.jme3.collision;
34
35import java.util.ArrayList;
36import java.util.Collections;
37import 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 */
45public 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