Modifiers refactoring. Common reference to loaded modifier to all classes deriving from 'Modifier' was dropped.
Now all modifiers hold their own data and do not give acces to them. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8243 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
6bbf141b9f
commit
7a44519bac
@ -45,6 +45,8 @@ import com.jme3.util.BufferUtils;
|
||||
/* package */class ArmatureModifier extends Modifier {
|
||||
private static final int MAXIMUM_WEIGHTS_PER_VERTEX = 4; // have no idea why 4, could someone please explain ?
|
||||
|
||||
/** Loaded animation data. */
|
||||
private AnimData animData;
|
||||
/** Old memory address of the armature's object. */
|
||||
private Long armatureObjectOMA;
|
||||
/** Old memory address of the mesh that will have the skeleton applied. */
|
||||
@ -124,7 +126,7 @@ import com.jme3.util.BufferUtils;
|
||||
animations.add(boneAnimation);
|
||||
}
|
||||
}
|
||||
jmeModifierRepresentation = new AnimData(new Skeleton(bones), animations);
|
||||
animData = new AnimData(new Skeleton(bones), animations);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -132,7 +134,7 @@ import com.jme3.util.BufferUtils;
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public Node apply(Node node, DataRepository dataRepository) {
|
||||
if(jmeModifierRepresentation == null) {
|
||||
if(animData == null) {
|
||||
return node;
|
||||
}
|
||||
|
||||
@ -147,8 +149,7 @@ import com.jme3.util.BufferUtils;
|
||||
}
|
||||
}
|
||||
|
||||
AnimData ad = (AnimData) jmeModifierRepresentation;
|
||||
ArrayList<Animation> animList = ad.anims;
|
||||
ArrayList<Animation> animList = animData.anims;
|
||||
if (animList != null && animList.size() > 0) {
|
||||
List<Constraint> constraints = dataRepository.getConstraints(this.armatureObjectOMA);
|
||||
HashMap<String, Animation> anims = new HashMap<String, Animation>();
|
||||
@ -158,7 +159,7 @@ import com.jme3.util.BufferUtils;
|
||||
// baking constraints into animations
|
||||
if (constraints != null && constraints.size() > 0) {
|
||||
for (Constraint constraint : constraints) {
|
||||
constraint.affectAnimation(ad.skeleton, boneAnimation);
|
||||
constraint.affectAnimation(animData.skeleton, boneAnimation);
|
||||
}
|
||||
}
|
||||
|
||||
@ -179,8 +180,8 @@ import com.jme3.util.BufferUtils;
|
||||
}
|
||||
|
||||
// applying the control to the node
|
||||
SkeletonControl skeletonControl = new SkeletonControl(meshes, ad.skeleton);
|
||||
AnimControl control = new AnimControl(ad.skeleton);
|
||||
SkeletonControl skeletonControl = new SkeletonControl(meshes, animData.skeleton);
|
||||
AnimControl control = new AnimControl(animData.skeleton);
|
||||
|
||||
control.setAnimations(anims);
|
||||
node.addControl(control);
|
||||
|
@ -33,6 +33,9 @@ import com.jme3.scene.shape.Curve;
|
||||
/*package*/ class ArrayModifier extends Modifier {
|
||||
private static final Logger LOGGER = Logger.getLogger(ArrayModifier.class.getName());
|
||||
|
||||
/** Parameters of the modifier. */
|
||||
private Map<String, Object> modifierData = new HashMap<String, Object>();
|
||||
|
||||
/**
|
||||
* This constructor reads array data from the modifier structure. The
|
||||
* stored data is a map of parameters for array modifier. No additional data
|
||||
@ -50,16 +53,14 @@ import com.jme3.scene.shape.Curve;
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public ArrayModifier(Structure modifier, DataRepository dataRepository) throws BlenderFileException {
|
||||
Map<String, Object> params = new HashMap<String, Object>();
|
||||
|
||||
Number fittype = (Number) modifier.getFieldValue("fit_type");
|
||||
params.put("fittype", fittype);
|
||||
modifierData.put("fittype", fittype);
|
||||
switch (fittype.intValue()) {
|
||||
case 0:// FIXED COUNT
|
||||
params.put("count", modifier.getFieldValue("count"));
|
||||
modifierData.put("count", modifier.getFieldValue("count"));
|
||||
break;
|
||||
case 1:// FIXED LENGTH
|
||||
params.put("length", modifier.getFieldValue("length"));
|
||||
modifierData.put("length", modifier.getFieldValue("length"));
|
||||
break;
|
||||
case 2:// FITCURVE
|
||||
Pointer pCurveOb = (Pointer) modifier.getFieldValue("curve_ob");
|
||||
@ -86,8 +87,8 @@ import com.jme3.scene.shape.Curve;
|
||||
}
|
||||
}
|
||||
}
|
||||
params.put("length", Float.valueOf(length));
|
||||
params.put("fittype", Integer.valueOf(1));// treat it like FIXED LENGTH
|
||||
modifierData.put("length", Float.valueOf(length));
|
||||
modifierData.put("fittype", Integer.valueOf(1));// treat it like FIXED LENGTH
|
||||
break;
|
||||
default:
|
||||
assert false : "Unknown array modifier fit type: " + fittype;
|
||||
@ -98,36 +99,33 @@ import com.jme3.scene.shape.Curve;
|
||||
if ((offsettype & 0x01) != 0) {// Constant offset
|
||||
DynamicArray<Number> offsetArray = (DynamicArray<Number>) modifier.getFieldValue("offset");
|
||||
float[] offset = new float[]{offsetArray.get(0).floatValue(), offsetArray.get(1).floatValue(), offsetArray.get(2).floatValue()};
|
||||
params.put("offset", offset);
|
||||
modifierData.put("offset", offset);
|
||||
}
|
||||
if ((offsettype & 0x02) != 0) {// Relative offset
|
||||
DynamicArray<Number> scaleArray = (DynamicArray<Number>) modifier.getFieldValue("scale");
|
||||
float[] scale = new float[]{scaleArray.get(0).floatValue(), scaleArray.get(1).floatValue(), scaleArray.get(2).floatValue()};
|
||||
params.put("scale", scale);
|
||||
modifierData.put("scale", scale);
|
||||
}
|
||||
if ((offsettype & 0x04) != 0) {// Object offset
|
||||
Pointer pOffsetObject = (Pointer) modifier.getFieldValue("offset_ob");
|
||||
if (pOffsetObject.isNotNull()) {
|
||||
params.put("offsetob", pOffsetObject);
|
||||
modifierData.put("offsetob", pOffsetObject);
|
||||
}
|
||||
}
|
||||
|
||||
// start cap and end cap
|
||||
Pointer pStartCap = (Pointer) modifier.getFieldValue("start_cap");
|
||||
if (pStartCap.isNotNull()) {
|
||||
params.put("startcap", pStartCap);
|
||||
modifierData.put("startcap", pStartCap);
|
||||
}
|
||||
Pointer pEndCap = (Pointer) modifier.getFieldValue("end_cap");
|
||||
if (pEndCap.isNotNull()) {
|
||||
params.put("endcap", pEndCap);
|
||||
modifierData.put("endcap", pEndCap);
|
||||
}
|
||||
jmeModifierRepresentation = params;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public Node apply(Node node, DataRepository dataRepository) {
|
||||
Map<String, Object> modifierData = (Map<String, Object>) jmeModifierRepresentation;
|
||||
int fittype = ((Number) modifierData.get("fittype")).intValue();
|
||||
float[] offset = (float[]) modifierData.get("offset");
|
||||
if (offset == null) {// the node will be repeated several times in the same place
|
||||
|
@ -29,6 +29,9 @@ import com.jme3.scene.plugins.blender.objects.ObjectHelper;
|
||||
/*package*/ class MirrorModifier extends Modifier {
|
||||
private static final Logger LOGGER = Logger.getLogger(MirrorModifier.class.getName());
|
||||
|
||||
/** Parameters of the modifier. */
|
||||
private Map<String, Object> modifierData = new HashMap<String, Object>();
|
||||
|
||||
/**
|
||||
* This constructor reads mirror data from the modifier structure. The
|
||||
* stored data is a map of parameters for mirror modifier. No additional data
|
||||
@ -46,21 +49,16 @@ import com.jme3.scene.plugins.blender.objects.ObjectHelper;
|
||||
* corrupted
|
||||
*/
|
||||
public MirrorModifier(Structure modifier, DataRepository dataRepository) {
|
||||
Map<String, Object> params = new HashMap<String, Object>();
|
||||
|
||||
params.put("flag", modifier.getFieldValue("flag"));
|
||||
params.put("tolerance", modifier.getFieldValue("tolerance"));
|
||||
modifierData.put("flag", modifier.getFieldValue("flag"));
|
||||
modifierData.put("tolerance", modifier.getFieldValue("tolerance"));
|
||||
Pointer pMirrorOb = (Pointer) modifier.getFieldValue("mirror_ob");
|
||||
if (pMirrorOb.isNotNull()) {
|
||||
params.put("mirrorob", pMirrorOb);
|
||||
modifierData.put("mirrorob", pMirrorOb);
|
||||
}
|
||||
jmeModifierRepresentation = params;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public Node apply(Node node, DataRepository dataRepository) {
|
||||
Map<String, Object> modifierData = (Map<String, Object>) jmeModifierRepresentation;
|
||||
int flag = ((Number) modifierData.get("flag")).intValue();
|
||||
float[] mirrorFactor = new float[]{
|
||||
(flag & 0x08) != 0 ? -1.0f : 1.0f,
|
||||
|
@ -19,34 +19,6 @@ public abstract class Modifier {
|
||||
public static final String MIRROR_MODIFIER_DATA = "MirrorModifierData";
|
||||
public static final String OBJECT_ANIMATION_MODIFIER_DATA = "ObjectAnimationModifierData";
|
||||
|
||||
/**
|
||||
* JME modifier representation object.
|
||||
*/
|
||||
protected Object jmeModifierRepresentation;
|
||||
|
||||
/**
|
||||
* Various additional data used by modifiers.
|
||||
*/
|
||||
protected Object additionalData;
|
||||
|
||||
/**
|
||||
* This method returns JME modifier representation object.
|
||||
*
|
||||
* @return JME modifier representation object
|
||||
*/
|
||||
public Object getJmeModifierRepresentation() {
|
||||
return jmeModifierRepresentation;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns additional data stored in the modifier.
|
||||
*
|
||||
* @return the additional data stored in the modifier
|
||||
*/
|
||||
public Object getAdditionalData() {
|
||||
return additionalData;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method applies the modifier to the given node.
|
||||
*
|
||||
|
@ -3,12 +3,14 @@ package com.jme3.scene.plugins.blender.modifiers;
|
||||
import com.jme3.animation.Animation;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.jme3.animation.Bone;
|
||||
import com.jme3.animation.BoneAnimation;
|
||||
import com.jme3.animation.BoneTrack;
|
||||
import com.jme3.animation.Skeleton;
|
||||
import com.jme3.math.Transform;
|
||||
import com.jme3.scene.Node;
|
||||
import com.jme3.scene.plugins.blender.DataRepository;
|
||||
import com.jme3.scene.plugins.blender.animations.Ipo;
|
||||
import com.jme3.scene.plugins.blender.animations.IpoHelper;
|
||||
@ -24,7 +26,13 @@ import com.jme3.scene.plugins.ogre.AnimData;
|
||||
*
|
||||
* @author Marcin Roguski (Kaelthas)
|
||||
*/
|
||||
/* package */class ObjectAnimationModifier extends ArmatureModifier {
|
||||
/* package */class ObjectAnimationModifier extends Modifier {
|
||||
private static final Logger LOGGER = Logger.getLogger(ObjectAnimationModifier.class.getName());
|
||||
|
||||
/** Loaded animation data. */
|
||||
private AnimData animData;
|
||||
/** Old memory address of the object structure that will have the modifier applied. */
|
||||
private Long objectOMA;
|
||||
|
||||
/**
|
||||
* This constructor reads animation of the object itself (without bones) and
|
||||
@ -44,8 +52,7 @@ import com.jme3.scene.plugins.ogre.AnimData;
|
||||
* this exception is thrown when the blender file is somehow
|
||||
* corrupted
|
||||
*/
|
||||
public ObjectAnimationModifier(Structure objectStructure,
|
||||
DataRepository dataRepository) throws BlenderFileException {
|
||||
public ObjectAnimationModifier(Structure objectStructure, DataRepository dataRepository) throws BlenderFileException {
|
||||
Pointer pIpo = (Pointer) objectStructure.getFieldValue("ipo");
|
||||
if (pIpo.isNotNull()) {
|
||||
// check if there is an action name connected with this ipo
|
||||
@ -54,13 +61,9 @@ import com.jme3.scene.plugins.ogre.AnimData;
|
||||
.getFileBlocks(Integer.valueOf(FileBlockHeader.BLOCK_AC00));
|
||||
for (FileBlockHeader actionBlock : actionBlocks) {
|
||||
Structure action = actionBlock.getStructure(dataRepository);
|
||||
List<Structure> actionChannels = ((Structure) action
|
||||
.getFieldValue("chanbase"))
|
||||
.evaluateListBase(dataRepository);
|
||||
if (actionChannels.size() == 1) {// object's animtion action has
|
||||
// only one channel
|
||||
Pointer pChannelIpo = (Pointer) actionChannels.get(0)
|
||||
.getFieldValue("ipo");
|
||||
List<Structure> actionChannels = ((Structure) action.getFieldValue("chanbase")).evaluateListBase(dataRepository);
|
||||
if (actionChannels.size() == 1) {// object's animtion action has only one channel
|
||||
Pointer pChannelIpo = (Pointer) actionChannels.get(0).getFieldValue("ipo");
|
||||
if (pChannelIpo.equals(pIpo)) {
|
||||
objectAnimationName = action.getName();
|
||||
break;
|
||||
@ -69,20 +72,15 @@ import com.jme3.scene.plugins.ogre.AnimData;
|
||||
}
|
||||
|
||||
String objectName = objectStructure.getName();
|
||||
if (objectAnimationName == null) {// set the object's animation name
|
||||
// to object's name
|
||||
if (objectAnimationName == null) {// set the object's animation name to object's name
|
||||
objectAnimationName = objectName;
|
||||
}
|
||||
|
||||
IpoHelper ipoHelper = dataRepository.getHelper(IpoHelper.class);
|
||||
Structure ipoStructure = pIpo.fetchData(
|
||||
dataRepository.getInputStream()).get(0);
|
||||
Structure ipoStructure = pIpo.fetchData(dataRepository.getInputStream()).get(0);
|
||||
Ipo ipo = ipoHelper.createIpo(ipoStructure, dataRepository);
|
||||
int[] animationFrames = dataRepository.getBlenderKey()
|
||||
.getAnimationFrames(objectName, objectAnimationName);
|
||||
if (animationFrames == null) {// if the name was created here there
|
||||
// are no frames set for the
|
||||
// animation
|
||||
int[] animationFrames = dataRepository.getBlenderKey().getAnimationFrames(objectName, objectAnimationName);
|
||||
if (animationFrames == null) {// if the name was created here there are no frames set for the animation
|
||||
animationFrames = new int[] { 1, ipo.getLastFrame() };
|
||||
}
|
||||
int fps = dataRepository.getBlenderKey().getFps();
|
||||
@ -91,31 +89,30 @@ import com.jme3.scene.plugins.ogre.AnimData;
|
||||
|
||||
// calculating track for the only bone in this skeleton
|
||||
BoneTrack[] tracks = new BoneTrack[1];
|
||||
tracks[0] = ipo.calculateTrack(0, animationFrames[0],
|
||||
animationFrames[1], fps);
|
||||
tracks[0] = ipo.calculateTrack(0, animationFrames[0], animationFrames[1], fps);
|
||||
|
||||
BoneAnimation boneAnimation = new BoneAnimation(
|
||||
objectAnimationName, stop - start);
|
||||
BoneAnimation boneAnimation = new BoneAnimation(objectAnimationName, stop - start);
|
||||
boneAnimation.setTracks(tracks);
|
||||
ArrayList<Animation> animations = new ArrayList<Animation>(
|
||||
1);
|
||||
ArrayList<Animation> animations = new ArrayList<Animation>(1);
|
||||
animations.add(boneAnimation);
|
||||
|
||||
// preparing the object's bone
|
||||
ObjectHelper objectHelper = dataRepository
|
||||
.getHelper(ObjectHelper.class);
|
||||
Transform t = objectHelper.getTransformation(objectStructure,
|
||||
dataRepository);
|
||||
ObjectHelper objectHelper = dataRepository.getHelper(ObjectHelper.class);
|
||||
Transform t = objectHelper.getTransformation(objectStructure, dataRepository);
|
||||
Bone bone = new Bone(null);
|
||||
bone.setBindTransforms(t.getTranslation(), t.getRotation(),
|
||||
t.getScale());
|
||||
bone.setBindTransforms(t.getTranslation(), t.getRotation(), t.getScale());
|
||||
|
||||
jmeModifierRepresentation = new AnimData(new Skeleton(
|
||||
new Bone[] { bone }), animations);
|
||||
additionalData = objectStructure.getOldMemoryAddress();
|
||||
animData = new AnimData(new Skeleton(new Bone[] { bone }), animations);
|
||||
objectOMA = objectStructure.getOldMemoryAddress();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Node apply(Node node, DataRepository dataRepository) {
|
||||
LOGGER.warning("Object animation modifier not yet implemented!");
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return Modifier.OBJECT_ANIMATION_MODIFIER_DATA;
|
||||
|
@ -24,6 +24,7 @@ import com.jme3.scene.plugins.blender.particles.ParticlesHelper;
|
||||
* @author Marcin Roguski (Kaelthas)
|
||||
*/
|
||||
/* package */class ParticlesModifier extends Modifier {
|
||||
private ParticleEmitter particleEmitter;
|
||||
|
||||
/**
|
||||
* This constructor reads the particles system structure and stores it in
|
||||
@ -41,32 +42,25 @@ import com.jme3.scene.plugins.blender.particles.ParticlesHelper;
|
||||
throws BlenderFileException {
|
||||
Pointer pParticleSystem = (Pointer) modifier.getFieldValue("psys");
|
||||
if (pParticleSystem.isNotNull()) {
|
||||
ParticlesHelper particlesHelper = dataRepository
|
||||
.getHelper(ParticlesHelper.class);
|
||||
Structure particleSystem = pParticleSystem.fetchData(
|
||||
dataRepository.getInputStream()).get(0);
|
||||
jmeModifierRepresentation = particlesHelper.toParticleEmitter(
|
||||
particleSystem, dataRepository);
|
||||
ParticlesHelper particlesHelper = dataRepository.getHelper(ParticlesHelper.class);
|
||||
Structure particleSystem = pParticleSystem.fetchData(dataRepository.getInputStream()).get(0);
|
||||
particleEmitter = particlesHelper.toParticleEmitter(particleSystem, dataRepository);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Node apply(Node node, DataRepository dataRepository) {
|
||||
MaterialHelper materialHelper = dataRepository
|
||||
.getHelper(MaterialHelper.class);
|
||||
ParticleEmitter emitter = (ParticleEmitter) jmeModifierRepresentation;
|
||||
emitter = emitter.clone();
|
||||
MaterialHelper materialHelper = dataRepository.getHelper(MaterialHelper.class);
|
||||
ParticleEmitter emitter = particleEmitter.clone();
|
||||
|
||||
// veryfying the alpha function for particles' texture
|
||||
Integer alphaFunction = MaterialHelper.ALPHA_MASK_HYPERBOLE;
|
||||
char nameSuffix = emitter.getName().charAt(
|
||||
emitter.getName().length() - 1);
|
||||
char nameSuffix = emitter.getName().charAt(emitter.getName().length() - 1);
|
||||
if (nameSuffix == 'B' || nameSuffix == 'N') {
|
||||
alphaFunction = MaterialHelper.ALPHA_MASK_NONE;
|
||||
}
|
||||
// removing the type suffix from the name
|
||||
emitter.setName(emitter.getName().substring(0,
|
||||
emitter.getName().length() - 1));
|
||||
emitter.setName(emitter.getName().substring(0, emitter.getName().length() - 1));
|
||||
|
||||
// applying emitter shape
|
||||
EmitterShape emitterShape = emitter.getShape();
|
||||
@ -77,10 +71,8 @@ import com.jme3.scene.plugins.blender.particles.ParticlesHelper;
|
||||
if (mesh != null) {
|
||||
meshes.add(mesh);
|
||||
Material material = materialHelper.getParticlesMaterial(
|
||||
((Geometry) spatial).getMaterial(), alphaFunction,
|
||||
dataRepository);
|
||||
emitter.setMaterial(material);// TODO: divide into several
|
||||
// pieces
|
||||
((Geometry) spatial).getMaterial(), alphaFunction, dataRepository);
|
||||
emitter.setMaterial(material);// TODO: divide into several pieces
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user