├── dev ├── embody │ ├── text3.py │ ├── text6.py │ ├── text9.txt │ ├── base1 │ │ ├── text3.py │ │ └── text2.py │ ├── text2_xml.xml │ ├── text5.py │ ├── text7.py │ ├── text8.py │ ├── text_json.json │ ├── text2.py │ ├── base2_rename │ │ ├── text2_xml.xml │ │ └── text2.py │ ├── base6 │ │ └── text2.py │ ├── base7 │ │ └── text2.py │ ├── base1.tox │ ├── base2.tox │ ├── base3.tox │ ├── base4.tox │ ├── base5.tox │ ├── base6.tox │ ├── base7.tox │ ├── base2moved.tox │ ├── base_main.tox │ ├── base2_rename.tox │ ├── base3_rename8.tox │ ├── base_custom_path.tox │ ├── base_replicant.tox │ ├── text1.py │ ├── base_clone_test_1.tox │ ├── base_clone_test_2.tox │ ├── base_clone_test_3.tox │ ├── base_master_clone.tox │ ├── base_cook________test.tox │ ├── container_custom_pars.tox │ ├── sdf.py │ └── externalizations.tsv ├── text_root.py ├── Embody-4.toe ├── Embody-4.736.toe ├── container_root.tox ├── TDImportCache │ └── TDLogo.tdc └── embody\externalizations.tsv ├── .gitattributes ├── .gitignore ├── img └── screenshot.png ├── release ├── Embody-v3.0.5.tox ├── Embody-v4.5.24.tox ├── Embody-v4.6.22.tox ├── Embody-v4.7.6.tox ├── Embody-v4.2.101.tox ├── Embody-v4.3.222.tox └── Embody-v4.4.144.tox ├── LICENSE └── README.md /dev/embody/text3.py: -------------------------------------------------------------------------------- 1 | hii -------------------------------------------------------------------------------- /dev/embody/text6.py: -------------------------------------------------------------------------------- 1 | hii -------------------------------------------------------------------------------- /dev/embody/text9.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dev/text_root.py: -------------------------------------------------------------------------------- 1 | rooty -------------------------------------------------------------------------------- /dev/embody/base1/text3.py: -------------------------------------------------------------------------------- 1 | hii -------------------------------------------------------------------------------- /dev/embody/text2_xml.xml: -------------------------------------------------------------------------------- 1 | hi, helloooo 2 | i'ts me yup -------------------------------------------------------------------------------- /dev/embody/text5.py: -------------------------------------------------------------------------------- 1 | op('base4').allowCooking = False -------------------------------------------------------------------------------- /dev/embody/text7.py: -------------------------------------------------------------------------------- 1 | op('base4').allowCooking = False -------------------------------------------------------------------------------- /dev/embody/text8.py: -------------------------------------------------------------------------------- 1 | op('base4').allowCooking = False -------------------------------------------------------------------------------- /dev/embody/text_json.json: -------------------------------------------------------------------------------- 1 | { 2 | "hello": "world" 3 | } -------------------------------------------------------------------------------- /dev/embody/text2.py: -------------------------------------------------------------------------------- 1 | print(parent().selectedChildren) 2 | asdf ok -------------------------------------------------------------------------------- /dev/embody/base1/text2.py: -------------------------------------------------------------------------------- 1 | print(parent().selectedChildren) 2 | asdf -------------------------------------------------------------------------------- /dev/embody/base2_rename/text2_xml.xml: -------------------------------------------------------------------------------- 1 | hi, helloooo 2 | i'ts me yup -------------------------------------------------------------------------------- /dev/embody/base6/text2.py: -------------------------------------------------------------------------------- 1 | print(parent().selectedChildren) 2 | asdf -------------------------------------------------------------------------------- /dev/embody/base7/text2.py: -------------------------------------------------------------------------------- 1 | print(parent().selectedChildren) 2 | asdf -------------------------------------------------------------------------------- /dev/embody/base2_rename/text2.py: -------------------------------------------------------------------------------- 1 | print(parent().selectedChildren) 2 | asdf -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Tox 2 | Backup 3 | External-Tox-Saver_V2.*.toe 4 | .DS_Store 5 | **/.DS_Store -------------------------------------------------------------------------------- /dev/Embody-4.toe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/Embody-4.toe -------------------------------------------------------------------------------- /img/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/img/screenshot.png -------------------------------------------------------------------------------- /dev/Embody-4.736.toe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/Embody-4.736.toe -------------------------------------------------------------------------------- /dev/embody/base1.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base1.tox -------------------------------------------------------------------------------- /dev/embody/base2.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base2.tox -------------------------------------------------------------------------------- /dev/embody/base3.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base3.tox -------------------------------------------------------------------------------- /dev/embody/base4.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base4.tox -------------------------------------------------------------------------------- /dev/embody/base5.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base5.tox -------------------------------------------------------------------------------- /dev/embody/base6.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base6.tox -------------------------------------------------------------------------------- /dev/embody/base7.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base7.tox -------------------------------------------------------------------------------- /dev/container_root.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/container_root.tox -------------------------------------------------------------------------------- /dev/embody/base2moved.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base2moved.tox -------------------------------------------------------------------------------- /dev/embody/base_main.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base_main.tox -------------------------------------------------------------------------------- /release/Embody-v3.0.5.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/release/Embody-v3.0.5.tox -------------------------------------------------------------------------------- /release/Embody-v4.5.24.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/release/Embody-v4.5.24.tox -------------------------------------------------------------------------------- /release/Embody-v4.6.22.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/release/Embody-v4.6.22.tox -------------------------------------------------------------------------------- /release/Embody-v4.7.6.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/release/Embody-v4.7.6.tox -------------------------------------------------------------------------------- /dev/TDImportCache/TDLogo.tdc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/TDImportCache/TDLogo.tdc -------------------------------------------------------------------------------- /dev/embody/base2_rename.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base2_rename.tox -------------------------------------------------------------------------------- /dev/embody/base3_rename8.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base3_rename8.tox -------------------------------------------------------------------------------- /release/Embody-v4.2.101.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/release/Embody-v4.2.101.tox -------------------------------------------------------------------------------- /release/Embody-v4.3.222.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/release/Embody-v4.3.222.tox -------------------------------------------------------------------------------- /release/Embody-v4.4.144.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/release/Embody-v4.4.144.tox -------------------------------------------------------------------------------- /dev/embody/base_custom_path.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base_custom_path.tox -------------------------------------------------------------------------------- /dev/embody/base_replicant.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base_replicant.tox -------------------------------------------------------------------------------- /dev/embody/text1.py: -------------------------------------------------------------------------------- 1 | table = [o for o in op('/').findChildren() if 'Embody/externalizer' in o.path] 2 | print(table) -------------------------------------------------------------------------------- /dev/embody/base_clone_test_1.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base_clone_test_1.tox -------------------------------------------------------------------------------- /dev/embody/base_clone_test_2.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base_clone_test_2.tox -------------------------------------------------------------------------------- /dev/embody/base_clone_test_3.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base_clone_test_3.tox -------------------------------------------------------------------------------- /dev/embody/base_master_clone.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base_master_clone.tox -------------------------------------------------------------------------------- /dev/embody/base_cook________test.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/base_cook________test.tox -------------------------------------------------------------------------------- /dev/embody/container_custom_pars.tox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dylanroscover/Embody/HEAD/dev/embody/container_custom_pars.tox -------------------------------------------------------------------------------- /dev/embody/sdf.py: -------------------------------------------------------------------------------- 1 | """ 2 | Extension classes enhance TouchDesigner components with python. An 3 | extension is accessed via ext.ExtensionClassName from any operator 4 | within the extended component. If the extension is promoted via its 5 | Promote Extension parameter, all its attributes with capitalized names 6 | can be accessed externally, e.g. op('yourComp').PromotedFunction(). 7 | 8 | Help: search "Extensions" in wiki 9 | """ 10 | 11 | from TDStoreTools import StorageManager 12 | import TDFunctions as TDF 13 | 14 | class sdf: 15 | """ 16 | sdf description 17 | """ 18 | def __init__(self, ownerComp): 19 | # The component to which this extension is attached 20 | self.ownerComp = ownerComp 21 | 22 | # properties 23 | TDF.createProperty(self, 'MyProperty', value=0, dependable=True, 24 | readOnly=False) 25 | 26 | # attributes: 27 | self.a = 0 # attribute 28 | self.B = 1 # promoted attribute 29 | 30 | # stored items (persistent across saves and re-initialization): 31 | storedItems = [ 32 | # Only 'name' is required... 33 | {'name': 'StoredProperty', 'default': None, 'readOnly': False, 34 | 'property': True, 'dependable': True}, 35 | ] 36 | # Uncomment the line below to store StoredProperty. To clear stored 37 | # items, use the Storage section of the Component Editor 38 | 39 | # self.stored = StorageManager(self, ownerComp, storedItems) 40 | 41 | def myFunction(self, v): 42 | debug(v) 43 | 44 | def PromotedFunction(self, v): 45 | debug(v) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | TEC Friendly License v1.0 2 | ========================= 3 | 4 | Copyright (c) 2020-present The Experiential Company, LLC ("TEC") 5 | 6 | Permission 7 | ---------- 8 | 9 | You can use, copy, modify, merge, publish, distribute, and sell this software, 10 | in source or binary form, for any purpose, including commercial use. 11 | 12 | The only conditions are: 13 | 14 | 1. Keep this license text and the credits (the names above) in any significant 15 | copies, forks, or redistributions of the software. 16 | 17 | 2. If you change the software in a way that materially affects how it works, 18 | be honest about that in your own documentation or about box. Don’t imply 19 | your modified version is the “official” software unless you have our written 20 | permission. 21 | 22 | No warranty 23 | ----------- 24 | 25 | This software is provided “as is”, with no promises of any kind. 26 | 27 | You use it entirely at your own risk. TEC (and any contributors) are **not** 28 | responsible for any bugs, crashes, data loss, broken shows, missed cues, or 29 | other damage, including business or project losses, even if you told us about 30 | the possibility in advance. 31 | 32 | If you are using this in a critical, commercial, or safety-sensitive context, 33 | it is **your** responsibility to test it thoroughly and put proper backups and 34 | fallbacks in place. 35 | 36 | Support & consulting 37 | -------------------- 38 | 39 | There is no guaranteed free support. 40 | 41 | If you: 42 | 43 | - need help integrating this software, 44 | - want new features or bug fixes on a schedule, 45 | - or want training or custom development, 46 | 47 | you’re welcome to reach out and hire us: 48 | 49 | hello@tec.design 50 | 51 | Using this software does **not** create any obligation on us to respond, 52 | fix issues, or provide support unless we have a separate written agreement. 53 | 54 | Jurisdiction 55 | ------------ 56 | 57 | If any part of this license is found invalid or unenforceable, the rest stays 58 | in effect. 59 | 60 | Where a choice of law is needed, this license is governed by the laws of the 61 | State of California, USA, excluding its conflict-of-law rules. 62 | -------------------------------------------------------------------------------- /dev/embody/externalizations.tsv: -------------------------------------------------------------------------------- 1 | path type rel_file_path timestamp dirty build touch_build 2 | /embody/externalizations table embody/externalizations.tsv 2025-03-10 07:28:49 UTC 3 | /text_root text text_root.py 2025-03-10 07:28:49 UTC 4 | /embody/text_json text embody/text_json.json 2025-03-10 07:28:49 UTC 5 | /embody/text9 text embody/text9.txt 2025-03-10 07:28:49 UTC 6 | /embody/text8 text embody/text8.py 2025-03-10 07:28:49 UTC 7 | /embody/text7 text embody/text7.py 2025-03-10 07:28:49 UTC 8 | /embody/text6 text embody/text6.py 2025-03-10 07:28:49 UTC 9 | /embody/text5 text embody/text5.py 2025-03-10 07:28:49 UTC 10 | /embody/text3 text embody/text3.py 2025-03-10 07:28:49 UTC 11 | /embody/text2_xml text embody/text2_xml.xml 2025-03-10 07:28:49 UTC 12 | /embody/text2 text embody/text2.py 2025-03-10 07:28:49 UTC 13 | /embody/text1 text embody/text1.py 2025-03-10 07:28:49 UTC 14 | /embody/sdf text embody/sdf.py 2025-03-10 07:28:49 UTC 15 | /embody/container_custom_pars container embody/container_custom_pars.tox 2025-03-10 07:30:38 UTC False 8 2023.12230 16 | /embody/base_replicant base embody/base_replicant.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 17 | /embody/base_master_clone base embody/base_master_clone.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 18 | /embody/base_main base embody/base_main.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 19 | /embody/base_custom_path base embody/base_custom_path.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 20 | /embody/base_clone_test_3 base embody/base_clone_test_3.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 21 | /embody/base_clone_test_2 base embody/base_clone_test_2.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 22 | /embody/base_clone_test_1 base embody/base_clone_test_1.tox 2025-03-10 07:28:49 UTC False 4 2023.12230 23 | /embody/base7/text2 text embody\base7\text2.py 2025-03-10 07:28:49 UTC 24 | /embody/base7 base embody/base7.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 25 | /embody/base6/text2 text embody\base6\text2.py 2025-03-10 07:28:49 UTC 26 | /embody/base6 base embody/base6.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 27 | /embody/base5 base embody/base5.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 28 | /embody/base4 base embody/base4.tox 2025-07-11 18:38:28 UTC False 5 2023.12230 29 | /embody/base3_rename8 base embody/base3_rename8.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 30 | /embody/base3 base embody/base3.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 31 | /embody/base2_rename/text2_xml text embody\base2_rename\text2_xml.xml 2025-03-10 07:28:49 UTC 32 | /embody/base2_rename/text2 text embody\base2_rename\text2.py 2025-03-10 07:28:49 UTC 33 | /embody/base2_rename base embody/base2_rename.tox 2025-07-11 18:38:23 UTC False 2 2023.12230 34 | /embody/base1/text3 text embody\base1\text3.py 2025-03-10 07:28:49 UTC 35 | /embody/base1/text2 text embody\base1\text2.py 2025-03-10 07:28:49 UTC 36 | /container_root container container_root.tox 2025-07-11 18:38:15 UTC False 2 2023.12230 37 | /embody/base2moved base embody/base2moved.tox 2025-07-11 18:38:26 UTC False 3 2023.12230 38 | /embody/base1 base embody/base1.tox 2025-03-10 07:29:40 UTC False 2 2023.12230 39 | /embody/base2 base embody/base2.tox 2025-07-11 18:38:17 UTC False 3 2023.12230 40 | -------------------------------------------------------------------------------- /dev/embody\externalizations.tsv: -------------------------------------------------------------------------------- 1 | path type rel_file_path timestamp dirty build touch_build 2 | /embody/externalizations table embody/externalizations.tsv 2025-03-10 07:28:49 UTC 3 | /text_root text text_root.py 2025-03-10 07:28:49 UTC 4 | /embody/text_json text embody/text_json.json 2025-03-10 07:28:49 UTC 5 | /embody/text9 text embody/text9.txt 2025-03-10 07:28:49 UTC 6 | /embody/text8 text embody/text8.py 2025-03-10 07:28:49 UTC 7 | /embody/text7 text embody/text7.py 2025-03-10 07:28:49 UTC 8 | /embody/text6 text embody/text6.py 2025-03-10 07:28:49 UTC 9 | /embody/text5 text embody/text5.py 2025-03-10 07:28:49 UTC 10 | /embody/text3 text embody/text3.py 2025-03-10 07:28:49 UTC 11 | /embody/text2_xml text embody/text2_xml.xml 2025-03-10 07:28:49 UTC 12 | /embody/text2 text embody/text2.py 2025-03-10 07:28:49 UTC 13 | /embody/text1 text embody/text1.py 2025-03-10 07:28:49 UTC 14 | /embody/sdf text embody/sdf.py 2025-03-10 07:28:49 UTC 15 | /embody/container_custom_pars container embody/container_custom_pars.tox 2025-03-10 07:30:38 UTC False 8 2023.12230 16 | /embody/base_replicant base embody/base_replicant.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 17 | /embody/base_master_clone base embody/base_master_clone.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 18 | /embody/base_main base embody/base_main.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 19 | /embody/base_custom_path base embody/base_custom_path.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 20 | /embody/base_clone_test_3 base embody/base_clone_test_3.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 21 | /embody/base_clone_test_2 base embody/base_clone_test_2.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 22 | /embody/base_clone_test_1 base embody/base_clone_test_1.tox 2025-03-10 07:28:49 UTC False 4 2023.12230 23 | /embody/base7/text2 text embody\base7\text2.py 2025-03-10 07:28:49 UTC 24 | /embody/base7 base embody/base7.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 25 | /embody/base6/text2 text embody\base6\text2.py 2025-03-10 07:28:49 UTC 26 | /embody/base6 base embody/base6.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 27 | /embody/base5 base embody/base5.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 28 | /embody/base4 base embody/base4.tox 2025-07-11 18:38:28 UTC False 5 2023.12230 29 | /embody/base3_rename8 base embody/base3_rename8.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 30 | /embody/base3 base embody/base3.tox 2025-03-10 07:28:49 UTC False 1 2023.12230 31 | /embody/base2_rename/text2_xml text embody\base2_rename\text2_xml.xml 2025-03-10 07:28:49 UTC 32 | /embody/base2_rename/text2 text embody\base2_rename\text2.py 2025-03-10 07:28:49 UTC 33 | /embody/base2_rename base embody/base2_rename.tox 2025-07-11 18:38:23 UTC False 2 2023.12230 34 | /embody/base1/text3 text embody\base1\text3.py 2025-03-10 07:28:49 UTC 35 | /embody/base1/text2 text embody\base1\text2.py 2025-03-10 07:28:49 UTC 36 | /container_root container container_root.tox 2025-07-11 18:38:15 UTC False 2 2023.12230 37 | /embody/base2moved base embody/base2moved.tox 2025-07-11 18:38:26 UTC False 3 2023.12230 38 | /embody/base1 base embody/base1.tox 2025-03-10 07:29:40 UTC False 2 2023.12230 39 | /embody/base2 base embody/base2.tox 2025-07-11 18:38:17 UTC False 3 2023.12230 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # :label: Embody 3 | ### Externalize TouchDesigner Components and Scripts 4 | #### :floppy_disk: TouchDesigner 2023.12230 (Windows/macOS) 5 | #### :floppy_disk: version 4.7.6 6 | 7 | [YouTube Demo/Tutorial](https://www.youtube.com/watch?v=lR3adD3Cw5s) 8 | 9 | 10 | 11 | ## :notebook_with_decorative_cover: Overview 12 | ### Internalization 13 | TouchDesigner stores projects in a `.toe` (TOuch Environment) binary file, which poses limitations for collaborative workflows, especially when merging changes. 14 | 15 | ### Manual Externalization 16 | Developers often save external `.tox` (TOuch eXternal component) files and various text-based DATs (e.g., `.py`, `.glsl`, `.json`). This process is repetitive and can become difficult to manage in larger networks. 17 | 18 | ### Automated Externalization 19 | **Embody** automates the externalization of COMPs and DATs in your project. Tag any COMP or DAT operator by selecting it and pressing `lctrl` twice in a row. Upon saving your project (`ctrl + s`) or updating Embody (`ctrl + shift + u`), Embody externalizes tagged operators to a folder structure mirroring your project network, and keeps them updated. 20 | 21 | For instance, externalizing `base2` within `base1` results in the path: `{project.folder}/base1/base2.tox`. 22 | 23 | To get started, drag-and-drop the Embody `.tox` from the [`/release`](https://github.com/dylanroscover/Embody/tree/main/release) folder into your project. 24 | 25 | ## :label: Getting Started 26 | 1. **Download and Add Embody**: Drag and drop the Embody `.tox` from the [`/release`](https://github.com/dylanroscover/Embody/tree/main/release) folder into your project. 27 | 28 | 2. **Initialize Embody**: Upon creation, choose to initialize or keep the last saved state. Typically, use initialize for new projects, or keep the saved state if you're updating Embody from an older version. The default externalization folder is the root of your project folder. This can be customized. Moving the folder disables Embody, which then recreates the folder structure in the new location and removes the old one entirely. 29 | 30 | 3. **Tag Operators for Externalization**: 31 | - Select an operator and press `lctrl` twice to add the externalization tag desired. 32 | - Supported OP types: 33 | - All COMPs except engine, time and annotate 34 | - Text DAT 35 | - Table DAT 36 | - Execute DAT 37 | - Parameter Execute DAT 38 | - Parameter Group Execute DAT 39 | - CHOP Execute DAT 40 | - DAT Execute DAT 41 | - OP Execute DAT 42 | - Panel Execute DAT 43 | - Supported file formats: 44 | - .tox, .py, .json, .xml, .html, .glsl, .frag, .vert, .txt, .md, .rtf, .csv, .tsv, .dat 45 | 46 | 4. **Enable/Update Externalizations**: 47 | - Pulse the `Enable/Update` button or press `ctrl + shift + u`. 48 | - Embody externalizes tagged COMPs and DATs, matching your project network structure. 49 | 50 | > Note: If no tags are specified, all externalizable COMPs and DATs will be externalized, which might slow down complex projects. 51 | 52 | ## :label: Workflow 53 | Embody keeps your external toxes updated. Saving your project (`ctrl + s`) autosaves modified (dirty) COMPs. DATs synchronize automatically if their Sync to File parameter is enabled. 54 | 55 | > Use `ctrl + shift + u` as an alternative to update only dirty COMPs. 56 | 57 | > To view dirty COMPs, press `ctrl + shift + e` to open the Manager UI, listing all externalized operators and their status. Refresh to get the latest dirties and update as needed. Changing any COMP parameter will also mark that COMP as dirty. 58 | 59 | ## :label: Features 60 | - Adds and updates `Build Number`, `Touch Build` and `Build Date` parameters in an `About` page to any externalized COMP, for robust version tracking. 61 | - Prompts whether to reference or clone an operator when a duplicate file path is detected. 62 | - Prevents clones and replicants (and their children) from being externalized 63 | - Can externalize the entire project in one click with the `Externalize Full Project` pulse. 64 | - Isolated data/logic pattern with an `externalizations` tableDAT outside of Embody for easy updating and management. 65 | - UTC timestamps for synchronized international workflows. 66 | 67 | ## :label: Resetting 68 | To completely reset and remove externalizations, pulse the `Disable` button. 69 | 70 | > Note: This can delete all externalized files, their path parameters (`externaltox` and `syncfile`), and any resulting empty folders. To reinstate, pulse the `Enable/Update` button. 71 | 72 | ## :keyboard: Keyboard Shortcuts 73 | - `ctrl + shift + e` : Open the Manager to view and manage externalized operators. 74 | - `lctrl + lctrl` : Tag the current selected operator by pressing the left control key twice. 75 | - `ctrl + shift + u` : Initialize/update externalizations. 76 | 77 | ## :man_juggling: Contributors 78 | Originally developed by [Tim Franklin](https://github.com/franklin113/). Refactored entirely by Dylan Roscover, with inspiration and guidance from Elburz Sorkhabi, Matthew Ragan and Wieland Hilker. 79 | 80 | ## Version History 81 | - **4.7.6**: Build save increment bug fix 82 | - **4.7.5**: 83 | - ui.rolloverOp refactor 84 | - Restore handling of dnd COMP auto-populated externaltox pars 85 | - Cache parameters correctly between tox saves 86 | - Add parameter updated coloring for dirty buttons in UI 87 | - Path lib implementation improvements / added consistency 88 | - Auto refresh on UI maximize 89 | - Do not auto update when adding an externalization 90 | - Ignore untagged COMPs when checking for duplicate paths 91 | - **4.6.4**: 92 | - Add About page to externalized COMPs with: 93 | - Build Number 94 | - Touch Build 95 | - Build Date (time tox was saved) 96 | - Add Build/Touch Build to externalization table + Lister 97 | - Window resizing support and cleaned up min/max button methods 98 | - **4.5.23**: 99 | - Fix deletion of old file storage after renaming operation 100 | - Cleanup network 101 | - Tagging optimization 102 | - Cleanup folder structure 103 | - Remove folderDAT 104 | - Fix duplicated rows from externalizations tsv git merge conflicts 105 | - **4.5.19**: Allow master clones with clone pars to be externalized, Setup menu cleanup 106 | - **4.5.17**: Bug fixes, smaller minimized window footprint 107 | - **4.5.2**: 108 | - Add tsv support 109 | - Add Clone tag for shared external paths 110 | - Handle drag and dropped COMP auto-populated externaltox pars 111 | - Detect dirty COMP par changes 112 | - **4.4.128**: Add support for COMPs with empty/error prone clone expressions (such as rollovers in Probe) 113 | - **4.4.127**: Added textport warning for when timeline is paused 114 | - **4.4.126**: Clean up Save and dirtyHandler methods, auto set enableexternaltox par to ensure saves 115 | - **4.4.125**: Bug fix for handling empty externalTimeStamp value 116 | - **4.4.124**: More bug fixes with file handling 117 | - **4.4.119**: mouseinCHOP chopexecDAT optimization 118 | - **4.4.117**: Additional externalization folder removal bug fixes 119 | - **4.4.116**: UI color and icon refinement 120 | - **4.4.113**: externalization folder bug fixes 121 | - **4.4.112**: engine/annotateCOMP Tagger handling 122 | - **4.4.111**: Bug fix for Disable method 123 | - **4.4.109**: Correctly deletes previous externalization folder when changed 124 | - **4.4.107**: Multi-display support for Tagger, minor Windows fixes 125 | - **4.4.104**: Added TreeLister, improved Tagger stability, color theme updates 126 | - **4.4.74**: 127 | - Added feature for externalizating full project automatically 128 | - Support for handling deletion and re-creation (redo) of COMPs/DATs 129 | - Support for renaming COMPs and DATs 130 | - Support for moving COMPs/DATs 131 | - Various small bug fixes and feature improvements 132 | - **4.3.134**: Adding missing reference to list COMP 133 | - **4.3.133**: Fixed externalizations folder button on macOS, fixed filter display, added clear button to filter UI 134 | - **4.3.128**: Fixed abs path bug, added support for macOS Finder and keyboard shortcuts 135 | - **4.3.122**: Separated logic/data for easier Embody updates, bug fix for checking for duplicate OPs 136 | - **4.3.48**: Handling for duplicate OP tox/file paths. 137 | - **4.3.43**: Switched to UTC, added Save/Table DAT buttons, refactored tagging, better externaltox handling. 138 | - **4.2.101**: Fixed keyboard shortcut bug, updated to TouchDesigner 2023. 139 | - **4.2.98**: Added handling for Cloners/Replicants. 140 | - **4.2.0**: UI fixes, path cleanup, folder switching fixes. 141 | - **4.1.0**: Improved file/folder management, bug fixes. 142 | - **4.0.0**: Added support for various file formats, parameter improvements. 143 | - **3.0.5**: Tweaked reset function. 144 | - **3.0.4**: Updated versioning system. 145 | - **3.0.3**: Updated to TouchDesigner 2022. 146 | - **3.0.2**: Added Manager UI, clarified commands, added deletion mechanisms. 147 | - **3.0.1**: Added keyboard shortcuts, minor bug fixes. 148 | - **3.0.0**: Initial release. 149 | --------------------------------------------------------------------------------