import processing.opengl.*; /**

Creative Commons License
This work is licensed under a Creative Commons
Attribution-Share Alike 3.0 United States License.

*/ MyPatch[] patches; String ex1 = "2\n 0.00 0.00 0.00 0.33 0.00 0.00 0.66 0.00 0.00 1.00 0.00 0.00\n 0.00 0.33 0.00 0.33 0.33 0.00 0.66 0.33 0.00 1.00 0.33 0.00\n 0.00 0.66 0.00 0.33 0.66 0.00 0.66 0.66 0.00 1.00 0.66 0.00\n 0.00 1.00 0.00 0.33 1.00 0.00 0.66 1.00 0.00 1.00 1.00 0.00\n\n 0.00 0.00 0.00 0.33 0.00 2.00 0.66 0.00 2.00 1.00 0.00 0.00\n 0.00 0.33 0.00 0.33 0.33 2.00 0.66 0.33 2.00 1.00 0.33 0.00\n 0.00 0.66 0.00 0.33 0.66 2.00 0.66 0.66 2.00 1.00 0.66 0.00\n 0.00 1.00 0.00 0.33 1.00 2.00 0.66 1.00 2.00 1.00 1.00 0.00"; String ex2 = "32\n1.400 0.000 2.400 1.400 -0.784 2.400 0.784 -1.400 2.400 0.000 -1.400 2.400 \n1.337 0.000 2.531 1.337 -0.749 2.531 0.749 -1.337 2.531 0.000 -1.337 2.531 \n1.438 0.000 2.531 1.438 -0.805 2.531 0.805 -1.438 2.531 0.000 -1.438 2.531 \n1.500 0.000 2.400 1.500 -0.840 2.400 0.840 -1.500 2.400 0.000 -1.500 2.400 \n\n0.000 -1.400 2.400 -0.784 -1.400 2.400 -1.400 -0.784 2.400 -1.400 0.000 2.400 \n0.000 -1.337 2.531 -0.749 -1.337 2.531 -1.337 -0.749 2.531 -1.337 0.000 2.531 \n0.000 -1.438 2.531 -0.805 -1.438 2.531 -1.438 -0.805 2.531 -1.438 0.000 2.531 \n0.000 -1.500 2.400 -0.840 -1.500 2.400 -1.500 -0.840 2.400 -1.500 0.000 2.400 \n\n-1.400 0.000 2.400 -1.400 0.784 2.400 -0.784 1.400 2.400 0.000 1.400 2.400 \n-1.337 0.000 2.531 -1.337 0.749 2.531 -0.749 1.337 2.531 0.000 1.337 2.531 \n-1.438 0.000 2.531 -1.438 0.805 2.531 -0.805 1.438 2.531 0.000 1.438 2.531 \n-1.500 0.000 2.400 -1.500 0.840 2.400 -0.840 1.500 2.400 0.000 1.500 2.400 \n\n0.000 1.400 2.400 0.784 1.400 2.400 1.400 0.784 2.400 1.400 0.000 2.400 \n0.000 1.337 2.531 0.749 1.337 2.531 1.337 0.749 2.531 1.337 0.000 2.531 \n0.000 1.438 2.531 0.805 1.438 2.531 1.438 0.805 2.531 1.438 0.000 2.531 \n0.000 1.500 2.400 0.840 1.500 2.400 1.500 0.840 2.400 1.500 0.000 2.400 \n\n1.500 0.000 2.400 1.500 -0.840 2.400 0.840 -1.500 2.400 0.000 -1.500 2.400 \n1.750 0.000 1.875 1.750 -0.980 1.875 0.980 -1.750 1.875 0.000 -1.750 1.875 \n2.000 0.000 1.350 2.000 -1.120 1.350 1.120 -2.000 1.350 0.000 -2.000 1.350 \n2.000 0.000 0.900 2.000 -1.120 0.900 1.120 -2.000 0.900 0.000 -2.000 0.900 \n\n0.000 -1.500 2.400 -0.840 -1.500 2.400 -1.500 -0.840 2.400 -1.500 0.000 2.400 \n0.000 -1.750 1.875 -0.980 -1.750 1.875 -1.750 -0.980 1.875 -1.750 0.000 1.875 \n0.000 -2.000 1.350 -1.120 -2.000 1.350 -2.000 -1.120 1.350 -2.000 0.000 1.350 \n0.000 -2.000 0.900 -1.120 -2.000 0.900 -2.000 -1.120 0.900 -2.000 0.000 0.900 \n\n-1.500 0.000 2.400 -1.500 0.840 2.400 -0.840 1.500 2.400 0.000 1.500 2.400 \n-1.750 0.000 1.875 -1.750 0.980 1.875 -0.980 1.750 1.875 0.000 1.750 1.875 \n-2.000 0.000 1.350 -2.000 1.120 1.350 -1.120 2.000 1.350 0.000 2.000 1.350 \n-2.000 0.000 0.900 -2.000 1.120 0.900 -1.120 2.000 0.900 0.000 2.000 0.900 \n\n0.000 1.500 2.400 0.840 1.500 2.400 1.500 0.840 2.400 1.500 0.000 2.400 \n0.000 1.750 1.875 0.980 1.750 1.875 1.750 0.980 1.875 1.750 0.000 1.875 \n0.000 2.000 1.350 1.120 2.000 1.350 2.000 1.120 1.350 2.000 0.000 1.350 \n0.000 2.000 0.900 1.120 2.000 0.900 2.000 1.120 0.900 2.000 0.000 0.900 \n\n2.000 0.000 0.900 2.000 -1.120 0.900 1.120 -2.000 0.900 0.000 -2.000 0.900 \n2.000 0.000 0.450 2.000 -1.120 0.450 1.120 -2.000 0.450 0.000 -2.000 0.450 \n1.500 0.000 0.225 1.500 -0.840 0.225 0.840 -1.500 0.225 0.000 -1.500 0.225 \n1.500 0.000 0.150 1.500 -0.840 0.150 0.840 -1.500 0.150 0.000 -1.500 0.150 \n\n0.000 -2.000 0.900 -1.120 -2.000 0.900 -2.000 -1.120 0.900 -2.000 0.000 0.900 \n0.000 -2.000 0.450 -1.120 -2.000 0.450 -2.000 -1.120 0.450 -2.000 0.000 0.450 \n0.000 -1.500 0.225 -0.840 -1.500 0.225 -1.500 -0.840 0.225 -1.500 0.000 0.225 \n0.000 -1.500 0.150 -0.840 -1.500 0.150 -1.500 -0.840 0.150 -1.500 0.000 0.150 \n\n-2.000 0.000 0.900 -2.000 1.120 0.900 -1.120 2.000 0.900 0.000 2.000 0.900 \n-2.000 0.000 0.450 -2.000 1.120 0.450 -1.120 2.000 0.450 0.000 2.000 0.450 \n-1.500 0.000 0.225 -1.500 0.840 0.225 -0.840 1.500 0.225 0.000 1.500 0.225 \n-1.500 0.000 0.150 -1.500 0.840 0.150 -0.840 1.500 0.150 0.000 1.500 0.150 \n\n0.000 2.000 0.900 1.120 2.000 0.900 2.000 1.120 0.900 2.000 0.000 0.900 \n0.000 2.000 0.450 1.120 2.000 0.450 2.000 1.120 0.450 2.000 0.000 0.450 \n0.000 1.500 0.225 0.840 1.500 0.225 1.500 0.840 0.225 1.500 0.000 0.225 \n0.000 1.500 0.150 0.840 1.500 0.150 1.500 0.840 0.150 1.500 0.000 0.150 \n\n-1.600 0.000 2.025 -1.600 -0.300 2.025 -1.500 -0.300 2.250 -1.500 0.000 2.250 \n-2.300 0.000 2.025 -2.300 -0.300 2.025 -2.500 -0.300 2.250 -2.500 0.000 2.250 \n-2.700 0.000 2.025 -2.700 -0.300 2.025 -3.000 -0.300 2.250 -3.000 0.000 2.250 \n-2.700 0.000 1.800 -2.700 -0.300 1.800 -3.000 -0.300 1.800 -3.000 0.000 1.800 \n\n-1.500 0.000 2.250 -1.500 0.300 2.250 -1.600 0.300 2.025 -1.600 0.000 2.025 \n-2.500 0.000 2.250 -2.500 0.300 2.250 -2.300 0.300 2.025 -2.300 0.000 2.025 \n-3.000 0.000 2.250 -3.000 0.300 2.250 -2.700 0.300 2.025 -2.700 0.000 2.025 \n-3.000 0.000 1.800 -3.000 0.300 1.800 -2.700 0.300 1.800 -2.700 0.000 1.800 \n\n-2.700 0.000 1.800 -2.700 -0.300 1.800 -3.000 -0.300 1.800 -3.000 0.000 1.800 \n-2.700 0.000 1.575 -2.700 -0.300 1.575 -3.000 -0.300 1.350 -3.000 0.000 1.350 \n-2.500 0.000 1.125 -2.500 -0.300 1.125 -2.650 -0.300 0.938 -2.650 0.000 0.938 \n-2.000 0.000 0.900 -2.000 -0.300 0.900 -1.900 -0.300 0.600 -1.900 0.000 0.600 \n\n-3.000 0.000 1.800 -3.000 0.300 1.800 -2.700 0.300 1.800 -2.700 0.000 1.800 \n-3.000 0.000 1.350 -3.000 0.300 1.350 -2.700 0.300 1.575 -2.700 0.000 1.575 \n-2.650 0.000 0.938 -2.650 0.300 0.938 -2.500 0.300 1.125 -2.500 0.000 1.125 \n-1.900 0.000 0.600 -1.900 0.300 0.600 -2.000 0.300 0.900 -2.000 0.000 0.900 \n\n1.700 0.000 1.425 1.700 -0.660 1.425 1.700 -0.660 0.600 1.700 0.000 0.600 \n2.600 0.000 1.425 2.600 -0.660 1.425 3.100 -0.660 0.825 3.100 0.000 0.825 \n2.300 0.000 2.100 2.300 -0.250 2.100 2.400 -0.250 2.025 2.400 0.000 2.025 \n2.700 0.000 2.400 2.700 -0.250 2.400 3.300 -0.250 2.400 3.300 0.000 2.400 \n\n1.700 0.000 0.600 1.700 0.660 0.600 1.700 0.660 1.425 1.700 0.000 1.425 \n3.100 0.000 0.825 3.100 0.660 0.825 2.600 0.660 1.425 2.600 0.000 1.425 \n2.400 0.000 2.025 2.400 0.250 2.025 2.300 0.250 2.100 2.300 0.000 2.100 \n3.300 0.000 2.400 3.300 0.250 2.400 2.700 0.250 2.400 2.700 0.000 2.400 \n\n2.700 0.000 2.400 2.700 -0.250 2.400 3.300 -0.250 2.400 3.300 0.000 2.400 \n2.800 0.000 2.475 2.800 -0.250 2.475 3.525 -0.250 2.494 3.525 0.000 2.494 \n2.900 0.000 2.475 2.900 -0.150 2.475 3.450 -0.150 2.513 3.450 0.000 2.513 \n2.800 0.000 2.400 2.800 -0.150 2.400 3.200 -0.150 2.400 3.200 0.000 2.400 \n\n3.300 0.000 2.400 3.300 0.250 2.400 2.700 0.250 2.400 2.700 0.000 2.400 \n3.525 0.000 2.494 3.525 0.250 2.494 2.800 0.250 2.475 2.800 0.000 2.475 \n3.450 0.000 2.513 3.450 0.150 2.513 2.900 0.150 2.475 2.900 0.000 2.475 \n3.200 0.000 2.400 3.200 0.150 2.400 2.800 0.150 2.400 2.800 0.000 2.400 \n\n0.000 0.000 3.150 0.000 0.000 3.150 0.000 0.000 3.150 0.000 0.000 3.150 \n0.800 0.000 3.150 0.800 -0.450 3.150 0.450 -0.800 3.150 0.000 -0.800 3.150 \n0.000 0.000 2.850 0.000 0.000 2.850 0.000 0.000 2.850 0.000 0.000 2.850 \n0.200 0.000 2.700 0.200 -0.112 2.700 0.112 -0.200 2.700 0.000 -0.200 2.700 \n\n0.000 0.000 3.150 0.000 0.000 3.150 0.000 0.000 3.150 0.000 0.000 3.150 \n0.000 -0.800 3.150 -0.450 -0.800 3.150 -0.800 -0.450 3.150 -0.800 0.000 3.150 \n0.000 0.000 2.850 0.000 0.000 2.850 0.000 0.000 2.850 0.000 0.000 2.850 \n0.000 -0.200 2.700 -0.112 -0.200 2.700 -0.200 -0.112 2.700 -0.200 0.000 2.700 \n\n0.000 0.000 3.150 0.000 0.000 3.150 0.000 0.000 3.150 0.000 0.000 3.150 \n-0.800 0.000 3.150 -0.800 0.450 3.150 -0.450 0.800 3.150 0.000 0.800 3.150 \n0.000 0.000 2.850 0.000 0.000 2.850 0.000 0.000 2.850 0.000 0.000 2.850 \n-0.200 0.000 2.700 -0.200 0.112 2.700 -0.112 0.200 2.700 0.000 0.200 2.700 \n\n0.000 0.000 3.150 0.000 0.000 3.150 0.000 0.000 3.150 0.000 0.000 3.150 \n0.000 0.800 3.150 0.450 0.800 3.150 0.800 0.450 3.150 0.800 0.000 3.150 \n0.000 0.000 2.850 0.000 0.000 2.850 0.000 0.000 2.850 0.000 0.000 2.850 \n0.000 0.200 2.700 0.112 0.200 2.700 0.200 0.112 2.700 0.200 0.000 2.700 \n\n0.200 0.000 2.700 0.200 -0.112 2.700 0.112 -0.200 2.700 0.000 -0.200 2.700 \n0.400 0.000 2.550 0.400 -0.224 2.550 0.224 -0.400 2.550 0.000 -0.400 2.550 \n1.300 0.000 2.550 1.300 -0.728 2.550 0.728 -1.300 2.550 0.000 -1.300 2.550 \n1.300 0.000 2.400 1.300 -0.728 2.400 0.728 -1.300 2.400 0.000 -1.300 2.400 \n\n0.000 -0.200 2.700 -0.112 -0.200 2.700 -0.200 -0.112 2.700 -0.200 0.000 2.700 \n0.000 -0.400 2.550 -0.224 -0.400 2.550 -0.400 -0.224 2.550 -0.400 0.000 2.550 \n0.000 -1.300 2.550 -0.728 -1.300 2.550 -1.300 -0.728 2.550 -1.300 0.000 2.550 \n0.000 -1.300 2.400 -0.728 -1.300 2.400 -1.300 -0.728 2.400 -1.300 0.000 2.400 \n\n-0.200 0.000 2.700 -0.200 0.112 2.700 -0.112 0.200 2.700 0.000 0.200 2.700 \n-0.400 0.000 2.550 -0.400 0.224 2.550 -0.224 0.400 2.550 0.000 0.400 2.550 \n-1.300 0.000 2.550 -1.300 0.728 2.550 -0.728 1.300 2.550 0.000 1.300 2.550 \n-1.300 0.000 2.400 -1.300 0.728 2.400 -0.728 1.300 2.400 0.000 1.300 2.400 \n\n0.000 0.200 2.700 0.112 0.200 2.700 0.200 0.112 2.700 0.200 0.000 2.700 \n0.000 0.400 2.550 0.224 0.400 2.550 0.400 0.224 2.550 0.400 0.000 2.550 \n0.000 1.300 2.550 0.728 1.300 2.550 1.300 0.728 2.550 1.300 0.000 2.550 \n0.000 1.300 2.400 0.728 1.300 2.400 1.300 0.728 2.400 1.300 0.000 2.400 \n\n0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 \n1.425 0.000 0.000 1.425 0.798 0.000 0.798 1.425 0.000 0.000 1.425 0.000 \n1.500 0.000 0.075 1.500 0.840 0.075 0.840 1.500 0.075 0.000 1.500 0.075 \n1.500 0.000 0.150 1.500 0.840 0.150 0.840 1.500 0.150 0.000 1.500 0.150 \n\n0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 \n0.000 1.425 0.000 -0.798 1.425 0.000 -1.425 0.798 0.000 -1.425 0.000 0.000 \n0.000 1.500 0.075 -0.840 1.500 0.075 -1.500 0.840 0.075 -1.500 0.000 0.075 \n0.000 1.500 0.150 -0.840 1.500 0.150 -1.500 0.840 0.150 -1.500 0.000 0.150 \n\n0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 \n-1.425 0.000 0.000 -1.425 -0.798 0.000 -0.798 -1.425 0.000 0.000 -1.425 0.000 \n-1.500 0.000 0.075 -1.500 -0.840 0.075 -0.840 -1.500 0.075 0.000 -1.500 0.075 \n-1.500 0.000 0.150 -1.500 -0.840 0.150 -0.840 -1.500 0.150 0.000 -1.500 0.150 \n\n0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 \n0.000 -1.425 0.000 0.798 -1.425 0.000 1.425 -0.798 0.000 1.425 0.000 0.000 \n0.000 -1.500 0.075 0.840 -1.500 0.075 1.500 -0.840 0.075 1.500 0.000 0.075 \n0.000 -1.500 0.150 0.840 -1.500 0.150 1.500 -0.840 0.150 1.500 0.000 0.150 "; class MyPoint { public float x; public float y; public float z; MyPoint() {} MyPoint(float x, float y, float z) {this.x=x; this.y=y; this.z=z;} MyPoint(String d) { String[] p = split(d, ","); x = int(p[0].substring(1)); y = int(p[1]); z = int(p[2].substring(0,p[2].length()-1)); } public String toString() { return "(" + x + "," + y + "," + z + ")"; } } class MyPatch { MyPoint[][] P = new MyPoint[4][4]; color myColor; MyPoint[][] bezPoints; MyPatch() { for (int i=0; i<4; i++) { for (int j=0; j<4; j++) { P[i][j] = new MyPoint(); } } myColor = color(random(200),random(200),random(200)); } MyPatch(String data) { String[] el = splitTokens(data); int dCount = 0; for (int i=0; i<4; i++) { for (int j=0; j<4; j++) { P[i][j] = new MyPoint(float(el[dCount]), float(el[dCount+1]), float(el[dCount+2])); dCount = dCount + 3; } } myColor = color(random(200),random(200),random(200)); } public void draw() { pushMatrix(); translate(170, 230, -150); int sc = (int) map(mouseY, 0, height, 30, 100); scale(sc, sc, sc); rotateX(PI/4); rotateY(PI/8); //rotateX(map(mouseX, 0, width, 0, PI)); //rotateY(map(mouseY, 0, width, 0, PI)); rotateZ(map(mouseX, 0, height, 0, -2*PI)); MyPoint p; for (int i = 0; i < bezPoints.length-1; i++) { for (int j = 0; j < bezPoints[i].length-1; j++) { stroke(myColor); fill(myColor); beginShape(TRIANGLES); vertex(bezPoints[i][j].x, bezPoints[i][j].y, bezPoints[i][j].z); vertex(bezPoints[i+1][j].x, bezPoints[i+1][j].y, bezPoints[i+1][j].z); vertex(bezPoints[i+1][j+1].x, bezPoints[i+1][j+1].y, bezPoints[i+1][j+1].z); endShape(); beginShape(TRIANGLES); vertex(bezPoints[i][j].x, bezPoints[i][j].y, bezPoints[i][j].z); vertex(bezPoints[i][j+1].x, bezPoints[i][j+1].y, bezPoints[i][j+1].z); vertex(bezPoints[i+1][j+1].x, bezPoints[i+1][j+1].y, bezPoints[i+1][j+1].z); endShape(); } } popMatrix(); } public MyPoint interpolatePatch(float u, float v) { MyPoint[] vcurve = new MyPoint[4]; vcurve[0] = interpolateCurve(P[0][0], P[0][1], P[0][2], P[0][3], u); vcurve[1] = interpolateCurve(P[1][0], P[1][1], P[1][2], P[1][3], u); vcurve[2] = interpolateCurve(P[2][0], P[2][1], P[2][2], P[2][3], u); vcurve[3] = interpolateCurve(P[3][0], P[3][1], P[3][2], P[3][3], u); MyPoint[] ucurve = new MyPoint[4]; ucurve[0] = interpolateCurve(P[0][0], P[1][0], P[2][0], P[3][0], v); ucurve[1] = interpolateCurve(P[0][1], P[1][1], P[2][1], P[3][1], v); ucurve[2] = interpolateCurve(P[0][2], P[1][2], P[2][2], P[3][2], v); ucurve[3] = interpolateCurve(P[0][3], P[1][3], P[2][3], P[3][3], v); MyPoint p; p = interpolateCurve(vcurve[0], vcurve[1], vcurve[2], vcurve[3], v); return p; } private MyPoint interpolateCurve(MyPoint p0, MyPoint p1, MyPoint p2, MyPoint p3, float t) { MyPoint p = new MyPoint(); p.x = p0.x*pow((1-t),3) + p1.x*3*t*pow((1-t),2) + p2.x*3*pow(t,2)*(1-t) + p3.x*pow(t,3); p.y = p0.y*pow((1-t),3) + p1.y*3*t*pow((1-t),2) + p2.y*3*pow(t,2)*(1-t) + p3.y*pow(t,3); p.z = p0.z*pow((1-t),3) + p1.z*3*t*pow((1-t),2) + p2.z*3*pow(t,2)*(1-t) + p3.z*pow(t,3); return p; } private void subdividepatch(float step) { bezPoints = new MyPoint[ceil(1.0/step) +1][ceil(1.0/step) +1]; int i=0,j; for (float u=0; u<1+step; u+=step) { if (u>1) u=1; j=0; for (float v=0; v<1+step; v+=step) { if (v>1) v=1; bezPoints[i][j] = interpolatePatch(u,v); j++; } i++; } } } void setup() { size(400, 400, P3D); frameRate(24); background(255); //String lines[] = loadStrings("teapot.bez"); //String data = join(lines, "\n"); //readPatchesFromString(data); readPatchesFromString(ex2); for (int i=0; i < patches.length; i++) { patches[i].subdividepatch(0.1); } } void draw() { background(255); for (int i=0; i < patches.length; i++) { patches[i].draw(); } } //void mouseMoved() { redraw(); } void readPatchesFromString(String data) { String[] el = split(data, "\n"); int total = int(el[0]); println("Reading in " + total + " patches."); patches = new MyPatch[total]; String[] patchesS = split(data.substring(data.indexOf('\n')), "\n\n"); println("We have " + patchesS.length + " patches"); println(patchesS); for (int i = 0; i < total; i++) { patches[i] = new MyPatch(patchesS[i]); } }