All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.lessvoid.nifty.examples.jogl.JOGLNiftyRunner Maven / Gradle / Ivy

The newest version!
package de.lessvoid.nifty.examples.jogl;

import java.io.InputStream;
import java.util.logging.LogManager;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.util.FPSAnimator;

import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.examples.LoggerShortFormat;
import de.lessvoid.nifty.nulldevice.NullSoundDevice;
import de.lessvoid.nifty.render.batch.BatchRenderDevice;
import de.lessvoid.nifty.renderer.jogl.input.JoglInputSystem;
import de.lessvoid.nifty.renderer.jogl.render.JoglBatchRenderBackendCoreProfileFactory;
import de.lessvoid.nifty.renderer.jogl.render.JoglBatchRenderBackendFactory;
import de.lessvoid.nifty.renderer.jogl.render.JoglRenderDevice;
import de.lessvoid.nifty.sound.paulssoundsystem.PaulsSoundsystemSoundDevice;
import de.lessvoid.nifty.spi.render.RenderDevice;
import de.lessvoid.nifty.spi.sound.SoundDevice;
import de.lessvoid.nifty.spi.time.TimeProvider;
import de.lessvoid.nifty.spi.time.impl.AccurateTimeProvider;
import paulscode.sound.SoundSystemException;
import paulscode.sound.libraries.LibraryJavaSound;

/**
 * Takes care of JOGL initialization.
 *
 * @author void
 */
public class JOGLNiftyRunner implements GLEventListener {
  private static final int FPS = 60;
  private static final int CANVAS_WIDTH = 1024;
  private static final int CANVAS_HEIGHT = 768;
  private static TimeProvider timeProvider = new AccurateTimeProvider();
  private static long time = timeProvider.getMsTime();
  private static long frames = 0;
  private static GLWindow window;
  @Nonnull
  private static Mode mode = Mode.Batch;

  @Nullable
  private Nifty nifty;
  private Callback callback;

  public static void run(@Nonnull final String[] args, final Callback callback) throws Exception {
    InputStream input = null;
    try {
      input = LoggerShortFormat.class.getClassLoader().getResourceAsStream("logging.properties");
      LogManager.getLogManager().readConfiguration(input);
    } finally {
      if (input != null) {
        input.close();
      }
    }

    if (args.length == 1) {
      mode = Mode.findMode(args[0]);
    }

    System.out.println("using mode " + mode.getName());

    GLCapabilities glCapabilities = new GLCapabilities(getProfile(mode));
    window = GLWindow.create(glCapabilities);
    window.setAutoSwapBufferMode(true);
    window.setSize(CANVAS_WIDTH, CANVAS_HEIGHT);
    window.addGLEventListener(new JOGLNiftyRunner(callback));

    final FPSAnimator animator = new FPSAnimator(window, FPS, false);

    window.setTitle(getCaption(mode));
    window.setVisible(true);

    animator.start();
  }

  private static GLProfile getProfile(final Mode mode) {
    if (Mode.Core.equals(mode)) {
      return GLProfile.get(GLProfile.GL3);
    }
    if (Mode.ES2.equals(mode)) {
      return GLProfile.get(GLProfile.GL2ES2);
    }
    return GLProfile.getDefault();
  }

  @Nonnull
  private static String getCaption(final Mode mode) {
    String add = "";
    if (Mode.Batch.equals(mode)) {
      add += " (BATCH RENDERER)";
    }
    if (Mode.Core.equals(mode)) {
      add += " (CORE PROFILE)";
    }
    if (Mode.ES2.equals(mode)) {
      add += " (ES2 PROFILE)";
    }
    return "NEWT Window Test - Nifty" + add;
  }

  public JOGLNiftyRunner(final Callback callback) {
    this.callback = callback;
  }

  @Override
  public void display(GLAutoDrawable drawable) {
    long startTime = System.nanoTime();
    update(drawable);
    render(drawable, startTime);
  }

  @Override
  public void init(GLAutoDrawable drawable) {
    RenderDevice renderDevice;
    if (Mode.Batch.equals(mode)) {
      renderDevice = new BatchRenderDevice(JoglBatchRenderBackendFactory.create(window));
    } else if (Mode.Core.equals(mode)) {
      renderDevice = new BatchRenderDevice(JoglBatchRenderBackendCoreProfileFactory.create(window));
    } else if (Mode.ES2.equals(mode)) {
      renderDevice = new BatchRenderDevice(JoglBatchRenderBackendCoreProfileFactory.create(window));
    } else {
      renderDevice = new JoglRenderDevice();
    }
    JoglInputSystem inputSystem = new JoglInputSystem(window);
    window.addMouseListener(inputSystem);
    window.addKeyListener(inputSystem);

    SoundDevice soundDevice;
    try {
      soundDevice = new PaulsSoundsystemSoundDevice(LibraryJavaSound.class);
    } catch (SoundSystemException e) {
      soundDevice = new NullSoundDevice();
    }

    nifty = new Nifty(renderDevice, soundDevice, inputSystem, timeProvider);
    callback.init(nifty, window);
  }

  @Override
  public void dispose(GLAutoDrawable drawable) {
    System.exit(0);
  }

  @Override
  public void reshape(@Nonnull GLAutoDrawable drawable, int x, int y, int width, int height) {
    GL gl = drawable.getGL();
    gl.glViewport(0, 0, width, height);
    gl.glEnable(GL.GL_BLEND);

    if (gl.isGL2()) {
      GL2 gl2 = gl.getGL2();
      gl2.glMatrixMode(GL2.GL_PROJECTION);
      gl2.glLoadIdentity();
      gl2.glOrtho(0, width, height, 0, -9999, 9999);

      gl2.glMatrixMode(GL2.GL_MODELVIEW);
      gl2.glLoadIdentity();
    }
  }

  private void update(GLAutoDrawable drawable) {
    nifty.update();
    nifty.render(true);
  }

  private void render(GLAutoDrawable drawable, final long startTime) {
    long frameTime = timeProvider.getMsTime() - startTime;
    frames++;

    long diff = timeProvider.getMsTime() - time;
    if (diff >= 1000) {
      time += diff;
      System.out.println("fps : " + frames + " (" + frameTime + " ms)");
      frames = 0;
    }
  }

  public interface Callback {
    void init(@Nonnull Nifty nifty, @Nonnull GLWindow window);
  }

  private static enum Mode {
    Old("old"),
    Batch("batch"),
    Core("core"),
    ES2("es2");

    private final String name;

    private Mode(final String name) {
      this.name = name;
    }

    public String getName() {
      return name;
    }

    @Nonnull
    public static Mode findMode(final String arg) {
      for (Mode mode : Mode.values()) {
        if (mode.matches(arg)) {
          return mode;
        }
      }
      return Mode.Old;
    }

    private boolean matches(final String check) {
      return name.equals(check);
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy