Code refactoring:
- removed unused methods - added javadocs - minor name fixes - one constructor type for all helpers git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10585 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
		
							parent
							
								
									3602d86c20
								
							
						
					
					
						commit
						9961f77445
					
				| @ -49,7 +49,8 @@ import com.jme3.scene.plugins.blender.objects.Properties; | |||||||
|  * @author Marcin Roguski |  * @author Marcin Roguski | ||||||
|  */ |  */ | ||||||
| public abstract class AbstractBlenderHelper { | public abstract class AbstractBlenderHelper { | ||||||
| 
 |     /** The blender context. */ | ||||||
|  |     protected BlenderContext blenderContext; | ||||||
|     /** The version of the blend file. */ |     /** The version of the blend file. */ | ||||||
|     protected final int  blenderVersion; |     protected final int  blenderVersion; | ||||||
|     /** This variable indicates if the Y asxis is the UP axis or not. */ |     /** This variable indicates if the Y asxis is the UP axis or not. */ | ||||||
| @ -62,12 +63,13 @@ public abstract class AbstractBlenderHelper { | |||||||
|      * versions. |      * versions. | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param fixUpAxis |      * @param blenderContext | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |      *            the blender context | ||||||
|      */ |      */ | ||||||
|     public AbstractBlenderHelper(String blenderVersion, boolean fixUpAxis) { |     public AbstractBlenderHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         this.blenderVersion = Integer.parseInt(blenderVersion); |         this.blenderVersion = Integer.parseInt(blenderVersion); | ||||||
|         this.fixUpAxis = fixUpAxis; |         this.blenderContext = blenderContext; | ||||||
|  |         this.fixUpAxis = blenderContext.getBlenderKey().isFixUpAxis(); | ||||||
|         if (fixUpAxis) { |         if (fixUpAxis) { | ||||||
|             upAxisRotationQuaternion = new Quaternion().fromAngles(-FastMath.HALF_PI, 0, 0); |             upAxisRotationQuaternion = new Quaternion().fromAngles(-FastMath.HALF_PI, 0, 0); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -54,7 +54,6 @@ import com.jme3.scene.plugins.blender.file.DnaBlockData; | |||||||
| import com.jme3.scene.plugins.blender.file.FileBlockHeader; | import com.jme3.scene.plugins.blender.file.FileBlockHeader; | ||||||
| import com.jme3.scene.plugins.blender.file.Structure; | import com.jme3.scene.plugins.blender.file.Structure; | ||||||
| import com.jme3.scene.plugins.blender.meshes.MeshContext; | import com.jme3.scene.plugins.blender.meshes.MeshContext; | ||||||
| import com.jme3.scene.plugins.blender.modifiers.Modifier; |  | ||||||
| import com.jme3.scene.plugins.ogre.AnimData; | import com.jme3.scene.plugins.ogre.AnimData; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -101,8 +100,6 @@ public class BlenderContext { | |||||||
|     private Map<String, Object[]>               loadedFeaturesByName   = new HashMap<String, Object[]>(); |     private Map<String, Object[]>               loadedFeaturesByName   = new HashMap<String, Object[]>(); | ||||||
|     /** A stack that hold the parent structure of currently loaded feature. */ |     /** A stack that hold the parent structure of currently loaded feature. */ | ||||||
|     private Stack<Structure>                    parentStack            = new Stack<Structure>(); |     private Stack<Structure>                    parentStack            = new Stack<Structure>(); | ||||||
|     /** A list of modifiers for the specified object. */ |  | ||||||
|     protected Map<Long, List<Modifier>>         modifiers              = new HashMap<Long, List<Modifier>>(); |  | ||||||
|     /** A list of constraints for the specified object. */ |     /** A list of constraints for the specified object. */ | ||||||
|     protected Map<Long, List<Constraint>>       constraints            = new HashMap<Long, List<Constraint>>(); |     protected Map<Long, List<Constraint>>       constraints            = new HashMap<Long, List<Constraint>>(); | ||||||
|     /** Anim data loaded for features. */ |     /** Anim data loaded for features. */ | ||||||
| @ -272,14 +269,6 @@ public class BlenderContext { | |||||||
|         return fileBlockHeadersByCode.get(code); |         return fileBlockHeadersByCode.get(code); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * This method clears the saved block headers stored in the features map. |  | ||||||
|      */ |  | ||||||
|     public void clearFileBlocks() { |  | ||||||
|         fileBlockHeadersByOma.clear(); |  | ||||||
|         fileBlockHeadersByCode.clear(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This method adds a helper instance to the helpers' map. |      * This method adds a helper instance to the helpers' map. | ||||||
|      *  |      *  | ||||||
| @ -342,13 +331,6 @@ public class BlenderContext { | |||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * This method clears the saved features stored in the features map. |  | ||||||
|      */ |  | ||||||
|     public void clearLoadedFeatures() { |  | ||||||
|         loadedFeatures.clear(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This method adds the structure to the parent stack. |      * This method adds the structure to the parent stack. | ||||||
|      *  |      *  | ||||||
| @ -386,48 +368,6 @@ public class BlenderContext { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * This method adds a new modifier to the list. |  | ||||||
|      *  |  | ||||||
|      * @param ownerOMA |  | ||||||
|      *            the owner's old memory address |  | ||||||
|      * @param modifier |  | ||||||
|      *            the object's modifier |  | ||||||
|      */ |  | ||||||
|     public void addModifier(Long ownerOMA, Modifier modifier) { |  | ||||||
|         List<Modifier> objectModifiers = this.modifiers.get(ownerOMA); |  | ||||||
|         if (objectModifiers == null) { |  | ||||||
|             objectModifiers = new ArrayList<Modifier>(); |  | ||||||
|             this.modifiers.put(ownerOMA, objectModifiers); |  | ||||||
|         } |  | ||||||
|         objectModifiers.add(modifier); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * This method returns modifiers for the object specified by its old memory |  | ||||||
|      * address and the modifier type. If no modifiers are found - empty list is |  | ||||||
|      * returned. If the type is null - all modifiers for the object are |  | ||||||
|      * returned. |  | ||||||
|      *  |  | ||||||
|      * @param objectOMA |  | ||||||
|      *            object's old memory address |  | ||||||
|      * @param type |  | ||||||
|      *            the type of the modifier |  | ||||||
|      * @return the list of object's modifiers |  | ||||||
|      */ |  | ||||||
|     public List<Modifier> getModifiers(Long objectOMA, String type) { |  | ||||||
|         List<Modifier> result = new ArrayList<Modifier>(); |  | ||||||
|         List<Modifier> readModifiers = modifiers.get(objectOMA); |  | ||||||
|         if (readModifiers != null && readModifiers.size() > 0) { |  | ||||||
|             for (Modifier modifier : readModifiers) { |  | ||||||
|                 if (type == null || type.isEmpty() || modifier.getType().equals(type)) { |  | ||||||
|                     result.add(modifier); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This method adds a new modifier to the list. |      * This method adds a new modifier to the list. | ||||||
|      *  |      *  | ||||||
| @ -632,13 +572,14 @@ public class BlenderContext { | |||||||
|         loadedFeatures.clear(); |         loadedFeatures.clear(); | ||||||
|         loadedFeaturesByName.clear(); |         loadedFeaturesByName.clear(); | ||||||
|         parentStack.clear(); |         parentStack.clear(); | ||||||
|         modifiers.clear(); |  | ||||||
|         constraints.clear(); |         constraints.clear(); | ||||||
|         animData.clear(); |         animData.clear(); | ||||||
|         skeletons.clear(); |         skeletons.clear(); | ||||||
|         meshContexts.clear(); |         meshContexts.clear(); | ||||||
|         boneContexts.clear(); |         boneContexts.clear(); | ||||||
|         helpers.clear(); |         helpers.clear(); | ||||||
|  |         fileBlockHeadersByOma.clear(); | ||||||
|  |         fileBlockHeadersByCode.clear(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -195,18 +195,18 @@ public class BlenderLoader extends AbstractBlenderLoader { | |||||||
|         blenderContext.setBlenderKey(blenderKey); |         blenderContext.setBlenderKey(blenderKey); | ||||||
| 
 | 
 | ||||||
|         // creating helpers |         // creating helpers | ||||||
|         blenderContext.putHelper(ArmatureHelper.class, new ArmatureHelper(inputStream.getVersionNumber(), blenderKey.isFixUpAxis())); |         blenderContext.putHelper(ArmatureHelper.class, new ArmatureHelper(inputStream.getVersionNumber(), blenderContext)); | ||||||
|         blenderContext.putHelper(TextureHelper.class, new TextureHelper(inputStream.getVersionNumber(), blenderKey.isFixUpAxis())); |         blenderContext.putHelper(TextureHelper.class, new TextureHelper(inputStream.getVersionNumber(), blenderContext)); | ||||||
|         blenderContext.putHelper(MeshHelper.class, new MeshHelper(inputStream.getVersionNumber(), blenderKey.isFixUpAxis())); |         blenderContext.putHelper(MeshHelper.class, new MeshHelper(inputStream.getVersionNumber(), blenderContext)); | ||||||
|         blenderContext.putHelper(ObjectHelper.class, new ObjectHelper(inputStream.getVersionNumber(), blenderKey.isFixUpAxis())); |         blenderContext.putHelper(ObjectHelper.class, new ObjectHelper(inputStream.getVersionNumber(), blenderContext)); | ||||||
|         blenderContext.putHelper(CurvesHelper.class, new CurvesHelper(inputStream.getVersionNumber(), blenderKey.isFixUpAxis())); |         blenderContext.putHelper(CurvesHelper.class, new CurvesHelper(inputStream.getVersionNumber(), blenderContext)); | ||||||
|         blenderContext.putHelper(LightHelper.class, new LightHelper(inputStream.getVersionNumber(), blenderKey.isFixUpAxis())); |         blenderContext.putHelper(LightHelper.class, new LightHelper(inputStream.getVersionNumber(), blenderContext)); | ||||||
|         blenderContext.putHelper(CameraHelper.class, new CameraHelper(inputStream.getVersionNumber(), blenderKey.isFixUpAxis())); |         blenderContext.putHelper(CameraHelper.class, new CameraHelper(inputStream.getVersionNumber(), blenderContext)); | ||||||
|         blenderContext.putHelper(ModifierHelper.class, new ModifierHelper(inputStream.getVersionNumber(), blenderKey.isFixUpAxis())); |         blenderContext.putHelper(ModifierHelper.class, new ModifierHelper(inputStream.getVersionNumber(), blenderContext)); | ||||||
|         blenderContext.putHelper(MaterialHelper.class, new MaterialHelper(inputStream.getVersionNumber(), blenderKey.isFixUpAxis())); |         blenderContext.putHelper(MaterialHelper.class, new MaterialHelper(inputStream.getVersionNumber(), blenderContext)); | ||||||
|         blenderContext.putHelper(ConstraintHelper.class, new ConstraintHelper(inputStream.getVersionNumber(), blenderContext, blenderKey.isFixUpAxis())); |         blenderContext.putHelper(ConstraintHelper.class, new ConstraintHelper(inputStream.getVersionNumber(), blenderContext)); | ||||||
|         blenderContext.putHelper(IpoHelper.class, new IpoHelper(inputStream.getVersionNumber(), blenderKey.isFixUpAxis())); |         blenderContext.putHelper(IpoHelper.class, new IpoHelper(inputStream.getVersionNumber(), blenderContext)); | ||||||
|         blenderContext.putHelper(ParticlesHelper.class, new ParticlesHelper(inputStream.getVersionNumber(), blenderKey.isFixUpAxis())); |         blenderContext.putHelper(ParticlesHelper.class, new ParticlesHelper(inputStream.getVersionNumber(), blenderContext)); | ||||||
| 
 | 
 | ||||||
|         // reading the blocks (dna block is automatically saved in the blender context when found) |         // reading the blocks (dna block is automatically saved in the blender context when found) | ||||||
|         FileBlockHeader sceneFileBlock = null; |         FileBlockHeader sceneFileBlock = null; | ||||||
|  | |||||||
| @ -58,10 +58,7 @@ import com.jme3.scene.plugins.blender.file.Structure; | |||||||
| public class ArmatureHelper extends AbstractBlenderHelper { | public class ArmatureHelper extends AbstractBlenderHelper { | ||||||
|     private static final Logger LOGGER               = Logger.getLogger(ArmatureHelper.class.getName()); |     private static final Logger LOGGER               = Logger.getLogger(ArmatureHelper.class.getName()); | ||||||
| 
 | 
 | ||||||
|     public static final String  ARMETURE_NODE_MARKER = "armeture-node"; |     public static final String  ARMATURE_NODE_MARKER = "armature-node"; | ||||||
| 
 |  | ||||||
|     /** A map of bones and their old memory addresses. */ |  | ||||||
|     private Map<Bone, Long>     bonesOMAs            = new HashMap<Bone, Long>(); |  | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * This constructor parses the given blender version and stores the result. |      * This constructor parses the given blender version and stores the result. | ||||||
| @ -69,11 +66,11 @@ public class ArmatureHelper extends AbstractBlenderHelper { | |||||||
|      *  |      *  | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param fixUpAxis |      * @param blenderContext | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |      *            the blender context | ||||||
|      */ |      */ | ||||||
|     public ArmatureHelper(String blenderVersion, boolean fixUpAxis) { |     public ArmatureHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         super(blenderVersion, fixUpAxis); |         super(blenderVersion, blenderContext); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
| @ -93,23 +90,7 @@ public class ArmatureHelper extends AbstractBlenderHelper { | |||||||
|      */ |      */ | ||||||
|     public void buildBones(Long armatureObjectOMA, Structure boneStructure, Bone parent, List<Bone> result, Matrix4f objectToArmatureTransformation, BlenderContext blenderContext) throws BlenderFileException { |     public void buildBones(Long armatureObjectOMA, Structure boneStructure, Bone parent, List<Bone> result, Matrix4f objectToArmatureTransformation, BlenderContext blenderContext) throws BlenderFileException { | ||||||
|         BoneContext bc = new BoneContext(armatureObjectOMA, boneStructure, blenderContext); |         BoneContext bc = new BoneContext(armatureObjectOMA, boneStructure, blenderContext); | ||||||
|         bc.buildBone(result, bonesOMAs, objectToArmatureTransformation, blenderContext); |         bc.buildBone(result, objectToArmatureTransformation, blenderContext); | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * This method returns the old memory address of a bone. If the bone does |  | ||||||
|      * not exist in the blend file - zero is returned. |  | ||||||
|      *  |  | ||||||
|      * @param bone |  | ||||||
|      *            the bone whose old memory address we seek |  | ||||||
|      * @return the old memory address of the given bone |  | ||||||
|      */ |  | ||||||
|     public Long getBoneOMA(Bone bone) { |  | ||||||
|         Long result = bonesOMAs.get(bone); |  | ||||||
|         if (result == null) { |  | ||||||
|             result = Long.valueOf(0); |  | ||||||
|         } |  | ||||||
|         return result; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -2,7 +2,6 @@ package com.jme3.scene.plugins.blender.animations; | |||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; |  | ||||||
| 
 | 
 | ||||||
| import com.jme3.animation.Bone; | import com.jme3.animation.Bone; | ||||||
| import com.jme3.animation.Skeleton; | import com.jme3.animation.Skeleton; | ||||||
| @ -105,19 +104,16 @@ public class BoneContext { | |||||||
|      *  |      *  | ||||||
|      * @param bones |      * @param bones | ||||||
|      *            a list of bones where the newly created bone will be added |      *            a list of bones where the newly created bone will be added | ||||||
|      * @param boneOMAs |  | ||||||
|      *            the map between bone and its old memory address |  | ||||||
|      * @param objectToArmatureMatrix |      * @param objectToArmatureMatrix | ||||||
|      *            object to armature transformation matrix |      *            object to armature transformation matrix | ||||||
|      * @param blenderContext |      * @param blenderContext | ||||||
|      *            the blender context |      *            the blender context | ||||||
|      * @return newly created bone |      * @return newly created bone | ||||||
|      */ |      */ | ||||||
|     public Bone buildBone(List<Bone> bones, Map<Bone, Long> boneOMAs, Matrix4f objectToArmatureMatrix, BlenderContext blenderContext) { |     public Bone buildBone(List<Bone> bones, Matrix4f objectToArmatureMatrix, BlenderContext blenderContext) { | ||||||
|         Long boneOMA = boneStructure.getOldMemoryAddress(); |         Long boneOMA = boneStructure.getOldMemoryAddress(); | ||||||
|         bone = new Bone(boneName); |         bone = new Bone(boneName); | ||||||
|         bones.add(bone); |         bones.add(bone); | ||||||
|         boneOMAs.put(bone, boneOMA); |  | ||||||
|         blenderContext.addLoadedFeatures(boneOMA, boneName, boneStructure, bone); |         blenderContext.addLoadedFeatures(boneOMA, boneName, boneStructure, bone); | ||||||
| 
 | 
 | ||||||
|         Vector3f poseLocation = restMatrix.toTranslationVector(); |         Vector3f poseLocation = restMatrix.toTranslationVector(); | ||||||
| @ -132,7 +128,7 @@ public class BoneContext { | |||||||
| 
 | 
 | ||||||
|         bone.setBindTransforms(poseLocation, rotation, scale); |         bone.setBindTransforms(poseLocation, rotation, scale); | ||||||
|         for (BoneContext child : children) { |         for (BoneContext child : children) { | ||||||
|             bone.addChild(child.buildBone(bones, boneOMAs, objectToArmatureMatrix, blenderContext)); |             bone.addChild(child.buildBone(bones, objectToArmatureMatrix, blenderContext)); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return bone; |         return bone; | ||||||
|  | |||||||
| @ -88,15 +88,6 @@ public class Ipo { | |||||||
|         return bezierCurves[curveIndex].evaluate(frame, BezierCurve.Y_VALUE); |         return bezierCurves[curveIndex].evaluate(frame, BezierCurve.Y_VALUE); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * This method returns the curves amount. |  | ||||||
|      *  |  | ||||||
|      * @return the curves amount |  | ||||||
|      */ |  | ||||||
|     public int getCurvesAmount() { |  | ||||||
|         return bezierCurves.length; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This method returns the frame where last bezier triple center point of |      * This method returns the frame where last bezier triple center point of | ||||||
|      * the specified bezier curve is located. |      * the specified bezier curve is located. | ||||||
|  | |||||||
| @ -29,11 +29,11 @@ public class IpoHelper extends AbstractBlenderHelper { | |||||||
|      *  |      *  | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param fixUpAxis |      * @param blenderContext | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |      *            the blender context | ||||||
|      */ |      */ | ||||||
|     public IpoHelper(String blenderVersion, boolean fixUpAxis) { |     public IpoHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         super(blenderVersion, fixUpAxis); |         super(blenderVersion, blenderContext); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
| @ -189,11 +189,6 @@ public class IpoHelper extends AbstractBlenderHelper { | |||||||
|             return constValue; |             return constValue; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |  | ||||||
|         public int getCurvesAmount() { |  | ||||||
|             return 0; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         @Override |         @Override | ||||||
|         public BoneTrack calculateTrack(int boneIndex, Quaternion localQuaternionRotation, int startFrame, int stopFrame, int fps, boolean boneTrack) { |         public BoneTrack calculateTrack(int boneIndex, Quaternion localQuaternionRotation, int startFrame, int stopFrame, int fps, boolean boneTrack) { | ||||||
|             throw new IllegalStateException("Constatnt ipo object cannot be used for calculating bone tracks!"); |             throw new IllegalStateException("Constatnt ipo object cannot be used for calculating bone tracks!"); | ||||||
|  | |||||||
| @ -26,11 +26,11 @@ public class CameraHelper extends AbstractBlenderHelper { | |||||||
|      * different blender versions. |      * different blender versions. | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param fixUpAxis |      * @param blenderContext | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |      *            the blender context | ||||||
|      */ |      */ | ||||||
|     public CameraHelper(String blenderVersion, boolean fixUpAxis) { |     public CameraHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         super(blenderVersion, fixUpAxis); |         super(blenderVersion, blenderContext); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -1,7 +1,6 @@ | |||||||
| package com.jme3.scene.plugins.blender.constraints; | package com.jme3.scene.plugins.blender.constraints; | ||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Arrays; |  | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| @ -40,26 +39,16 @@ public class ConstraintHelper extends AbstractBlenderHelper { | |||||||
|     private static final Quaternion POS_PARLOC_SPACE_QUATERNION = new Quaternion(new float[] { FastMath.HALF_PI, 0, 0 }); |     private static final Quaternion POS_PARLOC_SPACE_QUATERNION = new Quaternion(new float[] { FastMath.HALF_PI, 0, 0 }); | ||||||
|     private static final Quaternion NEG_PARLOC_SPACE_QUATERNION = new Quaternion(new float[] { -FastMath.HALF_PI, 0, 0 }); |     private static final Quaternion NEG_PARLOC_SPACE_QUATERNION = new Quaternion(new float[] { -FastMath.HALF_PI, 0, 0 }); | ||||||
| 
 | 
 | ||||||
|     private BlenderContext          blenderContext; |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * Helper constructor. It's main task is to generate the affection |      * Helper constructor. | ||||||
|      * functions. These functions are common to all ConstraintHelper instances. |  | ||||||
|      * Unfortunately this constructor might grow large. If it becomes too large |  | ||||||
|      * - I shall consider refactoring. The constructor parses the given blender |  | ||||||
|      * version and stores the result. Some functionalities may differ in |  | ||||||
|      * different blender versions. |  | ||||||
|      *  |      *  | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param blenderContext |      * @param blenderContext | ||||||
|      *            the blender context |      *            the blender context | ||||||
|      * @param fixUpAxis |  | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |  | ||||||
|      */ |      */ | ||||||
|     public ConstraintHelper(String blenderVersion, BlenderContext blenderContext, boolean fixUpAxis) { |     public ConstraintHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         super(blenderVersion, fixUpAxis); |         super(blenderVersion, blenderContext); | ||||||
|         this.blenderContext = blenderContext; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
| @ -231,16 +220,14 @@ public class ConstraintHelper extends AbstractBlenderHelper { | |||||||
|      */ |      */ | ||||||
|     public Transform getTransform(Long oma, String subtargetName, Space space) { |     public Transform getTransform(Long oma, String subtargetName, Space space) { | ||||||
|         Spatial feature = (Spatial) blenderContext.getLoadedFeature(oma, LoadedFeatureDataType.LOADED_FEATURE); |         Spatial feature = (Spatial) blenderContext.getLoadedFeature(oma, LoadedFeatureDataType.LOADED_FEATURE); | ||||||
|         boolean isArmature = feature.getUserData(ArmatureHelper.ARMETURE_NODE_MARKER) != null; |         boolean isArmature = feature.getUserData(ArmatureHelper.ARMATURE_NODE_MARKER) != null; | ||||||
|         if (isArmature) { |         if (isArmature) { | ||||||
|             BoneContext targetBoneContext = blenderContext.getBoneByName(subtargetName); |             BoneContext targetBoneContext = blenderContext.getBoneByName(subtargetName); | ||||||
|             Bone bone = targetBoneContext.getBone(); |             Bone bone = targetBoneContext.getBone(); | ||||||
| 
 | 
 | ||||||
|             switch (space) { |             switch (space) { | ||||||
|                 case CONSTRAINT_SPACE_WORLD: |                 case CONSTRAINT_SPACE_WORLD: | ||||||
|                     Transform t = new Transform(bone.getModelSpacePosition(), bone.getModelSpaceRotation(), bone.getModelSpaceScale()); |                     return new Transform(bone.getModelSpacePosition(), bone.getModelSpaceRotation(), bone.getModelSpaceScale()); | ||||||
|                     System.out.println("A: " + Arrays.toString(t.getRotation().toAngles(null))); |  | ||||||
|                     return t; |  | ||||||
|                 case CONSTRAINT_SPACE_LOCAL: |                 case CONSTRAINT_SPACE_LOCAL: | ||||||
|                     Transform localTransform = new Transform(bone.getLocalPosition(), bone.getLocalRotation()); |                     Transform localTransform = new Transform(bone.getLocalPosition(), bone.getLocalRotation()); | ||||||
|                     localTransform.setScale(bone.getLocalScale()); |                     localTransform.setScale(bone.getLocalScale()); | ||||||
| @ -264,8 +251,9 @@ public class ConstraintHelper extends AbstractBlenderHelper { | |||||||
|                     if (bone.getParent() != null) { |                     if (bone.getParent() != null) { | ||||||
|                         Bone parent = bone.getParent(); |                         Bone parent = bone.getParent(); | ||||||
|                         parentLocalMatrix = this.toMatrix(parent.getLocalPosition(), parent.getLocalRotation(), parent.getLocalScale()); |                         parentLocalMatrix = this.toMatrix(parent.getLocalPosition(), parent.getLocalRotation(), parent.getLocalScale()); | ||||||
|                     } else {// we need to clone it because otherwise we could |                     } else { | ||||||
|                             // spoil the IDENTITY matrix |                         // we need to clone it because otherwise we could spoil | ||||||
|  |                         // the IDENTITY matrix | ||||||
|                         parentLocalMatrix = parentLocalMatrix.clone(); |                         parentLocalMatrix = parentLocalMatrix.clone(); | ||||||
|                     } |                     } | ||||||
|                     Matrix4f boneLocalMatrix = this.toMatrix(bone.getLocalPosition(), bone.getLocalRotation(), bone.getLocalScale()); |                     Matrix4f boneLocalMatrix = this.toMatrix(bone.getLocalPosition(), bone.getLocalRotation(), bone.getLocalScale()); | ||||||
| @ -309,7 +297,7 @@ public class ConstraintHelper extends AbstractBlenderHelper { | |||||||
|      */ |      */ | ||||||
|     public void applyTransform(Long oma, String subtargetName, Space space, Transform transform) { |     public void applyTransform(Long oma, String subtargetName, Space space, Transform transform) { | ||||||
|         Spatial feature = (Spatial) blenderContext.getLoadedFeature(oma, LoadedFeatureDataType.LOADED_FEATURE); |         Spatial feature = (Spatial) blenderContext.getLoadedFeature(oma, LoadedFeatureDataType.LOADED_FEATURE); | ||||||
|         boolean isArmature = feature.getUserData(ArmatureHelper.ARMETURE_NODE_MARKER) != null; |         boolean isArmature = feature.getUserData(ArmatureHelper.ARMATURE_NODE_MARKER) != null; | ||||||
|         if (isArmature) { |         if (isArmature) { | ||||||
|             Skeleton skeleton = blenderContext.getSkeleton(oma); |             Skeleton skeleton = blenderContext.getSkeleton(oma); | ||||||
|             BoneContext targetBoneContext = blenderContext.getBoneByName(subtargetName); |             BoneContext targetBoneContext = blenderContext.getBoneByName(subtargetName); | ||||||
| @ -324,7 +312,6 @@ public class ConstraintHelper extends AbstractBlenderHelper { | |||||||
|                     bone.setBindTransforms(transform.getTranslation(), transform.getRotation(), transform.getScale()); |                     bone.setBindTransforms(transform.getTranslation(), transform.getRotation(), transform.getScale()); | ||||||
|                     break; |                     break; | ||||||
|                 case CONSTRAINT_SPACE_WORLD: |                 case CONSTRAINT_SPACE_WORLD: | ||||||
|                     System.out.println("B: " + Arrays.toString(transform.getRotation().toAngles(null))); |  | ||||||
|                     Matrix4f boneMatrix = this.toMatrix(transform); |                     Matrix4f boneMatrix = this.toMatrix(transform); | ||||||
|                     Bone parent = bone.getParent(); |                     Bone parent = bone.getParent(); | ||||||
|                     if (parent != null) { |                     if (parent != null) { | ||||||
| @ -352,8 +339,9 @@ public class ConstraintHelper extends AbstractBlenderHelper { | |||||||
|                     if (bone.getParent() != null) { |                     if (bone.getParent() != null) { | ||||||
|                         parentLocalMatrix = this.toMatrix(bone.getParent().getLocalPosition(), bone.getParent().getLocalRotation(), bone.getParent().getLocalScale()); |                         parentLocalMatrix = this.toMatrix(bone.getParent().getLocalPosition(), bone.getParent().getLocalRotation(), bone.getParent().getLocalScale()); | ||||||
|                         parentLocalMatrix.invertLocal(); |                         parentLocalMatrix.invertLocal(); | ||||||
|                     } else {// we need to clone it because otherwise we could |                     } else { | ||||||
|                             // spoil the IDENTITY matrix |                         // we need to clone it because otherwise we could | ||||||
|  |                         // spoil the IDENTITY matrix | ||||||
|                         parentLocalMatrix = parentLocalMatrix.clone(); |                         parentLocalMatrix = parentLocalMatrix.clone(); | ||||||
|                     } |                     } | ||||||
|                     Matrix4f m = this.toMatrix(transform.getTranslation(), transform.getRotation(), transform.getScale()); |                     Matrix4f m = this.toMatrix(transform.getTranslation(), transform.getRotation(), transform.getScale()); | ||||||
|  | |||||||
| @ -43,8 +43,6 @@ public class SimulationNode { | |||||||
|     private String                    name; |     private String                    name; | ||||||
|     /** A list of children for the node (either bones or child spatials). */ |     /** A list of children for the node (either bones or child spatials). */ | ||||||
|     private List<SimulationNode>      children     = new ArrayList<SimulationNode>(); |     private List<SimulationNode>      children     = new ArrayList<SimulationNode>(); | ||||||
|     /** A virtual track for each of the nodes. */ |  | ||||||
|     private Map<String, VirtualTrack> virtualTrack = new HashMap<String, VirtualTrack>(); |  | ||||||
|     /** A list of constraints that the current node has. */ |     /** A list of constraints that the current node has. */ | ||||||
|     private List<Constraint>          constraints; |     private List<Constraint>          constraints; | ||||||
|     /** A list of node's animations. */ |     /** A list of node's animations. */ | ||||||
| @ -91,7 +89,7 @@ public class SimulationNode { | |||||||
|      */ |      */ | ||||||
|     private SimulationNode(Long featureOMA, BlenderContext blenderContext, boolean rootNode) { |     private SimulationNode(Long featureOMA, BlenderContext blenderContext, boolean rootNode) { | ||||||
|         Node spatial = (Node) blenderContext.getLoadedFeature(featureOMA, LoadedFeatureDataType.LOADED_FEATURE); |         Node spatial = (Node) blenderContext.getLoadedFeature(featureOMA, LoadedFeatureDataType.LOADED_FEATURE); | ||||||
|         if (spatial.getUserData(ArmatureHelper.ARMETURE_NODE_MARKER) != null) { |         if (spatial.getUserData(ArmatureHelper.ARMATURE_NODE_MARKER) != null) { | ||||||
|             this.skeleton = blenderContext.getSkeleton(featureOMA); |             this.skeleton = blenderContext.getSkeleton(featureOMA); | ||||||
| 
 | 
 | ||||||
|             Node nodeWithAnimationControl = blenderContext.getControlledNode(skeleton); |             Node nodeWithAnimationControl = blenderContext.getControlledNode(skeleton); | ||||||
| @ -206,7 +204,6 @@ public class SimulationNode { | |||||||
|                     float maxTime = animationTimeBoundaries[1]; |                     float maxTime = animationTimeBoundaries[1]; | ||||||
| 
 | 
 | ||||||
|                     VirtualTrack vTrack = new VirtualTrack(maxFrame, maxTime); |                     VirtualTrack vTrack = new VirtualTrack(maxFrame, maxTime); | ||||||
|                     virtualTrack.put(animation.getName(), vTrack); |  | ||||||
|                     for (Track track : animation.getTracks()) { |                     for (Track track : animation.getTracks()) { | ||||||
|                         for (int frame = 0; frame < maxFrame; ++frame) { |                         for (int frame = 0; frame < maxFrame; ++frame) { | ||||||
|                             spatial.setLocalTranslation(((SpatialTrack) track).getTranslations()[frame]); |                             spatial.setLocalTranslation(((SpatialTrack) track).getTranslations()[frame]); | ||||||
| @ -260,11 +257,11 @@ public class SimulationNode { | |||||||
|                     Map<Integer, VirtualTrack> tracks = new HashMap<Integer, VirtualTrack>(); |                     Map<Integer, VirtualTrack> tracks = new HashMap<Integer, VirtualTrack>(); | ||||||
|                     Map<Integer, Transform> previousTransforms = new HashMap<Integer, Transform>(); |                     Map<Integer, Transform> previousTransforms = new HashMap<Integer, Transform>(); | ||||||
|                     for (int frame = 0; frame < maxFrame; ++frame) { |                     for (int frame = 0; frame < maxFrame; ++frame) { | ||||||
|                         this.reset();// this MUST be done here, otherwise |                         // this MUST be done here, otherwise setting next frame of animation will | ||||||
|                                      // setting next frame of animation will |                         // lead to possible errors | ||||||
|                                      // lead to possible errors |                         this.reset(); | ||||||
|                         // first set proper time for all bones in all the tracks |                          | ||||||
|                         // ... |                         // first set proper time for all bones in all the tracks ... | ||||||
|                         for (Track track : animation.getTracks()) { |                         for (Track track : animation.getTracks()) { | ||||||
|                             float time = ((BoneTrack) track).getTimes()[frame]; |                             float time = ((BoneTrack) track).getTimes()[frame]; | ||||||
|                             Integer boneIndex = ((BoneTrack) track).getTargetBoneIndex(); |                             Integer boneIndex = ((BoneTrack) track).getTargetBoneIndex(); | ||||||
|  | |||||||
| @ -5,12 +5,32 @@ import com.jme3.scene.plugins.blender.BlenderContext; | |||||||
| import com.jme3.scene.plugins.blender.BlenderContext.LoadedFeatureDataType; | import com.jme3.scene.plugins.blender.BlenderContext.LoadedFeatureDataType; | ||||||
| import com.jme3.scene.plugins.blender.file.Structure; | import com.jme3.scene.plugins.blender.file.Structure; | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * A base class for all constraint definitions. | ||||||
|  |  *  | ||||||
|  |  * @author Marcin Roguski (Kaelthas) | ||||||
|  |  */ | ||||||
| public abstract class ConstraintDefinition { | public abstract class ConstraintDefinition { | ||||||
|  |     /** Constraints flag. Used to load user's options applied to the constraint. */ | ||||||
|     protected int          flag; |     protected int          flag; | ||||||
|  |     /** The constraint's owner. Loaded during runtime. */ | ||||||
|     private Object         owner; |     private Object         owner; | ||||||
|  |     /** The blender context. */ | ||||||
|     private BlenderContext blenderContext; |     private BlenderContext blenderContext; | ||||||
|  |     /** The constraint's owner OMA. */ | ||||||
|     private Long           ownerOMA; |     private Long           ownerOMA; | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Loads a constraint definition based on the constraint definition | ||||||
|  |      * structure. | ||||||
|  |      *  | ||||||
|  |      * @param constraintData | ||||||
|  |      *            the constraint definition structure | ||||||
|  |      * @param ownerOMA | ||||||
|  |      *            the constraint's owner OMA | ||||||
|  |      * @param blenderContext | ||||||
|  |      *            the blender context | ||||||
|  |      */ | ||||||
|     public ConstraintDefinition(Structure constraintData, Long ownerOMA, BlenderContext blenderContext) { |     public ConstraintDefinition(Structure constraintData, Long ownerOMA, BlenderContext blenderContext) { | ||||||
|         if (constraintData != null) {// Null constraint has no data |         if (constraintData != null) {// Null constraint has no data | ||||||
|             Number flag = (Number) constraintData.getFieldValue("flag"); |             Number flag = (Number) constraintData.getFieldValue("flag"); | ||||||
| @ -29,7 +49,7 @@ public abstract class ConstraintDefinition { | |||||||
|      *  |      *  | ||||||
|      * @return the owner of the constraint or null if none is set |      * @return the owner of the constraint or null if none is set | ||||||
|      */ |      */ | ||||||
|     public Object getOwner() { |     protected Object getOwner() { | ||||||
|         if (ownerOMA != null && owner == null) { |         if (ownerOMA != null && owner == null) { | ||||||
|             owner = blenderContext.getLoadedFeature(ownerOMA, LoadedFeatureDataType.LOADED_FEATURE); |             owner = blenderContext.getLoadedFeature(ownerOMA, LoadedFeatureDataType.LOADED_FEATURE); | ||||||
|             if (owner == null) { |             if (owner == null) { | ||||||
| @ -39,11 +59,28 @@ public abstract class ConstraintDefinition { | |||||||
|         return owner; |         return owner; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * @return <b>true</b> if the definition is implemented and <b>false</b> | ||||||
|  |      *         otherwise | ||||||
|  |      */ | ||||||
|     public boolean isImplemented() { |     public boolean isImplemented() { | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * @return the type name of the constraint | ||||||
|  |      */ | ||||||
|     public abstract String getConstraintTypeName(); |     public abstract String getConstraintTypeName(); | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Bakes the constraint for the current feature (bone or spatial) position. | ||||||
|  |      *  | ||||||
|  |      * @param ownerTransform | ||||||
|  |      *            the input transform (here the result is stored) | ||||||
|  |      * @param targetTransform | ||||||
|  |      *            the target transform used by some of the constraints | ||||||
|  |      * @param influence | ||||||
|  |      *            the influence of the constraint (from range <0; 1>) | ||||||
|  |      */ | ||||||
|     public abstract void bake(Transform ownerTransform, Transform targetTransform, float influence); |     public abstract void bake(Transform ownerTransform, Transform targetTransform, float influence); | ||||||
| } | } | ||||||
|  | |||||||
| @ -89,11 +89,11 @@ public class CurvesHelper extends AbstractBlenderHelper { | |||||||
|      * different blender versions. |      * different blender versions. | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param fixUpAxis |      * @param blenderContext | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |      *            the blender context | ||||||
|      */ |      */ | ||||||
|     public CurvesHelper(String blenderVersion, boolean fixUpAxis) { |     public CurvesHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         super(blenderVersion, fixUpAxis); |         super(blenderVersion, blenderContext); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -38,7 +38,7 @@ import java.util.Map; | |||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * The data block containing the description of the file. |  * The data block containing the description of the file. | ||||||
|  * @author Marcin Roguski |  * @author Marcin Roguski (Kaelthas) | ||||||
|  */ |  */ | ||||||
| public class DnaBlockData { | public class DnaBlockData { | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -50,26 +50,6 @@ public class DynamicArray<T> implements Cloneable { | |||||||
|      */ |      */ | ||||||
|     private int[] tableSizes; |     private int[] tableSizes; | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * Constructor. Builds an empty array of the specified sizes. |  | ||||||
|      * @param tableSizes |  | ||||||
|      *            the sizes of the table |  | ||||||
|      * @throws BlenderFileException |  | ||||||
|      *             an exception is thrown if one of the sizes is not a positive number |  | ||||||
|      */ |  | ||||||
|     @SuppressWarnings("unchecked") |  | ||||||
|     public DynamicArray(int[] tableSizes) throws BlenderFileException { |  | ||||||
|         this.tableSizes = tableSizes; |  | ||||||
|         int totalSize = 1; |  | ||||||
|         for (int size : tableSizes) { |  | ||||||
|             if (size <= 0) { |  | ||||||
|                 throw new BlenderFileException("The size of the table must be positive!"); |  | ||||||
|             } |  | ||||||
|             totalSize *= size; |  | ||||||
|         } |  | ||||||
|         this.array = (T[]) new Object[totalSize]; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * Constructor. Builds an empty array of the specified sizes. |      * Constructor. Builds an empty array of the specified sizes. | ||||||
|      * @param tableSizes |      * @param tableSizes | ||||||
|  | |||||||
| @ -281,7 +281,7 @@ class Field implements Cloneable { | |||||||
|      * This method builds the full name of the field (with function, pointer and table indications). |      * This method builds the full name of the field (with function, pointer and table indications). | ||||||
|      * @return the full name of the field |      * @return the full name of the field | ||||||
|      */ |      */ | ||||||
|     public String getFullName() { |     /*package*/ String getFullName() { | ||||||
|         StringBuilder result = new StringBuilder(); |         StringBuilder result = new StringBuilder(); | ||||||
|         if (function) { |         if (function) { | ||||||
|             result.append('('); |             result.append('('); | ||||||
|  | |||||||
| @ -129,14 +129,6 @@ public class FileBlockHeader { | |||||||
|         return size; |         return size; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * This method returns the memory address. |  | ||||||
|      * @return the memory address |  | ||||||
|      */ |  | ||||||
|     public long getOldMemoryAddress() { |  | ||||||
|         return oldMemoryAddress; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This method returns the sdna index. |      * This method returns the sdna index. | ||||||
|      * @return the sdna index |      * @return the sdna index | ||||||
|  | |||||||
| @ -206,16 +206,6 @@ public class Structure implements Cloneable { | |||||||
|         return fields.length; |         return fields.length; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * This method returns the field name of the given index. |  | ||||||
|      * @param fieldIndex |  | ||||||
|      *            the index of the field |  | ||||||
|      * @return the field name of the given index |  | ||||||
|      */ |  | ||||||
|     public String getFieldName(int fieldIndex) { |  | ||||||
|         return fields[fieldIndex].name; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This method returns the full field name of the given index. |      * This method returns the full field name of the given index. | ||||||
|      * @param fieldIndex |      * @param fieldIndex | ||||||
| @ -278,10 +268,9 @@ public class Structure implements Cloneable { | |||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * This enum enumerates all known data types that can be found in the blend file. |      * This enum enumerates all known data types that can be found in the blend file. | ||||||
|      * @author Marcin Roguski |      * @author Marcin Roguski (Kaelthas) | ||||||
|      */ |      */ | ||||||
|     /* package */ |     /* package */ static enum DataType { | ||||||
|     static enum DataType { |  | ||||||
| 
 | 
 | ||||||
|         CHARACTER, SHORT, INTEGER, LONG, FLOAT, DOUBLE, VOID, STRUCTURE, POINTER; |         CHARACTER, SHORT, INTEGER, LONG, FLOAT, DOUBLE, VOID, STRUCTURE, POINTER; | ||||||
|         /** The map containing the known primary types. */ |         /** The map containing the known primary types. */ | ||||||
|  | |||||||
| @ -60,11 +60,11 @@ public class LightHelper extends AbstractBlenderHelper { | |||||||
|      * different blender versions. |      * different blender versions. | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param fixUpAxis |      * @param blenderContext | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |      *            the blender context | ||||||
|      */ |      */ | ||||||
|     public LightHelper(String blenderVersion, boolean fixUpAxis) { |     public LightHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         super(blenderVersion, fixUpAxis); |         super(blenderVersion, blenderContext); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public LightNode toLight(Structure structure, BlenderContext blenderContext) throws BlenderFileException { |     public LightNode toLight(Structure structure, BlenderContext blenderContext) throws BlenderFileException { | ||||||
|  | |||||||
| @ -164,6 +164,18 @@ public final class MaterialContext { | |||||||
|         this.transparent = transparent; |         this.transparent = transparent; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Applies material to a given geometry. | ||||||
|  |      *  | ||||||
|  |      * @param geometry | ||||||
|  |      *            the geometry | ||||||
|  |      * @param geometriesOMA | ||||||
|  |      *            the geometries OMA | ||||||
|  |      * @param userDefinedUVCoordinates | ||||||
|  |      *            UV coords defined by user | ||||||
|  |      * @param blenderContext | ||||||
|  |      *            the blender context | ||||||
|  |      */ | ||||||
|     public void applyMaterial(Geometry geometry, Long geometriesOMA, List<Vector2f> userDefinedUVCoordinates, BlenderContext blenderContext) { |     public void applyMaterial(Geometry geometry, Long geometriesOMA, List<Vector2f> userDefinedUVCoordinates, BlenderContext blenderContext) { | ||||||
|         Material material = null; |         Material material = null; | ||||||
|         if (shadeless) { |         if (shadeless) { | ||||||
| @ -326,13 +338,6 @@ public final class MaterialContext { | |||||||
|         this.faceCullMode = faceCullMode; |         this.faceCullMode = faceCullMode; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * @return the face cull mode |  | ||||||
|      */ |  | ||||||
|     public FaceCullMode getFaceCullMode() { |  | ||||||
|         return faceCullMode; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This method returns the diffuse color. |      * This method returns the diffuse color. | ||||||
|      *  |      *  | ||||||
|  | |||||||
| @ -31,9 +31,15 @@ | |||||||
|  */ |  */ | ||||||
| package com.jme3.scene.plugins.blender.materials; | package com.jme3.scene.plugins.blender.materials; | ||||||
| 
 | 
 | ||||||
|  | import java.nio.ByteBuffer; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.logging.Level; | ||||||
|  | import java.util.logging.Logger; | ||||||
|  | 
 | ||||||
| import com.jme3.asset.BlenderKey.FeaturesToLoad; | import com.jme3.asset.BlenderKey.FeaturesToLoad; | ||||||
| import com.jme3.material.MatParam; | import com.jme3.material.MatParam; | ||||||
| import com.jme3.material.MatParamTexture; |  | ||||||
| import com.jme3.material.Material; | import com.jme3.material.Material; | ||||||
| import com.jme3.math.ColorRGBA; | import com.jme3.math.ColorRGBA; | ||||||
| import com.jme3.math.FastMath; | import com.jme3.math.FastMath; | ||||||
| @ -48,13 +54,6 @@ import com.jme3.texture.Image; | |||||||
| import com.jme3.texture.Image.Format; | import com.jme3.texture.Image.Format; | ||||||
| import com.jme3.texture.Texture; | import com.jme3.texture.Texture; | ||||||
| import com.jme3.util.BufferUtils; | import com.jme3.util.BufferUtils; | ||||||
| import java.nio.ByteBuffer; |  | ||||||
| import java.util.HashMap; |  | ||||||
| import java.util.List; |  | ||||||
| import java.util.Map; |  | ||||||
| import java.util.Map.Entry; |  | ||||||
| import java.util.logging.Level; |  | ||||||
| import java.util.logging.Logger; |  | ||||||
| 
 | 
 | ||||||
| public class MaterialHelper extends AbstractBlenderHelper { | public class MaterialHelper extends AbstractBlenderHelper { | ||||||
|     private static final Logger              LOGGER                = Logger.getLogger(MaterialHelper.class.getName()); |     private static final Logger              LOGGER                = Logger.getLogger(MaterialHelper.class.getName()); | ||||||
| @ -93,11 +92,11 @@ public class MaterialHelper extends AbstractBlenderHelper { | |||||||
|      *  |      *  | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param fixUpAxis |      * @param blenderContext | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |      *            the blender context | ||||||
|      */ |      */ | ||||||
|     public MaterialHelper(String blenderVersion, boolean fixUpAxis) { |     public MaterialHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         super(blenderVersion, false); |         super(blenderVersion, blenderContext); | ||||||
|         // setting alpha masks |         // setting alpha masks | ||||||
|         alphaMasks.put(ALPHA_MASK_NONE, new IAlphaMask() { |         alphaMasks.put(ALPHA_MASK_NONE, new IAlphaMask() { | ||||||
|             public void setImageSize(int width, int height) { |             public void setImageSize(int width, int height) { | ||||||
| @ -174,49 +173,6 @@ public class MaterialHelper extends AbstractBlenderHelper { | |||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * This method returns a material similar to the one given but without textures. If the material has no textures it is not cloned but |  | ||||||
|      * returned itself. |  | ||||||
|      *  |  | ||||||
|      * @param material |  | ||||||
|      *            a material to be cloned without textures |  | ||||||
|      * @param imageType |  | ||||||
|      *            type of image defined by blender; the constants are defined in TextureHelper |  | ||||||
|      * @return material without textures of a specified type |  | ||||||
|      */ |  | ||||||
|     public Material getNonTexturedMaterial(Material material, int imageType) { |  | ||||||
|         String[] textureParamNames = new String[] { TEXTURE_TYPE_DIFFUSE, TEXTURE_TYPE_NORMAL, TEXTURE_TYPE_GLOW, TEXTURE_TYPE_SPECULAR, TEXTURE_TYPE_ALPHA }; |  | ||||||
|         Map<String, Texture> textures = new HashMap<String, Texture>(textureParamNames.length); |  | ||||||
|         for (String textureParamName : textureParamNames) { |  | ||||||
|             MatParamTexture matParamTexture = material.getTextureParam(textureParamName); |  | ||||||
|             if (matParamTexture != null) { |  | ||||||
|                 textures.put(textureParamName, matParamTexture.getTextureValue()); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         if (textures.isEmpty()) { |  | ||||||
|             return material; |  | ||||||
|         } else { |  | ||||||
|             // clear all textures first so that wo de not waste resources cloning them |  | ||||||
|             for (Entry<String, Texture> textureParamName : textures.entrySet()) { |  | ||||||
|                 String name = textureParamName.getValue().getName(); |  | ||||||
|                 try { |  | ||||||
|                     int type = Integer.parseInt(name); |  | ||||||
|                     if (type == imageType) { |  | ||||||
|                         material.clearParam(textureParamName.getKey()); |  | ||||||
|                     } |  | ||||||
|                 } catch (NumberFormatException e) { |  | ||||||
|                     LOGGER.log(Level.WARNING, "The name of the texture does not contain the texture type value! {0} will not be removed!", name); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             Material result = material.clone(); |  | ||||||
|             // put the textures back in place |  | ||||||
|             for (Entry<String, Texture> textureEntry : textures.entrySet()) { |  | ||||||
|                 material.setTexture(textureEntry.getKey(), textureEntry.getValue()); |  | ||||||
|             } |  | ||||||
|             return result; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This method converts the given material into particles-usable material. |      * This method converts the given material into particles-usable material. | ||||||
|      * The texture and glow color are being copied. |      * The texture and glow color are being copied. | ||||||
| @ -269,53 +225,6 @@ public class MaterialHelper extends AbstractBlenderHelper { | |||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * This method indicates if the material has any kind of texture. |  | ||||||
|      *  |  | ||||||
|      * @param material |  | ||||||
|      *            the material |  | ||||||
|      * @return <b>true</b> if the texture exists in the material and <B>false</b> otherwise |  | ||||||
|      */ |  | ||||||
|     public boolean hasTexture(Material material) { |  | ||||||
|         if (material != null) { |  | ||||||
|             if (material.getTextureParam(TEXTURE_TYPE_ALPHA) != null) { |  | ||||||
|                 return true; |  | ||||||
|             } |  | ||||||
|             if (material.getTextureParam(TEXTURE_TYPE_COLOR) != null) { |  | ||||||
|                 return true; |  | ||||||
|             } |  | ||||||
|             if (material.getTextureParam(TEXTURE_TYPE_DIFFUSE) != null) { |  | ||||||
|                 return true; |  | ||||||
|             } |  | ||||||
|             if (material.getTextureParam(TEXTURE_TYPE_GLOW) != null) { |  | ||||||
|                 return true; |  | ||||||
|             } |  | ||||||
|             if (material.getTextureParam(TEXTURE_TYPE_NORMAL) != null) { |  | ||||||
|                 return true; |  | ||||||
|             } |  | ||||||
|             if (material.getTextureParam(TEXTURE_TYPE_SPECULAR) != null) { |  | ||||||
|                 return true; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * This method indicates if the material has a texture of a specified type. |  | ||||||
|      *  |  | ||||||
|      * @param material |  | ||||||
|      *            the material |  | ||||||
|      * @param textureType |  | ||||||
|      *            the type of the texture |  | ||||||
|      * @return <b>true</b> if the texture exists in the material and <B>false</b> otherwise |  | ||||||
|      */ |  | ||||||
|     public boolean hasTexture(Material material, String textureType) { |  | ||||||
|         if (material != null) { |  | ||||||
|             return material.getTextureParam(textureType) != null; |  | ||||||
|         } |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This method returns the table of materials connected to the specified structure. The given structure can be of any type (ie. mesh or |      * This method returns the table of materials connected to the specified structure. The given structure can be of any type (ie. mesh or | ||||||
|      * curve) but needs to have 'mat' field/ |      * curve) but needs to have 'mat' field/ | ||||||
|  | |||||||
| @ -12,6 +12,11 @@ import com.jme3.math.Vector2f; | |||||||
| import com.jme3.math.Vector3f; | import com.jme3.math.Vector3f; | ||||||
| import com.jme3.util.BufferUtils; | import com.jme3.util.BufferUtils; | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * A builder class for meshes. | ||||||
|  |  *  | ||||||
|  |  * @author Marcin Roguski (Kaelthas) | ||||||
|  |  */ | ||||||
| /*package*/class MeshBuilder { | /*package*/class MeshBuilder { | ||||||
|     private static final Logger                       LOGGER          = Logger.getLogger(MeshBuilder.class.getName()); |     private static final Logger                       LOGGER          = Logger.getLogger(MeshBuilder.class.getName()); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -18,8 +18,6 @@ public class MeshContext { | |||||||
|     private Map<Integer, Geometry>                    geometries       = new HashMap<Integer, Geometry>(); |     private Map<Integer, Geometry>                    geometries       = new HashMap<Integer, Geometry>(); | ||||||
|     /** The vertex reference map. */ |     /** The vertex reference map. */ | ||||||
|     private Map<Integer, Map<Integer, List<Integer>>> vertexReferenceMap; |     private Map<Integer, Map<Integer, List<Integer>>> vertexReferenceMap; | ||||||
|     /** The UV-coordinates for each of the geometries. */ |  | ||||||
|     private Map<Geometry, VertexBuffer>               uvCoordinates    = new HashMap<Geometry, VertexBuffer>(); |  | ||||||
|     /** Bind buffer for vertices is stored here and applied when required. */ |     /** Bind buffer for vertices is stored here and applied when required. */ | ||||||
|     private Map<Integer, VertexBuffer>                bindPoseBuffer   = new HashMap<Integer, VertexBuffer>(); |     private Map<Integer, VertexBuffer>                bindPoseBuffer   = new HashMap<Integer, VertexBuffer>(); | ||||||
|     /** Bind buffer for normals is stored here and applied when required. */ |     /** Bind buffer for normals is stored here and applied when required. */ | ||||||
| @ -81,29 +79,6 @@ public class MeshContext { | |||||||
|         this.vertexReferenceMap = vertexReferenceMap; |         this.vertexReferenceMap = vertexReferenceMap; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * This method adds the mesh's UV-coordinates. |  | ||||||
|      *  |  | ||||||
|      * @param geometry |  | ||||||
|      *            the mesh that has the UV-coordinates |  | ||||||
|      * @param vertexBuffer |  | ||||||
|      *            the mesh's UV-coordinates |  | ||||||
|      */ |  | ||||||
|     public void addUVCoordinates(Geometry geometry, VertexBuffer vertexBuffer) { |  | ||||||
|         uvCoordinates.put(geometry, vertexBuffer); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * This method returns the mesh's UV-coordinates. |  | ||||||
|      *  |  | ||||||
|      * @param geometry |  | ||||||
|      *            the mesh |  | ||||||
|      * @return the mesh's UV-coordinates |  | ||||||
|      */ |  | ||||||
|     public VertexBuffer getUVCoordinates(Geometry geometry) { |  | ||||||
|         return uvCoordinates.get(geometry); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This method sets the bind buffer for vertices. |      * This method sets the bind buffer for vertices. | ||||||
|      *  |      *  | ||||||
|  | |||||||
| @ -71,11 +71,11 @@ public class MeshHelper extends AbstractBlenderHelper { | |||||||
|      *  |      *  | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param fixUpAxis |      * @param blenderContext | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |      *            the blender context | ||||||
|      */ |      */ | ||||||
|     public MeshHelper(String blenderVersion, boolean fixUpAxis) { |     public MeshHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         super(blenderVersion, fixUpAxis); |         super(blenderVersion, blenderContext); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -28,6 +28,7 @@ import com.jme3.scene.VertexBuffer.Usage; | |||||||
| import com.jme3.scene.plugins.blender.BlenderContext; | import com.jme3.scene.plugins.blender.BlenderContext; | ||||||
| import com.jme3.scene.plugins.blender.BlenderContext.LoadedFeatureDataType; | import com.jme3.scene.plugins.blender.BlenderContext.LoadedFeatureDataType; | ||||||
| import com.jme3.scene.plugins.blender.animations.ArmatureHelper; | import com.jme3.scene.plugins.blender.animations.ArmatureHelper; | ||||||
|  | import com.jme3.scene.plugins.blender.animations.BoneContext; | ||||||
| import com.jme3.scene.plugins.blender.exceptions.BlenderFileException; | import com.jme3.scene.plugins.blender.exceptions.BlenderFileException; | ||||||
| import com.jme3.scene.plugins.blender.file.FileBlockHeader; | import com.jme3.scene.plugins.blender.file.FileBlockHeader; | ||||||
| import com.jme3.scene.plugins.blender.file.Pointer; | import com.jme3.scene.plugins.blender.file.Pointer; | ||||||
| @ -72,9 +73,7 @@ import com.jme3.util.BufferUtils; | |||||||
|      */ |      */ | ||||||
|     public ArmatureModifier(Structure objectStructure, Structure modifierStructure, BlenderContext blenderContext) throws BlenderFileException { |     public ArmatureModifier(Structure objectStructure, Structure modifierStructure, BlenderContext blenderContext) throws BlenderFileException { | ||||||
|         Structure meshStructure = ((Pointer) objectStructure.getFieldValue("data")).fetchData(blenderContext.getInputStream()).get(0); |         Structure meshStructure = ((Pointer) objectStructure.getFieldValue("data")).fetchData(blenderContext.getInputStream()).get(0); | ||||||
|         Pointer pDvert = (Pointer) meshStructure.getFieldValue("dvert");// dvert |         Pointer pDvert = (Pointer) meshStructure.getFieldValue("dvert");// dvert = DeformVERTices | ||||||
|                                                                         // = |  | ||||||
|                                                                         // DeformVERTices |  | ||||||
| 
 | 
 | ||||||
|         // if pDvert==null then there are not vertex groups and no need to load |         // if pDvert==null then there are not vertex groups and no need to load | ||||||
|         // skeleton (untill bone envelopes are supported) |         // skeleton (untill bone envelopes are supported) | ||||||
| @ -162,9 +161,12 @@ import com.jme3.util.BufferUtils; | |||||||
| 
 | 
 | ||||||
|                 // store the animation data for each bone |                 // store the animation data for each bone | ||||||
|                 for (Bone bone : bones) { |                 for (Bone bone : bones) { | ||||||
|                     Long boneOma = armatureHelper.getBoneOMA(bone); |                     if(bone.getName().length() > 0) { | ||||||
|                     if (boneOma != null) { |                         BoneContext boneContext = blenderContext.getBoneContext(bone); | ||||||
|                         blenderContext.setAnimData(boneOma, animData); |                         Long boneOma = boneContext.getBoneOma(); | ||||||
|  |                         if (boneOma != null) { | ||||||
|  |                             blenderContext.setAnimData(boneOma, animData); | ||||||
|  |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } else { |             } else { | ||||||
| @ -300,39 +302,18 @@ import com.jme3.util.BufferUtils; | |||||||
| 
 | 
 | ||||||
|         if (pDvert.isNotNull()) {// assigning weights and bone indices |         if (pDvert.isNotNull()) {// assigning weights and bone indices | ||||||
|             boolean warnAboutTooManyVertexWeights = false; |             boolean warnAboutTooManyVertexWeights = false; | ||||||
|             List<Structure> dverts = pDvert.fetchData(blenderContext.getInputStream());// dverts.size() |             // dverts.size() = verticesAmount (one dvert per vertex in blender) | ||||||
|                                                                                        // == |             List<Structure> dverts = pDvert.fetchData(blenderContext.getInputStream()); | ||||||
|                                                                                        // verticesAmount |  | ||||||
|                                                                                        // (one |  | ||||||
|                                                                                        // dvert |  | ||||||
|                                                                                        // per |  | ||||||
|                                                                                        // vertex |  | ||||||
|                                                                                        // in |  | ||||||
|                                                                                        // blender) |  | ||||||
|             int vertexIndex = 0; |             int vertexIndex = 0; | ||||||
|             // use tree map to sort weights from the lowest to the highest ones |             // use tree map to sort weights from the lowest to the highest ones | ||||||
|             TreeMap<Float, Integer> weightToIndexMap = new TreeMap<Float, Integer>(); |             TreeMap<Float, Integer> weightToIndexMap = new TreeMap<Float, Integer>(); | ||||||
| 
 | 
 | ||||||
|             for (Structure dvert : dverts) { |             for (Structure dvert : dverts) { | ||||||
|                 List<Integer> vertexIndices = vertexReferenceMap.get(Integer.valueOf(vertexIndex));// we |                 //we fetch the referenced vertices here | ||||||
|                                                                                                    // fetch |                 List<Integer> vertexIndices = vertexReferenceMap.get(Integer.valueOf(vertexIndex)); | ||||||
|                                                                                                    // the |  | ||||||
|                                                                                                    // referenced |  | ||||||
|                                                                                                    // vertices |  | ||||||
|                                                                                                    // here |  | ||||||
|                 if (vertexIndices != null) { |                 if (vertexIndices != null) { | ||||||
|                     int totweight = ((Number) dvert.getFieldValue("totweight")).intValue();// total |                     // total amount of wights assigned to the vertex (max. 4 in JME) | ||||||
|                                                                                            // amount |                     int totweight = ((Number) dvert.getFieldValue("totweight")).intValue(); | ||||||
|                                                                                            // of |  | ||||||
|                                                                                            // weights |  | ||||||
|                                                                                            // assignet |  | ||||||
|                                                                                            // to |  | ||||||
|                                                                                            // the |  | ||||||
|                                                                                            // vertex |  | ||||||
|                                                                                            // (max. |  | ||||||
|                                                                                            // 4 |  | ||||||
|                                                                                            // in |  | ||||||
|                                                                                            // JME) |  | ||||||
|                     Pointer pDW = (Pointer) dvert.getFieldValue("dw"); |                     Pointer pDW = (Pointer) dvert.getFieldValue("dw"); | ||||||
|                     if (totweight > 0 && groupToBoneIndexMap != null) { |                     if (totweight > 0 && groupToBoneIndexMap != null) { | ||||||
|                         weightToIndexMap.clear(); |                         weightToIndexMap.clear(); | ||||||
| @ -448,9 +429,4 @@ import com.jme3.util.BufferUtils; | |||||||
|         } |         } | ||||||
|         weightsFloatData.rewind(); |         weightsFloatData.rewind(); | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     public String getType() { |  | ||||||
|         return Modifier.ARMATURE_MODIFIER_DATA; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -239,9 +239,4 @@ import java.util.logging.Logger; | |||||||
|         } |         } | ||||||
|         return node; |         return node; | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     public String getType() { |  | ||||||
|         return ARRAY_MODIFIER_DATA; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -192,9 +192,4 @@ import com.jme3.scene.plugins.blender.objects.ObjectHelper; | |||||||
|         } |         } | ||||||
|         return node; |         return node; | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     public String getType() { |  | ||||||
|         return Modifier.MIRROR_MODIFIER_DATA; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -41,13 +41,6 @@ public abstract class Modifier { | |||||||
|      */ |      */ | ||||||
|     public abstract Node apply(Node node, BlenderContext blenderContext); |     public abstract Node apply(Node node, BlenderContext blenderContext); | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * This method returns blender's type of modifier. |  | ||||||
|      *  |  | ||||||
|      * @return blender's type of modifier |  | ||||||
|      */ |  | ||||||
|     public abstract String getType(); |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * Determines if the modifier can be applied multiple times over one mesh. |      * Determines if the modifier can be applied multiple times over one mesh. | ||||||
|      * At this moment only armature and object animation modifiers cannot be |      * At this moment only armature and object animation modifiers cannot be | ||||||
|  | |||||||
| @ -61,11 +61,11 @@ public class ModifierHelper extends AbstractBlenderHelper { | |||||||
|      *  |      *  | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param fixUpAxis |      * @param blenderContext | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |      *            the blender context | ||||||
|      */ |      */ | ||||||
|     public ModifierHelper(String blenderVersion, boolean fixUpAxis) { |     public ModifierHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         super(blenderVersion, fixUpAxis); |         super(blenderVersion, blenderContext); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
| @ -103,7 +103,6 @@ public class ModifierHelper extends AbstractBlenderHelper { | |||||||
|                 if (modifier != null) { |                 if (modifier != null) { | ||||||
|                     if (modifier.isModifying()) { |                     if (modifier.isModifying()) { | ||||||
|                         result.add(modifier); |                         result.add(modifier); | ||||||
|                         blenderContext.addModifier(objectStructure.getOldMemoryAddress(), modifier); |  | ||||||
|                         alreadyReadModifiers.add(modifierType); |                         alreadyReadModifiers.add(modifierType); | ||||||
|                     } else { |                     } else { | ||||||
|                         LOGGER.log(Level.WARNING, "The modifier {0} will cause no changes in the model. It will be ignored!", modifierStructure.getName()); |                         LOGGER.log(Level.WARNING, "The modifier {0} will cause no changes in the model. It will be ignored!", modifierStructure.getName()); | ||||||
| @ -155,7 +154,6 @@ public class ModifierHelper extends AbstractBlenderHelper { | |||||||
|             Ipo ipo = ipoHelper.fromIpoStructure(ipoStructure, blenderContext); |             Ipo ipo = ipoHelper.fromIpoStructure(ipoStructure, blenderContext); | ||||||
|             if (ipo != null) { |             if (ipo != null) { | ||||||
|                 result = new ObjectAnimationModifier(ipo, objectStructure.getName(), objectStructure.getOldMemoryAddress(), blenderContext); |                 result = new ObjectAnimationModifier(ipo, objectStructure.getName(), objectStructure.getOldMemoryAddress(), blenderContext); | ||||||
|                 blenderContext.addModifier(objectStructure.getOldMemoryAddress(), result); |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         return result; |         return result; | ||||||
| @ -186,7 +184,6 @@ public class ModifierHelper extends AbstractBlenderHelper { | |||||||
|                 Ipo ipo = ipoHelper.fromAction(actionStructure, blenderContext); |                 Ipo ipo = ipoHelper.fromAction(actionStructure, blenderContext); | ||||||
|                 if (ipo != null) {// ipo can be null if it has no curves applied, ommit such modifier then |                 if (ipo != null) {// ipo can be null if it has no curves applied, ommit such modifier then | ||||||
|                     result = new ObjectAnimationModifier(ipo, actionStructure.getName(), objectStructure.getOldMemoryAddress(), blenderContext); |                     result = new ObjectAnimationModifier(ipo, actionStructure.getName(), objectStructure.getOldMemoryAddress(), blenderContext); | ||||||
|                     blenderContext.addModifier(objectStructure.getOldMemoryAddress(), result); |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -86,9 +86,4 @@ import com.jme3.scene.plugins.ogre.AnimData; | |||||||
|         } |         } | ||||||
|         return node; |         return node; | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     public String getType() { |  | ||||||
|         return Modifier.OBJECT_ANIMATION_MODIFIER_DATA; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -92,9 +92,4 @@ import java.util.logging.Logger; | |||||||
|         node.attachChild(emitter); |         node.attachChild(emitter); | ||||||
|         return node; |         return node; | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     public String getType() { |  | ||||||
|         return Modifier.PARTICLE_MODIFIER_DATA; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -90,11 +90,11 @@ public class ObjectHelper extends AbstractBlenderHelper { | |||||||
|      *  |      *  | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param fixUpAxis |      * @param blenderContext | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |      *            the blender context | ||||||
|      */ |      */ | ||||||
|     public ObjectHelper(String blenderVersion, boolean fixUpAxis) { |     public ObjectHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         super(blenderVersion, fixUpAxis); |         super(blenderVersion, blenderContext); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
| @ -214,7 +214,7 @@ public class ObjectHelper extends AbstractBlenderHelper { | |||||||
|                     // parent-children relationships between nodes |                     // parent-children relationships between nodes | ||||||
|                     Node armature = new Node(name); |                     Node armature = new Node(name); | ||||||
|                     armature.setLocalTransform(t); |                     armature.setLocalTransform(t); | ||||||
|                     armature.setUserData(ArmatureHelper.ARMETURE_NODE_MARKER, Boolean.TRUE); |                     armature.setUserData(ArmatureHelper.ARMATURE_NODE_MARKER, Boolean.TRUE); | ||||||
| 
 | 
 | ||||||
|                     if (parent instanceof Node) { |                     if (parent instanceof Node) { | ||||||
|                         ((Node) parent).attachChild(armature); |                         ((Node) parent).attachChild(armature); | ||||||
| @ -229,8 +229,8 @@ public class ObjectHelper extends AbstractBlenderHelper { | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (result != null) { |         if (result != null) { | ||||||
|             result.updateModelBound();// I prefer do compute bounding box here |          // I prefer do compute bounding box here than read it from the file | ||||||
|                                       // than read it from the file |             result.updateModelBound(); | ||||||
|              |              | ||||||
|             blenderContext.addLoadedFeatures(objectStructure.getOldMemoryAddress(), name, objectStructure, result); |             blenderContext.addLoadedFeatures(objectStructure.getOldMemoryAddress(), name, objectStructure, result); | ||||||
|             // TODO: this data is only to help during loading, shall I remove it |             // TODO: this data is only to help during loading, shall I remove it | ||||||
| @ -341,11 +341,8 @@ public class ObjectHelper extends AbstractBlenderHelper { | |||||||
|     public Matrix4f getMatrix(Structure structure, String matrixName, boolean applyFixUpAxis) { |     public Matrix4f getMatrix(Structure structure, String matrixName, boolean applyFixUpAxis) { | ||||||
|         Matrix4f result = new Matrix4f(); |         Matrix4f result = new Matrix4f(); | ||||||
|         DynamicArray<Number> obmat = (DynamicArray<Number>) structure.getFieldValue(matrixName); |         DynamicArray<Number> obmat = (DynamicArray<Number>) structure.getFieldValue(matrixName); | ||||||
|         int rowAndColumnSize = Math.abs((int) Math.sqrt(obmat.getTotalSize()));// the |         //the matrix must be square | ||||||
|                                                                                // matrix |         int rowAndColumnSize = Math.abs((int) Math.sqrt(obmat.getTotalSize())); | ||||||
|                                                                                // must |  | ||||||
|                                                                                // be |  | ||||||
|                                                                                // square |  | ||||||
|         for (int i = 0; i < rowAndColumnSize; ++i) { |         for (int i = 0; i < rowAndColumnSize; ++i) { | ||||||
|             for (int j = 0; j < rowAndColumnSize; ++j) { |             for (int j = 0; j < rowAndColumnSize; ++j) { | ||||||
|                 result.set(i, j, obmat.get(j, i).floatValue()); |                 result.set(i, j, obmat.get(j, i).floatValue()); | ||||||
|  | |||||||
| @ -163,22 +163,6 @@ public class Properties implements Cloneable { | |||||||
|         return name; |         return name; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * This method returns the description of the property. |  | ||||||
|      * @return the description of the property |  | ||||||
|      */ |  | ||||||
|     public String getDescription() { |  | ||||||
|         return description; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * This method returns the type of the property. |  | ||||||
|      * @return the type of the property |  | ||||||
|      */ |  | ||||||
|     public int getType() { |  | ||||||
|         return type; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This method returns the value of the property. |      * This method returns the value of the property. | ||||||
|      * The type of the value depends on the type of the property. |      * The type of the value depends on the type of the property. | ||||||
|  | |||||||
| @ -86,11 +86,11 @@ public class ParticlesHelper extends AbstractBlenderHelper { | |||||||
|      * different blender versions. |      * different blender versions. | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param fixUpAxis |      * @param blenderContext | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |      *            the blender context | ||||||
|      */ |      */ | ||||||
|     public ParticlesHelper(String blenderVersion, boolean fixUpAxis) { |     public ParticlesHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         super(blenderVersion, fixUpAxis); |         super(blenderVersion, blenderContext); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @SuppressWarnings("unchecked") |     @SuppressWarnings("unchecked") | ||||||
|  | |||||||
| @ -99,7 +99,7 @@ public class TextureHelper extends AbstractBlenderHelper { | |||||||
|     public static final int         TEX_VOXELDATA    = 15;                                             // v. |     public static final int         TEX_VOXELDATA    = 15;                                             // v. | ||||||
|                                                                                                         // 25+ |                                                                                                         // 25+ | ||||||
| 
 | 
 | ||||||
|     private TextureGeneratorFactory textureGeneratorFactory; |     private TextureGeneratorFactory textureGeneratorFactory = new TextureGeneratorFactory(); | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * This constructor parses the given blender version and stores the result. |      * This constructor parses the given blender version and stores the result. | ||||||
| @ -107,12 +107,11 @@ public class TextureHelper extends AbstractBlenderHelper { | |||||||
|      *  |      *  | ||||||
|      * @param blenderVersion |      * @param blenderVersion | ||||||
|      *            the version read from the blend file |      *            the version read from the blend file | ||||||
|      * @param fixUpAxis |      * @param blenderContext | ||||||
|      *            a variable that indicates if the Y asxis is the UP axis or not |      *            the blender context | ||||||
|      */ |      */ | ||||||
|     public TextureHelper(String blenderVersion, boolean fixUpAxis) { |     public TextureHelper(String blenderVersion, BlenderContext blenderContext) { | ||||||
|         super(blenderVersion, false); |         super(blenderVersion, blenderContext); | ||||||
|         textureGeneratorFactory = new TextureGeneratorFactory(blenderVersion); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -51,6 +51,7 @@ public class TextureBlenderAWT extends AbstractTextureBlender { | |||||||
|         super(flag, negateTexture, blendType, materialColor, color, blendFactor); |         super(flag, negateTexture, blendType, materialColor, color, blendFactor); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     @Override | ||||||
|     public Image blend(Image image, Image baseImage, BlenderContext blenderContext) { |     public Image blend(Image image, Image baseImage, BlenderContext blenderContext) { | ||||||
|         this.prepareImagesForBlending(image, baseImage); |         this.prepareImagesForBlending(image, baseImage); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -31,11 +31,6 @@ | |||||||
|  */ |  */ | ||||||
| package com.jme3.scene.plugins.blender.textures.generating; | package com.jme3.scene.plugins.blender.textures.generating; | ||||||
| 
 | 
 | ||||||
| import com.jme3.math.FastMath; |  | ||||||
| import com.jme3.scene.plugins.blender.AbstractBlenderHelper; |  | ||||||
| import com.jme3.scene.plugins.blender.BlenderContext; |  | ||||||
| import com.jme3.scene.plugins.blender.file.Structure; |  | ||||||
| import com.jme3.scene.plugins.blender.textures.generating.TextureGeneratorMusgrave.MusgraveData; |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.io.InputStream; | import java.io.InputStream; | ||||||
| import java.io.ObjectInputStream; | import java.io.ObjectInputStream; | ||||||
| @ -44,14 +39,16 @@ import java.util.Map; | |||||||
| import java.util.logging.Level; | import java.util.logging.Level; | ||||||
| import java.util.logging.Logger; | import java.util.logging.Logger; | ||||||
| 
 | 
 | ||||||
|  | import com.jme3.math.FastMath; | ||||||
|  | import com.jme3.scene.plugins.blender.textures.generating.TextureGeneratorMusgrave.MusgraveData; | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * This generator is responsible for creating various noises used to create |  * This generator is responsible for creating various noises used to create | ||||||
|  * generated textures loaded from blender. |  * generated textures loaded from blender. | ||||||
|  * It derives from AbstractBlenderHelper but is not stored in blender context. |  | ||||||
|  * It is only used by TextureHelper. |  * It is only used by TextureHelper. | ||||||
|  * @author Marcin Roguski (Kaelthas) |  * @author Marcin Roguski (Kaelthas) | ||||||
|  */ |  */ | ||||||
| /* package */class NoiseGenerator extends AbstractBlenderHelper { | /* package */class NoiseGenerator { | ||||||
|     private static final Logger LOGGER       = Logger.getLogger(NoiseGenerator.class.getName()); |     private static final Logger LOGGER       = Logger.getLogger(NoiseGenerator.class.getName()); | ||||||
| 
 | 
 | ||||||
|     // tex->stype |     // tex->stype | ||||||
| @ -79,21 +76,11 @@ import java.util.logging.Logger; | |||||||
|     protected static float[][]  g; |     protected static float[][]  g; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Constructor. Stores the blender version number and loads the constants needed for computations. |      * Constructor. Loads the constants needed for computations. They are exactly like the ones the blender uses. Each | ||||||
|      * @param blenderVersion |      * deriving class should override this method and load its own constraints. | ||||||
|      *            the number of blender version |  | ||||||
|      */ |      */ | ||||||
|     public NoiseGenerator(String blenderVersion) { |     public NoiseGenerator() { | ||||||
|         super(blenderVersion, false); |         LOGGER.fine("Loading noise constants."); | ||||||
|         this.loadConstants(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * This method loads the constants needed for computations. They are exactly like the ones the blender uses. Each |  | ||||||
|      * deriving class should override this method and load its own constraints. Be carefult with overriding though, if |  | ||||||
|      * an exception will be thrown the class will not be instantiated. |  | ||||||
|      */ |  | ||||||
|     protected void loadConstants() { |  | ||||||
|         InputStream is = NoiseGenerator.class.getResourceAsStream("noiseconstants.dat"); |         InputStream is = NoiseGenerator.class.getResourceAsStream("noiseconstants.dat"); | ||||||
|         try { |         try { | ||||||
|             ObjectInputStream ois = new ObjectInputStream(is); |             ObjectInputStream ois = new ObjectInputStream(is); | ||||||
| @ -791,11 +778,6 @@ import java.util.logging.Logger; | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |  | ||||||
|     public boolean shouldBeLoaded(Structure structure, BlenderContext blenderContext) { |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * This interface is used for distance calculation classes. Distance metrics for voronoi. e parameter only used in |      * This interface is used for distance calculation classes. Distance metrics for voronoi. e parameter only used in | ||||||
|      * Minkovsky. |      * Minkovsky. | ||||||
|  | |||||||
| @ -4,11 +4,7 @@ import com.jme3.scene.plugins.blender.textures.TextureHelper; | |||||||
| 
 | 
 | ||||||
| public class TextureGeneratorFactory { | public class TextureGeneratorFactory { | ||||||
| 
 | 
 | ||||||
|     private NoiseGenerator noiseGenerator; |     private NoiseGenerator noiseGenerator = new NoiseGenerator(); | ||||||
| 
 |  | ||||||
|     public TextureGeneratorFactory(String blenderVersion) { |  | ||||||
|         noiseGenerator = new NoiseGenerator(blenderVersion); |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     public TextureGenerator createTextureGenerator(int generatedTexture) { |     public TextureGenerator createTextureGenerator(int generatedTexture) { | ||||||
|         switch (generatedTexture) { |         switch (generatedTexture) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user