House.java

java · 326 lines · part of Test Java Cube Rendering · raw

import java.awt.*;
import java.applet.*;



//---- Z3D_Scene -------------------------------------------------------------//

class Z3D_Scene
{
  //- Screen data

  int buf[];
  int w, h;

  //- Render options

  boolean wireframe = false;
  
  boolean wireframe_changed = false;
  boolean wireframe_new = false;

  //- Traingle data
  
  float tri_x1, tri_y1, tri_x2, tri_y2, tri_x3, tri_y3;

  //- Orientation

  float rx, ry;

  //- 3D Object
  
  int[][] face;
  float[][] point;

  float[][] tpoint;
  float[][] spoint;
  
  int numPoints, numFaces;
  


  //---- Scene

  public Z3D_Scene(int[] buf, int w, int h)
  {
    this.w = w;
    this.h = h;
    this.buf = buf;
    
    //- Create object

    tpoint = new float[8][3];
    spoint = new float[8][3];
    
    point = new float[8][3];
    face = new int[12][3];
    
    numPoints = 8;
    numFaces = 12;
    
    point[0][0] =  1; point[0][1] =  1; point[0][2] =  1;
    point[1][0] =  1; point[1][1] =  1; point[1][2] = -1;
    point[2][0] = -1; point[2][1] =  1; point[2][2] = -1;
    point[3][0] = -1; point[3][1] =  1; point[3][2] =  1;
    point[4][0] =  1; point[4][1] = -1; point[4][2] =  1;
    point[5][0] =  1; point[5][1] = -1; point[5][2] = -1;
    point[6][0] = -1; point[6][1] = -1; point[6][2] = -1;
    point[7][0] = -1; point[7][1] = -1; point[7][2] =  1;
    
    face[ 0][0] = 0; face[ 0][1] = 1; face[ 0][2] = 2;
    face[ 1][0] = 2; face[ 1][1] = 3; face[ 1][2] = 0;
    face[ 2][0] = 5; face[ 2][1] = 6; face[ 2][2] = 2;
    face[ 3][0] = 2; face[ 3][1] = 1; face[ 3][2] = 5;
    face[ 4][0] = 6; face[ 4][1] = 7; face[ 4][2] = 3;
    face[ 5][0] = 3; face[ 5][1] = 2; face[ 5][2] = 6;
    face[ 6][0] = 7; face[ 6][1] = 6; face[ 6][2] = 5;
    face[ 7][0] = 5; face[ 7][1] = 4; face[ 7][2] = 7;
    face[ 8][0] = 0; face[ 8][1] = 3; face[ 8][2] = 7;
    face[ 9][0] = 7; face[ 9][1] = 4; face[ 9][2] = 0;
    face[10][0] = 0; face[10][1] = 4; face[10][2] = 5;
    face[11][0] = 5; face[11][1] = 1; face[11][2] = 0;
  }

  //---- setRotation

  public void setRotation(float rx, float ry)
  {
    this.rx = rx;
    this.ry = ry;
  }  

  //---- setWireframe

  public void setWireframe(boolean wf)
  {
    wireframe_new = wf;
    wireframe_changed = true;
  }

  //---- render

  public void render()
  {
    if(wireframe_changed)
    {
      wireframe_changed = false;
      wireframe = wireframe_new;
    }

    //- Clear buffer

    idx3d_Math.clearBuffer(buf, 0);
    
    //- Render object
    
    int i;
    
    rx = -0.5f;
    ry += 0.01f;
    
    //  Transform

    float x, y, z;
    idx3d_Matrix m;
    
    m = new idx3d_Matrix();
    m.rotateSelf(rx, 0, 0);
    m.rotateSelf(0, ry, 0);
    m.shift(0, 0, 4);

    for(i=0; i<numPoints; i++)
    {
      x = point[i][0];
      y = point[i][1];
      z = point[i][2];

  		tpoint[i][0] = x*m.m00 + y*m.m01 + z*m.m02+ m.m03;
  		tpoint[i][1] = x*m.m10 + y*m.m11 + z*m.m12+ m.m13;
    	tpoint[i][2] = x*m.m20 + y*m.m21 + z*m.m22+ m.m23;
	  }
    
    //  Calculate screen co-ords

    for(i=0; i<numPoints; i++)
    {
      x = tpoint[i][0];
      y = tpoint[i][1];
      z = tpoint[i][2];

      spoint[i][0] = w*0.5f + w*0.5f * x / z;
      spoint[i][1] = h*0.5f + w*0.5f * y / z;
      spoint[i][2] = z;
    }
    
    //  Render dots
    
/*
    for(i=0; i<numPoints; i++)
    {
      x = spoint[i][0];
      y = spoint[i][1];
      z = spoint[i][2];
      
      buf[((int)y)*w + (int)x] = 0xFFFFFFFF;
    }
*/

    //  Render triangles

    for(i=0; i<numFaces; i++)
    {
      tri_x1 = spoint[face[i][0]][0];
      tri_y1 = spoint[face[i][0]][1];
      
      tri_x2 = spoint[face[i][1]][0];
      tri_y2 = spoint[face[i][1]][1];
      
      tri_x3 = spoint[face[i][2]][0];
      tri_y3 = spoint[face[i][2]][1];
      
      tri_col(i*0x87638723);
    }
    
  }  



