TSXSceneオブジェクトは、シーンのレンダリング、および、シーンの管理を行います
(凡例:
読み取り専用)
| カメラ | CameraFrame | |
| 投影変換情報 | FarZ | |
| NearZ | ||
| FovH | ||
| FovV | ||
| AspectRatio | ||
| ProjectionMatrix | ||
| スクリーン変換情報 | ScreenMatrix | |
| 設定 | SortAlpha | |
| その他 | StateRestorer | |
| BlendOpEnable |
| コンストラクタ | Create |
| デストラクタ | Destroy |
| 座標変換設定 | SetProjection |
| SetViewPort | |
| 描画設定 | RegisterBlendMode |
| 描画 | PushBillboard |
| PushBillboardLite | |
| PushSprite | |
| PushSpriteLite | |
| Render | |
| Clear | |
| その他 | SphereVisibility |
| FlushBBSP |
CameraFrame : TSXFrame
レンダリング時の、視点の位置・姿勢を司るフレームを示します。
FarZ : Single NearZ : Single
遠方クリッピング面、近方クリッピング面までの距離をそれぞれ示します。
遠方クリッピング面より遠く、あるいは、近方クリッピング面より近くにある物体は描画されません。
SetProjectionメソッドで決定されます
FovH : Single FovV : Single
画角(field of view)をラジアン単位で示します。FovHは水平方向、FovVは垂直方向の画角です。
SetProjectionメソッドで決定されます
AspectRatio : Single
ビューポートの縦ピクセル数 / 横ピクセル数 を示します。
SetProjectionメソッドで決定されます
ProjectionMatrix : D3DMatrix
投影変換行列を示します。視野座標系から、正規座標系へ変換する行列です。
SetProjectionメソッドで決定されます
ScreenMatrix : D3DMatrix
スクリーン変換行列を示します。正規座標系からスクリーン座標系へ変換する行列です。
SetViewportメソッドで決定されます
SortAlpha : Boolean
Trueならば、半透明体のソートを描画前に行います。
Falseならば、半透明体のソートを行いません。
StateRestorer : TSXStateRestorer
レンダリングステートを保存、復元するためのオブジェクトです。
BlendOpEnable : Boolean
レンダリンクステートD3DRS_BLENDOPの設定が、この環境で有効かどうかを示します。Trueならば有効です。Falseならば無効であり、常にD3DRS_BLENDOPの値は、D3DBLEDOP_ADDとみなされます。
RegisterBlendModeで新しいブレンドモードを追加するときの参考にしてください。
constructor Create (ADG:TDGCarad; debugName:String = '');
TSXSeneオブジェクトを生成します。
ADGには、使用するTDGCaradコンポーネントを指定してください。
debugNameは、デバッグログに出力される際の、このオブジェクトの名前です。プログラムの挙動とは直接関係ありません。
destructor Destroy;
TSXSceneオブジェクトを解放します。
procedure SetProjection(fov,aspect, nearZ,farZ:Single; setHorizontalFov:Boolean = True);
ビューボリューム(視界)についての設定を行います。
fovで、画角(視線から左右または上下どれだけの範囲を画面に納めるか、という角度)をラジアン単位で指定します。
aspectで、ビューポートの縦横比を、縦 / 横の値で指定します
nearZで、これ以上近づくと画面にレンダレングされない、という距離を指定します
farZで、これ以上遠ざかると画面にレンダレングされない、という距離を指定します
setHorizontalFovがTrueのとき、引数fovは水平方向の画角として設定され、Falseのとき、引数fovは垂直方向の画角として設定されます。
procedure SetViewPort(left,top,right,bottom:DWord);
ビューポート(フォーム内での描画先の矩形)の範囲を指定します。
function RegisterBlendMode(info:TSXBlendInfo):TSXBlendMode TSXBlendInfo = record Sort:Boolean; //Zソートする必要がある //以下、レンダリングステート設定用 AlphaTestEnable:Boolean; //カラーキー処理用、αテスト、FalseならAlphaFuncは無視 AlphaFunc:D3DCMPFUNC; //αテスト用比較関数 AlphaBlendEnable:Boolean; //もし、このメンバがFalseなら、以下の設定はスキップ SrcBlend:D3DBLEND; DestBlend:D3DBLEND; BlendOp:D3DBLENDOP; //BlendOpが設定できるビデオカードのみ end;
infoで示される、新しいブレンドモードを追加します。新しいブレンドモードを識別するための値が返り値に入ります。
TSXBlendInfoについては以下のとおりです。
| Sort | ソートの必要の有無を示します Trueならば、描画の前にソートの必要あり Falseならば、描画の前にソートの必要なし |
| AlphaTest | Trueならば描画時にαテストを行います |
| AlphaFunc | αテスト時のテスト関数を指定します。AlphaTest = Falseなら、この値は無視されます |
| AlphaBlendEnable | Trueならば、αブレンディングを行います。この値がFalseのとき、以下の3つのパラメータは無視されます |
| SrcBlend | これから書き込まれる色に対する係数を指定します |
| DestBlend | これまで書き込んであった色に対する係数を指定します |
| BlendOp | どのように合成するかを指定します。BlendOpEnable = Trueの環境でのみ有効です |
procedure PushBillboard (ref:TSXFrame; pos:D3DVector;
points:Array of TSXVertexBB; tex:TDGTexture;
blendMode:TSXBlendMode = sxbColorKey; scaling:Boolean = True;
filter:Boolean = True; topMost:Boolean = False;
addrU:D3DTEXTUREADDRESS = D3DTADDRESS_CLAMP;
addrV:D3DTEXTUREADDRESS = D3DTADDRESS_CLAMP);
TSXVertexBB = record
Case Integer of
0:(
dx,dy:Single; //中心からの相対座標
color:D3DCOLOR; //色
specular:D3DCOLOR;
tu,tv:Single; //テクスチャ座標
);
1:(
size:TVector2D;
);
end;
ビルボードを描画する準備を行います。次のRenderメソッド実行時に、バックバッファに反映されます。
refで示されるフレームのposの位置を基準にして、pointsで示される四角形にtexで示されるテクスチャ貼ってを表示します。texにNilを指定すると、テクスチャ無しになります。
blendModeでブレンドモードの指定が可能です
scalingをTrueにすると、視点からの距離に応じて四角形の大きさを変更します。Falseにすると、視点からの距離によらず、一定の大きさの四角形を描きます。Falseの場合、画面上でのピクセル数でpoints[n].dx, points[n].dy を設定してください。
filterをTrueにすると、バイリニアフィルタリングを適用して、拡大処理を滑らかにします。Falseの場合、ポイントフィルタリングを適用し、ギザギザした拡大になります。通常は前者でかまいませんが、文字を入れたテクスチャの描画などには後者が良いでしょう。
topMostをTrueにすると、ほかの全てのオブジェクト(メッシュ・ビルボード・スプライト)より前面に表示されます。半透明体でもソートは行われません。 topMost = trueなオブジェクトが複数存在する場合は、後でPushされた物の方が前面に表示されます。
addrU, addrV にて、テクスチャのアドレッシングモードを変更できます。デフォルトではD3DTADDRESS_CLAMP(テクスチャ座標0以下は0とみなし、テクスチャ座標1.0以上は1.0とみなす)
注意 : pointsには必ず頂点を4つ指定してください。
pprocedure TSXScene.PushBillboardLite (ref:TSXFrame; pos:D3DVector; color:D3DCOLOR; size:Single; tex:TDGTexture; blendMode:TSXBlendMode = sxbColorKey; scaling:Boolean = True; filter:Boolean = True; topMost:Boolean = False; specular:D3DCOLOR = $00000000; addrU:D3DTEXTUREADDRESS = D3DTADDRESS_CLAMP; addrV:D3DTEXTUREADDRESS = D3DTADDRESS_CLAMP); );
ビルボードを描画する準備を行います。次のRenderメソッド実行時に、バックバッファに反映されます。
refで示されるフレームのposの位置を基準にして、posで示される位置を中心にtexで示されるテクスチャ貼ってを表示します。
ビルボードの横の大きさはsizeで指定し、色はcolorで指定します。縦の大きさはtexの縦横比に応じて自動的に決定されます。
blendModeでブレンドモードの指定が可能です
scalingをTrueにすると、視点からの距離に応じて四角形の大きさを変更します。Falseにすると、視点からの距離によらず、一定の大きさの四角形を描きます。Falseの場合、画面上でのピクセル数でsizeを設定してください。
filterをTrueにすると、バイリニアフィルタリングを適用して、拡大処理を滑らかにします。Falseの場合、ポイントフィルタリングを適用し、ギザギザした拡大になります。通常は前者でかまいませんが、文字を入れたテクスチャの描画などには後者が良いでしょう。
topMostをTrueにすると、ほかの全てのオブジェクト(メッシュ・ビルボード・スプライト)より前面に表示されます。半透明体でもソートは行われません。 topMost = trueなオブジェクトが複数存在する場合は、後でPushされた物の方が前面に表示されます。
specularでスペキュラ色を指定します。この色はテクスチャ表示時に足されて表示されます。具体的にはテクセルの色を t とすると、描画色は 「color * t + specular」で決定さます。
addrU, addrV にて、テクスチャのアドレッシングモードを変更できます。デフォルトではD3DTADDRESS_CLAMP(テクスチャ座標0以下は0とみなし、テクスチャ座標1.0以上は1.0とみなす)
procedure PushSprite(pos:TVector2D; points:Array of TSXVertexSP;
tex:TDGTexture; blendMode:TSXBlendMode = sxbColorKey;
filter:Boolean = True; topMost:Boolean = False; rhw:Single = 0.0;
addrU:D3DTEXTUREADDRESS = D3DTADDRESS_CLAMP;
addrV:D3DTEXTUREADDRESS = D3DTADDRESS_CLAMP);
);
スプライトを描画する準備を行います。次のRenderメソッド実行時に、バックバッファに反映されます。
スクリーン座標上のposの位置を基準にして、pointsで示される四角形にtexで示されるテクスチャ貼ってを表示します。texにNilを指定すると、テクスチャ無しになります。points配列は必ず4つの要素でなければならず、points[0]が左上、points[1]が右上、points[2]が左下、points[3]が右下の点をそれぞれ示します。
blendModeでブレンドモードの指定が可能です
filterをTrueにすると、バイリニアフィルタリングを適用して、拡大処理を滑らかにします。Falseの場合、ポイントフィルタリングを適用し、ギザギザした拡大になります。通常は前者でかまいませんが、文字を入れたテクスチャの描画などには後者が良いでしょう。
topMostをTrueにすると、ほかの全てのオブジェクト(メッシュ・ビルボード・スプライト)より前面に表示されます。半透明体でもソートは行われません。 topMost = trueなオブジェクトが複数存在する場合は、後でPushされた物の方が前面に表示されます。
rhwには、デプスバッファに書かれる値を直接指定します。3Dで描かれた物体との整合性を取る際に利用しますが、ビルボードがあるので、あまり利用価値はないかもしれません。
addrU, addrV にて、テクスチャのアドレッシングモードを変更できます。デフォルトではD3DTADDRESS_CLAMP(テクスチャ座標0以下は0とみなし、テクスチャ座標1.0以上は1.0とみなす)
注意 : pointsには必ず頂点を4つ指定してください。
procedure TSXScene.PushSpriteLite(pos:TVector2D; color:D3DCOLOR; tex:TDGTexture; blendMode:TSXBlendMode = sxbColorKey; filter:Boolean = True; topMost:Boolean = False; rhw:Single = 0.0; specular:D3DCOLOR = $00000000; addrU:D3DTEXTUREADDRESS = D3DTADDRESS_CLAMP; addrV:D3DTEXTUREADDRESS = D3DTADDRESS_CLAMP); );
スプライトを描画する準備を行います。次のRenderメソッド実行時に、バックバッファに反映されます。
スクリーン座標上のposの位置を最も左上の点として、texで示されるテクスチャを表示します。texにNilを指定すると、テクスチャ無し(ただの四角形)になります。
blendModeでブレンドモードの指定が可能です
filterをTrueにすると、バイリニアフィルタリングを適用して、拡大処理を滑らかにします。Falseの場合、ポイントフィルタリングを適用し、ギザギザした拡大になります。通常はTrueでかまいませんが、文字を入れたテクスチャの描画などにはFalseが良いでしょう。このメソッドでは拡大も縮小もしないので、理論上はTrueにしてもFalseにしても同じ表示になるはずですが、ドライバのクセも考えると明示的に指定したほうが無難な判断と言えます。
topMostをTrueにすると、ほかの全てのオブジェクト(メッシュ・ビルボード・スプライト)より前面に表示されます。半透明体でもソートは行われません。 topMost = Trueなオブジェクトが複数存在する場合は、後でPushされた物の方が前面に表示されます。
rhwには、デプスバッファに書かれる値を直接指定します。3Dで描かれた物体との整合性を取る際に利用しますが、ビルボードがあるので、あまり利用価値はないかもしれません。
specularでスペキュラ色を指定します。この色はテクスチャ表示時に足されて表示されます。具体的にはテクセルの色を t とすると、描画色は 「color * t + specular」で決定さます。
addrU, addrV にて、テクスチャのアドレッシングモードを変更できます。デフォルトではD3DTADDRESS_CLAMP(テクスチャ座標0以下は0とみなし、テクスチャ座標1.0以上は1.0とみなす)
procedure Render(rootFrame:TSXFrame; flushBBSP:Boolean = True);
rootFrameを最上位のフレーム(ワールド座標を提供するフレーム)として、レンダリングを行います。
flushBBSPをTrueに設定すると、レンダレングが終わった後にビルボード・スプライトをすべてキューから削除します。
procedure Clear(dwFlags:DWord; color:DWORD; z:Single; stencil:DWord);
ビューポートをクリアします。
dwFlagsには、何をクリアするかを指定します。以下の値の和で指定してください。
| D3DCLEAR_TARGET | レンダリング先のサーフェスをクリア |
| D3DCLEAR_ZBUFFER | Zバッファをクリア |
| D3DCLEAR_STENCILBUFFER | ステンシルバッファをクリア |
colorで、レンダリング先のサーフェスをクリアする際の色を指定します
z で、Zバッファをクリアする時の値を指定します
stencilで、ステンシルバッファをクリアする時の値を指定します
//refフレーム内にある、球は見えるか、但し、距離がdepth以上なら見えないものとする
function SphereVisibility(ref:TSXFrame; sphere:TSphere3D; depth:Single):Boolean; overload;
//↑と同じ、ただし、ref→ワールド座標までのマトリクスが求まっているとする
function SphereVisibility(worldM:D3DMATRIX; sphere:TSphere3D; depth:Single):Boolean; overload;
refで示されるフレーム、または、ワールド座標までの変換座標がworldMに一致するフレームの中にある、球体sphereは、視界内に入っているか、テストします。Trueならば、球体は視界内に入っています。
但し、視界は遠方クリッピング面までではなく、距離depthまで続いているとします。例えば霧のかかったシーンを描画するときに、近くまで可視判定が出来ればよいオブジェクトの可視判定を行うときなどに都合が良いでしょう。
procedure FlushBBSP;
ビルボード・スプライトのためのキューに登録されているビルボード・スプライトをすべて消去します。