Pmdローダーの実装を試みる。
#一番簡単なプラグイン
一番シンプルぽいプラグインを作ってみる。
NodeBrowserでTemplate(Value)をctrl+clickする。
現れたノードを右クリックするとC#のソースエディタが表示される。
namespace VVVV.Nodes
{
#region PluginInfo
[PluginInfo(Name = "MmdLoader", Category = "Geometry", Help = "Basic template with one value in/out", Tags = "")]
#endregion PluginInfo
public class GeometryMmdLoaderNode : IPluginEvaluate
{
#region fields & pins
[Input("Input", DefaultValue = 1.0)]
public ISpread<double> FInput;
[Output("Output")]
public ISpread<double> FOutput;
[Import()]
public ILogger FLogger;
#endregion fields & pins
//called when data for any output pin is requested
public void Evaluate(int SpreadMax)
{
FOutput.SliceCount = SpreadMax;
for (int i = 0; i < SpreadMax; i++)
FOutput[i] = FInput[i] * 2;
//FLogger.Log(LogType.Debug, "hi tty!");
}
}
}
Evaluateが毎フレーム呼ばれると。
- [Input]ISpread FInput
- [Output]ISpread FOutput
#今回必要なプラグイン
Mesh(EX9.Geometry Join)を観察してみると今回必要な入出力はこんな感じになりそうだ。
- [Input]String FilePath
- [Output]ISpread Positions
- [Output]ISpread Normals
- [Output]ISpread TextureCoords
- [Output]ISpread Colors
- [Output]ISpread Indices
入力
#region fields & pins
[Input("Path"
, StringType = StringType.Filename
, FileMask = "MMD File (*.pmd)|*.pmd"
, IsSingle=true
)]
public ISpread<string> Path;
出力
[Output("Positions")]
public ISpread<Vector3D> Positions;
[Output("Normals")]
public ISpread<Vector3D> Normals;
[Output("TextureCoords")]
public ISpread<Vector2D> TextureCoords;
[Output("Colors")]
public ISpread<RGBAColor> Colors;
[Output("Indices")]
public ISpread<int> Indices;
途中dynamic pluginのくせのある動作にはまったがなんとか頂点投入に成功。
- dynamic pluginを編集中に裏から別のアプリで編集したソースを反映する手段が無いっぽい。http://vvvv.org/forum/dynamic-plugin-visual-studio
- dynamic pluginのファイルに他のクラスを入れるとprojectが認識できなくなるっぽい
外部エディタとの連携が悪いのは遺憾ですな。特定のファイルに他のクラスを入れてはいけないというのはWinFormとかでもありましたな。UIのクラスより前に入れては行けないとかだったか。この辺りは使い手が注意する必要があるようだ。
今回のソース。
GeometryMeshLoaderNode.cs
PmdModel.cs
もうちょっとVVVVの流儀がわかったらちゃんとしたリポジトリを作るんじゃないか。
マテリアル反映とかはちょっとやっかいな気がするができんことはないので後回しにしてスキニングに進まねばなるまい。