Esempio n. 1
0
 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("}");
 }