Renderer/src/main/java/electrosphere/util/math/MathBones.java
austin 9958a6c5d4
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
math class refactoring start
2024-08-01 21:46:19 -04:00

59 lines
1.9 KiB
Java

package electrosphere.util.math;
import org.joml.Quaterniond;
import org.joml.Vector3d;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.renderer.actor.Actor;
/**
* Math functions related to bones
*/
public class MathBones {
/**
* Gets the world position of a bone
* @param actorEntity The entity that has a bone
* @param boneName The name of the bone
*/
public static Vector3d getBoneWorldPosition(Entity actorEntity, String boneName){
Actor actor = EntityUtils.getActor(actorEntity);
Vector3d localPos = new Vector3d(actor.getBonePosition(boneName));
//transform bone space
Vector3d position = new Vector3d(localPos);
position = position.mul(EntityUtils.getScale(actorEntity));
position = position.rotate(new Quaterniond(EntityUtils.getRotation(actorEntity)));
//transform worldspace
position.add(new Vector3d(EntityUtils.getPosition(actorEntity)));
return position;
}
/**
* Gets the global rotation of the bone
* @param actorEntity The entity with the bone
* @param boneName The name of the bone
* @return The global rotation of the bone
*/
public static Quaterniond getBoneWorldRotation(Entity actorEntity, String boneName){
Actor actor = EntityUtils.getActor(actorEntity);
Quaterniond localRot = actor.getBoneRotation(boneName);
Vector3d facingAngle = CreatureUtils.getFacingVector(actorEntity);
if(facingAngle == null){
facingAngle = MathUtils.getOriginVector();
}
//calculate rotation of model
return new Quaterniond()
.rotationTo(MathUtils.getOriginVector(), new Vector3d(facingAngle.x,facingAngle.y,facingAngle.z))
.mul(localRot)
.normalize();
}
}