diff --git a/engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ArmatureModifier.java b/engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ArmatureModifier.java index 399c93553..e8a3b58a0 100644 --- a/engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ArmatureModifier.java +++ b/engine/src/blender/com/jme3/scene/plugins/blender/modifiers/ArmatureModifier.java @@ -46,6 +46,12 @@ import com.jme3.util.BufferUtils; /* package */class ArmatureModifier extends Modifier { private static final Logger LOGGER = Logger.getLogger(ArmatureModifier.class.getName()); private static final int MAXIMUM_WEIGHTS_PER_VERTEX = 4; // have no idea why 4, could someone please explain ? + //@Marcin it was an Ogre limitation, but as long as we use a MaxNumWeight variable in mesh, + //i guess this limitation has no sense for the blender loader...so i guess it's up to you. You'll have to deternine the max weight according to the provided blend file + //I added a check to avoid crash when loading a model that has more than 4 weight per vertex on line 258 + //If you decide to remove this limitation, remove this code. + //Rémy + /** Loaded animation data. */ private AnimData animData; @@ -113,6 +119,7 @@ import com.jme3.util.BufferUtils; //read animations String objectName = objectStructure.getName(); Set animationNames = blenderContext.getBlenderKey().getAnimationNames(objectName); + System.out.println("Loaded animation " + objectName); if (animationNames != null && animationNames.size() > 0) { ArrayList animations = new ArrayList(); List actionHeaders = blenderContext.getFileBlocks(Integer.valueOf(FileBlockHeader.BLOCK_AC00)); @@ -127,6 +134,7 @@ import com.jme3.util.BufferUtils; BoneAnimation boneAnimation = new BoneAnimation(actionName, stop - start); boneAnimation.setTracks(armatureHelper.getTracks(actionStructure, blenderContext, objectName, actionName)); animations.add(boneAnimation); + } } animData = new AnimData(new Skeleton(bones), animations); @@ -248,7 +256,14 @@ import com.jme3.util.BufferUtils; int weightIndex = 0; List dw = pDW.fetchData(blenderContext.getInputStream()); for (Structure deformWeight : dw) { - Integer boneIndex = groupToBoneIndexMap.get(((Number) deformWeight.getFieldValue("def_nr")).intValue()); + Integer boneIndex = groupToBoneIndexMap.get(((Number) deformWeight.getFieldValue("def_nr")).intValue()); + + //Remove this code if 4 weights limitation is removed + if(weightIndex==4){ + LOGGER.log(Level.WARNING,"{0} has more than 4 weight on bone index {1}",new Object[]{meshStructure.getName(),boneIndex}); + break; + } + if (boneIndex != null) {// null here means that we came accross group that has no bone attached to float weight = ((Number) deformWeight.getFieldValue("weight")).floatValue(); if (weight == 0.0f) { @@ -256,12 +271,12 @@ import com.jme3.util.BufferUtils; boneIndex = Integer.valueOf(0); } // we apply the weight to all referenced vertices - for (Integer index : vertexIndices) { + for (Integer index : vertexIndices) { weightsFloatData.put(index * MAXIMUM_WEIGHTS_PER_VERTEX + weightIndex, weight); indicesData.put(index * MAXIMUM_WEIGHTS_PER_VERTEX + weightIndex, boneIndex.byteValue()); } } - ++weightIndex; + ++weightIndex; } } else { for (Integer index : vertexIndices) {