2008年11月16日
黒板のスクリプトって…
すっかりおなじみになった黒板ですが、あれって、どうやってるのか考えると眠れなくなります。
XyzzyTextをもとにして日本語対応してるらしいけど、どうやって??
XyzzyTextの基本を少し。
一つの立方体プリムをぐにぐに変形させて、正面に立方体の6面のうち5面を並べます。この段階で「ぎゃー」っていいたくなるけど、これは序の口。
文字列を分解して頭から一文字ずつ表示するわけだけど、ここに文字を表示するためには、文字のテクスチャが必要です。一文字ずつテクスチャにしてたら、英数記号だけでもアップロード料金が100L$くらいかかっちゃうので、一枚のテクスチャに文字を並べたものを作ってるわけですね。テクスチャの表示位置や倍率を調整して、目的の文字だけを目的の面に表示するわけです。
1プリムに10文字表示可能なバージョンはまたえらいことをしていて、ありうる二文字の組み合わせを全部並べたテクスチャを作っているのですが、それはまた別の話。
英数字だけなら、そこそこ高解像度にしてもテクスチャ一枚とかでいけちゃうんです。実際はテクスチャの効率も考えて、あまり大きくないテクスチャ数枚に分けているようですが。
で、日本語を出すとなると、数千文字は必要なわけです。
SLで使えるテクスチャの最大サイズは1024×1024。
一文字のサイズを32×32ドットにすれば、1024文字一つのテクスチャに入ります。
JIS第一水準は約3000文字ですから、三枚のテクスチャでほぼカバーできます。
これくらいなら許容範囲ですけど、問題はLSLの文字コードがユニコードだってことなんですね。ユニコードって、日本と中国と韓国の漢字を全部並べていて、JIS漢字コードとは全然互換性ないんです。日本で分類されたJIS第一水準とかは適当に統合漢字の中にちらばっています。だからユニコードのままでテクスチャ作ろうとしたら漢字だけで約二万字、テクスチャ20枚位作ってアップロードする必要があります。
じゃあ、JISコードの配列のテクスチャ作ってユニコードからJISコードに変換すればいいんじゃないかと思うでしょうが、ユニコードからJISコードへの変換テーブルのサイズがでっかくなっちゃいます。Integerのリストを作ったとして、32ビットの数字を2万個入れるリストが必要なので、8万バイト、ってことは約72kb必要なわけです。Monoになって拡張されたといえ、スクリプト一個の使えるメモリは最大64kbですから、これじゃ足りません。
いったいどうやってるんだろう…
XyzzyTextをもとにして日本語対応してるらしいけど、どうやって??
XyzzyTextの基本を少し。
一つの立方体プリムをぐにぐに変形させて、正面に立方体の6面のうち5面を並べます。この段階で「ぎゃー」っていいたくなるけど、これは序の口。
文字列を分解して頭から一文字ずつ表示するわけだけど、ここに文字を表示するためには、文字のテクスチャが必要です。一文字ずつテクスチャにしてたら、英数記号だけでもアップロード料金が100L$くらいかかっちゃうので、一枚のテクスチャに文字を並べたものを作ってるわけですね。テクスチャの表示位置や倍率を調整して、目的の文字だけを目的の面に表示するわけです。
1プリムに10文字表示可能なバージョンはまたえらいことをしていて、ありうる二文字の組み合わせを全部並べたテクスチャを作っているのですが、それはまた別の話。
英数字だけなら、そこそこ高解像度にしてもテクスチャ一枚とかでいけちゃうんです。実際はテクスチャの効率も考えて、あまり大きくないテクスチャ数枚に分けているようですが。
で、日本語を出すとなると、数千文字は必要なわけです。
SLで使えるテクスチャの最大サイズは1024×1024。
一文字のサイズを32×32ドットにすれば、1024文字一つのテクスチャに入ります。
JIS第一水準は約3000文字ですから、三枚のテクスチャでほぼカバーできます。
これくらいなら許容範囲ですけど、問題はLSLの文字コードがユニコードだってことなんですね。ユニコードって、日本と中国と韓国の漢字を全部並べていて、JIS漢字コードとは全然互換性ないんです。日本で分類されたJIS第一水準とかは適当に統合漢字の中にちらばっています。だからユニコードのままでテクスチャ作ろうとしたら漢字だけで約二万字、テクスチャ20枚位作ってアップロードする必要があります。
じゃあ、JISコードの配列のテクスチャ作ってユニコードからJISコードに変換すればいいんじゃないかと思うでしょうが、ユニコードからJISコードへの変換テーブルのサイズがでっかくなっちゃいます。Integerのリストを作ったとして、32ビットの数字を2万個入れるリストが必要なので、8万バイト、ってことは約72kb必要なわけです。Monoになって拡張されたといえ、スクリプト一個の使えるメモリは最大64kbですから、これじゃ足りません。
いったいどうやってるんだろう…