マウスの動作に対する処理は、2つのフィードバック関数によってサポートされています。Patch Editor.jslサンプルスクリプトでは、これらの関数を使って、点をドラッグ&ドロップする例を示しています。そのスクリプトの一部、マウス動作に対するコールバック関数について、以下に説明します。スクリプトを実行するには、JMPの「Sample Scripts」フォルダの「Scene3D」フォルダにある「PatchEditor.jsl」を開きます。
topClick2d = Function( {x, y, m, k},
dragfunc( x, boxhigh - y, m, 1, 2 );
1;
);
frontClick2d = Function( {x, y, m, k},
dragfunc( x, boxhigh - y, m, 1, 3 );
1;
);
rightClick2d = Function( {x, y, m, k},
dragfunc( x, boxhigh - y, m, 2, 3 );
1;
);
Click3d = Function( {x, y, m, k, hitlist},
If( m == 1,
If( N Items( hitlist ) > 0,
CurrentPoint = hitlist[1][3], /* リスト内の最初の行列が最も近接している。行列の3番目の要素はID */
CurrentPoint = 0
);
makePatch();
);
0; /* 0を戻すと、最初のマウスの押下時だけ処理。ドラッグ中も処理する場合は1を戻すようにする(その場合、マウスを放すと処理が終了。天体球は表示されない)。 */
);
/* 3つのClick2d関数から共通して呼び出される関数 */
dragfunc = function( { x, y, m, ix, iy}, /* ixとiyは、座標を含む行列において、X、Y、およびZの列を示すためのインデックス */
If( CurrentPoint > 0,
points[CurrentPoint, ix] = (x / boxwide) * (orthoright - ortholeft) + ortholeft;
points[CurrentPoint, iy] = (y / boxhigh) * (orthotop - orthobottom) + orthobottom;
makepatch();
)
);
2D関数(関数名が「2d」で終わっている関数)を呼び出すときの引数は、X、Y、M、Kです。
• XとYはマウスの座標です。
• Mは、マウスとボタンの状態を示します。M=0は、マウスが放されていることを表します。M=1は、ボタンが押されたことを表します。M=2は、ボタンが押されたままマウスが移動していることを表します。M=3は、ボタンが放されたことを表します。
• Kは、Shift、Alt、Ctrlの各キーに関連付けられます。K=1はShiftキー、K=2はCtrl(command)キー、K=3はAlt(Option)キーを表します。
3D関数(関数名が「3d」で終わっている関数)も同様の方法で呼び出されます。引数は、X、Y、M、K、hitlistで、hitlistは行列のリストです。
[znear, zfar, id1, id2, id3, ...]
znearは、オブジェクトの近い頂点までの、カメラからのZ方向の距離、zfarは、オブジェクトの遠い頂点までの、カメラからのZ方向の距離です。行列は、znearとzfarの中間ポイントを基準にして近い方から遠い方へと並べ替えられます。リスト内のidは、表示リストに格納したプッシュ名(pushname)、ロード名(loadname)、およびポップ名(popname)の値です。
2D関数や3D関数は、戻り値を使って、マウス処理を継続するかどうかを知らせます。継続する場合には、関数で「1」を戻してください。戻り値が1以外の場合、マウスのトラッキングが停止されます。2D関数と3D関数は並行実行されないので、この機能は必要です。この例とは異なり、場合によっては、2D関数ではなく3D関数でトラッキングされるように、2D関数で0を戻し、3D関数で1を戻すようにしてもかまいません。