📄 gumbo.java
字号:
package org.sunflow.core.tesselatable;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.sunflow.math.Matrix4;
import org.sunflow.system.Parser;
import org.sunflow.system.Parser.ParserException;
import org.sunflow.util.FloatArray;
public class Gumbo extends BezierMesh {
// generate raw patch data from source rib file
public static void main(String[] args) {
try {
Parser p;
p = new Parser("gumbo.rib");
int begins = 1;
System.out.println("{");
Matrix4 m = Matrix4.IDENTITY;
p.checkNextToken("AttributeBegin");
while (begins != 0) {
if (p.peekNextToken("Patch")) {
p.checkNextToken("bicubic");
p.checkNextToken("P");
float[] patch = parseFloatArray(p);
if (patch.length == 48) {
// transform patch
for (int i = 0; i < 16; i++) {
float x = patch[3 * i + 0];
float y = patch[3 * i + 1];
float z = patch[3 * i + 2];
patch[3 * i + 0] = m.transformPX(x, y, z);
patch[3 * i + 1] = m.transformPY(x, y, z);
patch[3 * i + 2] = m.transformPZ(x, y, z);
}
System.out.println("{");
for (float v : patch)
System.out.printf(" %g,\n", v);
System.out.println("},");
}
} else if (p.peekNextToken("Translate")) {
Matrix4 t = Matrix4.translation(p.getNextFloat(), p.getNextFloat(), p.getNextFloat());
m = m.multiply(t);
} else if (p.peekNextToken("Rotate")) {
float angle = (float) Math.toRadians(p.getNextFloat());
Matrix4 t = Matrix4.rotate(p.getNextFloat(), p.getNextFloat(), p.getNextFloat(), angle);
m = m.multiply(t);
} else if (p.peekNextToken("Scale")) {
Matrix4 t = Matrix4.scale(p.getNextFloat(), p.getNextFloat(), p.getNextFloat());
m = m.multiply(t);
} else if (p.peekNextToken("TransformEnd")) {
m = Matrix4.IDENTITY;
} else if (p.peekNextToken("AttributeBegin")) {
begins++;
} else if (p.peekNextToken("AttributeEnd")) {
begins--;
} else
p.getNextToken();
}
System.out.println("};");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserException e) {
e.printStackTrace();
}
}
private static float[] parseFloatArray(Parser p) throws IOException {
FloatArray array = new FloatArray();
boolean done = false;
do {
String s = p.getNextToken();
if (s.startsWith("["))
s = s.substring(1);
if (s.endsWith("]")) {
s = s.substring(0, s.length() - 1);
done = true;
}
array.add(Float.parseFloat(s));
} while (!done);
return array.trim();
}
// copy and paste data here
private static final float[][] PATCHES = {
{ 10.0000f, 2.00000f, 0.00000f, 10.0000f, 2.00000f, 0.00000f,
14.0000f, 2.00000f, 0.00000f, 14.0000f, 2.00000f, 0.00000f,
10.0000f, 2.00000f, 0.00000f, 10.2277f, 2.22776f,
-0.911042f, 13.7722f, 2.22776f, -0.911042f, 14.0000f,
2.00000f, 0.00000f, 10.0000f, 6.00000f, 0.00000f, 10.2277f,
5.77223f, -0.911041f, 13.7722f, 5.77224f, -0.911041f,
14.0000f, 6.00000f, 0.00000f, 10.0000f, 6.00000f, 0.00000f,
10.0000f, 6.00000f, 0.00000f, 14.0000f, 6.00000f, 0.00000f,
14.0000f, 6.00000f, 0.00000f, },
{ 10.0000f, 2.00000f, 0.00000f, 10.0000f, 2.00000f, 0.00000f,
10.2483f, 2.08468f, 5.33563f, 10.0000f, 2.00000f, 8.00000f,
10.0000f, 2.00000f, 0.00000f, 10.5077f, 0.457924f,
2.06861f, 11.2875f, 1.04546f, 5.33563f, 11.0392f,
0.960774f, 8.00000f, 14.0000f, 2.00000f, 0.00000f,
13.4933f, 0.456761f, 2.07326f, 12.2875f, 2.17941f,
5.23824f, 12.5766f, 1.37605f, 7.76601f, 14.0000f, 2.00000f,
0.00000f, 14.0000f, 2.00000f, 0.00000f, 13.5399f, 2.92014f,
4.93284f, 14.0000f, 2.00000f, 8.00000f, },
{ 14.0000f, 2.00000f, 0.00000f, 14.0000f, 2.00000f, 0.00000f,
13.5399f, 2.92014f, 4.93284f, 14.0000f, 2.00000f, 8.00000f,
14.0000f, 2.00000f, 0.00000f, 15.5432f, 2.50660f, 2.07326f,
14.6921f, 3.60159f, 4.65188f, 15.8610f, 3.45395f, 6.60420f,
14.0000f, 6.00000f, 0.00000f, 15.5425f, 5.49273f, 2.07061f,
13.5521f, 3.61407f, 5.16626f, 15.0332f, 3.93355f, 6.96677f,
14.0000f, 6.00000f, 0.00000f, 14.0000f, 6.00000f, 0.00000f,
12.5859f, 4.58590f, 5.17181f, 14.0000f, 6.00000f, 8.00000f, },
{ 14.0000f, 6.00000f, 0.00000f, 14.0000f, 6.00000f, 0.00000f,
12.5859f, 4.58590f, 5.17181f, 14.0000f, 6.00000f, 8.00000f,
14.0000f, 6.00000f, 0.00000f, 13.4927f, 7.54257f, 2.07061f,
11.6360f, 5.54118f, 5.17727f, 12.2594f, 6.87025f, 7.12974f,
10.0000f, 6.00000f, 0.00000f, 10.5090f, 7.54076f, 2.06338f,
11.5055f, 6.72455f, 4.92427f, 11.3818f, 7.59478f, 7.30228f,
10.0000f, 6.00000f, 0.00000f, 10.0000f, 6.00000f, 0.00000f,
10.6165f, 5.55161f, 5.03744f, 10.0000f, 6.00000f, 8.00000f, },
{ 10.0000f, 6.00000f, 0.00000f, 10.0000f, 6.00000f, 0.00000f,
10.6165f, 5.55161f, 5.03744f, 10.0000f, 6.00000f, 8.00000f,
10.0000f, 6.00000f, 0.00000f, 8.45923f, 5.49092f, 2.06338f,
9.71866f, 4.36704f, 5.15174f, 8.96952f, 4.43964f, 7.67212f,
10.0000f, 2.00000f, 0.00000f, 8.45792f, 2.50777f, 2.06861f,
9.18040f, 3.15264f, 5.33563f, 8.93204f, 3.06795f, 8.00000f,
10.0000f, 2.00000f, 0.00000f, 10.0000f, 2.00000f, 0.00000f,
10.2483f, 2.08468f, 5.33563f, 10.0000f, 2.00000f, 8.00000f, },
{ 18.0000f, 2.00000f, 0.00000f, 18.0000f, 2.00000f, 0.00000f,
22.0000f, 2.00000f, 0.00000f, 22.0000f, 2.00000f, 0.00000f,
18.0000f, 2.00000f, 0.00000f, 18.2277f, 2.22776f,
-0.911042f, 21.7722f, 2.22776f, -0.911042f, 22.0000f,
2.00000f, 0.00000f, 18.0000f, 6.00000f, 0.00000f, 18.2277f,
5.77224f, -0.911042f, 21.7722f, 5.77223f, -0.911044f,
22.0000f, 6.00000f, 0.00000f, 18.0000f, 6.00000f, 0.00000f,
18.0000f, 6.00000f, 0.00000f, 22.0000f, 6.00000f, 0.00000f,
22.0000f, 6.00000f, 0.00000f, },
{ 18.0000f, 2.00000f, 0.00000f, 18.0000f, 2.00000f, 0.00000f,
18.6124f, 3.22488f, 4.93779f, 18.0000f, 2.00000f, 8.00000f,
18.0000f, 2.00000f, 0.00000f, 18.5064f, 0.456647f,
2.07371f, 19.8347f, 2.44159f, 5.28208f, 19.5248f, 1.39004f,
7.69502f, 22.0000f, 2.00000f, 0.00000f, 21.4928f,
0.457306f, 2.07108f, 21.0113f, 1.23344f, 5.33483f,
20.9582f, 0.958220f, 8.00000f, 22.0000f, 2.00000f,
0.00000f, 22.0000f, 2.00000f, 0.00000f, 22.0531f, 2.27522f,
5.33483f, 22.0000f, 2.00000f, 8.00000f, },
{ 22.0000f, 2.00000f, 0.00000f, 22.0000f, 2.00000f, 0.00000f,
22.0531f, 2.27522f, 5.33483f, 22.0000f, 2.00000f, 8.00000f,
22.0000f, 2.00000f, 0.00000f, 23.5426f, 2.50715f, 2.07108f,
23.1026f, 3.32477f, 5.33483f, 23.0495f, 3.04954f, 8.00000f,
22.0000f, 6.00000f, 0.00000f, 23.5427f, 5.49294f, 2.07146f,
22.2045f, 4.41977f, 5.20618f, 22.8434f, 4.43176f, 7.78914f,
22.0000f, 6.00000f, 0.00000f, 22.0000f, 6.00000f, 0.00000f,
21.4391f, 5.67950f, 5.02396f, 22.0000f, 6.00000f, 8.00000f, },
{ 22.0000f, 6.00000f, 0.00000f, 22.0000f, 6.00000f, 0.00000f,
21.4391f, 5.67950f, 5.02396f, 22.0000f, 6.00000f, 8.00000f,
22.0000f, 6.00000f, 0.00000f, 21.4929f, 7.54278f, 2.07146f,
20.6640f, 6.95514f, 4.83944f, 20.8048f, 7.75546f, 7.23198f,
18.0000f, 6.00000f, 0.00000f, 18.5072f, 7.54257f, 2.07061f,
20.3933f, 5.55591f, 5.16253f, 19.7699f, 6.88498f, 7.11501f,
18.0000f, 6.00000f, 0.00000f, 18.0000f, 6.00000f, 0.00000f,
19.4157f, 4.58430f, 5.16861f, 18.0000f, 6.00000f, 8.00000f, },
{ 18.0000f, 6.00000f, 0.00000f, 18.0000f, 6.00000f, 0.00000f,
19.4157f, 4.58430f, 5.16861f, 18.0000f, 6.00000f, 8.00000f,
18.0000f, 6.00000f, 0.00000f, 16.4574f, 5.49273f, 2.07061f,
18.4561f, 3.63070f, 5.17458f, 16.9751f, 3.95019f, 6.97509f,
18.0000f, 2.00000f, 0.00000f, 16.4566f, 2.50649f, 2.07371f,
17.5879f, 3.88144f, 4.64919f, 16.4270f, 3.57293f, 6.42706f,
18.0000f, 2.00000f, 0.00000f, 18.0000f, 2.00000f, 0.00000f,
18.6124f, 3.22488f, 4.93779f, 18.0000f, 2.00000f, 8.00000f, },
{ 18.0000f, 8.00000f, 0.00000f, 18.0000f, 8.00000f, 0.00000f,
22.0000f, 8.00000f, 0.00000f, 22.0000f, 8.00000f, 0.00000f,
18.0000f, 8.00000f, 0.00000f, 18.2277f, 8.22776f,
-0.911043f, 21.7722f, 8.22775f, -0.911043f, 22.0000f,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -