作者用メモ
Beta.05A Rev6 からの続き
MMF Application 内に作成した複数の Frames 間をイベントで移動する際に、エクステンション内部で Action Loops の回数が正常に取得できなくなる現象を複数確認。
サンプルファイルに同包した TEST_jump_to_frame.mfa で動作テストを行った。05A rev6 では問題が解決済み。ただし原因が不明。
CF25 のイベント作成時に行う消極的回避策はあったが根本的解決にならないため、エクステンションの内部仕様を点検。Action Loops を取得する仕様を一部廃止、使わなくても作れる機能だったので利用しないことにして解決。
Beta.05B rev5 で解決済み、Action Loops の安全な取得が可能になっている。
Beta.05A Rev6 公開直前、HWA で動作テストしなかったことに気がつく。急いで動作テストする。動作を滑らかに見せるため V-Sync 有効にする必要性。その他、フルスクリーンモードで動かすと生じる余白がデフォルト値だと白なので、アプリケーション実行中の背景も白だと画面境界が全く識別できない。Objects Control の Motion である Wrap も Flip もフルスクリーンモード時に盛大バグってる?これかなり焦った。でも勘違い。
05B_rev6 以降、Objects Control は HWA ( DX9 + Shaders )が必須に。Shader 指定は無くても動きますが、描画関連の一部機能がそれ以外の環境では動作しません。特に DX8 は対応できないので Shaders も含め DX8 系は全部非対応です。一見乱暴な話にも聞こえますが、実際それぞれ描画仕様が異なるため、DX8 と DX9 で対応コードをそれぞれ書かないといけなくなるので作業量が増えます。
動作テスト中に Runtime Option から解像度変更オプションを一時試したせいか、CF25 Application のテストビルド時に Application Window の見た目が小さくなった。
済:高 DPI モニタ環境でテストビルド時にウィンドウが小さくなるトラブルとその解決策
Wrap と Flip
05A rev6 から Control Motions に Wrap と Flip が実装された。基本動作チェックのために作られた自動操作用 Motions である。動作を停止したり再度動かしたりする基本命令は「動作コントローラ (Motion Controller)」を使って By Name (正式には By Motion Group Name) 系命令で操作をする。
「By Name」というのはオブジェクトの名前を指定して動作を停止したり再開したりする機能のことで CF25 の標準機能にある 「Create By Name」 の動作コントローラ版というコンセプト。「By Name」の REGEX ECMA における正式名は「By Motion Group Name」、動作に任意の名前を付け「動作グループ」を作りグループ単位で制御をする。個を区別する名前をつければ特定オブジェクトだけを操作対象にもできる。
名前使って操作することに意味あるのか
作者にもまだしっかり完成形が見えていない。動作コントローラを操作するのに名前を利用する必然性は無いのかもしれない。しかし、ようやく遠くにあるけど、遠くにあるんだけど届きそうな、まるで遠くにこう、船で言ったら、島影がようやく見えてきた、これなら行けるかもしれない、と。
テロップ「おぼろげながら浮かんできたんです 46という数字が」
ただ By Name で動作コントローラを操作できれば、「動作グループ」という概念でオブジェクトを区別して操作できる。そしてグループをゲーム実行中に作ることもできる。特定の命名規則で作られた識別子を正規表現で区別したり抽出もできる。代償として検索コストは高くなるだろう。
本当に便利になるのかについてはもっと機能実装を進めて実際に動かしてみないと作者にもよくわからない。
- Stop は名前を指定してオブジェクト動作を一時停止する。
- Toggle は名前を指定してオブジェクト動作を停止・再開を切り替える。
- Reject は名前を指定してオブジェクトを動作コントローラから削除する。
- Delete は名前を指定してオブジェクト動作コントローラから削除し、同時にオブジェクトを破壊する。
現時点で By Name 命令形は 4 つの基本操作を実装されている。「名前を使って何かする」という基本コンセプトおよび機能実装なので、あるいは「名前を使わない」動作コントローラはまだ作っていない。
これまで実装された Objects Align とか Objects Control は全て By Name コンセプトで作られていない。特に実装されたばかりの Motions である Horizontal Flip と Wrap はオブジェクトの固定値を使って登録・管理されてるので By Name と一切関係が無い。
REGEX ECMA の動作コントローラに実装されている「現在の By Name」は「個」を区別するための機能ではなく「群」を区別する機能である。「群」と「群」を合流させて新しい「群」を作ったりあるいはスワップしたりとかを考えている。
将来的には「個」を区別する機能としての実装も考えたいのだけど、それはまだ先のお話。
個を区別するための「名前」をつければ良いだけだと気がついた。便利だな名前。
Beta.05B でやるべきこと
まずは基本動作に円運動を実装したい。円運動の実装中に Sine Wave とか副産物もできるだろうから Motions のパターンを増やすことができる。
現在 Beta.05B rev0 からリセット・リスタートだが、C++ コードも Class を使った実装に切り替えている。正規表現のコード部分は極力触らず新規作成される Objects Control 及び既存 Objects Align の Class 化を行う。
ドキュメント作成用:CSS framework 候補一覧
Beta.05B rev3 を公開
Beta.05B シリーズは MISC. を正式機能に昇格したことによって機能的にもコードの量的にもそれなりの規模になってしまったため、エクステンションの仕様などを再点検しながら Class 化に対応できるかなどを検討していった。
Class はなんとかなったが正規表現関連機能に影響無いように作る必要性、Beta.05A Rev6 で間に合わなかったが Beta.05B Rev3 からは互換性を一度大胆に切って、コードや機能が増えた場合でも対応できる拡張性を備えるようにした。Beta.05C にはまだ移動せずに Revision を重ねながら基礎工事を地道に続けていく予定。
Beta.05B rev3 はこれまで統一感の無かったメニュー表記改善にも気を配った。
Flip や Wrap は Direction を利用して移動方向に応じたアニメーション表示が自動で切り替わるようになっている。
Beta.05B rev4 を公開
Reject に確認されていたバグを修正。デバッグ用にコントローラで管理している Motion Group から基本情報を取得して表示するサンプルを作った。
Motion に応じて表示される基本情報は異なる。単純な Flip や Wrap は X 軸しか変更していないので X-Speed しか表示されないなど。座標は各自取れるだろうから省略。
Beta.05B rev5
Menu を修正。これまでは分類上 MISC. の直下に Objects Control が入っていたが、rev5 以降は正式機能として Objects Control という分類を MISC. から独立させた。その結果 MISC. に含まれる Action は無くなったので MISC. が Action Menu から消えた。Expressions Menu には MISC. 所属機能が残っています。
rev5 から Motions が By Name 命令で実装開始。ユーザ指定の任意名を使って動作コントローラにオブジェクトを登録可能になっています。今後のリビジョンでは By Name 命令形の Motions しか作らない予定なので、現在 Menu 画面を再構成しつつ、既存の Flip と Wrap Motion は一度消去して By Name 命令形で実装やり直しを検討。
動作互換性がここでまた一部無くなりますが、Flip と Wrap だけが By Name から独立したメニュー構成になっている現状はユーザを混乱させる。By Name のメリットがまだハッキリしないけど、ある程度機能を充実させないと効果が発揮できないはずなので「とりあえず作って動かしてみる」の精神で。
操作できるオブジェクトの数
リストに上限を作っていないのでメモリが許す限りリスト自体は作成しオブジェクトを登録できるが、問題はオブジェクトを操作できる実用的な上限数がどの程度になるのか。
Flip と Wrap で実験してみたが操作オブジェクト数は 200 を超えてもまだ全然余裕があった。環境次第なので普遍的な数字ではないが、実験環境は GPU がオンボードだし主に CPU の性能依存で出した数値である。
作者的には 100 以上のオブジェクトを安定動作できればと考えていたので、もうちょっと全体機能が充実してから改めて上限を測る予定だが作者の考える「実用性能要件」は現状満たしている。
また互換性が一部…
やっちまった感。今回はあまり範囲大きくない、しかし Flip と Wrap など Motions が互換性を失う事故。Align は無事。動作コントローラに追加機能を実装中やらかしていた模様。上手くいかない…どうやっても後から機能追加すると関数の JumpTable に影響が出るので互換性を失ってる。
とりあえず JumpTable をなるべく維持する作り方にはなっているので、ベータ版である今こそ互換性が切れることには目をつぶるしかない。
諦めた
動作互換性はベータだし切れるものということで決着。今は亡きジョブズも言ってた気がする。カップラーメンは 3 分待たなくても食べて良いのだと。
05B_rev5 が最終段階
一週間位トライアンドエラー繰り返して悩んでた描画関連機能は本家フォーラムで defisym と Yves の助けを借り、なんとかなった。どう考えてもドキュメントが無いすぎる。わからないことはどんどんフォーラムで聞くしか無い。なぜか返信も速い。解決法難しすぎで解決しない場合もあるが。とりあえず分かったのはエクステンションも手が届かない機能というのは一部ある、ということ。そして描画関連は互換性を最大限求めるのは無駄、下位互換性を切ってでも自分の実装したい機能を実現できる環境のみ真っ先に対応すれば良い、でないと完成しない。
ドキュメントはたぶん Yves が一元的に管理していて過去に共同経営者だった Francois も描画機能は Yves にほぼ任せていたというログが残っていた。Francois でも分からないかよはショックだったが、ソースヘッダー眺めてどういう機能かを想像するにしても前提知識がないと無理な部分が多い。コード自体は難解ではないが使い方が一切書いてないというジレンマ。
デバッグ機能を強化
描画関連で苦労していた間にデバッグ情報の出力機能を少し強化できた。
省略語が多い。AVE とか AG とかは自分で考えた省略語ではなく Allie を参考にした。生命科学分野の略語なのでプログラム的な略語とは違うが、査読の役に立つでしょってことでヨシ。
Virtual Wall
Flip と Wrap に Virtual Wall という機能を付けた。範囲指定機能である。初回は数値入力をなるべく少なくなるように設計しているので Flip 動作でユーザが必要な入力パラメータは移動速度だけ。範囲指定はデフォルトがウィンドウサイズになっている。これを後から変更することができるというもの。TLRB というのは Top、Left、Right、Bottom の略。いろいろ検討した結果 4 つの数値を必要に応じて後から上書きする命令が 4 つ増えた。
コントローラには今後 X|Y-Speed の上書きやポジションの上書きなど、名前指定でパラメータを自由に上書きする機能を順次実装していく。その先駆けが Virtual Wall になった。
名前指定がない場合は全オブジェクト対象の命令に
新しい仕様として動作コントローラに名前を指定しなかった場合、という動作を加えた。By Name 命令形は基本的にグループ名を指定して使うものだが、名前を入れなかった時は動作コントローラで管理している全オブジェクトを対象に、ループを回す。
例えばグループ名を使って Delete 命令を出せば指定されたグループだけが消去される、名前を指定しなかった場合、全部消去。
Set Alpha-Blendig Coefficient Param 命令
名前指定された管理オブジェクトを対象に、入力されたパラメータに応じてオブジェクトを半透明化する。パラメータは 0 〜 255 で 0 の場合は透明化しない = 表示|可視化。255 の場合、完全透明化される、結果オブジェクトは非可視化。
CF25 は描画機能を標準で 3 つのモードに対応、DLC を加えると 4 つになる。DLC を除いた CF25 標準である描画モードはスタンダード・DX8・DX9 である。
スタンダードは CPU 依存の描画処理機能で 2D 用のマルチメディアライブラリである SDL をベースに作られている。実質 SDL である。GPU を利用しないため動作互換性は非常に高い。実用アプリとかゲーム以外を作るときはスタンダードにすると消費メモリも少なく済む。
次に Microsoft の DirectX だが、DX8 と DX9 に対応している。どちらも化石に近いが DX9 のみ実用性ある。
動作コントローラの半透明化指定機能について、DX9 のみ対応、加えてシェーダ指定が必要。DX9 に対応したシェーダだったら基本的に何でも良い。今は Alpha-Blending Coefficient を利用したいだけなので DX9 対応シェーダだったら種類は問わない。無くても半透明化機能が無効になるだけ。ただし DX8 では動作が重くなる可能性。
05B_rev6 を準備
05B_rev5 の機能は現在ここまで、これに後少し機能を実装してデバッグしたものを 05B_rev6 として公開する予定。rev4 と動作互換性が切れてしまったので、それならもう少し機能を増やして公開したい。
05B rev6 を公開
結果的に Motions の機能を大幅に増やした。動作テストほとんどやってないがたぶん動く。
動作は縦・横の区別をしっかり付けることにした。その代わり Wrap と Flip はフラグ切り替えだけなので同じ動作タイプという分類にした。Horizontal と Virtical という二つの大きなメタ動作タイプの中に Wrap と Flip が内包されてるけど、Wrap と Flip はメタ動作タイプでは区別が付かない。つまり Wrap も Flip もメタ動作タイプのサブ機能になった。
Horizontal の中に Wrap と Flip 、Virtical の中に Wrap と Flip がある。こんなイメージ。
メタ動作 | Motion-ID | サブ機能 1 | サブ機能 2 |
---|---|---|---|
NULL | 0 | – | – |
Horizontal | 1 | wrap | Flip |
Virtical | 2 | wrap | Flip |
Horizontal Sine Wave | 3 | wrap | Flip |
Virtical Sine Wave | 4 | wrap | Flip |
Orbital | 5 | XY | Target |
今後はメタ動作に「Orbital」と「NULL」が加わる予定。「Orbital」は周回機動、「NULL」は動作タイプを持たない空っぽの型。動作定義が無いので勝手に動かないが、あとから動作定義を与えれば動き出す。オブジェクトを増やしても NULL は負荷が少ない、移動量をゼロに指定するだけだとモーションとしての定義は機能を残しているので NULL よりも負荷は高くなる。名前だけコントローラに登録して負荷が少ない状態で維持したい時に「NULL」を指定すると良い。
「Oribtal」というメタ動作には二つ以上のサブ機能が含まれる予定。今の所一つは指定されたオブジェクト自身の XY 座標を参照してそれ中心に動く「Around XY」。そして指定されたターゲットを中心に周回する「Target」。もちろんターゲットが位置を移動した場合それに追従して位置変えながら周回する。rev6 公開版には未実装だがメニューだけ先行して作ってある。
05B_rev7 Virtual Wall : AUTO SETUP
05B rev6 から実装された Virtual Wall( 壁 )は By Name 命令形なので CF25 の Action Loop とループ処理には互換性が無い。インスタンスが複数ある場合、それらを REGEX ECMA の動作コントローラにオブジェクト登録する際には必ず Action Loop が発生する。これは避けられない仕様。しかしこのアクションループ中に Virtual Wall の設定も済ませたい場合がある。しかし By Name 命令形とは互換性がないので Action Loops の先頭に処理されるオブジェクトの分しか「壁」が設定されない不具合が出ることまでは確認済みだった。
このため rev7 では新しい命令系として Action Loop に対応した「Virtual Wall : AUTO SETUP」を実装済み。rev6 では Horizontal と Virtical を基準にしたメタ動作が今4種類ある。この4種類にはそれぞれサブ機能として Wrap と Flip があるので合計8種類の Motions に対して「AUTO SETUP」は値送信できる。
Virtual Wall : AUTO SETUP とは
メニューへのアクセスは rev7 で再構成し直したので rev6 とは異なります。
Auto Setup は 8 種類の Motions に1つのインターフェースで対応した値送信機能として CF25 の Action Loop に対応している点が先行して作られた By Name 命令系とは異なっています。
CF25 の Action Loop はエクステンション開発者が PARAM_OBJECT というオブジェクトインスタンスの固定値を CF25 から受け取る命令を送信すると必ず実行されます。Action Loop はオブジェクトインスタンスの数に応じて繰り返し実行され Action Loop 実行イベントと同じ行にパラメータ変更命令を発行すると、互換性がある場合は Action Loop と連携できます。
By Name 命令形はエクステ開発者が独自に作ったループ処理なので Action Loop とは互換性が無く、Action Loop と連携するためには Action Loop に対応したループ処理をエクステ開発者が作る必要がある。つまり Auto Setup というのは Action Loop に対応した By Name 命令系との互換ループ処理のことです。
なるほど分からん
使い方はむしろ簡単なのです。Action Loop に互換性が無い場合、まず行を分ける。
次に Auto Setup は互換性があるので同じ行にイベントを書けます。
Auto Setup は互換ループ処理なので Action Loop と連携でき、送信された二つの値を 8 種類の Motions 向けに自動振り分けします。
ユーザは利用されているモーションタイプを気にせず値を送信するだけで済み、さらに送信された値の内容をエクステが解析して Top , Left , Right , Bottom に自動振り分けするため、例えば右と左の値を間違えて送信したとかユーザの誤操作・誤送信をフォローする機能も内包されています。By Name 命令形よりも細かく指定は出来ないが、手っ取り早い、これが売りです。
05B_rev7 : 05B Final
05B_rev7 の目処が立ち同時に 05B を 05C にアップする決定。波乱万丈だった 05B シリーズは rev7 で完結。名称とかメニューインターフェースはまだコロコロ変わるかもだが基本設計や基本機能がほぼ固まったという判断ができたので 05B を終了することに。
05B rev6 と rev7 で一部機能の互換性が失われたので rev6 に添付された動作サンプルファイルは rev7 と同時に消してください。05B rev7 までに実装された機能が基本的に 05C で後方互換性を維持されます。サンプルファイルとかは 05B までの機能は 05C で常に動くようにしたい。Align は互換性維持ができているのでサンプルファイルも揃ったけど、それ以外は機能仕様順番都度変わるのでサンプルを作れなかった。
05C 以降に実装される機能はやっぱり細かいリビジョン上がる度に互換性が切れると思います。05C の最終バージョンが出るまでは 05C の新機能はなかなか安定しないでしょう。
モーションに Orbital と Null を追加
rev7 で円動作「 Orbital 」が実装されました。Orbital は circulation movement つまり「円運動」ですがわざわざ「 Orbital 」と名付けたのは力学系ではなく宇宙空間を周回する「衛星」をイメージして機能実装していたからです。
周回の中心となるターゲットを入力し半径・角速度を入力するというプロトコルなので、中心座標の入力不要が特徴。座標はターゲットから得るから入力が不要になるんですね。ターゲットが動いた場合でも追従するので動作と別の動作を合体させることができます。
さてここまでやってイベントラインはどうなるかというと、以下
計算不要、この後さらに改良して 2 アクションで実現可能になりました。
Orbital の初期配置と動作仕様
Orbital は円運動の中心座標を自己の XY とするかターゲットの XY とするか、2種類が実装されています。どちらも共通した仕様として「 Clockwise 」があります。円運動する具体的なイメージとして作者は「時計」を意識しながら作っていたので Orbital の動作も「時計」を模しています。
初期配置は時計の 0 時、進行方向は AVE※ にプラス値を与えると時計回り(右回り)など。
※ Angular Velocity = 角速度の略語 = AVE
時計を模すために円運動の計算式を標準より一部変えてつまり少し余計なことしてるのですが、動き出してしまえば変わりません。
一番左は動作を停止してあるのではなく AVE (角速度)の値を 0 にしてあるため停止しているように見えます。円運動の開始位置はデフォルト値から変更できませんが、今後のアップデートで変更可能になります。
Null Motion
メタ動作に追加されたのは「 Orbital 」以外に「 Null Motion 」というものがあります。前述の「 Orbital 」でも利用されていますが、動作タイプを持たないかわりにコントローラに登録しても少ない負荷で座標を提供することできます。
「NULL MOTiON」は今後利用機会を増やす予定です。05C 以降には「 One Time Motion 」や「 Life Time 」が実装され、役目を終えた後にオブジェクトを破壊するかコントローラへの登録を維持したままモーションだけ破棄して「 Null Motion 」に変更するなど「動作定義を持たないオブジェクト登録」を活用するつもり。
rev7 公開
rev7 用のサンプルファイルを少し作れたのでそれらを足して公開。rev7 のサンプルには特別版として「アニメーションフリー素材やすらぎ庵」バージョンが含まれます。
実動作に当てはめた様子を見たかったのでアニメーション素材としてやすらぎ庵から動画 GIF を利用させてもらっています。まだ素材の扱い方が雑なので申し訳ないからもうサンプルも少し整理して次回 05C で新しくアップします。05B rev7 は 05B シリーズの最終、次回から 05C へナンバリングが変わります。だいたい計画通り実装終わったのでここから少しアップデート期間を長めにとります。05C は二ヶ月位かけて最終版を来年2月予定。
サンプルファイルは簡単なもの作って添付しましたが今回は「デバッグテンプレート」という雛形用意してあります。デバッグテンプレートはデバッグ情報を表示するテンプレですが、これにモーションをテーマごとに作っていくと動作サンプルが大量生産できる。
モーションのサンプルファイルはアイディア出しながら少し見栄えが良いもの作りたいので今準備中。前に見たローテーションメニューは 05B の機能でおそらく半分くらいは自動化できるのかな?あとは開始角度の指定と角度を指定した移動動作組み込めば良いはずなのでそれらは 05C で実装されます。05C ではそれ以外にもデフォルト動作をカスタムするパラメータ送信機能が増える予定。
Pingback: Beta.05A 更新履歴|仕様変更など – CF2.5 ガイド
Pingback: REGEX ECMA Beta.05C rev1 Public – CF2.5 ガイド