Can we expect JOGL as an "official" render option in JME?

@noncom here is a sample test app that I’ve been using to run jME using JOGL with multiple JFrames:

import com.jme3.app.Application;
import com.jme3.app.SimpleApplication;
import com.jme3.system.AppSettings;
import com.jme3.system.JmeCanvasContext;
import com.jme3.util.JmeFormatter;
import jme3test.model.TestMonkeyHead;
import jme3test.model.anim.TestBlenderObjectAnim;

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.logging.ConsoleHandler;
import java.util.logging.Handler;
import java.util.logging.Logger;

public class TestMultipleCanvas {

    public static Component createCanvas(AppSettings settings, Application app) {
        JmeCanvasContext context = (JmeCanvasContext) app.getContext();
        Component comp = context.getCanvas();
        comp.setSize(settings.getWidth(), settings.getHeight());
        return comp;
    }

    private static AppSettings createSettings() {
        AppSettings settings = new AppSettings(true);
        // settings.setVSync(true);
        settings.setFrameRate(60);
        settings.setAudioRenderer(null);
        settings.setWidth(800);
        settings.setHeight(600);
        settings.setRenderer("JOGL");
        return settings;
    }

    private static Application createApp(Class<? extends Application> appClass, AppSettings settings) {
        Application app = null;
        try {
            app = appClass.newInstance();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        }

        app.setPauseOnLostFocus(false);
        app.setSettings(settings);
        app.createCanvas();
        app.startCanvas();
        return app;
    }

    public static void startApp(Application... apps) {
        for (final Application app : apps) {
            app.startCanvas();
            app.enqueue(new Callable<Void>() {
                public Void call() {
                    if (app instanceof SimpleApplication) {
                        SimpleApplication simpleApp = (SimpleApplication) app;
                        simpleApp.getFlyByCamera().setDragToRotate(true);
                    }
                    return null;
                }
            });
        }

    }

    public static void main(String[] args) {
        JPopupMenu.setDefaultLightWeightPopupEnabled(false);

        JmeFormatter formatter = new JmeFormatter();

        Handler consoleHandler = new ConsoleHandler();
        consoleHandler.setFormatter(formatter);

        Logger.getLogger("").removeHandler(Logger.getLogger("").getHandlers()[0]);
        Logger.getLogger("").addHandler(consoleHandler);

        AppSettings settings = createSettings();
        List<Class<? extends Application>> appClasses = getAppClasses();

        for (Class<? extends Application> appClass : appClasses) {
            final Application app = createApp(appClass, settings);
            startApp(app);
            final Component canvas1 = createCanvas(settings, app);
            init(canvas1, new JFrame(appClass.getSimpleName()), app);
        }
    }

    private static List<Class<? extends Application>> getAppClasses() {
        List<Class<? extends Application>> appClasses = new LinkedList<>();
        /*
        As many Application classes as you want
         */
        appClasses.add(TestBlenderObjectAnim.class);
        appClasses.add(TestMonkeyHead.class);
        return appClasses;
    }

    private static void init(final Component canvas, final JFrame frame, final Application app) {
        frame.add(canvas);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosed(WindowEvent e) {
                app.stop();
            }
        });
    }
}

Just make sure all the JOGL binaries are on your classpath.

3 Likes