Search in sources :

Example 1 with FrameDisplay

use of org.sunflow.core.display.FrameDisplay in project joons-renderer by joonhyublee.

the class SunflowGUI method main.

public static void main(String[] args) {
    if (args.length > 0) {
        boolean showFrame = true;
        String sampler = null;
        boolean noRender = false;
        String filename = null;
        String input = null;
        int i = 0;
        int threads = 0;
        boolean lowPriority = true;
        boolean showAA = false;
        boolean noGI = false;
        boolean noCaustics = false;
        int pathGI = 0;
        float maxDist = 0;
        String shaderOverride = null;
        int resolutionW = 0, resolutionH = 0;
        int aaMin = -5, aaMax = -5;
        int samples = -1;
        int bucketSize = 0;
        String bucketOrder = null;
        String bakingName = null;
        boolean bakeViewdep = false;
        String filterType = null;
        boolean runBenchmark = false;
        boolean runRTBenchmark = false;
        String translateFilename = null;
        int frameStart = 1, frameStop = 1;
        while (i < args.length) {
            if (args[i].equals("-o")) {
                if (i > args.length - 2) {
                    usage(false);
                }
                filename = args[i + 1];
                i += 2;
            } else if (args[i].equals("-nogui")) {
                showFrame = false;
                i++;
            } else if (args[i].equals("-ipr")) {
                sampler = "ipr";
                i++;
            } else if (args[i].equals("-threads")) {
                if (i > args.length - 2) {
                    usage(false);
                }
                threads = Integer.parseInt(args[i + 1]);
                i += 2;
            } else if (args[i].equals("-lopri")) {
                lowPriority = true;
                i++;
            } else if (args[i].equals("-hipri")) {
                lowPriority = false;
                i++;
            } else if (args[i].equals("-sampler")) {
                if (i > args.length - 2) {
                    usage(false);
                }
                sampler = args[i + 1];
                i += 2;
            } else if (args[i].equals("-smallmesh")) {
                TriangleMesh.setSmallTriangles(true);
                i++;
            } else if (args[i].equals("-dumpkd")) {
                KDTree.setDumpMode(true, "kdtree");
                i++;
            } else if (args[i].equals("-buildonly")) {
                noRender = true;
                i++;
            } else if (args[i].equals("-showaa")) {
                showAA = true;
                i++;
            } else if (args[i].equals("-nogi")) {
                noGI = true;
                i++;
            } else if (args[i].equals("-nocaustics")) {
                noCaustics = true;
                i++;
            } else if (args[i].equals("-pathgi")) {
                if (i > args.length - 2) {
                    usage(false);
                }
                pathGI = Integer.parseInt(args[i + 1]);
                i += 2;
            } else if (args[i].equals("-quick_ambocc")) {
                if (i > args.length - 2) {
                    usage(false);
                }
                maxDist = Float.parseFloat(args[i + 1]);
                // new
                shaderOverride = "ambient_occlusion";
                // AmbientOcclusionShader(Color.WHITE,
                // d);
                i += 2;
            } else if (args[i].equals("-quick_uvs")) {
                if (i > args.length - 1) {
                    usage(false);
                }
                shaderOverride = "show_uvs";
                i++;
            } else if (args[i].equals("-quick_normals")) {
                if (i > args.length - 1) {
                    usage(false);
                }
                shaderOverride = "show_normals";
                i++;
            } else if (args[i].equals("-quick_id")) {
                if (i > args.length - 1) {
                    usage(false);
                }
                shaderOverride = "show_instance_id";
                i++;
            } else if (args[i].equals("-quick_prims")) {
                if (i > args.length - 1) {
                    usage(false);
                }
                shaderOverride = "show_primitive_id";
                i++;
            } else if (args[i].equals("-quick_gray")) {
                if (i > args.length - 1) {
                    usage(false);
                }
                shaderOverride = "quick_gray";
                i++;
            } else if (args[i].equals("-quick_wire")) {
                if (i > args.length - 1) {
                    usage(false);
                }
                shaderOverride = "wireframe";
                i++;
            } else if (args[i].equals("-resolution")) {
                if (i > args.length - 3) {
                    usage(false);
                }
                resolutionW = Integer.parseInt(args[i + 1]);
                resolutionH = Integer.parseInt(args[i + 2]);
                i += 3;
            } else if (args[i].equals("-aa")) {
                if (i > args.length - 3) {
                    usage(false);
                }
                aaMin = Integer.parseInt(args[i + 1]);
                aaMax = Integer.parseInt(args[i + 2]);
                i += 3;
            } else if (args[i].equals("-samples")) {
                if (i > args.length - 2) {
                    usage(false);
                }
                samples = Integer.parseInt(args[i + 1]);
                i += 2;
            } else if (args[i].equals("-bucket")) {
                if (i > args.length - 3) {
                    usage(false);
                }
                bucketSize = Integer.parseInt(args[i + 1]);
                bucketOrder = args[i + 2];
                i += 3;
            } else if (args[i].equals("-bake")) {
                if (i > args.length - 2) {
                    usage(false);
                }
                bakingName = args[i + 1];
                i += 2;
            } else if (args[i].equals("-bakedir")) {
                if (i > args.length - 2) {
                    usage(false);
                }
                String baketype = args[i + 1];
                if (baketype.equals("view")) {
                    bakeViewdep = true;
                } else if (baketype.equals("ortho")) {
                    bakeViewdep = false;
                } else {
                    usage(false);
                }
                i += 2;
            } else if (args[i].equals("-filter")) {
                if (i > args.length - 2) {
                    usage(false);
                }
                filterType = args[i + 1];
                i += 2;
            } else if (args[i].equals("-bench")) {
                runBenchmark = true;
                i++;
            } else if (args[i].equals("-rtbench")) {
                runRTBenchmark = true;
                i++;
            } else if (args[i].equals("-frame")) {
                if (i > args.length - 2) {
                    usage(false);
                }
                frameStart = frameStop = Integer.parseInt(args[i + 1]);
                i += 2;
            } else if (args[i].equals("-anim")) {
                if (i > args.length - 3) {
                    usage(false);
                }
                frameStart = Integer.parseInt(args[i + 1]);
                frameStop = Integer.parseInt(args[i + 2]);
                i += 3;
            } else if (args[i].equals("-v")) {
                if (i > args.length - 2) {
                    usage(false);
                }
                UI.verbosity(Integer.parseInt(args[i + 1]));
                i += 2;
            } else if (args[i].equals("-translate")) {
                if (i > args.length - 2) {
                    usage(false);
                }
                translateFilename = args[i + 1];
                i += 2;
            } else if (args[i].equals("-h") || args[i].equals("-help")) {
                usage(true);
            } else {
                if (input != null) {
                    usage(false);
                }
                input = args[i];
                i++;
            }
        }
        if (runBenchmark) {
            SunflowAPI.runSystemCheck();
            new Benchmark().execute();
            return;
        }
        if (runRTBenchmark) {
            SunflowAPI.runSystemCheck();
            new RealtimeBenchmark(showFrame, threads);
            return;
        }
        if (input == null) {
            usage(false);
        }
        SunflowAPI.runSystemCheck();
        if (translateFilename != null) {
            SunflowAPI.translate(input, translateFilename);
            return;
        }
        if (frameStart < frameStop && showFrame) {
            UI.printWarning(Module.GUI, "Animations should not be rendered without -nogui - forcing GUI off anyway");
            showFrame = false;
        }
        if (frameStart < frameStop && filename == null) {
            filename = "output.#.png";
            UI.printWarning(Module.GUI, "Animation output was not specified - defaulting to: \"%s\"", filename);
        }
        for (int frameNumber = frameStart; frameNumber <= frameStop; frameNumber++) {
            SunflowAPI api = SunflowAPI.create(input, frameNumber);
            if (api == null) {
                continue;
            }
            if (noRender) {
                continue;
            }
            if (resolutionW > 0 && resolutionH > 0) {
                api.parameter("resolutionX", resolutionW);
                api.parameter("resolutionY", resolutionH);
            }
            if (aaMin != -5 || aaMax != -5) {
                api.parameter("aa.min", aaMin);
                api.parameter("aa.max", aaMax);
            }
            if (samples >= 0) {
                api.parameter("aa.samples", samples);
            }
            if (bucketSize > 0) {
                api.parameter("bucket.size", bucketSize);
            }
            if (bucketOrder != null) {
                api.parameter("bucket.order", bucketOrder);
            }
            api.parameter("aa.display", showAA);
            api.parameter("threads", threads);
            api.parameter("threads.lowPriority", lowPriority);
            if (bakingName != null) {
                api.parameter("baking.instance", bakingName);
                api.parameter("baking.viewdep", bakeViewdep);
            }
            if (filterType != null) {
                api.parameter("filter", filterType);
            }
            if (noGI) {
                api.parameter("gi.engine", "none");
            } else if (pathGI > 0) {
                api.parameter("gi.engine", "path");
                api.parameter("gi.path.samples", pathGI);
            }
            if (noCaustics) {
                api.parameter("caustics", "none");
            }
            if (sampler != null) {
                api.parameter("sampler", sampler);
            }
            api.options(SunflowAPI.DEFAULT_OPTIONS);
            if (shaderOverride != null) {
                if (shaderOverride.equals("ambient_occlusion")) {
                    api.parameter("maxdist", maxDist);
                }
                api.shader("cmdline_override", shaderOverride);
                api.parameter("override.shader", "cmdline_override");
                api.parameter("override.photons", true);
                api.options(SunflowAPI.DEFAULT_OPTIONS);
            }
            // create display
            Display display;
            String currentFilename = (filename != null) ? filename.replace("#", String.format("%04d", frameNumber)) : null;
            if (showFrame) {
                display = new FrameDisplay(currentFilename);
            } else {
                if (currentFilename != null && currentFilename.equals("imgpipe")) {
                    display = new ImgPipeDisplay();
                } else {
                    display = new FileDisplay(currentFilename);
                }
            }
            api.render(SunflowAPI.DEFAULT_OPTIONS, display);
        }
    } else {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            // If Nimbus is not available, you can set the GUI to another look and feel.
            MetalLookAndFeel.setCurrentTheme(new DefaultMetalTheme());
        }
        SunflowGUI gui = new SunflowGUI();
        gui.setVisible(true);
        Dimension screenRes = Toolkit.getDefaultToolkit().getScreenSize();
        if (screenRes.getWidth() <= DEFAULT_WIDTH || screenRes.getHeight() <= DEFAULT_HEIGHT) {
            gui.setExtendedState(MAXIMIZED_BOTH);
        }
        gui.tileWindowMenuItem.doClick();
        SunflowAPI.runSystemCheck();
    }
}
Also used : FrameDisplay(org.sunflow.core.display.FrameDisplay) LookAndFeelInfo(javax.swing.UIManager.LookAndFeelInfo) Dimension(java.awt.Dimension) PropertyVetoException(java.beans.PropertyVetoException) FileNotFoundException(java.io.FileNotFoundException) IOException(java.io.IOException) DefaultMetalTheme(javax.swing.plaf.metal.DefaultMetalTheme) ImgPipeDisplay(org.sunflow.core.display.ImgPipeDisplay) SunflowAPI(org.sunflow.SunflowAPI) RealtimeBenchmark(org.sunflow.RealtimeBenchmark) Benchmark(org.sunflow.Benchmark) RealtimeBenchmark(org.sunflow.RealtimeBenchmark) FileDisplay(org.sunflow.core.display.FileDisplay) Display(org.sunflow.core.Display) FrameDisplay(org.sunflow.core.display.FrameDisplay) FileDisplay(org.sunflow.core.display.FileDisplay) ImgPipeDisplay(org.sunflow.core.display.ImgPipeDisplay)

