ラベル JavaFX+JOGL の投稿を表示しています。 すべての投稿を表示
ラベル JavaFX+JOGL の投稿を表示しています。 すべての投稿を表示

2009年5月23日土曜日

JavaFXでJOGLを動かす - 2.WireCubeの背景を透過する

同じ研究室の人が物体をアニメーションさせることをしていたので、ちょっと違う方面をやってみる。

非矩形ウィンドウというやつ。
めっさ悩んだけど、GLPanelの背景を透過させることができたので、それを使う。

JOGLのほうは、クラスとパッケージの名前を変えただけで前回と同じ。

Fx_TransparentSimpleCube.fx
package fx_TransparentSimpleCube;

import javafx.stage.Stage;
import javafx.scene.Scene;

import javax.media.opengl.GLJPanel;
import fx_TransparentSimpleCube.Gl_TransparentSimpleCube;
import javafx.ext.swing.SwingComponent;

import javafx.scene.paint.Color;
import javafx.stage.StageStyle;
import javafx.scene.effect.DropShadow;

var panel:GLJPanel = new GLJPanel();
panel.addGLEventListener(new Gl_TransparentSimpleCube());

//GLJPanelを透明化
panel.setOpaque(false);

var swingComp:SwingComponent = SwingComponent.wrap(panel);{
    swingComp.height = 300;
    swingComp.width = 300;

    //3Dにエフェクトをつける
    swingComp.effect = DropShadow {
        offsetX: 10
        offsetY: 10
        color: Color.BLACK
        radius: 10
    };

}

Stage {
    title : "TransparentSimpleCube"
    //枠を透明化
    style : StageStyle.TRANSPARENT
    scene: Scene {
        //シーンを透明化
        fill: Color.TRANSPARENT
        width: swingComp.width
        height: swingComp.height
        content: [
            swingComp
        ]
    }
}
実行結果

2009年5月17日日曜日

JavaFXでJOGLを動かす - 1.WireCubeを表示

サンプルを下さった同研究室の方々と、ネット上に情報をあげてくださっている方々に感謝しながら
WireCubeを表示してみる。

Gl_SimpleCube.java
package fx_simpleCube;

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;

import com.sun.opengl.util.GLUT;
import javax.media.opengl.GLJPanel;

public class Gl_SimpleCube extends GLJPanel implements GLEventListener {

    private GL gl;
    private GLUT glut;

    public Gl_SimpleCube() {

        GLJPanel glc = new GLJPanel();
        glc.addGLEventListener(this);

        this.add(glc);

    }

    public void init(GLAutoDrawable drawable) {
        gl = drawable.getGL();
        glut = new GLUT();

        gl.glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
    }

    public void reshape(GLAutoDrawable drawable,
                        int x, int y,
                        int width, int height) {
        float ratio = (float)height / (float)width;

        gl.glViewport(0, 0, width, height);

        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustum(-1.0f, 1.0f, -ratio, ratio,
                     5.0f, 40.0f);

        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();
        gl.glTranslatef(0.0f, 0.0f, -20.0f);
    }

    public void display(GLAutoDrawable drawable) {
        gl.glClear(GL.GL_COLOR_BUFFER_BIT);

        // 線画の立方体を描画
        glut.glutWireCube(2.0f);
    }

    public void displayChanged(GLAutoDrawable drawable,
                               boolean modeChanged,
                               boolean deviceChanged) {}
}

Fx_SimpleCube.fx
package fx_simpleCube;

import javafx.stage.Stage;
import javafx.scene.Scene;

import javax.media.opengl.GLJPanel;
import fx_simpleCube.Gl_SimpleCube;
import javafx.ext.swing.SwingComponent;


var panel:GLJPanel = new GLJPanel();
panel.addGLEventListener(new Gl_SimpleCube());

var swingComp:SwingComponent = SwingComponent.wrap(panel);
swingComp.height = 300;
swingComp.width = 300;

Stage {
    title : "SimpleCube"
    scene: Scene {
        width: swingComp.width
        height: swingComp.height
        content: [
            swingComp
        ]
    }
}

実行結果
実行結果

JavaFXでJOGLを動かす - 0.枠だけ

研究室でJavaFXでJOGLを動かすことになったので、それのメモ書き。

同じプロジェクトの方が勉強して、サンプルソースを下さったので有難く使わせてもらいます。
ただ、単なるパクリでは力にならないので、勉強してみる。

まず、
「OpenGLを使ってJavaでも3Dを楽しもう」第3回 プログラムで3Dを表示する
を見ながらJOGLの窓だけ開くコードを勉強する。
次に、貰ったサンプルとのANDをとって、骨組みだけ残してみる。
すると、こうなる。

Gl_Simple.java(JOGLの方)
package fx_testSample0;

/*
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
*/

import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
//import javax.media.opengl.GLCanvas;

public class Gl_Simple implements GLEventListener{

    public Gl_Simple() {
        /*
        Frame frame = new Frame("Simple Cube");

        // 3Dを描画するコンポーネント
        GLCanvas canvas = new GLCanvas();
        canvas.addGLEventListener(this);

        frame.add(canvas);
        frame.setSize(300, 300);

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        frame.setVisible(true);
        */
    }

    public void init(GLAutoDrawable drawable) {
        // 初期化処理
    }

    public void reshape(GLAutoDrawable drawable,
                        int x, int y,
                        int width, int height) {
        // 描画領域変更処理
    }

    public void display(GLAutoDrawable drawable) {
        // 描画処理
    }

    public void displayChanged(GLAutoDrawable drawable,
                               boolean modeChanged,
                               boolean deviceChanged) {}

}
Frame部分がごっそり抜ける。で、このFrame部分をJavaFXにしてしまえばいいって事らしい。

Fx_Simple.fx
package fx_testSample0;

import javafx.stage.Stage;
import javafx.scene.Scene;

import javax.media.opengl.GLJPanel;
import fx_testSample0.Gl_Simple;
import javafx.ext.swing.SwingComponent;

var panel:GLJPanel = new GLJPanel();
panel.addGLEventListener(new Gl_Simple());

var swingComp:SwingComponent = SwingComponent.wrap(panel);{
    swingComp.height = 300;
    swingComp.width = 300;
}

Stage {
    title : "SimpleFrame"
    scene: Scene {
        width: 300
        height: 300
        content: [
            swingComp
        ]
    }
}
まだ JavaFX も勉強途中。JOGL も勉強途中。Java の Swing も勉強と(ry

先は長そうです。