Support for 'Fit curve' mode in array modifier added.
(also several small fixes to array modifier added) git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7680 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
3cdbd90d5a
commit
e0188e7a13
@ -536,12 +536,14 @@ public class CurvesHelper extends AbstractBlenderHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<Geometry> result = new ArrayList<Geometry>(vertexBuffers.length);
|
List<Geometry> result = new ArrayList<Geometry>(vertexBuffers.length);
|
||||||
|
Float oneReferenceToCurveLength = new Float(curveLength);//its important for array modifier to use one reference here
|
||||||
for (int i = 0; i < vertexBuffers.length; ++i) {
|
for (int i = 0; i < vertexBuffers.length; ++i) {
|
||||||
Mesh mesh = new Mesh();
|
Mesh mesh = new Mesh();
|
||||||
mesh.setBuffer(Type.Position, 3, vertexBuffers[i]);
|
mesh.setBuffer(Type.Position, 3, vertexBuffers[i]);
|
||||||
mesh.setBuffer(Type.Index, 3, indexBuffers[i]);
|
mesh.setBuffer(Type.Index, 3, indexBuffers[i]);
|
||||||
mesh.setBuffer(Type.Normal, 3, normalBuffers[i]);
|
mesh.setBuffer(Type.Normal, 3, normalBuffers[i]);
|
||||||
Geometry g = new Geometry("g" + i, mesh);
|
Geometry g = new Geometry("g" + i, mesh);
|
||||||
|
g.setUserData("curveLength", oneReferenceToCurveLength);
|
||||||
g.updateModelBound();
|
g.updateModelBound();
|
||||||
result.add(g);
|
result.add(g);
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,7 @@ import java.nio.FloatBuffer;
|
|||||||
import java.nio.ShortBuffer;
|
import java.nio.ShortBuffer;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
@ -74,6 +75,7 @@ import com.jme3.scene.plugins.blender.utils.DataRepository.LoadedFeatureDataType
|
|||||||
import com.jme3.scene.plugins.blender.utils.DynamicArray;
|
import com.jme3.scene.plugins.blender.utils.DynamicArray;
|
||||||
import com.jme3.scene.plugins.blender.utils.Pointer;
|
import com.jme3.scene.plugins.blender.utils.Pointer;
|
||||||
import com.jme3.scene.plugins.ogre.AnimData;
|
import com.jme3.scene.plugins.ogre.AnimData;
|
||||||
|
import com.jme3.scene.shape.Curve;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class that is used in modifiers calculations.
|
* A class that is used in modifiers calculations.
|
||||||
@ -149,7 +151,32 @@ public class ModifierHelper extends AbstractBlenderHelper {
|
|||||||
params.put("length", modifier.getFieldValue("length"));
|
params.put("length", modifier.getFieldValue("length"));
|
||||||
break;
|
break;
|
||||||
case 2:// FITCURVE
|
case 2:// FITCURVE
|
||||||
// TODO: implement after loading curves is added; warning will be generated during modifier applying
|
Pointer pCurveOb = (Pointer) modifier.getFieldValue("curve_ob");
|
||||||
|
float length = 0;
|
||||||
|
if(pCurveOb.isNotNull()) {
|
||||||
|
Structure curveStructure = pCurveOb.fetchData(dataRepository.getInputStream()).get(0);
|
||||||
|
ObjectHelper objectHelper = dataRepository.getHelper(ObjectHelper.class);
|
||||||
|
Node curveObject = (Node)objectHelper.toObject(curveStructure, dataRepository);
|
||||||
|
Set<Number> referencesToCurveLengths = new HashSet<Number>(curveObject.getChildren().size());
|
||||||
|
for(Spatial spatial : curveObject.getChildren()) {
|
||||||
|
if(spatial instanceof Geometry) {
|
||||||
|
Mesh mesh = ((Geometry) spatial).getMesh();
|
||||||
|
if(mesh instanceof Curve) {
|
||||||
|
length += ((Curve) mesh).getLength();
|
||||||
|
} else {
|
||||||
|
//if bevel object has several parts then each mesh will have the same reference
|
||||||
|
//to length value (and we should use only one)
|
||||||
|
Number curveLength = spatial.getUserData("curveLength");
|
||||||
|
if(curveLength!=null && !referencesToCurveLengths.contains(curveLength)) {
|
||||||
|
length += curveLength.floatValue();
|
||||||
|
referencesToCurveLengths.add(curveLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
params.put("length", Float.valueOf(length));
|
||||||
|
params.put("fittype", Integer.valueOf(1));// treat it like FIXED LENGTH
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert false : "Unknown array modifier fit type: " + fittype;
|
assert false : "Unknown array modifier fit type: " + fittype;
|
||||||
@ -184,8 +211,7 @@ public class ModifierHelper extends AbstractBlenderHelper {
|
|||||||
params.put("endcap", pEndCap);
|
params.put("endcap", pEndCap);
|
||||||
}
|
}
|
||||||
loadedModifier = params;
|
loadedModifier = params;
|
||||||
}
|
} else if (Modifier.MIRROR_MODIFIER_DATA.equals(modifier.getType())) {// ****************MIRROR MODIFIER
|
||||||
if (Modifier.MIRROR_MODIFIER_DATA.equals(modifier.getType())) {// ****************MIRROR MODIFIER
|
|
||||||
Map<String, Object> params = new HashMap<String, Object>();
|
Map<String, Object> params = new HashMap<String, Object>();
|
||||||
|
|
||||||
params.put("flag", modifier.getFieldValue("flag"));
|
params.put("flag", modifier.getFieldValue("flag"));
|
||||||
@ -471,7 +497,7 @@ public class ModifierHelper extends AbstractBlenderHelper {
|
|||||||
count = (int) (length / translationVector.length()) - 1;
|
count = (int) (length / translationVector.length()) - 1;
|
||||||
}
|
}
|
||||||
} else if (fittype == 2) {// Fit curve
|
} else if (fittype == 2) {// Fit curve
|
||||||
LOGGER.warning("Fit curve mode in array modifier not yet implemented!");// TODO: implement fit curve
|
throw new IllegalStateException("Fit curve should be transformed to Fixed Length array type!");
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalStateException("Unknown fit type: " + fittype);
|
throw new IllegalStateException("Unknown fit type: " + fittype);
|
||||||
}
|
}
|
||||||
@ -479,7 +505,7 @@ public class ModifierHelper extends AbstractBlenderHelper {
|
|||||||
// adding translated nodes and caps
|
// adding translated nodes and caps
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
Node[] arrayNodes = new Node[count];
|
Node[] arrayNodes = new Node[count];
|
||||||
Vector3f newTranslation = node.getLocalTranslation().clone();
|
Vector3f newTranslation = new Vector3f();
|
||||||
for (int i = 0; i < count; ++i) {
|
for (int i = 0; i < count; ++i) {
|
||||||
newTranslation.addLocal(translationVector);
|
newTranslation.addLocal(translationVector);
|
||||||
Node nodeClone = (Node) node.clone();
|
Node nodeClone = (Node) node.clone();
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user