UNPKG

aframe-vartiste-toolkit

Version:

Toolkit to create GUI similar to VARTISTE

1 lines 417 kB
(()=>{var t,e,n={4779:(t,e,n)=>{(t.exports=n(9252)(!1)).push([t.id,"/*\n\ngithub.com style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n color: #333;\n background: #f8f8f8;\n}\n\n.hljs-comment,\n.hljs-quote {\n color: #998;\n font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-subst {\n color: #333;\n font-weight: bold;\n}\n\n.hljs-number,\n.hljs-literal,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag .hljs-attr {\n color: #008080;\n}\n\n.hljs-string,\n.hljs-doctag {\n color: #d14;\n}\n\n.hljs-title,\n.hljs-section,\n.hljs-selector-id {\n color: #900;\n font-weight: bold;\n}\n\n.hljs-subst {\n font-weight: normal;\n}\n\n.hljs-type,\n.hljs-class .hljs-title {\n color: #458;\n font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-name,\n.hljs-attribute {\n color: #000080;\n font-weight: normal;\n}\n\n.hljs-regexp,\n.hljs-link {\n color: #009926;\n}\n\n.hljs-symbol,\n.hljs-bullet {\n color: #990073;\n}\n\n.hljs-built_in,\n.hljs-builtin-name {\n color: #0086b3;\n}\n\n.hljs-meta {\n color: #999;\n font-weight: bold;\n}\n\n.hljs-deletion {\n background: #fdd;\n}\n\n.hljs-addition {\n background: #dfd;\n}\n\n.hljs-emphasis {\n font-style: italic;\n}\n\n.hljs-strong {\n font-weight: bold;\n}\n",""])},1534:(t,e,n)=>{(e=t.exports=n(9252)(!1)).push([t.id,"@import url(https://fonts.googleapis.com/css?family=Open+Sans&display=swap);",""]),e.push([t.id,"@import url(https://fonts.googleapis.com/css2?family=Fira+Mono:wght@500&display=swap);",""]),e.push([t.id,"body {\n font-family: 'Open Sans', sans-serif;\n}\n#content {\n margin: auto;\n width: max-content;\n max-width: 40em;\n background-color: #fff;\n padding: 3em;\n}\nh1,\nh2,\nh3,\nh4,\nh5 {\n text-align: center;\n}\nh2 {\n margin-block-start: 2em;\n}\nfooter {\n display: block;\n width: max-content;\n margin: 0 auto;\n}\n.launch-button {\n display: block;\n width: max-content;\n margin: auto;\n padding: 10px;\n border-radius: 5px;\n border: 1px solid #000;\n}\n.logo,\n.screenshot {\n max-width: 100%;\n margin: auto;\n}\n.vartiste-url {\n margin: auto;\n display: block;\n width: fit-content;\n text-align: center;\n text-decoration: none;\n}\n.instructions p img,\n.instructions li img,\n.asset {\n filter: invert();\n vertical-align: bottom;\n height: 1.3em;\n}\niframe {\n display: block;\n margin: auto;\n}\n.twitter-timeline.twitter-timeline-rendered {\n display: block !important;\n margin: auto;\n border: 1px solid #000 !important;\n}\n.gallery-section {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n}\n.gallery-entry {\n width: 250px;\n border: 1px solid #000;\n border-radius: 5px;\n color: #eee;\n text-decoration: none;\n background-color: #333;\n margin: 5px;\n}\n.gallery-entry figure {\n margin: 0;\n padding: 0;\n}\n.gallery-entry img {\n margin-top: 10px;\n margin-left: 25px;\n}\n.gallery-entry figcaption {\n text-decoration: underline;\n font-weight: bold;\n text-align: center;\n font-variant: small-caps;\n font-size: 150%;\n}\n.gallery-entry p {\n padding: 15px;\n}\n.guide img {\n max-width: 95%;\n margin: auto;\n}\n#loading-screen {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: #999;\n z-index: 99;\n}\n#features-content h3 {\n text-align: left;\n}\n#features-content ul {\n padding-left: 20px;\n}\n#features-content > ul {\n list-style: none;\n}\n#features-content .expand-feature {\n cursor: pointer;\n}\n#features-content .expand-feature:before {\n content: '+';\n margin-right: 1em;\n transform: translateX(-1em);\n}\n#features-content ul.collapsed {\n display: none;\n}\n#features-content .feature {\n display: flex;\n justify-content: center;\n grid-auto-flow: column;\n grid-template-columns: 300px 300px;\n flex-wrap: wrap;\n align-items: flex-start;\n left: 50%;\n margin-left: -48vw;\n margin-right: -48vw;\n max-width: 95vw;\n position: relative;\n right: 50%;\n width: 95vw;\n overflow-x: visible;\n}\n#features-content .feature h4 {\n border-bottom: 1px solid #eee;\n margin: 0 30px;\n}\n#features-content .feature > li {\n list-style: none;\n text-align: center;\n}\n#features-content .tweet-list {\n display: flex;\n flex-wrap: wrap;\n padding: 0px;\n}\n#features-content .tweet-container {\n width: 300px;\n margin: 5px;\n}\nhtml,\nbody {\n width: 100%;\n margin: 0;\n}\nheader {\n margin: auto;\n text-align: center;\n}\n.logo,\n.screenshot {\n max-width: 100%;\n margin: auto;\n}\n#content,\n#readme {\n max-width: 80em;\n min-width: 40em;\n width: auto;\n margin: auto;\n padding: 2em;\n}\ncode,\npre {\n text-align: left;\n font-family: 'Fira Mono', monospace;\n}\npre code {\n font-size: small;\n overflow-x: auto;\n}\npre {\n background-color: #f0f0f0;\n padding: 0.3em;\n border-radius: 3px;\n overflow-x: auto;\n}\n#readme code,\n#readme pre {\n max-width: 100%;\n overflow-x: auto;\n}\n#readme > pre {\n max-height: 30em;\n border: 1px solid #aaa;\n}\nhr {\n border: 1px solid #eee;\n margin: 2em;\n}\n.codepen {\n display: none !important;\n}\nimg[alt=\"NPM Version\"] {\n transform: translateY(25%);\n}\n.docs h1 {\n margin-block-start: 0em;\n text-align: left;\n position: absolute;\n left: 3px;\n font-size: medium;\n color: #aaa;\n}\n.docs h2 {\n margin-block-start: 5em;\n text-align: left;\n font-size: 0.8em;\n}\n.docs h2 code {\n font-size: 2em;\n margin: 0 1em;\n}\n.docs h3 {\n float: right;\n}\n.docs table {\n border-collapse: collapse;\n width: 100%;\n max-width: 100%;\n}\n.docs thead {\n background-color: #fafafa;\n}\n.docs tr:hover,\n.docs th,\n.docs td {\n border: 1px solid #eee;\n padding: 0.4em;\n min-width: 8em;\n word-wrap: break-word;\n}\n.docs p code {\n white-space: pre-line;\n}\n.docs p > img:only-child {\n margin: auto;\n display: block;\n}\n.toc {\n width: -moz-fit-content;\n width: fit-content;\n margin: auto;\n}\n.toc > ul > li > a {\n font-size: 120%;\n}\n.toc > ul > li > ul {\n font-size: 75%;\n margin-bottom: 1em;\n}\n.toc > ul > li > ul > li {\n border-bottom: 1px dashed #eee;\n}\n.toc > ul > li > ul > li > a {\n font-size: 120%;\n margin-right: 1.3em;\n color: inherit;\n font-weight: normal;\n text-decoration: none;\n}\n.toc > ul > li > ul > li > .type {\n float: right;\n}\n",""])},9252:t=>{t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var n=function(t,e){var n=t[1]||"",o=t[3];if(!o)return n;if(e&&"function"==typeof btoa){var a=(d=o,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(d))))+" */"),r=o.sources.map((function(t){return"/*# sourceURL="+o.sourceRoot+t+" */"}));return[n].concat(r).concat([a]).join("\n")}var d;return[n].join("\n")}(e,t);return e[2]?"@media "+e[2]+"{"+n+"}":n})).join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var o={},a=0;a<this.length;a++){var r=this[a][0];"number"==typeof r&&(o[r]=!0)}for(a=0;a<t.length;a++){var d=t[a];"number"==typeof d[0]&&o[d[0]]||(n&&!d[2]?d[2]=n:n&&(d[2]="("+d[2]+") and ("+n+")"),e.push(d))}},e}},747:(t,e,n)=>{t.exports=n.p+"vartiste_toolkit_entity_helper.0161b3.zip"},5800:t=>{t.exports='<h1 id="vartiste-toolkit">VARTISTE Toolkit</h1>\n<p>The VARTISTE toolkit is a collection of components developed while creating\n<a href="https://vartiste.xyz">VARTISTE</a>. I&#39;ve compiled them into a stand-alone module\nin the hopes that it might help folks to jump start their own projects.</p>\n<h1 id="installation--use">Installation / Use</h1>\n<p>The easiest way to use it is to include the <code>.js</code> file from a CDN, such as\nunpkg, specifying the version using <em>@version</em>:</p>\n<pre><code class="language-html">&lt;html&gt;\n&lt;head&gt;\n &lt;script src=&quot;https://unpkg.com/aframe-vartiste-toolkit@1.32.0/vartiste-toolkit.js&quot;&gt;&lt;/script&gt;\n&lt;/head&gt;\n...\n&lt;/html&gt;</code></pre>\n<p>Latest Version:\n<a href="https://www.npmjs.com/package/aframe-vartiste-toolkit"><img src="https://img.shields.io/npm/v/aframe-vartiste-toolkit.svg?style=for-the-badge&logo=npm&label=" alt="NPM Version"></a></p>\n<p>Including the javascript file automatically registers the components and\nsystems.</p>\n<p><strong>Note:</strong> You can access the most up to date version using <em>@latest</em>, but this\nis not recommended as it may cause unexpected changes.</p>\n<h2 id="new-project-vs-existing-project">New Project vs. Existing Project</h2>\n<p>When creating a new project, I recommend pulling the entirety of\naframe-vartiste-toolkit. The toolkit contains a wide variety of features;\nsome components and systems rely on others for full functionality. Including\nthe entire toolkit allows components and systems to work together to their\nfull extent.</p>\n<p>If you&#39;re bringing aframe-vartiste-toolkit into an existing project, you can\neither <a href="#customization">bring in specific pieces of the toolkit</a>, or you can\nbring in the whole thing. If possible, I recommend pulling in the whole toolkit,\nsince components may depend on other components or systems. If there&#39;s a concern\nfor naming or functionality conflicts, most components can also operate on their\nown.</p>\n<h1 id="toolkit-overview">Toolkit Overview</h1>\n<p>The <em>aframe-vartiste-toolkit</em> contains a wide variety of elements. It&#39;s built by\nexporting every little bit and piece of the <a href="https://vartiste.xyz">VARTISTE</a> app.\nExploring <a href="https://vartiste.xyz">VARTISTE</a> and the <a href="https://gitlab.com/zach-geek/vartiste">VARTISTE source\ncode</a> is ultimately the best way to\nsee what&#39;s available and how it works. Nonetheless, I&#39;ve written some\ndocumentation as a best-spare-time-effort. Here are some of the essentials to get\nyou started.</p>\n<h2 id="philosophy-and-terms">Philosophy and Terms</h2>\n<p>VARTISTE leans pretty heavily into the entity-component-system framework that\na-frame makes available; it consists mostly of components, which use systems when\nneeded, and can be attached to entities pretty readily. Many components also spawn\ntheir own children entities.</p>\n<p>There are a few notable exceptions in the form of utility classes, such as\n<a href="#util.js"><code>VARTISTE.Util</code></a> and <a href="#undo.js"><code>VARTISTE.Undo</code></a>. These utility classes\ncan be used when creating components or anywhere you&#39;d like in your Javascript code.\nThey are exposed under the VARTISTE object, which is created as a property in the\nglobal <code>window</code>. For instance, to access the\n<code>whenLoaded</code> method of <a href="#util.js"><code>Util</code></a>, you can call\n<code>VARTISTE.Util.whenLoaded(...)</code> anywhere in your code.</p>\n<p>Most components (but not all) respond correctly to updates via\n<code>setAttribute()</code>; fewer things respond correctly to <code>remove()</code> so if you\nrun into issues, double check the docs here or the source code.</p>\n<p>One extension to the ECS framework in VARTISTE are &quot;component systems&quot;, created\nvia <a href="#util.js"><code>VARTISTE.Util.registerComponentSystem</code></a>. These are basically\ncomponents for <code>a-scene</code> which get automatically attached (like systems do).\nThey have the full schema and update abilities of components, with the\nauto-attach convenience of systems. These are registered as both systems <em>and</em>\ncomponents and can be accessed either by the scene <code>components</code> object\n(e.g., <code>sceneEl.components[&quot;COMPONENT NAME&quot;]</code>) or the scene <code>systems</code> object\n(e.g., <code>sceneEl.systems[&quot;COMPONENT NAME&quot;]</code>) within your code.</p>\n<h2 id="ui-components">UI Components</h2>\n<p>VARTISTE has a quick-and-dirty user interface, focused around the\n<a href="#icon-button"><code>icon-button</code></a>. These are usually collected into an\n<a href="#icon-row"><code>icon-row</code></a>, where they&#39;re automatically laid out\nhorizontally. Most clickable elements have a <a href="#tooltip"><code>tooltip</code></a>,\nwhich are readable by the built-in <a href="#speech.js">text-to-speech</a>\nsystem.</p>\n<p>In addition to <a href="#icon-button"><code>icon-button</code>s</a>, there are <a href="#edit-field"><code>edit-field</code>s</a>\nfor text input and <a href="#lever"><code>lever</code>s</a> for adjusting values.</p>\n<p>All of these components are arranged on a <a href="#shelf"><code>shelf</code></a> which provides a\nbackground and frame. Shelves can also be closed or pinned to a controller for\neasy workspace management.</p>\n<h2 id="user-rig">User Rig</h2>\n<p>I created VARTISTE&#39;s user rig layout based on a laser-pointer type interface.\nYou can incorporate the entire rig with the <a href="#vartiste-user-root"><code>vartiste-user-root</code></a>\ncomponent. It includes:</p>\n<ul>\n<li>Automatic &quot;Press any key to reset orientation&quot; when entering VR.</li>\n<li>Cool &quot;VR Goggles&quot; that show up in the spectator camera (but not during normal\ndisplay)</li>\n<li>Ultra leap hand tracking</li>\n<li><a href="#hand-action-tooltip"><code>hand-action-tooltip</code></a> context sensitive button help\ntied to the controllers</li>\n<li>WebXR controller-only mode. I.e., you can use you controllers without your\nheadset, but just displaying on the desktop. Uses the <a href="#xr-controllers.js"><code>xr-controllers</code></a> system</li>\n<li>Controller motion smoothing by default. Really improves experiences for jumpy controllers (<em>cough<em>ReverbG2</em>cough</em>)</li>\n</ul>\n<p>Note this user rig uses the\n<a href="#webxr-motion-controller"><code>webxr-motion-controller</code></a> and\n<a href="#webxr-laser"><code>webxr-laser</code></a> components rather than the a-frame built-in\n<code>laser-controls</code>. I found the <a href="https://github.com/immersive-web/webxr-input-profiles">webxr-input-profiles\nmotion-controllers</a> to be\nmore consistent and up-to-date than the built-in a-frame components, so I\nbuilt the <a href="#webxr-input-profiles"><code>webxr-input-profiles</code></a> system to take advantage\nof that.</p>\n<h2 id="interaction-components">Interaction Components</h2>\n<p>User interaction is built around laser-control-type raycasting. Interactive\nelements have the <code>clickable</code> HTML class set, which makes them visible to the\nraycasters. <code>click</code> events are emitted when these elements are clicked.</p>\n<p>Every <code>clickable</code> entity, by default, can also be grabbed and moved. Grabbing\nand moving is handled via the <a href="#manipulator"><code>manipulator</code></a> component, which\nis installed on the user motion controllers or mouse controls. More info can\nbe found in the documentation for <a href="#manipulator"><code>manipulator</code></a>.</p>\n<p>There are also a bunch of built-in constraints, which can be set on entities to\nrestrict how they move when grabbed. For instance\n<a href="#manipulator-weight"><code>manipulator-weight</code></a> makes entities feel &quot;heavy&quot; by\nslowing down their movement when grabbed.</p>\n<h2 id="drawing-components">Drawing Components</h2>\n<p><a href="https://vartiste.xyz">VARTISTE</a> is, of course, a drawing and image editing\napplication. I&#39;ve brought many drawing components into the toolkit to\nallow easily adding drawing to other A-Frame applications.</p>\n<p>The easiest way to add drawing to your app is to add the\n<a href="#drawable"><code>drawable</code></a> component to whatever you want to be able to draw on,\nand the <a href="#hand-draw-tool"><code>hand-draw-tool</code></a> component to whichever raycasters\nyou want to be able to draw. These are already set up if you use the\n<a href="#vartiste-user-root"><code>vartiste-user-root</code></a> component. Additionally, you can\ncreate <a href="#pencil-tool"><code>pencil-tool</code></a> components to create grabbable pencils that\ncan be easier to use in VR.</p>\n<p>You can create your own brushes with the <a href="#set-brush"><code>set-brush</code></a> component.\nScene-wide drawing parameters are managed by the\n<a href="#paint-system"><code>paint-system</code></a>.</p>\n<h2 id="other-cool-stuff">Other cool stuff</h2>\n<p>There are lots of other nifty components and systems, for instance\n<a href="#canvas-fx"><code>canvas-fx</code></a>, which lets you quickly apply special effects to a\ncanvas, or <a href="#glb-exporter"><code>glb-exporter</code></a> which will let you download any\narbitrary entity or <code>THREE.Object3D</code> as a glb file in a single function call.\nThere&#39;s even a PhysX-based <a href="#physics.js">physics system</a>!</p>\n<p>Ultimately, the best way to find out everything that&#39;s available is to read\nthrough these documents, play around with the examples and VARTISTE itself, and\nfailing that, to read the source code.</p>\n<p>Also, VARTISTE uses a bunch of premade environments. These are packaged separately\nin the <a href="https://www.npmjs.com/package/aframe-enviropacks">aframe-enviropacks</a> package.</p>\n<h2 id="assets">Assets</h2>\n<p>Assets required for some of the basic component use are automatically included\nby the javascript source file.</p>\n<p>If you want to include <em>all</em> VARTISTE assets in your project, you will need an\n<code>a-asset</code> with a <code>vartiste-assets</code> property, like this:</p>\n<pre><code class="language-html">&lt;a-scene&gt;\n &lt;a-assets&gt;\n &lt;!-- Your assets ... --&gt;\n &lt;a-asset vartiste-assets=&quot;&quot;&gt;&lt;/a-asset&gt;\n &lt;/a-assets&gt;\n &lt;!-- Rest of your scene, etc --&gt;\n&lt;/a-scene&gt;</code></pre>\n<h2 id="customization">Customization</h2>\n<p>You can optionally customize which components and systems are registered by the\naframe-vartiste-toolkit by setting the <code>VARTISTE_TOOLKIT</code> variable <em>before</em> the\nvartiste-toolkit.js file is loaded. <code>VARTISTE_TOOLKIT</code> should either be <code>undefined</code>\n(default) or be an object having any of the following properties:</p>\n<ul>\n<li><code>excludeComponents</code>: Array of strings specifying which components, systems, or\nsystemComponents specifically to exclude from being registered</li>\n<li><code>includeComponents</code>: Array of strings specifying which components, systems, or\nsystemComponents to be registered. All other components, systems, and\nsystemComponents will be excluded.</li>\n<li><code>excludeFiles</code>: Array of strings specifying all aframe-vartiste-toolkit source\ncode files (from <a href="https://vartiste.xyz/docs.html">the component reference</a>) to\nexclude entirely from registration. All components, systems, and\nsystemComponents in those files will <em>not</em> be registered. Any classes in those\nfiles will not be defined.</li>\n<li><code>includeFiles</code>: Array of strings specifying which aframe-vartiste-toolkit\nsource code files (from <a href="https://vartiste.xyz/docs.html">the component\nreference</a>) to include in registration. All\ncomponents, systems, and systemComponents, and classes in other files will be\nexcluded.</li>\n<li><code>assetUrl</code>: VARTISTE Toolkit assets will be fetched from\n<code>assetUrl/assets/####.###</code>. Use this option if you want to use webpack and\nhave a custom public-facing URL</li>\n<li><code>replaceTextWithTroikaText</code>: If set to <code>true</code>, it will completely replace the\nbuilt-in AFRAME <code>text</code> component with a shim that will convert all <code>text</code> to\n<code>troika-text</code>. The shim will automatically convert all <code>text</code> properties to\nequivalent <code>troika-text</code> properties, and handle updates and removal. No\nchanges to code using the <code>text</code> component should be necessary. If set to\n<code>false</code> the <code>text</code> component will be left at the AFRAME default. If left at\nthe default value of <code>&#39;auto&#39;</code>, the toolkit will try to guess whether you want\nthe shim or not by looking at the <code>includeComponents</code> and <code>excludeComponents</code>\nvalues.</li>\n</ul>\n<h2 id="component-reference">Component Reference</h2>\n<p>The full API and component reference can be found at\n<a href="https://vartiste.xyz/docs.html">https://vartiste.xyz/docs.html</a>. Please note\nthat it is still under construction. The source code is available as well at\n<a href="https://gitlab.com/zach-geek/vartiste">https://gitlab.com/zach-geek/vartiste</a>,\nand contributions, both code-wise and documentation-wise are welcome.</p>\n<h1 id="examples">Examples</h1>\n<h2 id="example-scene">Example Scene</h2>\n<pre><code class="language-html">&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n\n&lt;head&gt;\n &lt;title&gt;VARTISTE Toolkit Demo&lt;/title&gt;\n &lt;script src=&quot;https://aframe.io/releases/1.1.0/aframe.js&quot;&gt;&lt;/script&gt;\n &lt;!-- &lt;script src=&quot;https://aframe.io/releases/1.0.4/aframe.js&quot;&gt;&lt;/script&gt; --&gt;\n &lt;!-- You can specify components / systems, or files to exclude from being registered --&gt;\n &lt;script&gt;VARTISTE_TOOLKIT = {\n /*excludeComponents: [&quot;frame&quot;], */ // Will exclude &quot;frame&quot; component\n /*includeComponents: [&quot;shelf&quot;, &quot;hdri-environment&quot;], */ // Will include *ONLY* the shelf component and hdri-environment system\n /*excludeFiles: [&#39;icon-button&#39;], */ // Will exclude all components found in aframe-vartiste-toolkit source file &#39;icon-button.js&#39;\n /*includeFiles: [&#39;icon-button&#39;], */ // Will include *only* the components found in aframe-vartiste-toolkit source file &#39;icon-button.js&#39;\n /*assetUrl: &#39;https://example.com:8080/&#39;, */ // Will load vartiste assets from https://example.com:8080/ rather than the script&#39;s location\n }&lt;/script&gt;\n &lt;!--Just include the toolkit js file--&gt;\n &lt;script src=&quot;https://unpkg.com/aframe-vartiste-toolkit@latest/vartiste-toolkit.js&quot;&gt;&lt;/script&gt;\n &lt;link rel=&quot;icon&quot; href=&quot;/assets/favicon.png&quot;&gt;\n&lt;/head&gt;\n\n&lt;body&gt;\n &lt;a-scene icon-button=&quot;shader: matcap&quot; renderer=&quot;colorManagement: true; physicallyCorrectLights: true&quot; xr-controllers-only=&quot;addUseControllerButton: true&quot; spectator-camera=&quot;camera: #spectator-camera; state: SPECTATOR_CAMERA&quot;&gt;\n &lt;a-assets timeout=&quot;600000&quot;&gt;\n &lt;canvas height=&quot;768&quot; id=&quot;draw-canvas-asset&quot; width=&quot;1024&quot;&gt;&lt;/canvas&gt;\n\n &lt;!-- You can easily load your own HDRI if you want! --&gt;\n &lt;a-asset id=&quot;hdr&quot; src=&quot;asset/studio.hdr&quot;&gt;&lt;/a-asset&gt;\n\n &lt;!--You can use all the default VARTISTE assets with the vartiste-asset\n component. Otherwise, only the ones needed for other components are\n included--&gt;\n &lt;a-asset vartiste-assets=&quot;&quot;&gt;&lt;/a-asset&gt;\n\n &lt;!-- You can override some built-in components by defining mixins --&gt;\n &lt;a-mixin id=&quot;lever-grip&quot; material=&quot;color: #a2c4fa&quot;&gt;&lt;/a-mixin&gt;\n &lt;a-mixin id=&quot;shelf-bg&quot; materia=&quot;shader: standard&quot;&gt;&lt;/a-mixin&gt;\n &lt;/a-assets&gt;\n\n &lt;!-- HDRIs are an easy way to get nice lighting and backgrounds really quickly --&gt;\n &lt;a-sky color=&quot;#333&quot; hdri-environment=&quot;src: #hdr&quot;&gt;&lt;/a-sky&gt;\n\n &lt;a-entity light=&quot;type: hemisphere; color: #eee; groundColor: #333; intensity: 0.6&quot;&gt;&lt;/a-entity&gt;\n &lt;a-entity light=&quot;type: ambient; color: #fff; intensity: 0.6&quot;&gt;&lt;/a-entity&gt;\n\n &lt;!-- vartiste-user-root sets up the default laser pointer / mouse &amp; keyboard\n interactions. If you want to define your own user setup, you&#39;ll want to make\n sure to include the manipulator components on both of the hand components to\n ensure that things can be grabbed and resized. --&gt;\n &lt;a-entity vartiste-user-root=&quot;&quot;&gt;&lt;/a-entity&gt;\n\n &lt;a-entity position=&quot;0 0 -2.5&quot;&gt;\n\n &lt;!--A shelf provides a definitive place to put things. &quot;grab-root&quot; ensures\n that grab-and-move events propogate to the whole shelf--&gt;\n &lt;a-entity class=&quot;grab-root&quot; shelf=&quot;&quot;&gt;\n &lt;!--icon-buttons position themselves in a row automatically. So we just\n position this outer entity where we want the row to start--&gt;\n &lt;a-entity position=&quot;-1.5 1.1 0&quot; icon-row=&quot;&quot;&gt;\n &lt;!--Simply pass an asset to icon-button, and boom, you&#39;ve got an icon\n button that responds to a wide range of clicks--&gt;\n &lt;a-entity icon-button=&quot;#asset-eye&quot; onclick=&quot;alert(&#39;click&#39;)&quot; tooltip=&quot;Run Javascript onclick handler&quot;&gt;&lt;/a-entity&gt;\n &lt;!--You can make it a toggle button by adding the toggle-button\n component--&gt;\n &lt;a-entity icon-button=&quot;#asset-oven&quot; toggle-button=&quot;&quot; tooltip=&quot;Toggle Me&quot;&gt;&lt;/a-entity&gt;\n &lt;!--You can style it, too--&gt;\n &lt;a-entity button-style=&quot;color: #ed8607; clickColor: #8607ed; intersectedColor: #07ed86&quot; icon-button=&quot;&quot; tooltip=&quot;Look at the colors! Woah!&quot; onclick=&quot;this.sceneEl.systems[&#39;canvas-fx&#39;].applyFX(&#39;invert&#39;, document.getElementById(&#39;draw-canvas-asset&#39;))&quot;&gt;&lt;/a-entity&gt;\n &lt;!--Add the system-click-action to easily call methods of systems--&gt;\n &lt;a-entity icon-button=&quot;#asset-account-voice&quot; system-click-action=&quot;system: toolkit-demo; action: speak&quot; tooltip=&quot;Speak entered text if enabled&quot;&gt;&lt;/a-entity&gt;\n &lt;!--Or add component properties directly for the toggle buttons to\n toggle--&gt;\n &lt;a-entity icon-button=&quot;#asset-check-outline&quot; toggle-button=&quot;target: a-scene; component: speech; property: speak&quot; tooltip=&quot;Toggle Speaking Enabled&quot;&gt;&lt;/a-entity&gt;\n\n &lt;!-- Easily export entities or even the entire scene to a GLB file --&gt;\n &lt;a-entity icon-button=&quot;#asset-floppy&quot; tooltip=&quot;Download this scene as GLB&quot; system-click-action=&quot;system: glb-exporter; action: downloadGLB&quot;&gt;&lt;/a-entity&gt;\n\n &lt;!-- Use the VARTISTE undo system to easily undo changes, too --&gt;\n &lt;a-entity icon-button=&quot;#asset-undo&quot; tooltip=&quot;Undo&quot; onclick=&quot;VARTISTE.Undo.undo()&quot;&gt;&lt;/a-entity&gt;\n\n &lt;a-entity icon-button=&quot;#asset-help-circle-outline&quot; system-click-action=&quot;system: toolkit-demo; action: help&quot; tooltip=&quot;VARTISTE Toolkit Documentation&quot;&gt;&lt;/a-entity&gt;\n &lt;/a-entity&gt;\n &lt;a-entity position=&quot;0 0.5 0&quot; text=&quot;width: 3.4; wrapCount: 35; value: Welcome to the VARTISTE toolkit demo&quot;&gt;&lt;/a-entity&gt;\n &lt;a-entity&gt;\n\n &lt;!--You can use edit fields which pop up a keyboard--&gt;\n &lt;a-entity edit-field=&quot;type: string; tooltip: Edit a string!&quot; id=&quot;demo-input&quot; text=&quot;width: 2; wrapCount: 20; value: default text&quot;&gt;&lt;/a-entity&gt;\n &lt;/a-entity&gt;\n &lt;a-entity position=&quot;0 -0.6 0&quot;&gt;\n\n &lt;!--You can also have a numerical edit field--&gt;\n &lt;a-entity edit-field=&quot;type: number; tooltip: Edit a number&quot; text=&quot;width: 2; wrapCount: 4&quot;&gt;&lt;/a-entity&gt;\n &lt;/a-entity&gt;\n\n &lt;!-- You can make interactables, like this lever --&gt;\n &lt;a-entity lever=&quot;valueRange: 2 0; target: a-sky; component: hdri-environment; property: exposure; initialValue: 0.724&quot; position=&quot;-1.621 -0.917 0&quot; scale=&quot;2 2 2&quot; tooltip=&quot;Adjust Lighting&quot;&gt;&lt;/a-entity&gt;\n &lt;/a-entity&gt;\n &lt;/a-entity&gt;\n\n &lt;!--You can put a frame around anything with a geometry. The frame can optionally be closeable, or pinnable to your hand--&gt;\n &lt;a-image frame=&quot;&quot; position=&quot;0 2 -1&quot; src=&quot;#asset-vartiste&quot; tooltip=&quot;Here&#39;s a floating frame!&quot; tooltip-style=&quot;offset: 0 0.5 0&quot;&gt;&lt;/a-image&gt;\n\n &lt;!--Adding the clickable class to anything makes it grabbable--&gt;\n &lt;a-entity class=&quot;clickable&quot; position=&quot;-3.0 0 -2.5&quot; text=&quot;width: 2.4; wrapCount: 25; value: Desktop Controls:\\n-Left Click: Click buttons\\n-Right Mouse Buton Drag: Look around\\n-Shift+Left Mouse Button Drag: Move things\\n-WASD: Move around&quot;&gt;&lt;/a-entity&gt;\n\n &lt;!--You can use some of the VARTISTE drawing tools, too!--&gt;\n &lt;a-entity id=&quot;draw-canvas-demo&quot; class=&quot;clickable&quot;\n drawable=&quot;canvas:#draw-canvas-asset&quot; frame=&quot;&quot;\n geometry=&quot;primitive: plane; width: 2; height: 1.75&quot;\n material=&quot;shader: flat; src: #draw-canvas-asset; npot: true&quot;\n position=&quot;3.1 0 -2.4&quot; tooltip=&quot;Draw Here&quot; tooltip-style=&quot;offset: 0 0.75 0&quot;&gt;&lt;/a-entity&gt;\n &lt;a-entity class=&quot;clickable&quot; color-picker=&quot;&quot; geometry=&quot;primitive: circle; radius: 1; height: 1.75&quot; position=&quot;3.1 2 -2.4&quot;&gt;&lt;/a-entity&gt;\n &lt;a-entity position=&quot;4.5 2 -2.4&quot; icon-button=&quot;#asset-brush&quot; tooltip=&quot;Change brush&quot; set-brush=&quot;brushType: ImageBrush; image: #asset-brush; color: blue; scale: 5; activationEvent: click&quot;&gt;&lt;/a-entity&gt;\n &lt;a-entity position=&quot;3.1 0 -1.4&quot; rotation=&quot;90 0 0&quot; scale=&quot;2 2 2&quot; pencil-tool=&quot;&quot; tooltip=&quot;Grabbable Pencil&quot; set-brush=&quot;brushType: ImageBrush; image: #asset-lead-pencil; color: green; scale: 5&quot;&gt;&lt;/a-entity&gt;\n\n &lt;!-- There&#39;s a few handy default constraints to restrict how things can be grabbed --&gt;\n &lt;a-sphere class=&quot;clickable&quot;\n constrain-to-sphere=&quot;&quot;\n manipulator-weight=&quot;type: slow; weight: 0.9&quot;\n grab-options=&quot;undoable: true&quot;\n material=&quot;shader: standard; roughness: 0.3; metalness: 0.7&quot; position=&quot;0 0.4 -0.4&quot; radius=&quot;0.1&quot;&gt;&lt;/a-sphere&gt;\n\n &lt;a-entity id=&quot;spectator-camera&quot; camera=&quot;&quot; position=&quot;2 1 1&quot; rotation=&quot;0 80 0&quot; camera-layers=&quot;layers: spectator&quot;&gt;&lt;/a-entity&gt;\n\n &lt;!-- The toolkit also includes a PhysX-backed physics engine, with lots of nifty utilities. See https://glitch.com/edit/#!/fascinated-hip-period?path=index.html for a full demo! --&gt;\n &lt;a-box material=&quot;shader: standard; color: white&quot; width=&quot;0.3&quot; height=&quot;0.3&quot; depth=&quot;0.3&quot;\n position=&quot;-2.276 0.3 0.165&quot;\n physx-body=&quot;type: static&quot;&gt;&lt;/a-box&gt;\n &lt;a-entity icon-button=&quot;#asset-nudge-brush&quot; tooltip=&quot;Start Physics&quot; system-click-action=&quot;system: physx; action: startPhysX&quot; position=&quot;-2.105 0.3 0.13&quot; rotation=&quot;0 90 0&quot; scale=&quot;0.6 0.6 0.6&quot;&gt;&lt;/a-entity&gt;\n &lt;a-entity gltf-model=&quot;#asset-hand&quot;\n preactivate-tooltip=&quot;Press Start Physics below!&quot;\n position=&quot;-2.276 1 0.165&quot;\n class=&quot;clickable&quot;\n physx-body=&quot;type: dynamic&quot;&gt;&lt;/a-entity&gt;\n &lt;/a-scene&gt;\n&lt;/body&gt;\n&lt;/html&gt;</code></pre>\n<p><a href="https://codepen.io/zach-capalbo/pen/oNbKagV">View the demo on CodePen</a></p>\n<p class="codepen" data-height="330" data-theme-id="light" data-default-tab="html,result" data-user="zach-capalbo" data-slug-hash="oNbKagV" data-preview="true" style="height: 330px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="aframe-vartiste-toolkit-demo">\n <span>See the Pen <a href="https://codepen.io/zach-capalbo/pen/oNbKagV">\n aframe-vartiste-toolkit-demo</a> by Zachary Capalbo (<a href="https://codepen.io/zach-capalbo">@zach-capalbo</a>)\n on <a href="https://codepen.io">CodePen</a>.</span>\n</p>\n<script async src="https://static.codepen.io/assets/embed/ei.js"><\/script>\n\n<h2 id="physics-playground">Physics playground</h2>\n<p>The <a href="https://glitch.com/edit/#!/fascinated-hip-period?path=index.html%3A1%3A0">aframe-vartiste-toolkit physics playground</a> is a good example of using the toolkit for projects other than painting or drawing. It&#39;s also the best example of the <a href="#physics.js">physics</a> components so far.</p>\n<h1 id="source-code">Source Code</h1>\n<p>For more information, and to better understand VARTISTE, you can also read through the source code:</p>\n<p><a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/vartiste-toolkit.js">https://gitlab.com/zach-geek/vartiste/-/blob/release/src/vartiste-toolkit.js</a></p>\n'},1583:t=>{t.exports='<p><a name="compression.worker.js"></a></p>\n<h1 id="compressionworkerjs">compression.worker.js</h1>\n'},8076:t=>{t.exports='<p><a name="ffmpeg-core.worker.js"></a></p>\n<h1 id="ffmpeg-coreworkerjs">ffmpeg-core.worker.js</h1>\n'},8332:t=>{t.exports='<p><a name="about-shelf.js"></a></p>\n<h1 id="about-shelfjs">about-shelf.js</h1>\n<p><a name="vartiste-version-info"></a><a name="system_vartiste-version-info"></a></p>\n<h2 id="system-vartiste-version-info-about-shelfjs15">System <code>vartiste-version-info</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/about-shelf.js#L15">(about-shelf.js:15)</a></h2>\n<hr>\n<p><a name="version-info"></a><a name="component_version-info"></a></p>\n<h2 id="component-version-info-about-shelfjs21">Component <code>version-info</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/about-shelf.js#L21">(about-shelf.js:21)</a></h2>\n<hr>\n'},7023:t=>{t.exports='<p><a name="ai-nodes.js"></a></p>\n<h1 id="ai-nodesjs">ai-nodes.js</h1>\n<p><a name="ai"></a><a name="system_ai"></a></p>\n<h2 id="system-ai-ai-nodesjs6">System <code>ai</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/ai-nodes.js#L6">(ai-nodes.js:6)</a></h2>\n<hr>\n<p><a name="StyleTransferNode"></a><a name="class_StyleTransferNode"></a></p>\n<h2 id="class-styletransfernode-ai-nodesjs46">Class <code>StyleTransferNode</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/ai-nodes.js#L46">(ai-nodes.js:46)</a></h2>\n<p>undefined</p>\n<hr>\n<p><a name="AIRenderNode"></a><a name="class_AIRenderNode"></a></p>\n<h2 id="class-airendernode-ai-nodesjs115">Class <code>AIRenderNode</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/ai-nodes.js#L115">(ai-nodes.js:115)</a></h2>\n<p>undefined</p>\n<hr>\n'},5252:t=>{t.exports='<p><a name="animation-3d.js"></a></p>\n<h1 id="animation-3djs">animation-3d.js</h1>\n<p><a name="ObjectKeyframeTracks"></a><a name="class_ObjectKeyframeTracks"></a></p>\n<h2 id="class-objectkeyframetracks-animation-3djs6">Class <code>ObjectKeyframeTracks</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/animation-3d.js#L6">(animation-3d.js:6)</a></h2>\n<p>undefined</p>\n<hr>\n<p><a name="animation-3d"></a><a name="componentsystem_animation-3d"></a></p>\n<h2 id="componentsystem-animation-3d-animation-3djs229">ComponentSystem <code>animation-3d</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/animation-3d.js#L229">(animation-3d.js:229)</a></h2>\n<h3 id="animation-3d-schema">animation-3d Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>frameCount</td>\n<td>number</td>\n<td>50</td>\n<td></td>\n</tr>\n</tbody></table>\n<h3 id="animation-3d-methods">animation-3d Methods</h3>\n<table>\n<thead>\n<tr>\n<th>Signature</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>animate <code>(obj, {wrapAnimation = true, useGlobalNumberOfFrames = false} = {})</code></td>\n<td>frameIdx(idx) { idx = idx % this.data.frameCount if (idx &lt; 0) idx = this.data.frameCount + idx return idx },</td>\n</tr>\n</tbody></table>\n<hr>\n<p><a name="animation-3d-keyframed"></a><a name="component_animation-3d-keyframed"></a></p>\n<h2 id="component-animation-3d-keyframed-animation-3djs544">Component <code>animation-3d-keyframed</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/animation-3d.js#L544">(animation-3d.js:544)</a></h2>\n<h3 id="animation-3d-keyframed-schema">animation-3d-keyframed Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>puppeteering</td>\n<td>boolean</td>\n<td>false</td>\n<td></td>\n</tr>\n<tr>\n<td>recording</td>\n<td>boolean</td>\n<td>false</td>\n<td></td>\n</tr>\n<tr>\n<td>restartAnimationOnGrab</td>\n<td>boolean</td>\n<td>true</td>\n<td></td>\n</tr>\n<tr>\n<td>wrapAnimation</td>\n<td>boolean</td>\n<td>true</td>\n<td></td>\n</tr>\n<tr>\n<td>useGlobalNumberOfFrames</td>\n<td>boolean</td>\n<td>false</td>\n<td></td>\n</tr>\n<tr>\n<td>enabled</td>\n<td>boolean</td>\n<td>true</td>\n<td></td>\n</tr>\n<tr>\n<td>proxyObject</td>\n<td>string</td>\n<td></td>\n<td></td>\n</tr>\n</tbody></table>\n<hr>\n<p><a name="timeline-tool"></a><a name="component_timeline-tool"></a></p>\n<h2 id="component-timeline-tool-animation-3djs609">Component <code>timeline-tool</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/animation-3d.js#L609">(animation-3d.js:609)</a></h2>\n<h3 id="timeline-tool-schema">timeline-tool Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>target</td>\n<td>selector</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>loadAllKeyframes</td>\n<td>boolean</td>\n<td>false</td>\n<td></td>\n</tr>\n</tbody></table>\n<hr>\n<p><a name="timeline-keyframe"></a><a name="component_timeline-keyframe"></a></p>\n<h2 id="component-timeline-keyframe-animation-3djs827">Component <code>timeline-keyframe</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/animation-3d.js#L827">(animation-3d.js:827)</a></h2>\n<h3 id="timeline-keyframe-schema">timeline-keyframe Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>target</td>\n<td>selector</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>frame</td>\n<td>number</td>\n<td>1</td>\n<td></td>\n</tr>\n</tbody></table>\n<hr>\n<p><a name="animation-3d-path"></a><a name="component_animation-3d-path"></a></p>\n<h2 id="component-animation-3d-path-animation-3djs863">Component <code>animation-3d-path</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/animation-3d.js#L863">(animation-3d.js:863)</a></h2>\n<h3 id="animation-3d-path-schema">animation-3d-path Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>target</td>\n<td>selector</td>\n<td></td>\n<td></td>\n</tr>\n</tbody></table>\n<hr>\n<p><a name="puppeteer-selection-tool"></a><a name="component_puppeteer-selection-tool"></a></p>\n<h2 id="component-puppeteer-selection-tool-animation-3djs879">Component <code>puppeteer-selection-tool</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/animation-3d.js#L879">(animation-3d.js:879)</a></h2>\n<h3 id="puppeteer-selection-tool-schema">puppeteer-selection-tool Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>wrapAnimation</td>\n<td>boolean</td>\n<td>true</td>\n<td></td>\n</tr>\n</tbody></table>\n<hr>\n<p><a name="bone-redirector"></a><a name="component_bone-redirector"></a></p>\n<h2 id="component-bone-redirector-animation-3djs926">Component <code>bone-redirector</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/animation-3d.js#L926">(animation-3d.js:926)</a></h2>\n<hr>\n<p><a name="skeleton-editor"></a><a name="system_skeleton-editor"></a></p>\n<h2 id="system-skeleton-editor-animation-3djs941">System <code>skeleton-editor</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/animation-3d.js#L941">(animation-3d.js:941)</a></h2>\n<hr>\n<p><a name="skeleton-editor"></a><a name="component_skeleton-editor"></a></p>\n<h2 id="component-skeleton-editor-animation-3djs943">Component <code>skeleton-editor</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/animation-3d.js#L943">(animation-3d.js:943)</a></h2>\n<h3 id="skeleton-editor-schema">skeleton-editor Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>traverse</td>\n<td>boolean</td>\n<td>false</td>\n<td></td>\n</tr>\n</tbody></table>\n<hr>\n<p><a name="animation-playing-indicator"></a><a name="component_animation-playing-indicator"></a></p>\n<h2 id="component-animation-playing-indicator-animation-3djs1030">Component <code>animation-playing-indicator</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/animation-3d.js#L1030">(animation-3d.js:1030)</a></h2>\n<hr>\n'},4390:t=>{t.exports='<p><a name="art-physics.js"></a></p>\n<h1 id="art-physicsjs">art-physics.js</h1>\n<p><a name="art-physics"></a><a name="componentsystem_art-physics"></a></p>\n<h2 id="componentsystem-art-physics-art-physicsjs10">ComponentSystem <code>art-physics</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/art-physics.js#L10">(art-physics.js:10)</a></h2>\n<h3 id="art-physics-schema">art-physics Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>artPhysics</td>\n<td>boolean</td>\n<td>false</td>\n<td></td>\n</tr>\n<tr>\n<td>scenePhysics</td>\n<td>boolean</td>\n<td>false</td>\n<td></td>\n</tr>\n</tbody></table>\n<hr>\n'},1210:t=>{t.exports='<p><a name="artist-positioning.js"></a></p>\n<h1 id="artist-positioningjs">artist-positioning.js</h1>\n<p><a name="artist-root"></a><a name="componentsystem_artist-root"></a></p>\n<h2 id="componentsystem-artist-root-artist-positioningjs5">ComponentSystem <code>artist-root</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/artist-positioning.js#L5">(artist-positioning.js:5)</a></h2>\n<p>Helper for positioning the user</p>\n<h3 id="artist-root-schema">artist-root Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>rotationAmount</td>\n<td>string</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>autoResetPosition</td>\n<td>boolean</td>\n<td>true</td>\n<td>Automatically reset the user&#39;s position (including prompt to reset) when entering VR</td>\n</tr>\n<tr>\n<td>resetPositioner</td>\n<td>string</td>\n<td>#camera-reset-el</td>\n<td></td>\n</tr>\n</tbody></table>\n<h3 id="artist-root-methods">artist-root Methods</h3>\n<table>\n<thead>\n<tr>\n<th>Signature</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>rotateLeft <code>()</code></td>\n<td>Rotates the user&#39;s viewport left</td>\n</tr>\n<tr>\n<td>rotateRight <code>()</code></td>\n<td>Rotates the user&#39;s viewport right</td>\n</tr>\n<tr>\n<td>resetCameraLocation <code>()</code></td>\n<td>Forces the camera back to it&#39;s original spot, no matter how the user has moved around.</td>\n</tr>\n<tr>\n<td>showOrientationResetPrompt <code>()</code></td>\n<td>Shows the prompt</td>\n</tr>\n</tbody></table>\n<hr>\n<p><a name="between-target-positioner"></a><a name="component_between-target-positioner"></a></p>\n<h2 id="component-between-target-positioner-artist-positioningjs158">Component <code>between-target-positioner</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/artist-positioning.js#L158">(artist-positioning.js:158)</a></h2>\n<h3 id="between-target-positioner-schema">between-target-positioner Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>root</td>\n<td>selector</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>target</td>\n<td>selector</td>\n<td></td>\n<td></td>\n</tr>\n</tbody></table>\n<hr>\n<p><a name="reset-transform-on-vr"></a><a name="component_reset-transform-on-vr"></a></p>\n<h2 id="component-reset-transform-on-vr-artist-positioningjs197">Component <code>reset-transform-on-vr</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/artist-positioning.js#L197">(artist-positioning.js:197)</a></h2>\n<hr>\n<p><a name="camera-matrix-helper"></a><a name="component_camera-matrix-helper"></a></p>\n<h2 id="component-camera-matrix-helper-artist-positioningjs219">Component <code>camera-matrix-helper</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/artist-positioning.js#L219">(artist-positioning.js:219)</a></h2>\n<p>Workaround for the <code>look-controls</code> not updating the matrix</p>\n<hr>\n<p><a name="artist-shadow"></a><a name="component_artist-shadow"></a></p>\n<h2 id="component-artist-shadow-artist-positioningjs233">Component <code>artist-shadow</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/artist-positioning.js#L233">(artist-positioning.js:233)</a></h2>\n<hr>\n<p><a name="position-at-target"></a><a name="component_position-at-target"></a></p>\n<h2 id="component-position-at-target-artist-positioningjs240">Component <code>position-at-target</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/artist-positioning.js#L240">(artist-positioning.js:240)</a></h2>\n<h3 id="position-at-target-schema">position-at-target Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>target</td>\n<td>selector</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>throttle</td>\n<td>number</td>\n<td>0</td>\n<td></td>\n</tr>\n<tr>\n<td>enabled</td>\n<td>boolean</td>\n<td>true</td>\n<td></td>\n</tr>\n</tbody></table>\n<hr>\n'},7229:t=>{t.exports='<p><a name="assets.js"></a></p>\n<h1 id="assetsjs">assets.js</h1>\n'},1129:t=>{t.exports='<p><a name="avatar.js"></a></p>\n<h1 id="avatarjs">avatar.js</h1>\n<p><a name="avatar"></a><a name="componentsystem_avatar"></a></p>\n<h2 id="componentsystem-avatar-avatarjs11">ComponentSystem <code>avatar</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/avatar.js#L11">(avatar.js:11)</a></h2>\n<p>System to display an avatar as for spectator / multiplayer</p>\n<p>Use the <code>setAvatarModel(model)</code> function to set an object as an avatar, or\nuse the <a href="#spectator-avatar"><code>spectator-avatar</code></a> component</p>\n<h3 id="avatar-schema">avatar Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>importAvatar</td>\n<td>boolean</td>\n<td>false</td>\n<td>VARTISTE internal use only</td>\n</tr>\n<tr>\n<td>leftHandEl</td>\n<td>selector</td>\n<td>#left-hand</td>\n<td></td>\n</tr>\n<tr>\n<td>rightHandEl</td>\n<td>selector</td>\n<td>#right-hand</td>\n<td></td>\n</tr>\n<tr>\n<td>debug</td>\n<td>boolean</td>\n<td>false</td>\n<td></td>\n</tr>\n</tbody></table>\n<hr>\n<p><a name="avatar-pose-export-provider"></a><a name="componentsystem_avatar-pose-export-provider"></a></p>\n<h2 id="componentsystem-avatar-pose-export-provider-avatarjs251">ComponentSystem <code>avatar-pose-export-provider</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/avatar.js#L251">(avatar.js:251)</a></h2>\n<p>System to provide world relative information about the user&#39;s pose</p>\n<h3 id="avatar-pose-export-provider-schema">avatar-pose-export-provider Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>throttle</td>\n<td>number</td>\n<td>100</td>\n<td></td>\n</tr>\n</tbody></table>\n<hr>\n<p><a name="remote-avatar"></a><a name="component_remote-avatar"></a></p>\n<h2 id="component-remote-avatar-avatarjs359">Component <code>remote-avatar</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/avatar.js#L359">(avatar.js:359)</a></h2>\n<p>Displays a remote users&#39;s avatar. Uses data in the format supplied by\n<a href="#avatar-pose-export-provider">avatar-pose-export-provider</a></p>\n<h3 id="remote-avatar-schema">remote-avatar Schema</h3>\n<table>\n<thead>\n<tr>\n<th>Property</th>\n<th>Type</th>\n<th>Default</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>id</td>\n<td>string</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>throttle</td>\n<td>number</td>\n<td>100</td>\n<td></td>\n</tr>\n</tbody></table>\n<hr>\n<p><a name="spectator-avatar"></a><a name="component_spectator-avatar"></a></p>\n<h2 id="component-spectator-avatar-avatarjs418">Component <code>spectator-avatar</code> <a href="https://gitlab.com/zach-geek/vartiste/-/blob/release/src/avatar.js#L418">(avatar.js:418)</a></h2>\n<p>Sets this element&#39;s mesh object3D as the spectator avatar. This should have\na <a href="https://github.com/MozillaReality/hubs-avatar-pipelines">Mozilla Hubs-style skeleton</a>.\nAlso compatible with <a href="https://readyplayer.me">Ready Player Me</a> half-body skeletons.</p>\n<p>Example:</p>\n<pre><code>&lt;a-scene spectator-c