[openFrameworks] Projectのテンプレートを変更する

# テンプレートを替えたい

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からはできず、プラットフォームのデフォルトのものが選択されるのみとなる。



## 変更後のテンプレート

ちなみに自分はこうした。

```main.cpp
#include "ofMain.h"
#include "ofApp.h"
int main( ){
	ofGLFWWindowSettings s;
	s.setGLVersion(4, 5);
	s.setSize(1920, 1080);
	ofCreateWindow(s);
	ofRunApp(new ofApp());
}
```

```ofApp.h
#pragma once
#include "ofMain.h"

class ofApp : public ofBaseApp{
public:
	void setup();
	void update();
	void draw();
	void keyPressed(int key);
private:

};
```
```ofApp.cpp
#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は[ソース](https://github.com/openframeworks/projectGenerator)を見ればわかるが、[frontend](https://github.com/openframeworks/projectGenerator/tree/master/frontend)と[commandLine](https://github.com/openframeworks/projectGenerator/tree/master/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を自動選択してプロジェクトを生成するバッチファイルとなる。

```create_my_proj.bat
cd C:\path\to\of\projectGenerator-vs\resources\app\app
.\commandLine.exe -o"../../../../" -a"ofxGui, ofxDeferredShading" -t"gl4.5" ../../../../apps/myApps/%1
```

あとは自分でcommandLine自体を改変すれば（oFなので意外と現実的にできそう）、ビルドのための構成なども含めてプロジェクトテンプレートが組めたりして捗りそうではある。