|
@@ -1,9 +1,11 @@
|
|
|
package com.jme3.scene.plugins.blender.helpers.v249;
|
|
|
|
|
|
+import java.nio.FloatBuffer;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.logging.Level;
|
|
|
|
|
|
import com.jme3.animation.Bone;
|
|
|
import com.jme3.animation.BoneAnimation;
|
|
@@ -12,8 +14,11 @@ import com.jme3.animation.Skeleton;
|
|
|
import com.jme3.math.FastMath;
|
|
|
import com.jme3.math.Quaternion;
|
|
|
import com.jme3.math.Vector3f;
|
|
|
+import com.jme3.scene.Geometry;
|
|
|
+import com.jme3.scene.Mesh;
|
|
|
import com.jme3.scene.Node;
|
|
|
import com.jme3.scene.Spatial;
|
|
|
+import com.jme3.scene.VertexBuffer.Type;
|
|
|
import com.jme3.scene.plugins.blender.data.Structure;
|
|
|
import com.jme3.scene.plugins.blender.exception.BlenderFileException;
|
|
|
import com.jme3.scene.plugins.blender.structures.AbstractInfluenceFunction;
|
|
@@ -23,8 +28,8 @@ import com.jme3.scene.plugins.blender.structures.ConstraintType;
|
|
|
import com.jme3.scene.plugins.blender.structures.Ipo;
|
|
|
import com.jme3.scene.plugins.blender.utils.AbstractBlenderHelper;
|
|
|
import com.jme3.scene.plugins.blender.utils.DataRepository;
|
|
|
+import com.jme3.scene.plugins.blender.utils.DataRepository.LoadedFeatureDataType;
|
|
|
import com.jme3.scene.plugins.blender.utils.Pointer;
|
|
|
-import java.util.logging.Level;
|
|
|
|
|
|
/**
|
|
|
* This class should be used for constraint calculations.
|
|
@@ -404,7 +409,6 @@ public class ConstraintHelper extends AbstractBlenderHelper {
|
|
|
|
|
|
//ROTLIMIT constraint
|
|
|
influenceFunctions[ConstraintType.CONSTRAINT_TYPE_ROTLIMIT.getConstraintId()] = new AbstractInfluenceFunction(ConstraintType.CONSTRAINT_TYPE_ROTLIMIT, dataRepository) {
|
|
|
-
|
|
|
@Override
|
|
|
public void affectAnimation(Skeleton skeleton, BoneAnimation boneAnimation, Constraint constraint) {
|
|
|
Structure constraintStructure = constraint.getData();
|
|
@@ -459,11 +463,57 @@ public class ConstraintHelper extends AbstractBlenderHelper {
|
|
|
|
|
|
//SHRINKWRAP constraint (TODO: to implement)
|
|
|
influenceFunctions[ConstraintType.CONSTRAINT_TYPE_SHRINKWRAP.getConstraintId()] = new AbstractInfluenceFunction(ConstraintType.CONSTRAINT_TYPE_SHRINKWRAP, dataRepository) {
|
|
|
+ @Override
|
|
|
+ public void affectAnimation(Skeleton skeleton, BoneAnimation boneAnimation, Constraint constraint) {
|
|
|
+ Structure constraintStructure = constraint.getData();
|
|
|
+ this.validateConstraintType(constraintStructure);
|
|
|
+
|
|
|
+ //loading mesh points (blender ensures that the target is a mesh-object)
|
|
|
+ List<Vector3f> pts = new ArrayList<Vector3f>();
|
|
|
+ try {
|
|
|
+ Node node = (Node)this.getTarget(constraint, LoadedFeatureDataType.LOADED_FEATURE);
|
|
|
+ for(Spatial spatial : node.getChildren()) {
|
|
|
+ if(spatial instanceof Geometry) {
|
|
|
+ Mesh mesh = ((Geometry) spatial).getMesh();
|
|
|
+ FloatBuffer floatBuffer = mesh.getFloatBuffer(Type.Position);
|
|
|
+ for(int i=0;i<floatBuffer.limit();i+=3) {
|
|
|
+ pts.add(new Vector3f(floatBuffer.get(i), floatBuffer.get(i + 1), floatBuffer.get(i + 2)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //modifying traces
|
|
|
+ BoneTrack boneTrack = this.getBoneTrack(skeleton, boneAnimation, constraint);
|
|
|
+ if (boneTrack != null) {
|
|
|
+ Vector3f[] translations = boneTrack.getTranslations();
|
|
|
+ Quaternion[] rotations = boneTrack.getRotations();
|
|
|
+ int maxFrames = translations.length;
|
|
|
+ for (int frame = 0; frame < maxFrames; ++frame) {
|
|
|
+ Vector3f currentTranslation = translations[frame];
|
|
|
+
|
|
|
+ //looking for minimum distanced point
|
|
|
+ Vector3f minDistancePoint = null;
|
|
|
+ float distance = Float.MAX_VALUE;
|
|
|
+ for(Vector3f p : pts) {
|
|
|
+ float temp = currentTranslation.distance(p);
|
|
|
+ if(temp < distance) {
|
|
|
+ distance = temp;
|
|
|
+ minDistancePoint = p;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ translations[frame] = minDistancePoint.clone();
|
|
|
+ }
|
|
|
+
|
|
|
+ boneTrack.setKeyframes(boneTrack.getTimes(), translations, rotations, boneTrack.getScales());
|
|
|
+ }
|
|
|
+ } catch (BlenderFileException e) {
|
|
|
+ LOGGER.severe(e.getLocalizedMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
//SIZELIKE constraint
|
|
|
influenceFunctions[ConstraintType.CONSTRAINT_TYPE_SIZELIKE.getConstraintId()] = new AbstractInfluenceFunction(ConstraintType.CONSTRAINT_TYPE_SIZELIKE, dataRepository) {
|
|
|
-
|
|
|
@Override
|
|
|
public void affectAnimation(Skeleton skeleton, BoneAnimation boneAnimation, Constraint constraint) {
|
|
|
Structure constraintData = constraint.getData();
|
|
@@ -497,7 +547,6 @@ public class ConstraintHelper extends AbstractBlenderHelper {
|
|
|
|
|
|
//SIZELIMIT constraint
|
|
|
influenceFunctions[ConstraintType.CONSTRAINT_TYPE_SIZELIMIT.getConstraintId()] = new AbstractInfluenceFunction(ConstraintType.CONSTRAINT_TYPE_SIZELIMIT, dataRepository) {
|
|
|
-
|
|
|
@Override
|
|
|
public void affectAnimation(Skeleton skeleton, BoneAnimation boneAnimation, Constraint constraint) {
|
|
|
Structure constraintStructure = constraint.getData();
|