Advertisement
Guest User

HelloGeometryBatchFactory

a guest
Aug 7th, 2012
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.02 KB | None | 0 0
  1. package hello;
  2.  
  3. import jme3tools.optimize.GeometryBatchFactory;
  4.  
  5. import com.jme3.app.SimpleApplication;
  6. import com.jme3.font.BitmapText;
  7. import com.jme3.input.KeyInput;
  8. import com.jme3.input.controls.ActionListener;
  9. import com.jme3.input.controls.AnalogListener;
  10. import com.jme3.input.controls.KeyTrigger;
  11. import com.jme3.light.AmbientLight;
  12. import com.jme3.light.DirectionalLight;
  13. import com.jme3.material.Material;
  14. import com.jme3.math.ColorRGBA;
  15. import com.jme3.math.Vector3f;
  16. import com.jme3.post.FilterPostProcessor;
  17. import com.jme3.post.filters.FXAAFilter;
  18. import com.jme3.post.ssao.SSAOFilter;
  19. import com.jme3.renderer.queue.RenderQueue.ShadowMode;
  20. import com.jme3.scene.Geometry;
  21. import com.jme3.scene.Node;
  22. import com.jme3.scene.Spatial;
  23. import com.jme3.scene.shape.Box;
  24. import com.jme3.shadow.PssmShadowRenderer;
  25. import com.jme3.system.AppSettings;
  26.  
  27. public class HelloGeometryBatchFactory extends SimpleApplication {
  28.  
  29.     public static void main(String[] args) {
  30.         AppSettings settings = new AppSettings(true);
  31.         settings.setResolution(800, 600);
  32.         settings.setTitle(HelloGeometryBatchFactory.class.getSimpleName());
  33.         settings.setSamples(0);
  34.         settings.setFrameRate(60);
  35.        
  36.         HelloGeometryBatchFactory app = new HelloGeometryBatchFactory();
  37.         app.app = app; // i know, right?
  38.         app.setShowSettings(false);
  39.         app.setSettings(settings);
  40.         app.setPauseOnLostFocus(false);        
  41.         app.start();
  42.     }
  43.    
  44.     private HelloGeometryBatchFactory app;
  45.     private float speedX = 0f, speedY = 0.1f;
  46.     private Vector3f lightDirection = new Vector3f(-.5f, -.5f, -.5f);
  47.    
  48.     private PssmShadowRenderer pssmRenderer;
  49.     private FilterPostProcessor fpp;   
  50.     private FXAAFilter fxaaFilter;
  51.     private SSAOFilter ssaoFilter;
  52.     private boolean useFXAA = false, useSSAO = false;
  53.    
  54.     private String postInfo = "";
  55.     private BitmapText postText;   
  56.    
  57.     @Override
  58.     public void simpleInitApp() {
  59.         setupCamera();
  60.         setupFont();
  61.         setupKeys();
  62.         setupFloor();
  63.         setupBoxes();
  64.         setupLights();
  65.         setupPost();       
  66.     }
  67.    
  68.     private void setupCamera() {
  69.         flyCam.setEnabled(false);
  70.         inputManager.removeListener(flyCam);
  71.        
  72.         final RtsCam rtsCam = new RtsCam(cam, rootNode);
  73.         rtsCam.registerWithInput(inputManager);
  74.         rtsCam.setCenter(new Vector3f(0f, 0f, 0f));
  75.     }
  76.    
  77.     private void setupFont() {
  78.         guiNode.detachAllChildren();
  79.         guiFont = assetManager.loadFont("Interface/Fonts/Console.fnt");
  80.         postText = new BitmapText(guiFont, false);
  81.         postText.setSize(guiFont.getCharSet().getRenderedSize());      
  82.         updatePostInfo();
  83.         guiNode.attachChild(postText);
  84.     }
  85.    
  86.     private void setupKeys() {
  87.         inputManager.addMapping("Left", new KeyTrigger(KeyInput.KEY_LEFT));    
  88.         inputManager.addMapping("Right", new KeyTrigger(KeyInput.KEY_RIGHT));
  89.         inputManager.addMapping("Up", new KeyTrigger(KeyInput.KEY_UP));
  90.         inputManager.addMapping("Down", new KeyTrigger(KeyInput.KEY_DOWN));
  91.         inputManager.addMapping("SSAO", new KeyTrigger(KeyInput.KEY_O));
  92.         inputManager.addMapping("PSSM", new KeyTrigger(KeyInput.KEY_P));
  93.         inputManager.addMapping("MSAA", new KeyTrigger(KeyInput.KEY_K));
  94.         inputManager.addMapping("FXAA", new KeyTrigger(KeyInput.KEY_L));
  95.        
  96.         inputManager.addListener(analogListener, new String[]{"Left", "Right", "Up", "Down"});
  97.         inputManager.addListener(actionListener, new String[]{"SSAO", "PSSM", "MSAA", "FXAA"});
  98.     }
  99.    
  100.     private AnalogListener analogListener = new AnalogListener() {
  101.         public void onAnalog(String name, float value, float tpf) {
  102.             if (name.equals("Left")) speedY -= 1f * tpf;
  103.             if (name.equals("Right")) speedY += 1f * tpf;
  104.             if (name.equals("Up")) speedX += 1f * tpf;
  105.             if (name.equals("Down")) speedX -= 1f * tpf;
  106.         }
  107.     };
  108.    
  109.     private ActionListener actionListener = new ActionListener() {
  110.         public void onAction(String name, boolean keyPressed, float tpf) {
  111.             // shadows
  112.             if (name.equals("PSSM") && keyPressed) {
  113.                 if (viewPort.getProcessors().contains(pssmRenderer)) viewPort.removeProcessor(pssmRenderer);
  114.                 else viewPort.addProcessor(pssmRenderer);
  115.             }
  116.             // hardware MSAA
  117.             if (name.equals("MSAA") && keyPressed) {
  118.                 int samples = settings.getSamples();
  119.                 if (samples == 0) settings.setSamples(2);
  120.                 else if (samples < 16) settings.setSamples(samples * 2);
  121.                 else settings.setSamples(0);               
  122.                 app.setSettings(settings);
  123.                 app.restart();
  124.             }
  125.             // ssao filter
  126.             if (name.equals("SSAO") && keyPressed) {
  127.                 viewPort.removeProcessor(fpp);
  128.                 if (useSSAO) fpp.removeFilter(ssaoFilter);
  129.                 else fpp.addFilter(ssaoFilter);
  130.                 viewPort.addProcessor(fpp);
  131.                 useSSAO = !useSSAO;
  132.             }
  133.             //fxaa
  134.             if (name.equals("FXAA") && keyPressed) {
  135.                 viewPort.removeProcessor(fpp);
  136.                 if (useFXAA) fpp.removeFilter(fxaaFilter);
  137.                 else fpp.addFilter(fxaaFilter);
  138.                 viewPort.addProcessor(fpp);
  139.                 useFXAA = !useFXAA;
  140.             }
  141.            
  142.             updatePostInfo();
  143.         }
  144.     };
  145.    
  146.     private void setupFloor() {
  147.         Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md");       
  148.         mat.setBoolean("UseMaterialColors", true);
  149.         mat.setColor("Ambient", ColorRGBA.Gray);
  150.         mat.setColor("Diffuse", ColorRGBA.Gray);
  151.         mat.setColor("Specular", ColorRGBA.Gray);      
  152.         mat.setFloat("Shininess", 2);
  153.        
  154.         Geometry box = new Geometry("Floor", new Box(Vector3f.ZERO, 10f, 0.1f, 10f));
  155.         box.setMaterial(mat);
  156.         box.setShadowMode(ShadowMode.Receive);
  157.         rootNode.attachChild(box);
  158.     }
  159.    
  160.     private void setupBoxes() {
  161.         float boxSize = 1f;
  162.         int worldSize = 5;
  163.        
  164.         Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md");
  165.         //mat.getAdditionalRenderState().setWireframe(true);
  166.         mat.setBoolean("UseMaterialColors", true);
  167.         mat.setColor("Ambient", ColorRGBA.White);
  168.         mat.setColor("Diffuse", ColorRGBA.White);
  169.         mat.setColor("Specular", ColorRGBA.White);
  170.         mat.setFloat("Shininess", 12);     
  171.        
  172.         Node boxes = new Node("boxes");
  173.         boxes.move(0, 2f, 0);
  174.        
  175.         for (int x = 0; x < worldSize; x++) {
  176.             for (int z = 0; z < worldSize; z++) {
  177.                
  178.                 float w1 = (worldSize-1);
  179.                 float w2 = w1/2; // 2
  180.                
  181.                 float xx = (x > w2) ? Math.abs(w1 - x) : x;
  182.                 float zz = (z > w2) ? Math.abs(w1 - z) : z;
  183.                
  184.                 float y = (xx < zz) ? xx : zz;
  185.                
  186.                 Vector3f pos = new Vector3f(x - w2, y, z - w2);
  187.                 Geometry box = new Geometry("Box", new Box(pos, boxSize, boxSize, boxSize));
  188.                 box.setMaterial(mat);
  189.                 //box.setShadowMode(ShadowMode.CastAndReceive);
  190.                
  191.                 boxes.attachChild(box);
  192.             }          
  193.         }
  194.        
  195.         Spatial optimizedBoxes = GeometryBatchFactory.optimize(boxes);
  196.         optimizedBoxes.setShadowMode(ShadowMode.CastAndReceive);
  197.         rootNode.attachChild(optimizedBoxes);      
  198.     }
  199.    
  200.     private void setupLights() {
  201.         DirectionalLight dl = new DirectionalLight();
  202.         dl.setDirection(lightDirection.normalizeLocal());
  203.         dl.setColor(ColorRGBA.White);
  204.         rootNode.addLight(dl);
  205.        
  206.         AmbientLight al = new AmbientLight();
  207.         al.setColor(ColorRGBA.White.mult(0.2f));
  208.         rootNode.addLight(al);
  209.     }
  210.    
  211.     private void setupPost() {
  212.         // set up fpp
  213.         fpp = new FilterPostProcessor(assetManager);
  214.         fpp.setNumSamples(1);
  215.        
  216.         // post proc filters
  217.         ssaoFilter = new SSAOFilter(12.940201f, 43.928635f, 0.32999992f, 0.6059958f);
  218.         fxaaFilter = new FXAAFilter();
  219.        
  220.         // shadows
  221.         pssmRenderer = new PssmShadowRenderer(assetManager, 1024, 3);
  222.         pssmRenderer.setDirection(lightDirection.normalizeLocal());    
  223.         rootNode.setShadowMode(ShadowMode.Off);    
  224.     }
  225.    
  226.     private void updatePostInfo() {
  227.         boolean hasPSSM = (viewPort.getProcessors().contains(pssmRenderer));       
  228.         int samples = settings.getSamples();
  229.        
  230.         postInfo = "";
  231.         if (hasPSSM) postInfo += "PSSM, ";
  232.         if (useSSAO) postInfo += "SSAO, ";
  233.         if (useFXAA) postInfo += "FXAA, ";
  234.         postInfo += samples + "xAA";
  235.        
  236.         postText.setText(postInfo);
  237.         postText.setLocalTranslation(settings.getWidth() - postText.getLineWidth() - 10,
  238.                 settings.getHeight() - postText.getLineHeight() + 5, 0);
  239.     }
  240.    
  241.     @Override
  242.     public void simpleUpdate(float tpf) {
  243.         rootNode.getChild("boxes").rotate(speedX*tpf, speedY*tpf, 0f);
  244.     }
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement