Used to keep around all visible (or nearly visible) objects in a scene.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1741 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -0,0 +1,132 @@
|
|||||||
|
//
|
||||||
|
// $Id: ObjectSet.java,v 1.1 2002/09/23 21:53:23 mdb Exp $
|
||||||
|
|
||||||
|
package com.threerings.miso.scene.util;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
import com.samskivert.util.ArrayUtil;
|
||||||
|
import com.samskivert.util.ListUtil;
|
||||||
|
|
||||||
|
import com.threerings.miso.scene.SceneObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to store an (arbitrarily) ordered, low-impact iteratable (doesn't
|
||||||
|
* require object creation), set of {@link SceneObject} instances.
|
||||||
|
*/
|
||||||
|
public class ObjectSet
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Inserts the supplied scene object into the set.
|
||||||
|
*
|
||||||
|
* @return true if it was inserted, false if the object was already in
|
||||||
|
* the set.
|
||||||
|
*/
|
||||||
|
public boolean insert (SceneObject scobj)
|
||||||
|
{
|
||||||
|
// bail if it's already in the set
|
||||||
|
int ipos = indexOf(scobj);
|
||||||
|
if (ipos >= 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise insert it
|
||||||
|
ipos = -(ipos+1);
|
||||||
|
_scobjs = ListUtil.insert(_scobjs, ipos, scobj);
|
||||||
|
_size++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the specified object is in the set, false if it is
|
||||||
|
* not.
|
||||||
|
*/
|
||||||
|
public boolean contains (SceneObject scobj)
|
||||||
|
{
|
||||||
|
return (indexOf(scobj) >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of scene objects in this set.
|
||||||
|
*/
|
||||||
|
public int size ()
|
||||||
|
{
|
||||||
|
return _size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the scene object with the specified index. The index must &
|
||||||
|
* be between <code>0</code> and {@link #size}<code>-1</code>.
|
||||||
|
*/
|
||||||
|
public SceneObject get (int index)
|
||||||
|
{
|
||||||
|
return (SceneObject)_scobjs[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the object at the specified index.
|
||||||
|
*/
|
||||||
|
public void remove (int index)
|
||||||
|
{
|
||||||
|
ListUtil.remove(_scobjs, index);
|
||||||
|
_size--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the specified scene object from the set.
|
||||||
|
*
|
||||||
|
* @return true if it was removed, false if it was not in the set.
|
||||||
|
*/
|
||||||
|
public boolean remove (SceneObject scobj)
|
||||||
|
{
|
||||||
|
int opos = indexOf(scobj);
|
||||||
|
if (opos >= 0) {
|
||||||
|
remove(opos);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears out the contents of this set.
|
||||||
|
*/
|
||||||
|
public void clear ()
|
||||||
|
{
|
||||||
|
_size = 0;
|
||||||
|
Arrays.fill(_scobjs, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the index of the object or it's insertion index if it is
|
||||||
|
* not in the set.
|
||||||
|
*/
|
||||||
|
protected final int indexOf (SceneObject scobj)
|
||||||
|
{
|
||||||
|
return ArrayUtil.binarySearch(_scobjs, 0, _size, scobj, SCOBJ_COMP);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Our sorted array of scene objects. */
|
||||||
|
protected Object[] _scobjs = new Object[DEFAULT_SIZE];
|
||||||
|
|
||||||
|
/** The number of objects in the set. */
|
||||||
|
protected int _size;
|
||||||
|
|
||||||
|
/** We simply sort the scene objects in order of their hash code. We
|
||||||
|
* don't care about their orderer, it simply needs to exist to support
|
||||||
|
* binary search. */
|
||||||
|
protected static final Comparator SCOBJ_COMP = new Comparator() {
|
||||||
|
public int compare (Object o1, Object o2) {
|
||||||
|
return o1.hashCode() - o2.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals (Object other) {
|
||||||
|
return this == other;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** We start big because we know these will in general contain at
|
||||||
|
* least in the tens of objects. */
|
||||||
|
protected static final int DEFAULT_SIZE = 16;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user