2015年09月18日

状態検証の追加方法

0232で実装した状態検証プラグインの作り方について少々説明しておこうかと思います。

以下、付属の CSスクリプトプラグインを用いた作成方法を紹介します(通常のプラグイン作成の場合は自前で初期化を行う必要がある程度で後は同様です)

■作成手順
1. CS(C#)スクリプトを開き、メニュー[ファイル]-[新規作成-状態検証]を選択(→編集タブが一般形式へ移行/コードが自動的に変更)
2. 検証コードを追記
3. ビルド確認(F6)を行いエラーがなければ、[ファイル]-[プラグインDLL生成]でDLLファイルへ変換し保存
4. PMXエディタを再起動し、追加した状態検証が正常に動作するかチェック

■検証コード
CheckPmx() 処理に渡される PMXデータを適宜調査し、検証結果を PECheckResult データとして返すことで状態検証へ結果が表示されます。

●PECheckResult
Text : 状態検証に表示される結果文字列(string)
Filter : ○/△/×にそれぞれ相当するフィルタ数値(int) ○=0/△=1/×=2

●IEnumerable<PECheckResult>
検証結果は列挙子に包んで返します。よって一つのプラグイン処理で一度に複数の検証を行うことができます。実際のコードでは PECheckResultの配列やリストなどを用いる他、yield return を使って一つずつ結果を返すことも可能です。


■コード例
※参考用なので実用性はありません。

●モデル名が "初音ミク" であるかチェック
public class CheckerClass : IPECheckerPlugin
{
public IEnumerable<PECheckResult> CheckPmx(PEPlugin.Pmx.IPXPmx pmx)
{
if(pmx.ModelInfo.ModelName == "初音ミク") {
yield return new PECheckResult() { Text = @"○ モデル名は ""初音ミク"" です.", Filter = 0 };
}
else {
yield return new PECheckResult() { Text = @"× モデル名が ""初音ミク"" ではありません.", Filter = 2 };
}
}
}


●全ての親ボーンがあるかどうか/全ての親ボーンが先頭であるかどうかを同時にチェック
public class CheckerClass : IPECheckerPlugin
{
public IEnumerable<PECheckResult> CheckPmx(PEPlugin.Pmx.IPXPmx pmx)
{
int bx = -1; // 対象ボーンのIndex
for (int i = 0; i < pmx.Bone.Count; i++) {
if (pmx.Bone[i].Name == "全ての親") {
bx = i;
break;
}
}

var r = new PECheckResult[] {
new PECheckResult(){ Text = "○ 全ての親ボーンが含まれます.", Filter = 0 },
new PECheckResult(){ Text = "○ 先頭ボーンは全ての親ボーンになっています.", Filter = 0 }
};

if (bx < 0) {
r[0].Text = "× 全ての親ボーンが含まれません."; r[0].Filter = 2;
}
if (bx != 0) {
r[1].Text = "× 先頭ボーンが全ての親ボーンではありません."; r[1].Filter = 2;
}

return r;
}
}


●Jointが剛体間に位置しているか簡易チェック
public class CheckerClass : IPECheckerPlugin
{
public IEnumerable<PECheckResult> CheckPmx(PEPlugin.Pmx.IPXPmx pmx)
{
// null指定で検証無効
if (pmx.Joint.Count == 0) { return null; }

var list = new List<int>();
for (int i = 0; i < pmx.Joint.Count; i++) {
var j = pmx.Joint[i];
if (j.BodyA == null || j.BodyB == null) { continue; }

// 剛体位置(xyz)を小〜大で範囲分け
V3 max = V3.Max(j.BodyA.Position, j.BodyB.Position);
V3 min = V3.Min(j.BodyA.Position, j.BodyB.Position);

// Joint位置が両剛体の外側にある場合(X/Yのみ判定)
if (j.Position.X < min.X || max.X < j.Position.X || j.Position.Y < min.Y || max.Y < j.Position.Y) {
// Indexをリストへ追加
list.Add(i);
}
}

// 先頭で通常のreturnを使っているのでyield returnは使えません
var r = new PECheckResult();
if (list.Count == 0) {
r.Text = "○ 全てのJoint位置は関連剛体間に配置されています."; r.Filter = 0;
}
else {
r.Text = "△ 次のJoint位置は関連剛体間に配置されていません(X/Y範囲のみ/Index表示) -> " + string.Join(",", list); r.Filter = 1;
}
return new PECheckResult[] { r };
}
}

※Joint位置は必ずしも剛体A-Bの間にある必要はありませんので、↑の検証自体には大きな意味はありません。


■まとめ
というような感じでエディタのソース内にも状態検証コードがずらずらと並んでいたりします。

単純な検証でも実際のコード作成は色々面倒なことが多いので、誰でも簡単に思った通りのものが作れるわけではありませんが(複雑な検証であれば尚更)、このように必要に応じて拡張自体は一応行うことができるようになっていますよ、というお話でした。

以上

posted by - at 22:19| PMX | 更新情報をチェックする

2015年08月30日

0232

■更新内容

・状態検証簡易フィルタリング
・任意の状態検証項目の追加(プラグイン実装)

以上


不具合修正がてらのちょっとした機能追加です。

状態検証を ○/△/× で表示分けできるようにしておきました。

合わせて任意の検証項目を追加できるよう機能修正(フィルタがあれば見落としも減るので項目を増やせるようにしても大丈夫かな?と)

といっても検証方法は全てプラグインコードで書く必要があるので「誰でも気軽に」というわけにはいきませんけどね。

※一応、CSスクリプトプラグインでも作成すること自体は可能です(通常プラグインとは異なる仕様なので実行はできません/DLL変換後要再起動)

あと状態検証プラグインは昨今の Cプラグイン仕様ではありませんので、細かくデバッグなどを行いたい場合は、Cプラグインにて検証部分を作成→状態検証プラグインへ移植、といった手順で作成してください(インポート/エクスポートと同様)


以上

posted by - at 21:12| PMX | 更新情報をチェックする

2015年07月31日

0231

■更新内容

・x86(32bit)及びx64(64bit)環境への個別対応(アプリケーション構造の改定)
・32bit版/64bit版 同一パッケージ化
・プラグイン/データフォルダの外部参照仕様
・VMDView配置変更(PMXエディタ内からの呼び出しのみ)
・デバイス管理の共有化(メモリ使用量の低減)
・マウス/キーイベント処理の対応(PmxViewのみ/Cプラグイン)
・UIモデル描画及び関連イベント機能の新設/プラグイン機能実装(Cプラグイン)
・メモリ管理(Bitmap)テクスチャ制御仕様(UIモデル/関連プラグインのみ)
・View/System関連処理(Cプラグイン)
・選択機能無効化(PmxViewのみ)
・画像ボード追加/簡易ものさしプラグイン(UIモデル仕様)

以上


お久しぶりの更新です。久しぶりすぎて前回がいつだったのか全く思い出せませんが...まあいいでしょう。

基本的な編集関係の機能については別段変化ありませんが、全体的にファイル構造などが変わっているので、バージョンアップ時にそのまま上書きなどしないようご注意ください。


●32bit版と64bit版

PMXエディタを作り始めた頃の VisualStudioExpress(VS) では混在作成などは非常に面倒でしたが、昨今の VSならそれほど大変でもないので、両対応になりました。

同一パッケージ化も発想を変えたら案外簡単にできてしまったので、そのまま採用しています(ファイルサイズを見てはいけない)

32bit版と64bit版の違いについては、

32bit版は起動が速い/メモリの使用量は最大で 2Gまで/物理演算が遅いかも/なんか細かい不具合があるかも

といった程度です。ぶっちゃけ起動時間の問題から、64bit版(従来仕様)を使うことはほとんどなくなったかもしれませんね。

※起動時間のほとんどはForm部品(システム側で用意されているUI)の初期化処理なんですが、64bit版だとほぼ倍の時間がかかります(酷い仕様だ)

※これ以上の起動時間の改善もできないことはありませんが、特にPMDエディタ時代から引き継いだプラグインの仕様により根本的な改善は難しいという感じです(バッサリ切り捨ててもいいなら...)

●メモリ使用量の低減

でかいテクスチャファイルを多用するモデルではそこそこ違いが出るかもしれませんが、通常の運用では大して差はないかと思います。

ちなみに 32bit版は常用でも 1〜2割程度?メモリ使用量が少ないようです。ただし 2Gの壁にはご注意ください。

●VMDView

お亡くなりになりました...まあ正確には PMXエディタ内部からの呼び出しのみになったわけですが。

正直内部更新の度に一々テストとかしてられないので仕方ないですね(物理演算の確認は TransformViewで十分)

●プラグイン機能の拡充

イベントとかシステム関係とか UIモデルとか色々機能は増えてますが、このご時勢、わざわざ使いこなそうと思う方がいるのかな?という疑問は尽きません。

あと基本的に Cプラグイン(PMXエディタ専用のプラグイン)の拡充なので、未だに「PMDエディタでも動くプラグインじゃなきゃダメ」派には全くもって興味のない更新内容かもしれません。

●UIモデル

個人的な趣味と実験を目的とした新しい機構とプラグイン機能セットです。

「何ができるのか?」 と問われれば 「発想次第でなんでもできるよ」 と答えるぐらいのものではありますが、まあこれもそこまで力を入れて使われるのは難しいのではないかと思わなくもありません(基本的に最低限の機能セットしか用意されていませんので)

簡単な利用例については、新たに追加された「画像ボード追加」「簡易ものさし」の両システムプラグインを使ってみるとよいかと思います。

※終わりのない不具合修正に疲れたので一旦公開しておきます。イベント関係は色々不備もありますが、致命的なもの以外は仕様という名の...


といったあたり今回の更新でした。

今回といっても次回がまたどうなるかは全く不明ですけどね(これが最後かもしれませんし数年後かもしれませんし明日かもしれません)

※ブログは かんこれまみれ になって久しいですが、といって他のことを何もやっていないわけではなかったりも(エディタの改修もちまちまと)。まあ かんこれも既に演習ぐらいしかやってませんけどね(一日30分程度)

以上






...そういえば Win10については特に確認してませんが、MSが変なことしてなければ問題になることはないかと思います(インターフェイスなどの見た目部分は諦める)

というか当然ながら Win7以外では起動チェックしてませんので 対象環境:Windows XP以降(32bit/64bit) というのも本当かどうかは不明です。色々やってダメなら諦めましょう。

posted by - at 21:36| PMX | 更新情報をチェックする