Browse Source

Refactoring: small reorganisation of ObjectHelper class.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10802 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
Kae..pl 12 years ago
parent
commit
8df3569688

+ 69 - 80
engine/src/blender/com/jme3/scene/plugins/blender/objects/ObjectHelper.java

@@ -42,9 +42,7 @@ import com.jme3.math.Matrix4f;
 import com.jme3.math.Quaternion;
 import com.jme3.math.Quaternion;
 import com.jme3.math.Transform;
 import com.jme3.math.Transform;
 import com.jme3.math.Vector3f;
 import com.jme3.math.Vector3f;
-import com.jme3.scene.CameraNode;
 import com.jme3.scene.Geometry;
 import com.jme3.scene.Geometry;
-import com.jme3.scene.LightNode;
 import com.jme3.scene.Node;
 import com.jme3.scene.Node;
 import com.jme3.scene.Spatial;
 import com.jme3.scene.Spatial;
 import com.jme3.scene.Spatial.CullHint;
 import com.jme3.scene.Spatial.CullHint;
@@ -72,18 +70,6 @@ import com.jme3.scene.plugins.blender.modifiers.ModifierHelper;
 public class ObjectHelper extends AbstractBlenderHelper {
 public class ObjectHelper extends AbstractBlenderHelper {
     private static final Logger LOGGER               = Logger.getLogger(ObjectHelper.class.getName());
     private static final Logger LOGGER               = Logger.getLogger(ObjectHelper.class.getName());
 
 
-    protected static final int  OBJECT_TYPE_EMPTY    = 0;
-    protected static final int  OBJECT_TYPE_MESH     = 1;
-    protected static final int  OBJECT_TYPE_CURVE    = 2;
-    protected static final int  OBJECT_TYPE_SURF     = 3;
-    protected static final int  OBJECT_TYPE_TEXT     = 4;
-    protected static final int  OBJECT_TYPE_METABALL = 5;
-    protected static final int  OBJECT_TYPE_LAMP     = 10;
-    protected static final int  OBJECT_TYPE_CAMERA   = 11;
-    protected static final int  OBJECT_TYPE_WAVE     = 21;
-    protected static final int  OBJECT_TYPE_LATTICE  = 22;
-    protected static final int  OBJECT_TYPE_ARMATURE = 25;
-    
     public static final String OMA_MARKER = "oma";
     public static final String OMA_MARKER = "oma";
 
 
     /**
     /**
@@ -121,12 +107,12 @@ public class ObjectHelper extends AbstractBlenderHelper {
 
 
         // get object data
         // get object data
         int type = ((Number) objectStructure.getFieldValue("type")).intValue();
         int type = ((Number) objectStructure.getFieldValue("type")).intValue();
+        ObjectType objectType = ObjectType.valueOf(type);
         String name = objectStructure.getName();
         String name = objectStructure.getName();
         LOGGER.log(Level.FINE, "Loading obejct: {0}", name);
         LOGGER.log(Level.FINE, "Loading obejct: {0}", name);
 
 
         int restrictflag = ((Number) objectStructure.getFieldValue("restrictflag")).intValue();
         int restrictflag = ((Number) objectStructure.getFieldValue("restrictflag")).intValue();
         boolean visible = (restrictflag & 0x01) != 0;
         boolean visible = (restrictflag & 0x01) != 0;
-        Node result = null;
 
 
         Pointer pParent = (Pointer) objectStructure.getFieldValue("parent");
         Pointer pParent = (Pointer) objectStructure.getFieldValue("parent");
         Object parent = blenderContext.getLoadedFeature(pParent.getOldMemoryAddress(), LoadedFeatureDataType.LOADED_FEATURE);
         Object parent = blenderContext.getLoadedFeature(pParent.getOldMemoryAddress(), LoadedFeatureDataType.LOADED_FEATURE);
@@ -136,120 +122,94 @@ public class ObjectHelper extends AbstractBlenderHelper {
         }
         }
 
 
         Transform t = this.getTransformation(objectStructure, blenderContext);
         Transform t = this.getTransformation(objectStructure, blenderContext);
-
+        LOGGER.log(Level.FINE, "Importing object of type: {0}", objectType);
+        Node result = null;
         try {
         try {
-            switch (type) {
-                case OBJECT_TYPE_EMPTY:
-                    LOGGER.log(Level.FINE, "Importing empty.");
-                    Node empty = new Node(name);
-                    empty.setLocalTransform(t);
-                    if (parent instanceof Node) {
-                        ((Node) parent).attachChild(empty);
-                    }
-                    result = empty;
+            switch (objectType) {
+                case EMPTY:
+                case ARMATURE:
+                    // need to use an empty node to properly create
+                    // parent-children relationships between nodes
+                    result = new Node(name);
                     break;
                     break;
-                case OBJECT_TYPE_MESH:
-                    LOGGER.log(Level.FINE, "Importing mesh.");
-                    Node node = new Node(name);
-                    node.setCullHint(visible ? CullHint.Always : CullHint.Inherit);
-
-                    // reading mesh
+                case MESH:
+                    result = new Node(name);
                     MeshHelper meshHelper = blenderContext.getHelper(MeshHelper.class);
                     MeshHelper meshHelper = blenderContext.getHelper(MeshHelper.class);
                     Pointer pMesh = (Pointer) objectStructure.getFieldValue("data");
                     Pointer pMesh = (Pointer) objectStructure.getFieldValue("data");
                     List<Structure> meshesArray = pMesh.fetchData(blenderContext.getInputStream());
                     List<Structure> meshesArray = pMesh.fetchData(blenderContext.getInputStream());
                     List<Geometry> geometries = meshHelper.toMesh(meshesArray.get(0), blenderContext);
                     List<Geometry> geometries = meshHelper.toMesh(meshesArray.get(0), blenderContext);
                     if (geometries != null) {
                     if (geometries != null) {
                         for (Geometry geometry : geometries) {
                         for (Geometry geometry : geometries) {
-                            node.attachChild(geometry);
+                            result.attachChild(geometry);
                         }
                         }
                     }
                     }
-                    node.setLocalTransform(t);
-
-                    // setting the parent
-                    if (parent instanceof Node) {
-                        ((Node) parent).attachChild(node);
-                    }
-                    result = node;
                     break;
                     break;
-                case OBJECT_TYPE_SURF:
-                case OBJECT_TYPE_CURVE:
-                    LOGGER.log(Level.FINE, "Importing curve/nurb.");
+                case SURF:
+                case CURVE:
+                    result = new Node(name);
                     Pointer pCurve = (Pointer) objectStructure.getFieldValue("data");
                     Pointer pCurve = (Pointer) objectStructure.getFieldValue("data");
                     if (pCurve.isNotNull()) {
                     if (pCurve.isNotNull()) {
                         CurvesHelper curvesHelper = blenderContext.getHelper(CurvesHelper.class);
                         CurvesHelper curvesHelper = blenderContext.getHelper(CurvesHelper.class);
                         Structure curveData = pCurve.fetchData(blenderContext.getInputStream()).get(0);
                         Structure curveData = pCurve.fetchData(blenderContext.getInputStream()).get(0);
                         List<Geometry> curves = curvesHelper.toCurve(curveData, blenderContext);
                         List<Geometry> curves = curvesHelper.toCurve(curveData, blenderContext);
-                        result = new Node(name);
                         for (Geometry curve : curves) {
                         for (Geometry curve : curves) {
                             result.attachChild(curve);
                             result.attachChild(curve);
                         }
                         }
-                        result.setLocalTransform(t);
                     }
                     }
                     break;
                     break;
-                case OBJECT_TYPE_LAMP:
-                    LOGGER.log(Level.FINE, "Importing lamp.");
+                case LAMP:
                     Pointer pLamp = (Pointer) objectStructure.getFieldValue("data");
                     Pointer pLamp = (Pointer) objectStructure.getFieldValue("data");
                     if (pLamp.isNotNull()) {
                     if (pLamp.isNotNull()) {
                         LightHelper lightHelper = blenderContext.getHelper(LightHelper.class);
                         LightHelper lightHelper = blenderContext.getHelper(LightHelper.class);
                         List<Structure> lampsArray = pLamp.fetchData(blenderContext.getInputStream());
                         List<Structure> lampsArray = pLamp.fetchData(blenderContext.getInputStream());
-                        LightNode light = lightHelper.toLight(lampsArray.get(0), blenderContext);
-                        if (light != null) {
-                            light.setName(name);
-                            light.setLocalTransform(t);
-                        }
-                        result = light;
+                        result = lightHelper.toLight(lampsArray.get(0), blenderContext);
                     }
                     }
                     break;
                     break;
-                case OBJECT_TYPE_CAMERA:
+                case CAMERA:
                     Pointer pCamera = (Pointer) objectStructure.getFieldValue("data");
                     Pointer pCamera = (Pointer) objectStructure.getFieldValue("data");
                     if (pCamera.isNotNull()) {
                     if (pCamera.isNotNull()) {
                         CameraHelper cameraHelper = blenderContext.getHelper(CameraHelper.class);
                         CameraHelper cameraHelper = blenderContext.getHelper(CameraHelper.class);
                         List<Structure> camerasArray = pCamera.fetchData(blenderContext.getInputStream());
                         List<Structure> camerasArray = pCamera.fetchData(blenderContext.getInputStream());
-                        CameraNode camera = cameraHelper.toCamera(camerasArray.get(0), blenderContext);
-                        camera.setName(name);
-                        camera.setLocalTransform(t);
-                        result = camera;
-                    }
-                    break;
-                case OBJECT_TYPE_ARMATURE:
-                    // need to create an empty node to properly create
-                    // parent-children relationships between nodes
-                    Node armature = new Node(name);
-                    armature.setLocalTransform(t);
-                    blenderContext.addMarker(ArmatureHelper.ARMATURE_NODE_MARKER, armature, Boolean.TRUE);
-
-                    if (parent instanceof Node) {
-                        ((Node) parent).attachChild(armature);
+                        result = cameraHelper.toCamera(camerasArray.get(0), blenderContext);
                     }
                     }
-                    result = armature;
                     break;
                     break;
                 default:
                 default:
-                    LOGGER.log(Level.WARNING, "Unknown object type: {0}", type);
+                    LOGGER.log(Level.WARNING, "Unsupported object type: {0}", type);
             }
             }
         } finally {
         } finally {
             blenderContext.popParent();
             blenderContext.popParent();
         }
         }
 
 
         if (result != null) {
         if (result != null) {
-         // I prefer do compute bounding box here than read it from the file
-            result.updateModelBound();
-            
             blenderContext.addLoadedFeatures(objectStructure.getOldMemoryAddress(), name, objectStructure, result);
             blenderContext.addLoadedFeatures(objectStructure.getOldMemoryAddress(), name, objectStructure, result);
-            blenderContext.addMarker(OMA_MARKER, result, objectStructure.getOldMemoryAddress());
-
-            // applying modifiers
-            LOGGER.log(Level.FINE, "Reading and applying object's modifiers.");
+            
+            result.setLocalTransform(t);
+            result.setCullHint(visible ? CullHint.Always : CullHint.Inherit);
+            if (parent instanceof Node) {
+                ((Node) parent).attachChild(result);
+            }
+            
+            LOGGER.fine("Reading and applying object's modifiers.");
             ModifierHelper modifierHelper = blenderContext.getHelper(ModifierHelper.class);
             ModifierHelper modifierHelper = blenderContext.getHelper(ModifierHelper.class);
             Collection<Modifier> modifiers = modifierHelper.readModifiers(objectStructure, blenderContext);
             Collection<Modifier> modifiers = modifierHelper.readModifiers(objectStructure, blenderContext);
             for (Modifier modifier : modifiers) {
             for (Modifier modifier : modifiers) {
                 modifier.apply(result, blenderContext);
                 modifier.apply(result, blenderContext);
             }
             }
-
-            // loading constraints connected with this object
+            
+            // I prefer do compute bounding box here than read it from the file
+            result.updateModelBound();
+            
+            LOGGER.fine("Applying markers (those will be removed before the final result is released).");
+            blenderContext.addMarker(OMA_MARKER, result, objectStructure.getOldMemoryAddress());
+            if(objectType == ObjectType.ARMATURE) {
+                blenderContext.addMarker(ArmatureHelper.ARMATURE_NODE_MARKER, result, Boolean.TRUE);
+            }
+            
+            LOGGER.fine("Loading constraints connected with this object.");
             ConstraintHelper constraintHelper = blenderContext.getHelper(ConstraintHelper.class);
             ConstraintHelper constraintHelper = blenderContext.getHelper(ConstraintHelper.class);
             constraintHelper.loadConstraints(objectStructure, blenderContext);
             constraintHelper.loadConstraints(objectStructure, blenderContext);
 
 
-            // reading custom properties
+            LOGGER.fine("Loading custom properties.");
             if (blenderContext.getBlenderKey().isLoadObjectProperties()) {
             if (blenderContext.getBlenderKey().isLoadObjectProperties()) {
                 Properties properties = this.loadProperties(objectStructure, blenderContext);
                 Properties properties = this.loadProperties(objectStructure, blenderContext);
                 // the loaded property is a group property, so we need to get
                 // the loaded property is a group property, so we need to get
@@ -393,4 +353,33 @@ public class ObjectHelper extends AbstractBlenderHelper {
         int lay = ((Number) structure.getFieldValue("lay")).intValue();
         int lay = ((Number) structure.getFieldValue("lay")).intValue();
         return (lay & blenderContext.getBlenderKey().getLayersToLoad()) != 0 && (blenderContext.getBlenderKey().getFeaturesToLoad() & FeaturesToLoad.OBJECTS) != 0;
         return (lay & blenderContext.getBlenderKey().getLayersToLoad()) != 0 && (blenderContext.getBlenderKey().getFeaturesToLoad() & FeaturesToLoad.OBJECTS) != 0;
     }
     }
+    
+    private static enum ObjectType {
+        EMPTY(0),
+        MESH(1),
+        CURVE(2),
+        SURF(3),
+        TEXT(4),
+        METABALL(5),
+        LAMP(10),
+        CAMERA(11),
+        WAVE(21),
+        LATTICE(22),
+        ARMATURE(25);
+        
+        private int blenderTypeValue;
+        
+        private ObjectType(int blenderTypeValue) {
+            this.blenderTypeValue = blenderTypeValue;
+        }
+        
+        public static ObjectType valueOf(int blenderTypeValue) throws BlenderFileException {
+            for(ObjectType type : ObjectType.values()) {
+                if(type.blenderTypeValue == blenderTypeValue) {
+                    return type;
+                }
+            }
+            throw new BlenderFileException("Unknown type value: " + blenderTypeValue);
+        }
+    }
 }
 }