Browse Source

Add: ExtractAnimation SceneComposer Animation Action

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10507 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
tsr 12 years ago
parent
commit
26e86416ed

+ 8 - 8
BasicGameTemplate/nbproject/genfiles.properties

@@ -1,8 +1,8 @@
-build.xml.data.CRC32=94bf7c61
-build.xml.script.CRC32=79a29eb7
[email protected]
-# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
-# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=94bf7c61
-nbproject/build-impl.xml.script.CRC32=0f295843
-nbproject/build-impl.xml.stylesheet.CRC32=[email protected]
+build.xml.data.CRC32=94bf7c61
+build.xml.script.CRC32=79a29eb7
[email protected]
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=13834f8c
+nbproject/build-impl.xml.script.CRC32=d1cfc99b
+nbproject/build-impl.xml.stylesheet.CRC32=[email protected]

+ 18 - 13
BasicGameTemplate/nbproject/project.xml

@@ -1,13 +1,18 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://www.netbeans.org/ns/project/1">
-    <type>org.netbeans.modules.java.j2seproject</type>
-    <configuration>
-        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
-            <name>BasicGameTemplate</name>
-            <source-roots>
-                <root id="src.dir"/>
-            </source-roots>
-            <test-roots/>
-        </data>
-    </configuration>
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.java.j2seproject</type>
+    <configuration>
+        <buildExtensions xmlns="http://www.netbeans.org/ns/ant-build-extender/1">
+            <extension file="assets-impl.xml" id="assets">
+                <dependency dependsOn="-init-assets" target="-do-init"/>
+            </extension>
+        </buildExtensions>
+        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
+            <name>BasicGameTemplate</name>
+            <source-roots>
+                <root id="src.dir"/>
+            </source-roots>
+            <test-roots/>
+        </data>
+    </configuration>
+</project>

+ 1 - 1
branding/core/core.jar/org/netbeans/core/startup/Bundle.properties

@@ -1,6 +1,6 @@
 #Updated by build script
 #Sat, 27 Aug 2011 22:46:29 +0200
-currentVersion=jMonkeyEngine SDK 3.0RC2
+currentVersion=jMonkeyEngine SDK 3.0RC2-pre-svn
 LBL_splash_window_title=Starting jMonkeyEngine SDK
 SPLASH_HEIGHT=350
 SPLASH_WIDTH=500

+ 2 - 2
branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties

@@ -1,4 +1,4 @@
 #Updated by build script
 #Sat, 27 Aug 2011 22:46:29 +0200
-CTL_MainWindow_Title=jMonkeyEngine SDK 3.0RC2
-CTL_MainWindow_Title_No_Project=jMonkeyEngine SDK 3.0RC2
+CTL_MainWindow_Title=jMonkeyEngine SDK 3.0RC2-pre-svn
+CTL_MainWindow_Title_No_Project=jMonkeyEngine SDK 3.0RC2-pre-svn

+ 1 - 0
jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeAnimControl.java

@@ -196,6 +196,7 @@ public class JmeAnimControl extends AbstractSceneExplorerNode {
     }
 
     public void refreshChildren() {
+        ((JmeAnimChildren)this.jmeChildren).refreshChildren(true);
         for (Object node : getChildren().getNodes()) {
             JmeAnimation anim = (JmeAnimation) node;
             ((JmeTrackChildren) anim.getChildren()).refreshChildren(true);

+ 26 - 3
jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeAnimation.java

@@ -40,6 +40,7 @@ import com.jme3.gde.core.icons.IconList;
 import com.jme3.gde.core.properties.AnimationProperty;
 import com.jme3.gde.core.scene.SceneApplication;
 import com.jme3.gde.core.sceneexplorer.nodes.actions.ChannelDialog;
+import com.jme3.gde.core.sceneexplorer.nodes.actions.ExtractSubAnimationDialog;
 import com.jme3.gde.core.sceneexplorer.nodes.actions.impl.tracks.AudioTrackWizardAction;
 import com.jme3.gde.core.sceneexplorer.nodes.actions.impl.tracks.EffectTrackWizardAction;
 import java.awt.Image;
@@ -49,6 +50,7 @@ import java.io.IOException;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import javax.swing.Action;
+import javax.swing.JOptionPane;
 import org.openide.awt.Actions;
 import org.openide.loaders.DataObject;
 import org.openide.nodes.Node;
@@ -138,7 +140,6 @@ public class JmeAnimation extends AbstractSceneExplorerNode {
 
         sheet.put(set);
         return sheet;
-
     }
 
     public void setChanged() {
@@ -151,7 +152,8 @@ public class JmeAnimation extends AbstractSceneExplorerNode {
         return new Action[]{Actions.alwaysEnabled(new PlayAction(), playing ? "Stop" : "Play", "", false),
                     Actions.alwaysEnabled(new PlayBackParamsAction(), "Playback parameters", "", false),
                     Actions.alwaysEnabled(new EffectTrackWizardAction(jmeControl.getLookup().lookup(AnimControl.class).getSpatial(), this), "Add Effect Track", "", false),
-                    Actions.alwaysEnabled(new AudioTrackWizardAction(jmeControl.getLookup().lookup(AnimControl.class).getSpatial(), this), "Add Audio Track", "", false)
+                    Actions.alwaysEnabled(new AudioTrackWizardAction(jmeControl.getLookup().lookup(AnimControl.class).getSpatial(), this), "Add Audio Track", "", false),
+                    Actions.alwaysEnabled(new ExtractAnimationAction(), "Extract sub-animation", "", true)
                 };
     }
 
@@ -264,7 +266,7 @@ public class JmeAnimation extends AbstractSceneExplorerNode {
                                 public void run() {
                                     stop();
                                 }
-                            });                           
+                            });
                         }
 
                         ac.removeListener(this);
