Advertisement
Elec0

Shape3D.java

Apr 6th, 2013 (edited)
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.64 KB | None | 0 0
  1. package elec0.proceduralCity;
  2.  
  3. import static org.lwjgl.opengl.GL11.*;
  4.  
  5. import java.util.ArrayList;
  6.  
  7. import org.newdawn.slick.opengl.Texture;
  8.  
  9. import elec0.utils.Vector2f;
  10. import elec0.utils.Vector3f;
  11.  
  12. @SuppressWarnings("unchecked")
  13. public class Shape3D
  14. {
  15.     public int iRenderType;
  16.     public ArrayList<Vector3f> v3Verts;
  17.     public ArrayList<Vector2f> v2UV;
  18.    
  19.     public Vector3f[] v3VertsA;
  20.     public Vector2f[] v2UVA;
  21.    
  22.     private Texture tTex;
  23.    
  24.     private boolean bArrayUpdated = false;
  25.    
  26.     public Shape3D()
  27.     { init(); }
  28.     /**
  29.      * For use in cloning, prove a Shape3D and it will copy everything over
  30.      * @param s3Shape
  31.      */
  32.     public Shape3D(Shape3D s3Shape)
  33.     {
  34.         init();
  35.         this.iRenderType = s3Shape.iRenderType;
  36.         this.v3Verts = s3Shape.v3Verts;
  37.         this.v2UV = s3Shape.v2UV;
  38.         this.v3VertsA = s3Shape.v3VertsA;
  39.         this.v2UVA = s3Shape.v2UVA;
  40.     }
  41.     public Shape3D(int iRenderType)
  42.     {
  43.         init();
  44.         this.iRenderType = iRenderType;
  45.     }
  46.     /**
  47.      * If you provide Shape3D with an ArrayList of points, it assumes that it is the completed list. If you edit it, you must recall createArray
  48.      * @param iRenderType
  49.      * @param v3Verts
  50.      */
  51.     public Shape3D(int iRenderType, ArrayList<Vector3f> v3Verts)
  52.     {
  53.         init();
  54.         this.iRenderType = iRenderType;
  55.         this.v3Verts = (ArrayList<Vector3f>) v3Verts.clone();
  56.         createArray();
  57.     }
  58.     public Shape3D(int iRenderType, ArrayList<Vector3f> v3Verts, ArrayList<Vector2f> v2UV)
  59.     {
  60.         init();
  61.         this.iRenderType = iRenderType;
  62.         this.v3Verts = (ArrayList<Vector3f>) v3Verts.clone();
  63.         this.v2UV = (ArrayList<Vector2f>) v2UV.clone();
  64.         createArray();
  65.     }
  66.    
  67.     /**
  68.      *
  69.      * @param x
  70.      * @param y
  71.      * @param z
  72.      */
  73.     public void addPoint(float x, float y, float z)
  74.     {
  75.         bArrayUpdated = false;
  76.         v3Verts.add(new Vector3f(x, y, z));
  77.     }
  78.     public void addPoint(Vector3f point)
  79.     {
  80.         bArrayUpdated = false;
  81.         v3Verts.add(point);
  82.     }
  83.    
  84.     /**
  85.      *
  86.      * @param u
  87.      * @param v
  88.      */
  89.     public void addUVPoint(float u, float v)
  90.     {
  91.         bArrayUpdated = false;
  92.         v2UV.add(new Vector2f(u, v));
  93.     }
  94.     public void addUVPoint(Vector2f point)
  95.     {
  96.         bArrayUpdated = false;
  97.         v2UV.add(point);
  98.     }
  99.    
  100.     private void init()
  101.     {
  102.         v3Verts = new ArrayList<Vector3f>();
  103.         v2UV = new ArrayList<Vector2f>();
  104.     }
  105.    
  106.     public void createArray()
  107.     {
  108.         int i = 0;
  109.         bArrayUpdated = true;
  110.        
  111.         if(v3Verts != null)
  112.         {
  113.             v3VertsA = new Vector3f[v3Verts.size()];
  114.            
  115.             for(Vector3f v : v3Verts)
  116.             {
  117.                 v3VertsA[i] = new Vector3f(v);
  118.                 i++;
  119.             }
  120.         }
  121.         else
  122.             System.out.println("Shape3D error: You must pass vertices into the Shape3D");
  123.        
  124.         i = 0;
  125.         if(v2UV != null)
  126.         {
  127.             v2UVA = new Vector2f[v2UV.size()];
  128.            
  129.             for(Vector2f v : v2UV)
  130.             {
  131.                 v2UVA[i] = new Vector2f(v);
  132.                 i++;
  133.             }
  134.         }
  135.        
  136.     }
  137.     public void render()
  138.     {
  139.         if(!bArrayUpdated)
  140.             createArray();
  141.        
  142.         glPushMatrix();
  143.        
  144.         glBegin(iRenderType);
  145.  
  146.         glColor3f(1, 1, 1);
  147.        
  148.         if(tTex != null)
  149.             tTex.bind();
  150.        
  151.         for(int i = 0; i < v3VertsA.length; ++i)
  152.         {
  153.             // Opengl uses a different coordinate system than I'm used to, so I switch Y and Z when I render.
  154.             glVertex3f(v3VertsA[i].getX(), v3VertsA[i].getZ(), v3VertsA[i].getY());
  155.            
  156.             if(v2UVA.length > 0)
  157.             {
  158.                 if(i < v2UVA.length-1)
  159.                 glTexCoord2f(v2UVA[i].getX(), v2UVA[i].getY());
  160.             }
  161.         }
  162.        
  163.         glEnd();
  164.        
  165.         glPopMatrix();
  166.     }
  167.    
  168.    
  169.     /**
  170.      * Generates a cube/rectangle with given parameters. Requires GL_QUADS to be rendermode
  171.      * @param fXWidth
  172.      * @param fYWidth
  173.      * @param fHeight
  174.      * @param v3Start
  175.      */
  176.     public void makeBox(float fXWidth, float fYWidth, float fHeight, Vector3f v3Start, Vector3f v3Origin)
  177.     {
  178.         Vector3f v3Offset = new Vector3f(v3Origin);
  179.         if(v3Start != null)
  180.             v3Offset.addTo(v3Start);
  181.        
  182.         // Bottom
  183.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY(), v3Offset.getZ()));
  184.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY(), v3Offset.getZ()));
  185.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY() + fYWidth, v3Offset.getZ()));
  186.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY() + fYWidth, v3Offset.getZ()));
  187.        
  188.        
  189.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY(), v3Offset.getZ()));
  190.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY(), v3Offset.getZ()));
  191.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY(), v3Offset.getZ() + fHeight));
  192.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY(), v3Offset.getZ() + fHeight));
  193.        
  194.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY() + fYWidth, v3Offset.getZ()));
  195.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY() + fYWidth, v3Offset.getZ()));
  196.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY() + fYWidth, v3Offset.getZ() + fHeight));
  197.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY() + fYWidth, v3Offset.getZ() + fHeight));
  198.        
  199.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY(), v3Offset.getZ()));
  200.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY() + fYWidth, v3Offset.getZ()));
  201.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY() + fYWidth, v3Offset.getZ() + fHeight));
  202.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY(), v3Offset.getZ() + fHeight));
  203.        
  204.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY(), v3Offset.getZ()));
  205.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY() + fYWidth, v3Offset.getZ()));
  206.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY() + fYWidth, v3Offset.getZ() + fHeight));
  207.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY(), v3Offset.getZ() + fHeight));
  208.        
  209.         // Top
  210.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY(), v3Offset.getZ() + fHeight));
  211.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY(), v3Offset.getZ() + fHeight));
  212.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY() + fYWidth, v3Offset.getZ() + fHeight));
  213.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY() + fYWidth, v3Offset.getZ() + fHeight));
  214.     }
  215.    
  216.    
  217.     public void makeBoxUV(float fXWidth, float fYWidth, float fHeight, Vector3f v3Start, Vector3f v3Origin, float fMinUVX, float fMaxUVX, float fMinUVY, float fMaxUVY)
  218.     {
  219.         Vector3f v3Offset = new Vector3f(v3Origin);
  220.         if(v3Start != null)
  221.             v3Offset.addTo(v3Start);
  222.        
  223.         // Bottom
  224.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY(), v3Offset.getZ()));
  225.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY(), v3Offset.getZ()));
  226.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY() + fYWidth, v3Offset.getZ()));
  227.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY() + fYWidth, v3Offset.getZ()));
  228.        
  229.             v2UV.add(new Vector2f(0, 1));
  230.             v2UV.add(new Vector2f(0, 1));
  231.             v2UV.add(new Vector2f(0, 1));
  232.             v2UV.add(new Vector2f(0, 1));
  233.        
  234.         // Sides
  235.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY(), v3Offset.getZ()));
  236.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY(), v3Offset.getZ()));
  237.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY(), v3Offset.getZ() + fHeight));
  238.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY(), v3Offset.getZ() + fHeight));
  239.        
  240.             v2UV.add(new Vector2f(fMinUVX, fMinUVY));
  241.             v2UV.add(new Vector2f(fMaxUVX, fMinUVY));
  242.             v2UV.add(new Vector2f(fMaxUVX, fMaxUVY));
  243.             v2UV.add(new Vector2f(fMinUVX, fMaxUVY));
  244.        
  245.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY() + fYWidth, v3Offset.getZ()));
  246.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY() + fYWidth, v3Offset.getZ()));
  247.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY() + fYWidth, v3Offset.getZ() + fHeight));
  248.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY() + fYWidth, v3Offset.getZ() + fHeight));
  249.        
  250.             v2UV.add(new Vector2f(fMinUVX, fMinUVY));
  251.             v2UV.add(new Vector2f(fMaxUVX, fMinUVY));
  252.             v2UV.add(new Vector2f(fMaxUVX, fMaxUVY));
  253.             v2UV.add(new Vector2f(fMinUVX, fMaxUVY));
  254.        
  255.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY(), v3Offset.getZ()));
  256.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY() + fYWidth, v3Offset.getZ()));
  257.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY() + fYWidth, v3Offset.getZ() + fHeight));
  258.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY(), v3Offset.getZ() + fHeight));
  259.        
  260.             v2UV.add(new Vector2f(fMinUVX, fMinUVY));
  261.             v2UV.add(new Vector2f(fMaxUVX, fMinUVY));
  262.             v2UV.add(new Vector2f(fMaxUVX, fMaxUVY));
  263.             v2UV.add(new Vector2f(fMinUVX, fMaxUVY));
  264.        
  265.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY(), v3Offset.getZ()));
  266.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY() + fYWidth, v3Offset.getZ()));
  267.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY() + fYWidth, v3Offset.getZ() + fHeight));
  268.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY(), v3Offset.getZ() + fHeight));
  269.        
  270.             v2UV.add(new Vector2f(fMinUVX, fMinUVY));
  271.             v2UV.add(new Vector2f(fMaxUVX, fMinUVY));
  272.             v2UV.add(new Vector2f(fMaxUVX, fMaxUVY));
  273.             v2UV.add(new Vector2f(fMinUVX, fMaxUVY));
  274.        
  275.         // Top
  276.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY(), v3Offset.getZ() + fHeight));
  277.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY(), v3Offset.getZ() + fHeight));
  278.         v3Verts.add(new Vector3f(v3Offset.getX() + fXWidth, v3Offset.getY() + fYWidth, v3Offset.getZ() + fHeight));
  279.         v3Verts.add(new Vector3f(v3Offset.getX(), v3Offset.getY() + fYWidth, v3Offset.getZ() + fHeight));
  280.        
  281.             v2UV.add(new Vector2f(0, 1));
  282.             v2UV.add(new Vector2f(0, 1));
  283.             v2UV.add(new Vector2f(0, 1));
  284.             v2UV.add(new Vector2f(0, 1));
  285.     }
  286.    
  287.     public void setTexture(Texture tTex)
  288.     {
  289.         this.tTex = tTex;
  290.     }
  291. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement