* support for new terrain texture limit

* better threading

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7760 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
bre..ns 14 years ago
parent d9c3df086d
commit 4df19663dd
  1. 92
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorController.java
  2. 58
      sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/TerrainEditorTopComponent.java
  3. 98
      sdk/nbproject/build-impl.xml
  4. 16
      sdk/nbproject/genfiles.properties
  5. 161
      sdk/nbproject/platform.properties

@ -83,14 +83,15 @@ public class TerrainEditorController {
private Node terrainNode;
private Node rootNode;
private AssetDataObject currentFileObject;
private TerrainEditorTopComponent topComponent;
// texture settings
public static final String DEFAULT_TERRAIN_TEXTURE = "com/jme3/gde/terraineditor/dirt.jpg";
public static final float DEFAULT_TEXTURE_SCALE = 16.0625f;
public static final int NUM_ALPHA_TEXTURES = 3;
private final int BASE_TEXTURE_COUNT = NUM_ALPHA_TEXTURES; // add any others here, like a global specular map
protected final int MAX_TEXTURE_LAYERS = 7-BASE_TEXTURE_COUNT; // 16 max, minus the ones we are reserving
protected final int MAX_DIFFUSE = 12;
protected final int MAX_TEXTURES = 16-NUM_ALPHA_TEXTURES; // 16 max (diffuse and normal), minus the ones we are reserving
protected SaveCookie terrainSaveCookie = new SaveCookie() {
@ -113,6 +114,7 @@ public class TerrainEditorController {
rootNode = this.jmeRootNode.getLookup().lookup(Node.class);
this.currentFileObject = currentFileObject;
this.currentFileObject.setSaveCookie(terrainSaveCookie);
this.topComponent = topComponent;
}
public void setToolController(TerrainToolController toolController) {
@ -398,30 +400,6 @@ public class TerrainEditorController {
return tex;
}
/**
* Get the diffuse texture at the specified layer.
* Run this on the GL thread!
*/
private Texture doGetAlphaTextureFromDiffuse(Terrain terrain, int diffuseLayer) {
int alphaIdx = diffuseLayer/4; // 4 = rgba = 4 textures
return doGetAlphaTexture(terrain, alphaIdx);
/* Terrain terrain = (Terrain) getTerrain(null);
MatParam matParam = null;
//TODO: add when supported
// if (alphaIdx == 0)
matParam = terrain.getMaterial().getParam("AlphaMap");
// else
// matParam = terrain.getMaterial().getParam("AlphaMap_"+alphaIdx);
if (matParam == null || matParam.getValue() == null) {
return null;
}
Texture tex = (Texture) matParam.getValue();
return tex;
*/
}
/**
* Set the diffuse texture at the specified layer.
@ -736,10 +714,10 @@ public class TerrainEditorController {
Texture tex = manager.loadAsset(new TextureKey(alphaBlendFileName, false));
if (i == 0)
mat.setTexture("AlphaMap", tex);
/*else if (i == 1) // add these in when they are supported
else if (i == 1) // add these in when they are supported
mat.setTexture("AlphaMap_1", tex);
else if (i == 2)
mat.setTexture("AlphaMap_2", tex);*/
mat.setTexture("AlphaMap_2", tex);
}
// give the first layer default texture
@ -936,7 +914,61 @@ public class TerrainEditorController {
return false;
}
/**
* Enable/disable the add and remove texture buttons based
* on how many textures are currently being used.
*/
protected void enableTextureButtons() {
final int numAvailable = MAX_TEXTURES-doGetNumUsedTextures();
final boolean add = doGetNumDiffuseTextures() < MAX_DIFFUSE && numAvailable > 0;
final boolean remove = doGetNumDiffuseTextures() > 1;
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
topComponent.enableAddTextureButton(add);
topComponent.enableRemoveTextureButton(remove);
topComponent.updateTextureCountLabel(numAvailable);
topComponent.setAddNormalTextureEnabled(numAvailable>0);
}
});
}
/**
* How many diffuse textures are being used.
* Blocking call on GL thread
*/
protected int getNumDiffuseTextures() {
try {
Integer count =
SceneApplication.getApplication().enqueue(new Callable<Integer>() {
public Integer call() throws Exception {
return doGetNumDiffuseTextures();
}
}).get();
return count;
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
} catch (ExecutionException ex) {
Exceptions.printStackTrace(ex);
}
return -1;
}
private int doGetNumDiffuseTextures() {
Terrain terrain = (Terrain) getTerrain(null);
if (terrain == null)
return 0;
int count = 0;
for (int i=0; i<MAX_TEXTURES; i++) {
Texture tex = doGetDiffuseTexture(i);
if (tex != null)
count++;
}
return count;
}
/**
* How many textures are currently being used.
* Blocking call on GL thread
@ -965,7 +997,7 @@ public class TerrainEditorController {
int count = 0;
for (int i=0; i<MAX_TEXTURE_LAYERS; i++) {
for (int i=0; i<MAX_TEXTURES; i++) {
Texture tex = doGetDiffuseTexture(i);
if (tex != null)
count++;

@ -126,13 +126,12 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
TerrainToolController toolController;
TerrainEditorController editorController;
private SceneRequest currentRequest;
private int currentTextureCount;
private boolean alreadyChoosing = false; // used for texture table selection
private CreateTerrainWizardAction terrainWizard;
private SkyboxWizardAction skyboxWizard;
private JmeSpatial selectedSpat;
private TerrainNodeListener terrainDeletedNodeListener;
private boolean availableNormalTextures;
private HelpCtx ctx = new HelpCtx("sdk.terrain_editor");
@ -628,13 +627,25 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
return;
int index = getTableModel().getRowCount(); // get the last row
addNewTextureLayer(index);
if (currentTextureCount >= editorController.MAX_TEXTURE_LAYERS)
addTextureButton.setEnabled(false);
if (currentTextureCount > 0)
removeTextureButton.setEnabled(true);
remainingTexturesLabel.setText(""+(editorController.MAX_TEXTURE_LAYERS-currentTextureCount));
editorController.enableTextureButtons();
}//GEN-LAST:event_addTextureButtonActionPerformed
protected void enableAddTextureButton(boolean enabled) {
addTextureButton.setEnabled(enabled);
}
protected void enableRemoveTextureButton(boolean enabled) {
removeTextureButton.setEnabled(enabled);
}
protected void updateTextureCountLabel(int count) {
remainingTexturesLabel.setText(""+count);
}
protected void setAddNormalTextureEnabled(boolean enabled) {
availableNormalTextures = enabled;
}
private void removeTextureButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeTextureButtonActionPerformed
if (editorController == null || editorController.getTerrain(null) == null)
return;
@ -642,11 +653,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
return;
int index = getTableModel().getRowCount() - 1; // get the last row
removeTextureLayer(index);
if (currentTextureCount == 0)
removeTextureButton.setEnabled(false);
if (currentTextureCount < editorController.MAX_TEXTURE_LAYERS)
addTextureButton.setEnabled(true);
remainingTexturesLabel.setText(""+(editorController.MAX_TEXTURE_LAYERS-currentTextureCount));
editorController.enableTextureButtons();
}//GEN-LAST:event_removeTextureButtonActionPerformed
private void eraseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_eraseButtonActionPerformed
@ -813,12 +820,9 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
addSaveNode(selectedSpat);
// editorController.getAlphaSaveDataObject(this);
editorController.setNeedsSave(true);
currentTextureCount = editorController.getNumUsedTextures();
remainingTexturesLabel.setText(""+(editorController.MAX_TEXTURE_LAYERS-currentTextureCount));
editorController.enableTextureButtons();
reinitTextureTable(); // update the UI
@ -1003,7 +1007,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
addSaveNode(jmeNode);
SceneUndoRedoManager m = Lookup.getDefault().lookup(SceneUndoRedoManager.class);//TODO remove this line
//SceneUndoRedoManager m = Lookup.getDefault().lookup(SceneUndoRedoManager.class);//TODO remove this line
Logger.getLogger(TerrainEditorTopComponent.class.getName()).finer("Terrain openScene "+file.getName());
@ -1017,6 +1021,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
SceneApplication.getApplication().requestScene(request);
terrainDeletedNodeListener = new TerrainNodeListener();
editorController.enableTextureButtons();
}
// run on GL thread
@ -1177,8 +1182,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
else
toolController.setSelectedTextureIndex(-1);
currentTextureCount = editorController.getNumUsedTextures();
remainingTexturesLabel.setText(""+(editorController.MAX_TEXTURE_LAYERS-currentTextureCount));
editorController.enableTextureButtons();
triPlanarCheckBox.setSelected(editorController.isTriPlanarEnabled());
}
@ -1230,7 +1234,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
removeRow(0);
// fill the table with the proper data
for (int i=0; i<editorController.MAX_TEXTURE_LAYERS; i++) {
for (int i=0; i<editorController.MAX_TEXTURES; i++) {
if (!editorController.hasTextureAt(i))
continue;
@ -1268,7 +1272,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
// and add it to the actual material
setTexture(newIndex, (String)null);
setTextureScale(newIndex, scale);
currentTextureCount = editorController.getNumUsedTextures();
editorController.enableTextureButtons();
}
protected void setTexture(final int index, final Texture texture) {
@ -1284,13 +1288,13 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
protected void setNormal(final int index, final String texturePath) {
setValueAt(index, index, 2);
editorController.setNormalMap(index, texturePath);
currentTextureCount = editorController.getNumUsedTextures();
editorController.enableTextureButtons();
}
protected void setNormal(final int index, final Texture texture) {
setValueAt(index, index, 2);
editorController.setNormalMap(index, texture);
currentTextureCount = editorController.getNumUsedTextures();
editorController.enableTextureButtons();
}
protected void setTextureScale(int index, float scale) {
@ -1300,7 +1304,7 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
protected void removeTexture(final int index) {
removeRow(index);
editorController.removeTextureLayer(index);
currentTextureCount = editorController.getNumUsedTextures();
editorController.enableTextureButtons();
}
}
@ -1383,6 +1387,8 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
try {
Texture selectedTex = getTextureFromModel(row); // delegates to sub class
if (selectedTex == null && !availableNormalTextures) // bail if we are at our texture limit
return;
TexturePropertyEditor editor = new TexturePropertyEditor(selectedTex);
Component view = editor.getCustomEditor();
view.setVisible(true);
@ -1466,10 +1472,6 @@ public final class TerrainEditorTopComponent extends TopComponent implements Sce
}
}
private Component getTopComponent() {
return this;
}
/**
* A file filter to only show images

@ -1,49 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
*** GENERATED FROM project.xml - DO NOT EDIT ***
*** EDIT ../build.xml INSTEAD ***
-->
<project name="jme-gde-impl" basedir=".." xmlns:sproject="http://www.netbeans.org/ns/nb-module-suite-project/1">
<fail message="Please build using Ant 1.7.1 or higher.">
<condition>
<not>
<antversion atleast="1.7.1"/>
</not>
</condition>
</fail>
<property file="nbproject/private/platform-private.properties"/>
<property file="nbproject/platform.properties"/>
<macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-suite-project/1">
<attribute name="name"/>
<attribute name="value"/>
<sequential>
<property name="@{name}" value="${@{value}}"/>
</sequential>
</macrodef>
<macrodef name="evalprops" uri="http://www.netbeans.org/ns/nb-module-suite-project/1">
<attribute name="property"/>
<attribute name="value"/>
<sequential>
<property name="@{property}" value="@{value}"/>
</sequential>
</macrodef>
<property file="${user.properties.file}"/>
<sproject:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir"/>
<sproject:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir"/>
<sproject:evalprops property="cluster.path.evaluated" value="${cluster.path}"/>
<fail message="Path to 'platform' cluster missing in $${cluster.path} property or using corrupt Netbeans Platform (missing harness).">
<condition>
<not>
<contains string="${cluster.path.evaluated}" substring="platform"/>
</not>
</condition>
</fail>
<fail message="Cannot find NetBeans build harness. ${line.separator}Check that nbplatform.${nbplatform.active}.netbeans.dest.dir and nbplatform.${nbplatform.active}.harness.dir are defined. ${line.separator}On a developer machine these are normally defined in ${user.properties.file}=${netbeans.user}/build.properties ${line.separator}but for automated builds you should pass these properties to Ant explicitly.">
<condition>
<not>
<available type="dir" file="${harness.dir}"/>
</not>
</condition>
</fail>
<import file="${harness.dir}/suite.xml"/>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<!--
*** GENERATED FROM project.xml - DO NOT EDIT ***
*** EDIT ../build.xml INSTEAD ***
-->
<project name="jme-gde-impl" basedir=".." xmlns:sproject="http://www.netbeans.org/ns/nb-module-suite-project/1">
<fail message="Please build using Ant 1.7.1 or higher.">
<condition>
<not>
<antversion atleast="1.7.1"/>
</not>
</condition>
</fail>
<property file="nbproject/private/platform-private.properties"/>
<property file="nbproject/platform.properties"/>
<macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-suite-project/1">
<attribute name="name"/>
<attribute name="value"/>
<sequential>
<property name="@{name}" value="${@{value}}"/>
</sequential>
</macrodef>
<macrodef name="evalprops" uri="http://www.netbeans.org/ns/nb-module-suite-project/1">
<attribute name="property"/>
<attribute name="value"/>
<sequential>
<property name="@{property}" value="@{value}"/>
</sequential>
</macrodef>
<property file="${user.properties.file}"/>
<sproject:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir"/>
<sproject:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir"/>
<sproject:evalprops property="cluster.path.evaluated" value="${cluster.path}"/>
<fail message="Path to 'platform' cluster missing in $${cluster.path} property or using corrupt Netbeans Platform (missing harness).">
<condition>
<not>
<contains string="${cluster.path.evaluated}" substring="platform"/>
</not>
</condition>
</fail>
<fail message="Cannot find NetBeans build harness. ${line.separator}Check that nbplatform.${nbplatform.active}.netbeans.dest.dir and nbplatform.${nbplatform.active}.harness.dir are defined. ${line.separator}On a developer machine these are normally defined in ${user.properties.file}=${netbeans.user}/build.properties ${line.separator}but for automated builds you should pass these properties to Ant explicitly.">
<condition>
<not>
<available type="dir" file="${harness.dir}"/>
</not>
</condition>
</fail>
<import file="${harness.dir}/suite.xml"/>
</project>

@ -1,8 +1,8 @@
build.xml.data.CRC32=cbef27ca
build.xml.script.CRC32=7efad5da
build.xml.stylesheet.CRC32=531c622b@1.31.1.7
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=cbef27ca
nbproject/build-impl.xml.script.CRC32=ce1d717c
nbproject/build-impl.xml.stylesheet.CRC32=183e6ef3@1.42.1
build.xml.data.CRC32=cbef27ca
build.xml.script.CRC32=7efad5da
build.xml.stylesheet.CRC32=531c622b@1.31.1.7
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=cbef27ca
nbproject/build-impl.xml.script.CRC32=ce1d717c
nbproject/build-impl.xml.stylesheet.CRC32=183e6ef3@1.42.2

@ -1,83 +1,78 @@
cluster.path=\
${nbplatform.active.dir}/extra:\
${nbplatform.active.dir}/harness:\
${nbplatform.active.dir}/ide:\
${nbplatform.active.dir}/java:\
${nbplatform.active.dir}/platform
disabled.modules=\
org.netbeans.libs.bugtracking,\
org.netbeans.libs.bugzilla,\
org.netbeans.libs.jsr223,\
org.netbeans.libs.smack,\
org.netbeans.libs.springframework,\
org.netbeans.libs.swingx,\
org.netbeans.modules.apisupport.apidocs,\
org.netbeans.modules.bugtracking,\
org.netbeans.modules.bugtracking.bridge,\
org.netbeans.modules.bugzilla,\
org.netbeans.modules.db,\
org.netbeans.modules.db.core,\
org.netbeans.modules.db.dataview,\
org.netbeans.modules.db.drivers,\
org.netbeans.modules.db.kit,\
org.netbeans.modules.db.metadata.model,\
org.netbeans.modules.db.mysql,\
org.netbeans.modules.db.sql.editor,\
org.netbeans.modules.db.sql.visualeditor,\
org.netbeans.modules.dbapi,\
org.netbeans.modules.dbschema,\
org.netbeans.modules.derby,\
org.netbeans.modules.form,\
org.netbeans.modules.form.j2ee,\
org.netbeans.modules.form.kit,\
org.netbeans.modules.glassfish.common,\
org.netbeans.modules.hibernate,\
org.netbeans.modules.hibernatelib,\
org.netbeans.modules.hudson,\
org.netbeans.modules.hudson.ant,\
org.netbeans.modules.hudson.maven,\
org.netbeans.modules.hudson.mercurial,\
org.netbeans.modules.hudson.subversion,\
org.netbeans.modules.i18n.form,\
org.netbeans.modules.j2ee.core.utilities,\
org.netbeans.modules.j2ee.jpa.refactoring,\
org.netbeans.modules.j2ee.jpa.verification,\
org.netbeans.modules.j2ee.persistence,\
org.netbeans.modules.j2ee.persistence.kit,\
org.netbeans.modules.j2ee.toplinklib,\
org.netbeans.modules.jellytools,\
org.netbeans.modules.jellytools.ide,\
org.netbeans.modules.jellytools.java,\
org.netbeans.modules.jellytools.platform,\
org.netbeans.modules.jemmy,\
org.netbeans.modules.languages,\
org.netbeans.modules.maven,\
org.netbeans.modules.maven.embedder,\
org.netbeans.modules.maven.grammar,\
org.netbeans.modules.maven.graph,\
org.netbeans.modules.maven.hints,\
org.netbeans.modules.maven.indexer,\
org.netbeans.modules.maven.junit,\
org.netbeans.modules.maven.kit,\
org.netbeans.modules.maven.model,\
org.netbeans.modules.maven.osgi,\
org.netbeans.modules.maven.persistence,\
org.netbeans.modules.maven.repository,\
org.netbeans.modules.maven.search,\
org.netbeans.modules.maven.spring,\
org.netbeans.modules.server,\
org.netbeans.modules.spellchecker,\
org.netbeans.modules.spellchecker.bindings.htmlxml,\
org.netbeans.modules.spellchecker.bindings.properties,\
org.netbeans.modules.spellchecker.dictionary_en,\
org.netbeans.modules.spellchecker.kit,\
org.netbeans.modules.spring.beans,\
org.netbeans.modules.swing.validation,\
org.netbeans.modules.swingapp,\
org.netbeans.modules.websvc.saas.codegen.java,\
org.netbeans.modules.xml.wsdl.model,\
org.openide.compat,\
org.openide.options,\
org.openide.util.enumerations
nbjdk.active=default
nbplatform.active=default
cluster.path=\
${nbplatform.active.dir}/extra:\
${nbplatform.active.dir}/harness:\
${nbplatform.active.dir}/ide:\
${nbplatform.active.dir}/java:\
${nbplatform.active.dir}/platform
disabled.modules=\
org.netbeans.libs.bugtracking,\
org.netbeans.libs.bugzilla,\
org.netbeans.libs.jsr223,\
org.netbeans.libs.smack,\
org.netbeans.libs.springframework,\
org.netbeans.libs.swingx,\
org.netbeans.modules.apisupport.apidocs,\
org.netbeans.modules.bugtracking,\
org.netbeans.modules.bugtracking.bridge,\
org.netbeans.modules.bugzilla,\
org.netbeans.modules.db,\
org.netbeans.modules.db.core,\
org.netbeans.modules.db.dataview,\
org.netbeans.modules.db.drivers,\
org.netbeans.modules.db.kit,\
org.netbeans.modules.db.metadata.model,\
org.netbeans.modules.db.mysql,\
org.netbeans.modules.db.sql.editor,\
org.netbeans.modules.db.sql.visualeditor,\
org.netbeans.modules.dbapi,\
org.netbeans.modules.dbschema,\
org.netbeans.modules.derby,\
org.netbeans.modules.form,\
org.netbeans.modules.form.j2ee,\
org.netbeans.modules.form.kit,\
org.netbeans.modules.glassfish.common,\
org.netbeans.modules.hibernate,\
org.netbeans.modules.hibernatelib,\
org.netbeans.modules.hudson,\
org.netbeans.modules.hudson.ant,\
org.netbeans.modules.hudson.maven,\
org.netbeans.modules.hudson.mercurial,\
org.netbeans.modules.hudson.subversion,\
org.netbeans.modules.i18n.form,\
org.netbeans.modules.j2ee.core.utilities,\
org.netbeans.modules.j2ee.jpa.refactoring,\
org.netbeans.modules.j2ee.jpa.verification,\
org.netbeans.modules.j2ee.persistence,\
org.netbeans.modules.j2ee.persistence.kit,\
org.netbeans.modules.j2ee.toplinklib,\
org.netbeans.modules.jellytools,\
org.netbeans.modules.jellytools.ide,\
org.netbeans.modules.jellytools.java,\
org.netbeans.modules.jellytools.platform,\
org.netbeans.modules.jemmy,\
org.netbeans.modules.languages,\
org.netbeans.modules.maven.grammar,\
org.netbeans.modules.maven.graph,\
org.netbeans.modules.maven.hints,\
org.netbeans.modules.maven.junit,\
org.netbeans.modules.maven.kit,\
org.netbeans.modules.maven.osgi,\
org.netbeans.modules.maven.persistence,\
org.netbeans.modules.maven.repository,\
org.netbeans.modules.maven.search,\
org.netbeans.modules.maven.spring,\
org.netbeans.modules.server,\
org.netbeans.modules.spellchecker,\
org.netbeans.modules.spellchecker.bindings.htmlxml,\
org.netbeans.modules.spellchecker.bindings.properties,\
org.netbeans.modules.spellchecker.dictionary_en,\
org.netbeans.modules.spellchecker.kit,\
org.netbeans.modules.spring.beans,\
org.netbeans.modules.swingapp,\
org.netbeans.modules.websvc.saas.codegen.java,\
org.netbeans.modules.xml.wsdl.model,\
org.openide.compat,\
org.openide.options,\
org.openide.util.enumerations
nbjdk.active=default
nbplatform.active=default

Loading…
Cancel
Save