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(); } }