sog-loader実装スレ
調査すれとloader実装スレを分けることにした
zipによるアーカイブがWinネイティブ環境で動いたので、次はmeta.jsonのデシリアライズをする
素晴らしいことに、ちゃんと仕様が書かれているんだなぁ
codebookが256個の要素の配列なのは、テクスチャの色が8bit整数であり
8bit整数値がcodebookのindexと対応していて、そのindex値に入っているfloat32の値が格納したい値だったんだな
謎の係数がかけられて、最終的に
// SH_C0 = Y_0^0 = 1 / (2 * sqrt(pi))
const SH_C0 = 0.28209479177387814;
const r = 0.5 + meta.sh0.codebook[sh0.r] * SH_C0;
const g = 0.5 + meta.sh0.codebook[sh0.g] * SH_C0;
const b = 0.5 + meta.sh0.codebook[sh0.b] * SH_C0;
const a = sh0.a / 255;
shNが全く分からない、なんだこれどうなってるんだ
実装フローを整理
Zipファイル
↓
SOGデータ {means:[byte[], byte[]], scales:byte[]}
↓
WebPデコード byte[] -> RGBA[]
↓
汎用GSデータ {pos:vec3[], rot: quat[], scale:vec3[], color:rgba[], sh:f32[]}
WebPデコードの前に、ここまでのコードがwasmで動くのかを検証したいので
wasm-bindgenに入門する
ちょっと調べてみた感じ、意外とあまり資料がないな
適当なrustのlibプロジェクトを作成し、
cargo add wasm-bindgen
を実行してbindgenを導入する
この記事の指示に従って、bindgenのコマンドを実行する
そうすると、jsとd.tsファイルができているな

bindgenされる方の挙動について
bindgenのtargeにwebじゃなくてbundlerを指定した場合、
viteで読み込むにはvite-plugin-wasmプラグインを使う必要があった
actionsでビルドしていたら、bindgenのフォーマットのバージョン違いでエラーになった?

actionsでビルドもできたんでいい感じ!
とりあえずREADMEを整えたので、このtestbedはこれでいいかな
zip解凍するだけのメソッドをwasm化してみたところ、エラーだ…

sog-wasm_bg.wasm:0xa7f8a Uncaught RuntimeError: unreachable
上でエラーが出ていたの、もしかしたらmain関数の中に書いてあった処理がpanicしていたからかもしれない

なぜか今の設定だとmain関数がないとビルドできなくて、かつmainの中ではファイルシステム経由でsogファイルを取得している
serdeによるJSONデシリアライズもできた!

試しにwasm-optのWindowsバイナリを使って最適化してみたら、ファイルサイズが半分くらいになって凄い

いちいちwasmにコンパイルするのめんどいので、rust上でデバッグして確かめたいなぁ
rust-analyzer+CodeLLDBを使えば、
まずCargo.tomlでrlibも指定しておく
[lib]
crate-type = ["cdylib", "rlib"]
そうするとexamplesの中でもライブラリコードが参照できる
use rustwasm_decoder_testbed::test_func;
fn main() {
let a = test_func();
println!("{}", &a);
}
そしてF5を押せば普通にデバッグできて神

次はWebPデータのデコード処理に移ろう
image-webpクレートが使えそう
wasm-bindgenでもResult型は対応しているようで、EがInto<JsValue>と例とを実装している必要がありそう?





