package com.pandadev.eyecandy.graphics;
import org.lwjgl.util.vector.Matrix4f;
import org.lwjgl.util.vector.Vector3f;
import com.pandadev.eyecandy.MatrixStack;
public abstract class Camera {
private final Vector3f position = new Vector3f();
private final Vector3f target = new Vector3f(0f, 0f, -1f);
private final Vector3f up = new Vector3f(0f, 1f, 0f);
public abstract void update(float delta);
public void applyTransformations(){
Matrix4f viewMatrix = new Matrix4f();
Vector3f zAxis = getForward();
Vector3f xAxis = getRight();
Vector3f yAxis = getUp();
viewMatrix.m00 = xAxis.x;
viewMatrix.m10 = xAxis.y;
viewMatrix.m20 = xAxis.z;
viewMatrix.m01 = yAxis.x;
viewMatrix.m11 = yAxis.y;
viewMatrix.m21 = yAxis.z;
viewMatrix.m02 = zAxis.x;
viewMatrix.m12 = zAxis.y;
viewMatrix.m22 = zAxis.z;
viewMatrix.m03 = position.x;
viewMatrix.m13 = position.y;
viewMatrix.m23 = position.z;
MatrixStack.getViewMatrix().load(viewMatrix);
}
public Vector3f getForward(){
Vector3f forward = new Vector3f();
Vector3f.sub(position, target, forward);
forward.normalise();
return forward;
}
public Vector3f getBackward(){
Vector3f backward = getForward();
backward.negate();
return backward;
}
public Vector3f getRight(){
Vector3f right = new Vector3f();
Vector3f.cross(getForward(), up, right);
return right;
}
public Vector3f getLeft(){
Vector3f left = getRight();
left.negate();
return left;
}
public Vector3f getUp(){
Vector3f up = new Vector3f();
Vector3f.cross(getForward(), getRight(), up);
return up;
}
public Vector3f getDown(){
Vector3f down = getUp();
down.negate();
return down;
}
public Vector3f getPosition(){
return position;
}
public Vector3f getTarget(){
return target;
}
public void setPosition(Vector3f position){
this.position.set(position);
}
public void setTarget(Vector3f target){
this.target.set(target);
}
}