  //---- tri_col

  public void tri_col(int col)
  {
    
    float t;
    int x, y, y1, y2, x1, x2, o, ti;
    float c1, c2;
    float dc;
    
    //  Don't draw if backfacing
    
    if((tri_x2-tri_x1)*(tri_y3-tri_y1) > (tri_x3-tri_x1)*(tri_y2-tri_y1)) return;
    
    // Sort points
    
    if(tri_y1 > tri_y2) { t=tri_y2; tri_y2=tri_y1; tri_y1=t;  t=tri_x2; tri_x2=tri_x1; tri_x1=t; }
    if(tri_y2 > tri_y3) { t=tri_y3; tri_y3=tri_y2; tri_y2=t;  t=tri_x3; tri_x3=tri_x2; tri_x2=t; }
    if(tri_y1 > tri_y2) { t=tri_y2; tri_y2=tri_y1; tri_y1=t;  t=tri_x2; tri_x2=tri_x1; tri_x1=t; }
    
    // Clip top point to screen and pixel
    
    y1 = (int)tri_y1; if(y1>=h) return; if(y1<0) y1 = 0;
    y2 = (int)tri_y3; if(y2<0) return; if(y2>h) y2 = h;

    c1=0; c2=0;

    for(y=y1-1; y<y2+1; y++)
    {
      if(y >= tri_y1 && y < tri_y3)
      {
        if(y >= tri_y1 && y < tri_y2)
        {
          x1 = (int)(tri_x1 + (tri_x3-tri_x1) * (y-tri_y1) / (tri_y3-tri_y1));
          x2 = (int)(tri_x1 + (tri_x2-tri_x1) * (y-tri_y1) / (tri_y2-tri_y1));
        }
        else
        {
          x1 = (int)(tri_x1 + (tri_x3-tri_x1) * (y-tri_y1) / (tri_y3-tri_y1));
          x2 = (int)(tri_x2 + (tri_x3-tri_x2) * (y-tri_y2) / (tri_y3-tri_y2));
        }
        if(x1 > x2)
        {
          ti = x2; x2 = x1; x1 = ti;
          t = c2; c2 = c1; c1 = t;
        }
        if(x1 < 0) x1 = 0;
        if(x2 > w) x2 = w;
    
        if(x2 > x1) {
          dc = (c2-c1)/(x2-x1);
    
          o = y*w + x1;
    
          for(x = x1; x < x2; x ++) buf[o++] = col;
        }
          
      }
    }
    
  }


}



//---- House -----------------------------------------------------------------//

public class House extends tinyptc
{
  //- Data

  int rx, ry;



  //- Main code

  public void main(int width, int height)
  {
    int size = width * height;
    int buf[] = new int[size];
    int seed = 0x12345;

    Z3D_Scene scene = new Z3D_Scene(buf, width, height);
    
    while (true)
    {
      scene.render();
      update(buf);
    }
  }




  //- Mouse code

  int mouse_x = 0, mouse_y = 0;
  int mouse_oldx = 0, mouse_oldy = 0;
  boolean mouse_drag = true;



  public boolean mouseDown(Event evt, int x, int y)
  {
    mouse_oldx = x;
    mouse_oldy = y;
    mouse_x = x;
    mouse_y = y;
    mouse_drag = true;

    return true;
  }


  
  public boolean mouseDrag(Event e, int x, int y)
  {
    mouse_x = x;
    mouse_y = y;

    return true;
  }



  public boolean mouseUp(Event evt, int x, int y)
  {
    mouse_drag = false;

    return true;
  }
  

}