SDK : Material editor : abtracted a preview renderer to use both in the material editor and in the material definition editor
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10439 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
parent
ce86297979
commit
39b75a4aa6
@ -0,0 +1,143 @@ |
|||||||
|
/* |
||||||
|
* To change this template, choose Tools | Templates |
||||||
|
* and open the template in the editor. |
||||||
|
*/ |
||||||
|
package com.jme3.gde.materials; |
||||||
|
|
||||||
|
import com.jme3.asset.MaterialKey; |
||||||
|
import com.jme3.gde.core.assets.ProjectAssetManager; |
||||||
|
import com.jme3.gde.core.scene.PreviewRequest; |
||||||
|
import com.jme3.gde.core.scene.SceneApplication; |
||||||
|
import com.jme3.gde.core.scene.SceneListener; |
||||||
|
import com.jme3.gde.core.scene.SceneRequest; |
||||||
|
import com.jme3.material.Material; |
||||||
|
import com.jme3.math.FastMath; |
||||||
|
import com.jme3.math.Quaternion; |
||||||
|
import com.jme3.math.Vector3f; |
||||||
|
import com.jme3.scene.Geometry; |
||||||
|
import com.jme3.scene.shape.Box; |
||||||
|
import com.jme3.scene.shape.Quad; |
||||||
|
import com.jme3.scene.shape.Sphere; |
||||||
|
import com.jme3.util.TangentBinormalGenerator; |
||||||
|
import java.util.logging.Level; |
||||||
|
import java.util.logging.Logger; |
||||||
|
import javax.swing.ImageIcon; |
||||||
|
import javax.swing.JLabel; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author Nehon |
||||||
|
*/ |
||||||
|
public class MaterialPreviewRenderer implements SceneListener { |
||||||
|
|
||||||
|
private Geometry sphere; |
||||||
|
private Geometry box; |
||||||
|
private Geometry quad; |
||||||
|
private Geometry currentGeom; |
||||||
|
private Material currentMaterial; |
||||||
|
private boolean init = false; |
||||||
|
private JLabel label; |
||||||
|
|
||||||
|
public enum DisplayType { |
||||||
|
|
||||||
|
Sphere, |
||||||
|
Box, |
||||||
|
Quad |
||||||
|
} |
||||||
|
|
||||||
|
public MaterialPreviewRenderer(JLabel label) { |
||||||
|
this.label = label; |
||||||
|
} |
||||||
|
|
||||||
|
private void init() { |
||||||
|
SceneApplication.getApplication().addSceneListener(this); |
||||||
|
Sphere sphMesh = new Sphere(32, 32, 2.5f); |
||||||
|
sphMesh.setTextureMode(Sphere.TextureMode.Projected); |
||||||
|
sphMesh.updateGeometry(32, 32, 2.5f, false, false); |
||||||
|
TangentBinormalGenerator.generate(sphMesh); |
||||||
|
sphere = new Geometry("previewSphere", sphMesh); |
||||||
|
sphere.setLocalRotation(new Quaternion().fromAngleAxis(FastMath.QUARTER_PI, Vector3f.UNIT_X)); |
||||||
|
|
||||||
|
Box boxMesh = new Box(1.75f, 1.75f, 1.75f); |
||||||
|
TangentBinormalGenerator.generate(boxMesh); |
||||||
|
box = new Geometry("previewBox", boxMesh); |
||||||
|
box.setLocalRotation(new Quaternion().fromAngleAxis(-FastMath.DEG_TO_RAD * 30, Vector3f.UNIT_X).multLocal(new Quaternion().fromAngleAxis(FastMath.QUARTER_PI, Vector3f.UNIT_Y))); |
||||||
|
|
||||||
|
Quad quadMesh = new Quad(4.5f, 4.5f); |
||||||
|
TangentBinormalGenerator.generate(quadMesh); |
||||||
|
quad = new Geometry("previewQuad", quadMesh); |
||||||
|
quad.setLocalTranslation(new Vector3f(-2.25f, -2.25f, 0)); |
||||||
|
currentGeom = sphere; |
||||||
|
init = true; |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
public void showMaterial(ProjectAssetManager assetManager, String materialFileName) { |
||||||
|
if (!init) { |
||||||
|
init(); |
||||||
|
} |
||||||
|
try { |
||||||
|
MaterialKey key = new MaterialKey(assetManager.getRelativeAssetPath(materialFileName)); |
||||||
|
assetManager.deleteFromCache(key); |
||||||
|
Material mat = (Material) assetManager.loadAsset(key); |
||||||
|
if (mat != null) { |
||||||
|
currentMaterial = mat; |
||||||
|
showMaterial(mat); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void showMaterial(Material m) { |
||||||
|
if (!init) { |
||||||
|
init(); |
||||||
|
} |
||||||
|
currentGeom.setMaterial(m); |
||||||
|
try { |
||||||
|
if (currentGeom.getMaterial() != null) { |
||||||
|
PreviewRequest request = new PreviewRequest(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()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void switchDisplay(DisplayType type) { |
||||||
|
switch (type) { |
||||||
|
case Box: |
||||||
|
currentGeom = box; |
||||||
|
break; |
||||||
|
case Sphere: |
||||||
|
currentGeom = sphere; |
||||||
|
break; |
||||||
|
case Quad: |
||||||
|
currentGeom = quad; |
||||||
|
break; |
||||||
|
} |
||||||
|
showMaterial(currentMaterial); |
||||||
|
} |
||||||
|
|
||||||
|
public void sceneOpened(SceneRequest request) { |
||||||
|
} |
||||||
|
|
||||||
|
public void sceneClosed(SceneRequest request) { |
||||||
|
} |
||||||
|
|
||||||
|
public void previewCreated(PreviewRequest request) { |
||||||
|
if (request.getRequester() == this) { |
||||||
|
final ImageIcon icon = new ImageIcon(request.getImage()); |
||||||
|
java.awt.EventQueue.invokeLater(new Runnable() { |
||||||
|
public void run() { |
||||||
|
label.setIcon(icon); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void cleanUp() { |
||||||
|
SceneApplication.getApplication().removeSceneListener(this); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue