package com.javamarcher.ecs.component;
import org.joml.Matrix4f;
import org.joml.Quaternionf;
import org.joml.Vector3f;
import at.fhooe.mtd.ecs.Component;
public class Transform extends Component implements Transformation {
public Vector3f position = new Vector3f(0, 0, 0);
public Vector3f rotation = new Vector3f(0, 0, 0);
public Vector3f scale = new Vector3f(1, 1, 1);
public Vector3f forward = new Vector3f(0, 0, 1);
public Vector3f right = new Vector3f(1, 0, 0);
public Vector3f up = new Vector3f(0, 1, 0);
private final Matrix4f model = new Matrix4f();
private Matrix4f rotationMatrix = new Matrix4f();
private Quaternionf rotationQuaternion = new Quaternionf();
public Transform() {
model.identity();
rotationMatrix.identity();
rotationQuaternion.identity();
}
@Override
public void translate(final Vector3f translation) {
position.add(translation);
}
@Override
public void rotate(final float angleDegree, final Vector3f axis) {
setRotation(rotation.x + axis.x * angleDegree, rotation.y + axis.y * angleDegree, rotation.z + axis.z * angleDegree);
}
@Override
public void setSpecificRotation(final float angleDegree, final Vector3f axis) {
setRotation(axis.x * angleDegree, axis.y * angleDegree, axis.z * angleDegree);
}
@Override
public Matrix4f getModelMatrix() {
model.identity();
rotationMatrix.set(rotationQuaternion);
model.translate(position).mul(rotationMatrix).scale(scale); // Order?
return model;
}
private void setRotation(float x, float y, float z) {
rotation.set(x, y, z);
rotationMatrix.identity();
rotationQuaternion.identity();
rotationQuaternion.rotate((float) Math.toRadians(rotation.x),(float) Math.toRadians(rotation.y),(float) Math.toRadians(rotation.z));
rotationQuaternion.transform(LOCAL_FORWARD.x, LOCAL_FORWARD.y, LOCAL_FORWARD.z, forward); forward.normalize();
rotationQuaternion.transform(LOCAL_UP.x, LOCAL_UP.y, LOCAL_UP.z, up); up.normalize();
rotationQuaternion.transform(LOCAL_RIGHT.x, LOCAL_RIGHT.y, LOCAL_RIGHT.z, right); right.normalize();
}
}