package system; import geo.GeoObj; import gl.CustomGLSurfaceView; import gl.GL1Renderer; import gl.GLCamera; import gl.GLFactory; import gui.GuiSetup; import util.Log; import util.Vec; import worldData.SystemUpdater; import worldData.World; import actions.Action; import actions.ActionCalcRelativePos; import actions.ActionMoveCameraBuffered; import actions.ActionRotateCameraBuffered; import actions.ActionWASDMovement; import actions.ActionWaitForAccuracy; import android.R; import android.app.Activity; import android.location.Location; import commands.Command; /** * This is an example how you can use the default setup: <br> * <code> * ArActivity.startWithSetup(currentActicity, new DefaultARSetup() { <br> * public void addObjectsTo(World world, GLFactory factory) { <br> * GeoObj obj = new GeoObj();<br> * obj.setComp(factory.newCube()); world.add(obj); <br> * obj.setVirtualPosition(new Vec()); <br> * } <br> * }); * <code> * * @author Spobo * */ public abstract class DefaultARSetup extends Setup { protected static final int ZDELTA = 5; private static final String LOG_TAG = "DefaultARSetup"; public GLCamera camera; public World world; private ActionWASDMovement wasdAction; private GL1Renderer myRenderer; private boolean addObjCalledOneTieme; private ActionWaitForAccuracy minAccuracyAction; private Action rotateGLCameraAction; public DefaultARSetup() { } @Override public void _a_initFieldsIfNecessary() { camera = new GLCamera(new Vec(0, 0, 2)); world = new World(camera); } public World getWorld() { return world; } public GLCamera getCamera() { return camera; } /** * This will be called when the GPS accuracy is high enough * * @param renderer * @param world * @param objectFactory */ public abstract void addObjectsTo(GL1Renderer renderer, World world, GLFactory objectFactory); @Override public void _b_addWorldsToRenderer(GL1Renderer renderer, GLFactory objectFactory, GeoObj currentPosition) { myRenderer = renderer; renderer.addRenderElement(world); } @Override public void _c_addActionsToEvents(final EventManager eventManager, CustomGLSurfaceView arView, SystemUpdater updater) { wasdAction = new ActionWASDMovement(camera, 25, 50, 20); rotateGLCameraAction = new ActionRotateCameraBuffered(camera); eventManager.addOnOrientationChangedAction(rotateGLCameraAction); arView.addOnTouchMoveListener(wasdAction); // eventManager.addOnOrientationChangedAction(rotateGLCameraAction); eventManager.addOnTrackballAction(new ActionMoveCameraBuffered(camera, 5, 25)); eventManager.addOnLocationChangedAction(new ActionCalcRelativePos( world, camera)); minAccuracyAction = new ActionWaitForAccuracy(getActivity(), 24.0f, 10) { @Override public void minAccuracyReachedFirstTime(Location l, ActionWaitForAccuracy a) { callAddObjectsToWorldIfNotCalledAlready(); if (!eventManager.getOnLocationChangedAction().remove(a)) { Log.e(LOG_TAG, "Could not remove minAccuracyAction from the onLocationChangedAction list"); } } }; eventManager.addOnLocationChangedAction(minAccuracyAction); } protected void callAddObjectsToWorldIfNotCalledAlready() { if (!addObjCalledOneTieme) { addObjectsTo(myRenderer, world, GLFactory.getInstance()); } else { Log.w(LOG_TAG, "callAddObjectsToWorldIfNotCalledAlready() " + "called more then one time!"); } addObjCalledOneTieme = true; } @Override public void _d_addElementsToUpdateThread(SystemUpdater updater) { updater.addObjectToUpdateCycle(world); updater.addObjectToUpdateCycle(wasdAction); updater.addObjectToUpdateCycle(rotateGLCameraAction); } @Override public void _e2_addElementsToGuiSetup(GuiSetup guiSetup, Activity activity) { guiSetup.setRightViewAllignBottom(); guiSetup.addViewToTop(minAccuracyAction.getView()); guiSetup.addImangeButtonToRightView(R.drawable.arrow_up_float, new Command() { @Override public boolean execute() { camera.changeZPositionBuffered(+ZDELTA); return false; } }); guiSetup.addImangeButtonToRightView(R.drawable.arrow_down_float, new Command() { @Override public boolean execute() { camera.changeZPositionBuffered(-ZDELTA); return false; } }); } }