[{"data":1,"prerenderedAt":5005},["ShallowReactive",2],{"navigation":3,"/cli/gltf":256,"/cli/gltf-surround":5000},[4,29,78,177,190,222,232,236,240,244,248,252],{"title":5,"path":6,"stem":7,"children":8,"icon":27,"titleTemplate":28},"Getting Started","/getting-started","1.getting-started/1.index",[9,12,17,22],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Your First Scene","/getting-started/your-first-scene","1.getting-started/3.your-first-scene","i-lucide-donut",{"title":23,"path":24,"stem":25,"icon":26},"Upgrade Guide","/getting-started/upgrade-guide","1.getting-started/4.upgrade-guide","i-lucide-circle-arrow-up","i-lucide-rocket","%s · Get Started with TresJS",{"title":30,"path":31,"stem":32,"children":33},"Essentials","/essentials","2.essentials",[34,36,48],{"title":30,"path":31,"stem":35},"2.essentials/index",{"title":37,"icon":38,"open":39,"path":40,"stem":41,"children":42,"page":47},"Core Architecture","i-lucide-cpu",true,"/essentials/core-architecture","2.essentials/1.core-architecture",[43],{"title":44,"path":45,"stem":46},"Custom Vue Renderer","/essentials/core-architecture/custom-vue-renderer","2.essentials/1.core-architecture/2.custom-vue-renderer",false,{"title":49,"icon":50,"open":39,"path":51,"stem":52,"children":53,"page":47},"Key Concepts","i-lucide-medal","/essentials/concepts","2.essentials/2.concepts",[54,58,62,66,70,74],{"title":55,"path":56,"stem":57},"Declarative vs Imperative","/essentials/concepts/declarative-vs-imperative","2.essentials/2.concepts/1.declarative-vs-imperative",{"title":59,"path":60,"stem":61},"Reactivity","/essentials/concepts/reactivity","2.essentials/2.concepts/2.reactivity",{"title":63,"path":64,"stem":65},"Constructor Arguments","/essentials/concepts/constructor-arguments","2.essentials/2.concepts/3.constructor-arguments",{"title":67,"path":68,"stem":69},"Declarative Properties","/essentials/concepts/declarative-properties","2.essentials/2.concepts/4.declarative-properties",{"title":71,"path":72,"stem":73},"Extending the Catalogue","/essentials/concepts/extending-catalogue","2.essentials/2.concepts/5.extending-catalogue",{"title":75,"path":76,"stem":77},"Child Attachments","/essentials/concepts/child-attachments","2.essentials/2.concepts/6.child-attachments",{"title":79,"path":80,"stem":81,"children":82},"API","/api","3.api",[83,86,108,135,145,159],{"title":84,"path":80,"stem":85},"TresJS API Reference","3.api/1.index",{"title":87,"icon":88,"open":39,"path":89,"stem":90,"children":91,"page":47},"Components","i-lucide-box","/api/components","3.api/1.components",[92,96,100,104],{"title":93,"path":94,"stem":95},"\u003CTresCanvas />","/api/components/tres-canvas","3.api/1.components/tres-canvas",{"title":97,"path":98,"stem":99},"\u003CTresCanvasContext />","/api/components/tres-context","3.api/1.components/tres-context",{"title":101,"path":102,"stem":103},"Tres Components","/api/components/tres-objects","3.api/1.components/tres-objects",{"title":105,"path":106,"stem":107},"TresPortal","/api/components/tres-portal","3.api/1.components/tres-portal",{"title":109,"titleTemplate":110,"icon":111,"path":112,"stem":113,"children":114,"page":47},"Composables","%s · TresJS Composables","i-lucide-arrow-right-left","/api/composables","3.api/2.composables",[115,119,123,127,131],{"title":116,"path":117,"stem":118},"useTres","/api/composables/use-tres","3.api/2.composables/1.use-tres",{"title":120,"path":121,"stem":122},"useTresContext","/api/composables/use-tres-context","3.api/2.composables/2.use-tres-context",{"title":124,"path":125,"stem":126},"useLoop","/api/composables/use-loop","3.api/2.composables/3.use-loop",{"title":128,"path":129,"stem":130},"useGraph","/api/composables/use-graph","3.api/2.composables/4.use-graph",{"title":132,"path":133,"stem":134},"useLoader","/api/composables/use-loader","3.api/2.composables/5.use-loader",{"title":136,"icon":137,"path":138,"stem":139,"children":140,"page":47},"Event handling","i-lucide-mouse-pointer-2","/api/events","3.api/3.events",[141],{"title":142,"path":143,"stem":144},"Pointer Events","/api/events/pointer-events","3.api/3.events/1.pointer-events",{"title":146,"icon":147,"path":148,"stem":149,"children":150,"page":47},"Utils","i-lucide-wrench","/api/utils","3.api/4.utils",[151,155],{"title":152,"path":153,"stem":154},"Type Guards","/api/utils/type-guards","3.api/4.utils/1.type-guards",{"title":156,"path":157,"stem":158},"Directives","/api/utils/directives","3.api/4.utils/2.directives",{"title":160,"icon":161,"path":162,"stem":163,"children":164,"page":47},"Advanced","i-lucide-brain-circuit","/api/advanced","3.api/5.advanced",[165,169,173],{"title":166,"path":167,"stem":168},"Scaling Performance 🚀","/api/advanced/performance","3.api/5.advanced/performance",{"title":170,"path":171,"stem":172},"Primitives","/api/advanced/primitives","3.api/5.advanced/primitives",{"title":174,"path":175,"stem":176},"WebGPU","/api/advanced/web-gpu","3.api/5.advanced/web-gpu",{"title":178,"path":179,"stem":180,"children":181,"icon":184,"titleTemplate":189},"CLI","/cli","4.cli/1.index",[182,185],{"title":183,"path":179,"stem":180,"icon":184},"TresJS CLI","i-lucide-terminal",{"title":186,"path":187,"stem":188,"icon":88},"tres gltf","/cli/gltf","4.cli/2.gltf","%s · TresJS CLI",{"title":191,"path":192,"stem":193,"children":194},"Cookbook","/cookbook","5.cookbook",[195,198,202,206,210,214,218],{"title":196,"path":192,"stem":197},"Cookbook 🍳🧑‍🍳","5.cookbook/index",{"title":199,"path":200,"stem":201},"OrbitControls","/cookbook/orbit-controls","5.cookbook/1.orbit-controls",{"title":203,"path":204,"stem":205},"Basic Animations","/cookbook/basic-animations","5.cookbook/2.basic-animations",{"title":207,"path":208,"stem":209},"Model Animation","/cookbook/model-animation","5.cookbook/3.model-animation",{"title":211,"path":212,"stem":213},"Advanced GSAP Animations","/cookbook/advanced-gsap-animations","5.cookbook/4.advanced-gsap-animations",{"title":215,"path":216,"stem":217},"Tweakpane","/cookbook/tweakpane","5.cookbook/5.tweakpane",{"title":219,"path":220,"stem":221},"Dynamic components","/cookbook/transition-dynamic","5.cookbook/6.transition-dynamic",{"title":223,"path":224,"stem":225,"children":226},"Community","/community","6.community/1.index",[227,228],{"title":223,"path":224,"stem":225},{"title":229,"path":230,"stem":231},"Awesome Resources","/community/awesome-resources","6.community/awesome-resources",{"title":233,"path":234,"stem":235},"German Translation","/de","de",{"title":237,"path":238,"stem":239},"Spanish Translation","/es","es",{"title":241,"path":242,"stem":243},"French Translation","/fr","fr",{"title":245,"path":246,"stem":247},"Italian Translation","/it","it",{"title":249,"path":250,"stem":251},"Japanese Translation","/jp","jp",{"title":253,"path":254,"stem":255},"Chinese Translation","/zh","zh",{"id":257,"title":186,"body":258,"description":4993,"extension":4994,"links":4995,"meta":4996,"navigation":4997,"path":187,"seo":4998,"stem":188,"__hash__":4999},"docs/4.cli/2.gltf.md",{"type":259,"value":260,"toc":4976},"minimark",[261,272,350,361,364,583,588,595,1730,1733,1867,1871,1874,2054,2066,2094,2098,2106,2302,2316,2320,2340,2392,2405,2504,2526,2541,2578,2585,2590,2593,2612,2619,2719,2729,2732,3059,3062,3074,3083,3289,3306,3322,3327,3347,3356,3359,3371,3375,3396,3439,3460,3470,3474,3494,3514,3518,3530,3593,3607,3625,3689,3700,3704,3718,3775,3778,3924,3943,3955,3967,3981,4003,4007,4016,4273,4280,4305,4320,4324,4330,4371,4384,4472,4485,4489,4908,4912,4931,4959,4972],[262,263,264,267,268,271],"p",{},[265,266,186],"code",{}," turns a model into a Vue component you can read, diff and type-check, instead of a\n",[265,269,270],{},"\u003Cprimitive :object=\"scene\" />"," black box.",[273,274,279],"pre",{"className":275,"code":276,"language":277,"meta":278,"style":278},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","tres gltf public/models/robot.glb\n# ▲ ■ ● Tres  gltf  robot.glb\n#\n# ✔ Parse       12 named nodes · 3 meshes · 2 materials    34ms\n# ✔ Emit        3 slots                                     1ms\n#\n# ✔ src/models/Robot.gen.vue\n#   slots  Head, Body, Base\n#\n# Done in 41ms\n","bash","",[265,280,281,297,304,310,316,322,327,333,339,344],{"__ignoreMap":278},[282,283,286,290,294],"span",{"class":284,"line":285},"line",1,[282,287,289],{"class":288},"sBMFI","tres",[282,291,293],{"class":292},"sfazB"," gltf",[282,295,296],{"class":292}," public/models/robot.glb\n",[282,298,300],{"class":284,"line":299},2,[282,301,303],{"class":302},"sHwdD","# ▲ ■ ● Tres  gltf  robot.glb\n",[282,305,307],{"class":284,"line":306},3,[282,308,309],{"class":302},"#\n",[282,311,313],{"class":284,"line":312},4,[282,314,315],{"class":302},"# ✔ Parse       12 named nodes · 3 meshes · 2 materials    34ms\n",[282,317,319],{"class":284,"line":318},5,[282,320,321],{"class":302},"# ✔ Emit        3 slots                                     1ms\n",[282,323,325],{"class":284,"line":324},6,[282,326,309],{"class":302},[282,328,330],{"class":284,"line":329},7,[282,331,332],{"class":302},"# ✔ src/models/Robot.gen.vue\n",[282,334,336],{"class":284,"line":335},8,[282,337,338],{"class":302},"#   slots  Head, Body, Base\n",[282,340,342],{"class":284,"line":341},9,[282,343,309],{"class":302},[282,345,347],{"class":284,"line":346},10,[282,348,349],{"class":302},"# Done in 41ms\n",[262,351,352,353,356,357,360],{},"The slot list is capped at the first six names, since a level with sixty of them would bury the\npaths above it. ",[265,354,355],{},"--verbose"," prints them all, and the generated file carries the authoritative\nlist in its ",[265,358,359],{},"defineSlots\u003C{ … }>",".",[262,362,363],{},"Then use it like any other component:",[273,365,370],{"className":366,"code":367,"filename":368,"language":369,"meta":278,"style":278},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { OrbitControls } from '@tresjs/cientos'\nimport { TresCanvas } from '@tresjs/core'\nimport Robot from '@/models/Robot.gen.vue'\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CTresCanvas>\n    \u003CTresPerspectiveCamera :position=\"[3, 2, 5]\" />\n    \u003COrbitControls />\n    \u003CRobot />\n    \u003CTresAmbientLight :intensity=\"1\" />\n  \u003C/TresCanvas>\n\u003C/template>\n","App.vue","vue",[265,371,372,403,431,451,468,477,482,491,501,524,532,542,564,574],{"__ignoreMap":278},[282,373,374,378,382,386,389,392,395,398,400],{"class":284,"line":285},[282,375,377],{"class":376},"sMK4o","\u003C",[282,379,381],{"class":380},"swJcz","script",[282,383,385],{"class":384},"spNyl"," setup",[282,387,388],{"class":384}," lang",[282,390,391],{"class":376},"=",[282,393,394],{"class":376},"\"",[282,396,397],{"class":292},"ts",[282,399,394],{"class":376},[282,401,402],{"class":376},">\n",[282,404,405,409,412,416,419,422,425,428],{"class":284,"line":299},[282,406,408],{"class":407},"s7zQu","import",[282,410,411],{"class":376}," {",[282,413,415],{"class":414},"sTEyZ"," OrbitControls",[282,417,418],{"class":376}," }",[282,420,421],{"class":407}," from",[282,423,424],{"class":376}," '",[282,426,427],{"class":292},"@tresjs/cientos",[282,429,430],{"class":376},"'\n",[282,432,433,435,437,440,442,444,446,449],{"class":284,"line":306},[282,434,408],{"class":407},[282,436,411],{"class":376},[282,438,439],{"class":414}," TresCanvas",[282,441,418],{"class":376},[282,443,421],{"class":407},[282,445,424],{"class":376},[282,447,448],{"class":292},"@tresjs/core",[282,450,430],{"class":376},[282,452,453,455,458,461,463,466],{"class":284,"line":312},[282,454,408],{"class":407},[282,456,457],{"class":414}," Robot ",[282,459,460],{"class":407},"from",[282,462,424],{"class":376},[282,464,465],{"class":292},"@/models/Robot.gen.vue",[282,467,430],{"class":376},[282,469,470,473,475],{"class":284,"line":318},[282,471,472],{"class":376},"\u003C/",[282,474,381],{"class":380},[282,476,402],{"class":376},[282,478,479],{"class":284,"line":324},[282,480,481],{"emptyLinePlaceholder":39},"\n",[282,483,484,486,489],{"class":284,"line":329},[282,485,377],{"class":376},[282,487,488],{"class":380},"template",[282,490,402],{"class":376},[282,492,493,496,499],{"class":284,"line":335},[282,494,495],{"class":376},"  \u003C",[282,497,498],{"class":380},"TresCanvas",[282,500,402],{"class":376},[282,502,503,506,509,512,514,516,519,521],{"class":284,"line":341},[282,504,505],{"class":376},"    \u003C",[282,507,508],{"class":380},"TresPerspectiveCamera",[282,510,511],{"class":384}," :position",[282,513,391],{"class":376},[282,515,394],{"class":376},[282,517,518],{"class":292},"[3, 2, 5]",[282,520,394],{"class":376},[282,522,523],{"class":376}," />\n",[282,525,526,528,530],{"class":284,"line":346},[282,527,505],{"class":376},[282,529,199],{"class":380},[282,531,523],{"class":376},[282,533,535,537,540],{"class":284,"line":534},11,[282,536,505],{"class":376},[282,538,539],{"class":380},"Robot",[282,541,523],{"class":376},[282,543,545,547,550,553,555,557,560,562],{"class":284,"line":544},12,[282,546,505],{"class":376},[282,548,549],{"class":380},"TresAmbientLight",[282,551,552],{"class":384}," :intensity",[282,554,391],{"class":376},[282,556,394],{"class":376},[282,558,559],{"class":292},"1",[282,561,394],{"class":376},[282,563,523],{"class":376},[282,565,567,570,572],{"class":284,"line":566},13,[282,568,569],{"class":376},"  \u003C/",[282,571,498],{"class":380},[282,573,402],{"class":376},[282,575,577,579,581],{"class":284,"line":576},14,[282,578,472],{"class":376},[282,580,488],{"class":380},[282,582,402],{"class":376},[584,585,587],"h2",{"id":586},"what-gets-generated","What gets generated",[262,589,590,591,594],{},"Every node in the model becomes a real element, and every node the artist named becomes a\n",[265,592,593],{},"\u003Cslot>"," whose fallback is the generated markup:",[273,596,599],{"className":366,"code":597,"filename":598,"language":369,"meta":278,"style":278},"\u003Cscript setup lang=\"ts\">\n/*\nAuto-generated by @tresjs/cli. Do not edit.\nCommand: tres gltf public/models/Mug.glb --slots all\nOverride the named slots from the parent instead; regenerating keeps your overrides.\n*/\nimport type { Group, Mesh, MeshStandardMaterial } from 'three'\nimport { useGLTF } from '@tresjs/cientos'\nimport { ref, watch } from 'vue'\n\ninterface ModelNodes {\n  Scene: Group\n  Mug: Group\n  Mesh: Mesh\n  Mesh_1: Mesh\n}\n\ninterface ModelMaterials {\n  '4k-Metal-Worn': MeshStandardMaterial\n  'coat': MeshStandardMaterial\n}\n\nconst emit = defineEmits\u003C{\n  ready: [{ nodes: ModelNodes, materials: ModelMaterials }]\n}>()\n\ndefineSlots\u003C{\n  Mesh?: (props: { node: Mesh, material: MeshStandardMaterial }) => any\n  Mesh_1?: (props: { node: Mesh, material: MeshStandardMaterial }) => any\n  Mug?: (props: { node: Group }) => any\n}>()\n\nconst { state, nodes, materials, isLoading } = useGLTF\u003CModelNodes, ModelMaterials>('/models/Mug.glb', { draco: true })\n\nconst isReady = ref(false)\nwatch(\n  () => !isLoading.value\n    && state.value !== null,\n  (ready) => {\n    if (!ready) {\n      isReady.value = false\n      return\n    }\n    if (isReady.value) { return }\n    isReady.value = true\n    emit('ready', { nodes: nodes.value, materials: materials.value })\n  },\n  { flush: 'post', immediate: true },\n)\n\ndefineExpose({ nodes, materials, isReady })\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CTresGroup :dispose=\"null\">\n    \u003Ctemplate v-if=\"!isLoading\">\n      \u003Cslot name=\"Mug\" :node=\"nodes.Mug\">\n        \u003CTresGroup :position=\"[0, 1, 0]\">\n          \u003Cslot name=\"Mesh\" :node=\"nodes.Mesh\" :material=\"materials['4k-Metal-Worn']\">\n            \u003CTresMesh :geometry=\"nodes.Mesh.geometry\" :material=\"materials['4k-Metal-Worn']\" />\n          \u003C/slot>\n          \u003Cslot name=\"Mesh_1\" :node=\"nodes.Mesh_1\" :material=\"materials.coat\">\n            \u003CTresMesh :geometry=\"nodes.Mesh_1.geometry\" :material=\"materials.coat\" />\n          \u003C/slot>\n        \u003C/TresGroup>\n      \u003C/slot>\n    \u003C/template>\n  \u003C/TresGroup>\n\u003C/template>\n","src/models/Mug.gen.vue",[265,600,601,621,626,631,636,641,646,680,699,723,727,738,749,758,768,778,784,789,799,816,830,835,840,858,893,902,907,915,959,994,1021,1028,1033,1104,1109,1128,1137,1156,1175,1191,1210,1226,1232,1238,1262,1277,1321,1327,1357,1362,1367,1391,1400,1405,1414,1436,1458,1493,1514,1558,1591,1601,1643,1673,1682,1692,1702,1712,1721],{"__ignoreMap":278},[282,602,603,605,607,609,611,613,615,617,619],{"class":284,"line":285},[282,604,377],{"class":376},[282,606,381],{"class":380},[282,608,385],{"class":384},[282,610,388],{"class":384},[282,612,391],{"class":376},[282,614,394],{"class":376},[282,616,397],{"class":292},[282,618,394],{"class":376},[282,620,402],{"class":376},[282,622,623],{"class":284,"line":299},[282,624,625],{"class":302},"/*\n",[282,627,628],{"class":284,"line":306},[282,629,630],{"class":302},"Auto-generated by @tresjs/cli. Do not edit.\n",[282,632,633],{"class":284,"line":312},[282,634,635],{"class":302},"Command: tres gltf public/models/Mug.glb --slots all\n",[282,637,638],{"class":284,"line":318},[282,639,640],{"class":302},"Override the named slots from the parent instead; regenerating keeps your overrides.\n",[282,642,643],{"class":284,"line":324},[282,644,645],{"class":302},"*/\n",[282,647,648,650,653,655,658,661,664,666,669,671,673,675,678],{"class":284,"line":329},[282,649,408],{"class":407},[282,651,652],{"class":407}," type",[282,654,411],{"class":376},[282,656,657],{"class":414}," Group",[282,659,660],{"class":376},",",[282,662,663],{"class":414}," Mesh",[282,665,660],{"class":376},[282,667,668],{"class":414}," MeshStandardMaterial",[282,670,418],{"class":376},[282,672,421],{"class":407},[282,674,424],{"class":376},[282,676,677],{"class":292},"three",[282,679,430],{"class":376},[282,681,682,684,686,689,691,693,695,697],{"class":284,"line":335},[282,683,408],{"class":407},[282,685,411],{"class":376},[282,687,688],{"class":414}," useGLTF",[282,690,418],{"class":376},[282,692,421],{"class":407},[282,694,424],{"class":376},[282,696,427],{"class":292},[282,698,430],{"class":376},[282,700,701,703,705,708,710,713,715,717,719,721],{"class":284,"line":341},[282,702,408],{"class":407},[282,704,411],{"class":376},[282,706,707],{"class":414}," ref",[282,709,660],{"class":376},[282,711,712],{"class":414}," watch",[282,714,418],{"class":376},[282,716,421],{"class":407},[282,718,424],{"class":376},[282,720,369],{"class":292},[282,722,430],{"class":376},[282,724,725],{"class":284,"line":346},[282,726,481],{"emptyLinePlaceholder":39},[282,728,729,732,735],{"class":284,"line":534},[282,730,731],{"class":384},"interface",[282,733,734],{"class":288}," ModelNodes",[282,736,737],{"class":376}," {\n",[282,739,740,743,746],{"class":284,"line":544},[282,741,742],{"class":380},"  Scene",[282,744,745],{"class":376},":",[282,747,748],{"class":288}," Group\n",[282,750,751,754,756],{"class":284,"line":566},[282,752,753],{"class":380},"  Mug",[282,755,745],{"class":376},[282,757,748],{"class":288},[282,759,760,763,765],{"class":284,"line":576},[282,761,762],{"class":380},"  Mesh",[282,764,745],{"class":376},[282,766,767],{"class":288}," Mesh\n",[282,769,771,774,776],{"class":284,"line":770},15,[282,772,773],{"class":380},"  Mesh_1",[282,775,745],{"class":376},[282,777,767],{"class":288},[282,779,781],{"class":284,"line":780},16,[282,782,783],{"class":376},"}\n",[282,785,787],{"class":284,"line":786},17,[282,788,481],{"emptyLinePlaceholder":39},[282,790,792,794,797],{"class":284,"line":791},18,[282,793,731],{"class":384},[282,795,796],{"class":288}," ModelMaterials",[282,798,737],{"class":376},[282,800,802,805,808,811,813],{"class":284,"line":801},19,[282,803,804],{"class":376},"  '",[282,806,807],{"class":292},"4k-Metal-Worn",[282,809,810],{"class":376},"'",[282,812,745],{"class":376},[282,814,815],{"class":288}," MeshStandardMaterial\n",[282,817,819,821,824,826,828],{"class":284,"line":818},20,[282,820,804],{"class":376},[282,822,823],{"class":292},"coat",[282,825,810],{"class":376},[282,827,745],{"class":376},[282,829,815],{"class":288},[282,831,833],{"class":284,"line":832},21,[282,834,783],{"class":376},[282,836,838],{"class":284,"line":837},22,[282,839,481],{"emptyLinePlaceholder":39},[282,841,843,846,849,851,855],{"class":284,"line":842},23,[282,844,845],{"class":384},"const",[282,847,848],{"class":414}," emit ",[282,850,391],{"class":376},[282,852,854],{"class":853},"s2Zo4"," defineEmits",[282,856,857],{"class":376},"\u003C{\n",[282,859,861,864,866,869,872,875,877,879,881,884,886,888,890],{"class":284,"line":860},24,[282,862,863],{"class":380},"  ready",[282,865,745],{"class":376},[282,867,868],{"class":414}," [",[282,870,871],{"class":376},"{",[282,873,874],{"class":380}," nodes",[282,876,745],{"class":376},[282,878,734],{"class":288},[282,880,660],{"class":376},[282,882,883],{"class":380}," materials",[282,885,745],{"class":376},[282,887,796],{"class":288},[282,889,418],{"class":376},[282,891,892],{"class":414},"]\n",[282,894,896,899],{"class":284,"line":895},25,[282,897,898],{"class":376},"}>",[282,900,901],{"class":414},"()\n",[282,903,905],{"class":284,"line":904},26,[282,906,481],{"emptyLinePlaceholder":39},[282,908,910,913],{"class":284,"line":909},27,[282,911,912],{"class":853},"defineSlots",[282,914,857],{"class":376},[282,916,918,920,923,926,930,932,934,937,939,941,943,946,948,950,953,956],{"class":284,"line":917},28,[282,919,762],{"class":380},[282,921,922],{"class":376},"?:",[282,924,925],{"class":376}," (",[282,927,929],{"class":928},"sHdIc","props",[282,931,745],{"class":376},[282,933,411],{"class":376},[282,935,936],{"class":380}," node",[282,938,745],{"class":376},[282,940,663],{"class":288},[282,942,660],{"class":376},[282,944,945],{"class":380}," material",[282,947,745],{"class":376},[282,949,668],{"class":288},[282,951,952],{"class":376}," })",[282,954,955],{"class":384}," =>",[282,957,958],{"class":288}," any\n",[282,960,962,964,966,968,970,972,974,976,978,980,982,984,986,988,990,992],{"class":284,"line":961},29,[282,963,773],{"class":380},[282,965,922],{"class":376},[282,967,925],{"class":376},[282,969,929],{"class":928},[282,971,745],{"class":376},[282,973,411],{"class":376},[282,975,936],{"class":380},[282,977,745],{"class":376},[282,979,663],{"class":288},[282,981,660],{"class":376},[282,983,945],{"class":380},[282,985,745],{"class":376},[282,987,668],{"class":288},[282,989,952],{"class":376},[282,991,955],{"class":384},[282,993,958],{"class":288},[282,995,997,999,1001,1003,1005,1007,1009,1011,1013,1015,1017,1019],{"class":284,"line":996},30,[282,998,753],{"class":380},[282,1000,922],{"class":376},[282,1002,925],{"class":376},[282,1004,929],{"class":928},[282,1006,745],{"class":376},[282,1008,411],{"class":376},[282,1010,936],{"class":380},[282,1012,745],{"class":376},[282,1014,657],{"class":288},[282,1016,952],{"class":376},[282,1018,955],{"class":384},[282,1020,958],{"class":288},[282,1022,1024,1026],{"class":284,"line":1023},31,[282,1025,898],{"class":376},[282,1027,901],{"class":414},[282,1029,1031],{"class":284,"line":1030},32,[282,1032,481],{"emptyLinePlaceholder":39},[282,1034,1036,1038,1040,1043,1045,1047,1049,1051,1053,1056,1059,1062,1064,1066,1069,1071,1073,1076,1079,1081,1084,1086,1088,1090,1093,1095,1099,1101],{"class":284,"line":1035},33,[282,1037,845],{"class":384},[282,1039,411],{"class":376},[282,1041,1042],{"class":414}," state",[282,1044,660],{"class":376},[282,1046,874],{"class":414},[282,1048,660],{"class":376},[282,1050,883],{"class":414},[282,1052,660],{"class":376},[282,1054,1055],{"class":414}," isLoading ",[282,1057,1058],{"class":376},"}",[282,1060,1061],{"class":376}," =",[282,1063,688],{"class":853},[282,1065,377],{"class":376},[282,1067,1068],{"class":288},"ModelNodes",[282,1070,660],{"class":376},[282,1072,796],{"class":288},[282,1074,1075],{"class":376},">",[282,1077,1078],{"class":414},"(",[282,1080,810],{"class":376},[282,1082,1083],{"class":292},"/models/Mug.glb",[282,1085,810],{"class":376},[282,1087,660],{"class":376},[282,1089,411],{"class":376},[282,1091,1092],{"class":380}," draco",[282,1094,745],{"class":376},[282,1096,1098],{"class":1097},"sfNiH"," true",[282,1100,418],{"class":376},[282,1102,1103],{"class":414},")\n",[282,1105,1107],{"class":284,"line":1106},34,[282,1108,481],{"emptyLinePlaceholder":39},[282,1110,1112,1114,1117,1119,1121,1123,1126],{"class":284,"line":1111},35,[282,1113,845],{"class":384},[282,1115,1116],{"class":414}," isReady ",[282,1118,391],{"class":376},[282,1120,707],{"class":853},[282,1122,1078],{"class":414},[282,1124,1125],{"class":1097},"false",[282,1127,1103],{"class":414},[282,1129,1131,1134],{"class":284,"line":1130},36,[282,1132,1133],{"class":853},"watch",[282,1135,1136],{"class":414},"(\n",[282,1138,1140,1143,1145,1148,1151,1153],{"class":284,"line":1139},37,[282,1141,1142],{"class":376},"  ()",[282,1144,955],{"class":384},[282,1146,1147],{"class":376}," !",[282,1149,1150],{"class":414},"isLoading",[282,1152,360],{"class":376},[282,1154,1155],{"class":414},"value\n",[282,1157,1159,1162,1164,1166,1169,1172],{"class":284,"line":1158},38,[282,1160,1161],{"class":376},"    &&",[282,1163,1042],{"class":414},[282,1165,360],{"class":376},[282,1167,1168],{"class":414},"value ",[282,1170,1171],{"class":376},"!==",[282,1173,1174],{"class":376}," null,\n",[282,1176,1178,1181,1184,1187,1189],{"class":284,"line":1177},39,[282,1179,1180],{"class":376},"  (",[282,1182,1183],{"class":928},"ready",[282,1185,1186],{"class":376},")",[282,1188,955],{"class":384},[282,1190,737],{"class":376},[282,1192,1194,1197,1199,1202,1204,1207],{"class":284,"line":1193},40,[282,1195,1196],{"class":407},"    if",[282,1198,925],{"class":380},[282,1200,1201],{"class":376},"!",[282,1203,1183],{"class":414},[282,1205,1206],{"class":380},") ",[282,1208,1209],{"class":376},"{\n",[282,1211,1213,1216,1218,1221,1223],{"class":284,"line":1212},41,[282,1214,1215],{"class":414},"      isReady",[282,1217,360],{"class":376},[282,1219,1220],{"class":414},"value",[282,1222,1061],{"class":376},[282,1224,1225],{"class":1097}," false\n",[282,1227,1229],{"class":284,"line":1228},42,[282,1230,1231],{"class":407},"      return\n",[282,1233,1235],{"class":284,"line":1234},43,[282,1236,1237],{"class":376},"    }\n",[282,1239,1241,1243,1245,1248,1250,1252,1254,1256,1259],{"class":284,"line":1240},44,[282,1242,1196],{"class":407},[282,1244,925],{"class":380},[282,1246,1247],{"class":414},"isReady",[282,1249,360],{"class":376},[282,1251,1220],{"class":414},[282,1253,1206],{"class":380},[282,1255,871],{"class":376},[282,1257,1258],{"class":407}," return",[282,1260,1261],{"class":376}," }\n",[282,1263,1265,1268,1270,1272,1274],{"class":284,"line":1264},45,[282,1266,1267],{"class":414},"    isReady",[282,1269,360],{"class":376},[282,1271,1220],{"class":414},[282,1273,1061],{"class":376},[282,1275,1276],{"class":1097}," true\n",[282,1278,1280,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317,1319],{"class":284,"line":1279},46,[282,1281,1282],{"class":853},"    emit",[282,1284,1078],{"class":380},[282,1286,810],{"class":376},[282,1288,1183],{"class":292},[282,1290,810],{"class":376},[282,1292,660],{"class":376},[282,1294,411],{"class":376},[282,1296,874],{"class":380},[282,1298,745],{"class":376},[282,1300,874],{"class":414},[282,1302,360],{"class":376},[282,1304,1220],{"class":414},[282,1306,660],{"class":376},[282,1308,883],{"class":380},[282,1310,745],{"class":376},[282,1312,883],{"class":414},[282,1314,360],{"class":376},[282,1316,1220],{"class":414},[282,1318,418],{"class":376},[282,1320,1103],{"class":380},[282,1322,1324],{"class":284,"line":1323},47,[282,1325,1326],{"class":376},"  },\n",[282,1328,1330,1333,1336,1338,1340,1343,1345,1347,1350,1352,1354],{"class":284,"line":1329},48,[282,1331,1332],{"class":376},"  {",[282,1334,1335],{"class":380}," flush",[282,1337,745],{"class":376},[282,1339,424],{"class":376},[282,1341,1342],{"class":292},"post",[282,1344,810],{"class":376},[282,1346,660],{"class":376},[282,1348,1349],{"class":380}," immediate",[282,1351,745],{"class":376},[282,1353,1098],{"class":1097},[282,1355,1356],{"class":376}," },\n",[282,1358,1360],{"class":284,"line":1359},49,[282,1361,1103],{"class":414},[282,1363,1365],{"class":284,"line":1364},50,[282,1366,481],{"emptyLinePlaceholder":39},[282,1368,1370,1373,1375,1377,1379,1381,1383,1385,1387,1389],{"class":284,"line":1369},51,[282,1371,1372],{"class":853},"defineExpose",[282,1374,1078],{"class":414},[282,1376,871],{"class":376},[282,1378,874],{"class":414},[282,1380,660],{"class":376},[282,1382,883],{"class":414},[282,1384,660],{"class":376},[282,1386,1116],{"class":414},[282,1388,1058],{"class":376},[282,1390,1103],{"class":414},[282,1392,1394,1396,1398],{"class":284,"line":1393},52,[282,1395,472],{"class":376},[282,1397,381],{"class":380},[282,1399,402],{"class":376},[282,1401,1403],{"class":284,"line":1402},53,[282,1404,481],{"emptyLinePlaceholder":39},[282,1406,1408,1410,1412],{"class":284,"line":1407},54,[282,1409,377],{"class":376},[282,1411,488],{"class":380},[282,1413,402],{"class":376},[282,1415,1417,1419,1422,1425,1427,1429,1432,1434],{"class":284,"line":1416},55,[282,1418,495],{"class":376},[282,1420,1421],{"class":380},"TresGroup",[282,1423,1424],{"class":384}," :dispose",[282,1426,391],{"class":376},[282,1428,394],{"class":376},[282,1430,1431],{"class":292},"null",[282,1433,394],{"class":376},[282,1435,402],{"class":376},[282,1437,1439,1441,1443,1446,1448,1450,1452,1454,1456],{"class":284,"line":1438},56,[282,1440,505],{"class":376},[282,1442,488],{"class":380},[282,1444,1445],{"class":407}," v-if",[282,1447,391],{"class":376},[282,1449,394],{"class":376},[282,1451,1201],{"class":376},[282,1453,1150],{"class":414},[282,1455,394],{"class":376},[282,1457,402],{"class":376},[282,1459,1461,1464,1467,1470,1472,1474,1477,1479,1482,1484,1486,1489,1491],{"class":284,"line":1460},57,[282,1462,1463],{"class":376},"      \u003C",[282,1465,1466],{"class":380},"slot",[282,1468,1469],{"class":384}," name",[282,1471,391],{"class":376},[282,1473,394],{"class":376},[282,1475,1476],{"class":292},"Mug",[282,1478,394],{"class":376},[282,1480,1481],{"class":384}," :node",[282,1483,391],{"class":376},[282,1485,394],{"class":376},[282,1487,1488],{"class":292},"nodes.Mug",[282,1490,394],{"class":376},[282,1492,402],{"class":376},[282,1494,1496,1499,1501,1503,1505,1507,1510,1512],{"class":284,"line":1495},58,[282,1497,1498],{"class":376},"        \u003C",[282,1500,1421],{"class":380},[282,1502,511],{"class":384},[282,1504,391],{"class":376},[282,1506,394],{"class":376},[282,1508,1509],{"class":292},"[0, 1, 0]",[282,1511,394],{"class":376},[282,1513,402],{"class":376},[282,1515,1517,1520,1522,1524,1526,1528,1531,1533,1535,1537,1539,1542,1544,1547,1549,1551,1554,1556],{"class":284,"line":1516},59,[282,1518,1519],{"class":376},"          \u003C",[282,1521,1466],{"class":380},[282,1523,1469],{"class":384},[282,1525,391],{"class":376},[282,1527,394],{"class":376},[282,1529,1530],{"class":292},"Mesh",[282,1532,394],{"class":376},[282,1534,1481],{"class":384},[282,1536,391],{"class":376},[282,1538,394],{"class":376},[282,1540,1541],{"class":292},"nodes.Mesh",[282,1543,394],{"class":376},[282,1545,1546],{"class":384}," :material",[282,1548,391],{"class":376},[282,1550,394],{"class":376},[282,1552,1553],{"class":292},"materials['4k-Metal-Worn']",[282,1555,394],{"class":376},[282,1557,402],{"class":376},[282,1559,1561,1564,1567,1570,1572,1574,1577,1579,1581,1583,1585,1587,1589],{"class":284,"line":1560},60,[282,1562,1563],{"class":376},"            \u003C",[282,1565,1566],{"class":380},"TresMesh",[282,1568,1569],{"class":384}," :geometry",[282,1571,391],{"class":376},[282,1573,394],{"class":376},[282,1575,1576],{"class":292},"nodes.Mesh.geometry",[282,1578,394],{"class":376},[282,1580,1546],{"class":384},[282,1582,391],{"class":376},[282,1584,394],{"class":376},[282,1586,1553],{"class":292},[282,1588,394],{"class":376},[282,1590,523],{"class":376},[282,1592,1594,1597,1599],{"class":284,"line":1593},61,[282,1595,1596],{"class":376},"          \u003C/",[282,1598,1466],{"class":380},[282,1600,402],{"class":376},[282,1602,1604,1606,1608,1610,1612,1614,1617,1619,1621,1623,1625,1628,1630,1632,1634,1636,1639,1641],{"class":284,"line":1603},62,[282,1605,1519],{"class":376},[282,1607,1466],{"class":380},[282,1609,1469],{"class":384},[282,1611,391],{"class":376},[282,1613,394],{"class":376},[282,1615,1616],{"class":292},"Mesh_1",[282,1618,394],{"class":376},[282,1620,1481],{"class":384},[282,1622,391],{"class":376},[282,1624,394],{"class":376},[282,1626,1627],{"class":292},"nodes.Mesh_1",[282,1629,394],{"class":376},[282,1631,1546],{"class":384},[282,1633,391],{"class":376},[282,1635,394],{"class":376},[282,1637,1638],{"class":292},"materials.coat",[282,1640,394],{"class":376},[282,1642,402],{"class":376},[282,1644,1646,1648,1650,1652,1654,1656,1659,1661,1663,1665,1667,1669,1671],{"class":284,"line":1645},63,[282,1647,1563],{"class":376},[282,1649,1566],{"class":380},[282,1651,1569],{"class":384},[282,1653,391],{"class":376},[282,1655,394],{"class":376},[282,1657,1658],{"class":292},"nodes.Mesh_1.geometry",[282,1660,394],{"class":376},[282,1662,1546],{"class":384},[282,1664,391],{"class":376},[282,1666,394],{"class":376},[282,1668,1638],{"class":292},[282,1670,394],{"class":376},[282,1672,523],{"class":376},[282,1674,1676,1678,1680],{"class":284,"line":1675},64,[282,1677,1596],{"class":376},[282,1679,1466],{"class":380},[282,1681,402],{"class":376},[282,1683,1685,1688,1690],{"class":284,"line":1684},65,[282,1686,1687],{"class":376},"        \u003C/",[282,1689,1421],{"class":380},[282,1691,402],{"class":376},[282,1693,1695,1698,1700],{"class":284,"line":1694},66,[282,1696,1697],{"class":376},"      \u003C/",[282,1699,1466],{"class":380},[282,1701,402],{"class":376},[282,1703,1705,1708,1710],{"class":284,"line":1704},67,[282,1706,1707],{"class":376},"    \u003C/",[282,1709,488],{"class":380},[282,1711,402],{"class":376},[282,1713,1715,1717,1719],{"class":284,"line":1714},68,[282,1716,569],{"class":376},[282,1718,1421],{"class":380},[282,1720,402],{"class":376},[282,1722,1724,1726,1728],{"class":284,"line":1723},69,[282,1725,472],{"class":376},[282,1727,488],{"class":380},[282,1729,402],{"class":376},[262,1731,1732],{},"A few things are worth pointing out:",[1734,1735,1736],"prose-list",{},[1737,1738,1739,1767,1777,1791,1804,1839],"ul",{},[1740,1741,1742,1751,1752,1756,1757,1759,1760,1763,1764,360],"li",{},[1743,1744,1745,1747,1748],"strong",{},[265,1746,1068],{}," and ",[265,1749,1750],{},"ModelMaterials"," describe ",[1753,1754,1755],"em",{},"this"," export, so ",[265,1758,1488],{}," is a ",[265,1761,1762],{},"Group"," and not an ",[265,1765,1766],{},"any",[1740,1768,1769,1772,1773,1776],{},[1743,1770,1771],{},"Draco is detected",", and ",[265,1774,1775],{},"{ draco: true }"," is passed automatically. A Draco model renders nothing without it.",[1740,1778,1779,1782,1783,1786,1787,1790],{},[1743,1780,1781],{},"Lights, cameras and bones"," are emitted as ",[265,1784,1785],{},"\u003Cprimitive :object=\"...\" />",": their props live on the parsed object, and a bone must ",[1753,1788,1789],{},"be"," the parsed object for skinning to work.",[1740,1792,1793,1799,1800,1803],{},[1743,1794,1795,1796,1798],{},"The root ",[265,1797,1421],{}," stays mounted"," and gates its children with ",[265,1801,1802],{},"v-if=\"!isLoading\"",", so refs on it are stable.",[1740,1805,1806,1812,1813,1772,1816,1818,1819,1821,1822,1825,1826,1829,1830,1832,1833,1835,1836,1838],{},[1743,1807,1808,1811],{},[265,1809,1810],{},"@ready"," fires once per load",", carrying ",[265,1814,1815],{},"{ nodes, materials }",[265,1817,1247],{}," exposes the same state as a value. An event that already fired cannot be read after the fact, which is what ",[265,1820,1247],{}," is for: a parent that binds late, or a state machine that wants to ask later. Refetching the model (",[265,1823,1824],{},"useGLTF"," exposes ",[265,1827,1828],{},"execute()",") puts ",[265,1831,1247],{}," back to ",[265,1834,1125],{}," and arms ",[265,1837,1183],{}," again.",[1740,1840,1841,1850,1851,1853,1854,1857,1858,1860,1861,1747,1864,360],{},[1743,1842,1843,1844,1847,1848,360],{},"Readiness reads ",[265,1845,1846],{},"state",", not just ",[265,1849,1150],{}," ",[265,1852,1150],{}," is cleared in a ",[265,1855,1856],{},"finally",", so a 404 clears it exactly like a success would; ",[265,1859,1846],{}," is only set when the load produced a scene. Without that term a failed load would call the model ready with empty ",[265,1862,1863],{},"nodes",[265,1865,1866],{},"materials",[584,1868,1870],{"id":1869},"overriding-a-node","Overriding a node",[262,1872,1873],{},"The generated file is disposable. Anything you want to change lives in the parent, as a slot\noverride:",[273,1875,1877],{"className":366,"code":1876,"filename":368,"language":369,"meta":278,"style":278},"\u003Cscript setup lang=\"ts\">\nimport Robot from '@/models/Robot.gen.vue'\nimport { hologram } from './materials'\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CRobot>\n    \u003Ctemplate #Head=\"{ node }\">\n      \u003CTresMesh :geometry=\"node.geometry\" :material=\"hologram\" @click=\"explode\" />\n    \u003C/template>\n  \u003C/Robot>\n\u003C/template>\n",[265,1878,1879,1899,1913,1933,1941,1945,1953,1961,1988,2030,2038,2046],{"__ignoreMap":278},[282,1880,1881,1883,1885,1887,1889,1891,1893,1895,1897],{"class":284,"line":285},[282,1882,377],{"class":376},[282,1884,381],{"class":380},[282,1886,385],{"class":384},[282,1888,388],{"class":384},[282,1890,391],{"class":376},[282,1892,394],{"class":376},[282,1894,397],{"class":292},[282,1896,394],{"class":376},[282,1898,402],{"class":376},[282,1900,1901,1903,1905,1907,1909,1911],{"class":284,"line":299},[282,1902,408],{"class":407},[282,1904,457],{"class":414},[282,1906,460],{"class":407},[282,1908,424],{"class":376},[282,1910,465],{"class":292},[282,1912,430],{"class":376},[282,1914,1915,1917,1919,1922,1924,1926,1928,1931],{"class":284,"line":306},[282,1916,408],{"class":407},[282,1918,411],{"class":376},[282,1920,1921],{"class":414}," hologram",[282,1923,418],{"class":376},[282,1925,421],{"class":407},[282,1927,424],{"class":376},[282,1929,1930],{"class":292},"./materials",[282,1932,430],{"class":376},[282,1934,1935,1937,1939],{"class":284,"line":312},[282,1936,472],{"class":376},[282,1938,381],{"class":380},[282,1940,402],{"class":376},[282,1942,1943],{"class":284,"line":318},[282,1944,481],{"emptyLinePlaceholder":39},[282,1946,1947,1949,1951],{"class":284,"line":324},[282,1948,377],{"class":376},[282,1950,488],{"class":380},[282,1952,402],{"class":376},[282,1954,1955,1957,1959],{"class":284,"line":329},[282,1956,495],{"class":376},[282,1958,539],{"class":380},[282,1960,402],{"class":376},[282,1962,1963,1965,1967,1970,1973,1975,1977,1979,1982,1984,1986],{"class":284,"line":335},[282,1964,505],{"class":376},[282,1966,488],{"class":380},[282,1968,1969],{"class":376}," #",[282,1971,1972],{"class":384},"Head",[282,1974,391],{"class":376},[282,1976,394],{"class":376},[282,1978,871],{"class":376},[282,1980,1981],{"class":414}," node ",[282,1983,1058],{"class":376},[282,1985,394],{"class":376},[282,1987,402],{"class":376},[282,1989,1990,1992,1994,1996,1998,2000,2003,2005,2007,2009,2011,2014,2016,2019,2021,2023,2026,2028],{"class":284,"line":341},[282,1991,1463],{"class":376},[282,1993,1566],{"class":380},[282,1995,1569],{"class":384},[282,1997,391],{"class":376},[282,1999,394],{"class":376},[282,2001,2002],{"class":292},"node.geometry",[282,2004,394],{"class":376},[282,2006,1546],{"class":384},[282,2008,391],{"class":376},[282,2010,394],{"class":376},[282,2012,2013],{"class":292},"hologram",[282,2015,394],{"class":376},[282,2017,2018],{"class":384}," @click",[282,2020,391],{"class":376},[282,2022,394],{"class":376},[282,2024,2025],{"class":292},"explode",[282,2027,394],{"class":376},[282,2029,523],{"class":376},[282,2031,2032,2034,2036],{"class":284,"line":346},[282,2033,1707],{"class":376},[282,2035,488],{"class":380},[282,2037,402],{"class":376},[282,2039,2040,2042,2044],{"class":284,"line":534},[282,2041,569],{"class":376},[282,2043,539],{"class":380},[282,2045,402],{"class":376},[282,2047,2048,2050,2052],{"class":284,"line":544},[282,2049,472],{"class":376},[282,2051,488],{"class":380},[282,2053,402],{"class":376},[262,2055,2056,2057,2059,2060,1850,2063,2065],{},"Re-run ",[265,2058,186],{}," after the artist re-exports and the override survives, because it never lived\nin the generated file. If the artist ",[1753,2061,2062],{},"renames",[265,2064,1972],{},", the override becomes a type error instead\nof silently disappearing at runtime.",[2067,2068,2069],"prose-note",{},[262,2070,2071,2074,2075,2078,2079,2082,2083,2086,2087,2090,2091,360],{},[265,2072,2073],{},"--slots named"," (the default) skips exporter noise like ",[265,2076,2077],{},"Object_12",", ",[265,2080,2081],{},"Sketchfab_model"," or\n",[265,2084,2085],{},"Armature",", since overriding those means nothing. On marketplace assets where ",[1743,2088,2089],{},"every"," mesh is\nexporter-named, the CLI says so and points you at ",[265,2092,2093],{},"--slots all",[584,2095,2097],{"id":2096},"nodes-and-materials-from-the-parent","Nodes and materials from the parent",[262,2099,2100,2101,1747,2103,2105],{},"The component exposes ",[265,2102,1863],{},[265,2104,1866],{},", so a parent can reach into the model without\nre-loading it:",[273,2107,2109],{"className":366,"code":2108,"language":369,"meta":278,"style":278},"\u003Cscript setup lang=\"ts\">\nimport { ref } from 'vue'\nimport Robot from '@/models/Robot.gen.vue'\n\nconst robot = ref\u003CInstanceType\u003Ctypeof Robot>>()\n\nfunction paintItRed() {\n  robot.value?.materials.Body.color.set('#ff0055')\n}\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CRobot ref=\"robot\" />\n\u003C/template>\n",[265,2110,2111,2131,2149,2163,2167,2194,2198,2211,2251,2255,2263,2267,2275,2294],{"__ignoreMap":278},[282,2112,2113,2115,2117,2119,2121,2123,2125,2127,2129],{"class":284,"line":285},[282,2114,377],{"class":376},[282,2116,381],{"class":380},[282,2118,385],{"class":384},[282,2120,388],{"class":384},[282,2122,391],{"class":376},[282,2124,394],{"class":376},[282,2126,397],{"class":292},[282,2128,394],{"class":376},[282,2130,402],{"class":376},[282,2132,2133,2135,2137,2139,2141,2143,2145,2147],{"class":284,"line":299},[282,2134,408],{"class":407},[282,2136,411],{"class":376},[282,2138,707],{"class":414},[282,2140,418],{"class":376},[282,2142,421],{"class":407},[282,2144,424],{"class":376},[282,2146,369],{"class":292},[282,2148,430],{"class":376},[282,2150,2151,2153,2155,2157,2159,2161],{"class":284,"line":306},[282,2152,408],{"class":407},[282,2154,457],{"class":414},[282,2156,460],{"class":407},[282,2158,424],{"class":376},[282,2160,465],{"class":292},[282,2162,430],{"class":376},[282,2164,2165],{"class":284,"line":312},[282,2166,481],{"emptyLinePlaceholder":39},[282,2168,2169,2171,2174,2176,2178,2180,2183,2186,2189,2192],{"class":284,"line":318},[282,2170,845],{"class":384},[282,2172,2173],{"class":414}," robot ",[282,2175,391],{"class":376},[282,2177,707],{"class":853},[282,2179,377],{"class":376},[282,2181,2182],{"class":288},"InstanceType",[282,2184,2185],{"class":376},"\u003Ctypeof",[282,2187,2188],{"class":414}," Robot",[282,2190,2191],{"class":376},">>",[282,2193,901],{"class":414},[282,2195,2196],{"class":284,"line":324},[282,2197,481],{"emptyLinePlaceholder":39},[282,2199,2200,2203,2206,2209],{"class":284,"line":329},[282,2201,2202],{"class":384},"function",[282,2204,2205],{"class":853}," paintItRed",[282,2207,2208],{"class":376},"()",[282,2210,737],{"class":376},[282,2212,2213,2216,2218,2220,2223,2225,2227,2230,2232,2235,2237,2240,2242,2244,2247,2249],{"class":284,"line":335},[282,2214,2215],{"class":414},"  robot",[282,2217,360],{"class":376},[282,2219,1220],{"class":414},[282,2221,2222],{"class":376},"?.",[282,2224,1866],{"class":414},[282,2226,360],{"class":376},[282,2228,2229],{"class":414},"Body",[282,2231,360],{"class":376},[282,2233,2234],{"class":414},"color",[282,2236,360],{"class":376},[282,2238,2239],{"class":853},"set",[282,2241,1078],{"class":380},[282,2243,810],{"class":376},[282,2245,2246],{"class":292},"#ff0055",[282,2248,810],{"class":376},[282,2250,1103],{"class":380},[282,2252,2253],{"class":284,"line":341},[282,2254,783],{"class":376},[282,2256,2257,2259,2261],{"class":284,"line":346},[282,2258,472],{"class":376},[282,2260,381],{"class":380},[282,2262,402],{"class":376},[282,2264,2265],{"class":284,"line":534},[282,2266,481],{"emptyLinePlaceholder":39},[282,2268,2269,2271,2273],{"class":284,"line":544},[282,2270,377],{"class":376},[282,2272,488],{"class":380},[282,2274,402],{"class":376},[282,2276,2277,2279,2281,2283,2285,2287,2290,2292],{"class":284,"line":566},[282,2278,495],{"class":376},[282,2280,539],{"class":380},[282,2282,707],{"class":384},[282,2284,391],{"class":376},[282,2286,394],{"class":376},[282,2288,2289],{"class":292},"robot",[282,2291,394],{"class":376},[282,2293,523],{"class":376},[282,2295,2296,2298,2300],{"class":284,"line":576},[282,2297,472],{"class":376},[282,2299,488],{"class":380},[282,2301,402],{"class":376},[2067,2303,2304],{},[262,2305,2306,2307,2310,2311,1747,2313,2315],{},"If you only need them the moment the model is ready, ",[265,2308,2309],{},"@ready=\"({ nodes, materials }) => …\""," hands\nyou the same pair without a ref. The exposed ",[265,2312,1863],{},[265,2314,1866],{}," are for reaching in at any\npoint after.",[584,2317,2319],{"id":2318},"animated-models","Animated models",[262,2321,2322,2323,2332,2333,2336,2337,2339],{},"When the model ships animation clips, the generated component also wires up\n",[2324,2325,2329],"a",{"href":2326,"rel":2327},"https://cientos.tresjs.org/api/miscellaneous/use-animations",[2328],"nofollow",[265,2330,2331],{},"useAnimations"," and hands the\nbound ",[265,2334,2335],{},"actions"," to ",[265,2338,1810],{},", keyed by a union of the clip names:",[273,2341,2344],{"className":2342,"code":2343,"language":397,"meta":278,"style":278},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","type ActionName\n  = | 'Idle'\n    | 'Walk'\n    | 'Death_A'\n",[265,2345,2346,2354,2369,2381],{"__ignoreMap":278},[282,2347,2348,2351],{"class":284,"line":285},[282,2349,2350],{"class":384},"type",[282,2352,2353],{"class":288}," ActionName\n",[282,2355,2356,2359,2362,2364,2367],{"class":284,"line":299},[282,2357,2358],{"class":376},"  =",[282,2360,2361],{"class":376}," |",[282,2363,424],{"class":376},[282,2365,2366],{"class":292},"Idle",[282,2368,430],{"class":376},[282,2370,2371,2374,2376,2379],{"class":284,"line":306},[282,2372,2373],{"class":376},"    |",[282,2375,424],{"class":376},[282,2377,2378],{"class":292},"Walk",[282,2380,430],{"class":376},[282,2382,2383,2385,2387,2390],{"class":284,"line":312},[282,2384,2373],{"class":376},[282,2386,424],{"class":376},[282,2388,2389],{"class":292},"Death_A",[282,2391,430],{"class":376},[262,2393,2394,2396,2397,2400,2401,2404],{},[265,2395,1810],{}," fires once per load, after the clips have loaded and the mixer has bound its actions, with\n",[265,2398,2399],{},"{ nodes, materials, actions }",". No template ref, and ",[265,2402,2403],{},"actions.Idle"," is there to play:",[273,2406,2408],{"className":366,"code":2407,"filename":368,"language":369,"meta":278,"style":278},"\u003Cscript setup lang=\"ts\">\nimport Knight from '@/models/Knight.gen.vue'\n\n// actions.Idle, not actions['Idle'], and a typo is a compile error\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CKnight @ready=\"({ actions }) => actions.Idle?.play()\" />\n\u003C/template>\n",[265,2409,2410,2430,2446,2450,2455,2463,2467,2475,2496],{"__ignoreMap":278},[282,2411,2412,2414,2416,2418,2420,2422,2424,2426,2428],{"class":284,"line":285},[282,2413,377],{"class":376},[282,2415,381],{"class":380},[282,2417,385],{"class":384},[282,2419,388],{"class":384},[282,2421,391],{"class":376},[282,2423,394],{"class":376},[282,2425,397],{"class":292},[282,2427,394],{"class":376},[282,2429,402],{"class":376},[282,2431,2432,2434,2437,2439,2441,2444],{"class":284,"line":299},[282,2433,408],{"class":407},[282,2435,2436],{"class":414}," Knight ",[282,2438,460],{"class":407},[282,2440,424],{"class":376},[282,2442,2443],{"class":292},"@/models/Knight.gen.vue",[282,2445,430],{"class":376},[282,2447,2448],{"class":284,"line":306},[282,2449,481],{"emptyLinePlaceholder":39},[282,2451,2452],{"class":284,"line":312},[282,2453,2454],{"class":302},"// actions.Idle, not actions['Idle'], and a typo is a compile error\n",[282,2456,2457,2459,2461],{"class":284,"line":318},[282,2458,472],{"class":376},[282,2460,381],{"class":380},[282,2462,402],{"class":376},[282,2464,2465],{"class":284,"line":324},[282,2466,481],{"emptyLinePlaceholder":39},[282,2468,2469,2471,2473],{"class":284,"line":329},[282,2470,377],{"class":376},[282,2472,488],{"class":380},[282,2474,402],{"class":376},[282,2476,2477,2479,2482,2485,2487,2489,2492,2494],{"class":284,"line":335},[282,2478,495],{"class":376},[282,2480,2481],{"class":380},"Knight",[282,2483,2484],{"class":384}," @ready",[282,2486,391],{"class":376},[282,2488,394],{"class":376},[282,2490,2491],{"class":292},"({ actions }) => actions.Idle?.play()",[282,2493,394],{"class":376},[282,2495,523],{"class":376},[282,2497,2498,2500,2502],{"class":284,"line":341},[282,2499,472],{"class":376},[282,2501,488],{"class":380},[282,2503,402],{"class":376},[262,2505,2506,2507,2509,2510,2513,2514,2516,2517,2519,2520,2522,2523,2525],{},"Prefer the event over reaching through a ref. The mixer binds its actions a flush after the clips\nland (",[265,2508,2331],{}," runs ",[265,2511,2512],{},"flush: 'post'"," for exactly this), so a handler that reads ",[265,2515,2335],{},"\ntoo early sees them undefined. ",[265,2518,1810],{}," waits for the binding; ",[265,2521,1247],{}," exposes the same state\nas a value, ",[265,2524,1125],{}," until it holds and reset on any refetch, for a parent that binds late or asks\nagain later.",[262,2527,2528,2529,2532,2533,2536,2537,2540],{},"A mixer resolves every track against a node ",[1743,2530,2531],{},"name",", so the CLI keeps the name of every node a\nclip drives, whatever ",[265,2534,2535],{},"--slots"," or ",[265,2538,2539],{},"--keepnames"," say. A group that exists only to be animated\nsurvives pruning for the same reason:",[273,2542,2544],{"className":366,"code":2543,"language":369,"meta":278,"style":278},"\u003CTresGroup name=\"Rotor\">\n  \u003CTresMesh name=\"Blade\" :geometry=\"nodes.Blade.geometry\" :material=\"materials.Metal\" />\n\u003C/TresGroup>\n",[265,2545,2546,2565,2570],{"__ignoreMap":278},[282,2547,2548,2550,2552,2554,2556,2558,2561,2563],{"class":284,"line":285},[282,2549,377],{"class":376},[282,2551,1421],{"class":380},[282,2553,1469],{"class":384},[282,2555,391],{"class":376},[282,2557,394],{"class":376},[282,2559,2560],{"class":292},"Rotor",[282,2562,394],{"class":376},[282,2564,402],{"class":376},[282,2566,2567],{"class":284,"line":299},[282,2568,2569],{"class":414},"  \u003CTresMesh name=\"Blade\" :geometry=\"nodes.Blade.geometry\" :material=\"materials.Metal\" />\n",[282,2571,2572,2574,2576],{"class":284,"line":306},[282,2573,472],{"class":376},[282,2575,1421],{"class":380},[282,2577,402],{"class":376},[262,2579,2580,2581,360],{},"Nodes no clip mentions are unaffected, so this costs nothing on a model with no animation on it.\nBatched nodes keep their names too: see ",[2324,2582,2584],{"href":2583},"#instancing-repeated-meshes","instancing",[2586,2587,2589],"h3",{"id":2588},"clips-from-separate-files","Clips from separate files",[262,2591,2592],{},"Mixamo, KayKit and Quaternius all ship the mesh in one file and the clips in others, so a\nmesh-only export has nothing to wire. Generating one says so:",[273,2594,2596],{"className":275,"code":2595,"language":277,"meta":278,"style":278},"tres gltf public/models/Dummy.glb\n# ⚠ This model is skinned but carries no animation clips. Pass --animations \u003Cpath> to wire in clips exported to separate files.\n",[265,2597,2598,2607],{"__ignoreMap":278},[282,2599,2600,2602,2604],{"class":284,"line":285},[282,2601,289],{"class":288},[282,2603,293],{"class":292},[282,2605,2606],{"class":292}," public/models/Dummy.glb\n",[282,2608,2609],{"class":284,"line":299},[282,2610,2611],{"class":302},"# ⚠ This model is skinned but carries no animation clips. Pass --animations \u003Cpath> to wire in clips exported to separate files.\n",[262,2613,2614,2615,2618],{},"Point ",[265,2616,2617],{},"--animations"," at the clip files, once per file. A KayKit character, whose 39 clips ship\nas three libraries beside the rig:",[273,2620,2622],{"className":275,"code":2621,"language":277,"meta":278,"style":278},"tres gltf public/models/Dummy.glb \\\n  --animations public/models/animations/Rig_Medium_General.glb \\\n  --animations public/models/animations/Rig_Medium_MovementBasic.glb \\\n  --animations public/models/animations/Rig_Medium_MovementAdvanced.glb\n# ▲ ■ ● Tres  gltf  Dummy.glb\n#\n# ✔ Parse       51 named nodes · 8 meshes · 1 material · 37 clips merged   37ms\n# ✔ Emit        6 slots                                                     1ms\n#\n# ✔ src/models/Dummy.gen.vue\n#   slots  Dummy_ArmLeft, Dummy_ArmRight, Dummy_Body, Dummy_Head,\n#          Dummy_LegLeft, Dummy_LegRight\n#   clips  Death_A, Death_A_Pose, Death_B, Death_B_Pose, Hit_A, Hit_B,\n#          … 31 more — rerun with --verbose\n#\n# Done in 87ms\n",[265,2623,2624,2636,2646,2655,2662,2667,2671,2676,2681,2685,2690,2695,2700,2705,2710,2714],{"__ignoreMap":278},[282,2625,2626,2628,2630,2633],{"class":284,"line":285},[282,2627,289],{"class":288},[282,2629,293],{"class":292},[282,2631,2632],{"class":292}," public/models/Dummy.glb",[282,2634,2635],{"class":414}," \\\n",[282,2637,2638,2641,2644],{"class":284,"line":299},[282,2639,2640],{"class":292},"  --animations",[282,2642,2643],{"class":292}," public/models/animations/Rig_Medium_General.glb",[282,2645,2635],{"class":414},[282,2647,2648,2650,2653],{"class":284,"line":306},[282,2649,2640],{"class":292},[282,2651,2652],{"class":292}," public/models/animations/Rig_Medium_MovementBasic.glb",[282,2654,2635],{"class":414},[282,2656,2657,2659],{"class":284,"line":312},[282,2658,2640],{"class":292},[282,2660,2661],{"class":292}," public/models/animations/Rig_Medium_MovementAdvanced.glb\n",[282,2663,2664],{"class":284,"line":318},[282,2665,2666],{"class":302},"# ▲ ■ ● Tres  gltf  Dummy.glb\n",[282,2668,2669],{"class":284,"line":324},[282,2670,309],{"class":302},[282,2672,2673],{"class":284,"line":329},[282,2674,2675],{"class":302},"# ✔ Parse       51 named nodes · 8 meshes · 1 material · 37 clips merged   37ms\n",[282,2677,2678],{"class":284,"line":335},[282,2679,2680],{"class":302},"# ✔ Emit        6 slots                                                     1ms\n",[282,2682,2683],{"class":284,"line":341},[282,2684,309],{"class":302},[282,2686,2687],{"class":284,"line":346},[282,2688,2689],{"class":302},"# ✔ src/models/Dummy.gen.vue\n",[282,2691,2692],{"class":284,"line":534},[282,2693,2694],{"class":302},"#   slots  Dummy_ArmLeft, Dummy_ArmRight, Dummy_Body, Dummy_Head,\n",[282,2696,2697],{"class":284,"line":544},[282,2698,2699],{"class":302},"#          Dummy_LegLeft, Dummy_LegRight\n",[282,2701,2702],{"class":284,"line":566},[282,2703,2704],{"class":302},"#   clips  Death_A, Death_A_Pose, Death_B, Death_B_Pose, Hit_A, Hit_B,\n",[282,2706,2707],{"class":284,"line":576},[282,2708,2709],{"class":302},"#          … 31 more — rerun with --verbose\n",[282,2711,2712],{"class":284,"line":770},[282,2713,309],{"class":302},[282,2715,2716],{"class":284,"line":780},[282,2717,2718],{"class":302},"# Done in 87ms\n",[262,2720,2721,2722,2725,2726,2728],{},"The merged names are the ones ",[265,2723,2724],{},"ActionName"," will carry, so they are printed back; ",[265,2727,355],{},"\nlists all of them.",[262,2730,2731],{},"The component loads each one and merges the clips into a single array, the model's own first:",[273,2733,2735],{"className":2342,"code":2734,"language":397,"meta":278,"style":278},"const { nodes, materials, isLoading } = useGLTF\u003CModelNodes, ModelMaterials>('/models/Dummy.glb')\nconst { state: rigMediumGeneral, isLoading: rigMediumGeneralLoading } = useGLTF('/models/animations/Rig_Medium_General.glb')\nconst { state: rigMediumMovementBasic, isLoading: rigMediumMovementBasicLoading } = useGLTF('/models/animations/Rig_Medium_MovementBasic.glb')\nconst { state: rigMediumMovementAdvanced, isLoading: rigMediumMovementAdvancedLoading } = useGLTF('/models/animations/Rig_Medium_MovementAdvanced.glb')\n\nconst animations = computed(() => {\n  // The mixer resolves every track against a node name in the rendered tree and never\n  // retries a miss, so the clips must not reach it before the model they drive.\n  if (isLoading.value) {\n    return []\n  }\n\n  return [\n    ...(rigMediumGeneral.value?.animations ?? []),\n    ...(rigMediumMovementBasic.value?.animations ?? []),\n    ...(rigMediumMovementAdvanced.value?.animations ?? []),\n  ]\n})\n",[265,2736,2737,2780,2820,2859,2898,2902,2922,2927,2932,2949,2957,2962,2966,2974,3002,3025,3048,3053],{"__ignoreMap":278},[282,2738,2739,2741,2743,2745,2747,2749,2751,2753,2755,2757,2759,2761,2763,2765,2767,2769,2771,2773,2776,2778],{"class":284,"line":285},[282,2740,845],{"class":384},[282,2742,411],{"class":376},[282,2744,874],{"class":414},[282,2746,660],{"class":376},[282,2748,883],{"class":414},[282,2750,660],{"class":376},[282,2752,1055],{"class":414},[282,2754,1058],{"class":376},[282,2756,1061],{"class":376},[282,2758,688],{"class":853},[282,2760,377],{"class":376},[282,2762,1068],{"class":288},[282,2764,660],{"class":376},[282,2766,796],{"class":288},[282,2768,1075],{"class":376},[282,2770,1078],{"class":414},[282,2772,810],{"class":376},[282,2774,2775],{"class":292},"/models/Dummy.glb",[282,2777,810],{"class":376},[282,2779,1103],{"class":414},[282,2781,2782,2784,2786,2788,2790,2793,2795,2798,2800,2803,2805,2807,2809,2811,2813,2816,2818],{"class":284,"line":299},[282,2783,845],{"class":384},[282,2785,411],{"class":376},[282,2787,1042],{"class":380},[282,2789,745],{"class":376},[282,2791,2792],{"class":414}," rigMediumGeneral",[282,2794,660],{"class":376},[282,2796,2797],{"class":380}," isLoading",[282,2799,745],{"class":376},[282,2801,2802],{"class":414}," rigMediumGeneralLoading ",[282,2804,1058],{"class":376},[282,2806,1061],{"class":376},[282,2808,688],{"class":853},[282,2810,1078],{"class":414},[282,2812,810],{"class":376},[282,2814,2815],{"class":292},"/models/animations/Rig_Medium_General.glb",[282,2817,810],{"class":376},[282,2819,1103],{"class":414},[282,2821,2822,2824,2826,2828,2830,2833,2835,2837,2839,2842,2844,2846,2848,2850,2852,2855,2857],{"class":284,"line":306},[282,2823,845],{"class":384},[282,2825,411],{"class":376},[282,2827,1042],{"class":380},[282,2829,745],{"class":376},[282,2831,2832],{"class":414}," rigMediumMovementBasic",[282,2834,660],{"class":376},[282,2836,2797],{"class":380},[282,2838,745],{"class":376},[282,2840,2841],{"class":414}," rigMediumMovementBasicLoading ",[282,2843,1058],{"class":376},[282,2845,1061],{"class":376},[282,2847,688],{"class":853},[282,2849,1078],{"class":414},[282,2851,810],{"class":376},[282,2853,2854],{"class":292},"/models/animations/Rig_Medium_MovementBasic.glb",[282,2856,810],{"class":376},[282,2858,1103],{"class":414},[282,2860,2861,2863,2865,2867,2869,2872,2874,2876,2878,2881,2883,2885,2887,2889,2891,2894,2896],{"class":284,"line":312},[282,2862,845],{"class":384},[282,2864,411],{"class":376},[282,2866,1042],{"class":380},[282,2868,745],{"class":376},[282,2870,2871],{"class":414}," rigMediumMovementAdvanced",[282,2873,660],{"class":376},[282,2875,2797],{"class":380},[282,2877,745],{"class":376},[282,2879,2880],{"class":414}," rigMediumMovementAdvancedLoading ",[282,2882,1058],{"class":376},[282,2884,1061],{"class":376},[282,2886,688],{"class":853},[282,2888,1078],{"class":414},[282,2890,810],{"class":376},[282,2892,2893],{"class":292},"/models/animations/Rig_Medium_MovementAdvanced.glb",[282,2895,810],{"class":376},[282,2897,1103],{"class":414},[282,2899,2900],{"class":284,"line":318},[282,2901,481],{"emptyLinePlaceholder":39},[282,2903,2904,2906,2909,2911,2914,2916,2918,2920],{"class":284,"line":324},[282,2905,845],{"class":384},[282,2907,2908],{"class":414}," animations ",[282,2910,391],{"class":376},[282,2912,2913],{"class":853}," computed",[282,2915,1078],{"class":414},[282,2917,2208],{"class":376},[282,2919,955],{"class":384},[282,2921,737],{"class":376},[282,2923,2924],{"class":284,"line":329},[282,2925,2926],{"class":302},"  // The mixer resolves every track against a node name in the rendered tree and never\n",[282,2928,2929],{"class":284,"line":335},[282,2930,2931],{"class":302},"  // retries a miss, so the clips must not reach it before the model they drive.\n",[282,2933,2934,2937,2939,2941,2943,2945,2947],{"class":284,"line":341},[282,2935,2936],{"class":407},"  if",[282,2938,925],{"class":380},[282,2940,1150],{"class":414},[282,2942,360],{"class":376},[282,2944,1220],{"class":414},[282,2946,1206],{"class":380},[282,2948,1209],{"class":376},[282,2950,2951,2954],{"class":284,"line":346},[282,2952,2953],{"class":407},"    return",[282,2955,2956],{"class":380}," []\n",[282,2958,2959],{"class":284,"line":534},[282,2960,2961],{"class":376},"  }\n",[282,2963,2964],{"class":284,"line":544},[282,2965,481],{"emptyLinePlaceholder":39},[282,2967,2968,2971],{"class":284,"line":566},[282,2969,2970],{"class":407},"  return",[282,2972,2973],{"class":380}," [\n",[282,2975,2976,2979,2981,2984,2986,2988,2990,2993,2996,2999],{"class":284,"line":576},[282,2977,2978],{"class":376},"    ...",[282,2980,1078],{"class":380},[282,2982,2983],{"class":414},"rigMediumGeneral",[282,2985,360],{"class":376},[282,2987,1220],{"class":414},[282,2989,2222],{"class":376},[282,2991,2992],{"class":414},"animations",[282,2994,2995],{"class":376}," ??",[282,2997,2998],{"class":380}," [])",[282,3000,3001],{"class":376},",\n",[282,3003,3004,3006,3008,3011,3013,3015,3017,3019,3021,3023],{"class":284,"line":770},[282,3005,2978],{"class":376},[282,3007,1078],{"class":380},[282,3009,3010],{"class":414},"rigMediumMovementBasic",[282,3012,360],{"class":376},[282,3014,1220],{"class":414},[282,3016,2222],{"class":376},[282,3018,2992],{"class":414},[282,3020,2995],{"class":376},[282,3022,2998],{"class":380},[282,3024,3001],{"class":376},[282,3026,3027,3029,3031,3034,3036,3038,3040,3042,3044,3046],{"class":284,"line":780},[282,3028,2978],{"class":376},[282,3030,1078],{"class":380},[282,3032,3033],{"class":414},"rigMediumMovementAdvanced",[282,3035,360],{"class":376},[282,3037,1220],{"class":414},[282,3039,2222],{"class":376},[282,3041,2992],{"class":414},[282,3043,2995],{"class":376},[282,3045,2998],{"class":380},[282,3047,3001],{"class":376},[282,3049,3050],{"class":284,"line":786},[282,3051,3052],{"class":380},"  ]\n",[282,3054,3055,3057],{"class":284,"line":791},[282,3056,1058],{"class":376},[282,3058,1103],{"class":414},[262,3060,3061],{},"That guard matters: a clip library is a fraction of the size of the model it drives, so its\nfiles arrive first. Handing a mixer clips before the tree exists binds every track to nothing,\nand three caches the miss instead of retrying it.",[262,3063,3064,3066,3067,3070,3071,3073],{},[265,3065,2724],{}," becomes the union across every file, and the node names the external clips drive\nsurvive pruning exactly like the model's own would. Each file gets its own url, inferred from\n",[265,3068,3069],{},"public/"," the same way the model's is, and its own ",[265,3072,1775],{}," when it is compressed.",[262,3075,3076,3077,3079,3080,3082],{},"This is where ",[265,3078,1810],{}," earns its place over a hand-rolled watch. Each clip file resolves on its\nown, so ",[265,3081,2335],{}," can populate with the first library's clips and repopulate as the others land.\nThe generated gate names every condition it waits for, and holds until all of them hold:",[273,3084,3086],{"className":2342,"code":3085,"language":397,"meta":278,"style":278},"const isReady = ref(false)\nwatch(\n  () => !isLoading.value\n    && !rigMediumGeneralLoading.value\n    && !rigMediumMovementBasicLoading.value\n    && !rigMediumMovementAdvancedLoading.value\n    && state.value !== null\n    && Object.keys(actions).length > 0,\n  (ready) => {\n    if (!ready) {\n      isReady.value = false\n      return\n    }\n    // …emit('ready', { nodes: nodes.value, materials: materials.value, actions })\n  },\n  { flush: 'post', immediate: true },\n)\n",[265,3087,3088,3104,3110,3124,3137,3150,3163,3178,3206,3218,3232,3244,3248,3252,3257,3261,3285],{"__ignoreMap":278},[282,3089,3090,3092,3094,3096,3098,3100,3102],{"class":284,"line":285},[282,3091,845],{"class":384},[282,3093,1116],{"class":414},[282,3095,391],{"class":376},[282,3097,707],{"class":853},[282,3099,1078],{"class":414},[282,3101,1125],{"class":1097},[282,3103,1103],{"class":414},[282,3105,3106,3108],{"class":284,"line":299},[282,3107,1133],{"class":853},[282,3109,1136],{"class":414},[282,3111,3112,3114,3116,3118,3120,3122],{"class":284,"line":306},[282,3113,1142],{"class":376},[282,3115,955],{"class":384},[282,3117,1147],{"class":376},[282,3119,1150],{"class":414},[282,3121,360],{"class":376},[282,3123,1155],{"class":414},[282,3125,3126,3128,3130,3133,3135],{"class":284,"line":312},[282,3127,1161],{"class":376},[282,3129,1147],{"class":376},[282,3131,3132],{"class":414},"rigMediumGeneralLoading",[282,3134,360],{"class":376},[282,3136,1155],{"class":414},[282,3138,3139,3141,3143,3146,3148],{"class":284,"line":318},[282,3140,1161],{"class":376},[282,3142,1147],{"class":376},[282,3144,3145],{"class":414},"rigMediumMovementBasicLoading",[282,3147,360],{"class":376},[282,3149,1155],{"class":414},[282,3151,3152,3154,3156,3159,3161],{"class":284,"line":324},[282,3153,1161],{"class":376},[282,3155,1147],{"class":376},[282,3157,3158],{"class":414},"rigMediumMovementAdvancedLoading",[282,3160,360],{"class":376},[282,3162,1155],{"class":414},[282,3164,3165,3167,3169,3171,3173,3175],{"class":284,"line":329},[282,3166,1161],{"class":376},[282,3168,1042],{"class":414},[282,3170,360],{"class":376},[282,3172,1168],{"class":414},[282,3174,1171],{"class":376},[282,3176,3177],{"class":376}," null\n",[282,3179,3180,3182,3185,3187,3190,3193,3195,3198,3200,3204],{"class":284,"line":335},[282,3181,1161],{"class":376},[282,3183,3184],{"class":414}," Object",[282,3186,360],{"class":376},[282,3188,3189],{"class":853},"keys",[282,3191,3192],{"class":414},"(actions)",[282,3194,360],{"class":376},[282,3196,3197],{"class":414},"length ",[282,3199,1075],{"class":376},[282,3201,3203],{"class":3202},"sbssI"," 0",[282,3205,3001],{"class":376},[282,3207,3208,3210,3212,3214,3216],{"class":284,"line":341},[282,3209,1180],{"class":376},[282,3211,1183],{"class":928},[282,3213,1186],{"class":376},[282,3215,955],{"class":384},[282,3217,737],{"class":376},[282,3219,3220,3222,3224,3226,3228,3230],{"class":284,"line":346},[282,3221,1196],{"class":407},[282,3223,925],{"class":380},[282,3225,1201],{"class":376},[282,3227,1183],{"class":414},[282,3229,1206],{"class":380},[282,3231,1209],{"class":376},[282,3233,3234,3236,3238,3240,3242],{"class":284,"line":534},[282,3235,1215],{"class":414},[282,3237,360],{"class":376},[282,3239,1220],{"class":414},[282,3241,1061],{"class":376},[282,3243,1225],{"class":1097},[282,3245,3246],{"class":284,"line":544},[282,3247,1231],{"class":407},[282,3249,3250],{"class":284,"line":566},[282,3251,1237],{"class":376},[282,3253,3254],{"class":284,"line":576},[282,3255,3256],{"class":302},"    // …emit('ready', { nodes: nodes.value, materials: materials.value, actions })\n",[282,3258,3259],{"class":284,"line":770},[282,3260,1326],{"class":376},[282,3262,3263,3265,3267,3269,3271,3273,3275,3277,3279,3281,3283],{"class":284,"line":780},[282,3264,1332],{"class":376},[282,3266,1335],{"class":380},[282,3268,745],{"class":376},[282,3270,424],{"class":376},[282,3272,1342],{"class":292},[282,3274,810],{"class":376},[282,3276,660],{"class":376},[282,3278,1349],{"class":380},[282,3280,745],{"class":376},[282,3282,1098],{"class":1097},[282,3284,1356],{"class":376},[282,3286,3287],{"class":284,"line":786},[282,3288,1103],{"class":414},[262,3290,3291,3292,3294,3295,3298,3299,3302,3303,3305],{},"A watch that fired on the first non-empty ",[265,3293,2335],{}," would see only the General clips, and\n",[265,3296,3297],{},"actions.Jump_Start"," (a MovementBasic clip) would be ",[265,3300,3301],{},"undefined",". ",[265,3304,1810],{}," waits for the lot.",[262,3307,3308,3309,3311,3312,3314,3315,3317,3318,3321],{},"The ",[265,3310,1846],{}," term is doing something less obvious. The actions bind against the root group, which\nstays mounted whatever the load did, so clips from a ",[265,3313,2617],{}," file fill ",[265,3316,2335],{}," even when\nthe ",[1743,3319,3320],{},"model"," itself 404s. Without that term a rig that never arrived would still report ready.",[3323,3324,3326],"h4",{"id":3325},"when-two-files-carry-the-same-clip-name","When two files carry the same clip name",[262,3328,3329,3330,3333,3334,3336,3337,3340,3341,3343,3344,3346],{},"Clip libraries overlap — the three above all ship a ",[265,3331,3332],{},"T-Pose",". The array decides: a mixer keys\n",[265,3335,2335],{}," walking it, so the ",[1743,3338,3339],{},"last"," file passed wins, and an ",[265,3342,2617],{}," clip always\noverrides one the model came with. ",[265,3345,2724],{}," lists the name once. The CLI says which file\nwon rather than leaving it to be discovered:",[273,3348,3350],{"className":275,"code":3349,"language":277,"meta":278,"style":278},"# ⚠ Both Rig_Medium_General.glb and Rig_Medium_MovementBasic.glb carry \"T-Pose\". Rig_Medium_MovementBasic.glb is merged last, so its clip is the one that plays.\n",[265,3351,3352],{"__ignoreMap":278},[282,3353,3354],{"class":284,"line":285},[282,3355,3349],{"class":302},[262,3357,3358],{},"Pass the file you want to win last.",[2067,3360,3361],{},[262,3362,3363,3364,3367,3368,3370],{},"The CLI parses the clip files too, so it can compare each clip's track targets against the\nmodel's node names — the one animation failure that is completely silent at runtime. A clip that\ndrives nodes this rig does not have gets a warning; a clip where ",[1743,3365,3366],{},"nothing"," binds is left out of\n",[265,3369,2724],{}," entirely, since it could never play.",[584,3372,3374],{"id":3373},"where-the-file-is-written","Where the file is written",[262,3376,3377,3378,3381,3382,3384,3385,3388,3389,3392,3393,3395],{},"By default the component is written next to the model as ",[265,3379,3380],{},"\u003CModel>.gen.vue",", with one exception:\nif the model lives under ",[265,3383,3069],{},", the component goes to ",[265,3386,3387],{},"src/models/"," (or ",[265,3390,3391],{},"app/models/"," on\nNuxt) instead. A bundler copies ",[265,3394,3069],{}," verbatim and never compiles it, so a component written\nthere could never be imported.",[273,3397,3399],{"className":275,"code":3398,"language":277,"meta":278,"style":278},"tres gltf public/models/robot.glb        # → src/models/Robot.gen.vue\ntres gltf src/assets/robot.glb           # → src/assets/Robot.gen.vue\ntres gltf public/models/robot.glb -o src/components/Robot.vue\n",[265,3400,3401,3413,3425],{"__ignoreMap":278},[282,3402,3403,3405,3407,3410],{"class":284,"line":285},[282,3404,289],{"class":288},[282,3406,293],{"class":292},[282,3408,3409],{"class":292}," public/models/robot.glb",[282,3411,3412],{"class":302},"        # → src/models/Robot.gen.vue\n",[282,3414,3415,3417,3419,3422],{"class":284,"line":299},[282,3416,289],{"class":288},[282,3418,293],{"class":292},[282,3420,3421],{"class":292}," src/assets/robot.glb",[282,3423,3424],{"class":302},"           # → src/assets/Robot.gen.vue\n",[282,3426,3427,3429,3431,3433,3436],{"class":284,"line":306},[282,3428,289],{"class":288},[282,3430,293],{"class":292},[282,3432,3409],{"class":292},[282,3434,3435],{"class":292}," -o",[282,3437,3438],{"class":292}," src/components/Robot.vue\n",[262,3440,3441,3444,3445,3448,3449,3452,3453,3456,3457,360],{},[265,3442,3443],{},"models/"," rather than ",[265,3446,3447],{},"components/"," is deliberate: component directories are auto-scanned by\n",[265,3450,3451],{},"unplugin-vue-components"," and Nuxt, and the dot in ",[265,3454,3455],{},".gen.vue"," produces an invalid identifier in\nthe generated ",[265,3458,3459],{},"components.d.ts",[3461,3462,3463],"prose-warning",{},[262,3464,3465,3466,3469],{},"The CLI refuses to overwrite a file it did not generate. Pass ",[265,3467,3468],{},"--force"," to replace a\nhand-written file anyway.",[584,3471,3473],{"id":3472},"the-model-url","The model url",[262,3475,3476,3477,3479,3480,3482,3483,3486,3487,3490,3491,3493],{},"The url baked into ",[265,3478,1824],{}," is inferred from the nearest ",[265,3481,3069],{}," directory above the model:\n",[265,3484,3485],{},"public/models/robot.glb"," becomes ",[265,3488,3489],{},"/models/robot.glb",". With no ",[265,3492,3069],{}," in sight the CLI warns\nand guesses, so set it yourself:",[273,3495,3497],{"className":275,"code":3496,"language":277,"meta":278,"style":278},"tres gltf assets/robot.glb --url https://cdn.example.com/robot.glb\n",[265,3498,3499],{"__ignoreMap":278},[282,3500,3501,3503,3505,3508,3511],{"class":284,"line":285},[282,3502,289],{"class":288},[282,3504,293],{"class":292},[282,3506,3507],{"class":292}," assets/robot.glb",[282,3509,3510],{"class":292}," --url",[282,3512,3513],{"class":292}," https://cdn.example.com/robot.glb\n",[584,3515,3517],{"id":3516},"optimizing-the-model","Optimizing the model",[262,3519,3520,3523,3524,3529],{},[265,3521,3522],{},"--transform"," runs the model through ",[2324,3525,3528],{"href":3526,"rel":3527},"https://github.com/donmccurdy/glTF-Transform",[2328],"glTF-Transform","\n(dedup, weld, texture resize and compression, Draco, and more) before generating. Savings of\n70–90% are typical:",[273,3531,3533],{"className":275,"code":3532,"language":277,"meta":278,"style":278},"tres gltf public/models/robot.glb --transform\n# ▲ ■ ● Tres  gltf  robot.glb\n#\n# ✔ Transform   755KB › 40KB  -95%                        1.2s\n# ✔ Parse       12 named nodes · 3 meshes · 2 materials    34ms\n# ✔ Emit        3 slots                                     1ms\n#\n# ✔ src/models/Robot.gen.vue\n#   slots  Head, Body, Base\n#   useGLTF() now loads robot-transformed.glb\n#\n# Done in 1.3s\n",[265,3534,3535,3546,3550,3554,3559,3563,3567,3571,3575,3579,3584,3588],{"__ignoreMap":278},[282,3536,3537,3539,3541,3543],{"class":284,"line":285},[282,3538,289],{"class":288},[282,3540,293],{"class":292},[282,3542,3409],{"class":292},[282,3544,3545],{"class":292}," --transform\n",[282,3547,3548],{"class":284,"line":299},[282,3549,303],{"class":302},[282,3551,3552],{"class":284,"line":306},[282,3553,309],{"class":302},[282,3555,3556],{"class":284,"line":312},[282,3557,3558],{"class":302},"# ✔ Transform   755KB › 40KB  -95%                        1.2s\n",[282,3560,3561],{"class":284,"line":318},[282,3562,315],{"class":302},[282,3564,3565],{"class":284,"line":324},[282,3566,321],{"class":302},[282,3568,3569],{"class":284,"line":329},[282,3570,309],{"class":302},[282,3572,3573],{"class":284,"line":335},[282,3574,332],{"class":302},[282,3576,3577],{"class":284,"line":341},[282,3578,338],{"class":302},[282,3580,3581],{"class":284,"line":346},[282,3582,3583],{"class":302},"#   useGLTF() now loads robot-transformed.glb\n",[282,3585,3586],{"class":284,"line":534},[282,3587,309],{"class":302},[282,3589,3590],{"class":284,"line":544},[282,3591,3592],{"class":302},"# Done in 1.3s\n",[262,3594,3595,3596,3599,3600,3001,3603,3606],{},"While it runs, the ",[265,3597,3598],{},"Transform"," line names the step it is on (",[265,3601,3602],{},"compressing textures",[265,3604,3605],{},"encoding draco",", and the rest), so a slow model is never a silent one.",[262,3608,3609,3610,3613,3614,3617,3618,3621,3622,3624],{},"The optimized file is written ",[1743,3611,3612],{},"beside the source"," as ",[265,3615,3616],{},"\u003Cmodel>-transformed.glb","; the original is\nnever touched. The generated ",[265,3619,3620],{},"useGLTF()"," points at the optimized file, and since the output is\nDraco-compressed it gets ",[265,3623,1775],{}," automatically.",[1734,3626,3627],{},[1737,3628,3629,3660,3676],{},[1740,3630,3631,3636,3637,3640,3641,3646,3647,3650,3651,2078,3654,2536,3657,360],{},[1743,3632,3633],{},[265,3634,3635],{},"--resolution \u003Cpx>"," caps texture size (default ",[265,3638,3639],{},"1024","), and ",[1743,3642,3643],{},[265,3644,3645],{},"--format \u003Cfmt>"," picks the codec: ",[265,3648,3649],{},"webp"," (default), ",[265,3652,3653],{},"jpeg",[265,3655,3656],{},"png",[265,3658,3659],{},"avif",[1740,3661,3662,3667,3668,3671,3672,3675],{},[1743,3663,3664],{},[265,3665,3666],{},"--simplify"," reduces geometry with meshoptimizer, tuned by ",[265,3669,3670],{},"--ratio"," (fraction of vertices to keep) and ",[265,3673,3674],{},"--error"," (error ceiling, as a fraction of mesh radius).",[1740,3677,3678,1747,3683,3688],{},[1743,3679,3680],{},[265,3681,3682],{},"--keepmeshes",[1743,3684,3685],{},[265,3686,3687],{},"--keepmaterials"," switch off mesh joining and material batching, which is what you want when the node structure has to survive.",[3461,3690,3691],{},[262,3692,3693,3694,1850,3696,3699],{},"Joining and simplification change the node graph, so node names (and therefore slot names) can\nmove. Decide on ",[265,3695,3522],{},[1743,3697,3698],{},"before"," you write slot overrides against them.",[584,3701,3703],{"id":3702},"instancing-repeated-meshes","Instancing repeated meshes",[262,3705,3706,3709,3710,3713,3714,3717],{},[265,3707,3708],{},"--instance"," collapses meshes that share a geometry and a material into a single\n",[265,3711,3712],{},"InstancedMesh",". Because one SFC is one component, this restructures the output into ",[1743,3715,3716],{},"two","\nfiles: a provider that owns the load and the batches, and the model that renders into them.",[273,3719,3721],{"className":275,"code":3720,"language":277,"meta":278,"style":278},"tres gltf public/models/robot.glb --instance\n# ▲ ■ ● Tres  gltf  robot.glb\n#\n#   instancing needs deduplicated geometry, so --transform is on and --keepmeshes with it\n# ✔ Transform   755KB › 48KB  -94%                        1.1s\n# ✔ Parse       12 named nodes · 3 meshes · 2 materials    31ms\n# ✔ Emit        3 slots                                     1ms\n#\n# ✔ src/models/Robot.instances.gen.vue   ← owns the load and the batches\n# ✔ src/models/Robot.gen.vue             ← renders \u003CInstance> against them\n",[265,3722,3723,3734,3738,3742,3747,3752,3757,3761,3765,3770],{"__ignoreMap":278},[282,3724,3725,3727,3729,3731],{"class":284,"line":285},[282,3726,289],{"class":288},[282,3728,293],{"class":292},[282,3730,3409],{"class":292},[282,3732,3733],{"class":292}," --instance\n",[282,3735,3736],{"class":284,"line":299},[282,3737,303],{"class":302},[282,3739,3740],{"class":284,"line":306},[282,3741,309],{"class":302},[282,3743,3744],{"class":284,"line":312},[282,3745,3746],{"class":302},"#   instancing needs deduplicated geometry, so --transform is on and --keepmeshes with it\n",[282,3748,3749],{"class":284,"line":318},[282,3750,3751],{"class":302},"# ✔ Transform   755KB › 48KB  -94%                        1.1s\n",[282,3753,3754],{"class":284,"line":324},[282,3755,3756],{"class":302},"# ✔ Parse       12 named nodes · 3 meshes · 2 materials    31ms\n",[282,3758,3759],{"class":284,"line":329},[282,3760,321],{"class":302},[282,3762,3763],{"class":284,"line":335},[282,3764,309],{"class":302},[282,3766,3767],{"class":284,"line":341},[282,3768,3769],{"class":302},"# ✔ src/models/Robot.instances.gen.vue   ← owns the load and the batches\n",[282,3771,3772],{"class":284,"line":346},[282,3773,3774],{"class":302},"# ✔ src/models/Robot.gen.vue             ← renders \u003CInstance> against them\n",[262,3776,3777],{},"The payoff is across copies, not inside one. Wrap them in the provider and the model is loaded\nand parsed once, with every copy costing the drawcalls of one:",[273,3779,3781],{"className":366,"code":3780,"filename":368,"language":369,"meta":278,"style":278},"\u003Cscript setup lang=\"ts\">\nimport Robot from '@/models/Robot.gen.vue'\nimport RobotInstances from '@/models/Robot.instances.gen.vue'\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CRobotInstances>\n    \u003CRobot />\n    \u003CRobot :position=\"[3, 0, 0]\" />\n    \u003CRobot :position=\"[-3, 0, 0]\" />\n  \u003C/RobotInstances>\n\u003C/template>\n",[265,3782,3783,3803,3817,3833,3841,3845,3853,3862,3870,3889,3908,3916],{"__ignoreMap":278},[282,3784,3785,3787,3789,3791,3793,3795,3797,3799,3801],{"class":284,"line":285},[282,3786,377],{"class":376},[282,3788,381],{"class":380},[282,3790,385],{"class":384},[282,3792,388],{"class":384},[282,3794,391],{"class":376},[282,3796,394],{"class":376},[282,3798,397],{"class":292},[282,3800,394],{"class":376},[282,3802,402],{"class":376},[282,3804,3805,3807,3809,3811,3813,3815],{"class":284,"line":299},[282,3806,408],{"class":407},[282,3808,457],{"class":414},[282,3810,460],{"class":407},[282,3812,424],{"class":376},[282,3814,465],{"class":292},[282,3816,430],{"class":376},[282,3818,3819,3821,3824,3826,3828,3831],{"class":284,"line":306},[282,3820,408],{"class":407},[282,3822,3823],{"class":414}," RobotInstances ",[282,3825,460],{"class":407},[282,3827,424],{"class":376},[282,3829,3830],{"class":292},"@/models/Robot.instances.gen.vue",[282,3832,430],{"class":376},[282,3834,3835,3837,3839],{"class":284,"line":312},[282,3836,472],{"class":376},[282,3838,381],{"class":380},[282,3840,402],{"class":376},[282,3842,3843],{"class":284,"line":318},[282,3844,481],{"emptyLinePlaceholder":39},[282,3846,3847,3849,3851],{"class":284,"line":324},[282,3848,377],{"class":376},[282,3850,488],{"class":380},[282,3852,402],{"class":376},[282,3854,3855,3857,3860],{"class":284,"line":329},[282,3856,495],{"class":376},[282,3858,3859],{"class":380},"RobotInstances",[282,3861,402],{"class":376},[282,3863,3864,3866,3868],{"class":284,"line":335},[282,3865,505],{"class":376},[282,3867,539],{"class":380},[282,3869,523],{"class":376},[282,3871,3872,3874,3876,3878,3880,3882,3885,3887],{"class":284,"line":341},[282,3873,505],{"class":376},[282,3875,539],{"class":380},[282,3877,511],{"class":384},[282,3879,391],{"class":376},[282,3881,394],{"class":376},[282,3883,3884],{"class":292},"[3, 0, 0]",[282,3886,394],{"class":376},[282,3888,523],{"class":376},[282,3890,3891,3893,3895,3897,3899,3901,3904,3906],{"class":284,"line":346},[282,3892,505],{"class":376},[282,3894,539],{"class":380},[282,3896,511],{"class":384},[282,3898,391],{"class":376},[282,3900,394],{"class":376},[282,3902,3903],{"class":292},"[-3, 0, 0]",[282,3905,394],{"class":376},[282,3907,523],{"class":376},[282,3909,3910,3912,3914],{"class":284,"line":534},[282,3911,569],{"class":376},[282,3913,3859],{"class":380},[282,3915,402],{"class":376},[282,3917,3918,3920,3922],{"class":284,"line":544},[282,3919,472],{"class":376},[282,3921,488],{"class":380},[282,3923,402],{"class":376},[262,3925,3926,3927,3930,3931,3934,3935,3938,3939,3942],{},"The provider is found through ",[265,3928,3929],{},"provide","/",[265,3932,3933],{},"inject",", so the copies can sit anywhere below it. A\n",[265,3936,3937],{},"\u003CRobot>"," rendered ",[1743,3940,3941],{},"outside"," its provider throws with a message saying so, rather than\nrendering nothing.",[262,3944,3945,3946,3948,3949,3951,3952,3954],{},"Each copy still emits its own ",[265,3947,1810],{}," and exposes ",[265,3950,1247],{},". The provider owns the load, so the\nmodel reads the injected data instead of an ",[265,3953,1150],{}," of its own: ready follows the actions\nbinding when the model is animated, and the nodes populating when it is not.",[262,3956,3957,3959,3960,3963,3964,3966],{},[265,3958,3708],{}," only batches a geometry that two or more meshes share. ",[265,3961,3962],{},"--instanceall"," batches\nevery eligible mesh, including the ones that appear once, which pays off when the whole model is\non screen many times. Skinned meshes and meshes with morph targets are never batched: an\n",[265,3965,3712],{}," has nowhere to put per-mesh skeletons or morph influences.",[3461,3968,3969],{},[262,3970,3971,3977,3978,3980],{},[1743,3972,3973,3974,3976],{},"Instancing turns ",[265,3975,3522],{}," on."," Batching dedupes by geometry identity, and an unoptimized\nexport hands three.js one geometry object per node however identical they are, so instancing\nwithout the pipeline finds nothing to batch. ",[265,3979,3682],{}," comes with it, since joining would\nweld the repeats into a single mesh and leave nothing to batch either.",[2067,3982,3983],{},[262,3984,3985,3988,3989,3992,3993,3995,3996,3999,4000,4002],{},[1743,3986,3987],{},"Batching does not cost a clip its target."," An ",[265,3990,3991],{},"\u003CInstance>"," is a real node with a real ",[265,3994,2531],{},",\nand the batch re-reads every instance's world matrix each frame, so a mixer drives batched\ngeometry exactly as it drives a mesh. ",[265,3997,3998],{},"batch"," is what it joins, ",[265,4001,2531],{}," is what it is called: a\nbucket is keyed after its first mesh, so the two differ as soon as more than one mesh shares a\ngeometry.",[2586,4004,4006],{"id":4005},"overriding-an-instanced-node","Overriding an instanced node",[262,4008,4009,4010,4012,4013,4015],{},"Slots still work, but a batched node has no geometry or material of its own to hand you. It gets\nthe batch's instead, its placement, and ",[265,4011,3998],{},": the key its ",[265,4014,3712],{}," registered under.\nThat key is what an override needs to stay in the batch:",[273,4017,4019],{"className":366,"code":4018,"filename":368,"language":369,"meta":278,"style":278},"\u003Cscript setup lang=\"ts\">\nimport { Instance } from '@tresjs/cientos'\nimport Robot from '@/models/Robot.gen.vue'\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CRobot>\n    \u003C!-- stays batched: one more instance in the same InstancedMesh -->\n    \u003Ctemplate #Screw=\"{ batch, position }\">\n      \u003CInstance :batch :position=\"position\" color=\"red\" @click=\"loosen\" />\n    \u003C/template>\n\n    \u003C!-- leaves the batch: the batch's geometry and material, drawn as a mesh of its own -->\n    \u003Ctemplate #Panel=\"{ geometry, material, position }\">\n      \u003CTresMesh :geometry :material :position />\n    \u003C/template>\n  \u003C/Robot>\n\u003C/template>\n",[265,4020,4021,4041,4060,4074,4082,4086,4094,4102,4107,4138,4184,4192,4196,4201,4235,4249,4257,4265],{"__ignoreMap":278},[282,4022,4023,4025,4027,4029,4031,4033,4035,4037,4039],{"class":284,"line":285},[282,4024,377],{"class":376},[282,4026,381],{"class":380},[282,4028,385],{"class":384},[282,4030,388],{"class":384},[282,4032,391],{"class":376},[282,4034,394],{"class":376},[282,4036,397],{"class":292},[282,4038,394],{"class":376},[282,4040,402],{"class":376},[282,4042,4043,4045,4047,4050,4052,4054,4056,4058],{"class":284,"line":299},[282,4044,408],{"class":407},[282,4046,411],{"class":376},[282,4048,4049],{"class":414}," Instance",[282,4051,418],{"class":376},[282,4053,421],{"class":407},[282,4055,424],{"class":376},[282,4057,427],{"class":292},[282,4059,430],{"class":376},[282,4061,4062,4064,4066,4068,4070,4072],{"class":284,"line":306},[282,4063,408],{"class":407},[282,4065,457],{"class":414},[282,4067,460],{"class":407},[282,4069,424],{"class":376},[282,4071,465],{"class":292},[282,4073,430],{"class":376},[282,4075,4076,4078,4080],{"class":284,"line":312},[282,4077,472],{"class":376},[282,4079,381],{"class":380},[282,4081,402],{"class":376},[282,4083,4084],{"class":284,"line":318},[282,4085,481],{"emptyLinePlaceholder":39},[282,4087,4088,4090,4092],{"class":284,"line":324},[282,4089,377],{"class":376},[282,4091,488],{"class":380},[282,4093,402],{"class":376},[282,4095,4096,4098,4100],{"class":284,"line":329},[282,4097,495],{"class":376},[282,4099,539],{"class":380},[282,4101,402],{"class":376},[282,4103,4104],{"class":284,"line":335},[282,4105,4106],{"class":302},"    \u003C!-- stays batched: one more instance in the same InstancedMesh -->\n",[282,4108,4109,4111,4113,4115,4118,4120,4122,4124,4127,4129,4132,4134,4136],{"class":284,"line":341},[282,4110,505],{"class":376},[282,4112,488],{"class":380},[282,4114,1969],{"class":376},[282,4116,4117],{"class":384},"Screw",[282,4119,391],{"class":376},[282,4121,394],{"class":376},[282,4123,871],{"class":376},[282,4125,4126],{"class":414}," batch",[282,4128,660],{"class":376},[282,4130,4131],{"class":414}," position ",[282,4133,1058],{"class":376},[282,4135,394],{"class":376},[282,4137,402],{"class":376},[282,4139,4140,4142,4145,4148,4150,4152,4154,4157,4159,4162,4164,4166,4169,4171,4173,4175,4177,4180,4182],{"class":284,"line":346},[282,4141,1463],{"class":376},[282,4143,4144],{"class":380},"Instance",[282,4146,4147],{"class":384}," :batch",[282,4149,511],{"class":384},[282,4151,391],{"class":376},[282,4153,394],{"class":376},[282,4155,4156],{"class":292},"position",[282,4158,394],{"class":376},[282,4160,4161],{"class":384}," color",[282,4163,391],{"class":376},[282,4165,394],{"class":376},[282,4167,4168],{"class":292},"red",[282,4170,394],{"class":376},[282,4172,2018],{"class":384},[282,4174,391],{"class":376},[282,4176,394],{"class":376},[282,4178,4179],{"class":292},"loosen",[282,4181,394],{"class":376},[282,4183,523],{"class":376},[282,4185,4186,4188,4190],{"class":284,"line":534},[282,4187,1707],{"class":376},[282,4189,488],{"class":380},[282,4191,402],{"class":376},[282,4193,4194],{"class":284,"line":544},[282,4195,481],{"emptyLinePlaceholder":39},[282,4197,4198],{"class":284,"line":566},[282,4199,4200],{"class":302},"    \u003C!-- leaves the batch: the batch's geometry and material, drawn as a mesh of its own -->\n",[282,4202,4203,4205,4207,4209,4212,4214,4216,4218,4221,4223,4225,4227,4229,4231,4233],{"class":284,"line":576},[282,4204,505],{"class":376},[282,4206,488],{"class":380},[282,4208,1969],{"class":376},[282,4210,4211],{"class":384},"Panel",[282,4213,391],{"class":376},[282,4215,394],{"class":376},[282,4217,871],{"class":376},[282,4219,4220],{"class":414}," geometry",[282,4222,660],{"class":376},[282,4224,945],{"class":414},[282,4226,660],{"class":376},[282,4228,4131],{"class":414},[282,4230,1058],{"class":376},[282,4232,394],{"class":376},[282,4234,402],{"class":376},[282,4236,4237,4239,4241,4243,4245,4247],{"class":284,"line":770},[282,4238,1463],{"class":376},[282,4240,1566],{"class":380},[282,4242,1569],{"class":384},[282,4244,1546],{"class":384},[282,4246,511],{"class":384},[282,4248,523],{"class":376},[282,4250,4251,4253,4255],{"class":284,"line":780},[282,4252,1707],{"class":376},[282,4254,488],{"class":380},[282,4256,402],{"class":376},[282,4258,4259,4261,4263],{"class":284,"line":786},[282,4260,569],{"class":376},[282,4262,539],{"class":380},[282,4264,402],{"class":376},[282,4266,4267,4269,4271],{"class":284,"line":791},[282,4268,472],{"class":376},[282,4270,488],{"class":380},[282,4272,402],{"class":376},[262,4274,4275,4276,4279],{},"Leaving the batch is ",[1743,4277,4278],{},"one drawcall traded for control",". That is exactly what the geometry and\nmaterial bindings are for, but it is not free.",[3461,4281,4282],{},[262,4283,4284,4290,4291,4294,4295,4298,4299,4301,4302,4304],{},[1743,4285,4286,4287,4289],{},"Pass ",[265,4288,3998],{},", never the slot name."," A bucket's batch is keyed after its first mesh, so a slot\nnamed ",[265,4292,4293],{},"Screw_3"," may belong to the batch ",[265,4296,4297],{},"Screw_0",". An ",[265,4300,3991],{}," whose ",[265,4303,3998],{}," matches nothing\nregisters with nothing and renders nothing, so it warns in the console rather than going quiet.",[2067,4306,4307],{},[262,4308,4309,4310,4312,4313,4316,4317,360],{},"Lights and cameras are emitted as ",[265,4311,1785],{},", and an ",[265,4314,4315],{},"Object3D"," has one parent,\nso a second copy of the model steals them from the first. The CLI warns when an instanced model\ncontains any and suggests generating from a subtree with ",[265,4318,4319],{},"--root",[584,4321,4323],{"id":4322},"inspecting-a-model","Inspecting a model",[262,4325,4326,4329],{},[265,4327,4328],{},"--dry-run"," reports what the parser sees and writes nothing:",[273,4331,4333],{"className":275,"code":4332,"language":277,"meta":278,"style":278},"tres gltf public/models/artificer.glb --dry-run\n# ▲ ■ ● Tres  gltf  artificer.glb\n#\n# ✔ Parse       51 named nodes · 8 meshes · 1 material    53ms\n#   76 animation clips\n#   run without --dry-run to generate a component\n",[265,4334,4335,4347,4352,4356,4361,4366],{"__ignoreMap":278},[282,4336,4337,4339,4341,4344],{"class":284,"line":285},[282,4338,289],{"class":288},[282,4340,293],{"class":292},[282,4342,4343],{"class":292}," public/models/artificer.glb",[282,4345,4346],{"class":292}," --dry-run\n",[282,4348,4349],{"class":284,"line":299},[282,4350,4351],{"class":302},"# ▲ ■ ● Tres  gltf  artificer.glb\n",[282,4353,4354],{"class":284,"line":306},[282,4355,309],{"class":302},[282,4357,4358],{"class":284,"line":312},[282,4359,4360],{"class":302},"# ✔ Parse       51 named nodes · 8 meshes · 1 material    53ms\n",[282,4362,4363],{"class":284,"line":318},[282,4364,4365],{"class":302},"#   76 animation clips\n",[282,4367,4368],{"class":284,"line":324},[282,4369,4370],{"class":302},"#   run without --dry-run to generate a component\n",[262,4372,4373,4374,4377,4378,4380,4381,4383],{},"Models with meshes that share a geometry and material also report how many ",[1753,4375,4376],{},"instancing\ncandidates"," they have, which is what ",[265,4379,3708],{}," would batch. With ",[265,4382,2617],{},", each clip\nfile is counted on its own line and the merged total below them — the total is not the sum: a\nname in two files counts once, and a clip nothing binds counts not at all.",[273,4385,4387],{"className":275,"code":4386,"language":277,"meta":278,"style":278},"tres gltf public/models/Dummy.glb \\\n  -a public/models/animations/Rig_Medium_General.glb \\\n  -a public/models/animations/Rig_Medium_MovementBasic.glb \\\n  -a public/models/animations/Rig_Medium_MovementAdvanced.glb \\\n  --dry-run\n# ▲ ■ ● Tres  gltf  Dummy.glb\n#\n# ✔ Parse       51 named nodes · 8 meshes · 1 material · 37 clips merged   29ms\n#   0 animation clips\n#   + Rig_Medium_General.glb: 15 clips\n#   + Rig_Medium_MovementBasic.glb: 11 clips\n#   + Rig_Medium_MovementAdvanced.glb: 13 clips\n#   37 clips merged\n#   run without --dry-run to generate a component\n",[265,4388,4389,4399,4408,4416,4425,4430,4434,4438,4443,4448,4453,4458,4463,4468],{"__ignoreMap":278},[282,4390,4391,4393,4395,4397],{"class":284,"line":285},[282,4392,289],{"class":288},[282,4394,293],{"class":292},[282,4396,2632],{"class":292},[282,4398,2635],{"class":414},[282,4400,4401,4404,4406],{"class":284,"line":299},[282,4402,4403],{"class":292},"  -a",[282,4405,2643],{"class":292},[282,4407,2635],{"class":414},[282,4409,4410,4412,4414],{"class":284,"line":306},[282,4411,4403],{"class":292},[282,4413,2652],{"class":292},[282,4415,2635],{"class":414},[282,4417,4418,4420,4423],{"class":284,"line":312},[282,4419,4403],{"class":292},[282,4421,4422],{"class":292}," public/models/animations/Rig_Medium_MovementAdvanced.glb",[282,4424,2635],{"class":414},[282,4426,4427],{"class":284,"line":318},[282,4428,4429],{"class":292},"  --dry-run\n",[282,4431,4432],{"class":284,"line":324},[282,4433,2666],{"class":302},[282,4435,4436],{"class":284,"line":329},[282,4437,309],{"class":302},[282,4439,4440],{"class":284,"line":335},[282,4441,4442],{"class":302},"# ✔ Parse       51 named nodes · 8 meshes · 1 material · 37 clips merged   29ms\n",[282,4444,4445],{"class":284,"line":341},[282,4446,4447],{"class":302},"#   0 animation clips\n",[282,4449,4450],{"class":284,"line":346},[282,4451,4452],{"class":302},"#   + Rig_Medium_General.glb: 15 clips\n",[282,4454,4455],{"class":284,"line":534},[282,4456,4457],{"class":302},"#   + Rig_Medium_MovementBasic.glb: 11 clips\n",[282,4459,4460],{"class":284,"line":544},[282,4461,4462],{"class":302},"#   + Rig_Medium_MovementAdvanced.glb: 13 clips\n",[282,4464,4465],{"class":284,"line":566},[282,4466,4467],{"class":302},"#   37 clips merged\n",[282,4469,4470],{"class":284,"line":576},[282,4471,4370],{"class":302},[262,4473,4474,4477,4478,4481,4482,4484],{},[265,4475,4476],{},"--json"," dumps the full parse, and ",[265,4479,4480],{},"--console"," prints the component to stdout instead of writing\nit, which is handy for piping or for a quick look before committing. With ",[265,4483,3708],{},", both\nhalves are printed, separated by the filename the provider would have been written to.",[584,4486,4488],{"id":4487},"options","Options",[4490,4491,4492,4509],"table",{},[4493,4494,4495],"thead",{},[4496,4497,4498,4503,4506],"tr",{},[4499,4500,4502],"th",{"align":4501},"left","Flag",[4499,4504,4505],{"align":4501},"Default",[4499,4507,4508],{"align":4501},"Description",[4510,4511,4512,4527,4542,4555,4576,4597,4611,4628,4641,4656,4676,4690,4704,4718,4736,4755,4771,4784,4805,4818,4838,4856,4869,4882,4895],"tbody",{},[4496,4513,4514,4520,4524],{},[4515,4516,4517],"td",{"align":4501},[265,4518,4519],{},"-o, --output \u003Cpath>",[4515,4521,4522],{"align":4501},[265,4523,3380],{},[4515,4525,4526],{"align":4501},"Where to write the component.",[4496,4528,4529,4534,4539],{},[4515,4530,4531],{"align":4501},[265,4532,4533],{},"-u, --url \u003Curl>",[4515,4535,4536,4537],{"align":4501},"inferred from ",[265,4538,3069],{},[4515,4540,4541],{"align":4501},"The url the model is served from at runtime.",[4496,4543,4544,4549,4552],{},[4515,4545,4546],{"align":4501},[265,4547,4548],{},"-a, --animations \u003Cpath>",[4515,4550,4551],{"align":4501},"none",[4515,4553,4554],{"align":4501},"A glb/gltf to take animation clips from, merged with the model's own. Repeatable.",[4496,4556,4557,4562,4567],{},[4515,4558,4559],{"align":4501},[265,4560,4561],{},"-s, --slots \u003Cmode>",[4515,4563,4564],{"align":4501},[265,4565,4566],{},"named",[4515,4568,4569,2078,4571,2536,4574,360],{"align":4501},[265,4570,4566],{},[265,4572,4573],{},"all",[265,4575,4551],{},[4496,4577,4578,4583,4587],{},[4515,4579,4580],{"align":4501},[265,4581,4582],{},"--shadows",[4515,4584,4585],{"align":4501},[265,4586,1125],{},[4515,4588,4589,4590,1747,4593,4596],{"align":4501},"Add ",[265,4591,4592],{},"cast-shadow",[265,4594,4595],{},"receive-shadow"," to every mesh.",[4496,4598,4599,4604,4608],{},[4515,4600,4601],{"align":4501},[265,4602,4603],{},"-K, --keepgroups",[4515,4605,4606],{"align":4501},[265,4607,1125],{},[4515,4609,4610],{"align":4501},"Keep pass-through groups that carry nothing but nesting.",[4496,4612,4613,4618,4622],{},[4515,4614,4615],{"align":4501},[265,4616,4617],{},"-k, --keepnames",[4515,4619,4620],{"align":4501},[265,4621,1125],{},[4515,4623,4624,4625,4627],{"align":4501},"Keep ",[265,4626,2531],{}," attributes on the emitted elements.",[4496,4629,4630,4635,4638],{},[4515,4631,4632],{"align":4501},[265,4633,4634],{},"-r, --root \u003Cname>",[4515,4636,4637],{"align":4501},"scene root",[4515,4639,4640],{"align":4501},"Generate from this subtree only.",[4496,4642,4643,4648,4653],{},[4515,4644,4645],{"align":4501},[265,4646,4647],{},"-p, --precision \u003Cdigits>",[4515,4649,4650],{"align":4501},[265,4651,4652],{},"2",[4515,4654,4655],{"align":4501},"Fractional digits kept on transforms.",[4496,4657,4658,4663,4667],{},[4515,4659,4660],{"align":4501},[265,4661,4662],{},"-m, --meta",[4515,4664,4665],{"align":4501},[265,4666,1125],{},[4515,4668,4669,4670,3613,4673,360],{"align":4501},"Emit glTF ",[265,4671,4672],{},"extras",[265,4674,4675],{},":user-data",[4496,4677,4678,4683,4687],{},[4515,4679,4680],{"align":4501},[265,4681,4682],{},"-c, --console",[4515,4684,4685],{"align":4501},[265,4686,1125],{},[4515,4688,4689],{"align":4501},"Print the component instead of writing it.",[4496,4691,4692,4697,4701],{},[4515,4693,4694],{"align":4501},[265,4695,4696],{},"-f, --force",[4515,4698,4699],{"align":4501},[265,4700,1125],{},[4515,4702,4703],{"align":4501},"Overwrite a file this tool did not generate.",[4496,4705,4706,4711,4715],{},[4515,4707,4708],{"align":4501},[265,4709,4710],{},"-v, --verbose",[4515,4712,4713],{"align":4501},[265,4714,1125],{},[4515,4716,4717],{"align":4501},"List every slot and clip name instead of the first few.",[4496,4719,4720,4725,4729],{},[4515,4721,4722],{"align":4501},[265,4723,4724],{},"-T, --transform",[4515,4726,4727],{"align":4501},[265,4728,1125],{},[4515,4730,4731,4732,4735],{"align":4501},"Optimize the model into a separate ",[265,4733,4734],{},"-transformed.glb"," and generate against it.",[4496,4737,4738,4743,4747],{},[4515,4739,4740],{"align":4501},[265,4741,4742],{},"-i, --instance",[4515,4744,4745],{"align":4501},[265,4746,1125],{},[4515,4748,4749,4750,4752,4753,360],{"align":4501},"Batch meshes that share a geometry and material into an ",[265,4751,3712],{},". Implies ",[265,4754,3522],{},[4496,4756,4757,4762,4766],{},[4515,4758,4759],{"align":4501},[265,4760,4761],{},"-I, --instanceall",[4515,4763,4764],{"align":4501},[265,4765,1125],{},[4515,4767,4768,4769,360],{"align":4501},"Batch every eligible mesh, even the ones that appear once. Implies ",[265,4770,3522],{},[4496,4772,4773,4777,4781],{},[4515,4774,4775],{"align":4501},[265,4776,3635],{},[4515,4778,4779],{"align":4501},[265,4780,3639],{},[4515,4782,4783],{"align":4501},"Max texture size when transforming.",[4496,4785,4786,4790,4794],{},[4515,4787,4788],{"align":4501},[265,4789,3645],{},[4515,4791,4792],{"align":4501},[265,4793,3649],{},[4515,4795,4796,4797,2078,4799,2078,4801,2536,4803,360],{"align":4501},"Texture format when transforming: ",[265,4798,3649],{},[265,4800,3653],{},[265,4802,3656],{},[265,4804,3659],{},[4496,4806,4807,4811,4815],{},[4515,4808,4809],{"align":4501},[265,4810,3666],{},[4515,4812,4813],{"align":4501},[265,4814,1125],{},[4515,4816,4817],{"align":4501},"Reduce geometry with meshoptimizer when transforming.",[4496,4819,4820,4825,4830],{},[4515,4821,4822],{"align":4501},[265,4823,4824],{},"--ratio \u003Cn>",[4515,4826,4827],{"align":4501},[265,4828,4829],{},"0",[4515,4831,4832,4833,3302,4835,4837],{"align":4501},"Target fraction of vertices to keep with ",[265,4834,3666],{},[265,4836,4829],{}," keeps as few as the error allows.",[4496,4839,4840,4845,4850],{},[4515,4841,4842],{"align":4501},[265,4843,4844],{},"--error \u003Cn>",[4515,4846,4847],{"align":4501},[265,4848,4849],{},"0.001",[4515,4851,4852,4853,4855],{"align":4501},"Error ceiling with ",[265,4854,3666],{},", as a fraction of mesh radius.",[4496,4857,4858,4862,4866],{},[4515,4859,4860],{"align":4501},[265,4861,3682],{},[4515,4863,4864],{"align":4501},[265,4865,1125],{},[4515,4867,4868],{"align":4501},"Do not merge meshes when transforming.",[4496,4870,4871,4875,4879],{},[4515,4872,4873],{"align":4501},[265,4874,3687],{},[4515,4876,4877],{"align":4501},[265,4878,1125],{},[4515,4880,4881],{"align":4501},"Do not batch materials when transforming.",[4496,4883,4884,4888,4892],{},[4515,4885,4886],{"align":4501},[265,4887,4328],{},[4515,4889,4890],{"align":4501},[265,4891,1125],{},[4515,4893,4894],{"align":4501},"Report what the parser sees, generate nothing.",[4496,4896,4897,4901,4905],{},[4515,4898,4899],{"align":4501},[265,4900,4476],{},[4515,4902,4903],{"align":4501},[265,4904,1125],{},[4515,4906,4907],{"align":4501},"Print the full parse as JSON.",[584,4909,4911],{"id":4910},"supported-models","Supported models",[262,4913,4914,4915,4918,4919,4922,4923,4926,4927,4930],{},"Both ",[265,4916,4917],{},".glb"," and unpacked ",[265,4920,4921],{},".gltf"," + ",[265,4924,4925],{},".bin"," + textures work, as do Draco-compressed models. Pass\nthe ",[1743,4928,4929],{},"path to the file",", not the url it is served from:",[273,4932,4934],{"className":275,"code":4933,"language":277,"meta":278,"style":278},"tres gltf /models/robot.glb        # ✗ that is the url\ntres gltf public/models/robot.glb  # ✓ that is the file\n",[265,4935,4936,4948],{"__ignoreMap":278},[282,4937,4938,4940,4942,4945],{"class":284,"line":285},[282,4939,289],{"class":288},[282,4941,293],{"class":292},[282,4943,4944],{"class":292}," /models/robot.glb",[282,4946,4947],{"class":302},"        # ✗ that is the url\n",[282,4949,4950,4952,4954,4956],{"class":284,"line":299},[282,4951,289],{"class":288},[282,4953,293],{"class":292},[282,4955,3409],{"class":292},[282,4957,4958],{"class":302},"  # ✓ that is the file\n",[4960,4961,4963],"read-more",{"to":4962},"https://cientos.tresjs.org/getting-started/loading-models",[262,4964,4965,4966,1747,4968,4971],{},"Compare this workflow with ",[265,4967,1824],{},[265,4969,4970],{},"GLTFModel"," in the cientos docs.",[4973,4974,4975],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":278,"searchDepth":285,"depth":299,"links":4977},[4978,4979,4980,4981,4984,4985,4986,4987,4990,4991,4992],{"id":586,"depth":299,"text":587},{"id":1869,"depth":299,"text":1870},{"id":2096,"depth":299,"text":2097},{"id":2318,"depth":299,"text":2319,"children":4982},[4983],{"id":2588,"depth":306,"text":2589},{"id":3373,"depth":299,"text":3374},{"id":3472,"depth":299,"text":3473},{"id":3516,"depth":299,"text":3517},{"id":3702,"depth":299,"text":3703,"children":4988},[4989],{"id":4005,"depth":306,"text":4006},{"id":4322,"depth":299,"text":4323},{"id":4487,"depth":299,"text":4488},{"id":4910,"depth":299,"text":4911},"Generate a typed Vue component from a .glb/.gltf model, with a slot for every node.","md",null,{},{"icon":88},{"title":186,"description":4993},"rNsE-gQpVYyGhELYH9V8yeOS8_ntbesJCyL98DcSF6I",[5001,5003],{"title":183,"path":179,"stem":180,"description":5002,"icon":184,"children":-1},"The tres command line tool for TresJS projects.",{"title":196,"path":192,"stem":197,"description":5004,"children":-1},"Discover guided recipes to help you get started with the basics of using Tres. Each recipe is designed to help you understand the core concepts of Tres and how to use them in your projects.",1789116510453]