private void parseLightBlock(SunflowAPI api) { p.checkNextToken("{"); p.checkNextToken("type"); if (p.peekNextToken("mesh")) { UI.printWarning(UI.Module.API, "Deprecated light type: mesh"); p.checkNextToken("name"); string name = p.getNextToken(); UI.printInfo(UI.Module.API, "Reading light mesh: {0} ...", name); p.checkNextToken("emit"); api.parameter("radiance", null, parseColor().getRGB()); int samples = numLightSamples; if (p.peekNextToken("samples")) samples = p.getNextInt(); else UI.printWarning(UI.Module.API, "Samples keyword not found - defaulting to {0}", samples); api.parameter("samples", samples); int numVertices = p.getNextInt(); int numTriangles = p.getNextInt(); float[] points = new float[3 * numVertices]; int[] triangles = new int[3 * numTriangles]; 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(); // ignored p.getNextFloat(); p.getNextFloat(); p.getNextFloat(); p.getNextFloat(); p.getNextFloat(); } for (int i = 0; i < numTriangles; i++) { p.checkNextToken("t"); triangles[3 * i + 0] = p.getNextInt(); triangles[3 * i + 1] = p.getNextInt(); triangles[3 * i + 2] = p.getNextInt(); } api.parameter("points", "point", "vertex", points); api.parameter("triangles", triangles); api.light(name, "triangle_mesh"); } else if (p.peekNextToken("point")) { UI.printInfo(UI.Module.API, "Reading point light ..."); Color pow; if (p.peekNextToken("color")) { pow = parseColor(); p.checkNextToken("power"); float po = p.getNextFloat(); pow.mul(po); } else { UI.printWarning(UI.Module.API, "Deprecated color specification - please use color and power instead"); p.checkNextToken("power"); pow = parseColor(); } p.checkNextToken("p"); api.parameter("center", parsePoint()); api.parameter("power", null , pow.getRGB()); api.light(generateUniqueName("pointlight"), "point"); } else if (p.peekNextToken("spherical")) { UI.printInfo(UI.Module.API, "Reading spherical light ..."); p.checkNextToken("color"); Color pow = parseColor(); p.checkNextToken("radiance"); pow.mul(p.getNextFloat()); api.parameter("radiance", null, pow.getRGB()); p.checkNextToken("center"); api.parameter("center", parsePoint()); p.checkNextToken("radius"); api.parameter("radius", p.getNextFloat()); p.checkNextToken("samples"); api.parameter("samples", p.getNextInt()); api.light (generateUniqueName("spherelight"), "sphere"); } else if (p.peekNextToken("directional")) { UI.printInfo(UI.Module.API, "Reading directional light ..."); p.checkNextToken("source"); Point3 s = parsePoint(); api.parameter("source", s); p.checkNextToken("target"); Point3 t = parsePoint(); api.parameter("dir", Point3.sub(t, s, new Vector3())); p.checkNextToken("radius"); api.parameter("radius", p.getNextFloat()); p.checkNextToken("emit"); Color e = parseColor(); if (p.peekNextToken("intensity")) { float i = p.getNextFloat(); e.mul(i); } else UI.printWarning(UI.Module.API, "Deprecated color specification - please use emit and intensity instead"); api.parameter("radiance", null, e.getRGB()); api.light(generateUniqueName("dirlight"), "directional"); } else if (p.peekNextToken("ibl")) { UI.printInfo(UI.Module.API, "Reading image based light ..."); p.checkNextToken("image"); api.parameter("texture", p.getNextToken()); p.checkNextToken("center"); api.parameter("center", parseVector()); p.checkNextToken("up"); api.parameter("up", parseVector()); p.checkNextToken("lock"); api.parameter("fixed", p.getNextbool()); int samples = numLightSamples; if (p.peekNextToken("samples")) samples = p.getNextInt(); else UI.printWarning(UI.Module.API, "Samples keyword not found - defaulting to {0}", samples); api.parameter("samples", samples); if (p.peekNextToken("lowsamples")) api.parameter("lowsamples", p.getNextInt()); else api.parameter("lowsamples", samples); api.light(generateUniqueName("ibl"), "ibl"); } else if (p.peekNextToken("meshlight")) { p.checkNextToken("name"); string name = p.getNextToken(); UI.printInfo(UI.Module.API, "Reading meshlight: {0} ...", name); p.checkNextToken("emit"); Color e = parseColor(); if (p.peekNextToken("radiance")) { float r = p.getNextFloat(); e.mul(r); } else UI.printWarning(UI.Module.API, "Deprecated color specification - please use emit and radiance instead"); api.parameter("radiance", null, e.getRGB()); int samples = numLightSamples; if (p.peekNextToken("samples")) samples = p.getNextInt(); else UI.printWarning(UI.Module.API, "Samples keyword not found - defaulting to {0}", samples); api.parameter("samples", samples); // 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)); api.light(name, "triangle_mesh"); } else if (p.peekNextToken("sunsky")) { p.checkNextToken("up"); api.parameter("up", parseVector()); p.checkNextToken("east"); api.parameter("east", parseVector()); p.checkNextToken("sundir"); api.parameter("sundir", parseVector()); p.checkNextToken("turbidity"); api.parameter("turbidity", p.getNextFloat()); if (p.peekNextToken("samples")) api.parameter("samples", p.getNextInt()); if (p.peekNextToken("ground.extendsky")) api.parameter("ground.extendsky", p.getNextbool()); else if (p.peekNextToken("ground.color")) api.parameter("ground.color", null, parseColor().getRGB()); api.light(generateUniqueName("sunsky"), "sunsky"); } else if (p.peekNextToken("cornellbox")) { UI.printInfo(UI.Module.API, "Reading cornell box ..."); p.checkNextToken("corner0"); api.parameter("corner0", parsePoint()); p.checkNextToken("corner1"); api.parameter("corner1", parsePoint()); p.checkNextToken("left"); api.parameter("leftColor", null, parseColor().getRGB()); p.checkNextToken("right"); api.parameter("rightColor", null, parseColor().getRGB()); p.checkNextToken("top"); api.parameter("topColor", null, parseColor().getRGB()); p.checkNextToken("bottom"); api.parameter("bottomColor", null, parseColor().getRGB()); p.checkNextToken("back"); api.parameter("backColor", null, parseColor().getRGB()); p.checkNextToken("emit"); api.parameter("radiance", null, parseColor().getRGB()); if (p.peekNextToken("samples")) api.parameter("samples", p.getNextInt()); api.light(generateUniqueName("cornellbox"), "cornell_box"); } else UI.printWarning(UI.Module.API, "Unrecognized object type: {0}", p.getNextToken()); p.checkNextToken("}"); }