package org.artisanlogiciel.games; import java.util.Scanner; import java.io.OutputStream; import java.io.IOException; /** Wall3d to create walls in 3d South, West North East... **/ public class Wall3d { // 4 triangles in 2 dim space reused 3 times final static int BASE[][][] = {{{0,0},{1,0},{0,1}},{{1,0},{1,1},{0,1}},{{0,0},{1,0},{1,1}},{{0,0},{1,1},{0,1}}}; final static short X=1; final static short Y=2; final static short Z=4; // final static short AXIS[][]= {{X,Y},{-Z,Y},{X,Y},{Z,Y},{X,-Z},{X,-Z}}; final static short AXIS[][]= {{X,Y,0},{Z,Y,0},{X,Y,1},{Z,Y,1},{X,Z,0},{X,Z,1}}; public final static Wall3d South = new Wall3d(10,1,10,0,0,0); public final static Wall3d West = new Wall3d(1,10,10,0,0,0); public final static Wall3d North = new Wall3d(10,1,10,0,10,0); public final static Wall3d East = new Wall3d(1,10,10,10,0,0); int triangle[][][] = null; public Wall3d(int t[][][]) { triangle = t; } public Wall3d(Wall3d origin, int dx, int dy, int dz) { triangle=origin.translate(dx,dy,dz); } Wall3d(int xl, int yl, int zl, int dx, int dy, int dz) { int f=0; triangle = new int[12][3][3]; int[] factor = {xl,yl,zl}; int[] translate = {dx,dy,dz}; for (int i=0; i < 12; i++) { // point in a triangle for (int p=0; p<3; p++) { short uaxis=0; for (int axis=0; axis <2; axis++) { short caxis = AXIS[i/2][axis]; if ( caxis >0 ) { f=1; } else if ( caxis <0 ) { f=-1; caxis=(short) -caxis; } uaxis|=caxis; if ( caxis == X ) { caxis=0; } else if ( caxis == Y) { caxis=1; } else { caxis=2; } // if ( f == 0 ) // { // System.out.println("ERROR"); // } //System.out.println("i " + i + " p " + p + " a " + caxis + " , " + BASE[i%4][p][axis] ); triangle[i][p][caxis]=translate[caxis] + BASE[i%4][p][axis]*f*factor[caxis]; } if ( (uaxis & X) == 0 ) { uaxis=0; } else if ( (uaxis & Y) == 0) { uaxis=1; } else { uaxis=2; } triangle[i][p][uaxis]=translate[uaxis] + AXIS[i/2][2]*factor[uaxis]; } } } public int[][][] translate(int dx, int dy, int dz) { int[] translate = {dx,dy,dz}; int t[][][] = new int[12][3][3]; for (int i=0; i < 12; i++) { // point in a triangle for (int p=0; p<3; p++) { for (int axis=0; axis <3; axis++) { t[i][p][axis]=translate[axis] + triangle[i][p][axis]; } } } return t; } public String toString() { String s = ""; for (int t=0; t<12; t++) { s+="facet normal 0 0 0\nouter loop\n"; for (int p=0; p<3; p++) { s+="vertex"; for (int a=0; a<3; a++) { // s+=" t "+ t + " p " + p + " a " + a + "=" + triangle[t][p][a]; s+= " " + triangle[t][p][a]; } s+="\n"; } s=s+"endloop\nendfacet\n"; } return s; } public static void prepare() { System.out.println(South.toString()); System.out.println(East.toString()); System.out.println(North.toString()); System.out.println(West.toString()); } public static void streamWallsOut(String name, WallsProvider provider, OutputStream stream) throws IOException { int width = provider.getWidth(); int height = provider.getHeight(); int xl = 10; int yl = 10; int zl = 10; // WARNING DOWN - UP reversed ( in 2D Y is oriented to lower, in 3D it is to upper ). stream.write(("solid " + name + "\n").getBytes()); for (int x=0; x