端末位置情報

デバイスの向きを取得する

WebGLで表示してみる

心射図法による実装

fetchShader
  • シェーダーも同じことの繰り返しなので外部ファイルに追い出した
  • サブディレクトリslの下に追い出したので、URLを見るとgl/slというディレクトリになっている
  • fetchShaderにURLを指定すると、fetchしてコンパイルまでしてくれる
  • fetchなので戻り値はプロミスで、解決するとVanillaGLProgramになる
  • シェーダーはVSとFSのふたつを読み込んでいるので、一気にfetchしてPromise.allで読み込み終了待ち
  • Promise.allの解決値をvとすると、v[0]がVSの、v[1]がFSのVanillaGLProgramになっている
黒魔術 (x??{}).y=z
  • オプショナルチェーンは便利だが左辺には書けない
  • e?.innerText = seが未定義の場合、e?.innerTextも未定義となる(この時点ではエラーにならない)
  • 未定義のものに何かを代入しようとするのでエラーになる
  • 未定義だったら適当なオブジェクトをでっち上げてしまえば、オプショナルチェーンにしなくてもアクセスできるようになる
  • .はタダの演算子に過ぎない(プロパティアクセサー)ので、左項にカッコが付いていても使える
  • カッコの中でNULL合体演算子で空っぽのオブジェクトを作る(そしてすぐ捨てられる)
  • eの値がundefinedならe = {}; e.innerText = s; e = undefined;のような振る舞いになる
  • eが定義されていてinnerTextがないのならeinnerTextプロパティができる
  • この方法でも eそのものが定義されていない場合はエラーになるので注意

平射図法による実装

黒魔術 v=>f(...v)
  • Promise.allの解決値は配列だが、色々な種類の解決値が混ざってくるとコードが見づらくなる
  • ちまちまとconst vs = v[0]; const fx = v[1];と代入していってもいいが、面倒
  • オブジェクトにしてconst v = { vs: v[0], ... }のようにしてもよいが、アクセスの時に必ずv.が必要
  • そこで、スプレッド構文で配列をバラして関数の引数として渡してしまう
  • 配列の要素が順に仮引数に割り当てられていき、関数内では仮引数名でアクセスできる
  • 即時実行関数を使ってPromise.all().then(v => ((vs, fs, --snip--){ })(...v))とも書けるが、関数本体が大きくなるとスプレッド構文がすごく後ろに離れた位置になってしまい、パッと見で何をしているか分かりづらい
  • $X = (v, f) => f(...v);として、Promise.all().then($v => $X($v, (vs, fs, --snip--) => { })とする方法もある
  • やっていることは同じだが、promise_allPromise.all専用なのに対し、$Xは使いまわせる

19 Jul 2024 初稿

Copyright (C) 2024 akamoz.jp