M3GTexturing.java
上传用户:gyyuli
上传日期:2013-07-09
资源大小:3050k
文件大小:10k
源码类别:

J2ME

开发平台:

Java

  1. import javax.microedition.midlet.*;
  2. import javax.microedition.lcdui.*;
  3. import javax.microedition.m3g.*;
  4. import javax.microedition.lcdui.game.*;
  5. public class M3GTexturing extends MIDlet {
  6.     
  7.     private Display d;
  8.     private M3GTexCanvas texCanvas;
  9.     
  10.     public M3GTexturing(){
  11.         texCanvas = new M3GTexCanvas(this);
  12.         d = Display.getDisplay(this);
  13.         d.setCurrent(texCanvas);
  14.     }
  15.     
  16.     public void startApp() {
  17.     }
  18.     
  19.     public void pauseApp() {
  20.     }
  21.     
  22.     public void destroyApp(boolean unconditional) {
  23.     }
  24. }
  25. class M3GTexCanvas extends GameCanvas implements Runnable{
  26.     private MIDlet midlet;
  27.   
  28.     private Graphics3D g3d; // Graphics object used to render the world.
  29.     private World world; // This world contains the two meshes to be rendered..
  30.     private Camera camera; // the camera in the scene
  31.     private Mesh pyramidMesh; // the pyramid in the scene
  32.     
  33.     private Texture2D brickTexture = null; // reference to the first texture on the pyramid.
  34.     private Texture2D multiTexture = null; // reference to the second texture on the pyramid.
  35.     private Texture2D infoTexture = null; // reference to the text texture.
  36.     
  37.     private Appearance meshAppearance; //  
  38.     
  39.    
  40.     private Image SwitchImage = null;
  41.     
  42.     private int INDEX = 0;
  43.     
  44.     public M3GTexCanvas(MIDlet m){
  45.         super(false);
  46.         midlet = m;
  47.         load2dImages();
  48.         
  49.         setFullScreenMode(true);
  50.         brickTexture  = createBrickTexture("/texture.png"); // create the 1st pyramid texture.
  51.         multiTexture  = createTexture("/texture2.png"); // create the 2nd pyramid texture.
  52.         
  53.         
  54.         g3d = Graphics3D.getInstance();
  55.         world = new World();
  56.         camera = new Camera();
  57.         world.addChild(camera); // add the camera to the world.
  58.        
  59.         float w = getWidth();
  60.         float h = getHeight();
  61.         // Constructs a perspective projection matrix and sets that as the current projection matrix.
  62.         camera.setPerspective(60.0f, w / h, 0.1f, 50f);
  63.         
  64.         pyramidMesh = createpyramid(); // create our pyramid.
  65.         pyramidMesh.setTranslation(0.0f, 0.0f, -3.0f); // move the pyramid 3 units into the screen.
  66.         meshAppearance = pyramidMesh.getAppearance(0);
  67.         world.addChild(pyramidMesh); // add the pyramid to the world
  68.         world.setActiveCamera(camera);
  69.         Thread t = new Thread(this);
  70.         t.start();
  71.     }
  72.     private void load2dImages(){
  73.         try{
  74.            
  75.             SwitchImage = Image.createImage("/switch.png");
  76.         }catch(Exception e){
  77.             System.out.println("Failed to load 2D images");
  78.         }
  79.     }
  80.     public void draw3D(Graphics g){
  81.         try{
  82.             g3d.bindTarget(g); // Binds the given Graphics or mutable Image2D as the rendering target of this Graphics3D
  83.             g3d.render(world); // Render the world
  84.         }finally{
  85.             g3d.releaseTarget();
  86.         }
  87.     }
  88.     private void draw2D(Graphics g){
  89.         
  90.         g.drawImage(SwitchImage, getWidth(), getHeight(), Graphics.BOTTOM | Graphics.RIGHT);
  91.     }
  92.     protected void keyPressed(int key){
  93.         switch(key){
  94.             case -6:
  95.                 midlet.notifyDestroyed();
  96.                 break;
  97.             case -7:
  98.                 INDEX = INDEX==2?0:INDEX+1;
  99.                 break;
  100.         }
  101.     }
  102.     public void run() {
  103.         Graphics g = getGraphics();
  104.         while(true){
  105.             // rotate the pyramid 3 degrees around the Y-axis.
  106.            pyramidMesh.postRotate(3.0f, 0.0f, 1.0f, 0.0f);
  107.             
  108.             switch(INDEX){
  109.                 case 0:
  110.                     meshAppearance.setTexture(0,  null); // remove the second texture.
  111.                     meshAppearance.setTexture(1,  null); // remove the second texture.
  112.                     break;
  113.                 case 1:
  114.                     meshAppearance.setTexture(0,  brickTexture); // remove the second texture.
  115.                     break;
  116.                 case 2:
  117.                     meshAppearance.setTexture(1,  multiTexture); // add the second texture
  118.                     break;
  119.               
  120.             }
  121.   
  122.             draw3D(g);
  123.             draw2D(g);
  124.             flushGraphics();
  125.         }
  126.     }
  127.     /*
  128.      * Create Clamped texture with modulate blending, this is used for the second pyramid texture.
  129.      */
  130.     private Texture2D createTexture(String path){
  131.         Texture2D texture = null;
  132.         try{
  133.             Image texImg = Image.createImage(path); // Load the image
  134.             texture = new Texture2D(new Image2D(Image2D.RGB, texImg)); // create the texture from the image
  135.             texture.setWrapping(Texture2D.WRAP_CLAMP, Texture2D.WRAP_CLAMP); // don't repeat the texture.
  136.             texture.setBlending(Texture2D.FUNC_MODULATE);
  137.             texture.setFiltering(Texture2D.FILTER_LINEAR, Texture2D.FILTER_LINEAR);
  138.         }catch(Exception e){
  139.             System.out.println("Failed to create texture");
  140.         }
  141.         return texture;
  142.     }
  143.     
  144.     private Texture2D createBrickTexture(String path){
  145.         Texture2D texture = null;
  146.         try{
  147.             Image texImg = Image.createImage(path); // load the image
  148.             texture = new Texture2D(new Image2D(Image2D.RGB, texImg)); // create texture from loaded image.
  149.             texture.setWrapping(Texture2D.WRAP_REPEAT, Texture2D.WRAP_REPEAT); // repeat texture on surface
  150.             texture.setBlending(Texture2D.FUNC_DECAL); // Blend mode to use.
  151.             texture.setFiltering(Texture2D.FILTER_BASE_LEVEL, Texture2D.FILTER_NEAREST); // Use nearest for performance, linear for quality
  152.  
  153.         }catch(Exception e){
  154.             System.out.println("Failed to create texture");
  155.         }        
  156.         
  157.         return texture;
  158.     }
  159.    
  160.     /*
  161.      * Create a pyramid
  162.      */
  163.     private Mesh createpyramid(){
  164.         
  165.         // The vertices used by the pyramid. x, y, z
  166.         short []POINTS = new short[] {-1, -1, 1,    1, -1, 1,   0, 1, 0,     // front
  167.                                                            1, -1, 1,    1, -1, -1,  0, 1, 0,    // right
  168.                                                            1, -1, -1,  -1, -1, -1,  0, 1, 0,    // back
  169.                                                           -1, -1, -1,  -1, -1, 1,   0, 1, 0,    // left
  170.                                                           -1, -1, 1,    1, -1, 1,   1, -1, -1,  // bottom right
  171.                                                           -1, -1, 1,    1, -1, -1, -1, -1, -1}; // bottom left
  172.         // The texture coordinates is scaled down to 0-1 values in the setTextCoords method
  173.         short []TEXTURES = new short[] {0, 255,        255, 255,     127, 0,
  174.                                                               0, 255,        255, 255,     127, 0,
  175.                                                               0, 255,        255, 255,     127, 0,
  176.                                                               0, 255,        255, 255,     127, 0,
  177.                                                               0, 0,            255, 0,         255, 255,
  178.                                                               0, 0,            255, 255,     0, 255};
  179.                                                             
  180.         // The points sequence.
  181.         int []INDICES = new int[] {0, 1, 2, // front
  182.                                                    3, 4, 5,  // right
  183.                                                    6, 7, 8,  // back
  184.                                                    9, 10, 11, // left
  185.                                                    12, 13, 14, // bottomright
  186.                                                    15, 16, 17}; // bottomleft
  187.         // The length of each sequence in the indices array.
  188.         int []LENGTH = new int[] {3, 3, 3, 3, 3, 3}; // the pyramid is built by six triangles
  189.         
  190.         VertexArray POSITION_ARRAY, TEXTURE_ARRAY;
  191.         IndexBuffer INDEX_BUFFER;
  192.         
  193.         // Create a VertexArray to be used by the VertexBuffer
  194.         POSITION_ARRAY = new VertexArray(POINTS.length / 3, 3, 2);
  195.         POSITION_ARRAY.set(0, POINTS.length / 3, POINTS);
  196.         TEXTURE_ARRAY = new VertexArray(TEXTURES.length / 2, 2, 2);
  197.         TEXTURE_ARRAY.set(0, TEXTURES.length / 2, TEXTURES);
  198.         INDEX_BUFFER = new TriangleStripArray(INDICES, LENGTH);
  199.         // VertexBuffer holds references to VertexArrays that contain the positions, colors, normals, 
  200.         // and texture coordinates for a set of vertices
  201.         VertexBuffer vertexBuffer = new VertexBuffer();
  202.         vertexBuffer.setPositions(POSITION_ARRAY, 1.0f, null);
  203.         vertexBuffer.setTexCoords(0, TEXTURE_ARRAY, (1.0f/255.0f), null);
  204.         vertexBuffer.setTexCoords(1, TEXTURE_ARRAY, (1.0f/255.0f), null);
  205.         // Create the 3D object defined as a polygonal surface
  206.         Mesh mesh = new Mesh(vertexBuffer, INDEX_BUFFER, null);
  207.         
  208.         Appearance appearance = new Appearance(); // A set of component objects that define the rendering attributes of a Mesh
  209.         PolygonMode polygonMode = new PolygonMode(); // An Appearance component encapsulating polygon-level attributes
  210.         polygonMode.setPerspectiveCorrectionEnable(true);
  211.         polygonMode.setCulling(PolygonMode.CULL_BACK); // Use CULL_BACK for performace.
  212.         appearance.setPolygonMode(polygonMode);
  213.         
  214.         mesh.setAppearance(0, appearance); // Set the appearance to the 3D object
  215.         return mesh;
  216.     }    
  217.         
  218.     
  219. }