package actions;
import gl.GLCamRotationController;
import gl.GLUtilityClass;
import util.Calculus;
import actions.algos.Algo;
import actions.algos.BufferAlgo1;
import actions.algos.SensorAlgo1;
import android.hardware.SensorManager;
import android.view.MotionEvent;
/**
* This is nearly the same like {@link ActionRotateCameraBuffered} (same values)
* but without buffering in the update thread. This class is just for testing so
* it is depricated and might be removed soon.
*
* @author Spobo
*
*/
@Deprecated
public class ActionRotateCameraBufferedDirect extends Action {
private GLCamRotationController myTargetCamera;
public Algo magnetAlgo;
public Algo accelAlgo;
public Algo orientAlgo;
public Algo accelBufferAlgo;
public Algo magnetBufferAlgo;
public Algo orientationBufferAlgo;
private float[] myAccelValues = new float[3];
private float[] myMagnetValues = new float[3];
private float[] myOrientValues = new float[3];
private boolean accelChanged;
private float[] myNewAccelValues;
private boolean magnetoChanged;
private float[] myNewMagnetValues;
private boolean orientationDataChanged;
private float[] myNewOrientValues;
private float[] unrotatedMatrix = Calculus.createIdentityMatrix();
private float[] rotationMatrix = Calculus.createIdentityMatrix();
private float timeDelta;
public ActionRotateCameraBufferedDirect(GLCamRotationController targetCamera) {
myTargetCamera = targetCamera;
accelAlgo = new SensorAlgo1(0.1f);
magnetAlgo = new SensorAlgo1(1.4f);
orientAlgo = new SensorAlgo1(0.005f);// TODO find correct values
accelBufferAlgo = new BufferAlgo1(0.1f, 4f);
magnetBufferAlgo = new BufferAlgo1(0.1f, 4f);
timeDelta = 0.02f;
}
@Override
public boolean onTouchMove(MotionEvent e1, MotionEvent e2,
float screenDeltaX, float screenDeltaY) {
myTargetCamera.changeZAngleBuffered(screenDeltaY);
return true;
}
@Override
public synchronized boolean onAccelChanged(float[] values) {
if (accelAlgo != null)
myNewAccelValues = accelAlgo.execute(values);
else
myNewAccelValues = values;
accelChanged = true;
calc();
return true;
}
@Override
public synchronized boolean onMagnetChanged(float[] values) {
if (magnetAlgo != null)
myNewMagnetValues = magnetAlgo.execute(values);
else
myNewMagnetValues = values;
magnetoChanged = true;
calc();
return true;
}
@Override
public synchronized boolean onOrientationChanged(float[] values) {
if (orientAlgo != null)
myNewOrientValues = orientAlgo.execute(values);
else
myNewOrientValues = values;
orientationDataChanged = true;
calc();
return true;
}
private void calc() {
if (magnetoChanged || accelChanged || orientationDataChanged) {
if (magnetoChanged || accelChanged) {
// if accel or magnet changed:
if (accelChanged) {
accelChanged = false;
if (accelBufferAlgo != null)
accelBufferAlgo.execute(myAccelValues,
myNewAccelValues, timeDelta);
else
myAccelValues = myNewAccelValues;
}
if (magnetoChanged) {
magnetoChanged = false;
if (magnetBufferAlgo != null)
magnetBufferAlgo.execute(myMagnetValues,
myNewMagnetValues, timeDelta);
else
myMagnetValues = myNewMagnetValues;
}
// first calc the unrotated matrix:
SensorManager.getRotationMatrix(unrotatedMatrix, null,
myAccelValues, myMagnetValues);
} else if (orientationDataChanged) {
orientationDataChanged = false;
if (orientationBufferAlgo != null)
orientationBufferAlgo.execute(myOrientValues,
myNewOrientValues, timeDelta);
else
myOrientValues = myNewOrientValues;
GLUtilityClass.getRotationMatrixFromVector(unrotatedMatrix,
myOrientValues);
}
// then rotate it according to the screen rotation:
SensorManager.remapCoordinateSystem(unrotatedMatrix,
SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X,
rotationMatrix);
myTargetCamera.setRotationMatrix(rotationMatrix, 0);
}
}
@Override
public boolean onReleaseTouchMove() {
myTargetCamera.resetBufferedAngle();
return true;
}
}