From c0f0f0ca9e5b1021f8a346aaee0ebb501d3eda79 Mon Sep 17 00:00:00 2001 From: "Kae..pl" Date: Sun, 20 Oct 2013 11:53:27 +0000 Subject: [PATCH] Bugfix: BlenderModelLoader attached root objects to the scene node before applying the constraints; this sometimes caused NPE to occur while applying the constraints git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10839 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../plugins/blender/BlenderModelLoader.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/engine/src/blender/com/jme3/scene/plugins/blender/BlenderModelLoader.java b/engine/src/blender/com/jme3/scene/plugins/blender/BlenderModelLoader.java index cb9b62bba..477fc8c94 100644 --- a/engine/src/blender/com/jme3/scene/plugins/blender/BlenderModelLoader.java +++ b/engine/src/blender/com/jme3/scene/plugins/blender/BlenderModelLoader.java @@ -32,6 +32,8 @@ package com.jme3.scene.plugins.blender; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -61,19 +63,17 @@ public class BlenderModelLoader extends BlenderLoader { this.setup(assetInfo); BlenderKey blenderKey = blenderContext.getBlenderKey(); - Node modelRoot = new Node(blenderKey.getName()); - + List rootObjects = new ArrayList(); for (FileBlockHeader block : blocks) { if (block.getCode() == FileBlockHeader.BLOCK_OB00) { ObjectHelper objectHelper = blenderContext.getHelper(ObjectHelper.class); Object object = objectHelper.toObject(block.getStructure(blenderContext), blenderContext); if (object instanceof LightNode && (blenderKey.getFeaturesToLoad() & FeaturesToLoad.LIGHTS) != 0) { - modelRoot.addLight(((LightNode) object).getLight()); - modelRoot.attachChild((LightNode) object); + rootObjects.add((LightNode)object); } else if (object instanceof Node && (blenderKey.getFeaturesToLoad() & FeaturesToLoad.OBJECTS) != 0) { LOGGER.log(Level.FINE, "{0}: {1}--> {2}", new Object[] { ((Node) object).getName(), ((Node) object).getLocalTranslation().toString(), ((Node) object).getParent() == null ? "null" : ((Node) object).getParent().getName() }); if (((Node) object).getParent() == null) { - modelRoot.attachChild((Node) object); + rootObjects.add((Node)object); } } } @@ -83,6 +83,16 @@ public class BlenderModelLoader extends BlenderLoader { ConstraintHelper constraintHelper = blenderContext.getHelper(ConstraintHelper.class); constraintHelper.bakeConstraints(blenderContext); + //attach the nodes to the root node at the very end so that the root objects have no parents during constraint applying + LOGGER.fine("Creating the root node of the model and applying loaded nodes of the scene to it."); + Node modelRoot = new Node(blenderKey.getName()); + for(Node node : rootObjects) { + if(node instanceof LightNode) { + modelRoot.addLight(((LightNode) node).getLight()); + } + modelRoot.attachChild(node); + } + blenderContext.dispose(); return modelRoot; } catch (BlenderFileException e) {