Example #1
0
 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);
 }
Example #2
0
 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");
 }
Example #3
0
 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);
     }
 }
Example #4
0
 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);
     }
 }
Example #5
0
 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);
 }
Example #6
0
    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);
    }
Example #7
0
        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
            }
        }
Example #8
0
        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;
        }
Example #9
0
 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);
 }
Example #10
0
    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);
    }
Example #11
0
        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);
        }
Example #12
0
 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);
 }
Example #13
0
 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");
 }
Example #14
0
 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("}");
 }
Example #15
0
 private void parseInstanceBlock(SunflowAPI api)
 {
     p.checkNextToken("{");
     p.checkNextToken("name");
     string name = p.getNextToken();
     UI.printInfo(UI.Module.API, "Reading instance: {0} ...", name);
     p.checkNextToken("geometry");
     string geoname = p.getNextToken();
     p.checkNextToken("transform");
     api.parameter("transform", parseMatrix());
     string[] shaders;
     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() };
     }
     api.parameter("shaders", shaders);
     string[] modifiers = null;
     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 (modifiers != null)
         api.parameter("modifiers", modifiers);
     api.instance(name, geoname);
     p.checkNextToken("}");
 }
Example #16
0
 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("}");
 }