package worldData;
import gl.GLCamera;
import gl.HasPosition;
import javax.microedition.khronos.opengles.GL10;
import util.EfficientList;
import util.QuadTree;
import util.QuadTree.ResultListener;
import util.Vec;
/**
* Use {@link RenderQuadList} instead!
*
* @author Spobo
*
*/
@Deprecated
public class LargeWorld extends World {
private float myRenderDistance;
private float myRecalcDistanceMin;
private float myRecalcDistanceMax;
private QuadTree<RenderableEntity> tree;
@SuppressWarnings("rawtypes")
private ResultListener itemsListener;
private volatile EfficientList<RenderableEntity> itemsInRange;
private float oldX;
private float oldY;
public LargeWorld(GLCamera glCamera, float renderDistance,
float recalcDistance) {
super(glCamera);
myRenderDistance = renderDistance;
myRecalcDistanceMin = -recalcDistance;
myRecalcDistanceMax = recalcDistance;
tree = new QuadTree<RenderableEntity>();
itemsListener = tree.new ResultListener() {
@Override
public void onResult(RenderableEntity myValue) {
itemsInRange.add(myValue);
}
};
}
public EfficientList<RenderableEntity> getItems(Vec position,
float maxDistance) {
final EfficientList<RenderableEntity> result = new EfficientList<RenderableEntity>();
tree.findInArea(tree.new ResultListener() {
@Override
public void onResult(RenderableEntity myValue) {
result.add(myValue);
}
}, position.x, position.y, maxDistance);
return result;
}
@Override
public boolean add(RenderableEntity x) {
boolean result = super.add(x);
if (result && x instanceof HasPosition)
return add((HasPosition) x);
return result;
}
private boolean add(HasPosition x) {
Vec pos = x.getPosition();
if (pos != null) {
if (x instanceof RenderableEntity) {
tree.add(pos.x, pos.y, (RenderableEntity) x);
return true;
}
}
return false;
}
@Override
public boolean remove(RenderableEntity x) {
boolean result = super.remove(x);
if (tree.remove(x))
return true;
return result;
}
/**
* The current internal tree will be deleted and recreated. This is
* expensive so do not call this too often!
*/
public void rebuildTree() {
final EfficientList<RenderableEntity> list = new EfficientList<RenderableEntity>();
tree.getAllItems(tree.new ResultListener() {
@Override
public void onResult(RenderableEntity myValue) {
list.add(myValue);
}
});
tree.clear();
for (int i = 0; i < list.myLength; i++) {
this.add(list.get(i));
}
}
@Override
public void drawElements(GLCamera camera, GL10 gl) {
EfficientList<RenderableEntity> list = getList(camera.getPosition().x,
camera.getPosition().y);
for (int i = 0; i < list.myLength; i++) {
RenderableEntity obj = list.get(i);
if (obj != null)
obj.render(gl, this);
}
// super.drawElements(camera, gl, stack);
}
@Override
public boolean update(float timeDelta, Updateable parent) {
EfficientList<RenderableEntity> list = getList(getMyCamera()
.getPosition().x, getMyCamera().getPosition().y);
for (int i = 0; i < list.myLength; i++) {
RenderableEntity obj = list.get(i);
if (obj != null)
obj.update(timeDelta, this);
}
return true;
}
@SuppressWarnings("unchecked")
private synchronized EfficientList<RenderableEntity> getList(float x,
float y) {
if (itemsInRange != null
&& needsNoRecalculation(x - oldX, myRecalcDistanceMin,
myRecalcDistanceMax)
&& needsNoRecalculation(y - oldY, myRecalcDistanceMin,
myRecalcDistanceMax)) {
return itemsInRange;
} else {
if (itemsInRange == null)
itemsInRange = new EfficientList<RenderableEntity>();
else
itemsInRange.clear();
oldX = x;
oldY = y;
tree.findInArea(itemsListener, x, y, myRenderDistance);
return itemsInRange;
}
}
private boolean needsNoRecalculation(float v, float min, float max) {
return (min < v) && (v < max);
}
}