diff --git a/sdk/jme3-assetpack-support/nbproject/genfiles.properties b/sdk/jme3-assetpack-support/nbproject/genfiles.properties
index 3e43796f0..21e363861 100644
--- a/sdk/jme3-assetpack-support/nbproject/genfiles.properties
+++ b/sdk/jme3-assetpack-support/nbproject/genfiles.properties
@@ -3,6 +3,6 @@ build.xml.script.CRC32=c0969383
build.xml.stylesheet.CRC32=a56c6a5b@1.42.2
# 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=71a82056
+nbproject/build-impl.xml.data.CRC32=0fd46426
nbproject/build-impl.xml.script.CRC32=4d376df0
-nbproject/build-impl.xml.stylesheet.CRC32=238281d1@1.42.2
+nbproject/build-impl.xml.stylesheet.CRC32=238281d1@1.45.1
diff --git a/sdk/jme3-assetpack-support/nbproject/project.xml b/sdk/jme3-assetpack-support/nbproject/project.xml
index fa88b8a9b..11b14ecef 100644
--- a/sdk/jme3-assetpack-support/nbproject/project.xml
+++ b/sdk/jme3-assetpack-support/nbproject/project.xml
@@ -42,6 +42,15 @@
0.6.1
+
+ org.netbeans.api.java.classpath
+
+
+
+ 1
+ 1.30
+
+
org.netbeans.api.progress
diff --git a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/AssetConfiguration.java b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/AssetConfiguration.java
new file mode 100644
index 000000000..97ab33bda
--- /dev/null
+++ b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/AssetConfiguration.java
@@ -0,0 +1,44 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.jme3.gde.assetpack;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * Configuration for a single asset item while loading
+ * @author normenhansen
+ */
+public class AssetConfiguration {
+
+ private Element assetElement;
+ private List variationAssets;
+
+ public AssetConfiguration(Element assetElement) {
+ this.assetElement = assetElement;
+ }
+
+ public Element getAssetElement() {
+ return assetElement;
+ }
+
+ public List getVariationAssets() {
+ return variationAssets;
+ }
+
+ public void addVariationAssets(Element variationElement) {
+ if (variationAssets == null) {
+ variationAssets = new ArrayList();
+ }
+ variationAssets.add(variationElement.getElementsByTagName("file"));
+ }
+
+ public void clearExtraAssets() {
+ variationAssets.clear();
+ }
+
+}
diff --git a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/AssetPackLoader.java b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/AssetPackLoader.java
index 6e65a321f..e2e9ee09e 100644
--- a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/AssetPackLoader.java
+++ b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/AssetPackLoader.java
@@ -4,10 +4,6 @@
*/
package com.jme3.gde.assetpack;
-import com.jme3.animation.AnimControl;
-import com.jme3.animation.BoneAnimation;
-import com.jme3.animation.BoneTrack;
-import com.jme3.animation.SkeletonControl;
import com.jme3.asset.ModelKey;
import com.jme3.gde.assetpack.actions.AddAssetAction;
import com.jme3.gde.assetpack.project.wizards.FileDescription;
@@ -23,13 +19,14 @@ import com.jme3.scene.plugins.ogre.matext.MaterialExtensionSet;
import com.jme3.scene.plugins.ogre.matext.OgreMaterialKey;
import java.io.File;
import java.io.IOException;
-import java.util.Collection;
+import java.util.ArrayList;
import java.util.Iterator;
-import java.util.LinkedList;
+import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
+import org.openide.util.Exceptions;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -39,28 +36,68 @@ import org.w3c.dom.NodeList;
*/
public class AssetPackLoader {
- public static Spatial loadAssetPackModel(Element assetElement, ProjectAssetManager pm) {
+ public static Spatial loadAssetPackModel(ProjectAssetManager pm, AssetConfiguration config) {
+ Element assetElement = config.getAssetElement();
NodeList fileNodeList = assetElement.getElementsByTagName("file");
Element fileElement = XmlHelper.findChildElementWithAttribute(assetElement, "file", "main", "true");
if (fileElement == null) {
fileElement = XmlHelper.findChildElement(assetElement, "file");
}
+ //find main files for this model
+ List files = new ArrayList();
+ while (fileElement != null) {
+ files.add(fileElement);
+ //TODO:doesnt work?
+ fileElement = XmlHelper.findNextElementWithAttribute(fileElement, "file", "main", "true");
+ }
+
+ //find material varations for this model
+ List selList = new ArrayList();
+ Element matset = XmlHelper.findChildElement(assetElement, "materialvariations");
+ if (matset != null) {
+ Element part = XmlHelper.findChildElement(matset, "mesh");
+ String partName = null;
+ while (part != null) {
+ partName = part.getAttribute("name");
+ ArrayList variations = new ArrayList();
+ selList.add(new SelectionEntry(partName, variations));
+ Element variation = XmlHelper.findChildElement(part, "variation");
+ while (variation != null) {
+ variations.add(variation);
+ variation = XmlHelper.findNextSiblingElement(variation);
+ }
+ part = XmlHelper.findNextSiblingElement(part);
+ }
+ }
+ //let user select variation
+ boolean selectable = false;
+ for (Iterator it = selList.iterator(); it.hasNext();) {
+ SelectionEntry selectionEntry = it.next();
+ if (selectionEntry.names.size() > 1) {
+ selectable = true;
+ }
+ }
+ if (selectable) {
+ new VariationSelection(selList).setVisible(true);
+ }
+ for (Iterator it = selList.iterator(); it.hasNext();) {
+ SelectionEntry selectionEntry = it.next();
+ config.addVariationAssets(selectionEntry.getSelected());
+ }
Spatial model = null;
Node node = null;
- while (fileElement != null) {
- Logger.getLogger(AssetPackLoader.class.getName()).log(Level.INFO, "Load main file {0}", fileElement.getAttribute("path"));
+ for (Element element : files) {
+ Logger.getLogger(AssetPackLoader.class.getName()).log(Level.INFO, "Load main file {0}", element.getAttribute("path"));
if (model != null && node == null) {
node = new Node(assetElement.getAttribute("name"));
node.attachChild(model);
}
- model = AssetPackLoader.loadSingleMesh(fileElement, fileNodeList, pm);
+ model = AssetPackLoader.loadSingleMesh(element, fileNodeList, config.getVariationAssets(), pm);
if (model != null && node != null) {
node.attachChild(model);
} else {
Logger.getLogger(AssetPackLoader.class.getName()).log(Level.WARNING, "Error loading model");
}
- //TODO:doesnt work?
- fileElement = XmlHelper.findNextElementWithAttribute(fileElement, "file", "main", "true");
}
if (node != null) {
return node;
@@ -68,64 +105,7 @@ public class AssetPackLoader {
return model;
}
- // TODO: merge animation controls for multi meshes
- private static void moveControls(Spatial from, Node to) {
- AnimControl control = to.getControl(AnimControl.class);
- AnimControl control2 = from.getControl(AnimControl.class);
- if (control == null) {
- SkeletonControl fromSkeletonControl = from.getControl(SkeletonControl.class);
- control = new AnimControl(control2.getSkeleton());
- SkeletonControl toSkeletonControl = to.getControl(SkeletonControl.class);
- if (toSkeletonControl == null) {
- toSkeletonControl = new SkeletonControl(fromSkeletonControl.getTargets(), control.getSkeleton());
- }
- to.addControl(control);
- to.addControl(toSkeletonControl);
- }
- Collection names = control.getAnimationNames();
- Collection names2 = new LinkedList(control2.getAnimationNames());
- //add tracks from anims interface second that exist in first
- for (Iterator it = names.iterator(); it.hasNext();) {
- String string = it.next();
- names2.remove(string);
- BoneAnimation anim = control.getAnim(string);
- BoneTrack[] tracks = anim.getTracks();
- BoneAnimation anim2 = control2.getAnim(string);
- if (anim2 != null) {
- BoneTrack[] tracks2 = anim2.getTracks();
- BoneTrack[] newTracks = new BoneTrack[tracks.length + tracks2.length];
- for (int i = 0; i < tracks.length; i++) {
- newTracks[i] = tracks[i];
- }
- for (int i = tracks.length; i < tracks2.length; i++) {
- newTracks[i] = tracks2[i - tracks.length];
- }
- anim.setTracks(newTracks);
- }
- }
- //add tracks from anims in second to first
- for (Iterator it = names2.iterator(); it.hasNext();) {
- String string = it.next();
- BoneAnimation anim2 = control2.getAnim(string);
- BoneTrack[] tracks2 = anim2.getTracks();
- BoneAnimation anim = control.getAnim(string);
- if (anim != null) {
- BoneTrack[] tracks = anim.getTracks();
- BoneTrack[] newTracks = new BoneTrack[tracks.length + tracks2.length];
- for (int i = 0; i < tracks.length; i++) {
- newTracks[i] = tracks[i];
- }
- for (int i = tracks.length; i < tracks2.length; i++) {
- newTracks[i] = tracks2[i - tracks.length];
- }
- anim.setTracks(newTracks);
- } else {
- control.addAnim(anim2);
- }
- }
- }
-
- private static Spatial loadSingleMesh(Element fileElement, NodeList fileNodeList, ProjectAssetManager pm) {
+ private static Spatial loadSingleMesh(Element fileElement, NodeList fileNodeList, List variationNodeList, ProjectAssetManager pm) {
ModelKey key = null;
Material mat = null;
Spatial model;
@@ -203,6 +183,37 @@ public class AssetPackLoader {
} else if (hasExtension(name, "j3o")) {
//should have all info inside
}
+
+ if (variationNodeList != null) {
+ for (NodeList nodeList : variationNodeList) {
+ for (int i = 0; i < nodeList.getLength(); i++) {
+ Element fileElem = (Element) nodeList.item(i);
+ String type = fileElem.getAttribute("type");
+ String path = fileElem.getAttribute("path");
+ if ("material".equals(type)) {
+ if (hasExtension(path, "j3m")) {
+ mat = pm.loadMaterial(path);
+ } else if (hasExtension(path, "material")) {
+ if (matList == null) {
+ Logger.getLogger(AssetPackLoader.class.getName()).log(Level.INFO, "Load Ogre Material");
+ OgreMaterialKey matKey = new OgreMaterialKey(path);
+ matKey.setMaterialExtensionSet(matExts);
+ matList = pm.loadAsset(matKey);
+ key = new OgreMeshKey(name, matList);
+ } else {
+ Logger.getLogger(AssetPackLoader.class.getName()).log(Level.INFO, "Add Ogre Material");
+ OgreMaterialKey matKey = new OgreMaterialKey(path);
+ matKey.setMaterialExtensionSet(matExts);
+ MaterialList newMatList = pm.loadAsset(matKey);
+ matList.putAll(newMatList);
+ }
+ }
+ }
+ }
+
+ }
+ }
+
if (key != null && mat != null) {
Logger.getLogger(AddAssetAction.class.getName()).log(Level.WARNING, "j3m and ogre material defined for asset {0}.", name);
}
@@ -233,12 +244,30 @@ public class AssetPackLoader {
return false;
}
+ public static FileDescription getFileDescription(String path) {
+ return getFileDescription(new File(path.replaceAll("/", File.separator)));
+ }
+
public static FileDescription getFileDescription(File file) {
- FileObject fileObject = FileUtil.toFileObject(file);
- return getFileDescription(fileObject);
+ FileObject fileObject;
+ try {
+ fileObject = FileUtil.toFileObject(file.getCanonicalFile());
+ if (fileObject == null) {
+ Logger.getLogger(AssetPackLoader.class.getName()).log(Level.WARNING, "Cannot find asset {0}", file.getPath());
+ return null;
+ }
+ return getFileDescription(fileObject);
+ } catch (IOException ex) {
+ Logger.getLogger(AssetPackLoader.class.getName()).log(Level.WARNING, "Cannot find asset {0}", file.getPath());
+ Exceptions.printStackTrace(ex);
+ }
+ return null;
}
public static FileDescription getFileDescription(FileObject fileObject) {
+ if (fileObject == null) {
+ return null;
+ }
FileDescription description = new FileDescription();
description.setFile(fileObject);
if ("material".equals(fileObject.getExt())) {
@@ -281,8 +310,8 @@ public class AssetPackLoader {
return description;
}
- public static void addAllFiles(Element assetElement, ProjectAssetManager pm) {
- //TODO: not good :/
+ public static void addAllFiles(ProjectAssetManager pm, AssetConfiguration config) {
+ Element assetElement = config.getAssetElement();
NodeList list = assetElement.getElementsByTagName("file");
ProjectAssetManager proman = null;
try {
@@ -316,8 +345,8 @@ public class AssetPackLoader {
return;
}
- public static void addModelFiles(Element assetElement, ProjectAssetManager pm) {
- //TODO: not good :/
+ public static void addModelFiles(ProjectAssetManager pm, AssetConfiguration config) {
+ Element assetElement = config.getAssetElement();
NodeList fileNodeList = assetElement.getElementsByTagName("file");
ProjectAssetManager currentProjectAssetManager = null;
try {
@@ -351,6 +380,68 @@ public class AssetPackLoader {
}
}
}
+ List varAssets = config.getVariationAssets();
+ if (varAssets != null) {
+ for (NodeList nodeList : varAssets) {
+ addVariationFiles(nodeList, pm);
+ }
+ }
+ return;
+ }
+
+ private static void addVariationFiles(NodeList fileNodeList, ProjectAssetManager pm) {
+ ProjectAssetManager currentProjectAssetManager = null;
+ try {
+ currentProjectAssetManager = SceneApplication.getApplication().getCurrentSceneRequest().getManager();
+ if (currentProjectAssetManager == null) {
+ Logger.getLogger(AssetPackLoader.class.getName()).log(Level.SEVERE, "Could not get project asset manager!");
+ return;
+ }
+ } catch (Exception e) {
+ Logger.getLogger(AssetPackLoader.class.getName()).log(Level.SEVERE, "Could not get project asset manager!");
+ return;
+ }
+ for (int i = 0; i < fileNodeList.getLength(); i++) {
+ Element fileElem = (Element) fileNodeList.item(i);
+ String type = fileElem.getAttribute("type");
+ try {
+ if ("texture".equals(type) || "sound".equals(type) || "materialdef".equals(type) || "shader".equals(type) || "other".equals(type)) {
+ String src = pm.getAbsoluteAssetPath(fileElem.getAttribute("path"));
+ if (src == null) {
+ Logger.getLogger(AssetPackLoader.class.getName()).log(Level.SEVERE, "Could not find texture with manager!");
+ return;
+ }
+ FileObject srcFile = FileUtil.toFileObject(new File(src));
+ String destName = currentProjectAssetManager.getAssetFolderName() + "/" + fileElem.getAttribute("path");
+ String destFolder = destName.replace("\\", "/");
+ destFolder = destFolder.substring(0, destFolder.lastIndexOf("/"));
+ FileObject folder = FileUtil.createFolder(new File(destFolder));
+ srcFile.copy(folder, srcFile.getName(), srcFile.getExt());
+ }
+ } catch (IOException ex) {
+ Logger.getLogger(AssetPackLoader.class.getName()).log(Level.SEVERE, "Could not copy texture: {0}", ex.getMessage());
+ }
+ }
return;
}
+
+ public static class SelectionEntry {
+
+ String part;
+ List names;
+ int selected = 0;
+
+ public SelectionEntry(String part, List names) {
+ this.part = part;
+ this.names = names;
+ }
+
+ public Element getSelected() {
+ return names.get(selected);
+ }
+
+ public void setSelected(int selected) {
+ this.selected = selected;
+ }
+ }
}
diff --git a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/Bundle.properties b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/Bundle.properties
index 37e904bbf..efb841e2f 100644
--- a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/Bundle.properties
+++ b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/Bundle.properties
@@ -4,3 +4,4 @@ OpenIDE-Module-Long-Description=\
OpenIDE-Module-Name=AssetPack Support
OpenIDE-Module-Short-Description=AssetPack Support
Templates/Project/AssetPack/AssetPackProject.zip=Asset Pack
+VariationSelection.jButton1.text=OK
diff --git a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/VariationSelection.form b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/VariationSelection.form
new file mode 100644
index 000000000..639f21f3c
--- /dev/null
+++ b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/VariationSelection.form
@@ -0,0 +1,66 @@
+
+
+
diff --git a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/VariationSelection.java b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/VariationSelection.java
new file mode 100644
index 000000000..939049a50
--- /dev/null
+++ b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/VariationSelection.java
@@ -0,0 +1,116 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * VariationSelection.java
+ *
+ * Created on 01.07.2011, 17:15:52
+ */
+package com.jme3.gde.assetpack;
+
+import com.jme3.gde.assetpack.AssetPackLoader.SelectionEntry;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Iterator;
+import java.util.List;
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import org.w3c.dom.Element;
+
+/**
+ *
+ * @author normenhansen
+ */
+public class VariationSelection extends javax.swing.JDialog {
+
+ List list;
+ private boolean canceled = false;
+
+ /** Creates new form VariationSelection */
+ public VariationSelection(List list) {
+ super(new JFrame(), true);
+ this.list = list;
+ setLocationRelativeTo(null);
+ initComponents();
+ updateView();
+ }
+
+ private void updateView() {
+ jPanel1.removeAll();
+ for (Iterator it = list.iterator(); it.hasNext();) {
+ final SelectionEntry selectionEntry = it.next();
+ final JComboBox box = new JComboBox();
+ for (Element element : selectionEntry.names) {
+ box.addItem(element.getAttribute("name"));
+ }
+ box.addActionListener(new ActionListener() {
+
+ public void actionPerformed(ActionEvent e) {
+ selectionEntry.setSelected(box.getSelectedIndex());
+ }
+ });
+ jPanel1.add(box);
+ }
+ pack();
+ }
+
+ /** 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")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jButton1 = new javax.swing.JButton();
+ jScrollPane1 = new javax.swing.JScrollPane();
+ jPanel1 = new javax.swing.JPanel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+
+ jButton1.setText(org.openide.util.NbBundle.getMessage(VariationSelection.class, "VariationSelection.jButton1.text")); // NOI18N
+ jButton1.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButton1ActionPerformed(evt);
+ }
+ });
+
+ jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.PAGE_AXIS));
+ jScrollPane1.setViewportView(jPanel1);
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+ getContentPane().setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jButton1))
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 267, Short.MAX_VALUE)
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 192, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jButton1))
+ );
+
+ pack();
+ }// //GEN-END:initComponents
+
+ private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
+ setVisible(false);
+ }//GEN-LAST:event_jButton1ActionPerformed
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton jButton1;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JScrollPane jScrollPane1;
+ // End of variables declaration//GEN-END:variables
+
+ public boolean isCanceled() {
+ return canceled;
+ }
+}
diff --git a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/actions/AddAssetAction.java b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/actions/AddAssetAction.java
index 534c12dd2..dce4f4da8 100644
--- a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/actions/AddAssetAction.java
+++ b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/actions/AddAssetAction.java
@@ -4,24 +4,20 @@
*/
package com.jme3.gde.assetpack.actions;
+import com.jme3.gde.assetpack.AssetConfiguration;
import com.jme3.gde.assetpack.AssetPackLoader;
-import com.jme3.gde.assetpack.XmlHelper;
import com.jme3.gde.core.assets.ProjectAssetManager;
-import com.jme3.gde.core.scene.SceneApplication;
import com.jme3.scene.Spatial;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeListener;
-import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.Action;
import org.openide.nodes.Node;
import org.w3c.dom.Element;
import com.jme3.gde.scenecomposer.SceneComposerTopComponent;
-import java.io.File;
-import org.openide.filesystems.FileObject;
-import org.openide.filesystems.FileUtil;
-import org.w3c.dom.NodeList;
+import java.util.ArrayList;
+import java.util.List;
public final class AddAssetAction implements Action {
@@ -40,59 +36,18 @@ public final class AddAssetAction implements Action {
Element assetElement = context.getLookup().lookup(Element.class);
String type = assetElement.getAttribute("type");
if ("model".equals(type) || "scene".equals(type)) {
- addModelToScene(assetElement, pm);
- AssetPackLoader.addModelFiles(assetElement, pm);
- } else {
- AssetPackLoader.addAllFiles(assetElement, pm);
- }
- }
-
- private void addModelToScene(Element assetElement, ProjectAssetManager pm) {
-// Element fileElement = XmlHelper.findChildElementWithAttribute(assetElement, "file", "main", "true");
- Spatial model = AssetPackLoader.loadAssetPackModel(assetElement, pm);
- if (model != null) {
- SceneComposerTopComponent.findInstance().addModel(model);
- } else {
- Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Error loading model");
- return;
- }
- }
-
- private void copyModelData(NodeList fileNodeList, ProjectAssetManager pm) {
- //TODO: not good :/
- ProjectAssetManager currentProjectAssetManager = null;
- try {
- currentProjectAssetManager = SceneApplication.getApplication().getCurrentSceneRequest().getManager();
- if (currentProjectAssetManager == null) {
- Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Could not get project asset manager!");
- return;
- }
- } catch (Exception e) {
- Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Could not get project asset manager!");
- return;
- }
- for (int i = 0; i < fileNodeList.getLength(); i++) {
- Element fileElem = (Element) fileNodeList.item(i);
- String type = fileElem.getAttribute("type");
- if ("texture".equals(type) || "sound".equals(type) || "materialdef".equals(type) || "shader".equals(type) || "other".equals(type)) {
- try {
- String src = pm.getAbsoluteAssetPath(fileElem.getAttribute("path"));
- if (src == null) {
- Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Could not find texture with manager!");
- return;
- }
- FileObject srcFile = FileUtil.toFileObject(new File(src));
- String destName = currentProjectAssetManager.getAssetFolderName() + "/" + fileElem.getAttribute("path");
- String destFolder = destName.replace("\\", "/");
- destFolder = destFolder.substring(0, destFolder.lastIndexOf("/"));
- FileObject folder = FileUtil.createFolder(new File(destFolder));
- srcFile.copy(folder, srcFile.getName(), srcFile.getExt());
- } catch (IOException ex) {
- Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Could not copy texture: {0}", ex.getMessage());
- }
+ AssetConfiguration conf = new AssetConfiguration(assetElement);
+ Spatial model = AssetPackLoader.loadAssetPackModel(pm, conf);
+ if (model != null) {
+ SceneComposerTopComponent.findInstance().addModel(model);
+ AssetPackLoader.addModelFiles(pm, conf);
+ } else {
+ Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Error loading model");
}
+ } else {
+ AssetConfiguration conf = new AssetConfiguration(assetElement);
+ AssetPackLoader.addAllFiles(pm, conf);
}
- return;
}
public Object getValue(String key) {
diff --git a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/actions/PreviewAssetAction.java b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/actions/PreviewAssetAction.java
index 505c36c0d..ab48084b6 100644
--- a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/actions/PreviewAssetAction.java
+++ b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/actions/PreviewAssetAction.java
@@ -4,6 +4,7 @@
*/
package com.jme3.gde.assetpack.actions;
+import com.jme3.gde.assetpack.AssetConfiguration;
import com.jme3.gde.assetpack.AssetPackLoader;
import com.jme3.gde.core.assets.ProjectAssetManager;
import com.jme3.gde.core.scene.SceneApplication;
@@ -36,7 +37,7 @@ public final class PreviewAssetAction implements Action {
Element assetElement = context.getLookup().lookup(Element.class);
com.jme3.scene.Node node = new com.jme3.scene.Node("PreviewRootNode");
Spatial model = null;
- model = AssetPackLoader.loadAssetPackModel(assetElement, pm);
+ model = AssetPackLoader.loadAssetPackModel(pm, new AssetConfiguration(assetElement));
node.attachChild(model);
JmeNode jmeNode = NodeUtility.createNode(node);
SceneApplication app = SceneApplication.getApplication();
diff --git a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/project/AssetPackProjectLogicalView.java b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/project/AssetPackProjectLogicalView.java
index 6984d82f2..d1031f527 100644
--- a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/project/AssetPackProjectLogicalView.java
+++ b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/project/AssetPackProjectLogicalView.java
@@ -2,7 +2,9 @@ package com.jme3.gde.assetpack.project;
import com.jme3.gde.assetpack.project.actions.PublishAssetPackAction;
import com.jme3.gde.assetpack.browser.nodes.AssetPackBrowserFolder;
+import com.jme3.gde.assetpack.project.actions.CleanupProjectAction;
import com.jme3.gde.assetpack.project.actions.ConvertOgreBinaryMeshesAction;
+import com.jme3.gde.assetpack.project.actions.ImportWorldForgeAction;
import java.awt.Image;
import java.util.LinkedList;
import java.util.List;
@@ -57,14 +59,16 @@ class AssetPackProjectLogicalView implements LogicalViewProvider {
@Override
public Action[] getActions(boolean arg0) {
- Action[] nodeActions = new Action[8];
+ Action[] nodeActions = new Action[9];
nodeActions[0] = new PublishAssetPackAction(project);
nodeActions[1] = new ConvertOgreBinaryMeshesAction(project);
- nodeActions[2] = CommonProjectActions.copyProjectAction();
- nodeActions[3] = CommonProjectActions.deleteProjectAction();
- nodeActions[5] = CommonProjectActions.setAsMainProjectAction();
- nodeActions[6] = CommonProjectActions.closeProjectAction();
- nodeActions[7] = CommonProjectActions.customizeProjectAction();
+ nodeActions[2] = new ImportWorldForgeAction(project);
+ nodeActions[3] = new CleanupProjectAction(project);
+ nodeActions[4] = CommonProjectActions.copyProjectAction();
+ nodeActions[5] = CommonProjectActions.deleteProjectAction();
+ nodeActions[6] = CommonProjectActions.setAsMainProjectAction();
+ nodeActions[7] = CommonProjectActions.closeProjectAction();
+ nodeActions[8] = CommonProjectActions.customizeProjectAction();
return nodeActions;
}
diff --git a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/project/actions/CleanupProjectAction.java b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/project/actions/CleanupProjectAction.java
new file mode 100644
index 000000000..3733b9b43
--- /dev/null
+++ b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/project/actions/CleanupProjectAction.java
@@ -0,0 +1,112 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.jme3.gde.assetpack.project.actions;
+
+import com.jme3.gde.assetpack.project.AssetPackProject;
+import java.awt.event.ActionEvent;
+import java.beans.PropertyChangeListener;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.Action;
+import org.netbeans.api.progress.ProgressHandle;
+import org.netbeans.api.progress.ProgressHandleFactory;
+import org.openide.filesystems.FileObject;
+import org.openide.util.Exceptions;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+@SuppressWarnings("unchecked")
+public final class CleanupProjectAction implements Action {
+
+ private final AssetPackProject context;
+
+ public CleanupProjectAction(AssetPackProject context) {
+ this.context = context;
+ }
+
+ private void scanFiles(final FileObject folder, final ArrayList paths) {
+ FileObject[] children = folder.getChildren();
+ for (FileObject fileObject : children) {
+ boolean stay = false;
+ if (fileObject.isFolder() && !fileObject.isVirtual()) {
+ scanFiles(fileObject, paths);
+ stay = true;
+ } else if (fileObject.isData()) {
+ if ("png".equalsIgnoreCase(fileObject.getExt())
+ || "jpg".equalsIgnoreCase(fileObject.getExt())
+ || "dds".equalsIgnoreCase(fileObject.getExt())
+ || "bmp".equalsIgnoreCase(fileObject.getExt())) {
+ for (String path : paths) {
+ if (fileObject.getPath().endsWith(path)) {
+ stay = true;
+ }
+ }
+ if (!stay) {
+ try {
+ Logger.getLogger(CleanupProjectAction.class.getName()).log(Level.INFO, "Delete unused file {0}", fileObject);
+ fileObject.delete();
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private ArrayList scanProjectFiles(Element elem, ArrayList elements) {
+ if (elem.getTagName().equals("file")) {
+// Logger.getLogger(CleanupProjectAction.class.getName()).log(Level.INFO, "Found element {0}", elem.getAttribute("path"));
+ elements.add(elem.getAttribute("path"));
+ }
+ NodeList list = elem.getChildNodes();
+ for (int i = 0; i < list.getLength(); i++) {
+ if (list.item(i) instanceof Element) {
+ Element asset = (Element) list.item(i);
+ scanProjectFiles(asset, elements);
+ }
+ }
+ return elements;
+ }
+
+ public void actionPerformed(ActionEvent ev) {
+ final ArrayList files = scanProjectFiles(context.getConfiguration().getDocumentElement(), new ArrayList());
+ new Thread(new Runnable() {
+
+ public void run() {
+ ProgressHandle handle = ProgressHandleFactory.createHandle("Cleanup unused assets..");
+ handle.start();
+ scanFiles(context.getAssetsFolder(), files);
+ handle.finish();
+ }
+ }).start();
+
+ }
+
+ public Object getValue(String key) {
+ if (key.equals(NAME)) {
+ return "Clean unused images";
+ }
+ return null;
+ }
+
+ public void putValue(String key, Object value) {
+ }
+
+ public void setEnabled(boolean b) {
+ }
+
+ public boolean isEnabled() {
+ return true;
+ }
+
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ }
+}
diff --git a/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/project/actions/ImportWorldForgeAction.java b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/project/actions/ImportWorldForgeAction.java
new file mode 100644
index 000000000..5b7f22273
--- /dev/null
+++ b/sdk/jme3-assetpack-support/src/com/jme3/gde/assetpack/project/actions/ImportWorldForgeAction.java
@@ -0,0 +1,578 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.jme3.gde.assetpack.project.actions;
+
+import com.jme3.asset.AssetEventListener;
+import com.jme3.asset.AssetKey;
+import com.jme3.asset.DesktopAssetManager;
+import com.jme3.gde.assetpack.AssetPackLoader;
+import com.jme3.gde.assetpack.XmlHelper;
+import com.jme3.gde.assetpack.project.AssetPackProject;
+import com.jme3.gde.assetpack.project.wizards.FileDescription;
+import com.jme3.gde.core.assets.ProjectAssetManager;
+import com.jme3.gde.ogretools.convert.OgreXMLConvert;
+import com.jme3.gde.ogretools.convert.OgreXMLConvertOptions;
+import com.jme3.material.MaterialList;
+import com.jme3.scene.plugins.ogre.OgreMeshKey;
+import com.jme3.scene.plugins.ogre.matext.MaterialExtension;
+import com.jme3.scene.plugins.ogre.matext.MaterialExtensionSet;
+import com.jme3.scene.plugins.ogre.matext.OgreMaterialKey;
+import java.awt.event.ActionEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.Action;
+import org.netbeans.api.progress.ProgressHandle;
+import org.netbeans.api.progress.ProgressHandleFactory;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.NotifyDescriptor.Message;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+import org.openide.util.Exceptions;
+import org.openide.xml.XMLUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.InputSource;
+
+public final class ImportWorldForgeAction implements Action {
+
+ private final AssetPackProject project;
+ private FileObject folder;
+ private ProjectAssetManager pm;
+ private DesktopAssetManager mgr;
+ private HashMap> matRefs = new HashMap>();
+ private List modelNames = new ArrayList();
+
+ public ImportWorldForgeAction(AssetPackProject context) {
+ this.project = context;
+ pm = project.getProjectAssetManager();
+ folder = pm.getAssetFolder();
+ mgr = new DesktopAssetManager(true);
+ mgr.registerLocator(folder.getPath(), "com.jme3.asset.plugins.FileLocator");
+ }
+
+ public void actionPerformed(ActionEvent ev) {
+ matRefs.clear();
+ modelNames.clear();
+ // TODO use context
+// javax.swing.JFileChooser fr = new javax.swing.JFileChooser();
+// javax.swing.filechooser.FileSystemView fw = fr.getFileSystemView();
+// String projectDir = fw.getDefaultDirectory().getAbsolutePath();
+// FileChooserBuilder builder = new FileChooserBuilder(projectDir);
+// builder.setApproveText("Import");
+// builder.setTitle("Please select WorldForge checkout folder");
+// builder.setDirectoriesOnly(true);
+// final File file = builder.showOpenDialog();
+// if (file == null) {
+// return;
+// }
+ //FileUtil.toFileObject(file);
+ new Thread(new Runnable() {
+
+ public void run() {
+ ProgressHandle handle = ProgressHandleFactory.createHandle("Import WorldForge Models");
+ handle.start();
+ FileObject objects = folder.getFileObject("3d_objects");
+ if (objects == null) {
+ showError("Cannot find worldforge content!\nPlease copy content of worldforge folder\ninto the assets folder of this project!");
+ handle.finish();
+ return;
+ }
+ List binFiles = new ArrayList();
+ convertOgreBinary(folder.getPath(), binFiles, handle);
+ deleteOgreBinary(binFiles);
+ handle.progress("Scanning folder");
+ scanFiles(folder);
+ //iterate through found models and add asset items
+ for (Iterator it = modelNames.iterator(); it.hasNext();) {
+ String modelName = it.next();
+ handle.progress("Scanning " + modelName);
+ //TODO: fill data
+ Element elem = project.getConfiguration().createElement("asset");
+ elem.setAttribute("name", getFileName(modelName));
+ elem.setAttribute("type", "model");
+ elem.setAttribute("format", "ogrexml");
+ elem.setAttribute("categories", getCategory(modelName));
+ elem.setAttribute("tags", getTags(modelName));
+ Element description = project.getConfiguration().createElement("description");
+ elem.appendChild(description);
+
+
+ List matNames = getModelMaterialNames(modelName);
+ Element variationsElement = null;
+ MaterialList keyMaterialList = new MaterialList();
+ //assemble material variation assets and add variations
+ for (String matName : matNames) {
+ MaterialList materialList = null;
+ Element partElement = null;
+ ArrayList matFiles = matRefs.get(matName);
+ if (matFiles != null) {
+ for (String matFile : matFiles) {
+ Element variationElement = null;
+ if (variationsElement == null) {
+ variationsElement = project.getConfiguration().createElement("materialvariations");
+ elem.appendChild(variationsElement);
+ }
+ if (partElement == null) {
+ partElement = project.getConfiguration().createElement("mesh");
+ partElement.setAttribute("name", matName);
+ variationsElement.appendChild(partElement);
+ }
+ List> list = new ArrayList>();
+ materialList = getMaterialAssetList(matFile, list);
+ for (Iterator> it1 = list.iterator(); it1.hasNext();) {
+ AssetKey extends Object> assetKey = it1.next();
+ if (variationElement == null) {
+ variationElement = project.getConfiguration().createElement("variation");
+ variationElement.setAttribute("name", getFolderName(matFile));
+ partElement.appendChild(variationElement);
+ }
+ FileDescription desc = AssetPackLoader.getFileDescription(getAbsoluteAssetPath(assetKey.getName()));
+ if (desc != null) {
+ Element file = project.getConfiguration().createElement("file");
+ file.setAttribute("path", assetKey.getName());
+ file.setAttribute("type", desc.getType());
+ variationElement.appendChild(file);
+ }
+ }
+ }
+ }
+ if (materialList != null) {
+ keyMaterialList.putAll(materialList);
+ }
+ }
+ //assemble main assets and add to file
+ if (keyMaterialList != null) {
+ OgreMeshKey meshKey = new OgreMeshKey(modelName, keyMaterialList);
+ List> list = new ArrayList>();
+ if (getModelAssetList(meshKey, list)) {
+ for (AssetKey> assetKey : list) {
+ Element file = project.getConfiguration().createElement("file");
+ if (assetKey.getName().endsWith(".mesh.xml")) {
+ file.setAttribute("main", "true");
+ }
+ file.setAttribute("path", assetKey.getName());
+ FileDescription descr = AssetPackLoader.getFileDescription(getAbsoluteAssetPath(assetKey.getName()));
+ file.setAttribute("type", descr.getType());
+ elem.appendChild(file);
+ }
+ project.getProjectAssets().appendChild(elem);
+ project.saveSettings();
+ project.getAssetPackFolder().refresh();
+ }
+ }
+ }
+ handle.finish();
+ }
+ }).start();
+ }
+
+ private void scanFiles(FileObject folder) {
+ FileObject[] files = folder.getChildren();
+ for (FileObject fileObject : files) {
+ if (fileObject.isFolder() && !fileObject.isVirtual()) {
+ scanFiles(fileObject);
+ } else if (fileObject.getPath().endsWith(".mesh.xml")) {
+// replaceMeshMatName(fileObject);
+ //TODO: workaround
+ if (!fileObject.getName().equals("campfire.mesh")) {
+ modelNames.add(getRelativeAssetPath(fileObject.getPath()));
+ }
+ } else if ("material".equals(fileObject.getExt())) {
+// replaceMaterialMatName(fileObject);
+ String name = getMaterialName(fileObject);
+ if (name != null) {
+ addMaterialRef(name, getRelativeAssetPath(fileObject.getPath()));
+ }
+ }
+ }
+ }
+
+ private void replaceMaterialMatName(FileObject file) {
+ try {
+ List lines = file.asLines();
+ boolean changed = false;
+ for (int i = 0; i < lines.size(); i++) {
+ String line = lines.get(i);
+ if (line.startsWith("material") && line.contains(":")) {
+ int idx = line.indexOf(":");
+ String matName = line.substring(9, idx).trim();
+ String newName = removePastUnderScore(matName);
+ if (!matName.equals(newName)) {
+ Logger.getLogger(ImportWorldForgeAction.class.getName()).log(Level.INFO, "Change material name for {0}", file);
+ lines.set(i, line.replace(matName, newName));
+ changed = true;
+ }
+ }
+ }
+ if (changed) {
+ OutputStreamWriter out = new OutputStreamWriter(file.getOutputStream());
+ for (String string : lines) {
+ out.write(string + "\n");
+ }
+ out.close();
+ }
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ }
+
+ private void replaceMeshMatName(FileObject file) {
+ InputStream stream = null;
+ try {
+ stream = file.getInputStream();
+ Document doc = XMLUtil.parse(new InputSource(stream), false, false, null, null);
+ stream.close();
+ Element elem = doc.getDocumentElement();
+ if (elem == null) {
+ throw new IllegalStateException("Cannot find root mesh element");
+ }
+ Element submeshes = XmlHelper.findChildElement(elem, "submeshes");
+ if (submeshes == null) {
+ throw new IllegalStateException("Cannot find submeshes element");
+ }
+ Element submesh = XmlHelper.findChildElement(submeshes, "submesh");
+ boolean changed = false;
+ while (submesh != null) {
+ String matName = submesh.getAttribute("material");
+ String newName = removePastUnderScore(matName);
+ if (!matName.equals(newName)) {
+ Logger.getLogger(ImportWorldForgeAction.class.getName()).log(Level.INFO, "Change material name for {0}", file);
+ submesh.setAttribute("material", newName);
+ submesh = XmlHelper.findNextSiblingElement(submesh);
+ changed = true;
+ }
+ }
+ if (changed) {
+ OutputStream out = file.getOutputStream();
+ XMLUtil.write(doc, out, "UTF-8");
+ out.close();
+ }
+
+ } catch (Exception ex) {
+ Exceptions.printStackTrace(ex);
+ } finally {
+ }
+ }
+
+ private String removePastUnderScore(String name) {
+ int idx = name.lastIndexOf("/");
+ if (idx == -1) {
+ return name;
+ }
+ int idx2 = name.indexOf("_", idx);
+ if (idx2 == -1) {
+ return name;
+ } else {
+ return name.substring(0, idx2);
+ }
+ }
+
+ private void addMaterialRef(String matName, String assetName) {
+ ArrayList list = matRefs.get(matName);
+ if (list == null) {
+ list = new ArrayList();
+ matRefs.put(matName, list);
+ }
+ list.add(assetName);
+ }
+
+ private void convertOgreBinary(String dir2scan, List deleteFiles, ProgressHandle handle) {
+ try {
+ File zipDir = new File(dir2scan);
+ String[] dirList = zipDir.list();
+ for (int i = 0; i < dirList.length; i++) {
+ File f = new File(zipDir, dirList[i]);
+ if (f.isDirectory()) {
+ String filePath = f.getPath();
+ convertOgreBinary(filePath, deleteFiles, handle);
+ continue;
+ }
+ FileObject fobj = FileUtil.toFileObject(f);
+ if (fobj.getExt().equalsIgnoreCase("mesh") || fobj.getExt().equalsIgnoreCase("skeleton")) {
+ OgreXMLConvertOptions options = new OgreXMLConvertOptions(fobj.getPath());
+ options.setBinaryFile(true);
+ OgreXMLConvert conv = new OgreXMLConvert();
+ conv.doConvert(options, handle);
+ deleteFiles.add(fobj.getPath());
+ }
+ }
+ } catch (Exception e) {
+ Logger.getLogger(ConvertOgreBinaryMeshesAction.class.getName()).log(Level.SEVERE, "Error scanning directory", e);
+ } finally {
+// handle.finish();
+ }
+ }
+
+ private void deleteOgreBinary(List createdFiles) {
+ for (String string : createdFiles) {
+ new File(string).delete();
+ }
+ }
+
+ private OgreMaterialKey getOgreMaterialKey(String materialName) {
+ /**
+ * /base/normalmap/specular
+ * /base/normalmap
+ * /base/simple
+ */
+ MaterialExtensionSet matExts = new MaterialExtensionSet();
+ MaterialExtension baseLightExt = new MaterialExtension("/base/normalmap/specular",
+ "Common/MatDefs/Light/Lighting.j3md");
+ baseLightExt.setTextureMapping("DiffuseMap", "DiffuseMap");
+ baseLightExt.setTextureMapping("NormalHeightMap", "NormalMap");
+ baseLightExt.setTextureMapping("SpecularMap", "SpecularMap");
+ matExts.addMaterialExtension(baseLightExt);
+
+ MaterialExtension baseLightExt2 = new MaterialExtension("/base/normalmap",
+ "Common/MatDefs/Light/Lighting.j3md");
+ baseLightExt2.setTextureMapping("DiffuseMap", "DiffuseMap");
+ baseLightExt2.setTextureMapping("NormalHeightMap", "NormalMap");
+ baseLightExt2.setTextureMapping("SpecularMap", "SpecularMap");
+ matExts.addMaterialExtension(baseLightExt2);
+
+ MaterialExtension baseLightExt3 = new MaterialExtension("/base/simple",
+ "Common/MatDefs/Light/Lighting.j3md");
+ baseLightExt3.setTextureMapping("DiffuseMap", "DiffuseMap");
+ baseLightExt3.setTextureMapping("NormalHeightMap", "NormalMap");
+ baseLightExt3.setTextureMapping("SpecularMap", "SpecularMap");
+ matExts.addMaterialExtension(baseLightExt3);
+
+ OgreMaterialKey key = new OgreMaterialKey(materialName);
+ key.setMaterialExtensionSet(matExts);
+ return key;
+ }
+
+ private MaterialList getMaterialAssetList(String key, final List> assetKeys) {
+ final AtomicBoolean good = new AtomicBoolean(true);
+ mgr.clearCache();
+ mgr.setAssetEventListener(new AssetEventListener() {
+
+ public void assetLoaded(AssetKey ak) {
+ }
+
+ public void assetRequested(AssetKey ak) {
+ if (!"j3md".equalsIgnoreCase(ak.getExtension())
+ && !"glsllib".equalsIgnoreCase(ak.getExtension())
+ && !"frag".equalsIgnoreCase(ak.getExtension())
+ && !"vert".equalsIgnoreCase(ak.getExtension())
+ && !"vert".equalsIgnoreCase(ak.getExtension())) {
+ assetKeys.add(ak);
+ }
+ if (ak.getName().equals("Common/Materials/RedColor.j3m")) {
+ good.set(false);
+ }
+ }
+ });
+ try {
+ return mgr.loadAsset(getOgreMaterialKey(key));
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ private boolean getModelAssetList(OgreMeshKey key, final List> assetKeys) {
+ final AtomicBoolean good = new AtomicBoolean(true);
+ mgr.clearCache();
+ mgr.setAssetEventListener(new AssetEventListener() {
+
+ public void assetLoaded(AssetKey ak) {
+ }
+
+ public void assetRequested(AssetKey ak) {
+ if (ak instanceof OgreMaterialKey) {
+ MaterialExtensionSet matExts = new MaterialExtensionSet();
+ MaterialExtension baseLightExt = new MaterialExtension("/base/normalmap/specular",
+ "Common/MatDefs/Light/Lighting.j3md");
+ baseLightExt.setTextureMapping("DiffuseMap", "DiffuseMap");
+ baseLightExt.setTextureMapping("NormalHeightMap", "NormalMap");
+ baseLightExt.setTextureMapping("SpecularMap", "SpecularMap");
+ matExts.addMaterialExtension(baseLightExt);
+
+ MaterialExtension baseLightExt2 = new MaterialExtension("/base/normalmap",
+ "Common/MatDefs/Light/Lighting.j3md");
+ baseLightExt2.setTextureMapping("DiffuseMap", "DiffuseMap");
+ baseLightExt2.setTextureMapping("NormalHeightMap", "NormalMap");
+ baseLightExt2.setTextureMapping("SpecularMap", "SpecularMap");
+ matExts.addMaterialExtension(baseLightExt2);
+
+ MaterialExtension baseLightExt3 = new MaterialExtension("/base/simple",
+ "Common/MatDefs/Light/Lighting.j3md");
+ baseLightExt3.setTextureMapping("DiffuseMap", "DiffuseMap");
+ baseLightExt3.setTextureMapping("NormalHeightMap", "NormalMap");
+ baseLightExt3.setTextureMapping("SpecularMap", "SpecularMap");
+ matExts.addMaterialExtension(baseLightExt3);
+
+ ((OgreMaterialKey) ak).setMaterialExtensionSet(matExts);
+
+ }
+ if (!"j3md".equalsIgnoreCase(ak.getExtension())
+ && !"glsllib".equalsIgnoreCase(ak.getExtension())
+ && !"frag".equalsIgnoreCase(ak.getExtension())
+ && !"vert".equalsIgnoreCase(ak.getExtension())
+ && !"vert".equalsIgnoreCase(ak.getExtension())) {
+ assetKeys.add(ak);
+ }
+ if (ak.getName().equals("Common/Materials/RedColor.j3m")) {
+ good.set(false);
+ }
+ }
+ });
+ try {
+ mgr.loadModel(key);
+ } catch (Exception e) {
+ return false;
+ }
+ if (!good.get()) {
+ return false;
+ }
+ return true;
+ }
+
+ private List getModelMaterialNames(String assetName) {
+ List materialNames = new ArrayList();
+ //TODO: check use of File
+ FileObject file = FileUtil.toFileObject(new File(getAbsoluteAssetPath(assetName).replaceAll("/", File.separator)));//Repository.getDefault().findResource(getAbsoluteAssetPath(assetName));
+ InputStream stream = null;
+ try {
+ stream = file.getInputStream();
+ Document doc = XMLUtil.parse(new InputSource(stream), false, false, null, null);
+ Element elem = doc.getDocumentElement();
+ if (elem == null) {
+ throw new IllegalStateException("Cannot find root mesh element");
+ }
+ Element submeshes = XmlHelper.findChildElement(elem, "submeshes");
+ if (submeshes == null) {
+ throw new IllegalStateException("Cannot find submeshes element");
+ }
+ Element submesh = XmlHelper.findChildElement(submeshes, "submesh");
+ while (submesh != null) {
+ String matName = submesh.getAttribute("material");
+ if (!materialNames.contains(matName)) {
+ materialNames.add(matName);
+ }
+ submesh = XmlHelper.findNextSiblingElement(submesh);
+ }
+ } catch (Exception ex) {
+ Exceptions.printStackTrace(ex);
+ } finally {
+ if (stream != null) {
+ try {
+ stream.close();
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ }
+ }
+ return materialNames;
+ }
+
+ private String getMaterialName(FileObject file) {
+ try {
+ System.out.println("MaterialScan " + file);
+ List lines = file.asLines();
+ for (String line : lines) {
+ if (line.startsWith("material") && line.contains(":")) {
+ int idx = line.indexOf(":");
+ return line.substring(9, idx).trim();
+ }
+ }
+
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ return null;
+ }
+
+ private String getRelativeAssetPath(String absolutePath) {
+ String prefix = folder.getPath();
+ int idx = absolutePath.indexOf(prefix);
+ if (idx == 0) {
+ return absolutePath.substring(prefix.length() + 1).replace("./", "");
+ }
+ return null;
+ }
+
+ private String getAbsoluteAssetPath(String relatvePath) {
+ String prefix = folder.getPath();
+ return (prefix + "/" + relatvePath).replace("./", "");
+ }
+
+ private String getTags(String modelName) {
+ String[] strings = modelName.split("/");
+ String ret = null;
+ for (String string : strings) {
+ if (!"models".equals(string) && !"3d_objects".equals(string) && !string.contains(".mesh.xml")) {
+ if (ret == null) {
+ ret = string;
+ } else {
+ ret = ret + ", " + string;
+ }
+ }
+ }
+ return ret;
+ }
+
+ private String getCategory(String modelName) {
+ if (!modelName.startsWith("3d_objects/")) {
+ return "";
+ }
+ int idx = modelName.indexOf("/", 11);
+ if (idx == -1) {
+ return "";
+ }
+ return modelName.substring(11, idx);
+ }
+
+ private String getFolderName(String name) {
+ int start = name.substring(0, name.lastIndexOf("/")).lastIndexOf("/") + 1;
+ return name.substring(start, name.lastIndexOf("/"));
+ }
+
+ private String getFileName(String name) {
+ return name.substring(name.lastIndexOf("/") + 1, name.indexOf("."));
+ }
+
+ private void showError(String e) {
+ Message msg = new NotifyDescriptor.Message(
+ e,
+ NotifyDescriptor.ERROR_MESSAGE);
+ DialogDisplayer.getDefault().notifyLater(msg);
+ }
+
+ public Object getValue(String key) {
+ if (key.equals(NAME)) {
+ return "Scan WorldForge..";
+ }
+ return null;
+ }
+
+ public void putValue(String key, Object value) {
+ }
+
+ public void setEnabled(boolean b) {
+ }
+
+ public boolean isEnabled() {
+ return true;
+ }
+
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ }
+}
diff --git a/sdk/jme3-core/src/com/jme3/gde/core/layer.xml b/sdk/jme3-core/src/com/jme3/gde/core/layer.xml
index 30998ee5e..d6de1295e 100644
--- a/sdk/jme3-core/src/com/jme3/gde/core/layer.xml
+++ b/sdk/jme3-core/src/com/jme3/gde/core/layer.xml
@@ -3,7 +3,7 @@
-
+
@@ -66,7 +66,7 @@
-
+
diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeSpatialChildren.java b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeSpatialChildren.java
index d653f5cd2..f8fd307ed 100644
--- a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeSpatialChildren.java
+++ b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeSpatialChildren.java
@@ -180,7 +180,7 @@ public class JmeSpatialChildren extends Children.Keys