2008年3月1日土曜日

blender - ファイルフォーマットを書き換えたい(4)

さすがに力尽きたorz
高校時代英語ずっと赤点で、大学も再々々履修くらいまでいったくらい苦手。

最後のSDNAの章は、適当に読んだけどさっぱり分からんかった。
移植性・可搬性(ポータビリティ)のためにSDNA機構というのがあるようだ。

結局ソース読まないと全然分からん。という結論になりました。

File saving and loading

File saving is in general just going over the the entire Main tree, and save all blocks with users to disk as a raw binary dump. Each block saved gets a header (struct BHead) where additional information is stored, such as the original address of this block in memory.

ファイル保存は、一般に、Main treeから入り、全てのユーザのブロックをバイナリ形式でディスクへ保存する。各ブロックは、メモリ内でのこのブロックの独自アドレスのような、追加情報が保存されているヘッダ(BHead構造体)を得て保存される。

File reading starts with reading the full the file in memory. The Blender reading code then goes over all BHeads and processes Library Data and Indirect data, creating full copies. So in the end the full file can be freed from memory again. (NB: writing and reading large data chunks is to prevent disk and network overhead).

ファイル読み込みは、ファイルの全てをメモリ内に読み込むことから始まる。
Blenderはコードを読み、それから、全てのBHeadsを通り、LibraryDataとIndirectDataへと進み、フルコピーを生成する。
そうして、全てのファイルの終わりに達すると、メモリを再び開放する。
(でかいデータチャンクの読み書きは、ディスクとネットワークのオーバヘッドを防がねばならない)

Writing dynamic linked library data

ダイナミックリンクされたLibrary dataの書き込み

Since Blenders Main tree just is another list-able struct, it uses multiple Mains to be able to save and write dynamic linked data efficiently. This is done by the function split_main(), which creates Main trees with all data separated per file it belongs to.


BlenderのMain treeは、ただ、他でもリスト可能な構造であるから、複数のMainを保存でき、ダイナミックリンクされたデ0タを効率的に保存することが可能である。これはsplit_main()関数によってなされ、ファイルの所属ごとに、全てのデータが分離されて、Main treeが生成される。

For saving, the current Main tree then can be normally processed. For the other Mains it then only saves all IDs (as type ID_ID), with a separator to denote which file it originated from (done by saving struct Library).


保存のために、現在のMain treeは、それから、普通のプロセスを踏める。他のMainは、全てのIDをID_ID型として保存し、それは(IDから)由来していることを意味しているセパレータである

It then calls join_main() to merge all into a single Main tree again.

それから再び1つのMain treeにマージするために、join_main()を呼ぶ

Reading dynamic linked library data

ダイナミックにリンクされたデータの読み込み

This goes a little more complex, also to allow recursion;

これは少し複雑で、再帰的でつ

1. While reading the data from a file, and Blender encounters a Library struct, it creates a new Main struct and remembers to store all subsequent ID_IDs there. These IDs get flagged LIB_READ.
2- it then goes over all new Main trees, checking for LIB_READ flagged blocks
3- if a LIB_READ block is found:
3.1- it checks if the file containing this data was already read, if not it loads the entire file in memory and stores this in the Main.
3.2- it then reads the block with the normal reading routine, linking all Direct Data to it. The new block is linked to the current Main tree, the old block removed.
3.3- depending on block type, it calls the expand_doit() function, which forces reading more blocks like in 3.2, or it detects the data already was read correctly. Note: when such expanded data is again from another file, it just reads the ID part, links it to the correct Main and flags it LIB_READ.
4. For as long as LIB_READ flagged blocks where found, it returns to step 2.
5. Only in the end, it joins the Mains and restores all correct Library Data pointers.


1. { ファイルからデータを読み込んでいる、BlenderがLibrary構造と出くわしている} 間、新しいMain構造を作り、それに続く全てのID_IDsを、そこへ蓄積する。これらのIDはLIB_READというフラグを得る。

2.それから全ての新しいMain treeを通過し、LIB_READフラグが立っているブロックをチェック

3. もしLIB_READフラグが立ったブロック見つかったら

3.1- そのファイルに、既に読んだデータが含まれているかチェックし、もし読んでなかったらファイルをメモリに入れて、このMainを蓄える

3.2- それから通常の読み込みルーチンでブロックを読み、全てのDirect Dataを、そのブロックにリンクする。新しいブロックは現在のaMain treeにリンクされ、古いブロックは消される。

3.3- ブロックの種類により、expand_doit()関数が呼ばれ、強制的に3.2のようなブロックが読み込まれるか、既に完全に読み込んだデータを決定する。Node: そのように広げられたデータが再び他のファイルにあったとい、ただID部分だけを読み、それを正しいMainにリンクし、LIB_READフラグを立てる。

4 LIB_READフラグが立ったブロックと同じ長さのブロックが見つかったため、ステップ2にもどる

5 終わりにきたので、Mainsと復旧した全ての現在のLibary Dataポインタを結合する。

As you can imagine, this system requires quite some pointer magic, where pointers have to be mapped to new pointers, and to new pointers again, only to end up with the correct pointer to the actual data as was allocated.

よくわからんから略。

0 件のコメント: