テンプレートを替えたい
openFrameworks(以下oF)でアプリを制作するときは、自分はほぼ毎回プログラマブルレンダラを使うし、ofAppの不要なエベントハンドラー系の関数を削除したりしているが、毎回やるのは面倒くさいのでテンプレートを替えられないか調べた。テンプレートというとジェネリックプログラミングのtemplate
と混同を招きかねないがここではemptyExample
として生成したいファイルのことを指す。
Projectのテンプレートの所在
プロジェクトのsrc\
に生成されるmain.cpp
、ofApp.h
、ofApp.cpp
のテンプレートはof_root\scripts\templates
に配置されており、ProjectGeneratorが新規作成の際にコピー操作をする。
よって、Windowsの場合、of_root\scripts\templates\vs\src
にあるデフォルトのテンプレートを書き換えれば目的を達成できる。
ここには様々なテンプレートが用意されており、\gl4.5
などプログラマブルレンダラ用のテンプレートも存在することがわかる。ただしこれらのテンプレートの指定はProjectGeneratorのGUIからはできず、プラットフォームのデフォルトのものが選択されるのみとなる。
変更後のテンプレート
ちなみに自分はこうした。
#include "ofMain.h"
#include "ofApp.h"
int main( ){
ofGLFWWindowSettings s;
s.setGLVersion(4, 5);
s.setSize(1920, 1080);
ofCreateWindow(s);
ofRunApp(new ofApp());
}
#pragma once
#include "ofMain.h"
class ofApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void keyPressed(int key);
private:
};
#include "ofApp.h"
void ofApp::setup(){
}
void ofApp::update(){
}
void ofApp::draw(){
}
void ofApp::keyPressed(int key){
if (key == ' ') {}
}
これより以下は番外編となるが、oFが地味に用意している機能の紹介となる。
PojectGenerator
openFrameworksのProjectを作成するためには、ProjectGeneratorを使うのが一般的かと思う。ProjectoGeneratorはソースを見ればわかるが、frontendとcommandLineから成り立っている。
frontend
Electron(Node.jsとChromiumによるクロスプラットフォームのGUIフレームワーク)によって作られたGUIであり、ProjectGeneratorとして目にするものである。UIの描画と操作の受付を担当しているが、プロジェクト生成自体はcommandLineという別の実行ファイルに移譲しており、これに対してコマンドを発行している。
commandLine
ウィンドウのないCUIツールだがopenFrameworksによって制作されている。Githubからソースを落としてくると、oFと同じようにソリューションファイルからコンパイルができる。ダウンロード版は、of_root/projectGenerator-xx/resources/app/app/
にあるprojectGenerator.exe
が実体。使い方はREADMEを参照するか、ヘルプオプション(--help
または-h
)を加えて実行ファイルをコマンドライン上で叩けば確認できる。
Options:
--help Print usage and exit.
--recursive, -r update recursively (applies only to update)
--listtemplates, -l list templates available for the specified or current
platform(s)
--platforms, -p platform list (such as osx, ios, winvs)
--addons, -a addon list (such as ofxOpenCv, ofxGui, ofxXmlSettings)
--ofPath, -o path to openframeworks (relative or absolute). This
*must* be set, or you can also alternatively use an
environment variable PG_OF_PATH and if this isn't set, it
will use that value instead
--verbose, -v run verbose
--template, -t project template
--dryrun, -d dry run, don't change files
examples:
projectGenerator -o"../../../../" ../../../../apps/myApps/newExample
(create a project called newExample using a relative path for the OF root and the project. note the relative path may be different depending on where this app is located)
projectGenerator -r -o"../../../../" ../../../../examples
(recursively update the examples folder)
projectGenerator -o"../../../../" -a"ofxXmlSettings, ofxOpenCv" ../../../../apps/myApps/newExample
(create / update an example with addons)
CUIを用いたテンプレート作成
このCUIを用いて、例えば自分の制作したオリジナルのテンプレートに加え、必ず組み込むであろうaddonも含めたオリジナルの生成コマンドを作れる。バッチファイルなどに保存すれば便利かもしれない。以下は、引数にプロジェクト名をとって、gl4.5のテンプレートとofxGuiとofxDeferredShadingのaddonを自動選択してプロジェクトを生成するバッチファイルとなる。
cd C:\path\to\of\projectGenerator-vs\resources\app\app
.\commandLine.exe -o"../../../../" -a"ofxGui, ofxDeferredShading" -t"gl4.5" ../../../../apps/myApps/%1
あとは自分でcommandLine自体を改変すれば(oFなので意外と現実的にできそう)、ビルドのための構成なども含めてプロジェクトテンプレートが組めたりして捗りそうではある。