.toe 格式
WebToe 如何在瀏覽器裡讀取 TouchDesigner 的二進位專案容器。
原生 .toe 解碼僅供研究用途。它的目的是研究如何讀取你自己擁有的專案檔,跟 Derivative Inc. 沒有合作或背書關係,任何一版 TouchDesigner 都可能改變這個格式。Derivative 已經宣布會推出官方的 JSON 專案格式,WebToe 的 ProjectLoader 介面可以把它跟這個解碼器並排接上。透過橋接程式呼叫你自己 TouchDesigner 的 toeexpand,仍然是參考基準,也是自動備援。
原始碼:packages/io/src/toeBinary.ts · 測試:tests/toe-native.test.ts
它做什麼
拖進或連結的 .toe / .tox 會在瀏覽器裡解開,得到的檔案跟 toeexpand 寫出來的完全一樣:節點檔(.n)、參數(.parm)、DAT 內容和版面。接著用橋接程式那條路同一個匯入器把網路建起來。
實測
用 TouchDesigner 2025.33070 的 toeexpand 比對 125 個正式專案檔,從 3 KB 到 151 MB,存檔版本從 2021.16410 到 2025:
| 檔案清單與內容逐位元組一致 | 125 / 125(553,230 個檔案) |
| 原生解碼總時間(Node) | 17.7 秒 |
toeexpand 總時間 | 266.5 秒 |
| 20 MB 演出檔,在 Chrome 裡 | 0.35 秒(33,923 個檔案) |
| 151 MB 演出檔,在 Chrome 裡 | 1.8 秒(29,419 個檔案) |
| 4 KB 的每日創作,在 Chrome 裡 | 1–6 毫秒 |
格式
除非另外註明,整數都是大端序。
file = SEGMENT+
kind "10" "10" | u32 payloadLen | u32 rawLen | payload
kind "12" "12" | u32 chunks | u32 8 | u32 payloadLen₀ | u32 rawLen₀ | payload₀
之後每一塊:u32 payloadLenᵢ | u32 rawLenᵢ | payloadᵢ
(大型封存,每塊最多解出 128 MiB;塊頭不加密)
payload = TEA-ECB( zlib 串流 ),補齊到 8 的倍數
payloadLen 含補齊的位元組,rawLen 是解壓後的大小TEA 是標準的 Tiny Encryption Algorithm:32 輪,delta 0x9E3779B9,小端序 32 位元字組成對,以 8 位元組區塊做 ECB,128 位元金鑰(小端序字組)9241fa3a 59f32012 c612aa09 a98123d4。zlib 串流是標準的 RFC 1950。
解壓後的內容依序(跨塊、跨段落)接成一份封存,裡面是一筆一筆的紀錄。一筆紀錄可能跨越兩個塊:
0x34 file [tag] [u8 nameLen] [u32 contentLen] [name ] [content]
0x36 push [tag] [0x34] [u8 nameLen] [name ] 進入子資料夾
0x35 pop [tag] 離開名為 TRAILER!!! 的檔案紀錄代表封存結束。
要注意的規則
- 資料夾堆疊會跨段落延續。 每段重設的話,大型專案會被靜悄悄地攤平。
- 每一塊都要驗。 解壓後的大小必須等於
rawLen,下一段也必須從長度欄位說的位置開始。欄位對不上的段落(沒見過的變體)會改用不依賴欄位的方式還原:沿著 TEA 區塊格點走 zlib 串流,用 Adler-32 校驗碼找到每段串流的結尾,再確認結尾後面接的是什麼。語料裡沒有任何檔案需要走到這一步。 - 檔名。 TouchDesigner 允許同一層有只差大小寫的運算子(
geo_I和geo_i)。toeexpand要寫進檔案系統,在 macOS 和 Windows 上會撞名,於是補上.2、.3並合併資料夾。原生解碼器保留原本的名字。語料中有 9 個檔案,要在比對時模擬這種不分大小寫的撞名,才會跟toeexpand一致。 - 瀏覽器解壓。 每段 zlib 串流後面的補齊位元組會讓
DecompressionStream報錯,在 Chrome 裡這個錯誤會丟掉還沒讀走的輸出。WebToe 把最後 8 個位元組一次一個寫進去,讓錯誤只在所有真正的輸出都讀完之後才出現。
在編輯器裡
| 路徑 | 什麼時候 |
|---|---|
| 原生解碼 | 每個拖進或連結的 .toe / .tox 都先走這條 |
橋接程式+toeexpand | 原生解碼失敗,或結果看起來不像 TouchDesigner 的展開內容時;?toe=bridge 可以直接指定 |
| 說明視窗 | 兩條都走不通時(沒有橋接程式在跑) |
匯入報告會寫明走了哪條路、花了多少時間。
出處
這份格式說明來自研究專案檔與 TouchDesigner 自己的命令列工具,並用 toeexpand 的輸出逐位元組驗證。WebToe 不含任何 Derivative 的程式碼、執行檔或素材。