Example 2 with FrameDisplay

use of org.sunflow.core.display.FrameDisplay in project joons-renderer by joonhyublee.

the class Scene method render.

/**
 * Render the scene using the specified options, image sampler and display.
 *
 * @param options rendering options object
 * @param sampler image sampler
 * @param display display to send the final image to, a default display will
 * be created if <code>null</code>
 */
public void render(Options options, ImageSampler sampler, Display display) {
    stats.reset();
    if (display == null) {
        display = new FrameDisplay();
    }
    if (bakingInstance != null) {
        UI.printDetailed(Module.SCENE, "Creating primitives for lightmapping ...");
        bakingPrimitives = bakingInstance.getBakingPrimitives();
        if (bakingPrimitives == null) {
            UI.printError(Module.SCENE, "Lightmap baking is not supported for the given instance.");
            return;
        }
        int n = bakingPrimitives.getNumPrimitives();
        UI.printInfo(Module.SCENE, "Building acceleration structure for lightmapping (%d num primitives) ...", n);
        bakingAccel = AccelerationStructureFactory.create("auto", n, true);
        bakingAccel.build(bakingPrimitives);
    } else {
        bakingPrimitives = null;
        bakingAccel = null;
    }
    bakingViewDependent = options.getBoolean("baking.viewdep", bakingViewDependent);
    if ((bakingInstance != null && bakingViewDependent && camera == null) || (bakingInstance == null && camera == null)) {
        UI.printError(Module.SCENE, "No camera found");
        return;
    }
    // read from options
    threads = options.getInt("threads", 0);
    lowPriority = options.getBoolean("threads.lowPriority", true);
    imageWidth = options.getInt("resolutionX", 640);
    imageHeight = options.getInt("resolutionY", 480);
    // limit resolution to 16k
    imageWidth = MathUtils.clamp(imageWidth, 1, 1 << 14);
    imageHeight = MathUtils.clamp(imageHeight, 1, 1 << 14);
    // prepare lights
    createAreaLightInstances();
    // get acceleration structure info
    // count scene primitives
    long numPrimitives = 0;
    for (int i = 0; i < instanceList.getNumPrimitives(); i++) {
        numPrimitives += instanceList.getNumPrimitives(i);
    }
    UI.printInfo(Module.SCENE, "Scene stats:");
    UI.printInfo(Module.SCENE, "  * Infinite instances:  %d", infiniteInstanceList.getNumPrimitives());
    UI.printInfo(Module.SCENE, "  * Instances:           %d", instanceList.getNumPrimitives());
    UI.printInfo(Module.SCENE, "  * Primitives:          %d", numPrimitives);
    String accelName = options.getString("accel", null);
    if (accelName != null) {
        rebuildAccel = rebuildAccel || !acceltype.equals(accelName);
        acceltype = accelName;
    }
    UI.printInfo(Module.SCENE, "  * Instance accel:      %s", acceltype);
    if (rebuildAccel) {
        intAccel = AccelerationStructureFactory.create(acceltype, instanceList.getNumPrimitives(), false);
        intAccel.build(instanceList);
        rebuildAccel = false;
    }
    UI.printInfo(Module.SCENE, "  * Scene bounds:        %s", getBounds());
    UI.printInfo(Module.SCENE, "  * Scene center:        %s", getBounds().getCenter());
    UI.printInfo(Module.SCENE, "  * Scene diameter:      %.2f", getBounds().getExtents().length());
    UI.printInfo(Module.SCENE, "  * Lightmap bake:       %s", bakingInstance != null ? (bakingViewDependent ? "view" : "ortho") : "off");
    if (sampler == null) {
        return;
    }
    if (!lightServer.build(options)) {
        return;
    }
    // render
    UI.printInfo(Module.SCENE, "Rendering ...");
    stats.setResolution(imageWidth, imageHeight);
    sampler.prepare(options, this, imageWidth, imageHeight);
    sampler.render(display);
    // show statistics
    stats.displayStats();
    lightServer.showStats();
    // discard area lights
    removeAreaLightInstances();
    // discard baking tesselation/accel structure
    bakingPrimitives = null;
    bakingAccel = null;
    UI.printInfo(Module.SCENE, "Done.");
}
Also used : FrameDisplay(org.sunflow.core.display.FrameDisplay)

Aggregations

FrameDisplay (org.sunflow.core.display.FrameDisplay)2 Dimension (java.awt.Dimension)1 PropertyVetoException (java.beans.PropertyVetoException)1 FileNotFoundException (java.io.FileNotFoundException)1 IOException (java.io.IOException)1 LookAndFeelInfo (javax.swing.UIManager.LookAndFeelInfo)1 DefaultMetalTheme (javax.swing.plaf.metal.DefaultMetalTheme)1 Benchmark (org.sunflow.Benchmark)1 RealtimeBenchmark (org.sunflow.RealtimeBenchmark)1 SunflowAPI (org.sunflow.SunflowAPI)1 Display (org.sunflow.core.Display)1 FileDisplay (org.sunflow.core.display.FileDisplay)1 ImgPipeDisplay (org.sunflow.core.display.ImgPipeDisplay)1