package org.jzy3d.plot3d.rendering.canvas;

import java.awt.BorderLayout;
import java.awt.Panel;
import java.io.File;
import java.io.IOException;

// import org.apache.log4j.Logger;
import org.jzy3d.chart.factories.IChartComponentFactory;
import org.jzy3d.plot3d.rendering.scene.Scene;
import org.jzy3d.plot3d.rendering.view.Renderer3d;
import org.jzy3d.plot3d.rendering.view.View;

import com.jogamp.nativewindow.ScalableSurface;
import com.jogamp.newt.awt.NewtCanvasAWT;
import com.jogamp.newt.event.KeyListener;
import com.jogamp.newt.event.MouseListener;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GLAnimatorControl;
import com.jogamp.opengl.GLCapabilitiesImmutable;
import com.jogamp.opengl.GLDrawable;
import com.jogamp.opengl.util.Animator;
import com.jogamp.opengl.util.texture.TextureData;
import com.jogamp.opengl.util.texture.TextureIO;

/**
 * A Newt canvas wrapped in an AWT {@link Panel}.
 * 
 * Newt is supposed to be faster than any other canvas, either for AWT or Swing.
 * 
 * If a non AWT panel where required, follow the guidelines given in
 * {@link IScreenCanvas} documentation.
 */
public class CanvasNewtAwt extends Panel implements IScreenCanvas {
    // static Logger LOGGER = Logger.getLogger(CanvasNewtAwt.class);
    
    public CanvasNewtAwt(IChartComponentFactory factory, Scene scene, Quality quality, GLCapabilitiesImmutable glci) {
        this(factory, scene, quality, glci, false, false);
    }

    public CanvasNewtAwt(IChartComponentFactory factory, Scene scene, Quality quality, GLCapabilitiesImmutable glci, boolean traceGL, boolean debugGL) {
        window = GLWindow.create(glci);
        canvas = new NewtCanvasAWT(window);
        view = scene.newView(this, quality);
        renderer = factory.newRenderer(view, traceGL, debugGL);
        window.addGLEventListener(renderer);
        
        if(quality.isPreserveViewportSize())
            setPixelScale(new float[] { ScalableSurface.IDENTITY_PIXELSCALE, ScalableSurface.IDENTITY_PIXELSCALE });
        
        // swing specific
        setFocusable(true);
        requestFocusInWindow();
        window.setAutoSwapBufferMode(quality.isAutoSwapBuffer());
        if (quality.isAnimated()) {
            animator = new Animator(window);
            getAnimator().start();
        }

        setLayout(new BorderLayout());
        add(canvas, BorderLayout.CENTER);
        

    }

    public void setPixelScale(float[] scale) {
        //LOGGER.info("setting scale " + scale);
        if (scale != null)
            window.setSurfaceScale(scale);
        else
            window.setSurfaceScale(new float[] { 1f, 1f });
    }

    public GLWindow getWindow() {
        return window;
    }

    public NewtCanvasAWT getCanvas() {
        return canvas;
    }

    @Override
    public GLDrawable getDrawable() {
        return window;
    }

    @Override
    public void dispose() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (animator != null && animator.isStarted()) {
                    animator.stop();
                }
                if (renderer != null) {
                    renderer.dispose(window);
                }
                canvas.destroy();
                window = null;
                renderer = null;
                view = null;
                animator = null;
            }
        }).start();
    }

    @Override
    public void display() {
        window.display();
    }

    @Override
    public void forceRepaint() {
        display();
    }

    @Override
    public GLAnimatorControl getAnimator() {
        return window.getAnimator();
    }

    @Override
    public TextureData screenshot() {
        renderer.nextDisplayUpdateScreenshot();
        display();
        return renderer.getLastScreenshot();
    }

    @Override
    public TextureData screenshot(File file) throws IOException {
        TextureData screen = screenshot();
        TextureIO.write(screen, file);
        return screen;
    }

    @Override
    public String getDebugInfo() {
        GL gl = getView().getCurrentGL();

        StringBuffer sb = new StringBuffer();
        sb.append("Chosen GLCapabilities: " + window.getChosenGLCapabilities() + "\n");
        sb.append("GL_VENDOR: " + gl.glGetString(GL.GL_VENDOR) + "\n");
        sb.append("GL_RENDERER: " + gl.glGetString(GL.GL_RENDERER) + "\n");
        sb.append("GL_VERSION: " + gl.glGetString(GL.GL_VERSION) + "\n");
        // sb.append("INIT GL IS: " + gl.getClass().getName() + "\n");
        return sb.toString();
    }

    /**
     * Provide the actual renderer width for the open gl camera settings, which
     * is obtained after a resize event.
     */
    @Override
    public int getRendererWidth() {
        return (renderer != null ? renderer.getWidth() : 0);
    }

    /**
     * Provide the actual renderer height for the open gl camera settings, which
     * is obtained after a resize event.
     */
    @Override
    public int getRendererHeight() {
        return (renderer != null ? renderer.getHeight() : 0);
    }

    @Override
    public Renderer3d getRenderer() {
        return renderer;
    }

    /** Provide a reference to the View that renders into this canvas. */
    @Override
    public View getView() {
        return view;
    }

    /* */

    public synchronized void addKeyListener(KeyListener l) {
        getWindow().addKeyListener(l);
    }

    public void addMouseListener(MouseListener l) {
        getWindow().addMouseListener(l);
    }

    public void removeMouseListener(com.jogamp.newt.event.MouseListener l) {
        getWindow().removeMouseListener(l);
    }

    public void removeKeyListener(com.jogamp.newt.event.KeyListener l) {
        getWindow().removeKeyListener(l);
    }

    @Override
    public void addMouseController(Object o) {
        addMouseListener((MouseListener) o);
    }

    @Override
    public void addKeyController(Object o) {
        addKeyListener((KeyListener) o);
    }

    @Override
    public void removeMouseController(Object o) {
        removeMouseListener((MouseListener) o);
    }

    @Override
    public void removeKeyController(Object o) {
        removeKeyListener((KeyListener) o);
    }

    protected View view;
    protected Renderer3d renderer;
    protected Animator animator;
    protected GLWindow window;
    protected NewtCanvasAWT canvas;
    private static final long serialVersionUID = 8578690050666237742L;
}

 

Ads help maintain this website.