05. 高度なオブジェクト説明 - hannsi-to/LFJG-LiteFrameJavaGui GitHub Wiki

オブジェクトコピー

これは特定のオブジェクトを別のオブジェクトにコピーできるようにします。 使い方は、まずコピー元のオブジェクトとコピー先のオブジェクトを作成します。 copy 関数を使用しコピー先のオブジェクトにコピーします。実際のコードです。

public class ObjectCopyExample implements LFJGFrame {
    GLRect glRect1;
    GLObject copyGlObject;
    private Frame frame;

    public static void main(String[] args) {
        new ObjectCopyExample().setFrame();
    }

    @Override
    public void init() {
        frame.updateLFJGLContext();

        glRect1 = new GLRect("Rect1");
        glRect1.rect(0, 0, 500, 500, Color.of(255, 0, 255, 255));

        copyGlObject = glRect1.copy("CopyRect1");
    }

    @Override
    public void drawFrame() {
        copyGlObject.draw();
    }

    @Override
    public void stopFrame() {
        glRect1.cleanup();
        copyGlObject.cleanup();
    }

    @Override
    public void setFrameSetting() {

    }

    public void setFrame() {
        frame = new Frame(this, "ObjectCopyExample");
    }
}

適切にコピーが成功したらログに

[2025/06/10 01:27:59.558] [ObjectCopyExample] [Frame] [INFO] 
------------------------------ GLRect Debug Message ------------------------------
	Source: me.hannsi.lfjg.render.renderers.polygon.GLRect
	Type: Copy
	ID: -9223372036854775806
	Severity: Info
	Message: Create object copy: CopyRect1
----------------------------------------------------------------------------------

に出力されます。

オブジェクトキャッシュ

これは複数のオブジェクトを一括管理できるようにします。これを使用すると、忘れている描画処理やクリーンアップ処理を忘れることなく適切に行うことができるようになります。 使い方です。グローバル変数GLObjectCache glObjectCacheを作成して、init関数内でinitGLObjectCache()を使用してビルダーを作成します。そこにいくつか作成したオブジェクトのグローバル変数をglObjectCache.createCache() でキャッスを作成します。

GLObjectCache glObjectCache;

GLRect glRect1;
GLRect glRect2;
GLTriangle glTriangle1;

@Override
public void init() {
    frame.updateLFJGLContext();

    glRect1 = new GLRect("Rect1");
    glRect1.rect(0, 0, 100, 100, Color.RED);

    glRect2 = new GLRect("Rect2");
    glRect2.rect(100, 100, 200, 200, Color.BLUE);

    glTriangle1 = new GLTriangle("Triangle1");
    glTriangle1.triangle(100, 100, 200, 100, 150, 200, Color.GREEN);

    glObjectCache = GLObjectCache.initGLObjectCache()
            .createCache(glRect1)
            .createCache(glRect2)
            .createCache(glTriangle1);
}

drawFrame関数内にはglObjectCache.draw()、stopFrame関数内には glObjectCache.cleanup() を追加してください。

@Override
public void drawFrame() {
    glObjectCache.draw();
}

@Override
public void stopFrame() {
    glObjectCache.cleanup();
}

最終的にコードはこのようになります。

public class ObjectCacheExample implements LFJGFrame {
    GLObjectCache glObjectCache;
    GLRect glRect1;
    GLRect glRect2;
    GLTriangle glTriangle1;
    private Frame frame;

    public static void main(String[] args) {
        new ObjectCacheExample().setFrame();
    }

    @Override
    public void init() {
        frame.updateLFJGLContext();

        glRect1 = new GLRect("Rect1");
        glRect1.rect(0, 0, 100, 100, Color.RED);

        glRect2 = new GLRect("Rect2");
        glRect2.rect(100, 100, 200, 200, Color.BLUE);

        glTriangle1 = new GLTriangle("Triangle1");
        glTriangle1.triangle(100, 100, 200, 100, 150, 200, Color.GREEN);

        glObjectCache = GLObjectCache.initGLObjectCache()
                .createCache(glRect1)
                .createCache(glRect2)
                .createCache(glTriangle1);
    }

    @Override
    public void drawFrame() {
        glObjectCache.draw();
    }

    @Override
    public void stopFrame() {
        glObjectCache.cleanup();
    }

    @Override
    public void setFrameSetting() {

    }

    public void setFrame() {
        frame = new Frame(this, "ObjectCacheExample");
    }
}

出力結果はこうです。

値の変更(VertexBufferObject)

これはinit関数内で設定した値をdrawFrame関数内で更新する方法です。 ただ更新するだけならdrawFrame関数内でrectを呼び出すだけです。

public class ChangeValueVertexBufferObjectExample implements LFJGFrame {
    GLRect glRect1;
    private Frame frame;

    int x = 0;

    public static void main(String[] args) {
        new ChangeValueVertexBufferObjectExample().setFrame();
    }

    @Override
    public void init() {
        frame.updateLFJGLContext();

        glRect1 = new GLRect("Rect1");
        glRect1.rect(x, 0, 500, 500, Color.of(255, 0, 255, 255));
    }

    @Override
    public void drawFrame() {
        glRect1.rect(x++, 0, 500, 500, Color.of(255, 0, 255, 255));
        glRect1.draw();
    }

    @Override
    public void stopFrame() {
        glRect1.cleanup();
    }

    @Override
    public void setFrameSetting() {

    }

    public void setFrame() {
        frame = new Frame(this, "ChangeValueVertexBufferObjectExample");
    }
}

このコードは毎フレームx方向に1づつ移動するコードです。

値の変更(ModelMatrix)

これはdrawFrame関数内で、translateなどの行列操作を呼び出して値を変更する方法です。

glRect1.translate(1,0,0);

このコードは、x軸方向に毎フレーム1づつ移動するようにします。 translate以外にrotateXYZscaleなどがあります。 注意点として、これは座標系しか値を変更できないため、他の色やUVなどは上記のVertexBufferObjcetを使用した値の更新を行ってください。 最後に全体のコードです。

public class ChangeValueModelMatrixExample implements LFJGFrame {
    GLRect glRect1;
    private Frame frame;

    public static void main(String[] args) {
        new ChangeValueModelMatrixExample().setFrame();
    }

    @Override
    public void init() {
        frame.updateLFJGLContext();

        glRect1 = new GLRect("Rect1");
        glRect1.rect(0, 0, 500, 500, Color.of(255, 0, 255, 255));
    }

    @Override
    public void drawFrame() {
        glRect1.translate(1, 0, 0);
        glRect1.draw();
    }

    @Override
    public void stopFrame() {
        glRect1.cleanup();
    }

    @Override
    public void setFrameSetting() {

    }

    public void setFrame() {
        frame = new Frame(this, "ChangeValueModelMatrixExample");
    }
}