diff --git a/docs/blog/images/compositor/cuts0.excalidraw.svg b/docs/blog/images/compositor/cuts0.excalidraw.svg new file mode 100644 index 0000000000..bd458a4bf3 --- /dev/null +++ b/docs/blog/images/compositor/cuts0.excalidraw.svg @@ -0,0 +1,21 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nM2U22rbQFx1MDAxMIbv/Vx1MDAxNEa9bZQ9XHUwMDFmXHUwMDAypZA0hLTBXHI4pTilXHUwMDE0WVpZQrKkSms7aci7d6Q4XsWtQ1posS5cdTAwMTZ2Znfmn9lPczdcdTAwMThcdTAwMGU9e1tcdTAwMTnvaOiZmzDI06hcdTAwMGVW3uvWvjR1k5ZcdTAwMDW4SLdvykVcdTAwMWR2J1x1MDAxM2ur5ujwcFx1MDAxZdSZsVVcdTAwMWWExl+mzVwiyFx1MDAxYruI0tJcdTAwMGbL+WFqzbx5266jYG7eVOU8srXvklx1MDAxY5gotWX9kMvkZm5cbttA9C+wXHUwMDFmXHUwMDBl77q1p642oVxyilluulx1MDAwYp3LXHTUets4KotOq4KPY6Tp5kDavINs1kTgjUGxcZ7W5H2Y1MnFdzxNwtPl9XjUyNE0XHUwMDFiuaRxmudje5t3oppcdTAwMTJqcb7G1mVmPqeRTVx1MDAxZbvWs++6VZeLWVKYpi1cdTAwMWVvrGVcdTAwMTWEqb1tbVxibaxcdTAwMGZcdTAwMWQ4XHUwMDFhOstccuxcdTAwMGVcdTAwMDT1OeKcUKGwYEhcdTAwMTC+8bdcdTAwMTEolz5WmnGmpaBcdTAwMTRJviXtpMzhJUDaK6wlXHUwMDBliVx1MDAxMzdccsJsXHUwMDA2XG6LyJ1cdHik4tidWa1cdTAwMGJcdTAwMTaI+lxiY8QkXHUwMDE1lCjsXHUwMDFhkJh0lti2J8pXjDGCqVx1MDAxMlx1MDAxMqu+XHUwMDEw072IpFxuMyWE3Dja7NV51KHx1T1DXHJQnbc3ikWe93tZROtePlwi5CCia8u9K689f9qDz2VYVFHwQFx0lpQyLFxiVko6jvK0yLbT52WYObBcdTAwMDa9XFx/xjMnZFx1MDAxN9BcdTAwMWEhXHQ4I/xioC+zM/w+mVxcXHUwMDEwXHUwMDFkf7sqP02v8/LjeN+BJj5RQkO/XHUwMDExXHUwMDEzfUza+0Qz4ExcdTAwMTNcIjXhwPRumkmsXHJjz9M8JTGZTn+lmXLkKy4lZtBvIVXvn3I4XHUwMDBin1x0LFx1MDAxMFxmmVx1MDAwZWe2jTOmXHUwMDE4PEyjveSZw9/2X3iGXHUwMDE3l7uAplx1MDAxMlx0xEHNy4E+WY1XJrnKJseJvsTV5KxcdTAwMTlcdTAwMWTsN9BcdTAwMThrXHUwMDFmXHUwMDAxXGJcbmhVhCqknlx1MDAxMk1hgFMmqMZCI457429cdTAwMWJpgyhA9TzScVx1MDAxY+pQ/yOkXHUwMDA1jG8msaD7SDTBfzGhYe2CekFVjS2E3EiD0tJonP4wT8J4y9Ssjn/b9/bzXHUwMDA2a/0tiaar835w/1x1MDAxM/xcdTAwMThbnyJ9 + + + + + diff --git a/docs/blog/images/compositor/cuts1.excalidraw.svg b/docs/blog/images/compositor/cuts1.excalidraw.svg new file mode 100644 index 0000000000..7e79fb4040 --- /dev/null +++ b/docs/blog/images/compositor/cuts1.excalidraw.svg @@ -0,0 +1,21 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1bbVPbuFx1MDAxNv7eX8Fwv1x1MDAxNlU6ej2dubPDS1teXG5toaXL3tnpXHUwMDE4x0m8OHFInEJ2p/99j1xmxE5cdTAwMWOHUNLddC5mSoMkW7J0nuc850j569na2no26kXrL9fWo+swSOJGP7haf+7Lv0b9QZx2qVxu8r9cdTAwMDfpsFx1MDAxZuYt21nWXHUwMDFivHzxolx1MDAxM/QvoqyXXHUwMDA0YcS+xoNhkFxmsmEjTlmYdl7EWdRcdTAwMTn84n9cdTAwMWZcdTAwMDWd6L+9tNPI+qzoZCNqxFnav+krSqJO1M1cdTAwMDb09P/R32trf+W/S6PrR2FcdTAwMTZ0W0mU35BXXHUwMDE1XHUwMDAzRJwuPEq7+VhcdTAwMTFcdTAwMTBcdTAwMTRqXTSIXHUwMDA3O9RbXHUwMDE2Nai2SSOOilx1MDAxYV+0vverSlx1MDAxNSRhcna+u7V3jVl6/WZYdNqMk+QkXHUwMDFiJfmgXHUwMDA2Kb1LUTfI+ulF9DluZO27WSuV193VT4etdjdcdTAwMWH4l1x1MDAxN+PStFx1MDAxN4RxNvJlnI9Lb2bg5VpRcu17ksBcdTAwMWOiXHUwMDE2zlx1MDAxOFx1MDAwM1x1MDAwZbRcdTAwMWRX+1x1MDAwN0jFXHUwMDE5apRcdTAwMDKt4WC4m1x1MDAxYdh2mtA60MD+Qy1EXGLF0M6D8KJF4+s2ijaBbrhms2hzdfu6hkvGheDKSiPBieL121Hcamd+nI45pVx1MDAxNFxi6YxcdTAwMTXO6mIgUb5cdTAwMWVOXHUwMDAy97dcdTAwMTbT4Hvv7TVyw/i9WIQ+mdSev6M7TJLyTHZcdTAwMWK3M3lnQIVcdMnbkm/F6/n2r0qmV/Qw7DWCXHUwMDFiXHUwMDFiXHUwMDExVkoljOBSazmuT+LuxXT3SVx1MDAxYV5cdTAwMTRm9azU18OsWYOsM2daQKuF5XJhc95GMfjS2drvm6yL2Fx1MDAxMs13rZ5edXNWTFxiobWyiFx1MDAxYzWfNGewjvlSXHUwMDAyttFSOtS19lxmTYyUmm/P59CE8/OqPUvNmdPWXG5lOVx1MDAxYUuommHQhikjXGJR7sag1bRBI1qFVlx1MDAwM66eQXN0RvN/xKBcdTAwMDVcdTAwMTe8zqKFXHUwMDA1WmblxMJcdTAwMTZ9iMf83aHazuJcdTAwMWR79PrVXHUwMDEwt6Q8W22LVkIz64RcdTAwMDNAw5V2wkxatLDMKCO9JVx1MDAxOWvnXHUwMDEwdMSlkGK+QTebIYb4g1xm2lx1MDAxOVx1MDAxMMJY828x9Pie4u6xYTT7PMGvm59Oslf7Ubuxh1x1MDAwN4q3x/MwYa5Bv59erY9rvj2f99xPR1x1MDAxZi+zPdg1rfTqU/ssSr9cdTAwMGV2rpbw3Ojyml9cdTAwMWMkl+9cdTAwMWJvt1xc/OZog++efF7subefauFNpiQtudplwZtur0F2ratcdTAwMTLaolx1MDAwM6lLXv4+ZH++2jx723xcdTAwMWY2NvRHMTjtfjj54pJcdTAwMWFkh/10MNhoXHUwMDA3Wdh+ML5cdTAwMWLBoFx1MDAxZD1cdTAwMDDg+n6PpZlcdTAwMDFcdTAwMDChOEqLJf99XHUwMDAzb2BWXHUwMDEyrlx1MDAxMIVSzppaeIvI/3yf/uJMca1cdTAwMDUqXHUwMDAxkiBcZnZcdTAwMDa8hUZcdTAwMDZcdTAwMWOpXHUwMDA1yWKh0LhpfCuqINfwY1x1MDAxNFx1MDAxODzCYXlypJd7iFx1MDAwMitNc9DPtuJuI+62pm+Juo2amiRcdTAwMThk22mnXHUwMDEzZzSM92nczaZb5M/d9NBsR0FlLujJtXU9/7hJQis+rVx1MDAxNdaV/zH+/Pvzma036pfeX9VFL1x1MDAxZfis/P9DwVx1MDAwZiVcdTAwMGYyXHUwMDA1fkP+hX7E4l69c9bcPjjko/3T8PXeh2DUNK1ksFx1MDAwMtg3i/h25Fx1MDAwMpSjqSfwXHUwMDE0nDvGvlx1MDAxNTRV0mlHMcSc4OtcdTAwMTHgl0xzJbWiXHUwMDBlwGlSd1x1MDAwNceUwO9cdTAwMTjB24Ex2tI/VXHuipaNglx1MDAwYlHo7ZVcdTAwMDG/RlVW0U/gv7vqV95f1TVfXHUwMDE29rmaLlx1MDAxZDt+XCIjXG55eClcdTAwMGJxb87l7eHB1vFv++9231x1MDAxY3NzdnCF3euDXHUwMDE1XHUwMDAw/72OXztgKGnqtVx1MDAwNiskL1xi8Vx1MDAwZfzOXHUwMDEy9LWSQNGWmlx1MDAxYddysC+YVZqEXHUwMDE4clx1MDAwZdxcdTAwMThXYqBcdOyD8S2s1lx1MDAxNDGXZNst9oWnbCAvu4KeX6NwqpjaJ/DfXfVLn9dWXHUwMDE2fUngL1x1MDAwN7zT4Fx1MDAxN5KiS1q3xcH/pn1cdTAwMWNcdTAwMWXAh08nXHUwMDFif7zbPu1Fp/zPw51cdTAwMTVcdTAwMDD/vZ7fXHUwMDFhxSTF85yEjkOUhWu/XHUwMDAxv2SSS6/GyHxccpdyamDLQb9lQjqSftRcdFx1MDAwMihd4/iJoNBpITgpXHUwMDExU8m70s3SJydW0fE7fz1hv9K6duH9VV3yJUFcdTAwMWZhuvBcdTAwMGX55OOMpNhxccnfXHUwMDBiX72/7J00t07FKN6H4X53XHUwMDFiWytcdTAwMDD8e72+k8C0sUhkJ4xzejrcl8xIn/P0wZZB/FGS3/r8uKUlJicgjZ3p9i3jRvnUozXWKlWao1u3b7m1nNTJXHUwMDBmyVA/1u074E9uv9q6fun9VV30XHUwMDA3Yj+LrrPZ8X695ke/daekWnxjqm03r/de7+idX6Oj07ew21afLjf/zTS+u1fsK0OcS0JecVDIJ1x1MDAwM32adK21JD62nPCk6zelXHUwMDFlXHUwMDAzelx1MDAxYYFE9NslwIWwokBtkcKveHehKECkseklSPuJilx1MDAwN2XnR6/b28nx7ntcdDvhxbvkS/L2/Pp4XHRZ9P+jrP/c51x1MDAxZVxueaG/jOSrXWnORol488cwPVvsuXesUEvFYEC7kmd/XHUwMDAwXHUwMDE1N9Nudlx1MDAxMv+Ze1x1MDAwMz5R+jroxMloXHUwMDAyjDnz+E3rYVbK/fnSzSRudXNhXHUwMDEyNSfJKYvDIFx1MDAxOVdnaa+oXHKpl4CETL9q02k/bsXdIPk4s0evfnbHTpSVIHVcdTAwMWVcZqJcXFx1MDAxYlG5m8uiN5M8g0ZlKTEyfVpFKlx1MDAwYpyExcIsOlx1MDAxZlUryaKSM+eT+SRZeTlcdTAwMTbxd1tgXHUwMDAy/I65Jr9G0lx1MDAxNqdGVdrl5C7k/PtYXHUwMDE0kDPynFaTvvCbmTMzJjRMq1BaqfxBg3JS9C5o8rs91pbU36oop1x1MDAxYrhC2Zy/UzmVXHUwMDA2dntEa29cdTAwMDHnnVx1MDAwMzxcdTAwMWP6UXJmjEapkXOabikslFx1MDAxYbWCXi5SmZfRXG6VUVKSX61uXHUwMDAz/2OabVx1MDAxYbXL3aeptzt/VS3ugbqtlnFUKVx1MDAwNJlcdTAwMTZuPFx1MDAxN1x1MDAwN1xii+dr5jvc1aRcdTAwMWOKhlx1MDAwNelcdTAwMWaCXHUwMDA1RctTpy+cZUhY9nqZqFnMydM8hnOE31xi8mdcdTAwMTE5N9xcdTAwMDHYopuCc4RjaIHWQ3ArXGJcclUpp1x1MDAwMZX1XHUwMDE5pSfSmUc6iktrjWdcdTAwMTOHpX2jMecgI1xmUlx1MDAwNGWJkZQyYOZTTt2I5lx1MDAxZkUqjWhDMJ+GJelOc4X+8JqqjElcdTAwMTD8KcRy1MxwMlbpKoP6qdiu3uL9VbX1ZbGdVrX6iuzUaiVw8dPA86OAlSQ7o1x1MDAxOfpTKN6ZSlx1MDAwNUXHo1xcYTJtXHUwMDE1aGJ9KcnEflx1MDAxMNlcdTAwMTnGQShcblx1MDAxOZSk1ZczuY4zrp225PhcdTAwMDVcYo5cdTAwMTV9JYw01MqWdn6euG7cuuA6sFx1MDAxY1xiSYp4Q0ooXHUwMDBlXHUwMDE4XHUwMDE0xELkI5zT6G5cdTAwMGVm2yqxLJntaGnJTzmtXGaSXHR4pjXVUSlcdTAwMWGVVKRcdFxyeLljdWVUP1x1MDAxM93VmnxeWTH2pUk7V3tcdTAwMDZHXHSafkL54ufv5qcmVpLsXHUwMDEwSLyRXHL5XHUwMDFkdrL9yZxcdTAwMWNVXHUwMDFhmlx1MDAwMnRKXHUwMDExXFwnQrilkp1i6PxhJ1pYlKIkpUtsXHUwMDA3PidLhIaC3Lsr6bc7tnOK7vRH3p/Ybi7bSVC0kv77XHUwMDAxnNQ6n6mjXHUwMDA0XHUwMDAwaSwtuaGASlVffrl0R/RKXHUwMDFhUzpcdTAwMTKbhlx1MDAxNtDNXCI7MlOKPrQmxeNccrGqN38urquz+Ly2YuvLXCK78i5V5bQxwZ+kglt8XHUwMDAzYn7CdFx1MDAxNdnOcGBOOlxyfrvFuSm2s/5LYIIsjHyqXHUwMDAyYepPXHUwMDFiPSp3XHUwMDA2moFcIt/CzawvXHUwMDEwXGKJjDtygU5L47jGykEj8CdRXHK4p1xidlx1MDAwZc9t5Hkz7ZNcdTAwMTaagkXJVTWGJZ6TRIE8t1x1MDAwNf9tjXtk3U+bN5tpcv6qXHUwMDFhW1x1MDAxZNM8u334etDrnWS06uNFXCLri1x1MDAxYrdcdTAwMWJcdTAwMTTFXHUwMDFirn+No6utmV+u8ZffO8ln2bNElJvit2ff/lx1MDAwNmN8If8ifQ== + + + + + Cuts diff --git a/docs/blog/images/compositor/cuts2.excalidraw.svg b/docs/blog/images/compositor/cuts2.excalidraw.svg new file mode 100644 index 0000000000..c79145c7dd --- /dev/null +++ b/docs/blog/images/compositor/cuts2.excalidraw.svg @@ -0,0 +1,21 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nOWYa2/bNlx1MDAxNIa/51dcdTAwMDTe11Xl/VJgXHUwMDE4mtRps6Ju0SRLu2EoZImyNcuSJ8m5XHUwMDE1/e976SSW7NiZs15mrFx0YMQkXHUwMDE1UofPeflcdTAwMWV+3Nnd7dSXXHUwMDEz13my23FcdTAwMTdRmKVxXHUwMDE5nnd+9O1nrqzSXCJHXHUwMDE3m32vimlcdTAwMTnNRlx1MDAwZet6Uj15/HhcdTAwMWOWI1dPsjBywVlaTcOsqqdxWlx1MDAwNFExfpzWblxc/ew/e+HY/TQpxnFdXHUwMDA2zSSPXFyc1kV5PZfL3NjldYX//ju+7+5+nH22Vle6qFx1MDAwZfNB5mZcdTAwMGbMuppcdTAwMDUqxZZbe0U+Wyw1hGlLtFx1MDAxNPNcdTAwMTFp9Vxm89UuRneCNbumxzd1VHUwfjE9ff7u+Oo0XCJD8mhvlFx1MDAxN820SZplR/VlNltWVeBtmr6qLouRO03jenhcdTAwMWK3Vvu6p8piOlx1MDAxOOau8q9P563FJIzS+tK3XHUwMDExMm+9jsGT3ablXHUwMDAy3zjjgVx1MDAxNNJcdTAwMTBhtJSGmXmvf54rXHUwMDFlUKmsMpYxzVx1MDAwNF1a136RYSOwrlx1MDAxZlhinVx1MDAxMM3K+mE0XHUwMDFhYHl53Izps4T1+82Y85u3RaRcdTAwMDNimLWMUvytlZ5cdTAwMGZcdTAwMTm6dDCsfURUwI0wylxiy6TijDS7UrnZhlAqraaKSDXv8Vx1MDAwYphcdTAwMWPGMzj+aLahXHUwMDA0Vof+kXyaZe1Y5vFNLG8hajDiNy2fmjf047st/JpcdTAwMTmmkzi8poRqzlx1MDAwNWdUK6Ka0GZpPlqePiuiUVx1MDAwM9ZOa66HXHUwMDExjVxi0rVIUyZcdTAwMTghSm+OdHL87E3MlOz+dnkmT8hgcFx1MDAxY4VcdTAwMTfbjbSkLJCGU0EtYq+pWESa8oBLQYzVSlx1MDAxMSvkWqRcdTAwMWTBWHo/0klcdTAwMTLZyK5AWvJA+YTC9lx1MDAxYsJta/NcdTAwMWKkdUBcYvJKIP18crWXco00Qy4gMZQw24e0gCR8I6RcdTAwMTWTa4mWXHUwMDA0XHUwMDEyXHKkN1x1MDAwNnr4IXO/SGde2rF5Plx1MDAxZWv7tNf7sN1AI9hcdTAwMDFlklMjNTRQXG61QLSgMrBcdTAwMTQ5iv2gylxuLtZcIk2hkFx1MDAxMbtcdTAwMWbpUMYmSVapNFx1MDAwZizXwnCiuLFtKNtIK1xiONGaMk1k+7y4XHUwMDExadBcZjG0RmxcdTAwMWbR31CkTWvPl4n2soEgkY2Jtl3RXHUwMDBiI5ZcdTAwMTdcdTAwMDdXV93RdJ+wMD3ZbqIlXHUwMDA1KJZA/pSU1lx1MDAxYbNcdTAwMDS0XG5cYuM4qlx1MDAxOFx1MDAwM8+t3i/Ks6RcdTAwMDHkXHUwMDE55odwyXxyreDZXHUwMDA0nGtDXGZcdTAwMGVcdTAwMDKrzVx1MDAxZIGmzHjKkX3fN84tQ7GEsyRGUWNcdTAwMDXbXHUwMDE45/evXFxMXlx1MDAxYdU7TWJ3vlx1MDAxN/ZcdTAwMDfDg3q7cVZaQ4FhKuBeXHK3VC/hLHHQgyGiXHUwMDA01YZ/XHUwMDFkmjV8POXYdlx1MDAwZVx1MDAwMVx1MDAxMbp1XCK2aSZcdTAwMTReRGjBXHUwMDE0Tlx1MDAxMsuXedZaglx1MDAxYS6+b3W29zhoXHR/bSRcdTAwMTebXHUwMDFiXHUwMDBlrifJ3n6/PEtOqiGJe1x1MDAxZsqXo6vt5tkoXHUwMDE0ZMLCQzOugMyyPPNAQPlcdTAwMTSn2lqNw+qrXHUwMDEwLVx1MDAxObyEQL7ATcAkk1bF1/ZcdTAwMWJQZTBccvtcdTAwMDPfwalaJppygsJcdTAwMTJcdTAwMDL1fSNt2HrDXHUwMDAx0Vx1MDAxMKh0Nq9cdKf7UVx1MDAxOL9zec8k+u1f57Q+XHUwMDE1XHUwMDA3L7abaDBcdTAwMDJLIYjwzlVZtlRcdTAwMTMqVGuUglx1MDAxNCWtj8Z6XHUwMDA3/Vn3XHUwMDFjUlx1MDAwNMxIJVxiXGawRsTXOFx1MDAwZW+JNEGa4eC866CV4lx1MDAxNvWk2cKa8Ftec1x1MDAwMNl1RCuprZRcdTAwMGa4t3s1Ym/fm7eHh2Tc3Xs9UL92L5jcbqCVXHUwMDE2gVCGXHUwMDBiwvGuqnWU315yXHUwMDE4ITXUU2gu1T1cdTAwMTL9WbdcdTAwMWNcdTAwMWGVJzw6qlx1MDAxNZxcdTAwMTNEkVVAy8BQ4G6lhlx1MDAxMaLm7i1cdTAwMDe1imiGXHUwMDEx/3tcdTAwMTNdu4t6Jczry0FuiIIobc5y/Odw+Co6fVZcdTAwMWW92fuFy1p2909e/5cs23/UZqFcdTAwMDNcdTAwMDRcdTAwMWFcdTAwMTlcdTAwMGLnjFJhXHUwMDExZSZYXHUwMDAwXHUwMDE3wv19gsU5z/RalKnzv//SbYjAyy5XKFx1MDAwNVx1MDAwNdcrQb7jlpWhklvzXHUwMDA1uF3oeNA1nIWTJ1x1MDAwZlx1MDAwMLRZVZHXR+mV34+WOfCtXHUwMDA34TjNLlx1MDAxN7ZzRi7itz8sJlVnoflpllx1MDAwZTzEncwli3TXaVx1MDAxNGbz7rqYNL1cdTAwMTGmXHTT3JV3w1KU6SDNw+x49ZR4Q/fidk9o0NqVflg53+vbzXVcdTAwMWXic1x1MDAxNrtOOJlcdTAwMWPViNxcXFwisFVpfPP6zfSds9SXnKtcdTAwMTTQ/3R2bnLbp5Gb6c2nnU9/XHUwMDAzb4am9CJ9 + + + + + Chops diff --git a/docs/blog/images/compositor/cuts3.excalidraw.svg b/docs/blog/images/compositor/cuts3.excalidraw.svg new file mode 100644 index 0000000000..67a75bad0e --- /dev/null +++ b/docs/blog/images/compositor/cuts3.excalidraw.svg @@ -0,0 +1,21 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1cXGtz2khcdTAwMTb9nl/h8n5ccj19+91TtbVcdTAwMTXbYczkMUlcdTAwMWMnTramUjJcYqPwNMixk6n89z2NXHUwMDFkJFx1MDAxMMJgQ1x1MDAxNk9cclRho5alVvc9557b97b/erSzs5t+XHUwMDFkxLu/7uzGV/WokzSG0eXu43D8SzxcdTAwMWMl/Vx1MDAxZZrE+PuofzGsj89spelg9Osvv3SjYTtOXHUwMDA3nahcdTAwMWWzL8noXCLqjNKLRtJn9X73lySNu6P/hM+XUTf+96DfbaRDlt2kXHUwMDEyN5K0P7y+V9yJu3EvXHUwMDFk4er/xfednb/Gn7neXHLjelx1MDAxYfXOOvH4XHUwMDBmxk1ZXHUwMDA3jVGzR1/2e+POWi5cZrdKTNqT0Vx1MDAwMe6WxlxyNDbR4zhrXHSHdlx1MDAxYt5fnjbeP6ntn3Srr2qXXHKlv1x1MDAxZGQ3bSadzlH6tTPu1KiPZ8naRumw347fJ4209WPUcsfL/mrYvzhr9eJReHiaXHUwMDFj7Vx1MDAwZqJ6kn5ccsc4n1x1MDAxY71cdTAwMWWBX3eyI1f4VtGOXHUwMDExV4RH1cSdXHUwMDEx2WiML0CaXHRSiivppCBnZ3u23+9gXCLQs3+Jpo+Vyvp2XHUwMDFh1dtn6GCvkZ1zKpri9DQ75/Lmeclxxp3wXlx1MDAxMOF3a+zklFacnLXSMCaGSaecccpcdTAwMGJtpOBZT0fxeEqUXHUwMDE23JFwZtJcdTAwMTDuP6g1xrbxZzZcdTAwMGZDWFUt/EXvotPJXHUwMDBmZq9xM5g/bCizXCJ5c+R79oDh/Kez1pe3wJxp8Fem8TZcdTAwMWRdtPpv3lx1MDAxY5I6VtXj3sfJQEyZazRcdTAwMWP2L3cnLd9vfsv6fzFoRNdGSFZKJYXw2stsXjtJrz37cJ1+vZ3Z7aPck6xcdTAwMDZcdTAwMTdMjyjDi5COYCm58b9ccjD+pHL+9Ey8PTlMzj99/M1cdTAwMWaLXHUwMDBmzz9uN2BIcualXHUwMDE0XHUwMDEyoLBgXGI5XHJcdTAwMTijmVx1MDAwMmiEXHUwMDE2XHUwMDAwlPNUXG6XmEuStFx1MDAxOC7NZt3X/Vx1MDAxY7hoyYzV2mH2XHUwMDFkl964OXCxjHMvhFLaXHRcdTAwMWJ+zMKFtFx1MDAxNTAgodVcdTAwMTbipdo4OulcdTAwMGY+tujo69sv5+3PVddcdTAwMWb9ti68SM7pJ+HFXHUwMDE4X1x1MDAwNlx1MDAxN3KklTbWq6Xx0jn8POomn/aTs9rvXHUwMDE34urDiXxRK8NLfdhcdTAwMWaNKq0orbdWRk0jXHUwMDFhteI1+1x1MDAxOcu0gC06r1x1MDAxYzmp3Vx1MDAxNGzIOGYtOUVSSyvJluKGvKW6WIybSDdcXLM5z81IYNcqJ7mRzlx1MDAxYjVcdTAwMWY3XHUwMDA2XHUwMDFlXGLYJmG5VlSAXHInst7+/2CzyFx1MDAxMXBBOXPapGE7onLD5orrKWK5zbDjVrv6u+hH34bttj/8/KR/dWBGXHUwMDBmwrBJXHUwMDFhhseFgFwi4aXwVlx1MDAxNVxm2znoSFx1MDAxOD7ehtxmLFtcdTAwMTODN1x1MDAwMJ9wqYUkp+dYtmNSWlx1MDAwN4kkcStX8Fx1MDAwN5Z7z32ug9vjXHL4XHUwMDAxP0r4s3Zy/Pn923ftemOvqqO1eVx1MDAwM6hJ7n5cdTAwMGVobLk30Fx1MDAxZTNcdTAwMDPmWVx1MDAxZTT0vGmOa206ODNP7fGzoz96+29ePFxi0Fxib1x1MDAxOPSR8ko4skLYXHUwMDE5zFimtCdcdTAwMWPnoFx1MDAxMr9cdTAwMTnEWMk0QchcdTAwMDHAVivLzVxcxEAowE8gXGI0XHUwMDE2gYcsOFx1MDAwM2GgeIXbypij0W12Kud76ctLx183zz+6bq31cm0xh3JcYlxmf1xuaryTZahcdTAwMTFcdTAwMDZaweeDn9tA036epFxyxFx1MDAxYldu7+jL8e/fXr/dt1fbXHUwMDFkcihcdTAwMGLm9lxijiUoXHUwMDFhcYc1M3BBzIFIXHUwMDA03lx1MDAwNbZovNuMi9FcdTAwMDLCXGJdkZBGmH2ei7/z4lx0jlx1MDAwNZBcdTAwMDEuQGWSTFx1MDAwMTBcdTAwMDCbRXxk+Vx1MDAxNlx1MDAwMmbvlWup11x1MDAxZn47ODmo7lxy313uXHUwMDBmnlx1MDAxZV6uzc2Az9xPcjM5Qp1cdTAwMDFcZrBcdTAwMDInXHUwMDBma1lcdTAwMWEw56ed/cq3Wvz5ZPhsXGJ5xvfb1eGD8DLQOcxcdTAwMWGjINbB4cLQNGzIMKWCn5FSOlx1MDAwNOylqLnXypZWTDhccmRcdTAwMDKYlqQqXHUwMDExZlp7zFxuwlx1MDAxZppaNLhcdTAwMDGNVFx1MDAxZbAyW1x1MDAxOak/edlsvuw2o+rzKq9cdTAwMGbkc1x1MDAxZD85XHUwMDFirFxyNMpcdTAwMGL1c7xcZilZ6mak4NBcYpKWdzMno+qb4703sTx+Xa/pi6+v9p7V0+12M8JcdTAwMGJcdTAwMDZcdTAwMDWKUXfGec6FnMJcdTAwMGK8jOdBLoHYneZcdTAwMGK8zL2WtixuI4QxxKXh3PB5eNHoJ9DktVVcYnxcXHFpyyP+NMZtJV5O3nDVbtqjZ9XTs96AXHUwMDEyf1lcdTAwMWK9W9/Klsyr1HviJY2v0rn+xZRcdTAwMDGFNOJ+jo/lkVJLasPTJl0mzVx1MDAxN713nz7tX/whzv/YXHUwMDAy/+JvxVx1MDAwYlewQ+NcdTAwMTVcdTAwMDI3XHUwMDBmYUTTskxcdTAwMDb/XHUwMDAyMtdcdTAwMWFcZmasz2VWXG6yLFx1MDAwZe87yjLHXHUwMDE0xKFcInhcdTAwMTgxXHUwMDE3LFx1MDAwNW9cdTAwMTJyLPBItFx1MDAwNlx0NtWwXHUwMDEyXGaoeVlcdTAwMWao3udBP+k3TuX7yodPJ5XlYPB40XXvXHUwMDEx9Cy87j3c3MLrbnRpw+DD2Vx1MDAxNeggm/t+Lz1Kvo1jLD51tFx1MDAxYXWTztcp0Ix5XHUwMDAyXHUwMDFkPExcdTAwMWGNuLc7dfxJJzlcdTAwMGKcsduJm9Nkkib1qDNpTvvZaO7WcZ8o6cXDovX1h8lZ0os6b0vuiWeMXHUwMDBmf1x1MDAxOD+xnPmfRqM4tIbjbiHvXVx1MDAwZvRcXI1QmvzyVsNrks3c4q3LN1x1MDAwYlx1MDAxMbA+4ltRKCzBe8SgXHUwMDBlNIjNg+1cdTAwMGK0h0E3JMOCidRcdTAwMDJyopT2mtzVOb/j8o1cImZcdTAwMTBccjv0ZqzO5lCft1xmYlx1MDAwNarNhUSXUYWEMVx1MDAxOehcdTAwMGJroCU2oVx1MDAxM8TtOuE26K5cdTAwMTIu5oY5XHUwMDFhpntJr5H0zqY7dlMqUVvC747BXr9cYr2scEZw6EZAbCH0XHUwMDA3oWRCOYxYNFxi6pApS1xiplxmJt1K7XTh4eNeI+vU9HNEo3S/3+0mKUbgVT/ppbNnjFx1MDAxZulJQGUrjlxu04Ar59tm4TtcYlec9kfZbzuZcY+/TH7/8/HcsyvlhjduLthcXHbBR/mfq1OPLc23SOmVlnaFvPtiJ7nF1IMgXHUwMDA0slx1MDAwYlxcXHUwMDFiXHUwMDA0vjTTuVx1MDAxNow6XHUwMDBieTmIISG0l1x1MDAxYmJcdTAwMWVumCVvjVx1MDAwMeNcdTAwMGLu5Jx1MO+Z81JLXHUwMDEyPJSkmDm5d6UkXHUwMDAylFxcMcU/zDM5+1x1MDAwN/NwJqw0XCKsjFxiN1x1MDAwZW/m8Fx1MDAwZWbAO+4xXHUwMDE1XHUwMDEyU65cbo8+xTtlXVqcSpkhQ++D14Pqt55bymqVJp1cIs1AgVx1MDAwZVZqvHWKfJFcclx1MDAxZlx1MDAxMueVW3x4VVxuxr4uylx1MDAxM6o8xawtSVx1MDAxM6LdpTlvsYDfYs4jXHUwMDFmKlx1MDAxMpTGuCOUnFn8lzzkXHUwMDA2gI5cdTAwMDCSIMo2wnmamIdSUnB7Tlx1MDAwMId+XHUwMDBl54WVTlx1MDAwNzhIgFx1MDAwMj/zRUk3pGcst95ztZFcXNnfhfNAMEKEXHUwMDFjiyTtiVxmz5VRTFxixjFcdTAwMTCeXGZpXHUwMDE0ZeD5TfHhl2K9xUv7U0SsvfbeK4/bwlx061wi5zm4Xm5IaDLh7Vx1MDAxZTTjVcpccn7cXFy09Vx1MDAxNTmvbGVN5eLHWcrzXG6S01x1MDAxMS1cdTAwMWZhvjh9V3fxxaj1KUk+V3k82I+02lx1MDAwMOWtf2lNXHUwMDEyLE4oLrlXRoisXHUwMDA0IPx5RXtcdTAwMTaKL5WxinuQX3nq5l4ra4bJ4OtcdL2AXHUwMDBlUfPynXNcdTAwMTbXeFx1MDAxMKjriCjvvrZ2j2Ljx4uue4+izIXXvceS+MLrbjSfayQ4epXUVDb3d1lbe5eMktN85upnLK5cdTAwMTVuutHVNZdcdTAwMWKNYkmhMd7QXG56bzFcYrZY71x0wSTCXHUwMDFlXHUwMDA09Vx1MDAxZVx1MDAxYVfPXHUwMDE0XHUwMDE0VmTYkaGD55HgpTzTrFPxIZpilksnpdDgWGvn7MggXHUwMDA1L8ilXHUwMDE1goPyjJSF8ijLXHUwMDExpJt8jfxcdTAwMTYpvrvCd0nFt9j5TokrpTG+TnunXHUwMDExRUHNXHUwMDE1xJVnYe9ccsaSYzosnuBuem/x/qRpXHUwMDExXG7L87hfiDgwXFy5stZJpzQzYX+UJFwi4bQ0XHUwMDBmO8itlFt8eFx1MDAxNW19RcVXynqel9aEKqkw43JcdTAwMDXSW+yht5j0lGU6bO/iQWxBc01zntBMc1x1MDAwN1mljFx1MDAxMiRcdTAwMTfsQrtcdTAwMTfnecZcdTAwMDNcdTAwMTDD0i5cdTAwMDIvk7vNhPOsYyGtXHUwMDExpL/lSs4p1XFh3Te/qeNcdTAwMWbKm5ydUVx1MDAxZYW6a+1cdTAwMTRcYlx1MDAwNoNls/rrXFxA6aDtlVx1MDAxNVx1MDAxOE1cdTAwMGKQ3JHzXHUwMDE2bzGb6lx1MDAxM0dA7YWwIe4jo82cNFx1MDAwN1x0xoOVOtio1WDFYq9cdTAwMWVcdTAwMTbplZp8eM1cdTAwMWH72ihPli7sXHSjhSbrlq9PXFxcdTAwMWM8bDHlYXRtqFx1MDAxYuHhTbn6w2vKI+ZcdTAwMDUhzIVcZoQnLi+Cv9e6nlx1MDAwMetcbmd02L/ipJhDeFx1MDAwZVJcdTAwMDBhtlPEdUBGMeJFgKxcdTAwMDOCtzKVsS2MXHUwMDA3RVx1MDAxNTZFWScxliZcdTAwMTRqZ1x1MDAwYrl5dlFcdTAwMGW04yyUv3eY/7tx3uLiw1x1MDAxOZ0ngvWR91x1MDAwNnOsqSjzwl5cZlx1MDAxZVx1MDAxNlx1MDAxOTWZkPotZlhcdTAwMWVcdTAwMTLjlVp8eFx1MDAxNWx9XYSX3/Y1Q3iGbChBNssnb1x1MDAxN69qbDHhecuE1y4kirjXdobwJDHuudYqbMjBuZuJa1x1MDAxMUaxUJ/o+bjk2qs5237CNlFg0IXFd6EgOHO7Ua85T3BcdTAwMDOdgLh2K1NcdTAwMTlbxHlcdTAwMWEqz6vwX1x1MDAxOUT4N1x1MDAxMkXK88zD4UPiwcdcdEl3VXmLd/VMK09MLJE2wuElpJiTvpU4SfLrfWFBXGY+aMYrt/jr1llbX1x1MDAxN+fBp5Rxnlxy61x1MDAxOGaFPSiLiyS3mPKUYlx1MDAxNHZ0gNikhFx1MDAxYp0pWOFwrl5ybZQ3SmteXlwifC/OY6BcXO28XCJHYehpXHUwMDFl53HBnFx1MDAwZVx1MDAxMER4g1CguHGLh/9VIN1m9lx1MDAwN/9dsrdcdTAwMTBcdTAwMTCgM+5k2HbkNM8yV7m4Nmgt76xyQFx1MDAxY4TX3Vx1MDAxOG/xjvlpXHUwMDE2VpysXHUwMDE1MEOQXHUwMDFhmNjPXHUwMDE1eVx1MDAwNJ62UCNcdTAwMTJv+8DTt+VcdTAwMTZ/3Txr7GWc9+jmXHUwMDE2u9FgcJTC6CZcdTAwMTNcdTAwMDLjT1x1MDAxYTdJnOw5d78k8eXe3O0u4Vx1MDAxNfJL41x1MDAxMVxyjFx1MDAxNY+R8P3R9/9cdTAwMDGvMlx1MDAwMC0ifQ== + + + + + HiddenVisible diff --git a/docs/blog/images/compositor/cuts4.excalidraw.svg b/docs/blog/images/compositor/cuts4.excalidraw.svg new file mode 100644 index 0000000000..a97c4bfd4b --- /dev/null +++ b/docs/blog/images/compositor/cuts4.excalidraw.svg @@ -0,0 +1,21 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nM2W32/bNlx1MDAxMMff81dcdTAwMTju66KQx1/HXHUwMDAww7A22ZC0SJBcdTAwMDVoVlxmQyFLlC1YljSJTupcdTAwMTb533eSXVNz4lwifVhhP1x1MDAxMNZcdTAwMWTJ+97dxyd/OVx1MDAxYY3GflW78elo7D4lcZGnTfww/qmz37umzauSXFzQP7fVskn6nTPv6/b05GRcdTAwMTE3c+frXCJOXFx0n7fLuGj9Ms2rKKlcdTAwMTYnuXeL9pduvYpcdTAwMTfu57papL6JQpBjl+a+ataxXFzhXHUwMDE2rvQt3f5cdTAwMTc9j0Zf+nWgrnGJj8tp4fpcdTAwMDO9K1xiRG13rVdV2YvVWlolOeB2Q96eUTjvUvJmJNlcdTAwMDVPZ1x1MDAxYV+u4n+8Zyw7f88/v8W7XHUwMDFic+mWIWqWXHUwMDE3xa1fXHUwMDE1vaq2omSCr/VNNXd3eepnX8s2sO871VTL6ax0bZc931qrOk5yv+psjG2t61x1MDAxMpyOguVcdTAwMTM9XHUwMDFkg4qY5spKLaRUzKDa+rtcdTAwMWKE0ZFRginDpLRD71rZm6qgTpCyV5BZJ2XQNomT+ZRcdTAwMDSWadgzgVxmJpOw52GTL0dcdTAwMTYxXHUwMDA0a4Fz+m602W6ZuXw6811NdCRQokZpQWlcdTAwMDFMXHUwMDA2Ka5vXHRHNMpqNehYJ6C+SHs6/lx1MDAwZY1oiKuL7ki5LIphNct0U82vXHUwMDE0XHUwMDA1jsTG8lx1MDAxODLs9p9cdTAwMGb4XHUwMDBiXHUwMDExlnVcdTAwMWGvOeFGXGLJtdSgVMiqyMv5bviiSuZcdTAwMDGto0Gs70OaXHUwMDBizfYxTdVFziwz8GKooTzO/Mez1F/lS/1bXHUwMDE1N7/by1x1MDAwZodccjXXXHUwMDEwobDaKkKbKa31XHUwMDBl01x1MDAxOCFXUoJBZsHsRdoxwVx1MDAwNf820lmW2MQ+g7TmXHUwMDExXHUwMDFhNFxmhURGYvBZpFxyt1xuOENLgZCbJ0hcdTAwMWKaQFx1MDAxNlx1MDAxNYdDQ1pcdTAwMDBqMFx1MDAwMD9cdTAwMDZpXHUwMDA2alx1MDAxZtKgUYCVSr+Y6OT6V+Pe/FHfTpqSXfx5/27lXHUwMDE25rCJVtxEUqBcdTAwMDIlacThYPatgTZcdTAwMTFBRG2h2WdoiOq9SHNreFx1MDAwMt9GOlYpZtlTpFx1MDAxNUQ0fVxyXG5mqPGSXHJUXHUwMDA0pE1EL1x0LiynvpCioZRcctJcdTAwMWOFJpkoXHUwMDBmXHJpXHUwMDFhXHUwMDFiWlvkP1x1MDAwNmk1XGK0g7RcdTAwMTJgNKOX3YuRfv2xuJmdfzj2+dnd2+vrbHFjpvKwkVx1MDAxNlx1MDAwMlwiYKhcdTAwMDSNaCaM3Z3RNlx1MDAxMkqhRamAXHRQ4v+Z0t0vXHUwMDA3uKT528nQTD2DtIpo1rFOXHJjnFx1MDAwM4gnSGvT/TVcdTAwMWHO+INBWmpcdTAwMDNCfjfStPaXjuO6vvV05VZcdTAwMWGllqe3+Wf3n2vG97l7eP1s5bvP+Gijv0PR9Xk+XHUwMDFlPf5cdTAwMGJcdTAwMDPzXGZcdTAwMDEifQ== + + + + + diff --git a/docs/blog/images/compositor/spatial-map-grid.excalidraw.svg b/docs/blog/images/compositor/spatial-map-grid.excalidraw.svg new file mode 100644 index 0000000000..c12cc1dc39 --- /dev/null +++ b/docs/blog/images/compositor/spatial-map-grid.excalidraw.svg @@ -0,0 +1,21 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO2caW/bOlx1MDAxNoa/91dcdTAwMDSZL3eAmpc8JFx1MDAwZslcdTAwMGJcZlx1MDAwNkmafWvqLG1cdTAwMDaDwLFcdTAwMTVbsbxEVlx1MDAxYztcdTAwMTf973PoLpa3xHFcdTAwMWRbmFQtnESUJYp8XHUwMDFmnnO4/f1uZWU16TaD1b9WVoNOsVx1MDAxMIWluPCw+t6fb1x1MDAwN3ErbNQpXHR6f7dcdTAwMWH3cbF3ZSVJmq2//vyzVoirQdKMXG7FgLXD1n0haiX3pbDBio3an2FcdTAwMTLUWv/2n0eFWvCvZqNWSmLWf0guKIVJI/72rCBcbmpBPWnR3f9Df6+s/N37TOUuXHUwMDBlikmhXo6C3lx1MDAxN3pJqVxmclx1MDAxOD571Kj3Miu4XHUwMDA2ozWi+HlF2PpAz0uCXHUwMDEyJd9QnoN+ij+1elKNTk9KodhuNa9kd0dpa64u+o+9XHSjKJ90o162Wlxyept+WiuJXHUwMDFi1eBcIiwllVx1MDAxZuWWOj/pW3HjvlxcqVx1MDAwNy3/+v1sNpqFYph06ZziP09+K4K/VvpnOvSX5YxeUlxuKZFcdTAwMGJllPuZ6r+eQ8OUVMpcdTAwMTmH2v8ynK+NRkRcdTAwMTVB+fqHcEZcdTAwMTShn7PrQrFapuzVS/1rXG66ZG9u+tc8fH9bhcC4XHUwMDEwRlijfyZWgrBcXEkoXHUwMDE1NWVRKplKa1x1MDAwNb0qXHUwMDEwoNFIXHUwMDA3qWz5RzZ3Sz05/Ldf8DFcdGnXf6V+XHUwMDFmRenSq5e+l95AwrVP2Ewpq3+r+2ap8E1cdTAwMDDCSMqT1cYo289AXHUwMDE01qvDt4tcdTAwMWHFal8zvbNf388gVin4RLFcIoJTTnMztVhVefP27KJ2e3Z4d9tqmOvKSVjezbRYjWXKOuTGOGmUXHUwMDAwNSBWXHUwMDAxTFtcdTAwMGLOXCJpXHUwMDE1lJPZ0irnXHUwMDBlhbT4RqRcbnKiVJWiXHUwMDAykpbrqaXavDh6XHUwMDEwtf3c/n0nL5LLu+NDs/WQaalSu6pcdTAwMTVJhNtx7arzXHUwMDFh4lYoLZVGrXW2pGrRgFAo1dvQqlJiolbRcXJcdTAwMTFcdTAwMTRO36xeXHUwMDA3obpyTdyFQ6lO70rr3Y1GO9taXHUwMDE1zFx1MDAxYYOKay79XHUwMDA3XGZolfTDXHUwMDEwuPvWqDqdasGyIFZH5t9ohOW1q8i140abxWhV6klatZKcOOfc9FKtVtZqxY1cdTAwMThPb91tvX7VxC83t51sS1UzQVxyp1x1MDAwMsNJilpcZnpcdTAwMDCgNZNaOMU5gFVoM6VUQfZcdTAwMDCEs/aNeKs6ZfSGpOqkU5JbPX1kdXB+fnuSXHUwMDBmP3I8qD/Wu/HtcatcdTAwMDLZlqpcIi2iXHUwMDAwSY1cdTAwMDPJcchcdTAwMDMgVJni1lrtJcHBZUqq5DyT61wi4K0oXHUwMDE1JsdVnFx1MDAwYutcZjlqU0s1WDusJEXO81x1MDAxZrfOPl6auHXf2HfZlqpmXHUwMDFhuUJcblDGOKtKKIZUXHUwMDA2jjtcdFx1MDAwZVx1MDAxMLPlXHUwMDAwXGLKXHUwMDE3OPKi7Vx1MDAxYlx1MDAxMauxXHUwMDEzxVxuSN4qt3x6sX7sloqYv9o5/tyuXFxcXJY+3FX0TSHbYkUmqLi1NUiCtdZcZorVSVx1MDAwNs5wZaWgpjXlt2dBq+RGXHUwMDBiXHUwMDBiSuL/T8OaXHUwMDA0nWScTN1E409cdTAwMGWcXHUwMDExXGIyXHUwMDA17HMqzUm4bPOjg/VcdTAwMTZurZvP7Y9Y2SrOVaWlQqtcdTAwMTK8QKZkXHUwMDE3ntEpuamMK62BXHUwMDFhVSlQ2aGuVYXMWeBcdTAwMTRVaWe8kl9FqcaSXHUwMDE34sjf0oZcdTAwMWNjLcWoXFxhVKbktVBTopfZWYVcdTAwMTZAp1x1MDAxYbLnZdrPVaOe5MPHoFx1MDAwN9zA2a1CLYy6XHUwMDAzVdrTL5UgKaRcdTAwMWMkK2J1IGUtXG7LXs2rUXAzKPMkLFx1MDAxNqKfyUmj2U8t0pNcbmE9iEdLplx1MDAxMYflsF6ITic+ld4z2PlRNYKlKue60FxufKo/b2diUriJXHUwMDFkXHUwMDFkRpKb45Tq1/hzTH7Kb59thFx1MDAwN+2L7fPrbrt6JGt79nPmmURcdTAwMDZARkMpxTWaVCdlzylcdTAwMDdmXHUwMDAxNSdnh36QY/4qSFrDhCEkqU3gXGJj7McokEJTJCGsdf3XeStAwlKAhMVcdTAwMDBcdKleo5HAw1xuIU3KUD9cdTAwMDfkmrm+3tj6tHnROJJcdTAwMWSo7lx1MDAxZNx9qq1nXHUwMDFlSMWo2UFcdTAwMDB6U4qF5aCRJFeB+ZFcdTAwMDJOvGBcdTAwMGbL1yFcdTAwMTKZ9kaSmFx1MDAxZnTbnkJcdTAwMTJQIf1cdTAwMTdLXGY7loSkXFxcbpJyMUhKmIykXHUwMDA035UjUuNcIs8x2bpuXHUwMDE3z4/bN+dnt+5cdTAwMGLu34rSwfV8XHUwMDA3XHUwMDAzXsdIXG7ySinut4qDSnWt927gOJNcdTAwMWOdMVx1MDAwNryVhFdiUlx1MDAxM/mOXCJ7QVx1MDAxZuPjrFEoiVx0yj0ss4d1SUyqpTCpXHUwMDE2xORkv9WSXHUwMDEyJXcvQLJzfnLXqsBGO6/Og1pcdTAwMWU241x1MDAwZnv3mUdSMUOy8v1zXHUwMDFhzDCSYJBcdTAwMTmL5FD2ulx1MDAxZLh7nV5cdTAwMGZCXHUwMDEyXHUwMDFj0YhGXHUwMDFiK6b0XFyVkELS9W8vlNRLQVIvXHUwMDA2STW5XHUwMDE3UoGTzlo5fffOfSf+ctiVhbvSXHUwMDE53JVzravDbpx9JIFcdTAwMTnnO9MsXHUwMDEycGbIc5VaMS1cdTAwMTRaLrV7VSRnsJJcXFx1MDAxOW7wXHJcdTAwMDaTuFx1MDAxNCRxMUjqJ4JJiU5ILvj00eTV2tZVrlx1MDAxNoliXHUwMDE1tpr5OKp2y1x1MDAxN18yz6RcdTAwMWZURTRCkGvqcGh6gJKSWU6BJMCrmknJ/DRcZuJe+DFu18/Ek12uXHUwMDE0TYKH4s1BaZZcdTAwMDKlWVx1MDAxMJSp8Gh0yq7QXHUwMDAy+fRdrie7p4ebJ4fr0Vx1MDAxN1lcdO/Updg9VVuZZ9Iw1OSXkrScXHUwMDBmKVx1MDAwN+0k2UjGLVx1MDAxOSRcdTAwMDRyXHUwMDEyuVVDOZtcdTAwMTOSlsGLzaRC8mJQLXNy+ZKItEsh0s6XyN5VY4ikdnlcIpFae3VwNf34uTs5s5dY38XCfrx+2onFXHSYesaRNIJJhVx1MDAxMq1cdTAwMTVcdTAwMTQzglx1MDAxYlxmJnN+6jJSXHUwMDEySi2tRP7EPPrA/3tcdTAwMTLJJC7UW81CTFpcdTAwMWbFXHUwMDEyuWbOoFx1MDAxZTtcbsKZsFrLXlx1MDAxNlx1MDAwNXfjZilxv/4jteJhZj5/iKcvXHUwMDFm+H7m6yzYWk2l614yxJ4q4kKcrIf1UlgvXHUwMDBmfyWolyakRIVWstGo1cKEsvGxXHUwMDEx1pPhK3r3XYvjxkMlKIyUXHUwMDA13XliWtPfrr+8ylx1MDAxZv3fVvrS6v3x8/f/vlx1MDAxZnv1mFx1MDAxYfdHbrSy+3d6l/75UtohJa2ReVxiYMkjhuknIT7aQyfPO5/rXFzeXWzn241cdTAwMGbxZ5592P1L0qs6MVx1MDAwZXZgQklEtFxuhDDwxCyEX4SdM+vs+NFcdTAwMTUjgSmKoimbSvj6XHUwMDFmJl041Fx1MDAxNFGLlPOQXHUwMDE11lx1MDAxZMVcdTAwMTLkxP1mffTq4Vxu98dIVc+Jc6EnrjdcdTAwMDJutFx1MDAwMqNSdv850Hfr16e7+dbD+tmHveZcdTAwMDe7dldttzcyXHUwMDBlOlx1MDAxYUOetFx1MDAwNuRKXHUwMDE4XHUwMDAzqTVF30BcdTAwMTfMKlwiXGK0deTjPDGH81x1MDAxNzn3i0ksOP1cdTAwMDTtnPkxXHUwMDFhqSxKapdSZfRzllx1MDAxY7f0Zdmv0uzQrqT9TfuYqydUuz9GKnxezKvJtt1IXHUwMDAxZDPs9MxX9y5MSd64Xdfeaa592lx1MDAwZTSv5TPOvETDXHUwMDFj+ejOuFx1MDAxZfNq1JU36Jyy2nLprH49V57aXHUwMDFlzSeMXG5cdTAwMTlAxkXPVTfkXHUwMDE4m1x1MDAxMeCdMtJJmU3rjtRcdTAwMTj95n3k6tFcbu+dXHUwMDFkruo5oe4mz3nnXG6c0JBqXHUwMDBiniP9YWfzsnzVXG47tSPcbzfjo1iqvYyTbsibXHUwMDAya1x1MDAxY8dxbjydYYDSWip75bR81ZjdT2vGsX1onGnjqPUn58PqcVx1MDAxMbtRVjpqj7JcdTAwMDc6tY1Splak/1x1MDAwNv3HMVrh/siN1PWcSE9NXHUwMDE0XHUwMDE4XHUwMDFlV+41KVx1MDAwZafvnLuqbJrr2uerzeOoyy9cdTAwMWa39rdcXPU666BLpqg9U9xJz7FcdTAwMWVei0XtgOGI1FxicJveXHUwMDAx4zX65vyKYiU11+NHsThcdTAwMDOLyjlcdTAwMGXjXHUwMDE3ZmlnOPFu+lx1MDAwNZEh2p1I7evzm/ZcdTAwMWbHxGr3R26oxueEfFx1MDAxYYqRXHUwMDE1bVx1MDAxNLcrpV6wUvhwL9oqXHUwMDFmXHUwMDFjVW529fHp42Yl+cKPm9mH3jkgVY7tpEMtXHUwMDE4KFx1MDAwYqBQmlx1MDAwMdDmzrxiSjuqdb/+YWyvvGCaXCKJgXVcdTAwMGKpXUOkj1x1MDAwMLPXXHUwMDFmT148d/q3cVx1MDAxZr16Yo37I9ev7Fx1MDAxN5I+aTTcTFx1MDAwZdjBIJeGv2BToMdcbr/ePTjNbT+sNVx1MDAxYZ18q+zOj8tcdTAwMTlcdTAwMDddXHUwMDAws1x1MDAwNDI56mRcdTAwMWPJpYLB1as5IVxm81x1MDAxMY0gkFx1MDAwNPlXT6xfXHK4XHUwMDE0UsxcdTAwMGW7MsxcYkcm2tCNppvMSVx1MDAwZcm3fTd+nfDZ91rRzqbm2r32iPhcdTAwMWb8Pf/nYofDh1x1MDAxZfmqXHUwMDBiXHUwMDAyzVx1MDAxM1PGNJLv9lx1MDAxMiBcdTAwMGK5XHUwMDAzk+dHPGjquLRcdTAwMWJ1kJtG1oGkJoeRr+PHXHUwMDAyiUdI757zXHUwMDFkSMdQoXZcXEnutz96PSClY9JQXHUwMDA21IvWIVx1MDAwMVx1MDAxN5ZcdTAwMWWr+FKhRKlgcdNU/lx1MDAxMIuHUixcdTAwMGXK1LTF4X1zqJwpplx1MDAxMtP3ajeLuVx1MDAxZNxuPFx1MDAwNuHR3oU9XHUwMDA0pT5GtYwzafxcYiGnXHUwMDE4Q/pe6/TGXHUwMDFlve8rwZQ1ikwomVE/SSVjRGqy2pZazjl0cs1cdTAwMGWk5Y7PNFx1MDAwMWVWKylcdTAwMTZvJcWigHST41Ncbno4uWo4vZXci2VcdTAwMTNrUrU3Tu5yXHUwMDBmx2f3NVGuZpxIIFx1MDAxYkhtvDDgl82jkINcdTAwMDGqtJZJYoRcdTAwMWNWZSnYmrxcIvCXnVbLyGd1iGSN0a+fn1x1MDAwNkjhXWm0Qs2hI2p2XCJccpnpl+xcdTAwMTH4y0TC4omERVx1MDAxMWkn7y6rrd+pUtrpe4zONzvd+s5+p3BVLG5v3Vx1MDAwN8nRzWOUcVwiyTQyK41cdTAwMTe1X1x1MDAxMDhoISVnjnxVSkJcdTAwMDWY3sd17lx1MDAxNlIwMtFcdTAwMTTK8uFcdTAwMWSPnuKRXHUwMDBl7Vx1MDAwNPA5zO/4XHUwMDA1XHUwMDBiabWaaWB3Vpd14Vx1MDAxNlIszkKayTxcbj/9ymoxvYXcaj10xc7lI/BmIzrrfqrcfsh3s86jscScdUg4akjv69EzkMYxgX6WpUOKXCLVXHUwMDEze+jOwWe12nfrcFx1MDAwN4aYnGr1XHUwMDEx1ZFcdTAwMDRyZZZcdTAwMTlDXHUwMDEyknK2mVx1MDAxNrNcdTAwMDK5cFx1MDAwMylmN5Dvvnfhrlx1MDAxNprNfEIlt/qjl5yqKix9f/3+41fbYfCwPmaJzE3vWH33XHUwMDFkck9T0Oty//ru6/9cdTAwMDDdbaHXIn0= + + + + + Widget 1Widget 2Widget 3Widget 4Widget 5Widget 6Widget 7Widget 8(0,0)(1,0)(0,1)(0,2)(1,1)(1,2) diff --git a/docs/blog/images/compositor/spatial-map-view1.excalidraw.svg b/docs/blog/images/compositor/spatial-map-view1.excalidraw.svg new file mode 100644 index 0000000000..054e9e8a4e --- /dev/null +++ b/docs/blog/images/compositor/spatial-map-view1.excalidraw.svg @@ -0,0 +1,21 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1daW9cdTAwMWI5XHUwMDEy/Z5fXHUwMDExOF9mgVx1MDAxMYcsXsVcdTAwMDFcdTAwMTZcdTAwMGJcdTAwMWbxldixLcfXYiG0pNZh67LUli1cdTAwMGbmv29RSazW0ZJl6/IkMuCD3VKzm+9VvSpcdTAwMTbpv969f79cdTAwMTZ1XHUwMDFh4dqf79fCh1xcUCnnm8H92u++vVx1MDAxZDZb5XqNXHUwMDBlQffvVv2umeueWYqiRuvPP/6oXHUwMDA2zZswalSCXFzI2uXWXVBpRXf5cp3l6tU/ylFYbf3Hfz9cZqrhv1x1MDAxYvVqPmqy3kVSYb5cdTAwMWPVm9+uXHUwMDE1VsJqWIta9On/pb/fv/+r+z3Wu0q5XHUwMDE2ds/ttsb6ZtRg62G91u2ncMitMjJ2Rrm1RZeKwjxcdTAwMWQuUHfD3lx1MDAxMd+0dpaKmrdcdTAwMTfuIbWfP6zcwfHjQ/Gm07tsoVxcqaSjTqXbo1adbqR3rFx1MDAxNTXrN+F5OVx1MDAxZpV+PLJY+9O78kGrXHUwMDE0xt7WrN9cdTAwMTVLtbDlb108tdZcdTAwMWJBrlx1MDAxY3WoTfGnxqBW7H5Gr+XBv0lIppzi1jlcdTAwMDPKXHUwMDFhbp5cdTAwMGV3ulx1MDAwZkEyRKmUXHUwMDE1qDlXqFx1MDAwN3q2Wa/QKFDPPojQf/W6llxycjdF6l8t/3RO1Fxmaq1G0KSx6p13//2eXHLXXGallEpqrlG73mMvheViKfJdZ4BGOceBzrKxroTdIVEgUFx0i/h0wF+/sZfvXHUwMDAy43+9cWhcdTAwMTKk9vw7aneVSvxZ1vLfn+VcdTAwMGZcdTAwMDD1IFx1MDAwNN9b/u7doD//Y1xmer0r3DXywTeYXGIrpTVgjVx1MDAwMOzdXHUwMDExwfFm8PKVeu5mXHUwMDA0slpR0Iw2yrV8uVZcdTAwMWN8S1jLJ1x1MDAxY6lcdTAwMDStaLNerZYj6sZRvVxci1x1MDAwNs/ofu56s1m/L4XB0LOgT0481vBcdTAwMWbX45p/9X5738NX94+n3//3+8izXHUwMDEzR92/Ulx1MDAwM1x1MDAwM977sHfxn9+HZIj0zTBcdTAwMTd9Q/0o5rsxzJc0YDbGnUnEbzdcdTAwMWU3TLp22N5sXHUwMDFmXHUwMDFmZz5Xt+RZ/TyB+KUgV7prhlNTf8BgTGI+TGQ+KKal4t175dzqXHUwMDFln/z7U1IzJbRFLiyBmHOpXHUwMDA2elx1MDAxNqO+s1wiXHUwMDA3Y6n/IdB5LFx1MDAxNIZpr1xmMC7oXHUwMDFhXHUwMDE4I/RcdTAwMTPjjWZgR5JdcoFgqXuvJ3vfgbmy+uVwJVx1MDAwYp1cdTAwMDRX50Arst74bLhcdTAwMWXJraPWwUHr8nDvXHUwMDE4djuiVdraulsuXFzlZLhcdTAwMDKDLlxmycb3e6Kuo5NMW64kjYxz0ki7UmBVkivlu/2PXHUwMDAxa6KgspiEU7p9cNxI/nyghnC8k7mvnSq4PK21IVx1MDAxM0aQSbKrKyOoXHUwMDE0Q1x1MDAwNUZrkN2ftlx1MDAwZqcprZhcdTAwMDNcdTAwMTCgyXpJK1x1MDAwNFx1MDAxZmNWX6moOEOHfXB8gqqVwJTh1Fx1MDAxM1BcdTAwMDJcdTAwMDR3Q+aVeqjgl5Z6S1pqaLz9a2ikp1x1MDAxNFFJRKfwKIno2lx1MDAxOC2M4c9cdTAwMGac5IXGLyfXt3K7fFx1MDAxYeRcbqXb87ONx6XyfKI/UkIw61x1MDAxZim5XuXQ9T7kXHUwMDFizSXzTkJcYlx1MDAxNFqRoNRmoGezo7llXFxzi0TYXHUwMDExPFx1MDAwN0NcdTAwMGVLk8CzlkJZXHUwMDFiez7feFx1MDAwZUJZ0t6oeoP1i+irTvThXHUwMDEx77ZcdTAwMGWO9ZRMXHUwMDFmXHUwMDFmLmnhXHUwMDA2m3/wXHUwMDFkjKHIm+tcdTAwMWW4JvH99uGufbJTl53N88fz3N3Bo61cdTAwMDfBTPk+pfyMS7PRfHfIXHUwMDFjXHUwMDE5NUVO23FtYtGjfz9cdTAwMDKz6JxG0uLWXHUwMDE5/ao0yYdC9zXMdJJcdTAwMTRMaqetcdJS1NyTXHUwMDE2T4RcdTAwMDfkTEp02llLUXNMXHUwMDA2f+O7cKScXHUwMDExtfrnSNGxuDVcItFN0Vx1MDAxOJJCM8+P8nfVdSdX0Lx9WTy/NIWdXFy2kUsvN2yaLEdcdTAwMDFcdTAwMTn3gOSO9Fx1MDAxY5p+NyWNYcBcdTAwMTVHjlpcdTAwMGJcdTAwMWGalYqahHSoiWxcdTAwMTJ+XHUwMDBlrGpMjp3IupDiiKc7JqH1vn1xILOVx1x1MDAwM9zeXFzXXHUwMDE3hdxpur618kG+Y1x1MDAxNOOjI1x1MDAwNWnpfvvRqijI54LQanz4z2NcdTAwMGVpJdBKYtCgcT9LRopUb6Jl5WhcdTAwMTVoeH5cdTAwMDCwIYKTSlx1MDAxMJykLoN89ust35K1i8xcdTAwMWJcdTAwMDArolx1MDAxNUCxMreKvG1cdTAwMWZaNVxiiseUtZbEv1x1MDAxZaf/l1x1MDAwMFZLXHUwMDBlwZJtnUF4v1wiWI3Ch2hknKogXHSmmlx1MDAwNFx1MDAxZHk/eL5NPcmu71x1MDAxZFx1MDAxNtc38reX27uXp1ene/B1b8XzUVowXHK6699cdKlkOftQmlx1MDAxMsiM1FKCkY6MlzByLkC16JWrkyReKZLQUlxmo1x1MDAxNYZRitJaP+/4llDa61W9XHUwMDE2pcuP3Vxiife1blx1MDAwN9VypdM3ol340lx1MDAwMySAXHUwMDE0w+i9WOs7sl4pXHUwMDE3PZjXKmGhXHUwMDFm5VE5XHUwMDE3VJ5cdTAwMGVH9UbvaI6uXHUwMDE0lGthc/jJ1JvlYrlcdTAwMTZUTlx1MDAxM6/q0z67P0ZGsNjYZINW2E1cblE7voiSXHUwMDEwXHUwMDFi/Vx1MDAwMUqSOSXPYUXPWk6iZKt+c5VcdPhFVHGNq4/pz6364zEulZJ6XCIllWPOWCmEQoI4x/5Y0nBGLOXKObSkgOc0lYGWXHRLhFx1MDAxNEZxMyp1NExHUmVSx1x1MDAwM6afhY2wXHUwMDE0NsJi2DguscNJzSotplx1MDAxMHLFXFwzwy9TO+V0c6dcZqVcclk63t5dcVx1MDAwZqlcZtPScWJcdTAwMWNHXHUwMDEy8X1klCiYlVx1MDAwNoCiY1x1MDAxZoCJgW7NiIya+XlLcIK+jdZyw3RcdTAwMTSSrFx1MDAwNLFcdTAwMDFnkLp9Y4Q0SyGkWVx1MDAxMCGTZ1aE1oogqu3zU62Bekh93O6ks/vpTrpcdCm7d3pVWXFCas6EstyrUeczmVx1MDAwM1P9RjDunadcdTAwMDTl5kdJyejijkSrIFx1MDAwZj2yXHUwMDFjbVx1MDAwNCWtdYojyp5++VkoaZdCSbsgSlx1MDAxYT3Y+lx1MDAxNERK7rjgU6SRL6qbuezB593DSu0kv7XT2ft8cH6y2pOdnpFOXHSlwKFS8Vxujq7gVcBAKI1+aoEoOdivXHUwMDE5XHUwMDExXHUwMDEyXHUwMDE5TO0jnSV1K1x1MDAxNbypPMdM+IhL4SPOlo9JxVx1MDAwNypWpjzoXCKBg3Ha2OeHkMeVuzY0N660KuNx42PQblSO8ksl5OTiTaFcdTAwMTlHY51GXHUwMDBm7+EqI2DOolx1MDAxMWSahNTGwfzKXHUwMDBmfFx1MDAwNa+zRo9cZlwiyZGj1lx1MDAxNGRcbuNrT0ZkXCJcdTAwMTHJnjg7i1x1MDAxY8+v+oNcdTAwMDVcdTAwMTZtXHUwMDBmXGa5f6WGR7v3Se/iP6cvNkrkO2jOJV3w+SFq82anZFx1MDAwM3Sb2XDnemfneD+bXHUwMDBlNlfb/1pcdTAwMTBM0POUXHUwMDE0o1x1MDAxMtv5QKm2VmRelbF+clx1MDAxZpRcdTAwMTVyfmxcdTAwMTdcZi2CL3RIrCzkzFx1MDAwMFx1MDAwMlx1MDAwNadGXHUwMDAyiqGKI1x1MDAwMdRNg3ZcdTAwMTZcdTAwMTVcYr9cdTAwMTi/IMYnXGa7f1xyXHL4rDhcdTAwMGaJeSnv9MDiXHUwMDE0Lv6sdV8tfr7fsM30ycljeTc6zje/rnhcdTAwMTQsLJOG1Iyl36zgarDgnfQwWnDcj4yVan51xK9fmSWQbFx1MDAxMlhnZ1DJ8Yvz/4ClWYmkT56tdcrXXHUwMDAyqSmqilx1MDAwZs+2XHUwMDBmNy+aj/r2+Ov+0Vn6y3lRXHUwMDE0lkr6yVNDRHqCJSBcdTAwMWa5esBYZMp0pZdcdTAwMDZypGNcIu1Xc14xeuA06lx1MDAxNlx1MDAxMrS9YJpL1zd59EPTXHUwMDBiYaT9penfXHUwMDE221x1MDAxM1x1MDAwNty/Ur2xnpLoiWVcdTAwMTlCXHUwMDBltj4pekXOfYpFQrvHl52bUv3yIXe4sX90wFvm/sAtleaTq4m1Ic1Enl1cdTAwMGJuufYxer+iR19aXHUwMDA0xlogXHUwMDFhKVTJpW5QcKFSLye6XCKDI1x1MDAxY1x1MDAwNeCWy5FLXGJG0Vx1MDAxYlx1MDAwMd5YVWavVy/Jqf3Gf+f/WmxCbeCSc63HXHUwMDEwidltoYz281x1MDAxZlNI7Z3KxZfHzHE19UVmz6/vM7nN887VitNRXHTJXHUwMDAwuNNA+kLymF/tstFcdTAwMDFToH3sLbTVUs6PjdIxaYmNSpKDl6Mj7GFCamk8d8VPNOv0m1g8I8XCXHUwMDE4KXSyd9SSvuJ5lUmEzKx/2ctcXH2Sm+v7J9dN1YAvn1x1MDAwZvSKXHUwMDEzUtNcdTAwMDPlXFyBk6gll2BcdTAwMDa2JTGOXHUwMDExXHUwMDE1SVx1MDAwZVx1MDAxYklcdTAwMTEwuFVjpOBCcG1cdTAwMDFmIIHfXGYl+e9i8U5SLMpJxpK0Q2VShiiprHq+Zu3ULlx1MDAwZS62r0vN8Kz9KXtdMTmsXa44J5VhXHUwMDEyXHLXaK2QwKHfSSphXHUwMDE454aUIUWuRo9JR4UkNKV4hWJFRoLVXHUwMDE5Q57amPhU4Fx1MDAxOEKCddxcdKN/LtFcbovnIyyKjzwxPUzhlCEtXHUwMDE3X3M9iY/Zy6/yY6nettVAqTNcdTAwMWSeXHUwMDE1XG7nuVXnI1x1MDAwMDNIXHUwMDFlXHUwMDEyydEo+qWfj9zTXHUwMDE16TE5q+NVjbOmIzlI1D6A5I6C1XhcdTAwMWV6XHUwMDFjXHUwMDFkuVx1MDAwNuFA/VR8XHUwMDE0i+ejmDlcdTAwMWbHr1x1MDAxMucmsbTfOSVcdTAwMWRMsUtR9u6wtX5R2b5x21eP6vRSn+9fz3axzcxcdTAwMTeJ01x1MDAxOX6zXHIkQnE/Wcb7OelXiVx1MDAxM0lcdTAwMTT5Sb98OzajM9NV4sIxJ0g7K4OaWzdqqVxyMlxuZC1Hb1x1MDAxZMiJyt6oPFx1MDAxMVx1MDAxNPxcdTAwMTJL87Yqp8ZcIjesVMqN1uhpXHUwMDA3tInqTnHNQegpXHUwMDEykmbz48PtmXZcdTAwMTflXHUwMDAzV8+ks4edje1cdTAwMTftWjRotOdcYlxcwZkgRFhSskjQXHUwMDE5XHUwMDA0rmPG767FpeWWsI2JwH1GuPUhXHUwMDBiXHUwMDA1yGZH1Fx1MDAxNkimSFZq52c9yaPhXGJXXCKAaVx1MDAxMn1OasFBSlDDO1x1MDAxY3DShIBcdTAwMGXeVFn8i5HrIHHGjJ5cdTAwMTCZXCKYXCJ3R66rcb+fa1Zv9Gne1Fx1MDAwZa/Wj9JJO1x1MDAxY6xcbnKlZTTkVpKe8FNcdTAwMTSqP1OAyFx1MDAxNGkjXzNDQ2KT81x1MDAwNFx1MDAwNY45zidZ3DDn3NyAa1GQkPon7Vx1MDAxMjdcdTAwMTa4NlnAQ3fdZ7wjXHUwMDEzi7qyx5vVrctPJ3d3mfb6WWs/m2m8qIZzgcg1mlEgbbW2iuJlKftcdTAwMDNqtMyRXHUwMDAzXHUwMDE2UiP4hT6vXHUwMDEx8ITcnMvNXHK5wK0g1SPfVlx1MDAwMnosclx1MDAxMzOzMFx1MDAwNrao/NY702xwuHe7/qkliruZSF9tnWFcdTAwMDRcdTAwMDVcdTAwMWSK1da4ksSjXHUwMDA0LVx1MDAwNclcdTAwMDFcdTAwMTB+e4N+2EpGMSBcdTAwMDFcdTAwMDbA+f3mxiwnf5bGXHUwMDFkbXGtZij86lVOnXhu0Cm0IVx1MDAxOYfkXHLeXHUwMDEyTHu9eknQXHUwMDE5hc2qj1xiXHUwMDE3XHUwMDFid1x1MDAwZV917qGnSq5cdTAwMWNcIlx1MDAxMyqVgCn2J2um8OjcXFw3ty6ONjc7+czxZflr0lx1MDAwNrlcdTAwMGKhpZu8XHUwMDE5iWHSXCKJc0lSR0FsUe+3fdy73kSQqSd7z7mezy5cdTAwMGYv3jvHWqGEWu7eOWhAOlx1MDAxZEfsXHUwMDFj985JXHUwMDA0qzdpSsRrpyaB9aOFu/Z9XHUwMDExzi+EuSilbeXsgWdXXHUwMDFjrIRcdTAwMDRJQFx1MDAwM5/FR9m/nExcdTAwMDBn0lx1MDAxOOvAb1x1MDAwNGXH7aW3XHUwMDA0qFx1MDAxYe13/IwvSFhcdTAwMDZSKcxcdTAwMTFcdTAwMGJBqk6e9lx1MDAxMlx1MDAxNHY5babYPmfbfd1cdTAwMTO1MPUxg/xcdTAwMTi/ptqt9ie54khFXHUwMDA2xlx1MDAxOEmANL4gs1x1MDAwZql+s0VcdTAwMDXUXG6Gwra+as1VgKrGrlGzy4WqipepzkmVg0uuYFx1MDAwMtRkaMA93/tcdTAwMTf2Pn966NR3XHUwMDFlxfpBKpevnO/by+1cdTAwMTWfXGZcdTAwMTJcbpmVvkZcdCVhZaBcXEL6fK+1SnGjhVx1MDAxYVNN+KpcdTAwMDW6hmm/xdNUdVx1MDAxMsYpr0iWn2aexvG/TpJ/XyorXHUwMDE3K8mHrzrP2VmZ/H+VjN/FUj0/s3NcdTAwMTKli/d2t/b4sLFcdTAwMWbZ8nbu5jC4WXk2dut3nUGKk1x1MDAwMUmX9/tccl/lj9pcInBCP1x1MDAwNaTz4eOLNpXx88m8r1x1MDAwNPJnIaRaXG4h1WJcYlx1MDAxOd9cdTAwMDJhKG1l6IH3bbM3cWVNYT9lt85cdTAwMGKb1ydhkPuEh7tcdTAwMGb8euU56dfOeLr5ZVxmcpCTkitSeiTtna/b43PaXG6ZOFx0juhIYU3Cjv0jKCm0kr5cbnvp81x1MDAwMlx1MDAwYqekXlxuJfViKFx0kFgrIXz5gJN6in9BJo9OUvdcdTAwMDfbdzJztHldLNbWMVx1MDAxNSx3a9LnVDAp5r2gopCf+2X8/apVI6OgR6HfUp/35e9mXuTrd5RyjoTJYCg1jpcgPCdwqdpcdTAwMTW9xTJxvM67hmnhNb7i5TW+774vd1tcdTAwMGJcdTAwMWGNdERPbu3HikJcdTAwMWGqcv777fcuv9Yuh/dcdTAwMWLJtTbvvrPc0ynsLk/8+93f/1x1MDAwN5Qr4Fx1MDAxZiJ9 + + + + + Widget 1Widget 2Widget 6Widget 7Widget 8(0,0)(1,0)(0,1)(0,2)(1,2)terminalWidget 3Widget 4Widget 5(1,1) diff --git a/docs/blog/images/compositor/spatial-map.excalidraw.svg b/docs/blog/images/compositor/spatial-map.excalidraw.svg new file mode 100644 index 0000000000..e9cd030166 --- /dev/null +++ b/docs/blog/images/compositor/spatial-map.excalidraw.svg @@ -0,0 +1,21 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nOVcXGtT28hcdTAwMTL9nl9BsV9cdTAwMTftTM/0zPRW3bpcdTAwMDU4vCHhXHUwMDE1Qm5tUcJcdTAwMTa2sPzAlnlkK//99jhcdTAwMDTLNlwiNsGW915S4aGRpfbonO7T3TP++93S0nL60I6W/1xcWo7uy2FcdTAwMTJXOuHd8u/++G3U6catJlx1MDAwZkH/726r1yn3z6ylabv751x1MDAxZn80wk49SttJWI6C27jbXHUwMDBik27aq8StoNxq/Fx1MDAxMadRo/tv//0gbET/ardcdTAwMWGVtFx1MDAxM1xmbrJcdTAwMTJV4rTV+X6vKIlcdTAwMWFRM+3y1f/Dfy8t/d3/nrGuXHUwMDEzldOwWU2i/lx1MDAwYvpDXHUwMDAzXHUwMDAzJWgzevig1exb61xmWDJA8umEuFvi+6VRhUev2OZoMOJcdTAwMGYtf63X6lx1MDAwZkf3XHUwMDFiO6fp1kXpg07vt6p3g9texUlynD4kfbPKnVa3u1JcdTAwMGLTcm1wRjfttOrRWVxcSWs/Zi9z/Om13Vx1MDAxNs/E4FWdVq9aa0ZdP1x0XHUwMDAzY1vtsFx1MDAxY6dcdTAwMGb+mFx1MDAxME9Hv8/En0uDI/f+TlwiUCBASlRSOCUzk+IvoGyApFx1MDAxMaxxXG60cHbEsPVWws+DXHL7TfS/XHUwMDA2pl2G5XqV7WtWns5JO2Gz21x1MDAwZTv81Fx1MDAwNufdPb5lXHUwMDA0XHUwMDE1KCS0hpR1Slxy7lSL4mot9bY6NlY5QrJWQOaMbtR/MOC004rUYCa8XHUwMDAx7e1KXHUwMDFmI39ccp5Gh9G17V/R7CVJdjKblcfJXHUwMDFjXHUwMDFhuPRcdTAwMDPvM3BcdTAwMWJcXKrXroTfUSEt22yk1WjtwIAkbtZHL5e0yvVcdTAwMDGQ+ke//f5cblx1MDAwNJO0eVx1MDAwMJbOWlJaXHUwMDAxTozg8Fx1MDAwM23u7X36fLVa6V5v1uO9XHUwMDE1/LyZg+BcdTAwMTFcdTAwMTRcdTAwMTaGXVxipNKotNZCWKNJXHJj11x1MDAwNVx1MDAxYXhIoVx1MDAwNemMkLPDrqSApFx1MDAwNtLGobBcdTAwMTm/kcFugFx1MDAxNq1wgshcbmOUXHUwMDFiQ69cdTAwMTDgSDqFhcFcdTAwMTfRXHUwMDAxXHUwMDFhXHUwMDA1b1x1MDAwNd8oSeJ291nwWifywGtcdTAwMWQ/U/6aXHUwMDE4ulsldf1le6f7ecVcdTAwMWPaXHUwMDFh3Z6u3u+1Xlx1MDAwM91RhMxcdTAwMGW6Slx1MDAwNk6TJutcZj9zw1xiXHUwMDFlgq42XHUwMDAxOXJaWHaJSslfcru/XYVcYlxi47CVKtBcdTAwMDJcdTAwMDA51PFcdTAwMGbtnFx1MDAxZcethFx1MDAwMI2nXHUwMDE2Sna5XHUwMDFjXHUwMDAzxryudE4gXHUwMDE4ov9cdTAwMDfYOqXzYCtcdTAwMWRp73cnhu3K16jShPPb+s1DY2MvXbktl87EYsNcdTAwMTZdwMRlelwisFx1MDAxNrBcdTAwMTk50EctXHUwMDA2Xicoo0EqoFxmXCJeh9pLIXBmqOWIIVxyOvn/XHUwMDAxW0d5sGW9XHUwMDA0SltBXHUwMDEz4/bLdml348IkN+LBbVxcXHUwMDFjVatbuvpxsXHrTOCE0SxcdTAwMWIt+1PWXG6juFx1MDAwNfBAIc34XHUwMDA1cL+EW1x0l86ZmeHW+NxEg7H/M7hNo/v02VxmjXIlglx1MDAwNoFCSZzc2V43k2Z7/yS9+Xp9U0lcdTAwMGZcdTAwMGbXZfXz4YLLW82qkoj1K0+2MShHNIJcYlhGkjWcoDGFRb63lZH/93p5azFgP8l5lVBcdTAwMDKs0s9cdTAwMDA3k2j8kLOcX/O5/yycXHUwMDBlrGo10+P4a9TX5UNHN8JGnDxcZj3UPoD7QO404maYLFx1MDAwZo2sJnHVw3k5ia6GcZ7G5TB5XHUwMDFhTlvtwWiZ71x1MDAxNMbNqDM+M61OXFz1dznJvSu/z2jryaVcdTAwMDSZZ3NcdTAwMTl2Iz/alysvkvLFzNPIXFxcdTAwMTVkwefg7OUmZubd9e37Zrj1USRcdTAwMDc3Xz7cfICrXHUwMDBllFx1MDAxN5uZyJknS3ZcdTAwMTKc74FcdTAwMDRcdTAwMWNcXMW/3lcphCcmXHUwMDE5RD4hX7xLsrJcZj9cdCcj52TCiVHCKatcdTAwMDWhcIiDpzxcYidGXHUwMDA1nFQ6rdlVOqP0IKd6ZKnxaavMJltzZyknP5KMy6J3ZiVcdTAwMTPOVXLlu3ZELO+nXHUwMDEw8KtxOdrZSsqX65v6/r61Zqm71Vts5HLQcJp9otVOXHUwMDE5VMNcdTAwMTGFVVx1MDAxMsOIXHUwMDE4S0JZMFmf/lxu4IZYcVdX48DVXHUwMDA2XHUwMDAyIaXlXFzpXHUwMDE5yFx1MDAxYdZiXHUwMDFjNpRcdTAwMWRcdTAwMGIomtNMJ7UoXHUwMDEwqqxcdTAwMWR1Nlxmz1x1MDAxMqpA+dU9Ky1cdTAwMTmNNDlUv2zs9853t+vbl+rLRrtcZnb33p4tNlRcdTAwMTVcdTAwMDXCXGJcdTAwMDOSJFx1MDAwN1x1MDAxNStxXGKrrINcdTAwMDN2bNZx2i28L/41L/vWYGV9qn01UFx1MDAxNSl/iLOIzLzMXHUwMDEyrUrKPLSC4fknmkKr77Zvuu/X18plXHUwMDAxd1vxljhZuTg+XWywalx1MDAxOUjGXHUwMDE5p27P+FVWwoHxXHUwMDE1XHUwMDExi1x1MDAxMlx1MDAxN1x1MDAxMatsM3vWQqU6abb6zVLKXHUwMDE3sapFvlxi4Fx1MDAwN8RcdLrRk1x1MDAxN59rXHUwMDA0ydXJV1XaVPHa+frddXzsXHUwMDBl3lx1MDAxNKyVsFuLpkCr/SlYla/TgYDnRIBcdTAwMDJcdTAwMWRcYlx1MDAwYlx1MDAwNGDZgTg0XHUwMDBihVWOe05oa4pcdTAwMTNcdTAwMDFGWtRKi/lANb/F5+tAoFx0J+/wXd5vPNxcdTAwMWM17+15uNeknd2qPTotLThSMWDPxCB0SmkjxUhcdTAwMDVEilx1MDAwMIzQi1x0VY7/rKU5XHUwMDA3LDC1XHUwMDAyLbWaTzdcdTAwMWFVvl5cdTAwMTXkXHUwMDEzUDtcdTAwMDVWW5dRaat8d1x1MDAxNN/V4mtsfLbl1tZ+oVh1P8WqXHUwMDBlXGKsVE4ogeBGoEoyMKBcdTAwMTQ5XHUwMDAwXCJLo2ZcdTAwMTWsXHUwMDAwlFx1MDAwNOFccp81VFx1MDAxZlx1MDAwN1x1MDAwNtjKPPLVljktXZYreHJ4vt6rlm44XHUwMDExXXt6j0NAXGY7ndbd8tPIt8ffXiSCymZcdTAwMTAzJYLIXVckiSHAKctcdTAwMTS9bbu3vp/A2Vq1cU/b4eXRSv1auFx1MDAwNSeCXHRcdTAwMDQqhY6nfkxeoKGAXHUwMDFmrF9cdTAwMDAh+L9eMFwiIKLiwFqgXHUwMDEyZqhal2mdzlx1MDAxNKomty3IXHUwMDEy2PBcXOjJ67j11O3g6sHlrYtrh+39XG5GXHUwMDE3R+dcdTAwMGKPVFx1MDAwYs7yf2JRmS39PfSngFx1MDAwMlx1MDAwNpIwklx1MDAxOWtstni6XHUwMDAwUJXarzZwXGJFlm6BnVx1MDAxZL6ZXHUwMDE0zmtcdTAwMDTmr7lgXHUwMDFmXCJcdTAwMDRcdTAwMGLEyVx1MDAxN2ratHt78FBaa5+399uqdbZ+c1xmu4Wi9OfFXHUwMDA1I2XAVOV8TaFFJWBcYqZgRYB+baa2YMhcdTAwMTf0c3FcbldcdTAwMTRp/Tqcolx01NRNQIVSk5pDzfYlYbFeXHUwMDBlbWnl4Ky623jYekhO65tcdH58K2EhWM65aVx1MDAxODB4z69pMX6Ku/Fl1pnPo8M4dtO3aDDmkVx1MDAxZPKLM85ZyTCfojhTOrmu904/9aLTI32metFBZ+f2etHZLiCQWpJcdTAwMTCc81xuguGghMx2lk5cdTAwMDTGXHUwMDFhS07nr1X5XHUwMDE1sltcdTAwMTPw1UmyQvNcdTAwMGJSaVwisktcdTAwMGKKbcaZJ7yFZVx1MDAxMUJcdTAwMTlJJkuDmZJ9u3lbXHUwMDA03Z+57VtcdTAwMTD++3Q/w3iXXHUwMDFi3pFYXjgnJ1x1MDAwZu8v+/qFbFx1MDAxZFx1MDAxOOFcdTAwMDJcdJpDqy9iyZE+XHUwMDE3WFxmyGptiECiVbPhO0fpXHUwMDAwSHBUXHUwMDA35YDl7jjfkc9g/KNgXHSiTbaG/iPWXHUwMDFipb2OLrTe5fzXa1xi2k3DTrpcdTAwMTY3K3GzyoNcdTAwMDPP8mOf0fZcdTAwMDTysU/pcs9buVwiXHUwMDAyUJJFXHUwMDFiXG5wbFx1MDAxYc+qy5xWXHLbfsr8Klx1MDAxMuHXI37X/4/j356sipqVgU3DbyPspuutRiNOeVx1MDAwMj624mY6ekb/XHUwMDFkrXrS1aJwbLr5ytmxUXa2/Vx1MDAxNYed7eC3pVx1MDAwMYL7fzz9/tfvz569klx1MDAwYq/+6Fx1MDAxOLJcdTAwMDbXe5f9ObVjoXwpwdlcdTAwMTNcdTAwMDNmmorky4FlIT1cdTAwMGKS9Vx1MDAwYjqktUZJRWZ41StaXG54ypXU/cRC5Dclf8WzOFxmOFx1MDAwN/BbkUxejqsx0JbtY8FhjF9bPiYslHVcdTAwMDV3fdDvXHUwMDA2fOVawlx0XcvLWnXYtaC1TvBMXHUwMDE5aUQ2KDx5XHUwMDE2XHUwMDFkoDNcdTAwMTY4N/Q5obD0smvJs+nlMvywTVYzfVx1MDAxMfxWQVx1MDAwYlx1MDAxMmjMJlxmpJDEpHOco1x1MDAxMlx1MDAwN7wxm/5RTi1cdTAwMTfZ/dExUE/p1PLSo/xVQX5tXHUwMDAx0DT7pjZON1x1MDAwZsv0iezmIbxv7kbdg69NXFz07MhcdTAwMDVcZnr0K+mNsVxm7CGfJlx1MDAwNVx1MDAwNdJcdTAwMDEhcaBhXHUwMDFjutm0XHUwMDA0rfNbVUlcdTAwMTFHLEmontvvN+7FJCAzw2GRXkxaYWCa4vKvZTBcZpBqlC7J+SYw43edZcFC5u+tkdL5Vlx1MDAwN02zUK+0cSM2zyPZiNb2T+5XW5XOyd6ic9JcdTAwMDSWrPNtXHUwMDFkv2NxZJ9cdTAwMDLPQUAkOTKwQ/RcdTAwMGLSZlNHdzaQ1tcn2Ybs0tVcdTAwMTdcdTAwMTiJVrCHZkZcdTAwMTZKSGPM/LYoPFJcdTAwMDNcbiEkzIeQkFH1o5vdWKFoZczkXS3qnV6r+kNcdTAwMWIujz6cfXTt3lx1MDAwZaaVRecjK1x1MDAxM4NGcfZpXHUwMDE0Z57DMZLjZkC+iO9FXHUwMDE4+qbBbPjoXHUwMDE3kzNcdTAwMWZccsJw/+pcdTAwMDVCXHUwMDFhzkTA+4pcIlx06YyY456hR2qoQlxiqeZDyOzHUIwuXHUwMDBlXHUwMDA2y1x1MDAwMkqYySt8XHUwMDA350jV8uf4uLRXK1+U8OJ0NYFFJyRcdTAwMDdIqThcdTAwMTXnTFxmlZDDJX2ljc9cdTAwMTVcdTAwMTj3XHUwMDAw/Vx1MDAwMDkjQmJgXHUwMDE1XHUwMDEx57G+lPhsJv6MaFx1MDAxNcrHJ535SItcdTAwMDIoSUNzNidK6kIoqedEyVx1MDAxN0SrRf95QGQmTySjvXgzwX06vj64vfhoKlx1MDAwZnie7Cw6JzFcdTAwMDBfXHUwMDE5Qak4T1x1MDAxY+UkZ/VcdTAwMDGhlNaBXHUwMDAyl5WIb0xJ/zFcdGAsWicnXHUwMDEzrdJagYqyXHUwMDFmMlRAMUwoaefX9X7kXHUwMDA2XHUwMDE2wkicXHUwMDBmI7XNXTZcYs5xWFx1MDAxMG5yQlZXP1U7UVWUO+/PVUxcdTAwMTboZrfY5bNcdTAwMTNcdTAwMTBSXHUwMDA1rFiRw5PT2qlcdTAwMTHVilL4lrQh5ZgrMyTkK2Kk32BLXHUwMDA2RaGMlFqJucdIU1xiI818XHUwMDE4ifl5JEiQhiEpJqdkUovjndYnK46Pj05cdTAwMGY/7d1WwpMvi05Jzlx1MDAxNK01XHUwMDBlwa+DhJHtXHUwMDE36Mi3po1vS88wRqrAUL85LpVwky5FXHUwMDAxZFx1MDAxZO2bI0VSkjmJ02xcdTAwMTZ+XHUwMDEzStpCKGnnRMnMdIzKViV9ZzlbjP/pJ0+0w1x1MDAxMvrPtVxcvVhcdTAwMTOnx6vb919aatEp6Vx1MDAwMlx1MDAwMKf8XHUwMDAyeiBcdTAwMTjtf1x1MDAxOCtcdTAwMDJg0Dny+DMzSiTZhKmDJGrDXHSwdoW2cMFm97jMiZCuXHUwMDEwQrpXXHUwMDEy8t1jw3M5bLePU56/5Vx1MDAxZt1hfmBx5XFcdTAwMTJcdTAwMDZcdTAwMTYs38bR3dpzXHUwMDFm39b/8svr+iT3bIr8XHUwMDAz+vvbu2//XHUwMDA1+Vxu0mMifQ== + + + + + terminalVisibleInvisibleWidget 1Widget 2Widget 3Widget 4Widget 5Widget 6Widget 7Widget 8 diff --git a/docs/blog/images/compositor/widgets.excalidraw.svg b/docs/blog/images/compositor/widgets.excalidraw.svg new file mode 100644 index 0000000000..56acc3f229 --- /dev/null +++ b/docs/blog/images/compositor/widgets.excalidraw.svg @@ -0,0 +1,21 @@ + + + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO2a7VPbOFx1MDAxM8C/969guK+NqreVVp25ueGlXHUwMDFj9HrtXHUwMDAxPcrxzM0zxnZcdTAwMTK3jlx1MDAxZGJcdTAwMDfKdfjfb+WW2MRxoEApzz1nZlx1MDAxMlwiydJa+u1qd+VPT1ZWVsvzcbz6fGU1/lx1MDAxOFx1MDAwNmlcdTAwMTJNgrPVp778NJ5cdTAwMTRJnlGVrH5cdTAwMTf5dFx1MDAxMlYth2U5Lp4/ezZcbiZcdTAwMWbicpxcdTAwMDZhzE6TYlx1MDAxYaRFOY2SnIX56FlSxqPiJ//5Olx1MDAxOMU/jvNRVE5YPUgvjpIyn3xcdTAwMWUrTuNRnJVcdTAwMDX1/lx1MDAxZvq9svKp+mxIN4nDMshcdTAwMDZpXFzdUFXVXHUwMDAyXG4l5ktf51klrDAgtHVuVp9cdTAwMTSbNFpcdTAwMTlHVNknieO6xlx1MDAxN63uXHUwMDFkbexcdTAwMWS+77+HXHUwMDEw9vjO6TDfXHUwMDE52EE9aD9J0/3yPK2EKnJ6lrquKCf5h/hdXHUwMDEylcPLWWuUd901yaeDYVx1MDAxNlx1MDAxN/7h68fIx0GYlOe+jPNZ6edcdTAwMTl4vlKXfKxaIFNcdTAwMTZcdTAwMWQ3XHUwMDEyZlx1MDAxNf5WKTgzWminjUWOws6JtJGntFx1MDAwMiTSXHUwMDBmwllcdTAwMTHKWqjjIPwwIMmyqG5cdTAwMTNAhP1+3ebsy4OCXHUwMDAwhtS/dZZrqVx1MDAwNc5aXGbjZDAsqYlcdTAwMTKOSVRSaGmcUlrpWpK4WlxuqbgxgFgvlFx1MDAxZn68XHUwMDEzVUz8Wc//hGja8Xdk0zRtTmJcdTAwMTZ9mcQrXHUwMDE1x77iRVx1MDAwM6+6q+k4XG4+cyAsyUTTpFx1MDAxY+h6XHUwMDA20yT7MN9dmodcdTAwMWZqdKrSi6e3IFZcdTAwMDN0XHUwMDExS4umpaJlszdm9udy9GugXHUwMDA3PVx1MDAxM7zaMFn5R1x1MDAwMoeH2WNn1jBu6SmBXHUwMDFlVGmcXHUwMDA3VzIhQUtLqmuc0bqTXFzZd7HWy8k9ln15fNwmV1pgVkqg/rVytP7QRldcdTAwMTjNpOWoXHUwMDE1cEBotrlEV3BcdTAwMDWgsWGEXHUwMDFlnF1cdTAwMDNKSe5cdTAwMWWEXaNsXHUwMDE3u1x1MDAwZZDUXHUwMDFi4ebovphcdTAwMGVe9lx1MDAwZl+GRbS7XHUwMDFiXHUwMDFlZ7sv5YtXwSNH11x1MDAxYeaU1Fx1MDAxY8E4XHUwMDA0oa6ia4CBctY4XHUwMDAwsrpWdZJcdTAwMWJzRVx1MDAxYtdycvv90IWuTa6ynDmNUjo0XHUwMDAwILVaQK51zHBqYLgwXHUwMDA2jW1cdTAwMTldJ1FcdTAwMDPVfk9uhZRccp7uyC3dvlx1MDAxMFmJnciCVMpYIW7uIezsn1xmf5FcdTAwMDflXHUwMDFh+T3H42K/RGvf3yuyUVBcZuNcdTAwMGVm+Vx1MDAwMmbtdciiZcpJJVBcdTAwMDDZWuXmkEXHyFx1MDAxMFx1MDAwYoKVW5S84UW0/ITY/y1ltpxcdTAwMDRZMVx1MDAwZSa0+Fx1MDAwYnxcdTAwMDVwzFx01Eahplx1MDAwZrfA4GpGcmry2YQyqDm0XVx1MDAwNVx1MDAwZdwgNfmuvlx1MDAwMtA8fY29bUxpMCnXkyxKssH8LXFcdTAwMTZ11KRBUW7ko1FSklx1MDAxOL/lSVbOt6j6XZtM8rNhXHUwMDFjtFx1MDAxZZp67qxcdTAwMWL77mrf21/1fys1StWP2f9/Pl3YWlpk1knJjXCOUNPNu1x1MDAwNbOGfECyoOjtXHUwMDEyrfF13XVcdTAwMDLjr55kXHUwMDAwlkvqU1x1MDAxYmeV1VD396T5/bVcdTAwMDZDde9xwkqFRlt1800uM4dnXHUwMDExP+it97fK3c13pTvcLtZcdTAwMWW9xVx1MDAwMEFWUVx1MDAwMKCm6KDWQn+78t5cdTAwMWKCQlpcdTAwMTnaxdycWPdpLywjZ1x1MDAxMK12tM85V895vc0xI6VcdTAwMTCGKsFaQ+C1tjlHqGFTzO9gL4jQhqfwr724vDpX2F+99uJ+pYKX8cdyYcqAdyq45UJbXG6Wb67f/TdrSv46mYYuXs/0od1cdTAwMGXD3saD6fftvFhjXHUwMDE1U4hG0UZcdTAwMDZOuHroSsGNZVxcSSudIf+I62+n4U4yTjuFkJasXGY5z7X2zjRcXLZCLmFQasBcdTAwMDdcYrlmuH1qYPll2Uf89+lg71x1MDAxZGD82yh6Y3f++z47tKtNfmdcdTAwMThcdTAwMDZel1ZnNVx1MDAxN5fsLjFcdTAwMThWc3srg9HPs3I/+avKJfArpVvBKEnPryBT6Vx1MDAwN1x0uJ94Slau7oe+ci1NXHUwMDA2WbVVxv2rmlQmYZDOqst8XFzXhjRYQF1N2lOfT5JBklx1MDAwNenbZVx1MDAwM/tf27WBb1x1MDAwMHBcdTAwMWNcdTAwMTRx1ZbKcanmL89cdTAwMTiKXHUwMDA2aPNcdTAwMWK80uQrX0mXXWdcdTAwMDCKnu1cdTAwMDXB5uG5XHUwMDFh83T79OTo0JwlXHUwMDFkXHUwMDA2IJzkRdFcdTAwMWJcdTAwMDZlOHxcdTAwMDSxLNdMeNfJOMVcdTAwMWRFlPUzn3/2dVx1MDAxOHniYNFwTrGB645cZnh13WGnl2SPgIZcIklos1ZcdTAwMGJ2emU4Q8H9VqpcdTAwMTSFK7K101x1MDAwYqmtJbNcdTAwMDX/2oV7SPSQ89e5R2qtJEd786j5j3izyIK9ZGd7v3y9XHUwMDE1XHUwMDFkbZ64Nz8/8kRcdTAwMGZcdTAwMDfmfFxi6uNcdTAwMTiHKOWcclx1MDAxMLFEI2iNjkstvp1uXGJcdTAwMWZcdTAwMDRp6bRB4Fx1MDAxNDUt2CORXHUwMDAxuUhcdTAwMWNJiy03XHUwMDE0LrV0Q5FcdTAwMTdsm/nLh/eCvT/RXGI97lxib5ymybhYiK612IWuIJfGaOe+4kzoVOjTt6+231x1MDAxN0Hwavctbk+zXzb3bsPuPFwi35BdXHUwMDAxjLxmLpU0RG5zM6s6QMHI5UYnXGZIa8WSlM9ccuD9oVx1MDAxZoBcdTAwMDTZXHUwMDA2VyimuZRAU05fXHUwMDFhUbfJXHUwMDE1XHUwMDE0xFx1MDAxYuOT74KkVWTBW+RybVxyUiCg/lx1MDAxZtBFJbvQXHUwMDA1riV3tL/dmNyTg37xQtiDcvwm2XN7XHUwMDFiXHUwMDA3R4nafOTkaklBXHUwMDFmWTF00rtcdTAwMWNmXHUwMDBlXFzO/GFcdTAwMDfSqiCFXHUwMDAxvPtM82bgXHUwMDFlc1x1MDAwZd9cblxcSSFcdTAwMTRcdTAwMTdcdTAwMDJcdTAwMWJe1T9cdTAwMTnc7iS7XHUwMDAwXHUwMDBlXHUwMDFhKY7/mjNNtVVubUTb03LLqlx1MDAxM3niol35yMm1nk3ylFx0XHUwMDA1QE3YtNBcdTAwMTXccDK7RlPUre6GrpDHXHUwMDE0vn8rdFx1MDAxMf1BgMJ/jsntzFx1MDAwNGG3q0BcdTAwMGWu1I0kw3XQvoxen1xyy9Ha0eb6u/3fM51cdTAwMWWdq79cdTAwMWW3k6uUYqhcdTAwMTGMIGNF0VcrXHUwMDAyXHUwMDA0XHUwMDA2mvxcYuvTwUYse4fkjpkgXHUwMDFhXHSFc4pcdTAwMDSh4ZRewO2CTJDggnxcdTAwMWNcdTAwMTT/U25tLdVtcjVlPFx1MDAxOflcdTAwMTTKwyZq2qPeR5bmc1x1MDAwMLxALVx1MDAxYu75vFZKXHUwMDAx6sq7Ttep5fKA/FGev1jJWfWilFx1MDAxMj6os1ffj1FgXHUwMDE5SiU07SZGUX33W1x1MDAwNnfVSpSM1N7513R8mCBcdTAwMTfkZUAyS15cdTAwMTQ56KS35Jy1dJRcdTAwMDIuXHUwMDA1PlL+jjp6+3zq3Fx1MDAwMUyd8Ll8bXHnXHUwMDA2h1x1MDAwMJVWh9OKXHUwMDA3XHUwMDA23saB497k8sZrO35igrGHn1EpoFx1MDAwMk0xnEH9pf5iJtOVg58uiZZnJVx1MDAxYlx1MDAxMvXIbyGPWlxuP1x1MDAxYy2TNW2RqldcdFx1MDAxNYEoyKdcdTAwMDBlsCXTPVx1MDAxZjnNm4Z7PXXqdWJd1c5cdTAwMTNdd/ek+e3TddVcdTAwMDCrwXi8X1x1MDAxMnCz1SDCk+iLZa+fcvU0ic/WXHUwMDE3vufjL59cYqzm05uk2D/rp4snXHUwMDE3f1x1MDAwM0JltmMifQ== + + + + + Single lineterminal diff --git a/docs/blog/images/textual-demo.svg b/docs/blog/images/textual-demo.svg new file mode 100644 index 0000000000..ae78aedf13 --- /dev/null +++ b/docs/blog/images/textual-demo.svg @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DemoApp + + + + + + + + + + +Paul AtreidesLady JessicaBaron Vladimir HarkonnenLeto AtreidesStilgarChaniThufir Hawat +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +Heir to House Atreides who becomes the Fremen messiah Muad'Dib. Born with extraordinary mental  +abilities due to Bene Gesserit breeding program. + + + + +TextArea + +A powerful and highly configurable text area that supports syntax highlighting, line numbers,  +soft wrapping, and more. + + +▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +Python +▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ +▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +1  # Start building! +2  fromtextualimportApp,ComposeResult +3   +4  TEXTUAL="1.0" +5  print("Welcome to Textual!") + + + +▄▄ + + + +▃▃ + +▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ + + + ^s Screenshot ^p palette + + + diff --git a/docs/blog/posts/release1.0.0.md b/docs/blog/posts/release1.0.0.md new file mode 100644 index 0000000000..a57462918a --- /dev/null +++ b/docs/blog/posts/release1.0.0.md @@ -0,0 +1,276 @@ +--- +draft: true +date: 2024-12-05 +categories: + - Release +title: "Algorithms for high performance terminal apps" +authors: + - willmcgugan +--- + + +I've had the fortune of being able to work fulltime on a FOSS project for the last three plus years. + + +!!! tip inline end "Textual Demo" + + [![Textual Demo](../images/textual-demo.svg)](https://github.com/textualize/textual-demo) + + +Textual has been a constant source of programming challenges. +Often frustrating but never boring, the challenges arise because the terminal "specification" says nothing about how to build a modern User Interface. +The building blocks are there: after some effort you can move the cursor, write colored text, read keys and mouse movements, but that's about it. +Everything else we had to build from scratch. From the most basic [button](https://textual.textualize.io/widget_gallery/#button) to a syntax highlighted [TextArea](https://textual.textualize.io/widget_gallery/#textarea), and everything along the way. + +I wanted to write-up some of the solutions we came up with, and the 1.0 milestone we just passed makes this a perfect time. + + + +If you haven't followed along with Textual's development, here is a demo of what it can do. +This is a Textual app, running remotely, served by your browser: + + +Launch Textual Demo + + +I cheaped out on the VMs — so if the demo is down, you could run it locally (with [uv](https://docs.astral.sh/uv/)): + +``` +uvx --python 3.12 textual-demo +``` + + + +## The Compositor + +The first component of Textual I want to cover is the [compositor](https://github.com/Textualize/textual/blob/main/src/textual/_compositor.py). +The job of the compositor is to combine content from multiple sources into a single view. + +We do this because the terminal itself has no notion of overlapping windows in the way a desktop does. + +Here's a video I generated over a year ago, demonstrating the compositor: + +
+ +
+ +### The algorithm + +You could be forgiven in thinking that the terminal is regular grid of characters and we can treat it like a 2D array. +If that were the case, we could use [painter's algorithm](https://en.wikipedia.org/wiki/Painter's_algorithm) to handle the overlapping widgets. +In other words, sort them back to front and render them as though they were bitmaps. + +Unfortunately the terminal is *not* a true grid. +Some characters such as those in Asian languages and many emoji are double the width of latin alphabet characters — which complicates things (to put it mildly). + +Textual's way of handling this is inherited from [Rich](https://github.com/Textualize/rich). +Anything you print in Rich, first generates a list of [Segments](https://github.com/Textualize/rich/blob/master/rich/segment.py) which consist of a string and associated style. +These Segments are converted into text with [ansi escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) at the very end of the process. + + +The compositor takes lists of segments generated by widgets and further processes them, by dividing and combining, to produce the final output. +In fact almost everything Textual does involves processing these segments in one way or another. + +!!! tip "Switch the Primitive" + + If a problem is intractable, it can often be simplified by changing what you consider to be the atomic data and operations you are working with. + I call this "switching the primitive". + In Rich this was switching from thinking in characters to thinking in segments. + +### Thinking in Segments + +In the following illustration we have an app with three widgets; the background "screen" (in blue) plus two floating widgets (in red and green). +There will be many more widgets in a typical app, but this is enough to show how it works. + + +
+--8<-- "docs/blog/images/compositor/widgets.excalidraw.svg" +
+ +The lines are lists of Segments produced by the widget renderer. +The compositor will combine those lists in to a single list where nothing overlaps. + +To illustrate how this process works, let's consider the highlighted line about a quarter of the way down. + + +### Compositing a line + +Imagine you could view the terminal and widgets side on, so that you see a cross section of the terminal and the floating widgets. +It would appear something like the following: + +
+--8<-- "docs/blog/images/compositor/cuts0.excalidraw.svg" +
+ +We can't yet display the output as it would require writing each "layer" independently, potentially making the terminal flicker, and certainly writing more data than necessary. + +We need a few more steps to combine these lines in to a single line. + + +### Step 1. Finding the cuts. + +First thing the compositor does is to find every offset where a list of segments begins or ends. +We call these "cuts". + +
+--8<-- "docs/blog/images/compositor/cuts1.excalidraw.svg" +
+ +### Step 2. Applying the cuts. + +The next step is to divide every list of segments at the cut offsets. +This will produce smaller lists of segments, which we refer to as *chops*. + +
+--8<-- "docs/blog/images/compositor/cuts2.excalidraw.svg" +
+ +After this step we have lists of chops where each chop is of the same size, and therefore nothing overlaps. +It's the non-overlapping property that makes the next step possible. + +### Step 3. Discard chops. + +Only the top-most chops will actually be visible to the viewer. +Anything not at the top will be occluded and can be thrown away. + +
+--8<-- "docs/blog/images/compositor/cuts3.excalidraw.svg" +
+ +### Step 4. Combine. + +Now all that's left is to combine the top-most chops in to a single list of Segments. +It is this list of segments that becomes a line in the terminal. + +
+--8<-- "docs/blog/images/compositor/cuts4.excalidraw.svg" +
+ +As this is the final step in the process, these lines of segments will ultimately be converted to text plus escape sequences and written to the output. + +### What I omitted + +There is more going on than this explanation may suggest. +Widgets may contain other widgets which are clipped to their *parent's* boundaries, and widgets that contain other widgets may also scroll — the compositor must take all of this in to account. + +!!! info "It's widgets all the way down" + + Not to mention there can be multiple "screens" of widgets stacked on top of each other, with a modal fade effect applied to lower screens. + +The compositor can also do partial updates. +In other words, if you click a button and it changes color, the compositor can update just the region occupied by the button. + +The compositor does all of this fast enough to enable smooth scrolling, even with a metric tonne of widgets on screen. + +## Spatial map + +Textual apps typically contain many widgets of different sizes and at different locations within the terminal. +Not all of which widgets may be visible in the final view (if they are within a scrolling container). + + +!!! info "The smallest Widget" + + While it is possible to have a widget as small as a single character, I've never found a need for one. + The closest we get in Textual is a [scrollbar corner](https://textual.textualize.io/api/scrollbar/#textual.scrollbar.ScrollBarCorner); + a widget which exists to fill the space made when a vertical scrollbar and a horizontal scrollbar meet. + It does nothing because it doesn't need to, but it is powered by an async task like all widgets and can receive input. + I have often wondered if there could be something useful in there. + A game perhaps? + If you can think of a game that can be played in 2 characters — let me know! + +The *spatial map*[^1] is a data structure used by the compositor to very quickly discard widgets that are not visible within a given region. +The algorithm it uses may be familiar if you have done any classic game-dev. + + +### The problem + +Consider the following arrangement of widgets: + +
+--8<-- "docs/blog/images/compositor/spatial-map.excalidraw.svg" +
+ +Here we have 8 widgets, where only 3 or 4 will be visible at any given time, depending on the position of the scrollbar. +We want to avoid doing work on widgets which will not be seen in the next frame. + +A naive solution to this would be to check each widget's [Region][textual.geometry.Region] to see if it overlaps with the visible area. +This is a perfectly reasonable solution, but it won't scale well. +If we get in to the 1000s of widgets territory, it may become significant — and we may have to do this 30 times a second if we are scrolling. + +### The Grid + +The first step in the spatial map is to associate every widget with a tile in a regular grid[^2]. + +
+--8<-- "docs/blog/images/compositor/spatial-map-grid.excalidraw.svg" +
+ +The size of the grid is fairly arbitrary, but it should be large enough to cover the viewable area with a relatively small number of grid tiles. +We use a grid size of 100 characters by 20 lines, which seems about right. + +When the spatial map is first created it places each widget in one or more grid tiles. +At the end of that process we have a dict that maps every grid coordinate on to a list of widgets, which will look something like the following: + +```python +{ + (0, 0): [widget1, widget2, widget3], + (1, 0): [widget1, widget2, widget3], + (0, 1): [widget4, widget5, widget6], + (1, 1): [widget4, widget5, widget6], + (0, 2): [widget7, widget8], + (1, 2): [Widget7, widget8] +} +``` + +The up-front cost of [calculating](https://github.com/Textualize/textual/blob/main/src/textual/_spatial_map.py) this data is fairly low. +It is also very cacheable — we *do not* need to recalculate it when the user is just scrolling. + +### Search the grid + +The speedups from the spatial map come when we want to know which widgets are visible. +To do that, we first create a region that covers the area we want to consider — which may be the entire screen, or a smaller scrollable container. + +In the following illustration we have scrolled the screen up[^3] a little so that Widget 3 is at the top of the screen: + +
+--8<-- "docs/blog/images/compositor/spatial-map-view1.excalidraw.svg" +
+ +We then determine which grid tiles overlap the viewable area. +In the above examples that would be the tiles with coordinates `(0,0)`, `(1,0)`, `(0,1)`, and `(1,1)`. +Once we have that information, we can then then look up those coordinates in the spatial map data structure, which would retrieve 4 lists: + +```python +[ + [widget1, widget2, widget3], + [widget1, widget2, widget3], + [widget4, widget5, widget6], + [widget4, widget5, widget6], +] +``` + +Combining those together and de-duplicating we get: + +```python +[widget1, widget2, widget3, widget4, widget5, widget6] +``` + +These widgets are either within the viewable area, or close by. +We can confidently conclude that the widgets *not* ion that list are hidden from view. +If we need to know precisely which widgets are visible we can check their regions individually. + +The useful property of this algorithm is that as the number of widgets increases, the time it takes to figure out which are visible stays relatively constant. Scrolling a view of 8 widgets, takes much the same time as a view of 1000 widgets or more. + +The code for our `SpatialMap` isn't part of the public API and therefore not in the docs, but if you are interested you can check it out here: [_spacial_map.py](https://github.com/Textualize/textual/blob/main/src/textual/_spatial_map.py). + +## Wrapping up + +If any of the code discussed here interests you, you have my blessing to [steal the code](./steal-this-code.md)! + +As always, if you want to discuss this or Textual in general, we can be found on our [Discord server](https://discord.gg/Enf6Z3qhVr). + + + +[^1]: A term I coined for the structure in Textual. There may be other unconnected things known as spatial maps. +[^2]: The [grid](https://www.youtube.com/watch?v=lILHEnz8fTk&ab_channel=DaftPunk-Topic). +[^3]: If you scroll the screen up, it moves *down* relative to the widgets. diff --git a/docs/custom_theme/main.html b/docs/custom_theme/main.html index 3219e100dd..edad06b6a1 100644 --- a/docs/custom_theme/main.html +++ b/docs/custom_theme/main.html @@ -28,6 +28,8 @@ src: url("https://unpkg.com/@excalidraw/excalidraw@0.12.0/dist/excalidraw-assets/Cascadia.woff2"); } + +