- 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
3.0
nor..67 13 years ago
parent fdd29d7be3
commit c624043ea1
  1. 4
      sdk/jme3-ogretools/src/com/jme3/gde/ogretools/convert/AdvOgreXMLConvertAction.java
  2. 54
      sdk/jme3-ogrexml/src/com/jme3/gde/ogrexml/OgreSceneDataObject.java
  3. 96
      sdk/jme3-ogrexml/src/com/jme3/gde/ogrexml/OgreXMLDataObject.java

@ -4,7 +4,6 @@
*/ */
package com.jme3.gde.ogretools.convert; package com.jme3.gde.ogretools.convert;
import com.jme3.asset.DesktopAssetManager;
import com.jme3.export.binary.BinaryExporter; import com.jme3.export.binary.BinaryExporter;
import com.jme3.gde.core.assets.ProjectAssetManager; import com.jme3.gde.core.assets.ProjectAssetManager;
import com.jme3.scene.Spatial; import com.jme3.scene.Spatial;
@ -17,7 +16,6 @@ import org.netbeans.api.progress.ProgressHandleFactory;
import org.openide.DialogDisplayer; import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor; import org.openide.NotifyDescriptor;
import org.openide.NotifyDescriptor.Confirmation; import org.openide.NotifyDescriptor.Confirmation;
import org.openide.filesystems.FileLock;
import org.openide.filesystems.FileObject; import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil; import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataObject; import org.openide.loaders.DataObject;
@ -59,7 +57,7 @@ public final class AdvOgreXMLConvertAction implements ActionListener {
return; return;
} }
FileObject sourceMatFile = FileUtil.toFileObject(new File(options.getSourceFile().replaceAll("mesh.xml", "material"))); FileObject sourceMatFile = FileUtil.toFileObject(new File(options.getSourceFile().replaceAll("mesh.xml", "material")));
if (sourceMatFile.isValid()) { if (sourceMatFile != null && sourceMatFile.isValid()) {
try { try {
sourceMatFile.copy(sourceMatFile.getParent(), "+" + sourceMatFile.getName(), sourceMatFile.getExt()); sourceMatFile.copy(sourceMatFile.getParent(), "+" + sourceMatFile.getName(), sourceMatFile.getExt());
} catch (IOException ex) { } catch (IOException ex) {

@ -31,11 +31,18 @@
*/ */
package com.jme3.gde.ogrexml; package com.jme3.gde.ogrexml;
import com.jme3.gde.core.assets.ProjectAssetManager;
import com.jme3.gde.core.assets.SpatialAssetDataObject; import com.jme3.gde.core.assets.SpatialAssetDataObject;
import com.jme3.scene.Spatial;
import java.io.IOException; 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.filesystems.FileObject;
import org.openide.loaders.DataObjectExistsException; import org.openide.loaders.DataObjectExistsException;
import org.openide.loaders.MultiFileLoader; import org.openide.loaders.MultiFileLoader;
import org.openide.util.Exceptions;
public class OgreSceneDataObject extends SpatialAssetDataObject { public class OgreSceneDataObject extends SpatialAssetDataObject {
@ -43,4 +50,51 @@ public class OgreSceneDataObject extends SpatialAssetDataObject {
super(pf, loader); 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;
}
} }

@ -32,12 +32,23 @@
package com.jme3.gde.ogrexml; package com.jme3.gde.ogrexml;
import com.jme3.asset.ModelKey; 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.gde.core.assets.SpatialAssetDataObject;
import com.jme3.scene.Spatial;
import com.jme3.scene.plugins.ogre.OgreMeshKey; import com.jme3.scene.plugins.ogre.OgreMeshKey;
import java.io.IOException; 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.filesystems.FileObject;
import org.openide.loaders.DataObject;
import org.openide.loaders.DataObjectExistsException; import org.openide.loaders.DataObjectExistsException;
import org.openide.loaders.MultiFileLoader; import org.openide.loaders.MultiFileLoader;
import org.openide.util.Exceptions;
public class OgreXMLDataObject extends SpatialAssetDataObject { public class OgreXMLDataObject extends SpatialAssetDataObject {
@ -53,5 +64,90 @@ public class OgreXMLDataObject extends SpatialAssetDataObject {
assetKey = new OgreMeshKey(super.getAssetKey().getName()); assetKey = new OgreMeshKey(super.getAssetKey().getName());
return (OgreMeshKey)assetKey; 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);
}
}
} }

Loading…
Cancel
Save