- add support for parsing worldforge content to AssetPack projects
- add support for selectable material per asset in AssetPacks - add option for cleaning up assets in AssetPack projects git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7798 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
1b14d354d2
commit
3f6f694030
@ -3,6 +3,6 @@ build.xml.script.CRC32=c0969383
|
|||||||
build.xml.stylesheet.CRC32=a56c6a5b@1.42.2
|
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.
|
# 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.
|
# 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.script.CRC32=4d376df0
|
||||||
nbproject/build-impl.xml.stylesheet.CRC32=238281d1@1.42.2
|
nbproject/build-impl.xml.stylesheet.CRC32=238281d1@1.45.1
|
||||||
|
@ -42,6 +42,15 @@
|
|||||||
<specification-version>0.6.1</specification-version>
|
<specification-version>0.6.1</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<code-name-base>org.netbeans.api.java.classpath</code-name-base>
|
||||||
|
<build-prerequisite/>
|
||||||
|
<compile-dependency/>
|
||||||
|
<run-dependency>
|
||||||
|
<release-version>1</release-version>
|
||||||
|
<specification-version>1.30</specification-version>
|
||||||
|
</run-dependency>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<code-name-base>org.netbeans.api.progress</code-name-base>
|
<code-name-base>org.netbeans.api.progress</code-name-base>
|
||||||
<build-prerequisite/>
|
<build-prerequisite/>
|
||||||
|
@ -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<NodeList> variationAssets;
|
||||||
|
|
||||||
|
public AssetConfiguration(Element assetElement) {
|
||||||
|
this.assetElement = assetElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Element getAssetElement() {
|
||||||
|
return assetElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<NodeList> getVariationAssets() {
|
||||||
|
return variationAssets;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addVariationAssets(Element variationElement) {
|
||||||
|
if (variationAssets == null) {
|
||||||
|
variationAssets = new ArrayList<NodeList>();
|
||||||
|
}
|
||||||
|
variationAssets.add(variationElement.getElementsByTagName("file"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearExtraAssets() {
|
||||||
|
variationAssets.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,10 +4,6 @@
|
|||||||
*/
|
*/
|
||||||
package com.jme3.gde.assetpack;
|
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.asset.ModelKey;
|
||||||
import com.jme3.gde.assetpack.actions.AddAssetAction;
|
import com.jme3.gde.assetpack.actions.AddAssetAction;
|
||||||
import com.jme3.gde.assetpack.project.wizards.FileDescription;
|
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 com.jme3.scene.plugins.ogre.matext.OgreMaterialKey;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collection;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import org.openide.filesystems.FileObject;
|
import org.openide.filesystems.FileObject;
|
||||||
import org.openide.filesystems.FileUtil;
|
import org.openide.filesystems.FileUtil;
|
||||||
|
import org.openide.util.Exceptions;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
import org.w3c.dom.NodeList;
|
import org.w3c.dom.NodeList;
|
||||||
|
|
||||||
@ -39,28 +36,68 @@ import org.w3c.dom.NodeList;
|
|||||||
*/
|
*/
|
||||||
public class AssetPackLoader {
|
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");
|
NodeList fileNodeList = assetElement.getElementsByTagName("file");
|
||||||
Element fileElement = XmlHelper.findChildElementWithAttribute(assetElement, "file", "main", "true");
|
Element fileElement = XmlHelper.findChildElementWithAttribute(assetElement, "file", "main", "true");
|
||||||
if (fileElement == null) {
|
if (fileElement == null) {
|
||||||
fileElement = XmlHelper.findChildElement(assetElement, "file");
|
fileElement = XmlHelper.findChildElement(assetElement, "file");
|
||||||
}
|
}
|
||||||
|
//find main files for this model
|
||||||
|
List<Element> files = new ArrayList<Element>();
|
||||||
|
while (fileElement != null) {
|
||||||
|
files.add(fileElement);
|
||||||
|
//TODO:doesnt work?
|
||||||
|
fileElement = XmlHelper.findNextElementWithAttribute(fileElement, "file", "main", "true");
|
||||||
|
}
|
||||||
|
|
||||||
|
//find material varations for this model
|
||||||
|
List<SelectionEntry> selList = new ArrayList<SelectionEntry>();
|
||||||
|
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<Element> variations = new ArrayList<Element>();
|
||||||
|
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<SelectionEntry> 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<SelectionEntry> it = selList.iterator(); it.hasNext();) {
|
||||||
|
SelectionEntry selectionEntry = it.next();
|
||||||
|
config.addVariationAssets(selectionEntry.getSelected());
|
||||||
|
}
|
||||||
Spatial model = null;
|
Spatial model = null;
|
||||||
Node node = null;
|
Node node = null;
|
||||||
while (fileElement != null) {
|
for (Element element : files) {
|
||||||
Logger.getLogger(AssetPackLoader.class.getName()).log(Level.INFO, "Load main file {0}", fileElement.getAttribute("path"));
|
Logger.getLogger(AssetPackLoader.class.getName()).log(Level.INFO, "Load main file {0}", element.getAttribute("path"));
|
||||||
if (model != null && node == null) {
|
if (model != null && node == null) {
|
||||||
node = new Node(assetElement.getAttribute("name"));
|
node = new Node(assetElement.getAttribute("name"));
|
||||||
node.attachChild(model);
|
node.attachChild(model);
|
||||||
}
|
}
|
||||||
model = AssetPackLoader.loadSingleMesh(fileElement, fileNodeList, pm);
|
model = AssetPackLoader.loadSingleMesh(element, fileNodeList, config.getVariationAssets(), pm);
|
||||||
if (model != null && node != null) {
|
if (model != null && node != null) {
|
||||||
node.attachChild(model);
|
node.attachChild(model);
|
||||||
} else {
|
} else {
|
||||||
Logger.getLogger(AssetPackLoader.class.getName()).log(Level.WARNING, "Error loading model");
|
Logger.getLogger(AssetPackLoader.class.getName()).log(Level.WARNING, "Error loading model");
|
||||||
}
|
}
|
||||||
//TODO:doesnt work?
|
|
||||||
fileElement = XmlHelper.findNextElementWithAttribute(fileElement, "file", "main", "true");
|
|
||||||
}
|
}
|
||||||
if (node != null) {
|
if (node != null) {
|
||||||
return node;
|
return node;
|
||||||
@ -68,64 +105,7 @@ public class AssetPackLoader {
|
|||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: merge animation controls for multi meshes
|
private static Spatial loadSingleMesh(Element fileElement, NodeList fileNodeList, List<NodeList> variationNodeList, ProjectAssetManager pm) {
|
||||||
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<String> names = control.getAnimationNames();
|
|
||||||
Collection<String> names2 = new LinkedList<String>(control2.getAnimationNames());
|
|
||||||
//add tracks from anims interface second that exist in first
|
|
||||||
for (Iterator<String> 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<String> 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) {
|
|
||||||
ModelKey key = null;
|
ModelKey key = null;
|
||||||
Material mat = null;
|
Material mat = null;
|
||||||
Spatial model;
|
Spatial model;
|
||||||
@ -203,6 +183,37 @@ public class AssetPackLoader {
|
|||||||
} else if (hasExtension(name, "j3o")) {
|
} else if (hasExtension(name, "j3o")) {
|
||||||
//should have all info inside
|
//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) {
|
if (key != null && mat != null) {
|
||||||
Logger.getLogger(AddAssetAction.class.getName()).log(Level.WARNING, "j3m and ogre material defined for asset {0}.", name);
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static FileDescription getFileDescription(String path) {
|
||||||
|
return getFileDescription(new File(path.replaceAll("/", File.separator)));
|
||||||
|
}
|
||||||
|
|
||||||
public static FileDescription getFileDescription(File file) {
|
public static FileDescription getFileDescription(File file) {
|
||||||
FileObject fileObject = FileUtil.toFileObject(file);
|
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);
|
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) {
|
public static FileDescription getFileDescription(FileObject fileObject) {
|
||||||
|
if (fileObject == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
FileDescription description = new FileDescription();
|
FileDescription description = new FileDescription();
|
||||||
description.setFile(fileObject);
|
description.setFile(fileObject);
|
||||||
if ("material".equals(fileObject.getExt())) {
|
if ("material".equals(fileObject.getExt())) {
|
||||||
@ -281,8 +310,8 @@ public class AssetPackLoader {
|
|||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addAllFiles(Element assetElement, ProjectAssetManager pm) {
|
public static void addAllFiles(ProjectAssetManager pm, AssetConfiguration config) {
|
||||||
//TODO: not good :/
|
Element assetElement = config.getAssetElement();
|
||||||
NodeList list = assetElement.getElementsByTagName("file");
|
NodeList list = assetElement.getElementsByTagName("file");
|
||||||
ProjectAssetManager proman = null;
|
ProjectAssetManager proman = null;
|
||||||
try {
|
try {
|
||||||
@ -316,8 +345,8 @@ public class AssetPackLoader {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addModelFiles(Element assetElement, ProjectAssetManager pm) {
|
public static void addModelFiles(ProjectAssetManager pm, AssetConfiguration config) {
|
||||||
//TODO: not good :/
|
Element assetElement = config.getAssetElement();
|
||||||
NodeList fileNodeList = assetElement.getElementsByTagName("file");
|
NodeList fileNodeList = assetElement.getElementsByTagName("file");
|
||||||
ProjectAssetManager currentProjectAssetManager = null;
|
ProjectAssetManager currentProjectAssetManager = null;
|
||||||
try {
|
try {
|
||||||
@ -351,6 +380,68 @@ public class AssetPackLoader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
List<NodeList> varAssets = config.getVariationAssets();
|
||||||
|
if (varAssets != null) {
|
||||||
|
for (NodeList nodeList : varAssets) {
|
||||||
|
addVariationFiles(nodeList, pm);
|
||||||
|
}
|
||||||
|
}
|
||||||
return;
|
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<Element> names;
|
||||||
|
int selected = 0;
|
||||||
|
|
||||||
|
public SelectionEntry(String part, List<Element> names) {
|
||||||
|
this.part = part;
|
||||||
|
this.names = names;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Element getSelected() {
|
||||||
|
return names.get(selected);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelected(int selected) {
|
||||||
|
this.selected = selected;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,3 +4,4 @@ OpenIDE-Module-Long-Description=\
|
|||||||
OpenIDE-Module-Name=AssetPack Support
|
OpenIDE-Module-Name=AssetPack Support
|
||||||
OpenIDE-Module-Short-Description=AssetPack Support
|
OpenIDE-Module-Short-Description=AssetPack Support
|
||||||
Templates/Project/AssetPack/AssetPackProject.zip=Asset Pack
|
Templates/Project/AssetPack/AssetPackProject.zip=Asset Pack
|
||||||
|
VariationSelection.jButton1.text=OK
|
||||||
|
@ -0,0 +1,66 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||||
|
<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="false"/>
|
||||||
|
<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" alignment="1" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="jButton1" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Component id="jScrollPane1" alignment="0" pref="267" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="1" attributes="0">
|
||||||
|
<Component id="jScrollPane1" pref="192" max="32767" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="jButton1" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JButton" name="jButton1">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="com/jme3/gde/assetpack/Bundle.properties" key="VariationSelection.jButton1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton1ActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="jScrollPane1">
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Container class="javax.swing.JPanel" name="jPanel1">
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout">
|
||||||
|
<Property name="axis" type="int" value="3"/>
|
||||||
|
</Layout>
|
||||||
|
</Container>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
@ -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<SelectionEntry> list;
|
||||||
|
private boolean canceled = false;
|
||||||
|
|
||||||
|
/** Creates new form VariationSelection */
|
||||||
|
public VariationSelection(List<SelectionEntry> list) {
|
||||||
|
super(new JFrame(), true);
|
||||||
|
this.list = list;
|
||||||
|
setLocationRelativeTo(null);
|
||||||
|
initComponents();
|
||||||
|
updateView();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateView() {
|
||||||
|
jPanel1.removeAll();
|
||||||
|
for (Iterator<SelectionEntry> 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")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//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();
|
||||||
|
}// </editor-fold>//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;
|
||||||
|
}
|
||||||
|
}
|
@ -4,24 +4,20 @@
|
|||||||
*/
|
*/
|
||||||
package com.jme3.gde.assetpack.actions;
|
package com.jme3.gde.assetpack.actions;
|
||||||
|
|
||||||
|
import com.jme3.gde.assetpack.AssetConfiguration;
|
||||||
import com.jme3.gde.assetpack.AssetPackLoader;
|
import com.jme3.gde.assetpack.AssetPackLoader;
|
||||||
import com.jme3.gde.assetpack.XmlHelper;
|
|
||||||
import com.jme3.gde.core.assets.ProjectAssetManager;
|
import com.jme3.gde.core.assets.ProjectAssetManager;
|
||||||
import com.jme3.gde.core.scene.SceneApplication;
|
|
||||||
import com.jme3.scene.Spatial;
|
import com.jme3.scene.Spatial;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import javax.swing.Action;
|
import javax.swing.Action;
|
||||||
import org.openide.nodes.Node;
|
import org.openide.nodes.Node;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
import com.jme3.gde.scenecomposer.SceneComposerTopComponent;
|
import com.jme3.gde.scenecomposer.SceneComposerTopComponent;
|
||||||
import java.io.File;
|
import java.util.ArrayList;
|
||||||
import org.openide.filesystems.FileObject;
|
import java.util.List;
|
||||||
import org.openide.filesystems.FileUtil;
|
|
||||||
import org.w3c.dom.NodeList;
|
|
||||||
|
|
||||||
public final class AddAssetAction implements Action {
|
public final class AddAssetAction implements Action {
|
||||||
|
|
||||||
@ -40,59 +36,18 @@ public final class AddAssetAction implements Action {
|
|||||||
Element assetElement = context.getLookup().lookup(Element.class);
|
Element assetElement = context.getLookup().lookup(Element.class);
|
||||||
String type = assetElement.getAttribute("type");
|
String type = assetElement.getAttribute("type");
|
||||||
if ("model".equals(type) || "scene".equals(type)) {
|
if ("model".equals(type) || "scene".equals(type)) {
|
||||||
addModelToScene(assetElement, pm);
|
AssetConfiguration conf = new AssetConfiguration(assetElement);
|
||||||
AssetPackLoader.addModelFiles(assetElement, pm);
|
Spatial model = AssetPackLoader.loadAssetPackModel(pm, conf);
|
||||||
} 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) {
|
if (model != null) {
|
||||||
SceneComposerTopComponent.findInstance().addModel(model);
|
SceneComposerTopComponent.findInstance().addModel(model);
|
||||||
|
AssetPackLoader.addModelFiles(pm, conf);
|
||||||
} else {
|
} else {
|
||||||
Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Error loading model");
|
Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Error loading model");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
AssetConfiguration conf = new AssetConfiguration(assetElement);
|
||||||
|
AssetPackLoader.addAllFiles(pm, conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object getValue(String key) {
|
public Object getValue(String key) {
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.jme3.gde.assetpack.actions;
|
package com.jme3.gde.assetpack.actions;
|
||||||
|
|
||||||
|
import com.jme3.gde.assetpack.AssetConfiguration;
|
||||||
import com.jme3.gde.assetpack.AssetPackLoader;
|
import com.jme3.gde.assetpack.AssetPackLoader;
|
||||||
import com.jme3.gde.core.assets.ProjectAssetManager;
|
import com.jme3.gde.core.assets.ProjectAssetManager;
|
||||||
import com.jme3.gde.core.scene.SceneApplication;
|
import com.jme3.gde.core.scene.SceneApplication;
|
||||||
@ -36,7 +37,7 @@ public final class PreviewAssetAction implements Action {
|
|||||||
Element assetElement = context.getLookup().lookup(Element.class);
|
Element assetElement = context.getLookup().lookup(Element.class);
|
||||||
com.jme3.scene.Node node = new com.jme3.scene.Node("PreviewRootNode");
|
com.jme3.scene.Node node = new com.jme3.scene.Node("PreviewRootNode");
|
||||||
Spatial model = null;
|
Spatial model = null;
|
||||||
model = AssetPackLoader.loadAssetPackModel(assetElement, pm);
|
model = AssetPackLoader.loadAssetPackModel(pm, new AssetConfiguration(assetElement));
|
||||||
node.attachChild(model);
|
node.attachChild(model);
|
||||||
JmeNode jmeNode = NodeUtility.createNode(node);
|
JmeNode jmeNode = NodeUtility.createNode(node);
|
||||||
SceneApplication app = SceneApplication.getApplication();
|
SceneApplication app = SceneApplication.getApplication();
|
||||||
|
@ -2,7 +2,9 @@ package com.jme3.gde.assetpack.project;
|
|||||||
|
|
||||||
import com.jme3.gde.assetpack.project.actions.PublishAssetPackAction;
|
import com.jme3.gde.assetpack.project.actions.PublishAssetPackAction;
|
||||||
import com.jme3.gde.assetpack.browser.nodes.AssetPackBrowserFolder;
|
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.ConvertOgreBinaryMeshesAction;
|
||||||
|
import com.jme3.gde.assetpack.project.actions.ImportWorldForgeAction;
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -57,14 +59,16 @@ class AssetPackProjectLogicalView implements LogicalViewProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Action[] getActions(boolean arg0) {
|
public Action[] getActions(boolean arg0) {
|
||||||
Action[] nodeActions = new Action[8];
|
Action[] nodeActions = new Action[9];
|
||||||
nodeActions[0] = new PublishAssetPackAction(project);
|
nodeActions[0] = new PublishAssetPackAction(project);
|
||||||
nodeActions[1] = new ConvertOgreBinaryMeshesAction(project);
|
nodeActions[1] = new ConvertOgreBinaryMeshesAction(project);
|
||||||
nodeActions[2] = CommonProjectActions.copyProjectAction();
|
nodeActions[2] = new ImportWorldForgeAction(project);
|
||||||
nodeActions[3] = CommonProjectActions.deleteProjectAction();
|
nodeActions[3] = new CleanupProjectAction(project);
|
||||||
nodeActions[5] = CommonProjectActions.setAsMainProjectAction();
|
nodeActions[4] = CommonProjectActions.copyProjectAction();
|
||||||
nodeActions[6] = CommonProjectActions.closeProjectAction();
|
nodeActions[5] = CommonProjectActions.deleteProjectAction();
|
||||||
nodeActions[7] = CommonProjectActions.customizeProjectAction();
|
nodeActions[6] = CommonProjectActions.setAsMainProjectAction();
|
||||||
|
nodeActions[7] = CommonProjectActions.closeProjectAction();
|
||||||
|
nodeActions[8] = CommonProjectActions.customizeProjectAction();
|
||||||
return nodeActions;
|
return nodeActions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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<String> 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<String> scanProjectFiles(Element elem, ArrayList<String> 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<String> files = scanProjectFiles(context.getConfiguration().getDocumentElement(), new ArrayList<String>());
|
||||||
|
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) {
|
||||||
|
}
|
||||||
|
}
|
@ -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<String, ArrayList<String>> matRefs = new HashMap<String, ArrayList<String>>();
|
||||||
|
private List<String> modelNames = new ArrayList<String>();
|
||||||
|
|
||||||
|
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<String> binFiles = new ArrayList<String>();
|
||||||
|
convertOgreBinary(folder.getPath(), binFiles, handle);
|
||||||
|
deleteOgreBinary(binFiles);
|
||||||
|
handle.progress("Scanning folder");
|
||||||
|
scanFiles(folder);
|
||||||
|
//iterate through found models and add asset items
|
||||||
|
for (Iterator<String> 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<String> 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<String> 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<AssetKey<?>> list = new ArrayList<AssetKey<?>>();
|
||||||
|
materialList = getMaterialAssetList(matFile, list);
|
||||||
|
for (Iterator<AssetKey<?>> 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<AssetKey<?>> list = new ArrayList<AssetKey<?>>();
|
||||||
|
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<String> 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<String> list = matRefs.get(matName);
|
||||||
|
if (list == null) {
|
||||||
|
list = new ArrayList<String>();
|
||||||
|
matRefs.put(matName, list);
|
||||||
|
}
|
||||||
|
list.add(assetName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void convertOgreBinary(String dir2scan, List<String> 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<String> 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<AssetKey<?>> 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<AssetKey<?>> 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<String> getModelMaterialNames(String assetName) {
|
||||||
|
List<String> materialNames = new ArrayList<String>();
|
||||||
|
//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<String> 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) {
|
||||||
|
}
|
||||||
|
}
|
@ -3,7 +3,7 @@
|
|||||||
<filesystem>
|
<filesystem>
|
||||||
<folder name="Actions">
|
<folder name="Actions">
|
||||||
<folder name="CodelessProjects">
|
<folder name="CodelessProjects">
|
||||||
<file name="com-jme3-gde-core-codeless-wizard-CodelessProjectWizardAction.instance">
|
<file name="com-jme3-gde-core-codeless-CodelessProjectWizardAction.instance">
|
||||||
<attr name="delegate" methodvalue="org.openide.awt.Actions.inject"/>
|
<attr name="delegate" methodvalue="org.openide.awt.Actions.inject"/>
|
||||||
<attr name="displayName" bundlevalue="com.jme3.gde.core.codeless.Bundle#CTL_Codeless_Project"/>
|
<attr name="displayName" bundlevalue="com.jme3.gde.core.codeless.Bundle#CTL_Codeless_Project"/>
|
||||||
<attr name="iconBase" stringvalue="com/jme3/gde/core/assets/actions/jme-logo.png"/>
|
<attr name="iconBase" stringvalue="com/jme3/gde/core/assets/actions/jme-logo.png"/>
|
||||||
@ -66,7 +66,7 @@
|
|||||||
<folder name="File">
|
<folder name="File">
|
||||||
<folder name="Import">
|
<folder name="Import">
|
||||||
<file name="CodelessProject.shadow">
|
<file name="CodelessProject.shadow">
|
||||||
<attr name="originalFile" stringvalue="Actions/CodelessProjects/com-jme3-gde-core-codeless-wizard-CodelessProjectWizardAction.instance"/>
|
<attr name="originalFile" stringvalue="Actions/CodelessProjects/com-jme3-gde-core-codeless-CodelessProjectWizardAction.instance"/>
|
||||||
<attr name="position" intvalue="0"/>
|
<attr name="position" intvalue="0"/>
|
||||||
</file>
|
</file>
|
||||||
</folder>
|
</folder>
|
||||||
|
@ -180,7 +180,7 @@ public class JmeSpatialChildren extends Children.Keys<Object> {
|
|||||||
} else if (key instanceof MeshGeometryPair) {
|
} else if (key instanceof MeshGeometryPair) {
|
||||||
MeshGeometryPair pair = (MeshGeometryPair) key;
|
MeshGeometryPair pair = (MeshGeometryPair) key;
|
||||||
return new Node[]{new JmeMesh(pair.getGeometry(), pair.getMesh()).setReadOnly(readOnly)};
|
return new Node[]{new JmeMesh(pair.getGeometry(), pair.getMesh()).setReadOnly(readOnly)};
|
||||||
} else if (key instanceof Control) {
|
} else if (key instanceof Control && dataObject != null) {
|
||||||
return new Node[]{new JmeGenericControl((Control) key, dataObject)};
|
return new Node[]{new JmeGenericControl((Control) key, dataObject)};
|
||||||
}
|
}
|
||||||
return new Node[]{Node.EMPTY};
|
return new Node[]{Node.EMPTY};
|
||||||
|
@ -43,6 +43,11 @@ public class DynamicLookup extends AbstractLookup{
|
|||||||
private static final long serialVersionUID = 1212314412L;
|
private static final long serialVersionUID = 1212314412L;
|
||||||
private InstanceContent instanceContent;
|
private InstanceContent instanceContent;
|
||||||
|
|
||||||
|
public DynamicLookup() {
|
||||||
|
this.instanceContent = new InstanceContent();
|
||||||
|
instanceContent.add(this);
|
||||||
|
}
|
||||||
|
|
||||||
public DynamicLookup(InstanceContent instanceContent) {
|
public DynamicLookup(InstanceContent instanceContent) {
|
||||||
super(instanceContent);
|
super(instanceContent);
|
||||||
this.instanceContent = instanceContent;
|
this.instanceContent = instanceContent;
|
||||||
|
@ -28,7 +28,7 @@ public class OgreBinaryMeshDataObject extends SpatialAssetDataObject {
|
|||||||
@Override
|
@Override
|
||||||
public Spatial loadAsset() {
|
public Spatial loadAsset() {
|
||||||
ProgressHandle handle = ProgressHandleFactory.createHandle("Converting OgreBinary");
|
ProgressHandle handle = ProgressHandleFactory.createHandle("Converting OgreBinary");
|
||||||
handle.start(4);
|
handle.start();
|
||||||
//mesh
|
//mesh
|
||||||
OgreXMLConvertOptions options = new OgreXMLConvertOptions(getPrimaryFile().getPath());
|
OgreXMLConvertOptions options = new OgreXMLConvertOptions(getPrimaryFile().getPath());
|
||||||
options.setBinaryFile(true);
|
options.setBinaryFile(true);
|
||||||
@ -41,7 +41,7 @@ public class OgreBinaryMeshDataObject extends SpatialAssetDataObject {
|
|||||||
OgreXMLConvert conv2 = new OgreXMLConvert();
|
OgreXMLConvert conv2 = new OgreXMLConvert();
|
||||||
conv2.doConvert(options2, handle);
|
conv2.doConvert(options2, handle);
|
||||||
}
|
}
|
||||||
handle.progress(3);
|
handle.progress("Convert Model");
|
||||||
ProjectAssetManager mgr = getLookup().lookup(ProjectAssetManager.class);
|
ProjectAssetManager mgr = getLookup().lookup(ProjectAssetManager.class);
|
||||||
if (mgr == null) {
|
if (mgr == null) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -51,7 +51,7 @@ public final class AdvOgreXMLConvertAction implements ActionListener {
|
|||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
ProgressHandle progressHandle = ProgressHandleFactory.createHandle("Converting OgreXML");
|
ProgressHandle progressHandle = ProgressHandleFactory.createHandle("Converting OgreXML");
|
||||||
progressHandle.start(4);
|
progressHandle.start();
|
||||||
|
|
||||||
OgreXMLConvert converter = new OgreXMLConvert();
|
OgreXMLConvert converter = new OgreXMLConvert();
|
||||||
if (!converter.doConvert(options, progressHandle)) {
|
if (!converter.doConvert(options, progressHandle)) {
|
||||||
@ -82,7 +82,7 @@ public final class AdvOgreXMLConvertAction implements ActionListener {
|
|||||||
// FileLock lock = null;
|
// FileLock lock = null;
|
||||||
try {
|
try {
|
||||||
// lock = file.lock();
|
// lock = file.lock();
|
||||||
progressHandle.progress("Creating j3o file", 3);
|
progressHandle.progress("Creating j3o file");
|
||||||
String outputPath = file.getParent().getPath() + "/" + context.getPrimaryFile().getName() + ".j3o";
|
String outputPath = file.getParent().getPath() + "/" + context.getPrimaryFile().getName() + ".j3o";
|
||||||
manager.clearCache();
|
manager.clearCache();
|
||||||
Spatial model = manager.loadModel(manager.getRelativeAssetPath(file.getPath()));
|
Spatial model = manager.loadModel(manager.getRelativeAssetPath(file.getPath()));
|
||||||
|
@ -37,7 +37,7 @@ public class OgreXMLConvert {
|
|||||||
String[] cmdOptions = getCommandString(options);
|
String[] cmdOptions = getCommandString(options);
|
||||||
Process proc = null;
|
Process proc = null;
|
||||||
if (!options.isBinaryFile()) {
|
if (!options.isBinaryFile()) {
|
||||||
handle.progress("Optimizing Mesh / Creating LOD meshes", 1);
|
handle.progress("Optimizing Mesh / Creating LOD meshes");
|
||||||
//convert to binary + modify
|
//convert to binary + modify
|
||||||
try {
|
try {
|
||||||
proc = Runtime.getRuntime().exec(cmdOptions);
|
proc = Runtime.getRuntime().exec(cmdOptions);
|
||||||
@ -61,7 +61,7 @@ public class OgreXMLConvert {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
handle.progress("Converting Binary Mesh", 2);
|
handle.progress("Converting Binary Mesh");
|
||||||
//convert back to xml
|
//convert back to xml
|
||||||
cmdOptions = getBackCommandString(options);
|
cmdOptions = getBackCommandString(options);
|
||||||
try {
|
try {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user