From c624043ea149b7a4590127991a6168aab875d3bb Mon Sep 17 00:00:00 2001 From: "nor..67" Date: Sat, 17 Sep 2011 11:54:24 +0000 Subject: [PATCH] - Fix Advanced OgreXML import crashing without material file - Show warning when no material file is found for OgreXML/Scene files - Convert File.mesh.xml to File.j3o instead of File.mesh.j3o git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8262 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../convert/AdvOgreXMLConvertAction.java | 4 +- .../jme3/gde/ogrexml/OgreSceneDataObject.java | 54 +++++++++++ .../jme3/gde/ogrexml/OgreXMLDataObject.java | 96 +++++++++++++++++++ 3 files changed, 151 insertions(+), 3 deletions(-) diff --git a/sdk/jme3-ogretools/src/com/jme3/gde/ogretools/convert/AdvOgreXMLConvertAction.java b/sdk/jme3-ogretools/src/com/jme3/gde/ogretools/convert/AdvOgreXMLConvertAction.java index 41aa2a9df..ca9fd3c7a 100644 --- a/sdk/jme3-ogretools/src/com/jme3/gde/ogretools/convert/AdvOgreXMLConvertAction.java +++ b/sdk/jme3-ogretools/src/com/jme3/gde/ogretools/convert/AdvOgreXMLConvertAction.java @@ -4,7 +4,6 @@ */ package com.jme3.gde.ogretools.convert; -import com.jme3.asset.DesktopAssetManager; import com.jme3.export.binary.BinaryExporter; import com.jme3.gde.core.assets.ProjectAssetManager; import com.jme3.scene.Spatial; @@ -17,7 +16,6 @@ import org.netbeans.api.progress.ProgressHandleFactory; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.NotifyDescriptor.Confirmation; -import org.openide.filesystems.FileLock; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.loaders.DataObject; @@ -59,7 +57,7 @@ public final class AdvOgreXMLConvertAction implements ActionListener { return; } FileObject sourceMatFile = FileUtil.toFileObject(new File(options.getSourceFile().replaceAll("mesh.xml", "material"))); - if (sourceMatFile.isValid()) { + if (sourceMatFile != null && sourceMatFile.isValid()) { try { sourceMatFile.copy(sourceMatFile.getParent(), "+" + sourceMatFile.getName(), sourceMatFile.getExt()); } catch (IOException ex) { diff --git a/sdk/jme3-ogrexml/src/com/jme3/gde/ogrexml/OgreSceneDataObject.java b/sdk/jme3-ogrexml/src/com/jme3/gde/ogrexml/OgreSceneDataObject.java index 751fdee88..ea42e3819 100644 --- a/sdk/jme3-ogrexml/src/com/jme3/gde/ogrexml/OgreSceneDataObject.java +++ b/sdk/jme3-ogrexml/src/com/jme3/gde/ogrexml/OgreSceneDataObject.java @@ -31,11 +31,18 @@ */ package com.jme3.gde.ogrexml; +import com.jme3.gde.core.assets.ProjectAssetManager; import com.jme3.gde.core.assets.SpatialAssetDataObject; +import com.jme3.scene.Spatial; import java.io.IOException; +import org.openide.DialogDisplayer; +import org.openide.NotifyDescriptor; +import org.openide.NotifyDescriptor.Confirmation; +import org.openide.filesystems.FileLock; import org.openide.filesystems.FileObject; import org.openide.loaders.DataObjectExistsException; import org.openide.loaders.MultiFileLoader; +import org.openide.util.Exceptions; public class OgreSceneDataObject extends SpatialAssetDataObject { @@ -43,4 +50,51 @@ public class OgreSceneDataObject extends SpatialAssetDataObject { super(pf, loader); } + @Override + public Spatial loadAsset() { + if (isModified() && savable != null) { + return (Spatial) savable; + } + ProjectAssetManager mgr = getLookup().lookup(ProjectAssetManager.class); + if (mgr == null) { + return null; + } + String name = getPrimaryFile().getName(); + FileObject sourceMatFile = getPrimaryFile().getParent().getFileObject(name, "material"); + if (sourceMatFile != null && sourceMatFile.isValid()) { + try { + sourceMatFile.copy(sourceMatFile.getParent(), "+" + sourceMatFile.getName(), sourceMatFile.getExt()); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } else { + Confirmation msg = new NotifyDescriptor.Confirmation( + "No material file found for " + getPrimaryFile().getNameExt() + "\n" + + "A file named " + name + ".material should be in the same folder.\n" + + "Press OK to import mesh only.", + NotifyDescriptor.OK_CANCEL_OPTION, + NotifyDescriptor.WARNING_MESSAGE); + Object result = DialogDisplayer.getDefault().notify(msg); + if (!NotifyDescriptor.OK_OPTION.equals(result)) { + return null; + } + } + + FileLock lock = null; + try { + lock = getPrimaryFile().lock(); + mgr.deleteFromCache(getAssetKey()); + Spatial spatial = mgr.loadModel(getAssetKey()); + savable = spatial; + lock.releaseLock(); + return spatial; + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + } finally { + if (lock != null) { + lock.releaseLock(); + } + } + return null; + } } diff --git a/sdk/jme3-ogrexml/src/com/jme3/gde/ogrexml/OgreXMLDataObject.java b/sdk/jme3-ogrexml/src/com/jme3/gde/ogrexml/OgreXMLDataObject.java index 3aa1e450d..0a4451368 100644 --- a/sdk/jme3-ogrexml/src/com/jme3/gde/ogrexml/OgreXMLDataObject.java +++ b/sdk/jme3-ogrexml/src/com/jme3/gde/ogrexml/OgreXMLDataObject.java @@ -32,12 +32,23 @@ package com.jme3.gde.ogrexml; import com.jme3.asset.ModelKey; +import com.jme3.gde.core.assets.AssetData; +import com.jme3.gde.core.assets.ProjectAssetManager; import com.jme3.gde.core.assets.SpatialAssetDataObject; +import com.jme3.scene.Spatial; import com.jme3.scene.plugins.ogre.OgreMeshKey; import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.openide.DialogDisplayer; +import org.openide.NotifyDescriptor; +import org.openide.NotifyDescriptor.Confirmation; +import org.openide.filesystems.FileLock; import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; import org.openide.loaders.DataObjectExistsException; import org.openide.loaders.MultiFileLoader; +import org.openide.util.Exceptions; public class OgreXMLDataObject extends SpatialAssetDataObject { @@ -53,5 +64,90 @@ public class OgreXMLDataObject extends SpatialAssetDataObject { assetKey = new OgreMeshKey(super.getAssetKey().getName()); return (OgreMeshKey)assetKey; } + + @Override + public Spatial loadAsset() { + if (isModified() && savable != null) { + return (Spatial) savable; + } + ProjectAssetManager mgr = getLookup().lookup(ProjectAssetManager.class); + if (mgr == null) { + return null; + } + String name = getPrimaryFile().getName(); + int idx = name.toLowerCase().indexOf(".mesh"); + if(idx!=-1){ + name = name.substring(0, idx); + } + FileObject sourceMatFile = getPrimaryFile().getParent().getFileObject(name, "material"); + if (sourceMatFile != null && sourceMatFile.isValid()) { + try { + sourceMatFile.copy(sourceMatFile.getParent(), "+" + sourceMatFile.getName(), sourceMatFile.getExt()); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } else { + Confirmation msg = new NotifyDescriptor.Confirmation( + "No material file found for " + getPrimaryFile().getNameExt() + "\n" + + "A file named " + name + ".material should be in the same folder.\n" + + "Press OK to import mesh only.", + NotifyDescriptor.OK_CANCEL_OPTION, + NotifyDescriptor.WARNING_MESSAGE); + Object result = DialogDisplayer.getDefault().notify(msg); + if (!NotifyDescriptor.OK_OPTION.equals(result)) { + return null; + } + } + + FileLock lock = null; + try { + lock = getPrimaryFile().lock(); + mgr.deleteFromCache(getAssetKey()); + Spatial spatial = mgr.loadModel(getAssetKey()); + savable = spatial; + lock.releaseLock(); + return spatial; + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + } finally { + if (lock != null) { + lock.releaseLock(); + } + } + return null; + } + public void saveAsset() throws IOException { + super.saveAsset(); + ProjectAssetManager mgr = getLookup().lookup(ProjectAssetManager.class); + if (mgr == null) { + return; + } + FileObject outFile = null; + if (saveExtension == null) { + outFile = getPrimaryFile(); + } else { + String name = getPrimaryFile().getName(); + int idx = name.toLowerCase().indexOf(".mesh"); + if(idx!=-1){ + name = name.substring(0, idx); + } + outFile = getPrimaryFile().getParent().getFileObject(name, saveExtension); + if (outFile == null) { + Logger.getLogger(SpatialAssetDataObject.class.getName()).log(Level.SEVERE, "Could not locate saved file."); + return; + } + } + try { + DataObject targetModel = DataObject.find(outFile); + AssetData properties = targetModel.getLookup().lookup(AssetData.class); + if (properties != null) { + properties.loadProperties(); + properties.setProperty("ORIGINAL_PATH", mgr.getRelativeAssetPath(outFile.getPath())); + properties.saveProperties(); + } + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + } + } }