//========================================== class World{ boolean fog; Room[] rooms; //------------ World(){ } //------------ void fog(boolean b){ fog = b; } } //========================================== class Room{ Wall[] walls; boolean fog; float fogDistance; color fogColor; //------------ Room(){ fog = true; fogDistance = 500f; fogColor = color(192); float a = 0f; walls = new Wall[11]; walls[0] = new Wall( -1,a,a, 100,a,a,new Shader(color(255,0,0)) ); walls[1] = new Wall( 1,a,a, -300,a,a,new Shader(color(128,0,0)) ); walls[2] = new Wall( a,-1,a, a, 100,a,new Shader(color(0,255,0)) ); walls[3] = new Wall( a, 1,a, a,-100,a,new Shader(color(0,128,0)) ); walls[4] = new Wall( a,a,-1, a,a, 100,new Shader(color(0,0,255)) ); walls[5] = new Wall( a,a, 1, a,a,-100,new Shader(color(0,0,128)) ); walls[6] = new Wall( 1,1,1, -260,-60,-60,new Shader(color(128)) ); walls[7] = new Wall( -1,0, 1, 90, a,-90,new Shader(color(92)) ); walls[8] = new Wall( -1,0,-1, 90, a, 90,new Shader(color(92)) ); walls[9] = new Wall( -1,-1,0, 90, 90, a,new Shader(color(64)) ); walls[10] = new Wall( -1, 1,0, 90,-90, a,new Shader(color(64)) ); walls[0].makePortal( new Room( true ) ); } //------------ Room(boolean b){ fog = true; fogDistance = 400f; fogColor = color(255,0,0); walls = new Wall[14]; walls[0] = new Wall( -1,0,0, 150, 0, 0, new Shader(color(192)) ); walls[1] = new Wall( 1,0,0, 100, 0, 0, new Shader(color(123)) ); walls[2] = new Wall( 0,-1,0, 100, 100,0,new Shader(color(32)) ); walls[3] = new Wall( 0, 1,0, 100,-100,0,new Shader(color(32)) ); walls[4] = new Wall( 0,0,-1, 100,0, 100,new Shader(color(32)) ); walls[5] = new Wall( 0,0, 1, 100,0,-100,new Shader(color(32)) ); walls[6] = new Wall( 1,0, 1, 110, 0,-90,new Shader(color(32)) ); walls[7] = new Wall( 1,0,-1, 110, 0, 90,new Shader(color(32)) ); walls[8] = new Wall( 1,-1,0, 110, 90, 0,new Shader(color(32)) ); walls[9] = new Wall(1, 1,0, 110,-90, 0 ,new Shader(color(32)) ); walls[10] = new Wall( -1,0, 1, 140, 0,-90,new Shader(color(32)) ); walls[11] = new Wall( -1,0,-1, 140, 0, 90,new Shader(color(32)) ); walls[12] = new Wall( -1,-1,0, 140, 90, 0,new Shader(color(32)) ); walls[13] = new Wall( -1,1,0, 140,-90, 0 ,new Shader(color(32)) ); walls[0].makePortal( new Room( 0f ) ); } //------------ Room(float f){ fog = true; fogDistance = 300f; fogColor = color(192,192,0); float a = -0.2; walls = new Wall[14]; walls[0] = new Wall( -1,0,0, 400, 0, 0, new Shader(color(123)) ); walls[1] = new Wall( 1,0,0, 150, 0, 0, new Shader(color(123)) ); walls[2] = new Wall( 0,-1,0, 150, 100,0,new Shader(color(0,128,0)) ); walls[3] = new Wall( 0, 1,0, 150,-100,0,new Shader(color(0,128,0)) ); walls[4] = new Wall( 0,0,-1, 150,0, 100,new Shader(color(0,255,0)) ); walls[5] = new Wall( 0,0, 1, 150,0,-100,new Shader(color(0,255,0)) ); walls[6] = new Wall( 1,0, 1, 160, a,-90,new Shader(color(92)) ); walls[7] = new Wall( 1,0,-1, 160, a, 90,new Shader(color(92)) ); walls[8] = new Wall( 1,-1,0, 160, 90, a,new Shader(color(64)) ); walls[9] = new Wall( 1, 1,0, 160,-90, a,new Shader(color(64)) ); walls[10] = new Wall( -1,0, 1, 390, a,-90,new Shader(color(192)) ); walls[11] = new Wall( -1,0,-1, 390, a, 90,new Shader(color(192)) ); walls[12] = new Wall( -1,-1,0, 390, 90, a,new Shader(color(128)) ); walls[13] = new Wall( -1,1,0, 390,-90, a,new Shader(color(128)) ); } //------------ color castRay(float px, float py, float pz, float vx, float vy, float vz){ // 't' is the distances to the closest wall along the direction rayVector float t = 100000f; int closestWallIndex = 0; for( int i=0 ; i0f && temp= 0 ) return -1f; // calculates 't' in the equation p+t*v = {a point on the plane through w with normal n} return ( (wx-px)*nx + (wy-py)*ny + (wz-pz)*nz ) / n_dot_v; } } //========================================== class Shader{ color myColor; float r,g,b; //------------ Shader(color c){ myColor = c; r = red(myColor)/255f; g = green(myColor)/255f; b = blue(myColor)/255f; } //------------ // c : camera coordinates // v : ray vector // distance : distance from camera to wall color getColor(float cx, float cy, float cz, float vx, float vy, float vz, float distance){ return myColor; } }