// Path: holokilo/src/main/java/net/kajos/holokilo/Orientation/Tracker.java
// public abstract class Tracker {
//     protected Matrix3x3 initial = new Matrix3x3();
// 
//     protected Matrix3x3 flip = new Matrix3x3();
// 
//     protected Matrix3x3 tmp = new Matrix3x3();
//     protected Matrix3x3 tmp2 = new Matrix3x3();
//     protected Matrix3x3 tmp3 = new Matrix3x3();
// 
//     private Matrix3x3 base = new Matrix3x3();
// 
//     public abstract void init();
// 
//     public void setBaseRotation() {
//         getLastHeadView(base);
//     }
// 
//     public void getCorrectedHeadView(Matrix3x3 headView, Matrix3x3 headViewRaw) {
//         getLastHeadView(tmp2);
//         headViewRaw.set(tmp2);
//         tmp2.transpose();
//         Matrix3x3.mult(base, tmp2, tmp3);
//         Matrix3x3.mult(tmp3, initial, tmp);
//         headView.set(tmp);
//     }
// 
//     public Matrix3x3 differenceHeadView(Matrix3x3 a, Matrix3x3 b) {
//         a.invert(tmp);
//         tmp2.set(b);
//         Matrix3x3.mult(tmp, tmp2, tmp3);
//         return tmp3;
//     }
// 
//     public abstract void getLastHeadView(Matrix3x3 headView);
// 
//     public abstract void stopTracking() ;
//     public abstract void startTracking();
// }
// 
// Path: holokilo/src/main/java/net/kajos/holokilo/Orientation/Trackers/DummyTracker.java
// public class DummyTracker extends Tracker {
//     @Override
//     public void init() {
// 
//     }
// 
//     @Override
//     public void getLastHeadView(Matrix3x3 headView) {
//         headView.setIdentity();
//     }
// 
//     @Override
//     public void stopTracking() {
// 
//     }
// 
//     @Override
//     public void startTracking() {
// 
//     }
// }
// 
// Path: holokilo/src/main/java/net/kajos/holokilo/Orientation/Trackers/GoogleHeadTracker.java
// public class GoogleHeadTracker extends Tracker
// {
//     // Tracker that wraps around Google Cardboard's headtracker.
// 
//     private HeadTracker headTracker;
//     private LowPassFilter[] filters = new LowPassFilter[16];
// 
//     public GoogleHeadTracker(SensorEventProvider sensorEventProvider, Clock clock, Display display) {
//         headTracker = new HeadTracker(sensorEventProvider, clock, display);
//         for (int i = 0; i < 16; i++) {
//             filters[i] = new LowPassFilter(Config.LP_FOR_GYRO);
//         }
//     }
// 
//     public static GoogleHeadTracker createFromContext(Context context) {
//         SensorManager sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
//         Display display = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
//         GoogleHeadTracker result = new GoogleHeadTracker(new DeviceSensorLooper(sensorManager), new SystemClock(), display);
//         result.init();
//         return result;
//     }
// 
//     public void init() {
//         tmp.setToRotation(new Vector3(1, 0, 0), -90);
//         flip = new Matrix3x3(1,0,0, 0,-1,0, 0,0,1);
//         Matrix3x3.mult(tmp, flip, initial);
//     }
// 
//     float matrix[] = new float[16];
//     public void getLastHeadView(Matrix3x3 headView) {
//         headTracker.getLastHeadView(matrix, 0);
//         for (int i = 0; i < 16; i++) {
//             matrix[i] = filters[i].get(matrix[i]);
//         }
//         for (int c = 0; c < 3; c++)
//             for (int r = 0; r < 3; r++) {
//                 headView.set(r, c, matrix[c * 4 + r]);
//             }
//     }
// 
//     @Override
//     public void stopTracking() {
//         headTracker.stopTracking();
//     }
// 
//     @Override
//     public void startTracking() {
//         headTracker.startTracking();
//     }
// }


import android.content.Context;
import android.view.MotionEvent;
import net.kajos.holokilo.Orientation.Tracker;
import net.kajos.holokilo.Orientation.Trackers.DummyTracker;
import net.kajos.holokilo.Orientation.Trackers.GoogleHeadTracker;
package net.kajos.holokilo;


public class GLSurfaceView extends android.opengl.GLSurfaceView
{
    public GLRenderer renderer = null;

    public GLSurfaceView(Context context, Tracker tracker)
    {
        super(context);

        setEGLContextClientVersion(2);

        renderer = new GLRenderer(this, tracker);
        setRenderer(renderer);
        setRenderMode(Config.RENDER_WHEN_DIRTY ? android.opengl.GLSurfaceView.RENDERMODE_WHEN_DIRTY :  android.opengl.GLSurfaceView.RENDERMODE_CONTINUOUSLY);
    }

    public GLSurfaceView(Context context)
    {
        super(context);

        setEGLContextClientVersion(2);

        // Initialize rotational tracker
        // Dummytracker for stationary use
        // Use Cardboardtracker for sensor fusion
// Path: holokilo/src/main/java/net/kajos/holokilo/Orientation/Tracker.java
// public abstract class Tracker {
//     protected Matrix3x3 initial = new Matrix3x3();
// 
//     protected Matrix3x3 flip = new Matrix3x3();
// 
//     protected Matrix3x3 tmp = new Matrix3x3();
//     protected Matrix3x3 tmp2 = new Matrix3x3();
//     protected Matrix3x3 tmp3 = new Matrix3x3();
// 
//     private Matrix3x3 base = new Matrix3x3();
// 
//     public abstract void init();
// 
//     public void setBaseRotation() {
//         getLastHeadView(base);
//     }
// 
//     public void getCorrectedHeadView(Matrix3x3 headView, Matrix3x3 headViewRaw) {
//         getLastHeadView(tmp2);
//         headViewRaw.set(tmp2);
//         tmp2.transpose();
//         Matrix3x3.mult(base, tmp2, tmp3);
//         Matrix3x3.mult(tmp3, initial, tmp);
//         headView.set(tmp);
//     }
// 
//     public Matrix3x3 differenceHeadView(Matrix3x3 a, Matrix3x3 b) {
//         a.invert(tmp);
//         tmp2.set(b);
//         Matrix3x3.mult(tmp, tmp2, tmp3);
//         return tmp3;
//     }
// 
//     public abstract void getLastHeadView(Matrix3x3 headView);
// 
//     public abstract void stopTracking() ;
//     public abstract void startTracking();
// }
// 
// Path: holokilo/src/main/java/net/kajos/holokilo/Orientation/Trackers/DummyTracker.java
// public class DummyTracker extends Tracker {
//     @Override
//     public void init() {
// 
//     }
// 
//     @Override
//     public void getLastHeadView(Matrix3x3 headView) {
//         headView.setIdentity();
//     }
// 
//     @Override
//     public void stopTracking() {
// 
//     }
// 
//     @Override
//     public void startTracking() {
// 
//     }
// }
// 
// Path: holokilo/src/main/java/net/kajos/holokilo/Orientation/Trackers/GoogleHeadTracker.java
// public class GoogleHeadTracker extends Tracker
// {
//     // Tracker that wraps around Google Cardboard's headtracker.
// 
//     private HeadTracker headTracker;
//     private LowPassFilter[] filters = new LowPassFilter[16];
// 
//     public GoogleHeadTracker(SensorEventProvider sensorEventProvider, Clock clock, Display display) {
//         headTracker = new HeadTracker(sensorEventProvider, clock, display);
//         for (int i = 0; i < 16; i++) {
//             filters[i] = new LowPassFilter(Config.LP_FOR_GYRO);
//         }
//     }
// 
//     public static GoogleHeadTracker createFromContext(Context context) {
//         SensorManager sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
//         Display display = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
//         GoogleHeadTracker result = new GoogleHeadTracker(new DeviceSensorLooper(sensorManager), new SystemClock(), display);
//         result.init();
//         return result;
//     }
// 
//     public void init() {
//         tmp.setToRotation(new Vector3(1, 0, 0), -90);
//         flip = new Matrix3x3(1,0,0, 0,-1,0, 0,0,1);
//         Matrix3x3.mult(tmp, flip, initial);
//     }
// 
//     float matrix[] = new float[16];
//     public void getLastHeadView(Matrix3x3 headView) {
//         headTracker.getLastHeadView(matrix, 0);
//         for (int i = 0; i < 16; i++) {
//             matrix[i] = filters[i].get(matrix[i]);
//         }
//         for (int c = 0; c < 3; c++)
//             for (int r = 0; r < 3; r++) {
//                 headView.set(r, c, matrix[c * 4 + r]);
//             }
//     }
// 
//     @Override
//     public void stopTracking() {
//         headTracker.stopTracking();
//     }
// 
//     @Override
//     public void startTracking() {
//         headTracker.startTracking();
//     }
// }


// Path: holokilo/src/main/java/net/kajos/holokilo/GLSurfaceView.java
import android.content.Context;
import android.view.MotionEvent;
import net.kajos.holokilo.Orientation.Tracker;
import net.kajos.holokilo.Orientation.Trackers.DummyTracker;
import net.kajos.holokilo.Orientation.Trackers.GoogleHeadTracker;

package net.kajos.holokilo;


public class GLSurfaceView extends android.opengl.GLSurfaceView
{
    public GLRenderer renderer = null;

    public GLSurfaceView(Context context, Tracker tracker)
    {
        super(context);

        setEGLContextClientVersion(2);

        renderer = new GLRenderer(this, tracker);
        setRenderer(renderer);
        setRenderMode(Config.RENDER_WHEN_DIRTY ? android.opengl.GLSurfaceView.RENDERMODE_WHEN_DIRTY :  android.opengl.GLSurfaceView.RENDERMODE_CONTINUOUSLY);
    }

    public GLSurfaceView(Context context)
    {
        super(context);

        setEGLContextClientVersion(2);

        // Initialize rotational tracker
        // Dummytracker for stationary use
        // Use Cardboardtracker for sensor fusion
        Tracker tracker = Config.DUMMY_TRACKER ? new DummyTracker() : GoogleHeadTracker.createFromContext(context);