Closed26

spz 2.0へのアプデプルリクのレビュースレ

にー兄さんにー兄さん

今回のプルリクの主な焦点は、2.0から追加された座標系変換周りである
SPZではこんな感じに座標系のenumが提供され、それを指定して変換が可能になった

enum class CoordinateSystem {
  UNSPECIFIED = 0,
  LDB = 1,  // Left Down Back
  RDB = 2,  // Right Down Back
  LUB = 3,  // Left Up Back
  RUB = 4,  // Right Up Back, Three.js coordinate system
  LDF = 5,  // Left Down Front
  RDF = 6,  // Right Down Front, PLY coordinate system
  LUF = 7,  // Left Up Front, GLB coordinate system
  RUF = 8,  // Right Up Front, Unity coordinate system
};
にー兄さんにー兄さん

プルリク曰く、enumをemscriptenで使おうとするとこんな感じになるらしい

そしてそれがTSの方になったらこんな感じ Wow

にー兄さんにー兄さん

ん~こうなるんだ、ん~~

そしてこれをtsの値として扱うためにこうなってる

にー兄さんにー兄さん
にー兄さんにー兄さん
C++
enum OldStyle {
    OLD_STYLE_ONE,
    OLD_STYLE_TWO
};

enum class NewStyle {
    ONE,
    TWO
};

EMSCRIPTEN_BINDINGS(my_enum_example) {
    enum_<OldStyle>("OldStyle")
        .value("ONE", OLD_STYLE_ONE)
        .value("TWO", OLD_STYLE_TWO)
        ;
    enum_<NewStyle>("NewStyle")
        .value("ONE", NewStyle::ONE)
        .value("TWO", NewStyle::TWO)
        ;
}
TS
Module.OldStyle.ONE;
Module.NewStyle.TWO;
にー兄さんにー兄さん

ChatGPTとかべうちしていたら、名案が浮かんだかもしれない
https://chatgpt.com/share/68814110-f34c-8008-b867-3fef70e5dca6

にー兄さんにー兄さん

まずはCoordinateSystemのキーのUnionを作る
これがこのAPIの引数で受け取るオプションにする

例えばspzUnpackOptionsと仮に(いったん。おかしいけど)方をAとすると、こんなことができる

  const wasmModule = await MainModuleFactory();

  const aaa = wasmModule.CoordinateSystem[spzUnpackOptions]

ここでaaaは{value:number}っぽい値になる

にー兄さんにー兄さん

レビューの結果、4つのファイルに提案がある感じになった

にー兄さんにー兄さん

spzApi.tsは、unpackSpzOptionもILoadSpzOptionsに入れない?というのと
ユーザ的にはstringのUnnionのほうが嬉しいのでは?という提案(メンテ性も上がる)

にー兄さんにー兄さん

Babylonのほうの処理
これも、unpackSpzOptionをoptionに含めてしまおうというもの

にー兄さんにー兄さん

今回のレビューの観点は下記

  1. CoordinateSystemオブジェクトを宣言するのではなく、CoordinateSystemUnionを定義してそれを使ってwasmModuleからCoordinateSystemオブジェクトに対応する値を取得しよう
    • もしCoordinateSystemに変更があった場合にも追従しやすい
    • コードの可読性
    • ユーザフレンドリー
  2. UnpackOptionをユーザ触るAPIに持たせるのではなく、ILoadSpzOptionsにunpackOption相当のオプションを持たせよう
    • 関数のシグネチャの変更が最小限で済む
  3. babylon/playcanvasに対しても同様にUnpackOptionsを既存のオプションに含めよう
  4. lint/formatを適用しよう
にー兄さんにー兄さん

ん?となったコメントが来たんだけど、これは自分の伝えミスだなというのがわかった

The issue here is that wasmModule is loaded async at runtime which means we can't create the values at compile time. As far as I know, that would mean having a runtime shim to build the values from the type after the module is loaded. Any external modules would then have to collect the values at runtime through some interface.

However, I have added a new CoordinateSystemEnum type external modules can import. With this and the CoordinateSystem values external modules can specify coordinate systems cleanly in a strongly typed manner. Plus it keeps all wasm internals hidden. I did this after removing the UnpackOptions I needed a clean way to add a CoordinateSystem field to the ICreateGSFromSpzOptions interface for Babylon.
https://github.com/drumath2237/spz-loader/pull/71#discussion_r2237574463

というのも、どうやら自分が提示したコード例では、loadSpz関数の中ではwasmModuleを使っているので、それを使ってCoordinateSystemを取得すればいいよねという話だったんだけど
loadSpzの中で使うという意図がうまく伝わっていなかったんだと思う

にー兄さんにー兄さん

こういうこともあるので、わからないなと思ったらちょっと時間空けるのもありだな

にー兄さんにー兄さん

ビルドのためのコマンドライン引数、増えているので対応したほうが良さそうだな

にー兄さんにー兄さん

失敗の原因は、なんだかToo Many Requestとかになっているので、よくわからないな
そんなことは前にはなかったんだけども

にー兄さんにー兄さん

Hi @drumath2237! Thank you for this great library and taking a look at my colleague's PR. Once your concerns are resolved, do you have an idea when you might be able to get this merged and released to npm?

We are looking to do a release this week and need to include an update to SPZ within it. We have a "plan b" but would like to stick with your npm package if possible.
https://github.com/drumath2237/spz-loader/pull/71#issuecomment-3133610627

なるほどね、少し無理をするか…

にー兄さんにー兄さん

あれ、前は失敗していたactionsでのdockerを使ったビルドが成功するようになっている
はて? これはdockerのバージョン指定をさぼったことによるものか…?(いい方向に倒れたけど

上手くいかなかった時のメモはこれ
https://zenn.dev/link/comments/24184e1202d21e

このスクラップは2ヶ月前にクローズされました