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;
}
}