メインコンテンツまでスキップ

出力の合成リファレンス

出力の合成のノードとヘルパーの一覧です。すべて shoji_wm から import できます。signal と書いた props は値でも signal でも渡せ、signal を 渡すとその変化で合成が再評価されます。

COMPOSITOR.rendering.composition​

COMPOSITOR.rendering.composition = (output: OutputInfo) => CompositionRenderable;

出力ごとに呼ばれます。以下のノードからなる JSX ツリーを返してください(フラグメントと 配列は自由に入れ子にでき、null・false・undefined は何も描きません)。既定の 重なりにするには未設定のままにするか、<DefaultComposition /> を返します。ノードが 1 つも無い合成は何も描かないので、null ではなく既定を返してください。

ノード​

子要素は奥から手前の順で、後の兄弟ほど上に描かれます。

<Layers>​

出力のレイヤーシェルサーフェス。

Prop型
layerssignal LayerName | LayerName[]"background"・"bottom"・"top"・"overlay" を奥から手前の順で。

各レイヤー内のサーフェスの順(新しいものが手前)は保たれます。レイヤーは複数のノードに 分けても、どんな順に並べても構いません(Top をウィンドウの下に置くなど)。

<Windows>​

Prop型
windowssignal (WaylandWindow | string)[]指定したウィンドウ(オブジェクトか ID)だけを重なり順で描きます。非表示でも描きます(表示時と同じ姿で)。省略すると出力自身の重なり。
offsetX, offsetYsignal numberウィンドウをずらす量(論理ピクセル)。

windows を省略したノードは出力自身の重なりで、出力が表示しているものを閉じかけの ウィンドウと装飾ポップアップ込みで描きます。フルスクリーンのファストパスとダイレクト スキャンアウトはこの重なりにだけ、合成のルートにあるときだけ働きます。windows を 指定した場合、合成の範囲外にあるウィンドウは描かれません。

<LayerPopups>​

全レイヤーのレイヤーシェルのポップアップ(バーのメニューやツールチップ)。props は ありません。

<TextureView>​

レンダーテクスチャを平面で描きます。

Prop型
textureRenderTexturerenderTexture の戻り値。
x, y, width, heightsignal number合成内の位置(論理ピクセル)。省略すると全体。テクスチャは引き伸ばされます。
opacitysignal number0〜1(既定 1)。

<Solid>​

単色の塗り。

Prop型
colorsignal CompositionColor"#rgb"・"#rgba"・"#rrggbb"・"#rrggbbaa"、または 0〜1 の [r, g, b, a]。
x, y, width, heightsignal number<TextureView> と同じ。

<Scene3D>​

<Plane> からなる 3D シーン。深度バッファ付きでオフスクリーンに描かれ、合成の 1 層として 描かれます。

Prop型
camerasignal Camera{ projection, view } の行列。カメラを参照。
x, y, width, heightsignal numberシーンのビューポート。省略すると全体。
clearColorsignal CompositionColor平面の背後(既定は透明)。
antialiassignal boolean4x マルチサンプルのエッジ(既定 true)。

平面は奥から手前の順に描かれ、半透明の平面は奥のものの上にブレンドされます。 テクスチャの完全に透明な部分(ウィンドウのテクスチャの影の余白など)は奥のものを 隠しません。同じ深さの平面はちらつくので、重なる平面は z をずらしてください。

<Plane>​

テクスチャ付きの矩形。<Scene3D> の中でだけ使えます。

Prop型
textureRenderTexture平面に映すもの。
width, heightsignal numberワールド単位のサイズ(平面の原点が中心)。
transformsignal Transform3D | Mat4ワールドでの配置(既定は単位行列: 原点でカメラの方を向く)。
opacitysignal number0〜1(既定 1)。
doubleSidedsignal boolean裏面も描く(既定 true)。

<DefaultComposition />​

既定の重なり: Layers[background, bottom]、Windows、Layers[top, overlay]、 LayerPopups。

renderTexture(options)​

renderTexture({
content: CompositionRenderable, // 描くノード
key?: string, // 再評価をまたいで GPU テクスチャを保つ
width?: number, height?: number, // 論理サイズ(既定は出力のもの)
scale?: number, // 画素密度(既定は出力の scale)
clearColor?: CompositionColor, // 既定は透明
}): RenderTexture

中身は出力と同じ配置で描かれます。レイヤーとウィンドウは出力の左上を基準にいつもの 位置に現れ、テクスチャのサイズで切り取られます。何度使っても 1 フレームに 1 回だけ、 変化した部分だけ描かれます。key が無いと、テクスチャは呼び出し順で区別されます。

3D ヘルパー​

transform3d(matrix?)​

Transform3D を始めます。CSS の transform と同じ要領で、各呼び出しはそれまでの 変換のローカル空間で適用されます。角度は度です。

メソッド
translate(x, y = 0, z = 0)移動。
rotateX(deg), rotateY(deg), rotateZ(deg)軸まわりの回転。
scale(x, y = x, z = 1)拡大縮小。
multiply(other)別の Transform3D か Mat4 を適用。
.matrix列優先の Mat4。

変換は不変なので、共通の土台から枝分かれできます:

const cube = transform3d().translate(0, 0, -half).rotateY(angle);
const front = cube.translate(0, 0, half);
const right = cube.rotateY(90).translate(0, 0, half);

カメラ​

ヘルパー
screenCamera(output | { width, height }, { fov = 45, distance = 0 })z = 0 を出力に 1:1 で写します。distance でカメラを引きます(ズームアウト)。
perspective(fovY, aspect, near, far)OpenGL 式の透視投影行列。fovY は度。
lookAt(eye, target, up = [0, 1, 0])eye から target を見るカメラのビュー行列。
multiplyMat4(a, b)列優先の a × b。
outputLogicalSize(output)出力の論理サイズ { width, height }。

カメラを自前で組む例:

const { width, height } = outputLogicalSize(output);
const camera = {
projection: perspective(50, width / height, 1, 10_000),
view: lookAt([0, 300, 1600], [0, 0, 0]),
};

当たり判定​

ヘルパー
projectPoint(camera, viewport, [x, y, z])ワールドの点が写る位置 { x, y, depth }(ビューポート左上からの論理ピクセル。depth は小さいほど手前)。カメラの後ろなら null。
pickPlane(camera, viewport, planes, x, y)(x, y) の下で一番手前の平面の添字、無ければ null。planes には <Plane> と同じ width・height・transform を渡します。

viewport は <Scene3D> の { width, height } です。 入力グラブと組み合わせると 3D の配置を クリックできるようになります:

const { width, height } = outputLogicalSize(output);
const hit = pickPlane(screenCamera(output), { width, height }, planes,
event.position.x - output.position.x, event.position.y - output.position.y);

型​

型
CompositionRenderable合成関数の戻り値。
RenderTexturerenderTexture の戻り値。
Camera{ projection: Mat4; view: Mat4 }。
Mat4列優先の 16 個の数(WebGL/glMatrix と同じ並び)。
LayerName"background" | "bottom" | "top" | "overlay"。
CompositionColor16 進文字列("#rgb"〜"#rrggbbaa")か 0〜1 の [r, g, b, a](ストレートアルファ)。