Moving all of the blender-related stuff under the jme3-blender subdirectory
to make it easier to move to its own repository and keep all of the history.
| Before Width: | Height: | Size: 296 KiB After Width: | Height: | Size: 296 KiB | 
| Before Width: | Height: | Size: 303 KiB After Width: | Height: | Size: 303 KiB | 
| Before Width: | Height: | Size: 453 KiB After Width: | Height: | Size: 453 KiB | 
| Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB | 
| Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB | 
| Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 192 KiB | 
| Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 105 KiB | 
| Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB | 
| Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB | 
| Before Width: | Height: | Size: 449 KiB After Width: | Height: | Size: 449 KiB | 
| Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB | 
| Before Width: | Height: | Size: 257 KiB After Width: | Height: | Size: 257 KiB | 
| @ -58,11 +58,11 @@ import java.util.logging.Logger; | |||||||
| public class SavableClassUtil { | public class SavableClassUtil { | ||||||
| 
 | 
 | ||||||
|     private final static HashMap<String, String> CLASS_REMAPPINGS = new HashMap<>(); |     private final static HashMap<String, String> CLASS_REMAPPINGS = new HashMap<>(); | ||||||
|      | 
 | ||||||
|     private static void addRemapping(String oldClass, Class<? extends Savable> newClass){ |     private static void addRemapping(String oldClass, Class<? extends Savable> newClass){ | ||||||
|         CLASS_REMAPPINGS.put(oldClass, newClass.getName()); |         CLASS_REMAPPINGS.put(oldClass, newClass.getName()); | ||||||
|     } |     } | ||||||
|      | 
 | ||||||
|     static { |     static { | ||||||
|         addRemapping("com.jme3.effect.EmitterSphereShape", EmitterSphereShape.class); |         addRemapping("com.jme3.effect.EmitterSphereShape", EmitterSphereShape.class); | ||||||
|         addRemapping("com.jme3.effect.EmitterBoxShape", EmitterBoxShape.class); |         addRemapping("com.jme3.effect.EmitterBoxShape", EmitterBoxShape.class); | ||||||
| @ -73,9 +73,13 @@ public class SavableClassUtil { | |||||||
|         addRemapping("com.jme3.material.Material$MatParamTexture", MatParamTexture.class); |         addRemapping("com.jme3.material.Material$MatParamTexture", MatParamTexture.class); | ||||||
|         addRemapping("com.jme3.animation.BoneAnimation", Animation.class); |         addRemapping("com.jme3.animation.BoneAnimation", Animation.class); | ||||||
|         addRemapping("com.jme3.animation.SpatialAnimation", Animation.class); |         addRemapping("com.jme3.animation.SpatialAnimation", Animation.class); | ||||||
|  | 
 | ||||||
|  |         // Even though we no longer include Blender loading as part of the engine, | ||||||
|  |         // we leave this line in so that old j3os will still work and just not | ||||||
|  |         // load that data.  -pspeed:2020-04-19 | ||||||
|         addRemapping("com.jme3.scene.plugins.blender.objects.Properties", NullSavable.class); |         addRemapping("com.jme3.scene.plugins.blender.objects.Properties", NullSavable.class); | ||||||
|     } |     } | ||||||
|      | 
 | ||||||
|     private static String remapClass(String className) throws ClassNotFoundException { |     private static String remapClass(String className) throws ClassNotFoundException { | ||||||
|         String result = CLASS_REMAPPINGS.get(className); |         String result = CLASS_REMAPPINGS.get(className); | ||||||
|         if (result == null) { |         if (result == null) { | ||||||
| @ -84,7 +88,7 @@ public class SavableClassUtil { | |||||||
|             return result; |             return result; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|      | 
 | ||||||
|     public static boolean isImplementingSavable(Class clazz){ |     public static boolean isImplementingSavable(Class clazz){ | ||||||
|         boolean result = Savable.class.isAssignableFrom(clazz); |         boolean result = Savable.class.isAssignableFrom(clazz); | ||||||
|         return result; |         return result; | ||||||
| @ -98,21 +102,21 @@ public class SavableClassUtil { | |||||||
|             versionList.add(getSavableVersion(superclass)); |             versionList.add(getSavableVersion(superclass)); | ||||||
|             superclass = superclass.getSuperclass(); |             superclass = superclass.getSuperclass(); | ||||||
|         } while (superclass != null && SavableClassUtil.isImplementingSavable(superclass)); |         } while (superclass != null && SavableClassUtil.isImplementingSavable(superclass)); | ||||||
|          | 
 | ||||||
|         int[] versions = new int[versionList.size()]; |         int[] versions = new int[versionList.size()]; | ||||||
|         for (int i = 0; i < versionList.size(); i++){ |         for (int i = 0; i < versionList.size(); i++){ | ||||||
|             versions[i] = versionList.get(i); |             versions[i] = versionList.get(i); | ||||||
|         } |         } | ||||||
|         return versions; |         return versions; | ||||||
|     } |     } | ||||||
|      | 
 | ||||||
|     @SuppressWarnings("unchecked") |     @SuppressWarnings("unchecked") | ||||||
|     public static int getSavableVersion(Class<? extends Savable> clazz) throws IOException{ |     public static int getSavableVersion(Class<? extends Savable> clazz) throws IOException{ | ||||||
|         try { |         try { | ||||||
|             Field field = clazz.getField("SAVABLE_VERSION"); |             Field field = clazz.getField("SAVABLE_VERSION"); | ||||||
|             Class<? extends Savable> declaringClass = (Class<? extends Savable>) field.getDeclaringClass(); |             Class<? extends Savable> declaringClass = (Class<? extends Savable>) field.getDeclaringClass(); | ||||||
|             if (declaringClass == clazz){ |             if (declaringClass == clazz){ | ||||||
|                 return field.getInt(null);  |                 return field.getInt(null); | ||||||
|             }else{ |             }else{ | ||||||
|                 return 0; // This class doesn't declare this field, e.g. version == 0 |                 return 0; // This class doesn't declare this field, e.g. version == 0 | ||||||
|             } |             } | ||||||
| @ -126,11 +130,11 @@ public class SavableClassUtil { | |||||||
|             return 0; // not using versions |             return 0; // not using versions | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|      | 
 | ||||||
|     public static int getSavedSavableVersion(Object savable, Class<? extends Savable> desiredClass, int[] versions, int formatVersion){ |     public static int getSavedSavableVersion(Object savable, Class<? extends Savable> desiredClass, int[] versions, int formatVersion){ | ||||||
|         Class thisClass = savable.getClass(); |         Class thisClass = savable.getClass(); | ||||||
|         int count = 0; |         int count = 0; | ||||||
|          | 
 | ||||||
|         while (thisClass != desiredClass) { |         while (thisClass != desiredClass) { | ||||||
|             thisClass = thisClass.getSuperclass(); |             thisClass = thisClass.getSuperclass(); | ||||||
|             if (thisClass != null && SavableClassUtil.isImplementingSavable(thisClass)){ |             if (thisClass != null && SavableClassUtil.isImplementingSavable(thisClass)){ | ||||||
| @ -141,26 +145,26 @@ public class SavableClassUtil { | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (thisClass == null){ |         if (thisClass == null){ | ||||||
|             throw new IllegalArgumentException(savable.getClass().getName() +  |             throw new IllegalArgumentException(savable.getClass().getName() + | ||||||
|                                                " does not extend " +  |                                                " does not extend " + | ||||||
|                                                desiredClass.getName() + "!"); |                                                desiredClass.getName() + "!"); | ||||||
|         }else if (count >= versions.length){ |         }else if (count >= versions.length){ | ||||||
|             if (formatVersion <= 1){ |             if (formatVersion <= 1){ | ||||||
|                 return 0; // for buggy versions of j3o |                 return 0; // for buggy versions of j3o | ||||||
|             }else{ |             }else{ | ||||||
|                 throw new IllegalArgumentException(savable.getClass().getName() +  |                 throw new IllegalArgumentException(savable.getClass().getName() + | ||||||
|                                                    " cannot access version of " + |                                                    " cannot access version of " + | ||||||
|                                                    desiredClass.getName() +  |                                                    desiredClass.getName() + | ||||||
|                                                    " because it doesn't implement Savable"); |                                                    " because it doesn't implement Savable"); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         return versions[count]; |         return versions[count]; | ||||||
|     } |     } | ||||||
|      | 
 | ||||||
|     /** |     /** | ||||||
|      * fromName creates a new Savable from the provided class name. First registered modules |      * fromName creates a new Savable from the provided class name. First registered modules | ||||||
|      * are checked to handle special cases, if the modules do not handle the class name, the |      * are checked to handle special cases, if the modules do not handle the class name, the | ||||||
|      * class is instantiated directly.  |      * class is instantiated directly. | ||||||
|      * @param className the class name to create. |      * @param className the class name to create. | ||||||
|      * @return the Savable instance of the class. |      * @return the Savable instance of the class. | ||||||
|      * @throws InstantiationException thrown if the class does not have an empty constructor. |      * @throws InstantiationException thrown if the class does not have an empty constructor. | ||||||
|  | |||||||
| @ -20,7 +20,6 @@ LOADER com.jme3.scene.plugins.ogre.MeshLoader : meshxml, mesh.xml | |||||||
| LOADER com.jme3.scene.plugins.ogre.SkeletonLoader : skeletonxml, skeleton.xml | LOADER com.jme3.scene.plugins.ogre.SkeletonLoader : skeletonxml, skeleton.xml | ||||||
| LOADER com.jme3.scene.plugins.ogre.MaterialLoader : material | LOADER com.jme3.scene.plugins.ogre.MaterialLoader : material | ||||||
| LOADER com.jme3.scene.plugins.ogre.SceneLoader : scene | LOADER com.jme3.scene.plugins.ogre.SceneLoader : scene | ||||||
| LOADER com.jme3.scene.plugins.blender.BlenderModelLoader : blend |  | ||||||
| LOADER com.jme3.shader.plugins.GLSLLoader : vert, frag, geom, tsctrl, tseval, glsl, glsllib | LOADER com.jme3.shader.plugins.GLSLLoader : vert, frag, geom, tsctrl, tseval, glsl, glsllib | ||||||
| LOADER com.jme3.scene.plugins.fbx.FbxLoader : fbx | LOADER com.jme3.scene.plugins.fbx.FbxLoader : fbx | ||||||
| LOADER com.jme3.scene.plugins.gltf.GltfLoader : gltf | LOADER com.jme3.scene.plugins.gltf.GltfLoader : gltf | ||||||
|  | |||||||