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