Newer
Older
AlgebraicDataflowArchitectureModel / GameEngine / src / main / java / gameEngine / entites / gameComponents / Mesh.java
package gameEngine.entites.gameComponents;

import gameEngine.entites.Entity;
import gameEngine.entites.GameObject;
import gameEngine.views.Texture;
import gameEngine.views.Window;
import static org.lwjgl.opengl.GL11.*;

public class Mesh extends GameComponent {

    public enum MeshType {
        SPRITE, CUBE
    }

    private final MeshType type;
    private Texture texture; // スプライトのテクスチャを保持
    private final Entity parent;  // 親のオブジェクトを持つ

    private int spriteWidth = 64; // スプライト幅(今後指定可能にする)
    private int spriteHeight = 64; // スプライト高さ(今後指定可能にする)

    public Mesh(Entity parent, MeshType type, String texturePath) {
        this.parent = parent;
        this.type = type;
        if (type == MeshType.SPRITE) {
            this.texture = new Texture("GameEngine/resources/" + texturePath);  // Load the image
        }
    }

    @Override
    public void init() {
        if (type == MeshType.SPRITE) {
            renderSprite(); // スプライトの描画
        }
    }

    @Override
    public void update() {
        if (type == MeshType.SPRITE) {
            renderSprite(); // スプライトの描画
        }
    }

    private void renderSprite() {
        // 2Dの描画モードに切り替え
        glMatrixMode(GL_PROJECTION);// 投影行列の設定モードに切り替え
        glPushMatrix(); // 現在の投影行列を保存
        glLoadIdentity(); // 単位行列をロードして投影行列をリセット

        // ピクセル単位の座標系に設定 (画面左上が原点、画面サイズはWindowの幅と高さ)
        /*
            x軸: 左が0、右がWindow.get().width(ウィンドウの幅)
            y軸: 上が0、下がWindow.get().height(ウィンドウの高さ)
            z軸: -1から1の範囲で設定
         */
        glOrtho(0, Window.get().width, Window.get().height, 0, -1, 1);

        // モデルビュー行列に切り替えて、描画する位置を決める
        glMatrixMode(GL_MODELVIEW); // モデルビュー行列の設定モードに切り替え
        glPushMatrix(); // 現在のモデルビュー行列を保存
        glLoadIdentity(); // 単位行列をロードしてモデルビュー行列をリセット

        // テクスチャをバインド (テクスチャIDをOpenGLに設定)
        glBindTexture(GL_TEXTURE_2D, texture.getId());

        // 親のGameObjectの座標と回転を取得
        float x = parent.transform.position.x;
        float y = parent.transform.position.y;
        float rotationZ = parent.transform.rotation.z;

        // 回転の適用
        glTranslatef(x + spriteWidth / 2.0f, y + spriteHeight / 2.0f, 0);  // 回転中心をスプライトの中心に
        glRotatef(rotationZ, 0, 0, 1);  // Z軸周りに回転
        glTranslatef(-(x + spriteWidth / 2.0f), -(y + spriteHeight / 2.0f), 0);  // 元の位置に戻す

        // テクスチャの描画
        glEnable(GL_TEXTURE_2D);
        glColor4f(1f, 1f, 1f, 1f);

        // テクスチャを有効にして、イメージの座標とサイズを指定
        glEnable(GL_TEXTURE_2D); // テクスチャを有効化
        glColor4f(1f, 1f, 1f, 1f);// 色を白に設定 (テクスチャそのままの色で表示)

        // 四角形を描画 (テクスチャ座標と画面座標を対応付け)
        glBegin(GL_QUADS); // 四角形を描画する
        glTexCoord2f(0, 0); glVertex2f(x, y);  // 左上の頂点 (テクスチャ座標0,0と画面座標)
        glTexCoord2f(1, 0); glVertex2f(x + spriteWidth, y);  // 右上の頂点 (テクスチャ座標1,0と画面座標)
        glTexCoord2f(1, 1); glVertex2f(x + spriteWidth, y + spriteHeight); // 右下の頂点 (テクスチャ座標1,1と画面座標)
        glTexCoord2f(0, 1); glVertex2f(x, y + spriteHeight); // 左下の頂点 (テクスチャ座標0,1と画面座標)
        glEnd(); // 四角形の描画を終了

        // テクスチャの使用を終了
        glDisable(GL_TEXTURE_2D); // テクスチャの無効化
        glBindTexture(GL_TEXTURE_2D, 0); // テクスチャのバインドを解除

        // 行列を元に戻す (PushしたものをPopで復元)
        glPopMatrix(); // モデルビュー行列を元に戻す
        glMatrixMode(GL_PROJECTION); // 投影行列の設定モードに切り替え
        glPopMatrix(); // 投影行列を元に戻す
    }
}