WebToe
GitHub 開啟編輯器
文件目錄 · .toe 格式 文件

WebToe 文件 匯入

.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 毫秒

格式

除非另外註明,整數都是大端序。

text
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。

解壓後的內容依序(跨塊、跨段落)接成一份封存,裡面是一筆一筆的紀錄。一筆紀錄可能跨越兩個塊:

text
0x34  file   [tag] [u8 nameLen] [u32 contentLen] [name ] [content]
0x36  push   [tag] [0x34] [u8 nameLen] [name ]      進入子資料夾
0x35  pop    [tag]                                    離開

名為 TRAILER!!! 的檔案紀錄代表封存結束。

要注意的規則

  1. 資料夾堆疊會跨段落延續。 每段重設的話,大型專案會被靜悄悄地攤平。
  2. 每一塊都要驗。 解壓後的大小必須等於 rawLen,下一段也必須從長度欄位說的位置開始。欄位對不上的段落(沒見過的變體)會改用不依賴欄位的方式還原:沿著 TEA 區塊格點走 zlib 串流,用 Adler-32 校驗碼找到每段串流的結尾,再確認結尾後面接的是什麼。語料裡沒有任何檔案需要走到這一步。
  3. 檔名。 TouchDesigner 允許同一層有只差大小寫的運算子(geo_I 和 geo_i)。toeexpand 要寫進檔案系統,在 macOS 和 Windows 上會撞名,於是補上 .2、.3 並合併資料夾。原生解碼器保留原本的名字。語料中有 9 個檔案,要在比對時模擬這種不分大小寫的撞名,才會跟 toeexpand 一致。
  4. 瀏覽器解壓。 每段 zlib 串流後面的補齊位元組會讓 DecompressionStream 報錯,在 Chrome 裡這個錯誤會丟掉還沒讀走的輸出。WebToe 把最後 8 個位元組一次一個寫進去,讓錯誤只在所有真正的輸出都讀完之後才出現。

在編輯器裡

路徑什麼時候
原生解碼每個拖進或連結的 .toe / .tox 都先走這條
橋接程式+toeexpand原生解碼失敗,或結果看起來不像 TouchDesigner 的展開內容時;?toe=bridge 可以直接指定
說明視窗兩條都走不通時(沒有橋接程式在跑)

匯入報告會寫明走了哪條路、花了多少時間。

出處

這份格式說明來自研究專案檔與 TouchDesigner 自己的命令列工具,並用 toeexpand 的輸出逐位元組驗證。WebToe 不含任何 Derivative 的程式碼、執行檔或素材。

在 GitHub 上編輯這一頁