// generate raw patch data from source rib file public static void main(string[] args) { try { Systems.Parser p = new Systems.Parser("gumbo.rib"); int begins = 1; Console.WriteLine("{"); 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); } Console.WriteLine("{"); foreach (float v in patch) Console.WriteLine(" {0},\n", v);//was %g Console.WriteLine("},"); } } else if (p.peekNextToken("Translate")) { Maths.Matrix4 t = Maths.Matrix4.translation(p.getNextFloat(), p.getNextFloat(), p.getNextFloat()); m = m.multiply(t); } else if (p.peekNextToken("Rotate")) { float angle = (float)Maths.MathUtils.toRadians(p.getNextFloat()); Maths.Matrix4 t = Maths.Matrix4.rotate(p.getNextFloat(), p.getNextFloat(), p.getNextFloat(), angle); m = m.multiply(t); } else if (p.peekNextToken("Scale")) { Maths.Matrix4 t = Maths.Matrix4.scale(p.getNextFloat(), p.getNextFloat(), p.getNextFloat()); m = m.multiply(t); } else if (p.peekNextToken("TransformEnd")) { m = Maths.Matrix4.IDENTITY; } else if (p.peekNextToken("AttributeBegin")) { begins++; } else if (p.peekNextToken("AttributeEnd")) { begins--; } else p.getNextToken(); } Console.WriteLine("};"); } catch (Exception e) { Console.WriteLine(e); } }