@@ -344,6 +346,27 @@ public class JmeAnimation extends AbstractSceneExplorerNode {
         }
 
     }
+
+    class ExtractAnimationAction implements ActionListener {
+
+        ExtractSubAnimationDialog dialog = new ExtractSubAnimationDialog();
+
+        public void actionPerformed(ActionEvent e) {
+            try {
+                dialog.setAnimControl(JmeAnimation.this.jmeControl);
+                dialog.setAnimation(JmeAnimation.this.animation);
+                //animation
+                dialog.setLocationRelativeTo(null);
+                dialog.setVisible(true);
+
+                JmeAnimation.this.jmeControl.fireSave(true);
+                JmeAnimation.this.jmeControl.refresh(true);
+                JmeAnimation.this.jmeControl.refreshChildren();
+            } catch (Exception ex) {
+                JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+            }
+        }
+    }
 //    class AddTrackAction implements ActionListener {
 //
 //        public void actionPerformed(ActionEvent e) {

+ 16 - 0
jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties

@@ -21,3 +21,19 @@ ChannelDialog.jTextField1.text=jTextField1
 ChannelDialog.jButton1.text=Ok
 ChannelDialog.jButton2.text=Cancel
 ChannelDialog.jButton2.actionCommand=Cancel
+ExctractSubAnimationDialog.AccessibleContext.accessibleName=Extract sub animation
+ExctractSubAnimationDialog.border.title=Extract sub animation
+ExtractSubAnimationDialog._btnCancel.actionCommand=Cancel
+ExtractSubAnimationDialog._btnCancel.text=Cancel
+ExtractSubAnimationDialog._btnOk.text=Ok
+ExtractSubAnimationDialog._radFromFile.text=From file
+ExtractSubAnimationDialog._radManual.text=Manual
+ExtractSubAnimationDialog._txtEndFrame.text=0
+ExtractSubAnimationDialog._txtStartFrame.text=0
+ExtractSubAnimationDialog.jLabel3.text=End Frame
+ExtractSubAnimationDialog._txtName.text=extract_animation
+ExtractSubAnimationDialog.jLabel2.text=Start Frame
+ExtractSubAnimationDialog.jLabel1.text=New animation name
+ExtractSubAnimationDialog.jLabel4.text=CSV File
+ExtractSubAnimationDialog._btnBrowse.text=browse
+ExtractSubAnimationDialog._txtCsvFilename.text=

+ 276 - 0
jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/ExtractSubAnimationDialog.form

@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.5" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <NonVisualComponents>
+    <Component class="javax.swing.ButtonGroup" name="_radioGroup">
+    </Component>
+  </NonVisualComponents>
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Component id="jPanel1" max="32767" attributes="0"/>
+                  <Group type="102" alignment="0" attributes="0">
+                      <Component id="_btnCancel" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="32767" attributes="0"/>
+                      <Component id="_btnOk" min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jPanel1" min="-2" max="-2" attributes="0"/>
+              <EmptySpace type="unrelated" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="_btnOk" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="_btnCancel" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+      <Properties>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
+            <TitledBorder title="Extract sub animation">
+              <ResourceString PropertyName="titleX" bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExctractSubAnimationDialog.border.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </TitledBorder>
+          </Border>
+        </Property>
+        <Property name="name" type="java.lang.String" value="" noResource="true"/>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExctractSubAnimationDialog.AccessibleContext.accessibleName" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" attributes="0">
+                          <EmptySpace min="21" pref="21" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="1" attributes="0">
+                              <Component id="jLabel2" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel4" alignment="1" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel1" alignment="1" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="_txtName" max="32767" attributes="0"/>
+                              <Component id="_txtStartFrame" alignment="0" max="32767" attributes="0"/>
+                              <Component id="_txtEndFrame" alignment="0" max="32767" attributes="0"/>
+                              <Group type="102" alignment="0" attributes="0">
+                                  <Component id="_txtCsvFilename" min="-2" pref="455" max="-2" attributes="0"/>
+                                  <EmptySpace pref="12" max="32767" attributes="0"/>
+                                  <Component id="_btnBrowse" min="-2" max="-2" attributes="0"/>
+                              </Group>
+                          </Group>
+                      </Group>
+                      <Group type="102" attributes="0">
+                          <Group type="103" groupAlignment="0" attributes="0">
+                              <Component id="_radManual" min="-2" max="-2" attributes="0"/>
+                              <Component id="_radFromFile" alignment="0" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <Component id="_radManual" min="-2" max="-2" attributes="0"/>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="_txtName" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="_txtStartFrame" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jLabel3" alignment="1" min="-2" max="-2" attributes="0"/>
+                      <Component id="_txtEndFrame" alignment="1" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                  <Component id="_radFromFile" min="-2" max="-2" attributes="0"/>
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="3" attributes="0">
+                      <Component id="jLabel4" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="_txtCsvFilename" alignment="3" min="-2" max="-2" attributes="0"/>
+                      <Component id="_btnBrowse" alignment="3" min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabel1">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <AuxValues>
+            <AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
+            <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
+          </AuxValues>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel2">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog.jLabel2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <AuxValues>
+            <AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
+            <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
+          </AuxValues>
+        </Component>
+        <Component class="javax.swing.JTextField" name="_txtName">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog._txtName.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel3">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog.jLabel3.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <AuxValues>
+            <AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
+            <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
+          </AuxValues>
+        </Component>
+        <Component class="javax.swing.JFormattedTextField" name="_txtStartFrame">
+          <Properties>
+            <Property name="horizontalAlignment" type="int" value="4"/>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog._txtStartFrame.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JFormattedTextField" name="_txtEndFrame">
+          <Properties>
+            <Property name="horizontalAlignment" type="int" value="4"/>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog._txtEndFrame.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JRadioButton" name="_radManual">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog._radManual.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="onRadioClick"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JRadioButton" name="_radFromFile">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog._radFromFile.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="onRadioClick"/>
+          </Events>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel4">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog.jLabel4.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <AuxValues>
+            <AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
+            <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
+          </AuxValues>
+        </Component>
+        <Component class="javax.swing.JTextField" name="_txtCsvFilename">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog._txtCsvFilename.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JButton" name="_btnBrowse">
+          <Properties>
+            <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog._btnBrowse.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="onBrowseClick"/>
+          </Events>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JButton" name="_btnOk">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog._btnOk.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="onOkClick"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="_btnCancel">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog._btnCancel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/sceneexplorer/nodes/actions/Bundle.properties" key="ExtractSubAnimationDialog._btnCancel.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="onCancelClick"/>
+      </Events>
+    </Component>
+  </SubComponents>
+</Form>

+ 460 - 0
jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/ExtractSubAnimationDialog.java

@@ -0,0 +1,460 @@
+ /*
+ *  Copyright (c) 2009-2012 jMonkeyEngine
+ *  All rights reserved.
+ * 
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are
+ *  met:
+ * 
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ *  * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ * 
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.gde.core.sceneexplorer.nodes.actions;
+
+import com.jme3.animation.AnimControl;
+import com.jme3.animation.Animation;
+import com.jme3.animation.BoneTrack;
+import com.jme3.animation.Track;
+import com.jme3.gde.core.scene.SceneApplication;
+import com.jme3.gde.core.sceneexplorer.nodes.JmeAnimControl;
+import com.jme3.math.Quaternion;
+import com.jme3.math.Transform;
+import com.jme3.math.Vector3f;
+import java.awt.Cursor;
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+import javax.swing.SwingWorker;
+import javax.swing.filechooser.FileNameExtensionFilter;
+import org.openide.util.Exceptions;
+
+/**
+ *
+ * @author tsr
+ */
+public class ExtractSubAnimationDialog extends javax.swing.JDialog {
+
+    Animation _animation;
+    JmeAnimControl _animControl;
+    private int _splitAnimationCount;
+
+    /**
+     * Creates new form ChannelDialog
+     */
+    public ExtractSubAnimationDialog() {
+        super((java.awt.Frame) null, true);
+
+        initComponents();
+        _radioGroup.add(_radFromFile);
+        _radioGroup.add(_radManual);
+
+        _radManual.setSelected(true);
+        _txtCsvFilename.setEnabled(false);
+        _btnBrowse.setEnabled(false);
+        _splitAnimationCount = 0;
+    }
+
+    public void setAnimation(Animation animation) {
+        _animation = animation;
+        _txtStartFrame.setValue(0);
+        if (animation.getTracks().length <= 0) {
+            throw new IllegalArgumentException("No Tracks found");
+        }
+        if (animation.getTracks()[0].getClass() != BoneTrack.class) {
+            throw new UnsupportedOperationException("Only Bonetracks are supported");
+        }
+
+        _txtEndFrame.setValue(((BoneTrack) animation.getTracks()[0]).getTimes().length);
+    }
+
+    public void setAnimControl(JmeAnimControl control) {
+        _animControl = control;
+    }
+
+    /**
+     * This method is called from within the constructor to initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is always
+     * regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        _radioGroup = new javax.swing.ButtonGroup();
+        jPanel1 = new javax.swing.JPanel();
+        javax.swing.JLabel jLabel1 = new javax.swing.JLabel();
+        javax.swing.JLabel jLabel2 = new javax.swing.JLabel();
+        _txtName = new javax.swing.JTextField();
+        javax.swing.JLabel jLabel3 = new javax.swing.JLabel();
+        _txtStartFrame = new javax.swing.JFormattedTextField();
+        _txtEndFrame = new javax.swing.JFormattedTextField();
+        _radManual = new javax.swing.JRadioButton();
+        _radFromFile = new javax.swing.JRadioButton();
+        javax.swing.JLabel jLabel4 = new javax.swing.JLabel();
+        _txtCsvFilename = new javax.swing.JTextField();
+        _btnBrowse = new javax.swing.JButton();
+        _btnOk = new javax.swing.JButton();
+        _btnCancel = new javax.swing.JButton();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+
+        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExctractSubAnimationDialog.border.title"))); // NOI18N
+        jPanel1.setName(""); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog.jLabel1.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog.jLabel2.text")); // NOI18N
+
+        _txtName.setText(org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog._txtName.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog.jLabel3.text")); // NOI18N
+
+        _txtStartFrame.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
+        _txtStartFrame.setText(org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog._txtStartFrame.text")); // NOI18N
+
+        _txtEndFrame.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
+        _txtEndFrame.setText(org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog._txtEndFrame.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(_radManual, org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog._radManual.text")); // NOI18N
+        _radManual.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                onRadioClick(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(_radFromFile, org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog._radFromFile.text")); // NOI18N
+        _radFromFile.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                onRadioClick(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog.jLabel4.text")); // NOI18N
+
+        _txtCsvFilename.setText(org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog._txtCsvFilename.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(_btnBrowse, org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog._btnBrowse.text")); // NOI18N
+        _btnBrowse.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                onBrowseClick(evt);
+            }
+        });
+
+        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
+        jPanel1.setLayout(jPanel1Layout);
+        jPanel1Layout.setHorizontalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanel1Layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(jPanel1Layout.createSequentialGroup()
+                        .addGap(21, 21, 21)
+                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                            .addComponent(jLabel2)
+                            .addComponent(jLabel3)
+                            .addComponent(jLabel4)
+                            .addComponent(jLabel1))
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(_txtName)
+                            .addComponent(_txtStartFrame)
+                            .addComponent(_txtEndFrame)
+                            .addGroup(jPanel1Layout.createSequentialGroup()
+                                .addComponent(_txtCsvFilename, javax.swing.GroupLayout.PREFERRED_SIZE, 455, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 12, Short.MAX_VALUE)
+                                .addComponent(_btnBrowse))))
+                    .addGroup(jPanel1Layout.createSequentialGroup()
+                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(_radManual)
+                            .addComponent(_radFromFile))
+                        .addGap(0, 0, Short.MAX_VALUE)))
+                .addContainerGap())
+        );
+        jPanel1Layout.setVerticalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(jPanel1Layout.createSequentialGroup()
+                .addComponent(_radManual)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jLabel1)
+                    .addComponent(_txtName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jLabel2)
+                    .addComponent(_txtStartFrame, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(jLabel3, javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addComponent(_txtEndFrame, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                .addComponent(_radFromFile)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jLabel4)
+                    .addComponent(_txtCsvFilename, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(_btnBrowse)))
+        );
+
+        org.openide.awt.Mnemonics.setLocalizedText(_btnOk, org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog._btnOk.text")); // NOI18N
+        _btnOk.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                onOkClick(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(_btnCancel, org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog._btnCancel.text")); // NOI18N
+        _btnCancel.setActionCommand(org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExtractSubAnimationDialog._btnCancel.actionCommand")); // NOI18N
+        _btnCancel.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                onCancelClick(evt);
+            }
+        });
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+        getContentPane().setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(_btnCancel)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                        .addComponent(_btnOk)))
+                .addContainerGap())
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(_btnOk)
+                    .addComponent(_btnCancel))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+
+        jPanel1.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(ExtractSubAnimationDialog.class, "ExctractSubAnimationDialog.AccessibleContext.accessibleName")); // NOI18N
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void onOkClick(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onOkClick
+        this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+        this.setEnabled(false);
+
+        new SwingWorker<Boolean, Boolean>() {
+            @Override
+            protected void done() {
+                super.done();
+                try {
+                    if (get() == true) {
+                        ExtractSubAnimationDialog.this.setCursor(Cursor.getDefaultCursor());
+                        setVisible(false);
+                    }
+
+                    ExtractSubAnimationDialog.this.setEnabled(true);
+                } catch (InterruptedException ex) {
+                    Exceptions.printStackTrace(ex);
+                } catch (ExecutionException ex) {
+                    Exceptions.printStackTrace(ex);
+                }
+            }
+
+            @Override
+            protected Boolean doInBackground() throws Exception {
+                try {
+                    if (_radManual.isSelected()) {
+                        splitAnimation(_txtName.getText(), (Integer) _txtStartFrame.getValue(), (Integer) _txtEndFrame.getValue());
+                    } else {
+                        processCsv(_txtCsvFilename.getText());
+                    }
+
+                    return true;
+                } catch (IllegalStateException ex) {
+                    final Exception l_ex = ex;
+                    SwingUtilities.invokeLater(new Runnable() {
+                        public void run() {
+                            ExtractSubAnimationDialog.this.setCursor(Cursor.getDefaultCursor());
+                            JOptionPane.showMessageDialog(ExtractSubAnimationDialog.this, l_ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+                        }
+                    });
+                    return false;
+                }
+            }
+        }.execute();
+    }//GEN-LAST:event_onOkClick
+
+    private void processCsv(String filename) {
+        BufferedReader l_reader = null;
+        try {
+            String l_line;
+
+            l_reader = new BufferedReader(new FileReader(filename));
+            //read each l_line of text file
+            while ((l_line = l_reader.readLine()) != null) {
+                String[] l_parts = l_line.split(";");
+
+                if (l_parts.length != 3) {
+                    throw new IllegalStateException("Wrong structure of Csv. Need to be 'name;start frame;end frame'");
+                }
+
+                splitAnimation(l_parts[0], Integer.parseInt(l_parts[1]), Integer.parseInt(l_parts[2]));
+            }
+        } catch (FileNotFoundException ex) {
+            throw new IllegalStateException("Could not find csv");
+        } catch (IOException ex) {
+            throw new IllegalStateException("Error reading csv");
+        } finally {
+            if (l_reader != null) {
+                try {
+                    l_reader.close();
+                } catch (Exception ex) {
+                }
+            }
+        }
+    }
+
+    private void splitAnimation(String name, int start, int end) {
+        final int l_start = start;
+        final int l_end = end;
+        final String l_name = name;
+
+        if ("".equals(name) || name == null) {
+            throw new IllegalStateException("Please enter name for new animation");
+        }
+
+        if (_animControl.getLookup().lookup(AnimControl.class).getAnim(l_name) != null) {
+            throw new IllegalStateException("Please enter unique name for new animation");
+        }
+
+        if (start >= end) {
+            throw new IllegalStateException("Start frame must not be greater than end frame");
+        }
+
+        if (end >= ((BoneTrack) _animation.getTracks()[0]).getTimes().length) {
+            throw new IllegalStateException("End frame must not be greater than source animation end frame");
+        }
+
+        try {
+            SceneApplication.getApplication().enqueue(new Callable<Void>() {
+                public Void call() throws Exception {
+                    Animation l_newAnim;
+                    float l_newTimes[];
+                    Vector3f l_newTranslations[];
+                    Quaternion l_newRotations[];
+                    Vector3f l_newScales[];
+                    float l_newLength;
+                    Track[] l_tracks = new Track[_animation.getTracks().length];
+
+                    l_newLength = (_animation.getLength() / (float) ((BoneTrack) _animation.getTracks()[0]).getTimes().length) * (float) (l_end - l_start);
+                    l_newAnim = new Animation(l_name, l_newLength);
+
+                    for (int j = 0; j < _animation.getTracks().length; j++) {
+                        BoneTrack l_track = (BoneTrack) _animation.getTracks()[j];
+                        l_newTimes = new float[l_end - l_start];
+                        l_newTranslations = new Vector3f[l_end - l_start];
+                        l_newRotations = new Quaternion[l_end - l_start];
+                        l_newScales = new Vector3f[l_end - l_start];
+
+                        for (int i = l_start; i < l_end; i++) {
+                            int l_newFrame = i - l_start;
+
+                            Vector3f l_trans = l_track.getTranslations()[i];
+                            Vector3f l_scale = l_track.getScales()[i];
+                            Quaternion l_rot = l_track.getRotations()[i];
+
+                            l_newTimes[l_newFrame] = l_track.getTimes()[i] - l_track.getTimes()[l_start];
+                            l_newTranslations[l_newFrame] = l_trans.clone();
+                            l_newRotations[l_newFrame] = l_rot.clone();
+                            l_newScales[l_newFrame] = l_scale.clone();
+                        }
+
+                        l_tracks[j] = new BoneTrack(l_track.getTargetBoneIndex(), l_newTimes, l_newTranslations, l_newRotations, l_newScales);
+                    }
+
+                    l_newAnim.setTracks(l_tracks);
+                    _animControl.getLookup().lookup(AnimControl.class).addAnim(l_newAnim);
+
+                    return null;
+                }
+            }).get();
+        } catch (InterruptedException ex) {
+            Exceptions.printStackTrace(ex);
+        } catch (ExecutionException ex) {
+            Exceptions.printStackTrace(ex);
+        }
+    }
+
+    private void onCancelClick(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onCancelClick
+        setVisible(false);
+    }//GEN-LAST:event_onCancelClick
+
+    private void onBrowseClick(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onBrowseClick
+        JFileChooser l_chooser = new JFileChooser();
+        FileNameExtensionFilter l_filter = new FileNameExtensionFilter(
+                "CSV Animation Split file", "csv");
+        l_chooser.setFileFilter(l_filter);
+
+        if (l_chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
+            _txtCsvFilename.setText(l_chooser.getSelectedFile().getPath());
+        }
+    }//GEN-LAST:event_onBrowseClick
+
+    private void onRadioClick(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onRadioClick
+        if (_radManual.isSelected()) {
+            _txtCsvFilename.setEnabled(false);
+            _btnBrowse.setEnabled(false);
+            _txtName.setEnabled(true);
+            _txtStartFrame.setEnabled(true);
+            _txtEndFrame.setEnabled(true);
+        } else {
+            _txtCsvFilename.setEnabled(true);
+            _btnBrowse.setEnabled(true);
+            _txtName.setEnabled(false);
+            _txtStartFrame.setEnabled(false);
+            _txtEndFrame.setEnabled(false);
+        }
+    }//GEN-LAST:event_onRadioClick
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton _btnBrowse;
+    private javax.swing.JButton _btnCancel;
+    private javax.swing.JButton _btnOk;
+    private javax.swing.JRadioButton _radFromFile;
+    private javax.swing.JRadioButton _radManual;
+    private javax.swing.ButtonGroup _radioGroup;
+    private javax.swing.JTextField _txtCsvFilename;
+    private javax.swing.JFormattedTextField _txtEndFrame;
+    private javax.swing.JTextField _txtName;
+    private javax.swing.JFormattedTextField _txtStartFrame;
+    private javax.swing.JPanel jPanel1;
+    // End of variables declaration//GEN-END:variables
+}