package de.rwth.setups;
import gl.Color;
import gl.CustomGLSurfaceView;
import gl.GL1Renderer;
import gl.GLFactory;
import gl.LightSource;
import gl.animations.AnimationRotate;
import gl.scenegraph.MeshComponent;
import gl.scenegraph.Shape;
import gui.GuiSetup;
import java.util.ArrayList;
import javax.microedition.khronos.opengles.GL10;
import system.DefaultARSetup;
import system.EventManager;
import util.Vec;
import util.Wrapper;
import worldData.Entity;
import worldData.MoveComp;
import worldData.Obj;
import worldData.SystemUpdater;
import worldData.World;
import actions.ActionMoveObject;
import android.app.Activity;
import android.util.Log;
import commands.Command;
public class LightningSetup extends DefaultARSetup {
protected static final String LOG_TAG = "LightningSetup";
private static float zMoveFactor = 1f;
private final Wrapper targetMoveWrapper;
private LightSource spotLight;
private final Obj lightObject;
public LightningSetup() {
super();
lightObject = new Obj();
targetMoveWrapper = new Wrapper(lightObject);
}
@Override
public boolean _a2_initLightning(ArrayList<LightSource> lights) {
lights.add(LightSource.newDefaultAmbientLight(GL10.GL_LIGHT0));
spotLight = LightSource.newDefaultDefuseLight(GL10.GL_LIGHT1, new Vec(
0, 0, 0));
lights.add(spotLight);
return true;
}
@Override
public void addObjectsTo(GL1Renderer renderer, World world,
GLFactory objectFactory) {
addNewObjToWorld(world, objectFactory);
MeshComponent innerGroup = new Shape();
innerGroup.addChild(spotLight);
innerGroup.addChild(objectFactory.newCircle(Color.red()));
innerGroup.setPosition(new Vec(0, 3, 0));
MeshComponent outerGroup = new Shape();
outerGroup.addAnimation(new AnimationRotate(30, new Vec(0, 0, 1)));
outerGroup.addChild(innerGroup);
outerGroup.addChild(objectFactory.newCircle(Color.blue()));
spotLight.setOnClickCommand(new Command() {
@Override
public boolean execute() {
targetMoveWrapper.setTo(lightObject);
return true;
}
});
lightObject.setComp(outerGroup);
lightObject.setComp(new MoveComp(1));
world.add(lightObject);
}
private void addNewObjToWorld(World world, GLFactory objectFactory) {
final Obj o = new Obj();
MeshComponent mesh = objectFactory.newCube();
// mesh = newCube();
mesh = objectFactory.newDiamond(Color.red());
mesh.setScale(new Vec(2, 3, 1));
mesh.addChild(new AnimationRotate(30, new Vec(0, 0, -1)));
o.setComp(mesh);
o.setOnClickCommand(new Command() {
@Override
public boolean execute() {
targetMoveWrapper.setTo(o);
return true;
}
});
o.setComp(new MoveComp(1));
world.add(o);
world.add(o);
}
private Entity newCube() {
Shape s = new Shape();
s.add(new Vec());
s.add(new Vec(2, 2, 0));
s.add(new Vec(2, 4, 0));
s.add(new Vec());
s.add(new Vec(2, 4, 0));
s.add(new Vec(2, 10, 0));
return s;
}
@Override
public void _c_addActionsToEvents(EventManager eventManager,
CustomGLSurfaceView arView, SystemUpdater updater) {
super._c_addActionsToEvents(eventManager, arView, updater);
// clear some inputs set in default methods
eventManager.getOnLocationChangedAction().clear();
eventManager.getOnTrackballEventAction().clear();
eventManager.addOnTrackballAction(new ActionMoveObject(
targetMoveWrapper, getCamera(), 10, 100));
}
@Override
public void _e2_addElementsToGuiSetup(GuiSetup guiSetup, Activity activity) {
super._e2_addElementsToGuiSetup(guiSetup, activity);
guiSetup.addButtonToBottomView(new Command() {
@Override
public boolean execute() {
if (targetMoveWrapper.getObject() instanceof Obj) {
MoveComp mover = ((Obj) targetMoveWrapper.getObject())
.getComp(MoveComp.class);
if (mover != null) {
mover.myTargetPos.z -= zMoveFactor;
} else {
Vec pos = ((Obj) targetMoveWrapper.getObject())
.getPosition();
if (pos != null) {
pos.z -= zMoveFactor;
} else {
Log.e(LOG_TAG, "Cant move object, has no position!");
}
}
return true;
}
return false;
}
}, "Obj Down");
guiSetup.addButtonToBottomView(new Command() {
@Override
public boolean execute() {
if (targetMoveWrapper.getObject() instanceof Obj) {
MoveComp mover = ((Obj) targetMoveWrapper.getObject())
.getComp(MoveComp.class);
if (mover != null) {
mover.myTargetPos.z += zMoveFactor;
} else {
Vec pos = ((Obj) targetMoveWrapper.getObject())
.getPosition();
if (pos != null) {
pos.z += zMoveFactor;
} else {
Log.e(LOG_TAG, "Cant move object, has no position!");
}
}
return true;
}
return false;
}
}, "Obj up");
}
}