public void init(string name, SunflowAPI api) { // register this object with the api properly api.geometry(name, this); api.shader(name + ".shader", this); api.parameter("shaders", name + ".shader"); api.instance(name + ".instance", name); api.light(name + ".light", this); }
public void init(string name, SunflowAPI api) { api.light(name, this); api.geometry(name + ".geo", new Sphere()); api.shader(name + ".shader", this); api.parameter("shaders", name + ".shader"); api.parameter("transform", Matrix4.translation(center.x, center.y, center.z).multiply(Matrix4.scale(radius))); api.instance(name + ".instance", name + ".geo"); }
public void init(string name, SunflowAPI api) { api.geometry(name, this); api.shader(name + ".shader", this); api.parameter("shaders", name + ".shader"); api.instance(name + ".instance", name); for (int i = 0, j = 0; i < triangles.Length; i += 3, j++) { TriangleLight t = new TriangleLight(j, this); string lname = string.Format("%s.light[%d]", name, j); api.light(lname, t); } }
public void init(string name, SunflowAPI api) { // register this object with the api properly api.geometry(name, this); if (api.lookupGeometry(name) == null) { // quit if we don't see our geometry in here (error message // will have already been printed) return; } api.shader(name + ".shader", this); api.parameter("shaders", name + ".shader"); api.instance(name + ".instance", name); api.light(name + ".light", this); }
public void AddNewObject(SunflowAPI sunflow, Parameters currentParameters) { // transformation we want is local, so scale, rotate then translate Matrix4 t = Matrix4.translation(currentParameters.position.x, currentParameters.position.y, currentParameters.position.z) .multiply(getRotationMatrix(currentParameters) .multiply(Matrix4.scale(currentParameters.localScale.x, currentParameters.localScale.y, currentParameters.localScale.z) ) ); sunflow.geometry(currentParameters.primitiveType + currentParameters.objectCount, currentParameters.primitiveType); sunflow.parameter("transform", t); sunflow.parameter("shaders", "sps"); sunflow.instance(currentParameters.primitiveType + currentParameters.objectCount + ".instance", currentParameters.primitiveType + currentParameters.objectCount); }
public void RunSimulation() { CollisionSystem collision = new CollisionSystemSAP(); JitterWorld world = new JitterWorld(collision); world.Gravity = new JVector(0, -10, -0); Shape shape = new BoxShape(20.0f, 1.0f, 20.0f); RigidBody floor = new RigidBody(shape); floor.IsStatic = true; floor.Position = new JVector(0.0f, -15.0f, 0.0f); shape = new SphereShape(0.5f); RigidBody body = new RigidBody(shape); body.Position = new JVector(0.0f, 3.0f, 0.0f); body.Material.Restitution = 0.8f; world.AddBody(floor); world.AddBody(body); for (int i = 0; i < 600; i++) { world.Step(1.0f / 30.0f, true); SunflowAPI sunflow = new SunflowAPI(); SetupSunflow(sunflow); sunflow.geometry("sphere", "sphere"); //Instancing the big metal sphere. JVector v = body.Position; sunflow.parameter("transform", Matrix4.translation(v.X, v.Y, v.Z).multiply(Matrix4.scale(1))); sunflow.parameter("shaders", "metal"); sunflow.instance("sphere.instance", "sphere"); sunflow.render(SunflowAPI.DEFAULT_OPTIONS, new FileDisplay("spherecube" + i + ".png")); // do other stuff, like drawing } }
public override bool parse(Stream stream, SunflowAPI api) { try { SunflowSharp.Systems.Parser p = new SunflowSharp.Systems.Parser(stream); p.checkNextToken("version"); p.checkNextToken("3.04"); p.checkNextToken("TransformBegin"); if (p.peekNextToken("Procedural")) { // read procedural shave rib bool done1 = false; while (!done1) { p.checkNextToken("DelayedReadArchive"); p.checkNextToken("["); string f = p.getNextToken(); UI.printInfo(UI.Module.USER, "RIB - Reading voxel: \"{0}\" ...", f); api.include(f); p.checkNextToken("]"); while (true) { string t = p.getNextToken(); if (t == null || t == "TransformEnd") { done1 = true; break; } else if (t == "Procedural") break; } } return true; } bool cubic = false; if (p.peekNextToken("Basis")) { cubic = true; // u basis p.checkNextToken("catmull-rom"); p.checkNextToken("1"); // v basis p.checkNextToken("catmull-rom"); p.checkNextToken("1"); } while (p.peekNextToken("Declare")) { p.getNextToken(); // name p.getNextToken(); // interpolation & type } int index = 0; bool done = false; p.checkNextToken("Curves"); do { if (cubic) p.checkNextToken("cubic"); else p.checkNextToken("linear"); int[] nverts = parseIntArray(p); for (int i = 1; i < nverts.Length; i++) { if (nverts[0] != nverts[i]) { UI.printError(UI.Module.USER, "RIB - Found variable number of hair segments"); return false; } } int nhairs = nverts.Length; UI.printInfo(UI.Module.USER, "RIB - Parsed {0} hair curves", nhairs); api.parameter("segments", nverts[0] - 1); p.checkNextToken("nonperiodic"); p.checkNextToken("P"); float[] points = parseFloatArray(p); if (points.Length != 3 * nhairs * nverts[0]) { UI.printError(UI.Module.USER, "RIB - Invalid number of points - expecting {0} - found {0}", nhairs * nverts[0], points.Length / 3); return false; } api.parameter("points", "point", "vertex", points); UI.printInfo(UI.Module.USER, "RIB - Parsed {0} hair vertices", points.Length / 3); p.checkNextToken("width"); float[] w = parseFloatArray(p); if (w.Length != nhairs * nverts[0]) { UI.printError(UI.Module.USER, "RIB - Invalid number of hair widths - expecting {0} - found {0}", nhairs * nverts[0], w.Length); return false; } api.parameter("widths", "float", "vertex", w); UI.printInfo(UI.Module.USER, "RIB - Parsed {0} hair widths", w.Length); string name = string.Format("{0}[{1}]", "[Stream]", index); UI.printInfo(UI.Module.USER, "RIB - Creating hair object \"{0}\"", name); api.geometry(name, "hair"); api.instance(name + ".instance", name); UI.printInfo(UI.Module.USER, "RIB - Searching for next curve group ..."); while (true) { string t = p.getNextToken(); if (t == null || t == "TransformEnd") { done = true; break; } else if (t == "Curves") break; } index++; } while (!done); UI.printInfo(UI.Module.USER, "RIB - Finished reading rib file"); } catch (Exception e) { UI.printError(UI.Module.USER, "RIB - File not found: {0}", "[Stream]"); return false; } return true; }
public void SetupSunflow(SunflowAPI a) { a.parameter("threads", Environment.ProcessorCount); // parameter ("threads", 1); a.options(SunflowAPI.DEFAULT_OPTIONS); //The render's resolution. 1920 by 1080 is full HD. int resolutionX = 3840; int resolutionY = 1920; // resolutionX = 1920; // resolutionY = 1920; resolutionX = 384 * 4; resolutionY = 192 * 4; // int resolutionX = 3840; // int resolutionY = 960; a.parameter("resolutionX", resolutionX); a.parameter("resolutionY", resolutionY); //The anti-aliasing. Negative is subsampling and positive is supersampling. a.parameter("aa.min", 1); a.parameter("aa.max", 2); //Number of samples. a.parameter("aa.samples", 1); //The contrast needed to increase anti-aliasing. a.parameter("aa.contrast", .016f); //Subpixel jitter. a.parameter("aa.jitter", true); //The filter. a.parameter("filter", "mitchell"); a.options(SunflowAPI.DEFAULT_OPTIONS); // Point3 eye = new Point3(7.0f, -7.0f, -7.0f); // Point3 target = new Point3(0.0f, -7.0f, 0.0f); Point3 target = new Point3(7.0f, -7.0f, -7.0f); Point3 eye = new Point3(-6.0f, -10.0f, 2.0f); Vector3 up = new Vector3(0, 1, 0); a.parameter("transform", Matrix4.lookAt(eye, target, up)); String name = "Camera"; /* thinlens camera */ /* * //Aspect Ratio. * float aspect = ((float)resolutionX) / ((float)resolutionY); * a.parameter("aspect", aspect); * a.camera(name, "thinlens"); */ /* 360 3D VR camera */ /* * * a.parameter("lens.eyegap", 0.5f); * // a.camera(name, "spherical3d"); * * a.camera(name, "spherical1803d"); * * */ a.parameter("lens.eyegap", 0.1f); a.camera(name, "vr180fisheye"); a.parameter("camera", name); a.options(SunflowAPI.DEFAULT_OPTIONS); //Trace depths. Higher numbers look better. a.parameter("depths.diffuse", 3); a.parameter("depths.reflection", 2); a.parameter("depths.refraction", 2); a.options(SunflowAPI.DEFAULT_OPTIONS); //Setting up the shader for the ground. a.parameter("diffuse", null, 0.4f, 0.4f, 0.4f); a.parameter("shiny", .1f); a.shader("ground", "shiny_diffuse"); a.options(SunflowAPI.DEFAULT_OPTIONS); //Setting up the shader for the big metal sphere. a.parameter("diffuse", null, 0.3f, 0.3f, 0.3f); a.parameter("shiny", .95f); a.shader("metal", "shiny_diffuse"); a.options(SunflowAPI.DEFAULT_OPTIONS); //Setting up the shader for the cube of spheres. a.parameter("diffuse", null, 1.0f, 0.0f, 0.0f); a.shader("sps", "diffuse"); a.options(SunflowAPI.DEFAULT_OPTIONS); //Instancing the floor. a.parameter("center", new Point3(0, -14.2f, 0)); a.parameter("normal", new Vector3(0, 1, 0)); a.geometry("floor", "plane"); a.parameter("shaders", "ground"); a.instance("FloorInstance", "floor"); a.options(SunflowAPI.DEFAULT_OPTIONS); //Creating the lighting system with the sun and sky. a.parameter("up", new Vector3(0, 1, 0)); a.parameter("east", new Vector3(1, 0, 0)); // double sunRad = (Math.PI * 1.05); // a.parameter("sundir", new Vector3((float)Math.Cos(sunRad), (float)Math.Sin(sunRad), (float)(.5 * Math.Sin(sunRad))).normalize()); a.parameter("sundir", new Vector3(0.8f, 0.8f, 0.5f).normalize()); a.parameter("turbidity", 4f); a.parameter("samples", 128); a.light("sunsky", "sunsky"); a.options(SunflowAPI.DEFAULT_OPTIONS); }
public void Run(string[] args) { // Use this for initialization LParser lparser = new LParser(); System.String[] rules = new System.String[9]; /* * rules[0] = "#define a 1"; * rules[1] = "#thickness 0.2"; * rules[2] = "#recursion 4"; * rules[3] = "#angle 22.5"; * rules[4] = @"#axiom ++++F"; * * // rules[5] = "X -> F-[[X]+X]+F[+FX]-X"; * rules[5] = @"F -> FF-[-F+F+F]+[+F-F-F]"; * rules[5] = @"F -> FF&[&F^F^F]^[^F&F&F]"; * rules[6] = @"Y -> F-F"; * */ rules[0] = "#define p 3.14"; rules[1] = "#thickness 0.2"; rules[2] = "#recursion 3"; rules[3] = "#angle 90"; rules[4] = "#axiom A"; rules[5] = "A -> B-F+CFC+F-D&F^D-F+&&CFC+F+B//"; rules[6] = "B -> A&F^CFB^F^D^^-F-D^|F^B|FC^F^A//"; rules[7] = "C -> |D^|F^B-F+C^F^A&&FA&F^C+F+B^F^D//"; rules[8] = "D -> |CFB-F+B|FA&F^A&&FB-F+B|FC//"; bool statusOK = lparser.ParseStringArray(rules); _ruleList = lparser.RunLSystem(); Console.WriteLine("RULES: " + Rules.RuleListToString(_ruleList, lparser.GlobalParameters)); Parameters currentParameters = new Parameters(); SunflowAPI sunflow = new SunflowAPI(); // SetupSunflow(sunflow); SetupSunflow(sunflow); currentParameters.roll = new Vector3(1.0f, 0.0f, 0.0f); currentParameters.pitch = new Vector3(0.0f, 1.0f, 0.0f); currentParameters.yaw = new Vector3(0.0f, 0.0f, 1.0f); currentParameters.position = new Point3(0.0f, 0.0f, 0.0f); currentParameters.primitiveType = "box"; currentParameters.length = 2.0f; currentParameters.angle = (float)lparser.Angle; currentParameters.thickness = (float)lparser.Thickness; currentParameters.localRotation = new Point3(0.0f, 0.0f, 0.0f); currentParameters.localScale = new Vector3(1.0f, currentParameters.thickness, currentParameters.thickness); currentParameters.objectCount = 0; sunflow.geometry(currentParameters.primitiveType + currentParameters.objectCount++, currentParameters.primitiveType); // Vector3 scale = new Vector3(currentParameters.length1f, currentParameters.thickness , currentParameters.thickness); currentParameters.objectCount = interpretProduction(currentParameters, _ruleList, lparser, sunflow); sunflow.render(SunflowAPI.DEFAULT_OPTIONS, new FileDisplay("lsystem.png")); return; }
public override bool parse(Stream stream, SunflowAPI api) { try { SunflowSharp.Systems.Parser p = new SunflowSharp.Systems.Parser(stream); p.checkNextToken("version"); p.checkNextToken("3.04"); p.checkNextToken("TransformBegin"); if (p.peekNextToken("Procedural")) { // read procedural shave rib bool done1 = false; while (!done1) { p.checkNextToken("DelayedReadArchive"); p.checkNextToken("["); string f = p.getNextToken(); UI.printInfo(UI.Module.USER, "RIB - Reading voxel: \"{0}\" ...", f); api.include(f); p.checkNextToken("]"); while (true) { string t = p.getNextToken(); if (t == null || t == "TransformEnd") { done1 = true; break; } else if (t == "Procedural") { break; } } } return(true); } bool cubic = false; if (p.peekNextToken("Basis")) { cubic = true; // u basis p.checkNextToken("catmull-rom"); p.checkNextToken("1"); // v basis p.checkNextToken("catmull-rom"); p.checkNextToken("1"); } while (p.peekNextToken("Declare")) { p.getNextToken(); // name p.getNextToken(); // interpolation & type } int index = 0; bool done = false; p.checkNextToken("Curves"); do { if (cubic) { p.checkNextToken("cubic"); } else { p.checkNextToken("linear"); } int[] nverts = parseIntArray(p); for (int i = 1; i < nverts.Length; i++) { if (nverts[0] != nverts[i]) { UI.printError(UI.Module.USER, "RIB - Found variable number of hair segments"); return(false); } } int nhairs = nverts.Length; UI.printInfo(UI.Module.USER, "RIB - Parsed {0} hair curves", nhairs); api.parameter("segments", nverts[0] - 1); p.checkNextToken("nonperiodic"); p.checkNextToken("P"); float[] points = parseFloatArray(p); if (points.Length != 3 * nhairs * nverts[0]) { UI.printError(UI.Module.USER, "RIB - Invalid number of points - expecting {0} - found {0}", nhairs * nverts[0], points.Length / 3); return(false); } api.parameter("points", "point", "vertex", points); UI.printInfo(UI.Module.USER, "RIB - Parsed {0} hair vertices", points.Length / 3); p.checkNextToken("width"); float[] w = parseFloatArray(p); if (w.Length != nhairs * nverts[0]) { UI.printError(UI.Module.USER, "RIB - Invalid number of hair widths - expecting {0} - found {0}", nhairs * nverts[0], w.Length); return(false); } api.parameter("widths", "float", "vertex", w); UI.printInfo(UI.Module.USER, "RIB - Parsed {0} hair widths", w.Length); string name = string.Format("{0}[{1}]", "[Stream]", index); UI.printInfo(UI.Module.USER, "RIB - Creating hair object \"{0}\"", name); api.geometry(name, "hair"); api.instance(name + ".instance", name); UI.printInfo(UI.Module.USER, "RIB - Searching for next curve group ..."); while (true) { string t = p.getNextToken(); if (t == null || t == "TransformEnd") { done = true; break; } else if (t == "Curves") { break; } } index++; } while (!done); UI.printInfo(UI.Module.USER, "RIB - Finished reading rib file"); } catch (Exception e) { UI.printError(UI.Module.USER, "RIB - File not found: {0}", "[Stream]"); return(false); } return(true); }
private void parseObjectBlock(SunflowAPI api) { p.checkNextToken("{"); bool noInstance = false; Matrix4 transform = null; string name = null; string[] shaders = null; string[] modifiers = null; if (p.peekNextToken("noinstance")) { // this indicates that the geometry is to be created, but not // instanced into the scene noInstance = true; } else { // these are the parameters to be passed to the instance if (p.peekNextToken("shaders")) { int n = p.getNextInt(); shaders = new string[n]; for (int i = 0; i < n; i++) shaders[i] = p.getNextToken(); } else { p.checkNextToken("shader"); shaders = new string[] { p.getNextToken() }; } if (p.peekNextToken("modifiers")) { int n = p.getNextInt(); modifiers = new string[n]; for (int i = 0; i < n; i++) modifiers[i] = p.getNextToken(); } else if (p.peekNextToken("modifier")) modifiers = new string[] { p.getNextToken() }; if (p.peekNextToken("transform")) transform = parseMatrix(); } if (p.peekNextToken("accel")) api.parameter("accel", p.getNextToken()); p.checkNextToken("type"); string type = p.getNextToken(); if (p.peekNextToken("name")) name = p.getNextToken(); else name = api.getUniqueName(type); if (type == "mesh") { UI.printWarning(UI.Module.API, "Deprecated object type: mesh"); UI.printInfo(UI.Module.API, "Reading mesh: {0} ...", name); int numVertices = p.getNextInt(); int numTriangles = p.getNextInt(); float[] points = new float[numVertices * 3]; float[] normals = new float[numVertices * 3]; float[] uvs = new float[numVertices * 2]; for (int i = 0; i < numVertices; i++) { p.checkNextToken("v"); points[3 * i + 0] = p.getNextFloat(); points[3 * i + 1] = p.getNextFloat(); points[3 * i + 2] = p.getNextFloat(); normals[3 * i + 0] = p.getNextFloat(); normals[3 * i + 1] = p.getNextFloat(); normals[3 * i + 2] = p.getNextFloat(); uvs[2 * i + 0] = p.getNextFloat(); uvs[2 * i + 1] = p.getNextFloat(); } int[] triangles = new int[numTriangles * 3]; for (int i = 0; i < numTriangles; i++) { p.checkNextToken("t"); triangles[i * 3 + 0] = p.getNextInt(); triangles[i * 3 + 1] = p.getNextInt(); triangles[i * 3 + 2] = p.getNextInt(); } // create geometry api.parameter("triangles", triangles); api.parameter("points", "point", "vertex", points); api.parameter("normals", "vector", "vertex", normals); api.parameter("uvs", "texcoord", "vertex", uvs); api.geometry(name, new TriangleMesh()); } else if (type == "flat-mesh") { UI.printWarning(UI.Module.API, "Deprecated object type: flat-mesh"); UI.printInfo(UI.Module.API, "Reading flat mesh: {0} ...", name); int numVertices = p.getNextInt(); int numTriangles = p.getNextInt(); float[] points = new float[numVertices * 3]; float[] uvs = new float[numVertices * 2]; for (int i = 0; i < numVertices; i++) { p.checkNextToken("v"); points[3 * i + 0] = p.getNextFloat(); points[3 * i + 1] = p.getNextFloat(); points[3 * i + 2] = p.getNextFloat(); p.getNextFloat(); p.getNextFloat(); p.getNextFloat(); uvs[2 * i + 0] = p.getNextFloat(); uvs[2 * i + 1] = p.getNextFloat(); } int[] triangles = new int[numTriangles * 3]; for (int i = 0; i < numTriangles; i++) { p.checkNextToken("t"); triangles[i * 3 + 0] = p.getNextInt(); triangles[i * 3 + 1] = p.getNextInt(); triangles[i * 3 + 2] = p.getNextInt(); } // create geometry api.parameter("triangles", triangles); api.parameter("points", "point", "vertex", points); api.parameter("uvs", "texcoord", "vertex", uvs); api.geometry(name, new TriangleMesh()); } else if (type == "sphere") { UI.printInfo(UI.Module.API, "Reading sphere ..."); api.geometry(name, new Sphere()); if (transform == null && !noInstance) { // legacy method of specifying transformation for spheres p.checkNextToken("c"); float x = p.getNextFloat(); float y = p.getNextFloat(); float z = p.getNextFloat(); p.checkNextToken("r"); float radius = p.getNextFloat(); api.parameter("transform", Matrix4.translation(x, y, z).multiply(Matrix4.scale(radius))); api.parameter("shaders", shaders); if (modifiers != null) api.parameter("modifiers", modifiers); api.instance(name + ".instance", name); noInstance = true; // disable future auto-instancing because // instance has already been created } } else if (type == "banchoff") { UI.printInfo(UI.Module.API, "Reading banchoff ..."); api.geometry(name, new BanchoffSurface()); } else if (type == "torus") { UI.printInfo(UI.Module.API, "Reading torus ..."); p.checkNextToken("r"); api.parameter("radiusInner", p.getNextFloat()); api.parameter("radiusOuter", p.getNextFloat()); api.geometry(name, new Torus()); } else if (type == "plane") { UI.printInfo(UI.Module.API, "Reading plane ..."); p.checkNextToken("p"); api.parameter("center", parsePoint()); if (p.peekNextToken("n")) { api.parameter("normal", parseVector()); } else { p.checkNextToken("p"); api.parameter("point1", parsePoint()); p.checkNextToken("p"); api.parameter("point2", parsePoint()); } api.geometry(name, new Plane()); } else if (type == "cornellbox") { UI.printInfo(UI.Module.API, "Reading cornell box ..."); if (transform != null) UI.printWarning(UI.Module.API, "Instancing is not supported on cornell box -- ignoring transform"); p.checkNextToken("corner0"); api.parameter("corner0", parsePoint()); p.checkNextToken("corner1"); api.parameter("corner1", parsePoint()); p.checkNextToken("left"); api.parameter("leftColor", parseColor()); p.checkNextToken("right"); api.parameter("rightColor", parseColor()); p.checkNextToken("top"); api.parameter("topColor", parseColor()); p.checkNextToken("bottom"); api.parameter("bottomColor", parseColor()); p.checkNextToken("back"); api.parameter("backColor", parseColor()); p.checkNextToken("emit"); api.parameter("radiance", parseColor()); if (p.peekNextToken("samples")) api.parameter("samples", p.getNextInt()); new CornellBox().init(name, api); noInstance = true; // instancing is handled natively by the init // method } else if (type == "generic-mesh") { UI.printInfo(UI.Module.API, "Reading generic mesh: {0} ... ", name); // parse vertices p.checkNextToken("points"); int np = p.getNextInt(); api.parameter("points", "point", "vertex", parseFloatArray(np * 3)); // parse triangle indices p.checkNextToken("triangles"); int nt = p.getNextInt(); api.parameter("triangles", parseIntArray(nt * 3)); // parse normals p.checkNextToken("normals"); if (p.peekNextToken("vertex")) api.parameter("normals", "vector", "vertex", parseFloatArray(np * 3)); else if (p.peekNextToken("facevarying")) api.parameter("normals", "vector", "facevarying", parseFloatArray(nt * 9)); else p.checkNextToken("none"); // parse texture coordinates p.checkNextToken("uvs"); if (p.peekNextToken("vertex")) api.parameter("uvs", "texcoord", "vertex", parseFloatArray(np * 2)); else if (p.peekNextToken("facevarying")) api.parameter("uvs", "texcoord", "facevarying", parseFloatArray(nt * 6)); else p.checkNextToken("none"); if (p.peekNextToken("face_shaders")) api.parameter("faceshaders", parseIntArray(nt)); api.geometry(name, new TriangleMesh()); } else if (type == "hair") { UI.printInfo(UI.Module.API, "Reading hair curves: {0} ... ", name); p.checkNextToken("segments"); api.parameter("segments", p.getNextInt()); p.checkNextToken("width"); api.parameter("widths", p.getNextFloat()); p.checkNextToken("points"); api.parameter("points", "point", "vertex", parseFloatArray(p.getNextInt())); api.geometry(name, new Hair()); } else if (type == "janino-tesselatable") { UI.printInfo(UI.Module.API, "Reading procedural primitive: {0} ... ", name); string code = p.getNextCodeBlock(); try { ITesselatable tess = null;//fixme:(Tesselatable) ClassBodyEvaluator.createFastClassBodyEvaluator(new Scanner(null, new stringReader(code)), Tesselatable.class, ClassLoader.getSystemClassLoader()); api.geometry(name, tess); } catch (Exception e) { UI.printDetailed(UI.Module.API, "Compiling: {0}", code); UI.printError(UI.Module.API, "{0}", e); noInstance = true; } } else if (type == "teapot") { UI.printInfo(UI.Module.API, "Reading teapot: {0} ... ", name); bool hasTesselationArguments = false; if (p.peekNextToken("subdivs")) { api.parameter("subdivs", p.getNextInt()); hasTesselationArguments = true; } if (p.peekNextToken("smooth")) { api.parameter("smooth", p.getNextbool()); hasTesselationArguments = true; } if (hasTesselationArguments) api.geometry(name, (ITesselatable)new Teapot()); else api.geometry(name, (PrimitiveList)new Teapot()); } else if (type == "gumbo") { UI.printInfo(UI.Module.API, "Reading gumbo:{0} ... ", name); bool hasTesselationArguments = false; if (p.peekNextToken("subdivs")) { api.parameter("subdivs", p.getNextInt()); hasTesselationArguments = true; } if (p.peekNextToken("smooth")) { api.parameter("smooth", p.getNextbool()); hasTesselationArguments = true; } if (hasTesselationArguments) api.geometry(name, (ITesselatable)new Gumbo()); else api.geometry(name, (PrimitiveList)new Gumbo()); } else if (type == "julia") { UI.printInfo(UI.Module.API, "Reading julia fractal: {0} ... ", name); if (p.peekNextToken("q")) { api.parameter("cw", p.getNextFloat()); api.parameter("cx", p.getNextFloat()); api.parameter("cy", p.getNextFloat()); api.parameter("cz", p.getNextFloat()); } if (p.peekNextToken("iterations")) api.parameter("iterations", p.getNextInt()); if (p.peekNextToken("epsilon")) api.parameter("epsilon", p.getNextFloat()); api.geometry(name, new JuliaFractal()); } else if (type == "particles" || type == "dlasurface") { if (type == "dlasurface") UI.printWarning(UI.Module.API, "Deprecated object type: \"dlasurface\" - please use \"particles\" instead"); p.checkNextToken("filename"); string filename = p.getNextToken(); bool littleEndian = false; if (p.peekNextToken("little_endian")) littleEndian = true; UI.printInfo(UI.Module.USER, "Loading particle file: {0}", filename); //File file = new File(filename); //FileInputStream stream = new FileInputStream(filename); //MappedByteBuffer map = stream.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.Length()); //if (littleEndian) // map.order(ByteOrder.LITTLE_ENDIAN); //FloatBuffer buffer = map.asFloatBuffer(); BinaryReader reader = new BinaryReader(File.OpenRead(filename)); float[] data = new float[reader.BaseStream.Length / 4]; for (int i = 0; i < data.Length; i++) data[i] = BitConverter.ToSingle(reader.ReadBytes(4), 0);//buffer.get(i); reader.Close(); api.parameter("particles", "point", "vertex", data); if (p.peekNextToken("num")) api.parameter("num", p.getNextInt()); else api.parameter("num", data.Length / 3); p.checkNextToken("radius"); api.parameter("radius", p.getNextFloat()); api.geometry(name, new ParticleSurface()); } else if (type == "file-mesh") { UI.printInfo(UI.Module.API, "Reading file mesh: {0} ... ", name); p.checkNextToken("filename"); api.parameter("filename", p.getNextToken()); if (p.peekNextToken("smooth_normals")) api.parameter("smooth_normals", p.getNextbool()); api.geometry(name, new FileMesh()); } else if (type == "bezier-mesh") { UI.printInfo(UI.Module.API, "Reading bezier mesh: {0} ... ", name); p.checkNextToken("n"); int nu, nv; api.parameter("nu", nu = p.getNextInt()); api.parameter("nv", nv = p.getNextInt()); if (p.peekNextToken("wrap")) { api.parameter("uwrap", p.getNextbool()); api.parameter("vwrap", p.getNextbool()); } p.checkNextToken("points"); float[] points = new float[3 * nu * nv]; for (int i = 0; i < points.Length; i++) points[i] = p.getNextFloat(); api.parameter("points", "point", "vertex", points); if (p.peekNextToken("subdivs")) api.parameter("subdivs", p.getNextInt()); if (p.peekNextToken("smooth")) api.parameter("smooth", p.getNextbool()); api.geometry(name, (ITesselatable)new BezierMesh()); } else { UI.printWarning(UI.Module.API, "Unrecognized object type: {0}", p.getNextToken()); noInstance = true; } if (!noInstance) { // create instance api.parameter("shaders", shaders); if (modifiers != null) api.parameter("modifiers", modifiers); if (transform != null) api.parameter("transform", transform); api.instance(name + ".instance", name); } p.checkNextToken("}"); }
private void parseBackgroundBlock(SunflowAPI api) { p.checkNextToken("{"); p.checkNextToken("color"); api.parameter("color", parseColor()); api.shader("background.shader", new ConstantShader()); api.geometry("background", new Background()); api.parameter("shaders", "background.shader"); api.instance("background.instance", "background"); p.checkNextToken("}"); }