|
|
|
@ -32,12 +32,19 @@ |
|
|
|
|
package com.jme3.gde.ogrexml; |
|
|
|
|
|
|
|
|
|
import com.jme3.asset.ModelKey; |
|
|
|
|
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 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 OgreXMLDataObject extends SpatialAssetDataObject { |
|
|
|
|
|
|
|
|
@ -53,5 +60,58 @@ public class OgreXMLDataObject extends SpatialAssetDataObject { |
|
|
|
|
assetKey = new OgreMeshKey(super.getAssetKey().getName()); |
|
|
|
|
return (OgreMeshKey)assetKey; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public synchronized Spatial loadAsset() { |
|
|
|
|
if (isModified() && savable != null) { |
|
|
|
|
return (Spatial) savable; |
|
|
|
|
} |
|
|
|
|
ProjectAssetManager mgr = getLookup().lookup(ProjectAssetManager.class); |
|
|
|
|
if (mgr == null) { |
|
|
|
|
DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message("File is not part of a project!\nCannot load without ProjectAssetManager.")); |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
String name = getPrimaryFile().getName(); |
|
|
|
|
int idx = name.toLowerCase().indexOf(".mesh"); |
|
|
|
|
if(idx!=-1){ |
|
|
|
|
name = name.substring(0, idx); |
|
|
|
|
} |
|
|
|
|
String matName = ((OgreMeshKey)getAssetKey()).getMaterialName(); |
|
|
|
|
if(matName == null){ |
|
|
|
|
matName = name; |
|
|
|
|
} |
|
|
|
|
FileObject sourceMatFile = getPrimaryFile().getParent().getFileObject(matName, "material"); |
|
|
|
|
if (sourceMatFile == null || !sourceMatFile.isValid()) { |
|
|
|
|
Confirmation msg = new NotifyDescriptor.Confirmation( |
|
|
|
|
"No material file found for " + getPrimaryFile().getNameExt() + "\n" |
|
|
|
|
+ "A file named " + matName + ".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()); |
|
|
|
|
listListener.start(); |
|
|
|
|
Spatial spatial = mgr.loadModel(getAssetKey()); |
|
|
|
|
listListener.stop(); |
|
|
|
|
savable = spatial; |
|
|
|
|
lock.releaseLock(); |
|
|
|
|
return spatial; |
|
|
|
|
} catch (Exception ex) { |
|
|
|
|
Exceptions.printStackTrace(ex); |
|
|
|
|
} finally { |
|
|
|
|
if (lock != null) { |
|
|
|
|
lock.releaseLock(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|