Browse Source

cloning skinningcontrol

rickard 3 years ago
parent
commit
fc75ea2c69

+ 17 - 11
jme3-core/src/com/jme3/gde/core/assets/ExternalChangeScanner.java

@@ -41,6 +41,7 @@ import com.jme3.gde.core.util.datatransfer.MaterialDataFromOriginal;
 import com.jme3.gde.core.util.datatransfer.MeshDataFromOriginal;
 import com.jme3.gde.core.util.datatransfer.MeshDataFromOriginal;
 import com.jme3.gde.core.util.datatransfer.TransformDataFromOriginal;
 import com.jme3.gde.core.util.datatransfer.TransformDataFromOriginal;
 import com.jme3.scene.Spatial;
 import com.jme3.scene.Spatial;
+import java.io.IOException;
 
 
 import java.util.concurrent.Callable;
 import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -116,6 +117,7 @@ public class ExternalChangeScanner implements AssetDataPropertyChangeListener,
                 final String noOption = "No";
                 final String noOption = "No";
                 final String allOption = "All";
                 final String allOption = "All";
                 final String meshOption = "Only mesh data";
                 final String meshOption = "Only mesh data";
+                final String animOption = "Only animation data";
                 final NotifyDescriptor.Confirmation message =
                 final NotifyDescriptor.Confirmation message =
                         new NotifyDescriptor.Confirmation("Original file for "
                         new NotifyDescriptor.Confirmation("Original file for "
                                 + assetDataObject.getName() + " changed\nTry "
                                 + assetDataObject.getName() + " changed\nTry "
@@ -123,7 +125,7 @@ public class ExternalChangeScanner implements AssetDataPropertyChangeListener,
                                 "Original file changed",
                                 "Original file changed",
                                 NotifyDescriptor.YES_NO_CANCEL_OPTION,
                                 NotifyDescriptor.YES_NO_CANCEL_OPTION,
                                 NotifyDescriptor.QUESTION_MESSAGE);
                                 NotifyDescriptor.QUESTION_MESSAGE);
-                message.setOptions(new Object[]{allOption, meshOption,
+                message.setOptions(new Object[]{allOption, meshOption, animOption,
                         noOption});
                         noOption});
                 DialogDisplayer.getDefault().notify(message);
                 DialogDisplayer.getDefault().notify(message);
                 if (message.getValue().equals(noOption)) {
                 if (message.getValue().equals(noOption)) {
@@ -131,7 +133,8 @@ public class ExternalChangeScanner implements AssetDataPropertyChangeListener,
                     return;
                     return;
                 }
                 }
                 SceneApplication.getApplication().enqueue((Callable<Void>) () -> {
                 SceneApplication.getApplication().enqueue((Callable<Void>) () -> {
-                    applyExternalData(message.getValue().equals(meshOption));
+                    applyExternalData(message.getValue().equals(meshOption), 
+                            message.getValue().equals(animOption));
                     return null;
                     return null;
                 });
                 });
                 userNotified.set(false);
                 userNotified.set(false);
@@ -142,7 +145,8 @@ public class ExternalChangeScanner implements AssetDataPropertyChangeListener,
         }
         }
     }
     }
 
 
-    private void applyExternalData(final boolean onlyMeshData) {
+    private void applyExternalData(final boolean onlyMeshData, 
+            final boolean onlyAnimData) {
         final ProgressHandle handle = ProgressHandle.createHandle("Updating "
         final ProgressHandle handle = ProgressHandle.createHandle("Updating "
                 + "file "
                 + "file "
                 + "data");
                 + "data");
@@ -152,19 +156,21 @@ public class ExternalChangeScanner implements AssetDataPropertyChangeListener,
             final Spatial spat = (Spatial) assetDataObject.loadAsset();
             final Spatial spat = (Spatial) assetDataObject.loadAsset();
             final TaggedSpatialFinder finder = new TaggedSpatialFinder();
             final TaggedSpatialFinder finder = new TaggedSpatialFinder();
 
 
-            new MeshDataFromOriginal(finder).update(spat, original);
-            new TransformDataFromOriginal(finder).update(spat, original);
-            if (!onlyMeshData) {
-                new MaterialDataFromOriginal(finder).update(spat, original);
-                if (SpatialUtil.hasAnimations(original)) {
-                    new AnimationDataFromOriginal(finder).update(spat,
+            if(!onlyMeshData && SpatialUtil.hasAnimations(original)) {
+                new AnimationDataFromOriginal(finder).update(spat,
                             original);
                             original);
-                }
+            }
+            if(!onlyAnimData){
+                new MeshDataFromOriginal(finder).update(spat, original);
+            }
+            if (!onlyMeshData && !onlyAnimData) {
+                new TransformDataFromOriginal(finder).update(spat, original);
+                new MaterialDataFromOriginal(finder).update(spat, original);
             }
             }
 
 
             closeOriginalSpatial();
             closeOriginalSpatial();
             assetDataObject.saveAsset();
             assetDataObject.saveAsset();
-        } catch (Exception e) {
+        } catch (IOException e) {
             LOGGER.log(Level.SEVERE, "Exception when trying to update "
             LOGGER.log(Level.SEVERE, "Exception when trying to update "
                     + "external data.", e);
                     + "external data.", e);
         } finally {
         } finally {

+ 50 - 20
jme3-core/src/com/jme3/gde/core/util/datatransfer/AnimationDataFromOriginal.java

@@ -2,6 +2,10 @@ package com.jme3.gde.core.util.datatransfer;
 
 
 import com.jme3.anim.AnimClip;
 import com.jme3.anim.AnimClip;
 import com.jme3.anim.AnimComposer;
 import com.jme3.anim.AnimComposer;
+import com.jme3.anim.Armature;
+import com.jme3.anim.Joint;
+import com.jme3.anim.SkinningControl;
+import com.jme3.anim.util.AnimMigrationUtils;
 import com.jme3.gde.core.scene.ApplicationLogHandler;
 import com.jme3.gde.core.scene.ApplicationLogHandler;
 import com.jme3.gde.core.util.TaggedSpatialFinder;
 import com.jme3.gde.core.util.TaggedSpatialFinder;
 import com.jme3.scene.SceneGraphVisitor;
 import com.jme3.scene.SceneGraphVisitor;
@@ -17,8 +21,8 @@ import java.util.logging.Logger;
  */
  */
 public final class AnimationDataFromOriginal implements SpatialDataTransferInterface {
 public final class AnimationDataFromOriginal implements SpatialDataTransferInterface {
 
 
-    private static final Logger LOGGER =
-            Logger.getLogger(AnimationDataFromOriginal.class.getName());
+    private static final Logger LOGGER
+            = Logger.getLogger(AnimationDataFromOriginal.class.getName());
 
 
     private final TaggedSpatialFinder finder;
     private final TaggedSpatialFinder finder;
 
 
@@ -35,8 +39,8 @@ public final class AnimationDataFromOriginal implements SpatialDataTransferInter
 
 
             @Override
             @Override
             public void visit(final Spatial spatial) {
             public void visit(final Spatial spatial) {
-                final AnimComposer animComposer =
-                        spatial.getControl(AnimComposer.class);
+                final AnimComposer animComposer
+                        = spatial.getControl(AnimComposer.class);
                 if (animComposer != null) {
                 if (animComposer != null) {
                     final Spatial mySpatial = finder.find(root, spatial);
                     final Spatial mySpatial = finder.find(root, spatial);
                     if (mySpatial != null) {
                     if (mySpatial != null) {
@@ -44,11 +48,10 @@ public final class AnimationDataFromOriginal implements SpatialDataTransferInter
                         // nodes and find the ones
                         // nodes and find the ones
                         //where UserData "AttachedBone" == Bone and move it
                         //where UserData "AttachedBone" == Bone and move it
                         // to new Bone
                         // to new Bone
-                        final AnimComposer myAnimControl =
-                                getAndRemoveControl(mySpatial);
+                        getAndRemoveControl(mySpatial);
 
 
-                        updateAndAddControl(mySpatial, myAnimControl,
-                                animComposer);
+                        updateAndAddControl(mySpatial,
+                                animComposer, spatial.getControl(SkinningControl.class));
 
 
                         LOGGER.log(ApplicationLogHandler.LogLevel.FINE,
                         LOGGER.log(ApplicationLogHandler.LogLevel.FINE,
                                 "Updated animation for {0}",
                                 "Updated animation for {0}",
@@ -57,7 +60,7 @@ public final class AnimationDataFromOriginal implements SpatialDataTransferInter
                         LOGGER.log(Level.WARNING, "Could not find sibling for"
                         LOGGER.log(Level.WARNING, "Could not find sibling for"
                                 + " {0} in root {1} when trying to apply "
                                 + " {0} in root {1} when trying to apply "
                                 + "AnimControl data", new Object[]{spatial,
                                 + "AnimControl data", new Object[]{spatial,
-                                root});
+                                    root});
                     }
                     }
                 }
                 }
             }
             }
@@ -65,8 +68,8 @@ public final class AnimationDataFromOriginal implements SpatialDataTransferInter
     }
     }
 
 
     private AnimComposer getAndRemoveControl(final Spatial mySpatial) {
     private AnimComposer getAndRemoveControl(final Spatial mySpatial) {
-        final AnimComposer myAnimControl =
-                mySpatial.getControl(AnimComposer.class);
+        final AnimComposer myAnimControl
+                = mySpatial.getControl(AnimComposer.class);
         if (myAnimControl != null) {
         if (myAnimControl != null) {
             mySpatial.removeControl(myAnimControl);
             mySpatial.removeControl(myAnimControl);
         }
         }
@@ -74,36 +77,63 @@ public final class AnimationDataFromOriginal implements SpatialDataTransferInter
     }
     }
 
 
     private void updateAndAddControl(final Spatial spatial,
     private void updateAndAddControl(final Spatial spatial,
-                                     final AnimComposer newControl, 
-                                     final AnimComposer originalControl) {
-        newControl.cloneFields(new Cloner(),
-                originalControl.jmeClone());
-        copyAnimClips(newControl, originalControl);
+            final AnimComposer originalAnimComposer,
+            final SkinningControl originalSkinningControl) {
+        Cloner cloner = new Cloner();
+        AnimComposer newControl = new AnimComposer();
+        newControl.cloneFields(cloner,
+                originalAnimComposer);
+
+        copyAnimClips(newControl, originalAnimComposer);
         if (spatial.getControl(AnimComposer.class) == null) {
         if (spatial.getControl(AnimComposer.class) == null) {
-            LOGGER.log(Level.FINE, "Adding control for {0}",
+            LOGGER.log(Level.FINE, "Adding AnimComposer for {0}",
                     spatial.getName());
                     spatial.getName());
             spatial.addControl(newControl);
             spatial.addControl(newControl);
         } else {
         } else {
             LOGGER.log(Level.FINE, "Control for {0} was added"
             LOGGER.log(Level.FINE, "Control for {0} was added"
                     + " automatically", spatial.getName());
                     + " automatically", spatial.getName());
         }
         }
+        if (spatial.getControl(SkinningControl.class) == null) {
+            if (originalSkinningControl == null) {
+                LOGGER.log(Level.INFO, "Could not add a SkinningControl. Broken file?");
+            } else {
+                // Armature only used to initialize SkinningControl
+                SkinningControl skinningControl = new SkinningControl(originalSkinningControl.getArmature());
+                skinningControl.cloneFields(cloner,
+                        originalSkinningControl);
+                spatial.addControl(skinningControl);
+                LOGGER.log(Level.FINE, "Adding SkinningControl for {0}",
+                        spatial.getName());
+            }
+        }
     }
     }
 
 
     private void copyAnimClips(final AnimComposer control,
     private void copyAnimClips(final AnimComposer control,
-                               final AnimComposer original) {
+            final AnimComposer original) {
+        final Collection<AnimClip> clips2 = control.getAnimClips();
+        for (final AnimClip c : clips2) {
+            control.removeAnimClip(c);
+        }
+
         final Collection<AnimClip> clips = original.getAnimClips();
         final Collection<AnimClip> clips = original.getAnimClips();
         for (final AnimClip c : clips) {
         for (final AnimClip c : clips) {
-            control.addAnimClip(c);
+            control.addAnimClip((AnimClip) c.jmeClone());
+            control.makeAction(c.getName());
+            LOGGER.log(Level.INFO, "Copied clip {0}",
+                    c.getName());
         }
         }
     }
     }
 
 
-
     private void removeAnimData(final Spatial root) {
     private void removeAnimData(final Spatial root) {
         root.depthFirstTraversal(spatial -> {
         root.depthFirstTraversal(spatial -> {
             AnimComposer animControl = spatial.getControl(AnimComposer.class);
             AnimComposer animControl = spatial.getControl(AnimComposer.class);
             if (animControl != null) {
             if (animControl != null) {
                 spatial.removeControl(animControl);
                 spatial.removeControl(animControl);
             }
             }
+            SkinningControl skinningControl = spatial.getControl(SkinningControl.class);
+            if (skinningControl != null) {
+                spatial.removeControl(skinningControl);
+            }
         });
         });
     }
     }