Guest User

MazeToMesh

a guest
Aug 22nd, 2011
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.69 KB | None | 0 0
  1. package TheMaze.generation;
  2.  
  3. import com.jme3.math.Vector2f;
  4. import com.jme3.math.Vector3f;
  5. import com.jme3.scene.Mesh;
  6. import com.jme3.scene.VertexBuffer.Type;
  7. import com.jme3.util.BufferUtils;
  8. import java.util.ArrayList;
  9.  
  10. /**
  11.  * Creates a custom mesh from a matrix of 1 and 0
  12.  * represented through a 2D Array.
  13.  * It automaticly skips invisible Faces.
  14.  * @author Makkuro Na
  15.  */
  16. public class MazeToMesh {
  17.    
  18.     private ArrayList<Vector3f> vertices;
  19.     private ArrayList<Vector2f> texCoords;
  20.     private ArrayList<Integer> indexes;
  21.    
  22.    
  23.     Mesh maze;
  24.     Mesh ground;
  25.     int[][] grid;
  26.    
  27.     int vPos=0;
  28.    
  29.    
  30.     /**
  31.      * Initialites all needed stuff and creates a mesh from the given matrix.
  32.      */
  33.     public MazeToMesh(int[][] M) {
  34.        
  35.         grid=M;
  36.        
  37.         maze=new Mesh();
  38.         ground=new Mesh();
  39.        
  40.        
  41.         vertices=new ArrayList<Vector3f>();
  42.         texCoords=new ArrayList<Vector2f>();
  43.         indexes=new ArrayList<Integer>();
  44.        
  45.         build();
  46.         setBuffers();
  47.        
  48.         buildGround();
  49.     }
  50.    
  51.    
  52.     private void build() {
  53.        
  54.          // Fill the grid.
  55.         for (int x=0;x<grid.length;x++) {
  56.             for (int y=0;y<grid[0].length;y++) {
  57.                 if (grid[x][y]==1) {
  58.                     buildBlock(x, y);
  59.                 }
  60.             }
  61.         }
  62.        
  63.     }
  64.  
  65.     private void buildBlock(int x, int y) {
  66.        
  67.        
  68.             vertices.add(new Vector3f(x,4,y));
  69.             vertices.add(new Vector3f(x,0,y));
  70.             vertices.add(new Vector3f(x+1,0,y));
  71.  
  72.             indexes.add(vPos);
  73.             indexes.add(vPos+1);
  74.             indexes.add(vPos+2);
  75.  
  76.             vPos+=3;
  77.  
  78.             texCoords.add(new Vector2f(0,1));
  79.             texCoords.add(new Vector2f(0,0));
  80.             texCoords.add(new Vector2f(1,0));
  81.            
  82.             vertices.add(new Vector3f(x+1,0,y));
  83.             vertices.add(new Vector3f(x+1,4,y));
  84.             vertices.add(new Vector3f(x,4,y));
  85.  
  86.             indexes.add(vPos);
  87.             indexes.add(vPos+1);
  88.             indexes.add(vPos+2);
  89.  
  90.             vPos+=3;
  91.  
  92.             texCoords.add(new Vector2f(1,0));
  93.             texCoords.add(new Vector2f(1,1));
  94.             texCoords.add(new Vector2f(0,1));
  95.  
  96.            
  97.            
  98.             vertices.add(new Vector3f(x+1,4,y-1));
  99.             vertices.add(new Vector3f(x+1,0,y-1));
  100.             vertices.add(new Vector3f(x,0,y-1));
  101.  
  102.             indexes.add(vPos);
  103.             indexes.add(vPos+1);
  104.             indexes.add(vPos+2);
  105.  
  106.             vPos+=3;
  107.  
  108.             texCoords.add(new Vector2f(0,1));
  109.             texCoords.add(new Vector2f(0,0));
  110.             texCoords.add(new Vector2f(1,0));
  111.            
  112.             vertices.add(new Vector3f(x,0,y-1));
  113.             vertices.add(new Vector3f(x,4,y-1));
  114.             vertices.add(new Vector3f(x+1,4,y-1));
  115.  
  116.             indexes.add(vPos);
  117.             indexes.add(vPos+1);
  118.             indexes.add(vPos+2);
  119.  
  120.             vPos+=3;
  121.  
  122.             texCoords.add(new Vector2f(1,0));
  123.             texCoords.add(new Vector2f(1,1));
  124.             texCoords.add(new Vector2f(0,1));
  125.  
  126.            
  127.            
  128.             vertices.add(new Vector3f(x,4,y-1));
  129.             vertices.add(new Vector3f(x,0,y-1));
  130.             vertices.add(new Vector3f(x,0,y));
  131.  
  132.             indexes.add(vPos);
  133.             indexes.add(vPos+1);
  134.             indexes.add(vPos+2);
  135.  
  136.             vPos+=3;
  137.  
  138.             texCoords.add(new Vector2f(0,1));
  139.             texCoords.add(new Vector2f(0,0));
  140.             texCoords.add(new Vector2f(1,0));
  141.            
  142.             vertices.add(new Vector3f(x,0,y));
  143.             vertices.add(new Vector3f(x,4,y));
  144.             vertices.add(new Vector3f(x,4,y-1));
  145.  
  146.             indexes.add(vPos);
  147.             indexes.add(vPos+1);
  148.             indexes.add(vPos+2);
  149.  
  150.             vPos+=3;
  151.  
  152.             texCoords.add(new Vector2f(1,0));
  153.             texCoords.add(new Vector2f(1,1));
  154.             texCoords.add(new Vector2f(0,1));
  155.  
  156.            
  157.            
  158.             vertices.add(new Vector3f(x+1,4,y));
  159.             vertices.add(new Vector3f(x+1,0,y));
  160.             vertices.add(new Vector3f(x+1,0,y-1));
  161.  
  162.             indexes.add(vPos);
  163.             indexes.add(vPos+1);
  164.             indexes.add(vPos+2);
  165.  
  166.             vPos+=3;
  167.  
  168.             texCoords.add(new Vector2f(0,1));
  169.             texCoords.add(new Vector2f(0,0));
  170.             texCoords.add(new Vector2f(1,0));
  171.            
  172.             vertices.add(new Vector3f(x+1,0,y-1));
  173.             vertices.add(new Vector3f(x+1,4,y-1));
  174.             vertices.add(new Vector3f(x+1,4,y));
  175.  
  176.             indexes.add(vPos);
  177.             indexes.add(vPos+1);
  178.             indexes.add(vPos+2);
  179.  
  180.             vPos+=3;
  181.  
  182.             texCoords.add(new Vector2f(1,0));
  183.             texCoords.add(new Vector2f(1,1));
  184.             texCoords.add(new Vector2f(0,1));
  185.            
  186.            
  187.             // And set a top on it... XD
  188.             vertices.add(new Vector3f(x,4,y-1));
  189.             vertices.add(new Vector3f(x,4,y));
  190.             vertices.add(new Vector3f(x+1,4,y));
  191.  
  192.             indexes.add(vPos);
  193.             indexes.add(vPos+1);
  194.             indexes.add(vPos+2);
  195.  
  196.             vPos+=3;
  197.  
  198.             texCoords.add(new Vector2f(0,1));
  199.             texCoords.add(new Vector2f(0,0));
  200.             texCoords.add(new Vector2f(1,0));
  201.            
  202.             vertices.add(new Vector3f(x+1,4,y));
  203.             vertices.add(new Vector3f(x+1,4,y-1));
  204.             vertices.add(new Vector3f(x,4,y-1));
  205.  
  206.             indexes.add(vPos);
  207.             indexes.add(vPos+1);
  208.             indexes.add(vPos+2);
  209.  
  210.             vPos+=3;
  211.  
  212.             texCoords.add(new Vector2f(1,0));
  213.             texCoords.add(new Vector2f(1,1));
  214.             texCoords.add(new Vector2f(0,1));
  215.  
  216.     }
  217.    
  218.    
  219.     private void setBuffers() {
  220.        
  221.         // Create the needed arrays from the arraylists
  222.         Vector3f[] V=new Vector3f[vertices.size()];
  223.         for (int i=0;i<vertices.size();i++)
  224.             V[i]=vertices.get(i);
  225.        
  226.         Vector2f[] T=new Vector2f[texCoords.size()];
  227.         for (int i=0;i<texCoords.size();i++)
  228.             T[i]=texCoords.get(i);
  229.        
  230.         int[] I=new int[indexes.size()];
  231.         for (int i=0;i<indexes.size();i++)
  232.             I[i]=indexes.get(i);
  233.        
  234.         maze.setBuffer(Type.Position, 3, BufferUtils.createFloatBuffer(V));
  235.         maze.setBuffer(Type.TexCoord, 2, BufferUtils.createFloatBuffer(T));
  236.         maze.setBuffer(Type.Index,    1, BufferUtils.createIntBuffer(I));
  237.         maze.updateBound();
  238.     }
  239.    
  240.    
  241.     public Mesh getMesh() {
  242.         return maze;
  243.     }
  244.    
  245.     public Mesh getGround() {
  246.         return ground;
  247.     }
  248.  
  249.     private void buildGround() {
  250.         ArrayList<Vector3f> V=new ArrayList<Vector3f>();
  251.         ArrayList<Vector2f> T=new ArrayList<Vector2f>();
  252.         ArrayList<Integer> I=new ArrayList<Integer>();
  253.         vPos=0;
  254.        
  255.         for (int x=0;x<grid.length;x++) {
  256.             for (int y=0;y<grid[0].length;y++) {
  257.                 if (grid[x][y]==0) {
  258.                     V.add(new Vector3f(x,0,y-1));
  259.                     V.add(new Vector3f(x,0,y));
  260.                     V.add(new Vector3f(x+1,0,y));
  261.  
  262.                     I.add(vPos);
  263.                     I.add(vPos+1);
  264.                     I.add(vPos+2);
  265.  
  266.                     vPos+=3;
  267.  
  268.                     T.add(new Vector2f(0,1));
  269.                     T.add(new Vector2f(0,0));
  270.                     T.add(new Vector2f(1,0));
  271.  
  272.                     V.add(new Vector3f(x+1,0,y));
  273.                     V.add(new Vector3f(x+1,0,y-1));
  274.                     V.add(new Vector3f(x,0,y-1));
  275.  
  276.                     I.add(vPos);
  277.                     I.add(vPos+1);
  278.                     I.add(vPos+2);
  279.  
  280.                     vPos+=3;
  281.  
  282.                     T.add(new Vector2f(1,0));
  283.                     T.add(new Vector2f(1,1));
  284.                     T.add(new Vector2f(0,1));
  285.                 }
  286.             }
  287.         }
  288.        
  289.        
  290.         // Create the needed arrays from the arraylists
  291.         Vector3f[] V2=new Vector3f[V.size()];
  292.         for (int i=0;i<V.size();i++)
  293.             V2[i]=V.get(i);
  294.        
  295.         Vector2f[] T2=new Vector2f[T.size()];
  296.         for (int i=0;i<T.size();i++)
  297.             T2[i]=T.get(i);
  298.        
  299.         int[] I2=new int[I.size()];
  300.         for (int i=0;i<I.size();i++)
  301.             I2[i]=I.get(i);
  302.        
  303.         ground.setBuffer(Type.Position, 3, BufferUtils.createFloatBuffer(V2));
  304.         ground.setBuffer(Type.TexCoord, 2, BufferUtils.createFloatBuffer(T2));
  305.         ground.setBuffer(Type.Index,    1, BufferUtils.createIntBuffer(I2));
  306.         ground.updateBound();
  307.        
  308.        
  309.     }
  310.    
  311. }
Advertisement
Add Comment
Please, Sign In to add comment