JOGLにゃの描画処理にゃをペチペチとにゃ

リスニャ〜を実装するようにゃにして、初期化とかにゃ描画を実装ですにゃ。
アニメにゃは、普通にゃはanime〜ってにゃのを使うっぽいにゃですけど、面倒にゃので直接display()メソッドにゃを呼び出して無理やり描画させるようにゃにですにゃ。
スワップを手動にゃにしたかったにゃのですけどにゃ、Windowモードにゃでは駄目にゃのかにゃ?
上手くできにゃかったですにゃ。
フルスクリーンにゃにすれば上手くいくにゃのかにゃ?
この辺にゃは、宿題ですにゃね。
 
「動けば正義にゃ〜」ってことにゃで、変にゃ使い方にゃは愛嬌ですにゃ。*1
 

import java.awt.*;
import javax.swing.*;
import javax.media.opengl.*;
import com.sun.opengl.util.GLUT;

class infcat_jogl extends GLJPanel implements Runnable, GLEventListener {

  infcat_jogl() {
    addGLEventListener( this );
  }

  /**
   * OpenGL context が初期化された後に呼び出される。
   */
  public void init( GLAutoDrawable drawable ) {
    gl = drawable.getGL(); // @todo 毎回取得しないと駄目?
    glut = new GLUT();
  }

  /**
   * 画面モードが変わったときに呼び出される。
   */
  public void displayChanged( GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {
  }

  /**
   * 画面サイズが変わったときに呼び出される。
   */
  public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
    final 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 );
    gl.glPushMatrix();
    gl.glRotatef( angle, 1.0f, 0.0f, 0.0f );
    glut.glutWireTeapot( 3.0f ); // ティーポットを描画
    gl.glPopMatrix();
  }

  public void run() {
    // アイコン設定
    frame.setIconImage( (new ImageIcon( getClass().getClassLoader().getResource( "images/icon/icon.jpg" ) )).getImage() );
    // ウィンドウのサイズと表示位置を設定
    setPreferredSize( new Dimension( 320, 240 ) ); // パネルサイズ設定
    frame.pack();                        // サイズを再計算
    frame.setLocationRelativeTo( null ); // ウィンドウを中央に
    // フレームウィンドウを表示
    frame.setVisible( true );

    // メインループ
    while( true ) {
      angle += 1.0f; // アングル更新
      display();     // 描画
    }
  }

  public static void main(String [] args) {
    // フレーム作成
    frame = new JFrame( "InfinityCat Zero" );
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame.setResizable( false );  // リサイズ不可

    // ゲーム作成
    infcat_jogl game_main = new infcat_jogl();
    frame.getContentPane().add( game_main );

    // ゲームスレッド開始
    (new Thread( game_main )).start();
  }

  /** フレームウィンドウ */
  private static JFrame frame;

  /** gl */
  private GL gl;
  /** glut */
  private GLUT glut;
  /** for test アングル */
  private float angle;
}

*1: