クリエイティブコーディングフレームワークarmosに追加された機能まとめ2017年版

この記事はD言語 Advent Calendar 2017 19日目の記事です.

今年2017年にクリエイティブコーディングフレームワークarmosに追加された機能等を紹介していきます🎉

Mac OS Support

自分がmac book proを使い始めたのでサポートしました. 論理ピクセルと物理ピクセルのサイズが異なるretinaディスプレイへの対応として,interface WindowにframeBufferSize()を追加しました.これは既存のWindow.size()がウィンドウサイズを論理ピクセルで返すのに対し,こちらはウィンドウの物理ピクセルで返します.

頂点座標からの頂点法線情報の生成

armos.graphics.Meshクラスのメンバ関数calcNormal()でスムージングされた頂点法線情報を生成できます.生成された法線情報はMeshのメンバnormalsに保存されます.

シンプルな2Dのグラフィックを表示するexample.

単純な2DのMeshのアニメーションを行うexamples/primitives2dを追加しました.armosに触れる際,一番最初に見ていただくと雰囲気がなんとなく掴めるかと思います.

フォント読み込み機能の実装

https://pbs.twimg.com/media/C8jCzc8VwAAlvFQ.png

Fontクラスでフォントを扱えます.内部でfreetypeを使用しており,フォントのデータをラスタライズしてテクスチャとして描画することができます.

exitApp()の追加

Applicationのinterfaceに追加しました.Applicationの内部でこのメンバ関数を呼ぶことでApplicationを終了させることができます.

リアルタイムの音声入力

音声入力デバイスを扱うクラスarmos.audio.Recorderを実装しました. 実際の使い方はexamples/audiocaptureを参考にしてください.

Colorクラスの仕様変更

従来のColorのRGBAの値はそれぞれ256段階の整数型でしたが,OpenGLとの相性を考え,0から1までのfloat型に変更されました.

generate commandによるテンプレートファイル/フォルダの自動生成機能

armosを使った開発を加速させるCLIツールを追加しました. 以下詳細

glslify support

glslifyを用いてshaderのglslのモジュール化,importができるようになりました. 以下詳細

マルチウィンドウ対応

複数のウィンドウを扱うことができるようになりました.OpenGLのcontextはデフォルトではウィンドウ間で共有されていませんが,アプリケーションの初期化時,Windowを生成する際にコンストラクタへ引数としてcontextを与えることで同じcontextを扱うことができるようになります.

auto config = new armos.app.WindowConfig();
auto window1 = new armos.app.GLFWWindow(config);
auto window2 = new armos.app.GLFWWindow(config);
auto window3 = new armos.app.GLFWWindow(config, window2.context); //share context.

armos.app.mainLoop.register(new MainApp, window1)
                  .register(new SubApp,  window2)
                  .register(new SubApp,  window3)
                  .loop; // call loop function after application and window registations.

実際の使い方はexamples/multiplewindowsを参考にしてください.

MIDI input

armos.communication.MidiStreamを用いることでMIDI信号の入力を扱うことができます.

メンバ関数popMessagesを呼ぶことで受け取ったMIDIメッセージを取り出すことができます. 実際の使い方はexamples/midiinputを参考にしてください.

Reactive Extensions

Rxはじめました.@lempiji氏が開発しているdlang実装のRxを利用させて頂いてます.

現在のarmosのイベントシステムは全てRxに置き換わっており,armos.app.currentObservables()で全てのarmosのイベントのobservableが包含されたCoreObservablesへアクセスすることができます.

マウス入力関係のイベントの追加

Rxの導入によるイベントシステムの刷新に際して,mouse dragとmouse scrollのイベントハンドラをサポートしました.対応するシグネチャは以下の通りです.

void mouseDragged(int currentX, int currentY, int button)
void mouseDragged(int firstX, int firstY, int currentX, int currentY, int button)
void mouseDragged(Vector2f currentPosition, int button)
void mouseDragged(Vector2f firstPosition, Vector2f currentPosition, int button)
void mouseDragged(Vector2i currentPosition, int button)
void mouseDragged(Vector2i firstPosition, Vector2i currentPosition, int button)
void mouseScrolled(float xOffset, float yOffset)
void mouseScrolled(Vector2i position)
void mouseScrolled(Vector2f position)
    

EasyCamのサポート

マウス操作で簡単に視点を操作する機能が組み込まれたcameraの実装です.名前のとおりopenFrameworksのEasyCamと似た挙動になってます.実際の使い方はexamples/easycam/を参考にしてください.

今後の予定

OpenGLのContextを一箇所にまとめる大規模改修

現在,Cinderの設計を参考にしてcontextの管理を局所化する設計変更を行っており,それに伴って既存のRendererのリファクタリングも行っています.影響箇所が多いので開発版のdevブランチに取り込まれるのはもう少し先になりそうです.

映像のサポート

現在ffmpegを用いたVideoTextureを実装しています.また,ライセンスの都合からarmos本体とは別リポジトリで,armosの拡張という形でのリリースを検討しています.途中で上の大規模改修が始まったため,こちらの作業は一時的に中断しており,改修が終り次第再開しようと考えています

ベクタデータの取扱

未着手です.ベクタデータが扱えるようになると,フォントのアウトラインを変形させるような表現等,幅広く応用できそうです.