SDK, the ShaderNodes editor should not go into an error frenzy when the shader compilation fail anymore.

The MaterialPreviewRenderer now uses something similar as the MaterialDebugAppState. The material is preloaded and not refreshed if the compilation failed.
experimental
Nehon 10 years ago
parent b4a9ca4bee
commit 7ce251e222
  1. 1
      sdk/jme3-materialeditor/src/com/jme3/gde/materialdefinition/editor/MatPanel.java
  2. 92
      sdk/jme3-materialeditor/src/com/jme3/gde/materials/MaterialPreviewRenderer.java

@ -4,7 +4,6 @@
*/ */
package com.jme3.gde.materialdefinition.editor; package com.jme3.gde.materialdefinition.editor;
import com.jme3.gde.core.assets.ProjectAssetManager;
import com.jme3.gde.materials.MaterialPreviewRenderer; import com.jme3.gde.materials.MaterialPreviewRenderer;
import com.jme3.material.Material; import com.jme3.material.Material;
import java.awt.Component; import java.awt.Component;

@ -4,21 +4,26 @@
*/ */
package com.jme3.gde.materials; package com.jme3.gde.materials;
import com.jme3.asset.DesktopAssetManager;
import com.jme3.asset.MaterialKey; import com.jme3.asset.MaterialKey;
import com.jme3.gde.core.assets.ProjectAssetManager; import com.jme3.gde.core.assets.ProjectAssetManager;
import com.jme3.gde.core.scene.PreviewRequest; import com.jme3.gde.core.scene.PreviewRequest;
import com.jme3.gde.core.scene.SceneApplication; import com.jme3.gde.core.scene.SceneApplication;
import com.jme3.gde.core.scene.SceneListener; import com.jme3.gde.core.scene.SceneListener;
import com.jme3.gde.core.scene.SceneRequest; import com.jme3.gde.core.scene.SceneRequest;
import com.jme3.material.MatParam;
import com.jme3.material.Material; import com.jme3.material.Material;
import com.jme3.math.FastMath; import com.jme3.math.FastMath;
import com.jme3.math.Quaternion; import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.renderer.RendererException;
import com.jme3.scene.Geometry; import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box; import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Quad; import com.jme3.scene.shape.Quad;
import com.jme3.scene.shape.Sphere; import com.jme3.scene.shape.Sphere;
import com.jme3.util.MaterialDebugAppState;
import com.jme3.util.TangentBinormalGenerator; import com.jme3.util.TangentBinormalGenerator;
import java.util.concurrent.Callable;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
@ -76,35 +81,84 @@ public class MaterialPreviewRenderer implements SceneListener {
if (!init) { if (!init) {
init(); init();
} }
try { MaterialKey key = new MaterialKey(assetManager.getRelativeAssetPath(materialFileName));
MaterialKey key = new MaterialKey(assetManager.getRelativeAssetPath(materialFileName)); assetManager.deleteFromCache(key);
assetManager.deleteFromCache(key); Material mat = (Material) assetManager.loadAsset(key);
Material mat = (Material) assetManager.loadAsset(key); if (mat != null) {
if (mat != null) { showMaterial(mat);
currentMaterial = mat;
showMaterial(mat);
}
} catch (Exception e) {
} }
} }
public void showMaterial(Material m) { public void showMaterial(final Material m) {
if (!init) { if (!init) {
init(); init();
} }
currentGeom.setMaterial(m); final DesktopAssetManager assetManager = (DesktopAssetManager) SceneApplication.getApplication().getAssetManager();
try { SceneApplication.getApplication().enqueue(new Callable<Material>() {
if (currentGeom.getMaterial() != null) {
PreviewRequest request = new PreviewRequest(this, currentGeom, label.getWidth(), label.getHeight()); public Material call() throws Exception {
request.getCameraRequest().setLocation(new Vector3f(0, 0, 7)); final Material mat = reloadMaterial(m, assetManager);
request.getCameraRequest().setLookAt(new Vector3f(0, 0, 0), Vector3f.UNIT_Y); if (mat != null) {
SceneApplication.getApplication().createPreview(request); java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
currentMaterial = mat;
currentGeom.setMaterial(mat);
try {
if (currentGeom.getMaterial() != null) {
PreviewRequest request = new PreviewRequest(MaterialPreviewRenderer.this, currentGeom, label.getWidth(), label.getHeight());
request.getCameraRequest().setLocation(new Vector3f(0, 0, 7));
request.getCameraRequest().setLookAt(new Vector3f(0, 0, 0), Vector3f.UNIT_Y);
SceneApplication.getApplication().createPreview(request);
}
} catch (Exception e) {
Logger.getLogger(MaterialPreviewRenderer.class.getName()).log(Level.SEVERE, "Error rendering material" + e.getMessage());
}
}
});
}
return mat;
} }
} catch (Exception e) { });
Logger.getLogger(MaterialPreviewRenderer.class.getName()).log(Level.SEVERE, "Error rendering material" + e.getMessage());
}
public Material reloadMaterial(Material mat, DesktopAssetManager assetManager) {
//clear the entire cache, there might be more clever things to do, like clearing only the matdef, and the associated shaders.
assetManager.clearCache();
//creating a dummy mat with the mat def of the mat to reload
Material dummy = new Material(mat.getMaterialDef());
for (MatParam matParam : mat.getParams()) {
dummy.setParam(matParam.getName(), matParam.getVarType(), matParam.getValue());
} }
dummy.getAdditionalRenderState().set(mat.getAdditionalRenderState());
//creating a dummy geom and assigning the dummy material to it
Geometry dummyGeom = new Geometry("dummyGeom", new Box(1f, 1f, 1f));
dummyGeom.setMaterial(dummy);
try {
//preloading the dummyGeom, this call will compile the shader again
SceneApplication.getApplication().getRenderManager().preloadScene(dummyGeom);
} catch (RendererException e) {
//compilation error, the shader code will be output to the console
//the following code will output the error
//System.err.println(e.getMessage());
Logger.getLogger(MaterialDebugAppState.class.getName()).log(Level.SEVERE, e.getMessage());
return null;
}
//Logger.getLogger(MaterialDebugAppState.class.getName()).log(Level.INFO, "Material succesfully reloaded");
//System.out.println("Material succesfully reloaded");
return dummy;
} }
public void switchDisplay(DisplayType type) { public void switchDisplay(DisplayType type) {
switch (type) { switch (type) {
case Box: case Box:

Loading…
Cancel
Save