188 lines
5.9 KiB
Java
188 lines
5.9 KiB
Java
package electrosphere.renderer;
|
|
|
|
import electrosphere.main.Globals;
|
|
import electrosphere.renderer.anim.Animation;
|
|
import electrosphere.renderer.texture.Texture;
|
|
import org.joml.AxisAngle4f;
|
|
import org.joml.Matrix4f;
|
|
import org.joml.Quaternionf;
|
|
import org.joml.Vector3f;
|
|
import org.joml.Vector4f;
|
|
|
|
/**
|
|
*
|
|
* @author amaterasu
|
|
*/
|
|
public class Actor {
|
|
String modelPath;
|
|
String textureOverride;
|
|
String animation;
|
|
double animationTime;
|
|
boolean playingAnimation;
|
|
float animationScalar = 1.0f;
|
|
|
|
public Actor(String modelPath){
|
|
playingAnimation = false;
|
|
this.modelPath = modelPath;
|
|
}
|
|
|
|
public void incrementAnimationTime(double deltaTime){
|
|
Model model = Globals.assetManager.fetchModel(modelPath);
|
|
if(playingAnimation){
|
|
animationTime = animationTime + deltaTime * animationScalar;
|
|
}
|
|
if(model != null){
|
|
if(animation != null){
|
|
model.playAnimation(animation);
|
|
model.incrementTime(animationTime);
|
|
if(model.currentAnimation == null){
|
|
playingAnimation = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public double getAnimationTime(){
|
|
return animationTime;
|
|
}
|
|
|
|
public String getCurrentAnimation(){
|
|
return animation;
|
|
}
|
|
|
|
public void playAnimation(String animationName){
|
|
animationTime = 0;
|
|
playingAnimation = true;
|
|
animation = animationName;
|
|
}
|
|
|
|
public boolean isPlayingAnimation(){
|
|
return playingAnimation;
|
|
}
|
|
|
|
public void setAnimationScalar(float animationScalar) {
|
|
this.animationScalar = animationScalar;
|
|
}
|
|
|
|
public void applyModelMatrix(Matrix4f modelMatrix){
|
|
Model model = Globals.assetManager.fetchModel(modelPath);
|
|
if(model != null){
|
|
model.modelMatrix = modelMatrix;
|
|
}
|
|
}
|
|
|
|
public void draw(){
|
|
Model model = Globals.assetManager.fetchModel(modelPath);
|
|
boolean hasDrawn = false;
|
|
if(model != null){
|
|
if(animation != null){
|
|
model.playAnimation(animation);
|
|
model.incrementTime(0.001);
|
|
model.incrementTime(animationTime);
|
|
if(model.currentAnimation == null){
|
|
playingAnimation = false;
|
|
}
|
|
}
|
|
if(textureOverride != null){
|
|
Texture overrideTextureObject = Globals.assetManager.fetchTexture(textureOverride);
|
|
if(overrideTextureObject != null){
|
|
overrideTextureObject.bind();
|
|
hasDrawn = true;
|
|
model.draw(true, true, false, false, true, true, true);
|
|
}
|
|
}
|
|
if(!hasDrawn){
|
|
model.draw(true, true, false, true, true, true, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void drawForDepthBuffer(){
|
|
Model model = Globals.assetManager.fetchModel(modelPath);
|
|
if(model != null){
|
|
if(animation != null){
|
|
model.playAnimation(animation);
|
|
model.incrementTime(animationTime);
|
|
if(model.currentAnimation == null){
|
|
playingAnimation = false;
|
|
}
|
|
}
|
|
model.drawForDepthBuffer();
|
|
}
|
|
}
|
|
|
|
public void drawUI(){
|
|
Model model = Globals.assetManager.fetchModel(modelPath);
|
|
if(model != null){
|
|
model.drawUI();
|
|
}
|
|
}
|
|
|
|
public String getModelPath(){
|
|
return modelPath;
|
|
}
|
|
|
|
public Vector3f getBonePosition(String boneName){
|
|
Vector3f rVal = new Vector3f();
|
|
Model model = Globals.assetManager.fetchModel(modelPath);
|
|
if(model != null){
|
|
if(animation != null){
|
|
model.playAnimation(animation);
|
|
model.incrementTime(animationTime);
|
|
model.update_node_transform(model.root_anim_node);
|
|
Bone currentBone = model.boneMap.get(boneName);
|
|
if(currentBone != null){
|
|
Vector4f result = currentBone.final_transform.transform(new Matrix4f(currentBone.inverseBindPoseMatrix).invert().transform(new Vector4f(rVal.x,rVal.y,rVal.z,1)));
|
|
// currentBone.inverseBindPoseMatrix
|
|
rVal.x = result.x;
|
|
rVal.y = result.y;
|
|
rVal.z = result.z;
|
|
}
|
|
}
|
|
}
|
|
return rVal;
|
|
}
|
|
|
|
public Quaternionf getBoneRotation(String boneName){
|
|
Quaternionf rVal = new Quaternionf();
|
|
Model model = Globals.assetManager.fetchModel(modelPath);
|
|
if(model != null){
|
|
if(animation != null){
|
|
model.playAnimation(animation);
|
|
model.incrementTime(animationTime);
|
|
Bone currentBone = model.boneMap.get(boneName);
|
|
if(currentBone != null){
|
|
AxisAngle4f axisAngle = new AxisAngle4f();
|
|
currentBone.final_transform.getRotation(axisAngle);
|
|
Quaternionf rotation = new Quaternionf(axisAngle);
|
|
rVal.set(rotation);
|
|
}
|
|
}
|
|
}
|
|
return rVal;
|
|
}
|
|
|
|
public Matrix4f getBoneTransform(String boneName){
|
|
Matrix4f rVal = new Matrix4f();
|
|
Model model = Globals.assetManager.fetchModel(modelPath);
|
|
if(model != null){
|
|
if(animation != null){
|
|
model.playAnimation(animation);
|
|
model.incrementTime(animationTime);
|
|
model.update_node_transform(model.root_anim_node);
|
|
Bone currentBone = model.boneMap.get(boneName);
|
|
if(currentBone != null){
|
|
rVal = currentBone.final_transform;
|
|
// currentBone.inverseBindPoseMatrix
|
|
}
|
|
}
|
|
}
|
|
return rVal;
|
|
}
|
|
|
|
public void setTextureOverride(String override){
|
|
textureOverride = override;
|
|
}
|
|
|
|
}
|