[{"data":1,"prerenderedAt":5850},["ShallowReactive",2],{"navigation":3,"/api/abstractions/decal":470,"/api/abstractions/decal-surround":5845},[4,22],{"title":5,"path":6,"stem":7,"children":8},"Getting Started","/getting-started","1.getting-started/1.index",[9,10,14,18],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Installation Guide","/getting-started/installation","1.getting-started/2.installation",{"title":15,"path":16,"stem":17},"Usage","/getting-started/usage","1.getting-started/3.usage",{"title":19,"path":20,"stem":21},"Upgrade Guide","/getting-started/upgrade-guide","1.getting-started/4.upgrade-guide",{"title":23,"path":24,"stem":25,"children":26},"Api","/api","2.api",[27,30,84,114,156,190,284,310,344,394,436],{"title":28,"path":24,"stem":29},"All","2.api/index",{"title":31,"path":32,"stem":33,"children":34},"Abstractions","/api/abstractions","2.api/1.abstractions/index",[35,36,40,44,48,52,56,60,64,68,72,76,80],{"title":31,"path":32,"stem":33},{"title":37,"path":38,"stem":39},"Align","/api/abstractions/align","2.api/1.abstractions/align",{"title":41,"path":42,"stem":43},"Billboard","/api/abstractions/billboard","2.api/1.abstractions/billboard",{"title":45,"path":46,"stem":47},"Camera Shake","/api/abstractions/camera-shake","2.api/1.abstractions/camera-shake",{"title":49,"path":50,"stem":51},"Decal","/api/abstractions/decal","2.api/1.abstractions/decal",{"title":53,"path":54,"stem":55},"Edges","/api/abstractions/edges","2.api/1.abstractions/edges",{"title":57,"path":58,"stem":59},"Fit","/api/abstractions/fit","2.api/1.abstractions/fit",{"title":61,"path":62,"stem":63},"Levioso (Float)","/api/abstractions/levioso","2.api/1.abstractions/levioso",{"title":65,"path":66,"stem":67},"Mask","/api/abstractions/mask","2.api/1.abstractions/mask",{"title":69,"path":70,"stem":71},"Outline","/api/abstractions/outline","2.api/1.abstractions/outline",{"title":73,"path":74,"stem":75},"Sampler","/api/abstractions/sampler","2.api/1.abstractions/sampler",{"title":77,"path":78,"stem":79},"ScreenSizer","/api/abstractions/screen-sizer","2.api/1.abstractions/screen-sizer",{"title":81,"path":82,"stem":83},"ScreenSpace","/api/abstractions/screen-space","2.api/1.abstractions/screen-space",{"title":85,"path":86,"stem":87,"children":88},"Controls","/api/controls","2.api/2.controls/index",[89,90,94,98,102,106,110],{"title":85,"path":86,"stem":87},{"title":91,"path":92,"stem":93},"Camera Controls","/api/controls/camera-controls","2.api/2.controls/camera-controls",{"title":95,"path":96,"stem":97},"Keyboard Controls","/api/controls/keyboard-controls","2.api/2.controls/keyboard-controls",{"title":99,"path":100,"stem":101},"Map Controls","/api/controls/map-controls","2.api/2.controls/map-controls",{"title":103,"path":104,"stem":105},"Orbit Controls","/api/controls/orbit-controls","2.api/2.controls/orbit-controls",{"title":107,"path":108,"stem":109},"PointerLock Controls","/api/controls/pointer-lock-controls","2.api/2.controls/pointer-lock-controls",{"title":111,"path":112,"stem":113},"Transform Controls","/api/controls/transform-controls","2.api/2.controls/transform-controls",{"title":115,"path":116,"stem":117,"children":118},"Loaders","/api/loaders","2.api/3.loaders/index",[119,120,124,128,132,136,140,144,148,152],{"title":115,"path":116,"stem":117},{"title":121,"path":122,"stem":123},"useGLTF","/api/loaders/use-gltf","2.api/3.loaders/1.use-gltf",{"title":125,"path":126,"stem":127},"GLTFModel","/api/loaders/gltf-model","2.api/3.loaders/2.gltf-model",{"title":129,"path":130,"stem":131},"useFBX","/api/loaders/use-fbx","2.api/3.loaders/3.use-fbx",{"title":133,"path":134,"stem":135},"FBXModel","/api/loaders/fbx-model","2.api/3.loaders/4.fbx-model",{"title":137,"path":138,"stem":139},"useTexture","/api/loaders/use-texture","2.api/3.loaders/5.use-texture",{"title":141,"path":142,"stem":143},"useTextures","/api/loaders/use-textures","2.api/3.loaders/6.use-textures",{"title":145,"path":146,"stem":147},"useSVG","/api/loaders/use-svg","2.api/3.loaders/7.use-svg",{"title":149,"path":150,"stem":151},"useProgress","/api/loaders/use-progress","2.api/3.loaders/use-progress",{"title":153,"path":154,"stem":155},"useVideoTexture","/api/loaders/use-video-texture","2.api/3.loaders/use-video-texture",{"title":157,"path":158,"stem":159,"children":160},"Materials","/api/materials","2.api/4.materials/index",[161,162,166,170,174,178,182,186],{"title":157,"path":158,"stem":159},{"title":163,"path":164,"stem":165},"Custom Shader Material","/api/materials/custom-shader-material","2.api/4.materials/custom-shader-material",{"title":167,"path":168,"stem":169},"Mesh Glass Material","/api/materials/glass-material","2.api/4.materials/glass-material",{"title":171,"path":172,"stem":173},"Holographic Material","/api/materials/holographic-material","2.api/4.materials/holographic-material",{"title":175,"path":176,"stem":177},"Mesh Discard Material","/api/materials/mesh-discard-material","2.api/4.materials/mesh-discard-material",{"title":179,"path":180,"stem":181},"Mesh Reflection Material","/api/materials/mesh-reflection-material","2.api/4.materials/mesh-reflection-material",{"title":183,"path":184,"stem":185},"Point Material","/api/materials/point-material","2.api/4.materials/point-material",{"title":187,"path":188,"stem":189},"Wobble Material","/api/materials/wobble-material","2.api/4.materials/wobble-material",{"title":191,"path":192,"stem":193,"children":194},"Shapes","/api/shapes","2.api/5.shapes/index",[195,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280],{"title":191,"path":192,"stem":193},{"title":197,"path":198,"stem":199},"Box","/api/shapes/box","2.api/5.shapes/box",{"title":201,"path":202,"stem":203},"CatmullRomCurve3","/api/shapes/catmullromcurve3","2.api/5.shapes/catmullromcurve3",{"title":205,"path":206,"stem":207},"Circle","/api/shapes/circle","2.api/5.shapes/circle",{"title":209,"path":210,"stem":211},"Cone","/api/shapes/cone","2.api/5.shapes/cone",{"title":213,"path":214,"stem":215},"Cubic Bezier Line","/api/shapes/cubic-bezier-line","2.api/5.shapes/cubic-bezier-line",{"title":217,"path":218,"stem":219},"Cylinder","/api/shapes/cylinder","2.api/5.shapes/cylinder",{"title":221,"path":222,"stem":223},"Dodecahedron","/api/shapes/dodecahedron","2.api/5.shapes/dodecahedron",{"title":225,"path":226,"stem":227},"Grid","/api/shapes/grid","2.api/5.shapes/grid",{"title":229,"path":230,"stem":231},"Icosahedron","/api/shapes/icosahedron","2.api/5.shapes/icosahedron",{"title":233,"path":234,"stem":235},"Line2","/api/shapes/line2","2.api/5.shapes/line2",{"title":237,"path":238,"stem":239},"Octahedron","/api/shapes/octahedron","2.api/5.shapes/octahedron",{"title":241,"path":242,"stem":243},"Plane","/api/shapes/plane","2.api/5.shapes/plane",{"title":245,"path":246,"stem":247},"Quadratic Bezier Line","/api/shapes/quadratic-bezier-line","2.api/5.shapes/quadratic-bezier-line",{"title":249,"path":250,"stem":251},"Ring","/api/shapes/ring","2.api/5.shapes/ring",{"title":253,"path":254,"stem":255},"Rounded Box","/api/shapes/rounded-box","2.api/5.shapes/rounded-box",{"title":257,"path":258,"stem":259},"Screen Quad","/api/shapes/screen-quad","2.api/5.shapes/screen-quad",{"title":261,"path":262,"stem":263},"Sphere","/api/shapes/sphere","2.api/5.shapes/sphere",{"title":265,"path":266,"stem":267},"Superformula","/api/shapes/superformula","2.api/5.shapes/superformula",{"title":269,"path":270,"stem":271},"Tetrahedron","/api/shapes/tetrahedron","2.api/5.shapes/tetrahedron",{"title":273,"path":274,"stem":275},"Torus","/api/shapes/torus","2.api/5.shapes/torus",{"title":277,"path":278,"stem":279},"Torus Knot","/api/shapes/torus-knot","2.api/5.shapes/torus-knot",{"title":281,"path":282,"stem":283},"Tube","/api/shapes/tube","2.api/5.shapes/tube",{"title":285,"path":286,"stem":287,"children":288},"Debug/Performance","/api/debug-performance","2.api/6.debug-performance/index",[289,290,294,298,302,306],{"title":285,"path":286,"stem":287},{"title":291,"path":292,"stem":293},"Helper","/api/debug-performance/helper","2.api/6.debug-performance/helper",{"title":295,"path":296,"stem":297},"LOD","/api/debug-performance/lod","2.api/6.debug-performance/lod",{"title":299,"path":300,"stem":301},"Stats","/api/debug-performance/stats","2.api/6.debug-performance/stats",{"title":303,"path":304,"stem":305},"StatsGl","/api/debug-performance/stats-gl","2.api/6.debug-performance/stats-gl",{"title":307,"path":308,"stem":309},"useBVH","/api/debug-performance/use-bvh","2.api/6.debug-performance/use-bvh",{"title":311,"path":312,"stem":313,"children":314},"Light/Shadow","/api/light-shadow","2.api/7.light-shadow/index",[315,316,320,324,328,332,336,340],{"title":311,"path":312,"stem":313},{"title":317,"path":318,"stem":319},"Accumulative Shadows","/api/light-shadow/accumulative-shadows","2.api/7.light-shadow/accumulative-shadows",{"title":321,"path":322,"stem":323},"Bake Shadows","/api/light-shadow/bake-shadows","2.api/7.light-shadow/bake-shadows",{"title":325,"path":326,"stem":327},"Circle Shadow","/api/light-shadow/circle-shadow","2.api/7.light-shadow/circle-shadow",{"title":329,"path":330,"stem":331},"Contact Shadows","/api/light-shadow/contact-shadows","2.api/7.light-shadow/contact-shadows",{"title":333,"path":334,"stem":335},"Lensflare","/api/light-shadow/lensflare","2.api/7.light-shadow/lensflare",{"title":337,"path":338,"stem":339},"Randomized Lights","/api/light-shadow/randomized-lights","2.api/7.light-shadow/randomized-lights",{"title":341,"path":342,"stem":343},"Soft Shadows","/api/light-shadow/soft-shadows","2.api/7.light-shadow/soft-shadows",{"title":345,"path":346,"stem":347,"children":348},"Staging","/api/staging","2.api/8.staging/index",[349,350,354,358,362,366,370,374,378,382,386,390],{"title":345,"path":346,"stem":347},{"title":351,"path":352,"stem":353},"Environment","/api/staging/environment","2.api/8.staging/1.environment",{"title":355,"path":356,"stem":357},"useEnvironment","/api/staging/use-environment","2.api/8.staging/2.use-environment",{"title":359,"path":360,"stem":361},"Lightformer","/api/staging/lightformer","2.api/8.staging/3.lightformer",{"title":363,"path":364,"stem":365},"Backdrop","/api/staging/backdrop","2.api/8.staging/backdrop",{"title":367,"path":368,"stem":369},"Ocean","/api/staging/ocean","2.api/8.staging/ocean",{"title":371,"path":372,"stem":373},"Precipitation","/api/staging/precipitation","2.api/8.staging/precipitation",{"title":375,"path":376,"stem":377},"Sky","/api/staging/sky","2.api/8.staging/sky",{"title":379,"path":380,"stem":381},"Smoke","/api/staging/smoke","2.api/8.staging/smoke",{"title":383,"path":384,"stem":385},"Sparkles","/api/staging/sparkles","2.api/8.staging/sparkles",{"title":387,"path":388,"stem":389},"Stage","/api/staging/stage","2.api/8.staging/stage",{"title":391,"path":392,"stem":393},"Stars","/api/staging/stars","2.api/8.staging/stars",{"title":395,"path":396,"stem":397,"children":398},"Objects","/api/objects","2.api/9.objects/index",[399,400,404,408,412,416,420,424,428,432],{"title":395,"path":396,"stem":397},{"title":401,"path":402,"stem":403},"AnimatedSprite","/api/objects/animated-sprite","2.api/9.objects/animated-sprite",{"title":405,"path":406,"stem":407},"CubeCamera","/api/objects/cube-camera","2.api/9.objects/cube-camera",{"title":409,"path":410,"stem":411},"Fbo","/api/objects/fbo","2.api/9.objects/fbo",{"title":413,"path":414,"stem":415},"GradientTexture","/api/objects/gradient-texture","2.api/9.objects/gradient-texture",{"title":417,"path":418,"stem":419},"HTML","/api/objects/html","2.api/9.objects/html",{"title":421,"path":422,"stem":423},"Image","/api/objects/image","2.api/9.objects/image",{"title":425,"path":426,"stem":427},"MarchingCubes","/api/objects/marching-cubes","2.api/9.objects/marching-cubes",{"title":429,"path":430,"stem":431},"Reflector","/api/objects/reflector","2.api/9.objects/reflector",{"title":433,"path":434,"stem":435},"Text3D","/api/objects/text-3d","2.api/9.objects/text-3d",{"title":437,"path":438,"stem":439,"children":440},"Miscellaneous","/api/miscellaneous","2.api/miscellaneous/index",[441,442,446,450,454,458,462,466],{"title":437,"path":438,"stem":439},{"title":443,"path":444,"stem":445},"Bounds","/api/miscellaneous/bounds","2.api/miscellaneous/bounds",{"title":447,"path":448,"stem":449},"GlobalAudio","/api/miscellaneous/global-audio","2.api/miscellaneous/global-audio",{"title":451,"path":452,"stem":453},"MouseParallax","/api/miscellaneous/mouse-parallax","2.api/miscellaneous/mouse-parallax",{"title":455,"path":456,"stem":457},"PositionalAudio","/api/miscellaneous/positional-audio","2.api/miscellaneous/positional-audio",{"title":459,"path":460,"stem":461},"useAnimations","/api/miscellaneous/use-animations","2.api/miscellaneous/use-animations",{"title":463,"path":464,"stem":465},"useGLTFExporter","/api/miscellaneous/use-gltf-exporter","2.api/miscellaneous/use-gltf-exporter",{"title":467,"path":468,"stem":469},"useIntersect","/api/miscellaneous/use-intersect","2.api/miscellaneous/use-intersect",{"id":471,"title":49,"body":472,"description":5839,"extension":5840,"links":5841,"meta":5842,"navigation":723,"path":50,"seo":5843,"stem":51,"__hash__":5844},"docs/2.api/1.abstractions/decal.md",{"type":473,"value":474,"toc":5804},"minimark",[475,483,568,574,578,593,1142,1159,1163,1174,1343,1359,1362,1376,1428,1453,1457,1470,1475,1541,1548,1554,1571,1662,1667,1681,1756,2499,2504,2544,2557,2619,2622,2632,2718,2725,2745,2755,2758,2975,2987,2995,3010,3348,3352,3377,3775,3789,3809,3813,3829,4068,4074,4282,4288,4423,4432,4439,4495,4596,4601,4747,4752,4793,4797,4853,4857,4928,4932,5010,5017,5032,5073,5122,5800],[476,477,478,482],"p",{},[479,480,481],"code",{},"\u003CDecal>"," projects a flat texture onto the surface of a parent mesh,\nconforming to its geometry. Multiple decals can stack on the same mesh\nwith explicit z-layering, the JSON layout round-trips losslessly, and\nthe entry-by-entry shape stays human-readable.",[484,485,486,499,513,528,535,546,558],"ul",{},[487,488,489,490,494,495,498],"li",{},"🎨 Drop-in ",[491,492,493],"strong",{},"editor UI"," via ",[479,496,497],{},"\u003CDecalDebugUI>"," — placement, rotate / scale / snap, tint, flip, layers, undo / redo, import / export.",[487,500,501,502,494,505,512],{},"🛠 ",[491,503,504],{},"Programmatic API",[506,507,509],"a",{"href":508},"#programmatic-api-usedecaleditor",[479,510,511],{},"useDecalEditor()"," for custom panels and automation.",[487,514,515,516,519,520,523,524,527],{},"🖼️ ",[491,517,518],{},"Texture palette"," — pass an array of ",[479,521,522],{},"Texture"," to ",[479,525,526],{},":map",".",[487,529,530,531,534],{},"🧩 ",[491,532,533],{},"Custom material"," — override the default via the slot.",[487,536,537,538,541,542,545],{},"💾 ",[491,539,540],{},"Lossless JSON"," — ",[479,543,544],{},"v-model:data"," round-trips to plain JSON.",[487,547,548,549,552,553,557],{},"⚡ ",[491,550,551],{},"BVH-accelerated"," — auto-detected via ",[506,554,555],{"href":308},[479,556,307],{},"; 10–100× faster on dense meshes.",[487,559,560,561,541,564,567],{},"📚 ",[491,562,563],{},"Per-mesh stacking",[479,565,566],{},"zIndex"," with automatic polygon-offset.",[569,570,571],"scene-wrapper",{},[572,573],"abstractions-decal",{},[575,576,15],"h2",{"id":577},"usage",[476,579,580,581,583,584,587,588,590,591,527],{},"The minimal setup is a ",[479,582,481],{}," placed as a child of any ",[479,585,586],{},"\u003CTresMesh>",",\nwith a JSON list of stamped decals bound via ",[479,589,544],{}," and one or\nmore textures via ",[479,592,526],{},[594,595,600],"pre",{"className":596,"code":597,"language":598,"meta":599,"style":599},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { Decal, OrbitControls, useTexture } from '@tresjs/cientos'\nimport { TresCanvas } from '@tresjs/core'\nimport { reactive } from 'vue'\n\nconst { state: texture } = useTexture('/textures/logo.png')\n\nconst decals = reactive([\n  {\n    id: 'logo-1',\n    position: [0, 0, 0.5],\n    orientation: [0, 0, 0],\n    size: [0.75, 0.17, 1],\n    zIndex: 0,\n    map: 'logo.png',\n  },\n])\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CTresCanvas>\n    \u003CTresPerspectiveCamera :position=\"[2, 2, 3]\" />\n    \u003COrbitControls />\n    \u003CTresMesh>\n      \u003CTresBoxGeometry />\n      \u003CTresMeshStandardMaterial color=\"white\" />\n      \u003CDecal v-if=\"texture\" v-model:data=\"decals\" :map=\"texture\" />\n    \u003C/TresMesh>\n  \u003C/TresCanvas>\n\u003C/template>\n","vue","",[479,601,602,637,677,698,718,725,765,770,785,791,809,839,863,890,902,919,925,931,941,946,956,967,1009,1019,1029,1040,1062,1113,1123,1133],{"__ignoreMap":599},[603,604,607,611,615,619,622,625,628,632,634],"span",{"class":605,"line":606},"line",1,[603,608,610],{"class":609},"sMK4o","\u003C",[603,612,614],{"class":613},"swJcz","script",[603,616,618],{"class":617},"spNyl"," setup",[603,620,621],{"class":617}," lang",[603,623,624],{"class":609},"=",[603,626,627],{"class":609},"\"",[603,629,631],{"class":630},"sfazB","ts",[603,633,627],{"class":609},[603,635,636],{"class":609},">\n",[603,638,640,644,647,651,654,657,659,662,665,668,671,674],{"class":605,"line":639},2,[603,641,643],{"class":642},"s7zQu","import",[603,645,646],{"class":609}," {",[603,648,650],{"class":649},"sTEyZ"," Decal",[603,652,653],{"class":609},",",[603,655,656],{"class":649}," OrbitControls",[603,658,653],{"class":609},[603,660,661],{"class":649}," useTexture",[603,663,664],{"class":609}," }",[603,666,667],{"class":642}," from",[603,669,670],{"class":609}," '",[603,672,673],{"class":630},"@tresjs/cientos",[603,675,676],{"class":609},"'\n",[603,678,680,682,684,687,689,691,693,696],{"class":605,"line":679},3,[603,681,643],{"class":642},[603,683,646],{"class":609},[603,685,686],{"class":649}," TresCanvas",[603,688,664],{"class":609},[603,690,667],{"class":642},[603,692,670],{"class":609},[603,694,695],{"class":630},"@tresjs/core",[603,697,676],{"class":609},[603,699,701,703,705,708,710,712,714,716],{"class":605,"line":700},4,[603,702,643],{"class":642},[603,704,646],{"class":609},[603,706,707],{"class":649}," reactive",[603,709,664],{"class":609},[603,711,667],{"class":642},[603,713,670],{"class":609},[603,715,598],{"class":630},[603,717,676],{"class":609},[603,719,721],{"class":605,"line":720},5,[603,722,724],{"emptyLinePlaceholder":723},true,"\n",[603,726,728,731,733,736,739,742,745,748,751,754,757,760,762],{"class":605,"line":727},6,[603,729,730],{"class":617},"const",[603,732,646],{"class":609},[603,734,735],{"class":613}," state",[603,737,738],{"class":609},":",[603,740,741],{"class":649}," texture ",[603,743,744],{"class":609},"}",[603,746,747],{"class":609}," =",[603,749,661],{"class":750},"s2Zo4",[603,752,753],{"class":649},"(",[603,755,756],{"class":609},"'",[603,758,759],{"class":630},"/textures/logo.png",[603,761,756],{"class":609},[603,763,764],{"class":649},")\n",[603,766,768],{"class":605,"line":767},7,[603,769,724],{"emptyLinePlaceholder":723},[603,771,773,775,778,780,782],{"class":605,"line":772},8,[603,774,730],{"class":617},[603,776,777],{"class":649}," decals ",[603,779,624],{"class":609},[603,781,707],{"class":750},[603,783,784],{"class":649},"([\n",[603,786,788],{"class":605,"line":787},9,[603,789,790],{"class":609},"  {\n",[603,792,794,797,799,801,804,806],{"class":605,"line":793},10,[603,795,796],{"class":613},"    id",[603,798,738],{"class":609},[603,800,670],{"class":609},[603,802,803],{"class":630},"logo-1",[603,805,756],{"class":609},[603,807,808],{"class":609},",\n",[603,810,812,815,817,820,824,826,829,831,834,837],{"class":605,"line":811},11,[603,813,814],{"class":613},"    position",[603,816,738],{"class":609},[603,818,819],{"class":649}," [",[603,821,823],{"class":822},"sbssI","0",[603,825,653],{"class":609},[603,827,828],{"class":822}," 0",[603,830,653],{"class":609},[603,832,833],{"class":822}," 0.5",[603,835,836],{"class":649},"]",[603,838,808],{"class":609},[603,840,842,845,847,849,851,853,855,857,859,861],{"class":605,"line":841},12,[603,843,844],{"class":613},"    orientation",[603,846,738],{"class":609},[603,848,819],{"class":649},[603,850,823],{"class":822},[603,852,653],{"class":609},[603,854,828],{"class":822},[603,856,653],{"class":609},[603,858,828],{"class":822},[603,860,836],{"class":649},[603,862,808],{"class":609},[603,864,866,869,871,873,876,878,881,883,886,888],{"class":605,"line":865},13,[603,867,868],{"class":613},"    size",[603,870,738],{"class":609},[603,872,819],{"class":649},[603,874,875],{"class":822},"0.75",[603,877,653],{"class":609},[603,879,880],{"class":822}," 0.17",[603,882,653],{"class":609},[603,884,885],{"class":822}," 1",[603,887,836],{"class":649},[603,889,808],{"class":609},[603,891,893,896,898,900],{"class":605,"line":892},14,[603,894,895],{"class":613},"    zIndex",[603,897,738],{"class":609},[603,899,828],{"class":822},[603,901,808],{"class":609},[603,903,905,908,910,912,915,917],{"class":605,"line":904},15,[603,906,907],{"class":613},"    map",[603,909,738],{"class":609},[603,911,670],{"class":609},[603,913,914],{"class":630},"logo.png",[603,916,756],{"class":609},[603,918,808],{"class":609},[603,920,922],{"class":605,"line":921},16,[603,923,924],{"class":609},"  },\n",[603,926,928],{"class":605,"line":927},17,[603,929,930],{"class":649},"])\n",[603,932,934,937,939],{"class":605,"line":933},18,[603,935,936],{"class":609},"\u003C/",[603,938,614],{"class":613},[603,940,636],{"class":609},[603,942,944],{"class":605,"line":943},19,[603,945,724],{"emptyLinePlaceholder":723},[603,947,949,951,954],{"class":605,"line":948},20,[603,950,610],{"class":609},[603,952,953],{"class":613},"template",[603,955,636],{"class":609},[603,957,959,962,965],{"class":605,"line":958},21,[603,960,961],{"class":609},"  \u003C",[603,963,964],{"class":613},"TresCanvas",[603,966,636],{"class":609},[603,968,970,973,976,979,982,984,986,989,992,995,997,999,1002,1004,1006],{"class":605,"line":969},22,[603,971,972],{"class":609},"    \u003C",[603,974,975],{"class":613},"TresPerspectiveCamera",[603,977,978],{"class":609}," :",[603,980,981],{"class":617},"position",[603,983,624],{"class":609},[603,985,627],{"class":609},[603,987,988],{"class":609},"[",[603,990,991],{"class":822},"2",[603,993,994],{"class":609},", ",[603,996,991],{"class":822},[603,998,994],{"class":609},[603,1000,1001],{"class":822},"3",[603,1003,836],{"class":609},[603,1005,627],{"class":609},[603,1007,1008],{"class":609}," />\n",[603,1010,1012,1014,1017],{"class":605,"line":1011},23,[603,1013,972],{"class":609},[603,1015,1016],{"class":613},"OrbitControls",[603,1018,1008],{"class":609},[603,1020,1022,1024,1027],{"class":605,"line":1021},24,[603,1023,972],{"class":609},[603,1025,1026],{"class":613},"TresMesh",[603,1028,636],{"class":609},[603,1030,1032,1035,1038],{"class":605,"line":1031},25,[603,1033,1034],{"class":609},"      \u003C",[603,1036,1037],{"class":613},"TresBoxGeometry",[603,1039,1008],{"class":609},[603,1041,1043,1045,1048,1051,1053,1055,1058,1060],{"class":605,"line":1042},26,[603,1044,1034],{"class":609},[603,1046,1047],{"class":613},"TresMeshStandardMaterial",[603,1049,1050],{"class":617}," color",[603,1052,624],{"class":609},[603,1054,627],{"class":609},[603,1056,1057],{"class":630},"white",[603,1059,627],{"class":609},[603,1061,1008],{"class":609},[603,1063,1065,1067,1069,1072,1074,1076,1079,1081,1084,1086,1089,1091,1093,1096,1098,1100,1103,1105,1107,1109,1111],{"class":605,"line":1064},27,[603,1066,1034],{"class":609},[603,1068,49],{"class":613},[603,1070,1071],{"class":642}," v-if",[603,1073,624],{"class":609},[603,1075,627],{"class":609},[603,1077,1078],{"class":649},"texture",[603,1080,627],{"class":609},[603,1082,1083],{"class":617}," v-model",[603,1085,738],{"class":609},[603,1087,1088],{"class":617},"data",[603,1090,624],{"class":609},[603,1092,627],{"class":609},[603,1094,1095],{"class":649},"decals",[603,1097,627],{"class":609},[603,1099,978],{"class":609},[603,1101,1102],{"class":617},"map",[603,1104,624],{"class":609},[603,1106,627],{"class":609},[603,1108,1078],{"class":649},[603,1110,627],{"class":609},[603,1112,1008],{"class":609},[603,1114,1116,1119,1121],{"class":605,"line":1115},28,[603,1117,1118],{"class":609},"    \u003C/",[603,1120,1026],{"class":613},[603,1122,636],{"class":609},[603,1124,1126,1129,1131],{"class":605,"line":1125},29,[603,1127,1128],{"class":609},"  \u003C/",[603,1130,964],{"class":613},[603,1132,636],{"class":609},[603,1134,1136,1138,1140],{"class":605,"line":1135},30,[603,1137,936],{"class":609},[603,1139,953],{"class":613},[603,1141,636],{"class":609},[1143,1144,1145],"prose-note",{},[476,1146,1147,1148,1150,1151,1154,1155,1158],{},"The ",[479,1149,544],{}," array is the ",[491,1152,1153],{},"single source of truth"," — every\ndecal you can see lives in it. It serializes to plain JSON so you can\nsave / load it from a backend, localStorage, or a ",[479,1156,1157],{},".json"," file.",[575,1160,1162],{"id":1161},"multiple-textures-palette","Multiple textures (palette)",[476,1164,1165,1166,1168,1169,1173],{},"Pass an array to ",[479,1167,526],{}," to give users a palette of textures to pick\nfrom. The array returned by ",[506,1170,1171],{"href":142},[479,1172,141],{},"\nplugs in directly:",[594,1175,1177],{"className":596,"code":1176,"language":598,"meta":599,"style":599},"\u003Cscript setup lang=\"ts\">\nimport { Decal, useTextures } from '@tresjs/cientos'\n\nconst { textures } = useTextures([\n  '/textures/logo.png',\n  '/textures/badge.png',\n  '/textures/sticker.png',\n])\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CDecal v-model:data=\"decals\" :map=\"textures\" />\n\u003C/template>\n",[479,1178,1179,1199,1222,1226,1243,1254,1265,1276,1280,1288,1292,1300,1335],{"__ignoreMap":599},[603,1180,1181,1183,1185,1187,1189,1191,1193,1195,1197],{"class":605,"line":606},[603,1182,610],{"class":609},[603,1184,614],{"class":613},[603,1186,618],{"class":617},[603,1188,621],{"class":617},[603,1190,624],{"class":609},[603,1192,627],{"class":609},[603,1194,631],{"class":630},[603,1196,627],{"class":609},[603,1198,636],{"class":609},[603,1200,1201,1203,1205,1207,1209,1212,1214,1216,1218,1220],{"class":605,"line":639},[603,1202,643],{"class":642},[603,1204,646],{"class":609},[603,1206,650],{"class":649},[603,1208,653],{"class":609},[603,1210,1211],{"class":649}," useTextures",[603,1213,664],{"class":609},[603,1215,667],{"class":642},[603,1217,670],{"class":609},[603,1219,673],{"class":630},[603,1221,676],{"class":609},[603,1223,1224],{"class":605,"line":679},[603,1225,724],{"emptyLinePlaceholder":723},[603,1227,1228,1230,1232,1235,1237,1239,1241],{"class":605,"line":700},[603,1229,730],{"class":617},[603,1231,646],{"class":609},[603,1233,1234],{"class":649}," textures ",[603,1236,744],{"class":609},[603,1238,747],{"class":609},[603,1240,1211],{"class":750},[603,1242,784],{"class":649},[603,1244,1245,1248,1250,1252],{"class":605,"line":720},[603,1246,1247],{"class":609},"  '",[603,1249,759],{"class":630},[603,1251,756],{"class":609},[603,1253,808],{"class":609},[603,1255,1256,1258,1261,1263],{"class":605,"line":727},[603,1257,1247],{"class":609},[603,1259,1260],{"class":630},"/textures/badge.png",[603,1262,756],{"class":609},[603,1264,808],{"class":609},[603,1266,1267,1269,1272,1274],{"class":605,"line":767},[603,1268,1247],{"class":609},[603,1270,1271],{"class":630},"/textures/sticker.png",[603,1273,756],{"class":609},[603,1275,808],{"class":609},[603,1277,1278],{"class":605,"line":772},[603,1279,930],{"class":649},[603,1281,1282,1284,1286],{"class":605,"line":787},[603,1283,936],{"class":609},[603,1285,614],{"class":613},[603,1287,636],{"class":609},[603,1289,1290],{"class":605,"line":793},[603,1291,724],{"emptyLinePlaceholder":723},[603,1293,1294,1296,1298],{"class":605,"line":811},[603,1295,610],{"class":609},[603,1297,953],{"class":613},[603,1299,636],{"class":609},[603,1301,1302,1304,1306,1308,1310,1312,1314,1316,1318,1320,1322,1324,1326,1328,1331,1333],{"class":605,"line":841},[603,1303,961],{"class":609},[603,1305,49],{"class":613},[603,1307,1083],{"class":617},[603,1309,738],{"class":609},[603,1311,1088],{"class":617},[603,1313,624],{"class":609},[603,1315,627],{"class":609},[603,1317,1095],{"class":649},[603,1319,627],{"class":609},[603,1321,978],{"class":609},[603,1323,1102],{"class":617},[603,1325,624],{"class":609},[603,1327,627],{"class":609},[603,1329,1330],{"class":649},"textures",[603,1332,627],{"class":609},[603,1334,1008],{"class":609},[603,1336,1337,1339,1341],{"class":605,"line":865},[603,1338,936],{"class":609},[603,1340,953],{"class":613},[603,1342,636],{"class":609},[476,1344,1345,1346,541,1349,1351,1352,1355,1356,1358],{},"Each entry references its texture by ",[479,1347,1348],{},"name",[479,1350,481],{}," auto-fills\n",[479,1353,1354],{},"texture.name"," from the URL filename when missing, so JSON ",[479,1357,1102],{},"\nfields round-trip cleanly.",[575,1360,533],{"id":1361},"custom-material",[476,1363,1364,1365,1368,1369,808,1372,1375],{},"The default material is ",[479,1366,1367],{},"MeshBasicMaterial",". Override it via the slot\nto plug in any Three.js material — ",[479,1370,1371],{},"MeshStandardMaterial",[479,1373,1374],{},"MeshPhysicalMaterial",", or a custom shader.",[594,1377,1379],{"className":596,"code":1378,"language":598,"meta":599,"style":599},"\u003CDecal v-model:data=\"decals\" :map=\"texture\">\n  \u003CTresMeshStandardMaterial :transparent=\"true\" :polygon-offset=\"true\" />\n\u003C/Decal>\n",[479,1380,1381,1415,1420],{"__ignoreMap":599},[603,1382,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401,1403,1405,1407,1409,1411,1413],{"class":605,"line":606},[603,1384,610],{"class":609},[603,1386,49],{"class":613},[603,1388,1083],{"class":617},[603,1390,738],{"class":609},[603,1392,1088],{"class":617},[603,1394,624],{"class":609},[603,1396,627],{"class":609},[603,1398,1095],{"class":649},[603,1400,627],{"class":609},[603,1402,978],{"class":609},[603,1404,1102],{"class":617},[603,1406,624],{"class":609},[603,1408,627],{"class":609},[603,1410,1078],{"class":649},[603,1412,627],{"class":609},[603,1414,636],{"class":609},[603,1416,1417],{"class":605,"line":639},[603,1418,1419],{"class":649},"  \u003CTresMeshStandardMaterial :transparent=\"true\" :polygon-offset=\"true\" />\n",[603,1421,1422,1424,1426],{"class":605,"line":679},[603,1423,936],{"class":609},[603,1425,49],{"class":613},[603,1427,636],{"class":609},[1143,1429,1430],{},[476,1431,1432,1433,1436,1437,1440,1441,1436,1444,1447,1448,808,1450,1452],{},"Keep ",[479,1434,1435],{},"transparent: true"," and ",[479,1438,1439],{},"polygonOffset: true"," on any custom\nmaterial, otherwise stacking and alpha handling won't work as expected.\nColor / opacity tint from the editor only applies to materials\nexposing ",[479,1442,1443],{},".color",[479,1445,1446],{},".opacity"," (",[479,1449,1367],{},[479,1451,1371],{},", …) — bespoke shader materials are skipped\nsilently.",[575,1454,1456],{"id":1455},"stacking-decals-z-layering","Stacking decals (z-layering)",[476,1458,1459,1460,1462,1463,1466,1467,527],{},"Each decal has a ",[479,1461,566],{}," controlling its draw order on the parent\nmesh. Higher = on top. The component handles z-fighting via\n",[479,1464,1465],{},"polygonOffset"," automatically — but if you stack many decals near\nparallel surfaces and still see flicker, raise ",[479,1468,1469],{},"layerGap",[569,1471,1472],{},[1473,1474],"abstractions-decal-stacking",{},[594,1476,1478],{"className":596,"code":1477,"language":598,"meta":599,"style":599},"\u003CDecal\n  v-model:data=\"decals\"\n  :map=\"textures\"\n  :layer-gap=\"0.002\"\n/>\n",[479,1479,1480,1487,1505,1520,1536],{"__ignoreMap":599},[603,1481,1482,1484],{"class":605,"line":606},[603,1483,610],{"class":609},[603,1485,1486],{"class":613},"Decal\n",[603,1488,1489,1492,1494,1496,1498,1500,1502],{"class":605,"line":639},[603,1490,1491],{"class":617},"  v-model",[603,1493,738],{"class":609},[603,1495,1088],{"class":617},[603,1497,624],{"class":609},[603,1499,627],{"class":609},[603,1501,1095],{"class":649},[603,1503,1504],{"class":609},"\"\n",[603,1506,1507,1510,1512,1514,1516,1518],{"class":605,"line":679},[603,1508,1509],{"class":609},"  :",[603,1511,1102],{"class":617},[603,1513,624],{"class":609},[603,1515,627],{"class":609},[603,1517,1330],{"class":649},[603,1519,1504],{"class":609},[603,1521,1522,1524,1527,1529,1531,1534],{"class":605,"line":700},[603,1523,1509],{"class":609},[603,1525,1526],{"class":617},"layer-gap",[603,1528,624],{"class":609},[603,1530,627],{"class":609},[603,1532,1533],{"class":822},"0.002",[603,1535,1504],{"class":609},[603,1537,1538],{"class":605,"line":720},[603,1539,1540],{"class":649},"/>\n",[476,1542,1543,1544,1547],{},"zIndex stacks are ",[491,1545,1546],{},"per-mesh"," — two decals on different meshes never\ncompete for the same layer slot.",[575,1549,1551,1552],{"id":1550},"editable-mode-decaldebugui","Editable mode + ",[479,1553,497],{},[476,1555,1556,1557,1560,1561,1563,1564,1567,1568,527],{},"Add the ",[479,1558,1559],{},"editable"," prop to mount the interactive editor, then pair it\nwith ",[479,1562,497],{}," — a full in-canvas editor that ships as a drop-in\nHTML overlay sitting ",[491,1565,1566],{},"outside"," ",[479,1569,1570],{},"\u003CTresCanvas>",[1572,1573,1574,1588,1611],"prose-warning",{},[476,1575,1576,1578,1579,1582,1583,1585,1586,527],{},[479,1577,497],{}," needs its stylesheet — import it ",[491,1580,1581],{},"once"," at your app\nentry. ",[479,1584,481],{}," itself is style-less, so this is only needed when you\nmount ",[479,1587,497],{},[594,1589,1592],{"className":1590,"code":1591,"language":631,"meta":599,"style":599},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// Vite / Vue — in main.ts\nimport '@tresjs/cientos/styles.css'\n",[479,1593,1594,1600],{"__ignoreMap":599},[603,1595,1596],{"class":605,"line":606},[603,1597,1599],{"class":1598},"sHwdD","// Vite / Vue — in main.ts\n",[603,1601,1602,1604,1606,1609],{"class":605,"line":639},[603,1603,643],{"class":642},[603,1605,670],{"class":609},[603,1607,1608],{"class":630},"@tresjs/cientos/styles.css",[603,1610,676],{"class":609},[594,1612,1614],{"className":1590,"code":1613,"language":631,"meta":599,"style":599},"// Nuxt — in nuxt.config.ts\nexport default defineNuxtConfig({\n  css: ['@tresjs/cientos/styles.css'],\n})\n",[479,1615,1616,1621,1637,1656],{"__ignoreMap":599},[603,1617,1618],{"class":605,"line":606},[603,1619,1620],{"class":1598},"// Nuxt — in nuxt.config.ts\n",[603,1622,1623,1626,1629,1632,1634],{"class":605,"line":639},[603,1624,1625],{"class":642},"export",[603,1627,1628],{"class":642}," default",[603,1630,1631],{"class":750}," defineNuxtConfig",[603,1633,753],{"class":649},[603,1635,1636],{"class":609},"{\n",[603,1638,1639,1642,1644,1646,1648,1650,1652,1654],{"class":605,"line":679},[603,1640,1641],{"class":613},"  css",[603,1643,738],{"class":609},[603,1645,819],{"class":649},[603,1647,756],{"class":609},[603,1649,1608],{"class":630},[603,1651,756],{"class":609},[603,1653,836],{"class":649},[603,1655,808],{"class":609},[603,1657,1658,1660],{"class":605,"line":700},[603,1659,744],{"class":609},[603,1661,764],{"class":649},[569,1663,1664],{},[1665,1666],"abstractions-decal-editable",{},[476,1668,1669,1670,1673,1674,1677,1678,527],{},"Three panels: a floating ",[491,1671,1672],{},"handle"," anchored to the editing decal, a\nbottom ",[491,1675,1676],{},"dock"," (texture picker + edit tools), a right-side ",[491,1679,1680],{},"layer\npanel",[484,1682,1683,1693,1698,1704,1717,1722,1727,1733,1739,1745,1751],{},[487,1684,1685,1688,1689,1692],{},[491,1686,1687],{},"Floating handle"," (rotate + scale + snap + live ",[479,1690,1691],{},"scale% · rotation° · L\u003Cn>"," badge)",[487,1694,1695],{},[491,1696,1697],{},"Color tint & opacity",[487,1699,1700,1703],{},[491,1701,1702],{},"Mirror"," (flip X / flip Y)",[487,1705,1706,1447,1709,1712,1713,1716],{},[491,1707,1708],{},"Layer controls",[479,1710,1711],{},"L+"," / ",[479,1714,1715],{},"L-",")",[487,1718,1719],{},[491,1720,1721],{},"Visibility toggle",[487,1723,1724],{},[491,1725,1726],{},"Per-row remove",[487,1728,1729,1732],{},[491,1730,1731],{},"Layer panel"," (mesh-grouped, drag-to-reorder)",[487,1734,1735,1738],{},[491,1736,1737],{},"Texture picker"," (drag or click-to-arm)",[487,1740,1741,1744],{},[491,1742,1743],{},"Mode badge"," (placing / editing status)",[487,1746,1747,1750],{},[491,1748,1749],{},"Undo / Redo"," buttons",[487,1752,1753,1750],{},[491,1754,1755],{},"Import / Export",[594,1757,1759],{"className":596,"code":1758,"language":598,"meta":599,"style":599},"\u003Cscript setup lang=\"ts\">\nimport { Decal, DecalDebugUI, OrbitControls, useTextures } from '@tresjs/cientos'\nimport type { DecalEditorSession, DecalJsonEntry } from '@tresjs/cientos'\nimport { TresCanvas } from '@tresjs/core'\nimport { computed, reactive, shallowRef } from 'vue'\n\nconst { textures } = useTextures(['/textures/a.png', '/textures/b.png'])\n\nconst layout = reactive\u003CRecord\u003Cstring, DecalJsonEntry[]>>({\n  cube: [],\n  sphere: [],\n})\n\nconst decalRef = shallowRef\u003C{ editor: DecalEditorSession } | null>(null)\nconst session = computed(() => decalRef.value?.editor ?? null)\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CDecalDebugUI :session=\"session\" :textures=\"textures ?? []\" :data=\"layout\" />\n\n  \u003CTresCanvas>\n    \u003CTresPerspectiveCamera :position=\"[2, 2, 4]\" />\n    \u003COrbitControls />\n\n    \u003CTresMesh name=\"cube\" :position=\"[-1.2, 0, 0]\">\n      \u003CTresBoxGeometry />\n      \u003CTresMeshStandardMaterial color=\"white\" />\n      \u003CDecal ref=\"decalRef\" v-model:data=\"layout.cube\" :map=\"textures\" editable />\n    \u003C/TresMesh>\n\n    \u003CTresMesh name=\"sphere\" :position=\"[1.2, 0, 0]\">\n      \u003CTresSphereGeometry :args=\"[0.7]\" />\n      \u003CTresMeshStandardMaterial color=\"white\" />\n      \u003CDecal v-model:data=\"layout.sphere\" :map=\"textures\" editable />\n    \u003C/TresMesh>\n  \u003C/TresCanvas>\n\u003C/template>\n",[479,1760,1761,1781,1812,1839,1857,1885,1889,1924,1928,1964,1976,1987,1993,1997,2036,2076,2084,2088,2096,2146,2150,2158,2191,2199,2203,2249,2257,2275,2328,2336,2340,2384,2412,2431,2472,2481,2490],{"__ignoreMap":599},[603,1762,1763,1765,1767,1769,1771,1773,1775,1777,1779],{"class":605,"line":606},[603,1764,610],{"class":609},[603,1766,614],{"class":613},[603,1768,618],{"class":617},[603,1770,621],{"class":617},[603,1772,624],{"class":609},[603,1774,627],{"class":609},[603,1776,631],{"class":630},[603,1778,627],{"class":609},[603,1780,636],{"class":609},[603,1782,1783,1785,1787,1789,1791,1794,1796,1798,1800,1802,1804,1806,1808,1810],{"class":605,"line":639},[603,1784,643],{"class":642},[603,1786,646],{"class":609},[603,1788,650],{"class":649},[603,1790,653],{"class":609},[603,1792,1793],{"class":649}," DecalDebugUI",[603,1795,653],{"class":609},[603,1797,656],{"class":649},[603,1799,653],{"class":609},[603,1801,1211],{"class":649},[603,1803,664],{"class":609},[603,1805,667],{"class":642},[603,1807,670],{"class":609},[603,1809,673],{"class":630},[603,1811,676],{"class":609},[603,1813,1814,1816,1819,1821,1824,1826,1829,1831,1833,1835,1837],{"class":605,"line":679},[603,1815,643],{"class":642},[603,1817,1818],{"class":642}," type",[603,1820,646],{"class":609},[603,1822,1823],{"class":649}," DecalEditorSession",[603,1825,653],{"class":609},[603,1827,1828],{"class":649}," DecalJsonEntry",[603,1830,664],{"class":609},[603,1832,667],{"class":642},[603,1834,670],{"class":609},[603,1836,673],{"class":630},[603,1838,676],{"class":609},[603,1840,1841,1843,1845,1847,1849,1851,1853,1855],{"class":605,"line":700},[603,1842,643],{"class":642},[603,1844,646],{"class":609},[603,1846,686],{"class":649},[603,1848,664],{"class":609},[603,1850,667],{"class":642},[603,1852,670],{"class":609},[603,1854,695],{"class":630},[603,1856,676],{"class":609},[603,1858,1859,1861,1863,1866,1868,1870,1872,1875,1877,1879,1881,1883],{"class":605,"line":720},[603,1860,643],{"class":642},[603,1862,646],{"class":609},[603,1864,1865],{"class":649}," computed",[603,1867,653],{"class":609},[603,1869,707],{"class":649},[603,1871,653],{"class":609},[603,1873,1874],{"class":649}," shallowRef",[603,1876,664],{"class":609},[603,1878,667],{"class":642},[603,1880,670],{"class":609},[603,1882,598],{"class":630},[603,1884,676],{"class":609},[603,1886,1887],{"class":605,"line":727},[603,1888,724],{"emptyLinePlaceholder":723},[603,1890,1891,1893,1895,1897,1899,1901,1903,1906,1908,1911,1913,1915,1917,1920,1922],{"class":605,"line":767},[603,1892,730],{"class":617},[603,1894,646],{"class":609},[603,1896,1234],{"class":649},[603,1898,744],{"class":609},[603,1900,747],{"class":609},[603,1902,1211],{"class":750},[603,1904,1905],{"class":649},"([",[603,1907,756],{"class":609},[603,1909,1910],{"class":630},"/textures/a.png",[603,1912,756],{"class":609},[603,1914,653],{"class":609},[603,1916,670],{"class":609},[603,1918,1919],{"class":630},"/textures/b.png",[603,1921,756],{"class":609},[603,1923,930],{"class":649},[603,1925,1926],{"class":605,"line":772},[603,1927,724],{"emptyLinePlaceholder":723},[603,1929,1930,1932,1935,1937,1939,1941,1945,1947,1950,1952,1954,1957,1960,1962],{"class":605,"line":787},[603,1931,730],{"class":617},[603,1933,1934],{"class":649}," layout ",[603,1936,624],{"class":609},[603,1938,707],{"class":750},[603,1940,610],{"class":609},[603,1942,1944],{"class":1943},"sBMFI","Record",[603,1946,610],{"class":609},[603,1948,1949],{"class":1943},"string",[603,1951,653],{"class":609},[603,1953,1828],{"class":1943},[603,1955,1956],{"class":649},"[]",[603,1958,1959],{"class":609},">>",[603,1961,753],{"class":649},[603,1963,1636],{"class":609},[603,1965,1966,1969,1971,1974],{"class":605,"line":793},[603,1967,1968],{"class":613},"  cube",[603,1970,738],{"class":609},[603,1972,1973],{"class":649}," []",[603,1975,808],{"class":609},[603,1977,1978,1981,1983,1985],{"class":605,"line":811},[603,1979,1980],{"class":613},"  sphere",[603,1982,738],{"class":609},[603,1984,1973],{"class":649},[603,1986,808],{"class":609},[603,1988,1989,1991],{"class":605,"line":841},[603,1990,744],{"class":609},[603,1992,764],{"class":649},[603,1994,1995],{"class":605,"line":865},[603,1996,724],{"emptyLinePlaceholder":723},[603,1998,1999,2001,2004,2006,2008,2011,2014,2016,2018,2020,2023,2026,2029,2031,2034],{"class":605,"line":892},[603,2000,730],{"class":617},[603,2002,2003],{"class":649}," decalRef ",[603,2005,624],{"class":609},[603,2007,1874],{"class":750},[603,2009,2010],{"class":609},"\u003C{",[603,2012,2013],{"class":613}," editor",[603,2015,738],{"class":609},[603,2017,1823],{"class":1943},[603,2019,664],{"class":609},[603,2021,2022],{"class":609}," |",[603,2024,2025],{"class":1943}," null",[603,2027,2028],{"class":609},">",[603,2030,753],{"class":649},[603,2032,2033],{"class":609},"null",[603,2035,764],{"class":649},[603,2037,2038,2040,2043,2045,2047,2049,2052,2055,2058,2060,2063,2066,2069,2072,2074],{"class":605,"line":904},[603,2039,730],{"class":617},[603,2041,2042],{"class":649}," session ",[603,2044,624],{"class":609},[603,2046,1865],{"class":750},[603,2048,753],{"class":649},[603,2050,2051],{"class":609},"()",[603,2053,2054],{"class":617}," =>",[603,2056,2057],{"class":649}," decalRef",[603,2059,527],{"class":609},[603,2061,2062],{"class":649},"value",[603,2064,2065],{"class":609},"?.",[603,2067,2068],{"class":649},"editor ",[603,2070,2071],{"class":609},"??",[603,2073,2025],{"class":609},[603,2075,764],{"class":649},[603,2077,2078,2080,2082],{"class":605,"line":921},[603,2079,936],{"class":609},[603,2081,614],{"class":613},[603,2083,636],{"class":609},[603,2085,2086],{"class":605,"line":927},[603,2087,724],{"emptyLinePlaceholder":723},[603,2089,2090,2092,2094],{"class":605,"line":933},[603,2091,610],{"class":609},[603,2093,953],{"class":613},[603,2095,636],{"class":609},[603,2097,2098,2100,2103,2105,2108,2110,2112,2114,2116,2118,2120,2122,2124,2126,2129,2131,2133,2135,2137,2139,2142,2144],{"class":605,"line":943},[603,2099,961],{"class":609},[603,2101,2102],{"class":613},"DecalDebugUI",[603,2104,978],{"class":609},[603,2106,2107],{"class":617},"session",[603,2109,624],{"class":609},[603,2111,627],{"class":609},[603,2113,2107],{"class":649},[603,2115,627],{"class":609},[603,2117,978],{"class":609},[603,2119,1330],{"class":617},[603,2121,624],{"class":609},[603,2123,627],{"class":609},[603,2125,1330],{"class":649},[603,2127,2128],{"class":609}," ?? []",[603,2130,627],{"class":609},[603,2132,978],{"class":609},[603,2134,1088],{"class":617},[603,2136,624],{"class":609},[603,2138,627],{"class":609},[603,2140,2141],{"class":649},"layout",[603,2143,627],{"class":609},[603,2145,1008],{"class":609},[603,2147,2148],{"class":605,"line":948},[603,2149,724],{"emptyLinePlaceholder":723},[603,2151,2152,2154,2156],{"class":605,"line":958},[603,2153,961],{"class":609},[603,2155,964],{"class":613},[603,2157,636],{"class":609},[603,2159,2160,2162,2164,2166,2168,2170,2172,2174,2176,2178,2180,2182,2185,2187,2189],{"class":605,"line":969},[603,2161,972],{"class":609},[603,2163,975],{"class":613},[603,2165,978],{"class":609},[603,2167,981],{"class":617},[603,2169,624],{"class":609},[603,2171,627],{"class":609},[603,2173,988],{"class":609},[603,2175,991],{"class":822},[603,2177,994],{"class":609},[603,2179,991],{"class":822},[603,2181,994],{"class":609},[603,2183,2184],{"class":822},"4",[603,2186,836],{"class":609},[603,2188,627],{"class":609},[603,2190,1008],{"class":609},[603,2192,2193,2195,2197],{"class":605,"line":1011},[603,2194,972],{"class":609},[603,2196,1016],{"class":613},[603,2198,1008],{"class":609},[603,2200,2201],{"class":605,"line":1021},[603,2202,724],{"emptyLinePlaceholder":723},[603,2204,2205,2207,2209,2212,2214,2216,2219,2221,2223,2225,2227,2229,2232,2235,2237,2239,2241,2243,2245,2247],{"class":605,"line":1031},[603,2206,972],{"class":609},[603,2208,1026],{"class":613},[603,2210,2211],{"class":617}," name",[603,2213,624],{"class":609},[603,2215,627],{"class":609},[603,2217,2218],{"class":630},"cube",[603,2220,627],{"class":609},[603,2222,978],{"class":609},[603,2224,981],{"class":617},[603,2226,624],{"class":609},[603,2228,627],{"class":609},[603,2230,2231],{"class":609},"[-",[603,2233,2234],{"class":822},"1.2",[603,2236,994],{"class":609},[603,2238,823],{"class":822},[603,2240,994],{"class":609},[603,2242,823],{"class":822},[603,2244,836],{"class":609},[603,2246,627],{"class":609},[603,2248,636],{"class":609},[603,2250,2251,2253,2255],{"class":605,"line":1042},[603,2252,1034],{"class":609},[603,2254,1037],{"class":613},[603,2256,1008],{"class":609},[603,2258,2259,2261,2263,2265,2267,2269,2271,2273],{"class":605,"line":1064},[603,2260,1034],{"class":609},[603,2262,1047],{"class":613},[603,2264,1050],{"class":617},[603,2266,624],{"class":609},[603,2268,627],{"class":609},[603,2270,1057],{"class":630},[603,2272,627],{"class":609},[603,2274,1008],{"class":609},[603,2276,2277,2279,2281,2284,2286,2288,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311,2313,2315,2317,2319,2321,2323,2326],{"class":605,"line":1115},[603,2278,1034],{"class":609},[603,2280,49],{"class":613},[603,2282,2283],{"class":617}," ref",[603,2285,624],{"class":609},[603,2287,627],{"class":609},[603,2289,2290],{"class":630},"decalRef",[603,2292,627],{"class":609},[603,2294,1083],{"class":617},[603,2296,738],{"class":609},[603,2298,1088],{"class":617},[603,2300,624],{"class":609},[603,2302,627],{"class":609},[603,2304,2141],{"class":649},[603,2306,527],{"class":609},[603,2308,2218],{"class":649},[603,2310,627],{"class":609},[603,2312,978],{"class":609},[603,2314,1102],{"class":617},[603,2316,624],{"class":609},[603,2318,627],{"class":609},[603,2320,1330],{"class":649},[603,2322,627],{"class":609},[603,2324,2325],{"class":617}," editable",[603,2327,1008],{"class":609},[603,2329,2330,2332,2334],{"class":605,"line":1125},[603,2331,1118],{"class":609},[603,2333,1026],{"class":613},[603,2335,636],{"class":609},[603,2337,2338],{"class":605,"line":1135},[603,2339,724],{"emptyLinePlaceholder":723},[603,2341,2343,2345,2347,2349,2351,2353,2356,2358,2360,2362,2364,2366,2368,2370,2372,2374,2376,2378,2380,2382],{"class":605,"line":2342},31,[603,2344,972],{"class":609},[603,2346,1026],{"class":613},[603,2348,2211],{"class":617},[603,2350,624],{"class":609},[603,2352,627],{"class":609},[603,2354,2355],{"class":630},"sphere",[603,2357,627],{"class":609},[603,2359,978],{"class":609},[603,2361,981],{"class":617},[603,2363,624],{"class":609},[603,2365,627],{"class":609},[603,2367,988],{"class":609},[603,2369,2234],{"class":822},[603,2371,994],{"class":609},[603,2373,823],{"class":822},[603,2375,994],{"class":609},[603,2377,823],{"class":822},[603,2379,836],{"class":609},[603,2381,627],{"class":609},[603,2383,636],{"class":609},[603,2385,2387,2389,2392,2394,2397,2399,2401,2403,2406,2408,2410],{"class":605,"line":2386},32,[603,2388,1034],{"class":609},[603,2390,2391],{"class":613},"TresSphereGeometry",[603,2393,978],{"class":609},[603,2395,2396],{"class":617},"args",[603,2398,624],{"class":609},[603,2400,627],{"class":609},[603,2402,988],{"class":609},[603,2404,2405],{"class":822},"0.7",[603,2407,836],{"class":609},[603,2409,627],{"class":609},[603,2411,1008],{"class":609},[603,2413,2415,2417,2419,2421,2423,2425,2427,2429],{"class":605,"line":2414},33,[603,2416,1034],{"class":609},[603,2418,1047],{"class":613},[603,2420,1050],{"class":617},[603,2422,624],{"class":609},[603,2424,627],{"class":609},[603,2426,1057],{"class":630},[603,2428,627],{"class":609},[603,2430,1008],{"class":609},[603,2432,2434,2436,2438,2440,2442,2444,2446,2448,2450,2452,2454,2456,2458,2460,2462,2464,2466,2468,2470],{"class":605,"line":2433},34,[603,2435,1034],{"class":609},[603,2437,49],{"class":613},[603,2439,1083],{"class":617},[603,2441,738],{"class":609},[603,2443,1088],{"class":617},[603,2445,624],{"class":609},[603,2447,627],{"class":609},[603,2449,2141],{"class":649},[603,2451,527],{"class":609},[603,2453,2355],{"class":649},[603,2455,627],{"class":609},[603,2457,978],{"class":609},[603,2459,1102],{"class":617},[603,2461,624],{"class":609},[603,2463,627],{"class":609},[603,2465,1330],{"class":649},[603,2467,627],{"class":609},[603,2469,2325],{"class":617},[603,2471,1008],{"class":609},[603,2473,2475,2477,2479],{"class":605,"line":2474},35,[603,2476,1118],{"class":609},[603,2478,1026],{"class":613},[603,2480,636],{"class":609},[603,2482,2484,2486,2488],{"class":605,"line":2483},36,[603,2485,1128],{"class":609},[603,2487,964],{"class":613},[603,2489,636],{"class":609},[603,2491,2493,2495,2497],{"class":605,"line":2492},37,[603,2494,936],{"class":609},[603,2496,953],{"class":613},[603,2498,636],{"class":609},[2500,2501,2503],"h3",{"id":2502},"how-the-wiring-works","How the wiring works",[484,2505,2506,2517,2526,2535],{},[487,2507,2508,2511,2512,2514,2515,527],{},[479,2509,2510],{},"v-model:data=\"layout.cube\""," — each ",[479,2513,481],{}," owns one slice of the\nlayout object. The slice's key matches the parent mesh's ",[479,2516,1348],{},[487,2518,2519,2522,2523,2525],{},[479,2520,2521],{},"ref=\"decalRef\""," — grab a reference to any ",[479,2524,481],{}," in the canvas;\nthe session is canvas-shared so it doesn't matter which.",[487,2527,2528,2531,2532,2534],{},[479,2529,2530],{},"session = decalRef.value?.editor"," — the editor session powers\n",[479,2533,497],{},". Pass it through.",[487,2536,2537,2540,2541,2543],{},[479,2538,2539],{},":data=\"layout\""," on ",[479,2542,497],{}," — the full mesh-keyed layout, so\nthe overlay can render the layer panel and route imports back to each\nDecal by name.",[1143,2545,2546],{},[476,2547,2548,2549,2552,2553,2556],{},"The overlay is full-viewport (",[479,2550,2551],{},"position: fixed; inset: 0",") by default.\nWhen embedding inside a bounded stage (docs, modal, sidebar preview),\npass ",[479,2554,2555],{},"contained"," so the overlay positions itself absolutely against\nthe nearest positioned ancestor instead.",[594,2558,2560],{"className":596,"code":2559,"language":598,"meta":599,"style":599},"\u003Cdiv style=\"position: relative; height: 500px;\">\n  \u003CDecalDebugUI contained ... />\n  \u003CTresCanvas>...\u003C/TresCanvas>\n\u003C/div>\n",[479,2561,2562,2601,2606,2611],{"__ignoreMap":599},[603,2563,2564,2566,2569,2572,2574,2576,2579,2581,2584,2587,2590,2592,2595,2597,2599],{"class":605,"line":606},[603,2565,610],{"class":609},[603,2567,2568],{"class":613},"div",[603,2570,2571],{"class":617}," style",[603,2573,624],{"class":609},[603,2575,627],{"class":609},[603,2577,981],{"class":2578},"sqsOY",[603,2580,738],{"class":609},[603,2582,2583],{"class":649}," relative",[603,2585,2586],{"class":609},";",[603,2588,2589],{"class":2578}," height",[603,2591,738],{"class":609},[603,2593,2594],{"class":822}," 500px",[603,2596,2586],{"class":609},[603,2598,627],{"class":609},[603,2600,636],{"class":609},[603,2602,2603],{"class":605,"line":639},[603,2604,2605],{"class":649},"  \u003CDecalDebugUI contained ... />\n",[603,2607,2608],{"class":605,"line":679},[603,2609,2610],{"class":649},"  \u003CTresCanvas>...\u003C/TresCanvas>\n",[603,2612,2613,2615,2617],{"class":605,"line":700},[603,2614,936],{"class":609},[603,2616,2568],{"class":613},[603,2618,636],{"class":609},[575,2620,1755],{"id":2621},"import-export",[476,2623,2624,2625,2628,2629,2631],{},"The Export button in the dock auto-downloads the current layout as\n",[479,2626,2627],{},"decal-layout-YYYY-MM-DD.json",". The Import button opens a file picker;\nthe loaded JSON is sanitised (unknown mesh keys and unknown texture\nnames are dropped with a warning) and routed back through each\n",[479,2630,481],{}," automatically — no extra host code needed.",[594,2633,2635],{"className":596,"code":2634,"language":598,"meta":599,"style":599},"\u003C!-- Custom filename -->\n\u003CDecalDebugUI :export-filename=\"`${sceneName}.json`\" ... />\n\n\u003C!-- Disable the built-in download — handle export yourself -->\n\u003CDecalDebugUI :export-filename=\"null\" @export=\"postToBackend\" ... />\n",[479,2636,2637,2642,2673,2677,2682],{"__ignoreMap":599},[603,2638,2639],{"class":605,"line":606},[603,2640,2641],{"class":1598},"\u003C!-- Custom filename -->\n",[603,2643,2644,2646,2648,2650,2653,2655,2658,2661,2663,2665,2668,2671],{"class":605,"line":639},[603,2645,610],{"class":609},[603,2647,2102],{"class":613},[603,2649,978],{"class":609},[603,2651,2652],{"class":617},"export-filename",[603,2654,624],{"class":609},[603,2656,2657],{"class":609},"\"`${",[603,2659,2660],{"class":649},"sceneName",[603,2662,744],{"class":609},[603,2664,1157],{"class":630},[603,2666,2667],{"class":609},"`\"",[603,2669,2670],{"class":609}," ...",[603,2672,1008],{"class":609},[603,2674,2675],{"class":605,"line":679},[603,2676,724],{"emptyLinePlaceholder":723},[603,2678,2679],{"class":605,"line":700},[603,2680,2681],{"class":1598},"\u003C!-- Disable the built-in download — handle export yourself -->\n",[603,2683,2684,2686,2688,2690,2692,2694,2696,2698,2700,2703,2705,2707,2709,2712,2714,2716],{"class":605,"line":720},[603,2685,610],{"class":609},[603,2687,2102],{"class":613},[603,2689,978],{"class":609},[603,2691,2652],{"class":617},[603,2693,624],{"class":609},[603,2695,627],{"class":609},[603,2697,2033],{"class":609},[603,2699,627],{"class":609},[603,2701,2702],{"class":609}," @",[603,2704,1625],{"class":617},[603,2706,624],{"class":609},[603,2708,627],{"class":609},[603,2710,2711],{"class":649},"postToBackend",[603,2713,627],{"class":609},[603,2715,2670],{"class":609},[603,2717,1008],{"class":609},[575,2719,2721,2722,1716],{"id":2720},"targeting-a-loaded-model-glb","Targeting a loaded model (",[479,2723,2724],{},".glb",[476,2726,2727,2728,2730,2731,2737,2738,2741,2742,2744],{},"A ",[479,2729,481],{}," can be a ",[491,2732,2733,2734],{},"direct child of ",[479,2735,2736],{},"\u003Cprimitive>",". Auto-resolution\nwalks one step up the scene graph and only accepts a ",[479,2739,2740],{},"Mesh"," — so the\nbehaviour depends on what the ",[479,2743,2736],{}," wraps.",[2500,2746,2748,2749,2752,2753],{"id":2747},"when-object-is-a-mesh","When ",[479,2750,2751],{},":object"," is a ",[479,2754,2740],{},[476,2756,2757],{},"The decal auto-resolves the wrapped mesh as its target. This is the\nsimplest option for a single-mesh asset:",[594,2759,2761],{"className":596,"code":2760,"language":598,"meta":599,"style":599},"\u003Cscript setup lang=\"ts\">\nimport { Decal, useGLTF } from '@tresjs/cientos'\n\nconst { nodes } = useGLTF('/models/helmet.glb', { draco: true })\n// nodes.Helmet is a Mesh in this asset.\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cprimitive v-if=\"nodes?.Helmet\" :object=\"nodes.Helmet\">\n    \u003CDecal v-model:data=\"layout.helmet\" :map=\"textures\" editable />\n  \u003C/primitive>\n\u003C/template>\n",[479,2762,2763,2783,2806,2810,2851,2856,2864,2868,2876,2918,2959,2967],{"__ignoreMap":599},[603,2764,2765,2767,2769,2771,2773,2775,2777,2779,2781],{"class":605,"line":606},[603,2766,610],{"class":609},[603,2768,614],{"class":613},[603,2770,618],{"class":617},[603,2772,621],{"class":617},[603,2774,624],{"class":609},[603,2776,627],{"class":609},[603,2778,631],{"class":630},[603,2780,627],{"class":609},[603,2782,636],{"class":609},[603,2784,2785,2787,2789,2791,2793,2796,2798,2800,2802,2804],{"class":605,"line":639},[603,2786,643],{"class":642},[603,2788,646],{"class":609},[603,2790,650],{"class":649},[603,2792,653],{"class":609},[603,2794,2795],{"class":649}," useGLTF",[603,2797,664],{"class":609},[603,2799,667],{"class":642},[603,2801,670],{"class":609},[603,2803,673],{"class":630},[603,2805,676],{"class":609},[603,2807,2808],{"class":605,"line":679},[603,2809,724],{"emptyLinePlaceholder":723},[603,2811,2812,2814,2816,2819,2821,2823,2825,2827,2829,2832,2834,2836,2838,2841,2843,2847,2849],{"class":605,"line":700},[603,2813,730],{"class":617},[603,2815,646],{"class":609},[603,2817,2818],{"class":649}," nodes ",[603,2820,744],{"class":609},[603,2822,747],{"class":609},[603,2824,2795],{"class":750},[603,2826,753],{"class":649},[603,2828,756],{"class":609},[603,2830,2831],{"class":630},"/models/helmet.glb",[603,2833,756],{"class":609},[603,2835,653],{"class":609},[603,2837,646],{"class":609},[603,2839,2840],{"class":613}," draco",[603,2842,738],{"class":609},[603,2844,2846],{"class":2845},"sfNiH"," true",[603,2848,664],{"class":609},[603,2850,764],{"class":649},[603,2852,2853],{"class":605,"line":720},[603,2854,2855],{"class":1598},"// nodes.Helmet is a Mesh in this asset.\n",[603,2857,2858,2860,2862],{"class":605,"line":727},[603,2859,936],{"class":609},[603,2861,614],{"class":613},[603,2863,636],{"class":609},[603,2865,2866],{"class":605,"line":767},[603,2867,724],{"emptyLinePlaceholder":723},[603,2869,2870,2872,2874],{"class":605,"line":772},[603,2871,610],{"class":609},[603,2873,953],{"class":613},[603,2875,636],{"class":609},[603,2877,2878,2880,2883,2885,2887,2889,2892,2894,2897,2899,2901,2904,2906,2908,2910,2912,2914,2916],{"class":605,"line":787},[603,2879,961],{"class":609},[603,2881,2882],{"class":613},"primitive",[603,2884,1071],{"class":642},[603,2886,624],{"class":609},[603,2888,627],{"class":609},[603,2890,2891],{"class":649},"nodes",[603,2893,2065],{"class":609},[603,2895,2896],{"class":649},"Helmet",[603,2898,627],{"class":609},[603,2900,978],{"class":609},[603,2902,2903],{"class":617},"object",[603,2905,624],{"class":609},[603,2907,627],{"class":609},[603,2909,2891],{"class":649},[603,2911,527],{"class":609},[603,2913,2896],{"class":649},[603,2915,627],{"class":609},[603,2917,636],{"class":609},[603,2919,2920,2922,2924,2926,2928,2930,2932,2934,2936,2938,2941,2943,2945,2947,2949,2951,2953,2955,2957],{"class":605,"line":793},[603,2921,972],{"class":609},[603,2923,49],{"class":613},[603,2925,1083],{"class":617},[603,2927,738],{"class":609},[603,2929,1088],{"class":617},[603,2931,624],{"class":609},[603,2933,627],{"class":609},[603,2935,2141],{"class":649},[603,2937,527],{"class":609},[603,2939,2940],{"class":649},"helmet",[603,2942,627],{"class":609},[603,2944,978],{"class":609},[603,2946,1102],{"class":617},[603,2948,624],{"class":609},[603,2950,627],{"class":609},[603,2952,1330],{"class":649},[603,2954,627],{"class":609},[603,2956,2325],{"class":617},[603,2958,1008],{"class":609},[603,2960,2961,2963,2965],{"class":605,"line":811},[603,2962,1128],{"class":609},[603,2964,2882],{"class":613},[603,2966,636],{"class":609},[603,2968,2969,2971,2973],{"class":605,"line":841},[603,2970,936],{"class":609},[603,2972,953],{"class":613},[603,2974,636],{"class":609},[1143,2976,2977],{},[476,2978,2979,2980,2982,2983,2986],{},"The resolved parent is the ",[479,2981,2736],{},"'s retargeting proxy rather than\nthe raw object. This is transparent in practice — geometry, ",[479,2984,2985],{},"matrixWorld","\nand raycasting all forward to the wrapped object — so the decal projects\nand follows transforms correctly.",[2500,2988,2748,2990,2752,2992],{"id":2989},"when-object-is-a-group",[479,2991,2751],{},[479,2993,2994],{},"Group",[476,2996,2997,2998,3000,3001,3003,3004,3006,3007,738],{},"A named node in a ",[479,2999,2724],{}," is often a ",[479,3002,2994],{}," containing several child\nmeshes (e.g. a ceramic body + a metallic interior). Auto-resolution\nreturns ",[479,3005,2033],{}," in that case and the decal silently does nothing — pass\nthe actual target child via ",[479,3008,3009],{},":mesh",[594,3011,3013],{"className":596,"code":3012,"language":598,"meta":599,"style":599},"\u003Cscript setup lang=\"ts\">\nimport { Decal, useGLTF } from '@tresjs/cientos'\nimport { computed } from 'vue'\nimport type { Mesh } from 'three'\n\nconst { nodes } = useGLTF('/models/mug.glb', { draco: true })\n// nodes.Mug is a Group — pick the child you want to decal.\nconst body = computed\u003CMesh | null>(\n  () => (nodes.value?.Mug?.getObjectByName('Body') as Mesh) ?? null,\n)\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cprimitive v-if=\"nodes?.Mug\" :object=\"nodes.Mug\">\n    \u003CDecal v-model:data=\"layout.mug\" :map=\"textures\" :mesh=\"body\" editable />\n  \u003C/primitive>\n\u003C/template>\n",[479,3014,3015,3035,3057,3075,3097,3101,3138,3143,3167,3215,3219,3227,3231,3239,3277,3332,3340],{"__ignoreMap":599},[603,3016,3017,3019,3021,3023,3025,3027,3029,3031,3033],{"class":605,"line":606},[603,3018,610],{"class":609},[603,3020,614],{"class":613},[603,3022,618],{"class":617},[603,3024,621],{"class":617},[603,3026,624],{"class":609},[603,3028,627],{"class":609},[603,3030,631],{"class":630},[603,3032,627],{"class":609},[603,3034,636],{"class":609},[603,3036,3037,3039,3041,3043,3045,3047,3049,3051,3053,3055],{"class":605,"line":639},[603,3038,643],{"class":642},[603,3040,646],{"class":609},[603,3042,650],{"class":649},[603,3044,653],{"class":609},[603,3046,2795],{"class":649},[603,3048,664],{"class":609},[603,3050,667],{"class":642},[603,3052,670],{"class":609},[603,3054,673],{"class":630},[603,3056,676],{"class":609},[603,3058,3059,3061,3063,3065,3067,3069,3071,3073],{"class":605,"line":679},[603,3060,643],{"class":642},[603,3062,646],{"class":609},[603,3064,1865],{"class":649},[603,3066,664],{"class":609},[603,3068,667],{"class":642},[603,3070,670],{"class":609},[603,3072,598],{"class":630},[603,3074,676],{"class":609},[603,3076,3077,3079,3081,3083,3086,3088,3090,3092,3095],{"class":605,"line":700},[603,3078,643],{"class":642},[603,3080,1818],{"class":642},[603,3082,646],{"class":609},[603,3084,3085],{"class":649}," Mesh",[603,3087,664],{"class":609},[603,3089,667],{"class":642},[603,3091,670],{"class":609},[603,3093,3094],{"class":630},"three",[603,3096,676],{"class":609},[603,3098,3099],{"class":605,"line":720},[603,3100,724],{"emptyLinePlaceholder":723},[603,3102,3103,3105,3107,3109,3111,3113,3115,3117,3119,3122,3124,3126,3128,3130,3132,3134,3136],{"class":605,"line":727},[603,3104,730],{"class":617},[603,3106,646],{"class":609},[603,3108,2818],{"class":649},[603,3110,744],{"class":609},[603,3112,747],{"class":609},[603,3114,2795],{"class":750},[603,3116,753],{"class":649},[603,3118,756],{"class":609},[603,3120,3121],{"class":630},"/models/mug.glb",[603,3123,756],{"class":609},[603,3125,653],{"class":609},[603,3127,646],{"class":609},[603,3129,2840],{"class":613},[603,3131,738],{"class":609},[603,3133,2846],{"class":2845},[603,3135,664],{"class":609},[603,3137,764],{"class":649},[603,3139,3140],{"class":605,"line":767},[603,3141,3142],{"class":1598},"// nodes.Mug is a Group — pick the child you want to decal.\n",[603,3144,3145,3147,3150,3152,3154,3156,3158,3160,3162,3164],{"class":605,"line":772},[603,3146,730],{"class":617},[603,3148,3149],{"class":649}," body ",[603,3151,624],{"class":609},[603,3153,1865],{"class":750},[603,3155,610],{"class":609},[603,3157,2740],{"class":1943},[603,3159,2022],{"class":609},[603,3161,2025],{"class":1943},[603,3163,2028],{"class":609},[603,3165,3166],{"class":649},"(\n",[603,3168,3169,3172,3174,3177,3179,3181,3183,3186,3188,3191,3193,3195,3198,3200,3203,3206,3208,3210,3212],{"class":605,"line":787},[603,3170,3171],{"class":609},"  ()",[603,3173,2054],{"class":617},[603,3175,3176],{"class":649}," (nodes",[603,3178,527],{"class":609},[603,3180,2062],{"class":649},[603,3182,2065],{"class":609},[603,3184,3185],{"class":649},"Mug",[603,3187,2065],{"class":609},[603,3189,3190],{"class":750},"getObjectByName",[603,3192,753],{"class":649},[603,3194,756],{"class":609},[603,3196,3197],{"class":630},"Body",[603,3199,756],{"class":609},[603,3201,3202],{"class":649},") ",[603,3204,3205],{"class":642},"as",[603,3207,3085],{"class":1943},[603,3209,3202],{"class":649},[603,3211,2071],{"class":609},[603,3213,3214],{"class":609}," null,\n",[603,3216,3217],{"class":605,"line":793},[603,3218,764],{"class":649},[603,3220,3221,3223,3225],{"class":605,"line":811},[603,3222,936],{"class":609},[603,3224,614],{"class":613},[603,3226,636],{"class":609},[603,3228,3229],{"class":605,"line":841},[603,3230,724],{"emptyLinePlaceholder":723},[603,3232,3233,3235,3237],{"class":605,"line":865},[603,3234,610],{"class":609},[603,3236,953],{"class":613},[603,3238,636],{"class":609},[603,3240,3241,3243,3245,3247,3249,3251,3253,3255,3257,3259,3261,3263,3265,3267,3269,3271,3273,3275],{"class":605,"line":892},[603,3242,961],{"class":609},[603,3244,2882],{"class":613},[603,3246,1071],{"class":642},[603,3248,624],{"class":609},[603,3250,627],{"class":609},[603,3252,2891],{"class":649},[603,3254,2065],{"class":609},[603,3256,3185],{"class":649},[603,3258,627],{"class":609},[603,3260,978],{"class":609},[603,3262,2903],{"class":617},[603,3264,624],{"class":609},[603,3266,627],{"class":609},[603,3268,2891],{"class":649},[603,3270,527],{"class":609},[603,3272,3185],{"class":649},[603,3274,627],{"class":609},[603,3276,636],{"class":609},[603,3278,3279,3281,3283,3285,3287,3289,3291,3293,3295,3297,3300,3302,3304,3306,3308,3310,3312,3314,3316,3319,3321,3323,3326,3328,3330],{"class":605,"line":904},[603,3280,972],{"class":609},[603,3282,49],{"class":613},[603,3284,1083],{"class":617},[603,3286,738],{"class":609},[603,3288,1088],{"class":617},[603,3290,624],{"class":609},[603,3292,627],{"class":609},[603,3294,2141],{"class":649},[603,3296,527],{"class":609},[603,3298,3299],{"class":649},"mug",[603,3301,627],{"class":609},[603,3303,978],{"class":609},[603,3305,1102],{"class":617},[603,3307,624],{"class":609},[603,3309,627],{"class":609},[603,3311,1330],{"class":649},[603,3313,627],{"class":609},[603,3315,978],{"class":609},[603,3317,3318],{"class":617},"mesh",[603,3320,624],{"class":609},[603,3322,627],{"class":609},[603,3324,3325],{"class":649},"body",[603,3327,627],{"class":609},[603,3329,2325],{"class":617},[603,3331,1008],{"class":609},[603,3333,3334,3336,3338],{"class":605,"line":921},[603,3335,1128],{"class":609},[603,3337,2882],{"class":613},[603,3339,636],{"class":609},[603,3341,3342,3344,3346],{"class":605,"line":927},[603,3343,936],{"class":609},[603,3345,953],{"class":613},[603,3347,636],{"class":609},[2500,3349,3351],{"id":3350},"targeting-an-extracted-sub-mesh","Targeting an extracted sub-mesh",[476,3353,3354,3355,3361,3362,3370,3371,3373,3374,738],{},"Alternatively, ",[491,3356,3357,3358,3360],{},"wrap a ",[479,3359,586],{}," around an extracted sub-mesh",". Reach\nfor this when you need to target one named sub-mesh of a larger model (and\nkeep its material): use\n",[506,3363,3367],{"href":3364,"rel":3365},"https://docs.tresjs.org/api/composables.html#usegraph",[3366],"nofollow",[479,3368,3369],{},"useGraph"," to\npull the sub-mesh, then build a regular ",[479,3372,586],{}," around its\n",[479,3375,3376],{},":geometry",[594,3378,3380],{"className":596,"code":3379,"language":598,"meta":599,"style":599},"\u003Cscript setup lang=\"ts\">\nimport { useGraph, useLoader } from '@tresjs/core'\nimport { Decal } from '@tresjs/cientos'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'\nimport { computed } from 'vue'\n\nconst { state: model } = useLoader(GLTFLoader, '/models/helmet.glb')\nconst scene = computed(() => model.value?.scene)\nconst graph = useGraph(scene)\nconst nodes = computed(() => graph.value?.nodes)\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CTresMesh\n    v-if=\"nodes?.Helmet.geometry\"\n    name=\"helmet\"\n    :geometry=\"nodes.Helmet.geometry\"\n  >\n    \u003Cprimitive :object=\"nodes.Helmet.material\" attach=\"material\" />\n    \u003CDecal v-model:data=\"layout.helmet\" :map=\"textures\" editable />\n  \u003C/TresMesh>\n\u003C/template>\n",[479,3381,3382,3402,3426,3444,3464,3482,3486,3518,3547,3561,3589,3597,3601,3609,3616,3638,3651,3674,3679,3719,3759,3767],{"__ignoreMap":599},[603,3383,3384,3386,3388,3390,3392,3394,3396,3398,3400],{"class":605,"line":606},[603,3385,610],{"class":609},[603,3387,614],{"class":613},[603,3389,618],{"class":617},[603,3391,621],{"class":617},[603,3393,624],{"class":609},[603,3395,627],{"class":609},[603,3397,631],{"class":630},[603,3399,627],{"class":609},[603,3401,636],{"class":609},[603,3403,3404,3406,3408,3411,3413,3416,3418,3420,3422,3424],{"class":605,"line":639},[603,3405,643],{"class":642},[603,3407,646],{"class":609},[603,3409,3410],{"class":649}," useGraph",[603,3412,653],{"class":609},[603,3414,3415],{"class":649}," useLoader",[603,3417,664],{"class":609},[603,3419,667],{"class":642},[603,3421,670],{"class":609},[603,3423,695],{"class":630},[603,3425,676],{"class":609},[603,3427,3428,3430,3432,3434,3436,3438,3440,3442],{"class":605,"line":679},[603,3429,643],{"class":642},[603,3431,646],{"class":609},[603,3433,650],{"class":649},[603,3435,664],{"class":609},[603,3437,667],{"class":642},[603,3439,670],{"class":609},[603,3441,673],{"class":630},[603,3443,676],{"class":609},[603,3445,3446,3448,3450,3453,3455,3457,3459,3462],{"class":605,"line":700},[603,3447,643],{"class":642},[603,3449,646],{"class":609},[603,3451,3452],{"class":649}," GLTFLoader",[603,3454,664],{"class":609},[603,3456,667],{"class":642},[603,3458,670],{"class":609},[603,3460,3461],{"class":630},"three/examples/jsm/loaders/GLTFLoader.js",[603,3463,676],{"class":609},[603,3465,3466,3468,3470,3472,3474,3476,3478,3480],{"class":605,"line":720},[603,3467,643],{"class":642},[603,3469,646],{"class":609},[603,3471,1865],{"class":649},[603,3473,664],{"class":609},[603,3475,667],{"class":642},[603,3477,670],{"class":609},[603,3479,598],{"class":630},[603,3481,676],{"class":609},[603,3483,3484],{"class":605,"line":727},[603,3485,724],{"emptyLinePlaceholder":723},[603,3487,3488,3490,3492,3494,3496,3499,3501,3503,3505,3508,3510,3512,3514,3516],{"class":605,"line":767},[603,3489,730],{"class":617},[603,3491,646],{"class":609},[603,3493,735],{"class":613},[603,3495,738],{"class":609},[603,3497,3498],{"class":649}," model ",[603,3500,744],{"class":609},[603,3502,747],{"class":609},[603,3504,3415],{"class":750},[603,3506,3507],{"class":649},"(GLTFLoader",[603,3509,653],{"class":609},[603,3511,670],{"class":609},[603,3513,2831],{"class":630},[603,3515,756],{"class":609},[603,3517,764],{"class":649},[603,3519,3520,3522,3525,3527,3529,3531,3533,3535,3538,3540,3542,3544],{"class":605,"line":772},[603,3521,730],{"class":617},[603,3523,3524],{"class":649}," scene ",[603,3526,624],{"class":609},[603,3528,1865],{"class":750},[603,3530,753],{"class":649},[603,3532,2051],{"class":609},[603,3534,2054],{"class":617},[603,3536,3537],{"class":649}," model",[603,3539,527],{"class":609},[603,3541,2062],{"class":649},[603,3543,2065],{"class":609},[603,3545,3546],{"class":649},"scene)\n",[603,3548,3549,3551,3554,3556,3558],{"class":605,"line":787},[603,3550,730],{"class":617},[603,3552,3553],{"class":649}," graph ",[603,3555,624],{"class":609},[603,3557,3410],{"class":750},[603,3559,3560],{"class":649},"(scene)\n",[603,3562,3563,3565,3567,3569,3571,3573,3575,3577,3580,3582,3584,3586],{"class":605,"line":793},[603,3564,730],{"class":617},[603,3566,2818],{"class":649},[603,3568,624],{"class":609},[603,3570,1865],{"class":750},[603,3572,753],{"class":649},[603,3574,2051],{"class":609},[603,3576,2054],{"class":617},[603,3578,3579],{"class":649}," graph",[603,3581,527],{"class":609},[603,3583,2062],{"class":649},[603,3585,2065],{"class":609},[603,3587,3588],{"class":649},"nodes)\n",[603,3590,3591,3593,3595],{"class":605,"line":811},[603,3592,936],{"class":609},[603,3594,614],{"class":613},[603,3596,636],{"class":609},[603,3598,3599],{"class":605,"line":841},[603,3600,724],{"emptyLinePlaceholder":723},[603,3602,3603,3605,3607],{"class":605,"line":865},[603,3604,610],{"class":609},[603,3606,953],{"class":613},[603,3608,636],{"class":609},[603,3610,3611,3613],{"class":605,"line":892},[603,3612,961],{"class":609},[603,3614,3615],{"class":613},"TresMesh\n",[603,3617,3618,3621,3623,3625,3627,3629,3631,3633,3636],{"class":605,"line":904},[603,3619,3620],{"class":642},"    v-if",[603,3622,624],{"class":609},[603,3624,627],{"class":609},[603,3626,2891],{"class":649},[603,3628,2065],{"class":609},[603,3630,2896],{"class":649},[603,3632,527],{"class":609},[603,3634,3635],{"class":649},"geometry",[603,3637,1504],{"class":609},[603,3639,3640,3643,3645,3647,3649],{"class":605,"line":921},[603,3641,3642],{"class":617},"    name",[603,3644,624],{"class":609},[603,3646,627],{"class":609},[603,3648,2940],{"class":630},[603,3650,1504],{"class":609},[603,3652,3653,3656,3658,3660,3662,3664,3666,3668,3670,3672],{"class":605,"line":927},[603,3654,3655],{"class":609},"    :",[603,3657,3635],{"class":617},[603,3659,624],{"class":609},[603,3661,627],{"class":609},[603,3663,2891],{"class":649},[603,3665,527],{"class":609},[603,3667,2896],{"class":649},[603,3669,527],{"class":609},[603,3671,3635],{"class":649},[603,3673,1504],{"class":609},[603,3675,3676],{"class":605,"line":933},[603,3677,3678],{"class":609},"  >\n",[603,3680,3681,3683,3685,3687,3689,3691,3693,3695,3697,3699,3701,3704,3706,3709,3711,3713,3715,3717],{"class":605,"line":943},[603,3682,972],{"class":609},[603,3684,2882],{"class":613},[603,3686,978],{"class":609},[603,3688,2903],{"class":617},[603,3690,624],{"class":609},[603,3692,627],{"class":609},[603,3694,2891],{"class":649},[603,3696,527],{"class":609},[603,3698,2896],{"class":649},[603,3700,527],{"class":609},[603,3702,3703],{"class":649},"material",[603,3705,627],{"class":609},[603,3707,3708],{"class":617}," attach",[603,3710,624],{"class":609},[603,3712,627],{"class":609},[603,3714,3703],{"class":630},[603,3716,627],{"class":609},[603,3718,1008],{"class":609},[603,3720,3721,3723,3725,3727,3729,3731,3733,3735,3737,3739,3741,3743,3745,3747,3749,3751,3753,3755,3757],{"class":605,"line":948},[603,3722,972],{"class":609},[603,3724,49],{"class":613},[603,3726,1083],{"class":617},[603,3728,738],{"class":609},[603,3730,1088],{"class":617},[603,3732,624],{"class":609},[603,3734,627],{"class":609},[603,3736,2141],{"class":649},[603,3738,527],{"class":609},[603,3740,2940],{"class":649},[603,3742,627],{"class":609},[603,3744,978],{"class":609},[603,3746,1102],{"class":617},[603,3748,624],{"class":609},[603,3750,627],{"class":609},[603,3752,1330],{"class":649},[603,3754,627],{"class":609},[603,3756,2325],{"class":617},[603,3758,1008],{"class":609},[603,3760,3761,3763,3765],{"class":605,"line":958},[603,3762,1128],{"class":609},[603,3764,1026],{"class":613},[603,3766,636],{"class":609},[603,3768,3769,3771,3773],{"class":605,"line":969},[603,3770,936],{"class":609},[603,3772,953],{"class":613},[603,3774,636],{"class":609},[476,3776,3777,3778,1436,3780,3782,3783,3785,3786,3788],{},"The mesh's ",[479,3779,3635],{},[479,3781,3703],{}," come from the loaded model; the\n",[479,3784,481],{}," lives inside a regular ",[479,3787,586],{}," with a clean scene-graph\nparent.",[1572,3790,3791],{},[476,3792,3793,3794,3796,3797,3800,3801,3804,3805,3808],{},"A saved decal's ",[479,3795,981],{}," is stored in ",[491,3798,3799],{},"world space",", so it is\nre-projected onto the parent using the parent's transform ",[491,3802,3803],{},"at load\ntime",". A persisted layout therefore only round-trips if the parent sits\nat the same transform it had when the decal was authored. Parents under a\ncontinuously- or randomly-animated wrapper (e.g. ",[479,3806,3807],{},"\u003CLevioso>",", which starts\nat a random phase each reload) move out from under the saved point, so the\nprojection clips to nothing and the decal vanishes. Author and persist\ndecals on parents whose transform is deterministic at load time, or apply\nthe animation only after the layout has mounted.",[575,3810,3812],{"id":3811},"json-schema","JSON schema",[476,3814,3815,3816,3818,3819,3822,3823,3825,3826,527],{},"Each entry in the ",[479,3817,1088],{}," array follows the ",[479,3820,3821],{},"DecalJsonEntry"," shape; the\nlayout passed to ",[479,3824,497],{}," groups these by mesh name as\n",[479,3827,3828],{},"DecalLayout = Record\u003Cstring, DecalJsonEntry[]>",[3830,3831,3832,3833,3837],"details",{},"\n  ",[3834,3835,3836],"summary",{},"Full schema",[594,3838,3840],{"className":1590,"code":3839,"language":631,"meta":599,"style":599},"interface DecalJsonEntry {\n  id: string // stable UUID\n  position: [number, number, number] // target-mesh local space (raycast hit, baked into the parent's frame)\n  orientation: [number, number, number] // Euler XYZ\n  size: [number, number, number] // extents along X/Y; Z = projection depth\n  zIndex: number // per-mesh layer order, ≥ 0\n  map: string | null // matches a texture's .name\n  flipX?: boolean // omitted when false\n  flipY?: boolean // omitted when false\n  color?: string // hex (e.g. '#ff6b35'), omitted when no tint\n  opacity?: number // 0..1, omitted when 1\n  visible?: boolean // omitted when true; false hides the decal\n}\n\ntype DecalLayout = Record\u003Cstring, DecalJsonEntry[]>\n// { sphere: [...], cube: [...] }\n",[479,3841,3842,3852,3865,3892,3916,3940,3952,3968,3982,3993,4005,4017,4029,4034,4038,4063],{"__ignoreMap":599},[603,3843,3844,3847,3849],{"class":605,"line":606},[603,3845,3846],{"class":617},"interface",[603,3848,1828],{"class":1943},[603,3850,3851],{"class":609}," {\n",[603,3853,3854,3857,3859,3862],{"class":605,"line":639},[603,3855,3856],{"class":613},"  id",[603,3858,738],{"class":609},[603,3860,3861],{"class":1943}," string",[603,3863,3864],{"class":1598}," // stable UUID\n",[603,3866,3867,3870,3872,3874,3877,3879,3882,3884,3886,3889],{"class":605,"line":679},[603,3868,3869],{"class":613},"  position",[603,3871,738],{"class":609},[603,3873,819],{"class":649},[603,3875,3876],{"class":1943},"number",[603,3878,653],{"class":609},[603,3880,3881],{"class":1943}," number",[603,3883,653],{"class":609},[603,3885,3881],{"class":1943},[603,3887,3888],{"class":649},"] ",[603,3890,3891],{"class":1598},"// target-mesh local space (raycast hit, baked into the parent's frame)\n",[603,3893,3894,3897,3899,3901,3903,3905,3907,3909,3911,3913],{"class":605,"line":700},[603,3895,3896],{"class":613},"  orientation",[603,3898,738],{"class":609},[603,3900,819],{"class":649},[603,3902,3876],{"class":1943},[603,3904,653],{"class":609},[603,3906,3881],{"class":1943},[603,3908,653],{"class":609},[603,3910,3881],{"class":1943},[603,3912,3888],{"class":649},[603,3914,3915],{"class":1598},"// Euler XYZ\n",[603,3917,3918,3921,3923,3925,3927,3929,3931,3933,3935,3937],{"class":605,"line":720},[603,3919,3920],{"class":613},"  size",[603,3922,738],{"class":609},[603,3924,819],{"class":649},[603,3926,3876],{"class":1943},[603,3928,653],{"class":609},[603,3930,3881],{"class":1943},[603,3932,653],{"class":609},[603,3934,3881],{"class":1943},[603,3936,3888],{"class":649},[603,3938,3939],{"class":1598},"// extents along X/Y; Z = projection depth\n",[603,3941,3942,3945,3947,3949],{"class":605,"line":727},[603,3943,3944],{"class":613},"  zIndex",[603,3946,738],{"class":609},[603,3948,3881],{"class":1943},[603,3950,3951],{"class":1598}," // per-mesh layer order, ≥ 0\n",[603,3953,3954,3957,3959,3961,3963,3965],{"class":605,"line":767},[603,3955,3956],{"class":613},"  map",[603,3958,738],{"class":609},[603,3960,3861],{"class":1943},[603,3962,2022],{"class":609},[603,3964,2025],{"class":1943},[603,3966,3967],{"class":1598}," // matches a texture's .name\n",[603,3969,3970,3973,3976,3979],{"class":605,"line":772},[603,3971,3972],{"class":613},"  flipX",[603,3974,3975],{"class":609},"?:",[603,3977,3978],{"class":1943}," boolean",[603,3980,3981],{"class":1598}," // omitted when false\n",[603,3983,3984,3987,3989,3991],{"class":605,"line":787},[603,3985,3986],{"class":613},"  flipY",[603,3988,3975],{"class":609},[603,3990,3978],{"class":1943},[603,3992,3981],{"class":1598},[603,3994,3995,3998,4000,4002],{"class":605,"line":793},[603,3996,3997],{"class":613},"  color",[603,3999,3975],{"class":609},[603,4001,3861],{"class":1943},[603,4003,4004],{"class":1598}," // hex (e.g. '#ff6b35'), omitted when no tint\n",[603,4006,4007,4010,4012,4014],{"class":605,"line":811},[603,4008,4009],{"class":613},"  opacity",[603,4011,3975],{"class":609},[603,4013,3881],{"class":1943},[603,4015,4016],{"class":1598}," // 0..1, omitted when 1\n",[603,4018,4019,4022,4024,4026],{"class":605,"line":841},[603,4020,4021],{"class":613},"  visible",[603,4023,3975],{"class":609},[603,4025,3978],{"class":1943},[603,4027,4028],{"class":1598}," // omitted when true; false hides the decal\n",[603,4030,4031],{"class":605,"line":865},[603,4032,4033],{"class":609},"}\n",[603,4035,4036],{"class":605,"line":892},[603,4037,724],{"emptyLinePlaceholder":723},[603,4039,4040,4043,4046,4048,4051,4053,4055,4057,4059,4061],{"class":605,"line":904},[603,4041,4042],{"class":617},"type",[603,4044,4045],{"class":1943}," DecalLayout",[603,4047,747],{"class":609},[603,4049,4050],{"class":1943}," Record",[603,4052,610],{"class":609},[603,4054,1949],{"class":1943},[603,4056,653],{"class":609},[603,4058,1828],{"class":1943},[603,4060,1956],{"class":649},[603,4062,636],{"class":609},[603,4064,4065],{"class":605,"line":921},[603,4066,4067],{"class":1598},"// { sphere: [...], cube: [...] }\n",[575,4069,4071,4073],{"id":4070},"decal-props",[479,4072,481],{}," props",[4075,4076,4077,4093],"table",{},[4078,4079,4080],"thead",{},[4081,4082,4083,4087,4090],"tr",{},[4084,4085,4086],"th",{},"Prop",[4084,4088,4089],{},"Description",[4084,4091,4092],{},"Default",[4094,4095,4096,4113,4133,4169,4189,4204,4219,4239,4267],"tbody",{},[4081,4097,4098,4103,4109],{},[4099,4100,4101],"td",{},[491,4102,1088],{},[4099,4104,4105,4106,4108],{},"Two-way list of stamped decals (use with ",[479,4107,544],{},").",[4099,4110,4111],{},[479,4112,1956],{},[4081,4114,4115,4119,4129],{},[4099,4116,4117],{},[491,4118,1102],{},[4099,4120,4121,4122,4124,4125,4128],{},"A single ",[479,4123,522],{}," or array of ",[479,4126,4127],{},"Texture[]",". With multiple, the editor lets the user cycle through them as a palette.",[4099,4130,4131],{},[479,4132,2033],{},[4081,4134,4135,4139,4165],{},[4099,4136,4137],{},[491,4138,3318],{},[4099,4140,4141,4142,4144,4145,4148,4149,4151,4152,4155,4156,1712,4158,1712,4161,4164],{},"Optional explicit target mesh (",[479,4143,2740],{}," or ",[479,4146,4147],{},"ShallowRef\u003CMesh>","). When omitted, the scene-graph parent of ",[479,4150,481],{}," is auto-resolved via a hidden anchor ",[479,4153,4154],{},"\u003CTresGroup>",". The decal mesh is imperatively parented to the target so it follows the target's runtime ",[479,4157,981],{},[479,4159,4160],{},"rotation",[479,4162,4163],{},"scale"," via the scene-graph hierarchy.",[4099,4166,4167],{},[479,4168,2033],{},[4081,4170,4171,4175,4184],{},[4099,4172,4173],{},[491,4174,1559],{},[4099,4176,2748,4177,4180,4181,4183],{},[479,4178,4179],{},"true",", mounts the interactive editor (raycast, hover, click-to-place, drag-from-thumbnail). Required for ",[479,4182,497],{}," interactions to work on this Decal.",[4099,4185,4186],{},[479,4187,4188],{},"false",[4081,4190,4191,4196,4199],{},[4099,4192,4193],{},[491,4194,4195],{},"baseSize",[4099,4197,4198],{},"Reference size used to derive each decal's size from the texture aspect ratio.",[4099,4200,4201],{},[479,4202,4203],{},"1",[4081,4205,4206,4211,4214],{},[4099,4207,4208],{},[491,4209,4210],{},"baseOffset",[4099,4212,4213],{},"Distance along the surface normal (parent units) to avoid z-fighting between the decal and the host mesh.",[4099,4215,4216],{},[479,4217,4218],{},"0.01",[4081,4220,4221,4225,4234],{},[4099,4222,4223],{},[491,4224,1469],{},[4099,4226,4227,4228,4230,4231,4233],{},"Extra offset added per ",[479,4229,566],{}," step on top of ",[479,4232,4210],{},". Increase if stacked decals still flicker.",[4099,4235,4236],{},[479,4237,4238],{},"0.001",[4081,4240,4241,4246,4262],{},[4099,4242,4243],{},[491,4244,4245],{},"cullThreshold",[4099,4247,4248,4249,4252,4253,4258,4259,4261],{},"Drops projected triangles whose face normal makes an angle steeper than ",[479,4250,4251],{},"acos(threshold)"," with the projector. Mitigates ",[506,4254,4257],{"href":4255,"rel":4256},"https://github.com/mrdoob/three.js/issues/21187",[3366],"#21187",". Pass ",[479,4260,823],{}," to disable.",[4099,4263,4264],{},[479,4265,4266],{},"0.2",[4081,4268,4269,4274,4277],{},[4099,4270,4271],{},[491,4272,4273],{},"edgeColor",[4099,4275,4276],{},"Color of the edge outline drawn around a decal while it is hovered (pointer or layer panel) in editable mode.",[4099,4278,4279],{},[479,4280,4281],{},"#0000ff",[575,4283,4285,4287],{"id":4284},"decal-events",[479,4286,481],{}," events",[4075,4289,4290,4302],{},[4078,4291,4292],{},[4081,4293,4294,4297,4300],{},[4084,4295,4296],{},"Event",[4084,4298,4299],{},"Payload",[4084,4301,4089],{},[4094,4303,4304,4319,4334,4348,4368,4386,4403],{},[4081,4305,4306,4311,4316],{},[4099,4307,4308],{},[479,4309,4310],{},"update:data",[4099,4312,4313],{},[479,4314,4315],{},"DecalJsonEntry[]",[4099,4317,4318],{},"v-model partner — fires whenever the JSON list changes.",[4081,4320,4321,4326,4331],{},[4099,4322,4323],{},[479,4324,4325],{},"add",[4099,4327,4328],{},[479,4329,4330],{},"DecalEntry",[4099,4332,4333],{},"A new decal has been committed (create mode → confirm).",[4081,4335,4336,4341,4345],{},[4099,4337,4338],{},[479,4339,4340],{},"update",[4099,4342,4343],{},[479,4344,4330],{},[4099,4346,4347],{},"An existing decal has been committed (update mode → confirm).",[4081,4349,4350,4355,4359],{},[4099,4351,4352],{},[479,4353,4354],{},"delete",[4099,4356,4357],{},[479,4358,4330],{},[4099,4360,4361,4362,1712,4365,4108],{},"A decal has been removed (delete button or ",[479,4363,4364],{},"Del",[479,4366,4367],{},"Backspace",[4081,4369,4370,4375,4379],{},[4099,4371,4372],{},[479,4373,4374],{},"select",[4099,4376,4377],{},[479,4378,4330],{},[4099,4380,4381,4382,4385],{},"Edition began on ",[479,4383,4384],{},"entry"," (panel click, 3D click, or programmatic).",[4081,4387,4388,4393,4396],{},[4099,4389,4390],{},[479,4391,4392],{},"cancel",[4099,4394,4395],{},"—",[4099,4397,4398,4399,4402],{},"Edition was aborted without commit (",[479,4400,4401],{},"Esc",", click-outside in create mode).",[4081,4404,4405,4410,4415],{},[4099,4406,4407],{},[479,4408,4409],{},"decalClick",[4099,4411,4412],{},[479,4413,4414],{},"{ entry: DecalEntry, event: MouseEvent }",[4099,4416,4417,4418,4420,4421,527],{},"Fires on click of any stamped decal, even when ",[479,4419,1559],{}," is ",[479,4422,4188],{},[575,4424,4426,4428,4429,1716],{"id":4425},"decal-exposed-via-ref",[479,4427,481],{}," exposed (via ",[479,4430,4431],{},"ref",[476,4433,4434,4435,4438],{},"The template ref resolves to ",[479,4436,4437],{},"DecalImperativeApi"," — import the type for\nfull autocompletion:",[594,4440,4442],{"className":1590,"code":4441,"language":631,"meta":599,"style":599},"import type { DecalImperativeApi } from '@tresjs/cientos'\n\nconst decalRef = ref\u003CDecalImperativeApi | null>(null)\n",[479,4443,4444,4465,4469],{"__ignoreMap":599},[603,4445,4446,4448,4450,4452,4455,4457,4459,4461,4463],{"class":605,"line":606},[603,4447,643],{"class":642},[603,4449,1818],{"class":642},[603,4451,646],{"class":609},[603,4453,4454],{"class":649}," DecalImperativeApi",[603,4456,664],{"class":609},[603,4458,667],{"class":642},[603,4460,670],{"class":609},[603,4462,673],{"class":630},[603,4464,676],{"class":609},[603,4466,4467],{"class":605,"line":639},[603,4468,724],{"emptyLinePlaceholder":723},[603,4470,4471,4473,4475,4477,4479,4481,4483,4485,4487,4489,4491,4493],{"class":605,"line":679},[603,4472,730],{"class":617},[603,4474,2003],{"class":649},[603,4476,624],{"class":609},[603,4478,2283],{"class":750},[603,4480,610],{"class":609},[603,4482,4437],{"class":1943},[603,4484,2022],{"class":609},[603,4486,2025],{"class":1943},[603,4488,2028],{"class":609},[603,4490,753],{"class":649},[603,4492,2033],{"class":609},[603,4494,764],{"class":649},[4075,4496,4497,4509],{},[4078,4498,4499],{},[4081,4500,4501,4504,4507],{},[4084,4502,4503],{},"Property",[4084,4505,4506],{},"Type",[4084,4508,4089],{},[4094,4510,4511,4529,4547,4565,4580],{},[4081,4512,4513,4518,4523],{},[4099,4514,4515],{},[479,4516,4517],{},"editor",[4099,4519,4520],{},[479,4521,4522],{},"DecalEditorSession",[4099,4524,4525,4526,527],{},"The canvas-shared editor session. Pass it to ",[479,4527,4528],{},"\u003CDecalDebugUI :session>",[4081,4530,4531,4536,4541],{},[4099,4532,4533],{},[479,4534,4535],{},"beginEditById",[4099,4537,4538],{},[479,4539,4540],{},"(id: string) => boolean",[4099,4542,4543,4544,4546],{},"Programmatically start editing a specific decal. Returns ",[479,4545,4188],{}," if the id is unknown.",[4081,4548,4549,4554,4559],{},[4099,4550,4551],{},[479,4552,4553],{},"commit",[4099,4555,4556],{},[479,4557,4558],{},"() => void",[4099,4560,4561,4562,4108],{},"Commit the in-flight edit (same as ",[479,4563,4564],{},"Enter",[4081,4566,4567,4571,4575],{},[4099,4568,4569],{},[479,4570,4392],{},[4099,4572,4573],{},[479,4574,4558],{},[4099,4576,4577,4578,4108],{},"Abort the in-flight edit (same as ",[479,4579,4401],{},[4081,4581,4582,4587,4591],{},[4099,4583,4584],{},[479,4585,4586],{},"remove",[4099,4588,4589],{},[479,4590,4558],{},[4099,4592,4593,4594,4108],{},"Delete the currently edited decal (same as ",[479,4595,4364],{},[575,4597,4599,4073],{"id":4598},"decaldebugui-props",[479,4600,497],{},[4075,4602,4603,4613],{},[4078,4604,4605],{},[4081,4606,4607,4609,4611],{},[4084,4608,4086],{},[4084,4610,4089],{},[4084,4612,4092],{},[4094,4614,4615,4638,4663,4676,4696,4711,4734],{},[4081,4616,4617,4621,4634],{},[4099,4618,4619],{},[491,4620,2107],{},[4099,4622,4623,4626,4627,4629,4630,4633],{},[479,4624,4625],{},"DecalEditorSession | null"," — obtained from any ",[479,4628,481],{}," ref via ",[479,4631,4632],{},"decalRef.value?.editor",". Mandatory for the overlay to wire up the interactive logic.",[4099,4635,4636],{},[479,4637,2033],{},[4081,4639,4640,4644,4658],{},[4099,4641,4642],{},[491,4643,1088],{},[4099,4645,4646,4647,4650,4651,4654,4655,4657],{},"Mesh-name-keyed map of decal slices — ",[479,4648,4649],{},"{ sphere: [...], cube: [...] }",". Each key matches a ",[479,4652,4653],{},"\u003CTresMesh name=\"...\">"," whose child ",[479,4656,481],{}," owns the slice.",[4099,4659,4660],{},[479,4661,4662],{},"{}",[4081,4664,4665,4669,4672],{},[4099,4666,4667],{},[491,4668,1330],{},[4099,4670,4671],{},"The full texture palette shown in the dock's picker.",[4099,4673,4674],{},[479,4675,1956],{},[4081,4677,4678,4683,4692],{},[4099,4679,4680],{},[491,4681,4682],{},"theme",[4099,4684,4685,4144,4688,4691],{},[479,4686,4687],{},"'light'",[479,4689,4690],{},"'dark'"," — overlay theme tokens.",[4099,4693,4694],{},[479,4695,4687],{},[4081,4697,4698,4703,4706],{},[4099,4699,4700],{},[491,4701,4702],{},"snapAngle",[4099,4704,4705],{},"Rotation step (degrees) applied when the snap toggle is on. Snap-tick ring on the handle adapts automatically.",[4099,4707,4708],{},[479,4709,4710],{},"15",[4081,4712,4713,4718,4730],{},[4099,4714,4715],{},[491,4716,4717],{},"exportFilename",[4099,4719,4720,4721,4258,4723,4725,4726,4729],{},"Filename for the built-in JSON download. When omitted, defaults to ",[479,4722,2627],{},[479,4724,2033],{}," to skip the auto-download (the ",[479,4727,4728],{},"@export"," event still fires).",[4099,4731,4732],{},[479,4733,2627],{},[4081,4735,4736,4740,4743],{},[4099,4737,4738],{},[491,4739,2555],{},[4099,4741,4742],{},"Scope the overlay to the nearest positioned ancestor instead of pinning it to the viewport. Useful for embedding the editor inside a docs page or a bounded host stage.",[4099,4744,4745],{},[479,4746,4188],{},[575,4748,4750,4287],{"id":4749},"decaldebugui-events",[479,4751,497],{},[4075,4753,4754,4764],{},[4078,4755,4756],{},[4081,4757,4758,4760,4762],{},[4084,4759,4296],{},[4084,4761,4299],{},[4084,4763,4089],{},[4094,4765,4766,4780],{},[4081,4767,4768,4772,4777],{},[4099,4769,4770],{},[479,4771,1625],{},[4099,4773,4774],{},[479,4775,4776],{},"DecalLayout",[4099,4778,4779],{},"Fires after the user clicks Export. The download (if enabled) has already been triggered — use this for side effects (POST, analytics…).",[4081,4781,4782,4786,4790],{},[4099,4783,4784],{},[479,4785,643],{},[4099,4787,4788],{},[479,4789,4776],{},[4099,4791,4792],{},"Fires after the user picks a JSON file. The layout has been sanitised (unknown keys dropped) and already applied to the bound Decals.",[575,4794,4796],{"id":4795},"caveats","Caveats",[484,4798,4799,4814,4831,4847],{},[487,4800,4801,4802,4805,4806,4809,4810,4813],{},"✨ The overlay sits at ",[479,4803,4804],{},"position: fixed; inset: 0; pointer-events: none"," with\nindividual panels opting back in. It sits ",[491,4807,4808],{},"above"," the canvas by default\n(",[479,4811,4812],{},"z-index: 1000000",") — adjust via host CSS if needed.",[487,4815,4816,4817,4819,4820,4823,4824,994,4827,4830],{},"🎨 ",[479,4818,497],{}," ships its own theme in a global stylesheet under the\n",[479,4821,4822],{},".cientos-decal-ui"," namespace, so host styles aren't affected. The CSS\nvariables (",[479,4825,4826],{},"--accent",[479,4828,4829],{},"--dock-bg",", etc.) can be overridden by targeting\nthe namespace.",[487,4832,4833,4834,4837,4838,4840,4841,4843,4844,4846],{},"🔶 Decals are ",[491,4835,4836],{},"per-canvas"," — if you have multiple ",[479,4839,1570],{}," in your\napp, each one has its own independent session. Pair each ",[479,4842,497],{},"\nwith the right ",[479,4845,2107],{}," (from one of the Decals inside that canvas).",[487,4848,4849,4850,527],{},"🧩 The parent mesh resolution defaults to the scene-graph parent. If your\nsetup needs a different target (e.g. a mesh referenced from outside the\nDecal's parent slot), pass ",[479,4851,4852],{},":mesh=\"meshRef\"",[575,4854,4856],{"id":4855},"limitations","Limitations",[1143,4858,4859,4873,4880,4923],{},[476,4860,4861,4862,4865,4866,1712,4868,1712,4870,4872],{},"Decal vertices are baked into the ",[491,4863,4864],{},"target mesh's local space"," at\nbuild time (the decal mesh is imperatively re-parented to the target,\nso ",[479,4867,981],{},[479,4869,4160],{},[479,4871,4163],{}," on the parent are followed via\nthe scene graph — no rebuild needed).",[476,4874,4875,4876,4879],{},"Runtime deformations that change vertex positions outside of a\ntransform are ",[491,4877,4878],{},"not"," followed:",[484,4881,4882,4895,4903,4910],{},[487,4883,4884,4889,4890,527],{},[491,4885,4886],{},[479,4887,4888],{},"SkinnedMesh"," skinning is not applied — the decal stays in rest\npose. See ",[506,4891,4894],{"href":4892,"rel":4893},"https://github.com/mrdoob/three.js/issues/7926",[3366],"three.js#7926",[487,4896,4897,4902],{},[491,4898,4899],{},[479,4900,4901],{},"morphAttributes"," on the parent are ignored.",[487,4904,4905,4906,4909],{},"Direct mutations of the parent's ",[479,4907,4908],{},"geometry.attributes.position","\n(e.g. CPU wave displacement, GPGPU) — the projection is baked once.",[487,4911,4912,4913,4917,4918,4920,4921,527],{},"Decals near silhouettes can wrap around onto opposite faces (see\n",[506,4914,4916],{"href":4255,"rel":4915},[3366],"three.js#21187",") —\nmitigated by the ",[479,4919,4245],{}," prop, default ",[479,4922,4266],{},[476,4924,4925,4927],{},[479,4926,481],{}," warns once per parent mesh when it detects these conditions.",[575,4929,4931],{"id":4930},"keyboard-shortcuts","Keyboard shortcuts",[4075,4933,4934,4944],{},[4078,4935,4936],{},[4081,4937,4938,4941],{},[4084,4939,4940],{},"Shortcut",[4084,4942,4943],{},"Action",[4094,4945,4946,4955,4964,4976,4989,5002],{},[4081,4947,4948,4952],{},[4099,4949,4950],{},[479,4951,4564],{},[4099,4953,4954],{},"Confirm the in-flight edit",[4081,4956,4957,4961],{},[4099,4958,4959],{},[479,4960,4401],{},[4099,4962,4963],{},"Cancel (revert updates, drop pending placements)",[4081,4965,4966,4973],{},[4099,4967,4968,1712,4970],{},[479,4969,4364],{},[479,4971,4972],{},"⌫",[4099,4974,4975],{},"Delete the edited decal (or cancel a create)",[4081,4977,4978,4986],{},[4099,4979,4980,1712,4983],{},[479,4981,4982],{},"⌘Z",[479,4984,4985],{},"Ctrl+Z",[4099,4987,4988],{},"Undo",[4081,4990,4991,4999],{},[4099,4992,4993,1712,4996],{},[479,4994,4995],{},"⇧⌘Z",[479,4997,4998],{},"Ctrl+⇧Z",[4099,5000,5001],{},"Redo",[4081,5003,5004,5007],{},[4099,5005,5006],{},"Click outside",[4099,5008,5009],{},"Auto-commit an in-flight update; cancel a create",[575,5011,5013,5014,1716],{"id":5012},"programmatic-api-usedecaleditor","Programmatic API (",[479,5015,5016],{},"useDecalEditor",[476,5018,5019,5020,5022,5023,5025,5026,5028,5029,5031],{},"Skip ",[479,5021,497],{}," entirely or augment it with custom panels —\n",[479,5024,511],{}," returns the same canvas-scoped session every Decal\nshares. Call it from any component inside ",[479,5027,1570],{}," (after at\nleast one ",[479,5030,481],{}," has mounted).",[594,5033,5035],{"className":1590,"code":5034,"language":631,"meta":599,"style":599},"import { useDecalEditor } from '@tresjs/cientos'\n\nconst session = useDecalEditor()\n",[479,5036,5037,5056,5060],{"__ignoreMap":599},[603,5038,5039,5041,5043,5046,5048,5050,5052,5054],{"class":605,"line":606},[603,5040,643],{"class":642},[603,5042,646],{"class":609},[603,5044,5045],{"class":649}," useDecalEditor",[603,5047,664],{"class":609},[603,5049,667],{"class":642},[603,5051,670],{"class":609},[603,5053,673],{"class":630},[603,5055,676],{"class":609},[603,5057,5058],{"class":605,"line":639},[603,5059,724],{"emptyLinePlaceholder":723},[603,5061,5062,5064,5066,5068,5070],{"class":605,"line":679},[603,5063,730],{"class":617},[603,5065,2042],{"class":649},[603,5067,624],{"class":609},[603,5069,5045],{"class":750},[603,5071,5072],{"class":649},"()\n",[476,5074,5075,5076,994,5079,808,5082,994,5085,5088,5089,808,5091,994,5094,994,5097,5100,5101,5104,5105,5108,5109,994,5112,994,5115,808,5118,5121],{},"The session exposes reactive state (",[479,5077,5078],{},"editingEntry",[479,5080,5081],{},"editingMode",[479,5083,5084],{},"canUndo",[479,5086,5087],{},"canRedo",", …), by-id mutators (",[479,5090,4535],{},[479,5092,5093],{},"setZIndexById",[479,5095,5096],{},"setVisibilityById",[479,5098,5099],{},"removeById","), batched updates\n(",[479,5102,5103],{},"setMeshData","), commit / delete / cancel listeners, undo / redo, and\na ",[479,5106,5107],{},"registerDecalEntry"," hook for external entries. Helper utilities\n(",[479,5110,5111],{},"ensureTextureNames",[479,5113,5114],{},"getTextureName",[479,5116,5117],{},"getTextureAspect",[479,5119,5120],{},"invalidateDecalGeometry",") are exported alongside.",[3830,5123,3832,5124,5127,5132,5207,5211,5282,5298,5302,5338,5344,5348,5487,5491,5537,5540,5544,5558,5728,5732],{},[3834,5125,5126],{},"Full API reference",[5128,5129,5131],"h4",{"id":5130},"reactive-state","Reactive state",[594,5133,5135],{"className":1590,"code":5134,"language":631,"meta":599,"style":599},"session.editingEntry // ShallowRef\u003CDecalEntry | null>\nsession.editingMode // Ref\u003C'create' | 'update' | null>\nsession.lockedMeshUuid // Ref\u003Cstring | null>\nsession.hoveredEntry // ShallowRef\u003CDecalEntry | null>\nsession.canUndo // Ref\u003Cboolean>\nsession.canRedo // Ref\u003Cboolean>\n",[479,5136,5137,5149,5161,5173,5184,5196],{"__ignoreMap":599},[603,5138,5139,5141,5143,5146],{"class":605,"line":606},[603,5140,2107],{"class":649},[603,5142,527],{"class":609},[603,5144,5145],{"class":649},"editingEntry ",[603,5147,5148],{"class":1598},"// ShallowRef\u003CDecalEntry | null>\n",[603,5150,5151,5153,5155,5158],{"class":605,"line":639},[603,5152,2107],{"class":649},[603,5154,527],{"class":609},[603,5156,5157],{"class":649},"editingMode ",[603,5159,5160],{"class":1598},"// Ref\u003C'create' | 'update' | null>\n",[603,5162,5163,5165,5167,5170],{"class":605,"line":679},[603,5164,2107],{"class":649},[603,5166,527],{"class":609},[603,5168,5169],{"class":649},"lockedMeshUuid ",[603,5171,5172],{"class":1598},"// Ref\u003Cstring | null>\n",[603,5174,5175,5177,5179,5182],{"class":605,"line":700},[603,5176,2107],{"class":649},[603,5178,527],{"class":609},[603,5180,5181],{"class":649},"hoveredEntry ",[603,5183,5148],{"class":1598},[603,5185,5186,5188,5190,5193],{"class":605,"line":720},[603,5187,2107],{"class":649},[603,5189,527],{"class":609},[603,5191,5192],{"class":649},"canUndo ",[603,5194,5195],{"class":1598},"// Ref\u003Cboolean>\n",[603,5197,5198,5200,5202,5205],{"class":605,"line":727},[603,5199,2107],{"class":649},[603,5201,527],{"class":609},[603,5203,5204],{"class":649},"canRedo ",[603,5206,5195],{"class":1598},[5128,5208,5210],{"id":5209},"mutating-decals-by-id","Mutating decals by id",[594,5212,5214],{"className":1590,"code":5213,"language":631,"meta":599,"style":599},"session.beginEditById(id) // start editing a placed decal\nsession.setZIndexById(id, newZ) // reorder one decal\nsession.setVisibilityById(id, false) // hide / show\nsession.removeById(id) // delete\n",[479,5215,5216,5230,5249,5269],{"__ignoreMap":599},[603,5217,5218,5220,5222,5224,5227],{"class":605,"line":606},[603,5219,2107],{"class":649},[603,5221,527],{"class":609},[603,5223,4535],{"class":750},[603,5225,5226],{"class":649},"(id) ",[603,5228,5229],{"class":1598},"// start editing a placed decal\n",[603,5231,5232,5234,5236,5238,5241,5243,5246],{"class":605,"line":639},[603,5233,2107],{"class":649},[603,5235,527],{"class":609},[603,5237,5093],{"class":750},[603,5239,5240],{"class":649},"(id",[603,5242,653],{"class":609},[603,5244,5245],{"class":649}," newZ) ",[603,5247,5248],{"class":1598},"// reorder one decal\n",[603,5250,5251,5253,5255,5257,5259,5261,5264,5266],{"class":605,"line":679},[603,5252,2107],{"class":649},[603,5254,527],{"class":609},[603,5256,5096],{"class":750},[603,5258,5240],{"class":649},[603,5260,653],{"class":609},[603,5262,5263],{"class":2845}," false",[603,5265,3202],{"class":649},[603,5267,5268],{"class":1598},"// hide / show\n",[603,5270,5271,5273,5275,5277,5279],{"class":605,"line":700},[603,5272,2107],{"class":649},[603,5274,527],{"class":609},[603,5276,5099],{"class":750},[603,5278,5226],{"class":649},[603,5280,5281],{"class":1598},"// delete\n",[476,5283,5284,5285,5288,5289,5291,5292,5294,5295,5297],{},"When the targeted id matches the ",[491,5286,5287],{},"currently editing"," entry, mutations\nland on the in-flight buffer (committed on ",[479,5290,4564],{},", reverted on ",[479,5293,4401],{},").\nOtherwise they update ",[479,5296,1088],{}," immediately and record history.",[5128,5299,5301],{"id":5300},"batched-mesh-updates","Batched mesh updates",[594,5303,5305],{"className":1590,"code":5304,"language":631,"meta":599,"style":599},"session.setMeshData(meshName, nextEntries, { recordHistory: true })\n",[479,5306,5307],{"__ignoreMap":599},[603,5308,5309,5311,5313,5315,5318,5320,5323,5325,5327,5330,5332,5334,5336],{"class":605,"line":606},[603,5310,2107],{"class":649},[603,5312,527],{"class":609},[603,5314,5103],{"class":750},[603,5316,5317],{"class":649},"(meshName",[603,5319,653],{"class":609},[603,5321,5322],{"class":649}," nextEntries",[603,5324,653],{"class":609},[603,5326,646],{"class":609},[603,5328,5329],{"class":613}," recordHistory",[603,5331,738],{"class":609},[603,5333,2846],{"class":2845},[603,5335,664],{"class":609},[603,5337,764],{"class":649},[476,5339,5340,5341,5343],{},"A single emit avoids the stale-snapshot race that hits multiple\nback-to-back ",[479,5342,5093],{}," calls in the same tick.",[5128,5345,5347],{"id":5346},"listening-to-commits","Listening to commits",[594,5349,5351],{"className":1590,"code":5350,"language":631,"meta":599,"style":599},"const off = session.onCommit((entry, mode) => {\n  console.log(mode, entry) // mode: 'create' | 'update'\n})\nsession.onDelete((entry) => { /* … */ })\nsession.onCancel(() => { /* … */ })\n\n// All return an unsubscribe function:\nonBeforeUnmount(off)\n",[479,5352,5353,5388,5413,5419,5447,5470,5474,5479],{"__ignoreMap":599},[603,5354,5355,5357,5360,5362,5365,5367,5370,5372,5374,5377,5379,5382,5384,5386],{"class":605,"line":606},[603,5356,730],{"class":617},[603,5358,5359],{"class":649}," off ",[603,5361,624],{"class":609},[603,5363,5364],{"class":649}," session",[603,5366,527],{"class":609},[603,5368,5369],{"class":750},"onCommit",[603,5371,753],{"class":649},[603,5373,753],{"class":609},[603,5375,4384],{"class":5376},"sHdIc",[603,5378,653],{"class":609},[603,5380,5381],{"class":5376}," mode",[603,5383,1716],{"class":609},[603,5385,2054],{"class":617},[603,5387,3851],{"class":609},[603,5389,5390,5393,5395,5398,5400,5403,5405,5408,5410],{"class":605,"line":639},[603,5391,5392],{"class":649},"  console",[603,5394,527],{"class":609},[603,5396,5397],{"class":750},"log",[603,5399,753],{"class":613},[603,5401,5402],{"class":649},"mode",[603,5404,653],{"class":609},[603,5406,5407],{"class":649}," entry",[603,5409,3202],{"class":613},[603,5411,5412],{"class":1598},"// mode: 'create' | 'update'\n",[603,5414,5415,5417],{"class":605,"line":679},[603,5416,744],{"class":609},[603,5418,764],{"class":649},[603,5420,5421,5423,5425,5428,5430,5432,5434,5436,5438,5440,5443,5445],{"class":605,"line":700},[603,5422,2107],{"class":649},[603,5424,527],{"class":609},[603,5426,5427],{"class":750},"onDelete",[603,5429,753],{"class":649},[603,5431,753],{"class":609},[603,5433,4384],{"class":5376},[603,5435,1716],{"class":609},[603,5437,2054],{"class":617},[603,5439,646],{"class":609},[603,5441,5442],{"class":1598}," /* … */",[603,5444,664],{"class":609},[603,5446,764],{"class":649},[603,5448,5449,5451,5453,5456,5458,5460,5462,5464,5466,5468],{"class":605,"line":720},[603,5450,2107],{"class":649},[603,5452,527],{"class":609},[603,5454,5455],{"class":750},"onCancel",[603,5457,753],{"class":649},[603,5459,2051],{"class":609},[603,5461,2054],{"class":617},[603,5463,646],{"class":609},[603,5465,5442],{"class":1598},[603,5467,664],{"class":609},[603,5469,764],{"class":649},[603,5471,5472],{"class":605,"line":727},[603,5473,724],{"emptyLinePlaceholder":723},[603,5475,5476],{"class":605,"line":767},[603,5477,5478],{"class":1598},"// All return an unsubscribe function:\n",[603,5480,5481,5484],{"class":605,"line":772},[603,5482,5483],{"class":750},"onBeforeUnmount",[603,5485,5486],{"class":649},"(off)\n",[5128,5488,5490],{"id":5489},"undo-redo","Undo / redo",[594,5492,5494],{"className":1590,"code":5493,"language":631,"meta":599,"style":599},"session.canUndo.value // Ref\u003Cboolean>\nsession.undo() // returns true if something was undone\nsession.redo()\n",[479,5495,5496,5511,5526],{"__ignoreMap":599},[603,5497,5498,5500,5502,5504,5506,5509],{"class":605,"line":606},[603,5499,2107],{"class":649},[603,5501,527],{"class":609},[603,5503,5084],{"class":649},[603,5505,527],{"class":609},[603,5507,5508],{"class":649},"value ",[603,5510,5195],{"class":1598},[603,5512,5513,5515,5517,5520,5523],{"class":605,"line":639},[603,5514,2107],{"class":649},[603,5516,527],{"class":609},[603,5518,5519],{"class":750},"undo",[603,5521,5522],{"class":649},"() ",[603,5524,5525],{"class":1598},"// returns true if something was undone\n",[603,5527,5528,5530,5532,5535],{"class":605,"line":679},[603,5529,2107],{"class":649},[603,5531,527],{"class":609},[603,5533,5534],{"class":750},"redo",[603,5536,5072],{"class":649},[476,5538,5539],{},"History is per-canvas, capped at 100 operations, disabled mid-edit.",[5128,5541,5543],{"id":5542},"power-user-external-entries","Power user — external entries",[476,5545,5546,5547,5549,5550,5553,5554,5557],{},"Plug a decal-like object that lives outside a ",[479,5548,481],{}," (custom data\nsource, server snapshot, fake entry for tests) by registering a\n",[479,5551,5552],{},"DecalEntryActions"," bundle so the ",[479,5555,5556],{},"*ById"," session methods route to it:",[594,5559,5561],{"className":1590,"code":5560,"language":631,"meta":599,"style":599},"import type { DecalEntryActions } from '@tresjs/cientos'\n\nsession.registerDecalEntry('decal-7', {\n  beginEdit: () => { /* … */ },\n  setZIndex: (newZ) => { /* … */ },\n  setVisibility: (visible) => { /* … */ },\n  remove: () => { /* … */ },\n} satisfies DecalEntryActions)\nonBeforeUnmount(() => session.unregisterDecalEntry('decal-7'))\n",[479,5562,5563,5584,5588,5609,5628,5650,5672,5689,5700],{"__ignoreMap":599},[603,5564,5565,5567,5569,5571,5574,5576,5578,5580,5582],{"class":605,"line":606},[603,5566,643],{"class":642},[603,5568,1818],{"class":642},[603,5570,646],{"class":609},[603,5572,5573],{"class":649}," DecalEntryActions",[603,5575,664],{"class":609},[603,5577,667],{"class":642},[603,5579,670],{"class":609},[603,5581,673],{"class":630},[603,5583,676],{"class":609},[603,5585,5586],{"class":605,"line":639},[603,5587,724],{"emptyLinePlaceholder":723},[603,5589,5590,5592,5594,5596,5598,5600,5603,5605,5607],{"class":605,"line":679},[603,5591,2107],{"class":649},[603,5593,527],{"class":609},[603,5595,5107],{"class":750},[603,5597,753],{"class":649},[603,5599,756],{"class":609},[603,5601,5602],{"class":630},"decal-7",[603,5604,756],{"class":609},[603,5606,653],{"class":609},[603,5608,3851],{"class":609},[603,5610,5611,5614,5616,5619,5621,5623,5625],{"class":605,"line":700},[603,5612,5613],{"class":750},"  beginEdit",[603,5615,738],{"class":609},[603,5617,5618],{"class":609}," ()",[603,5620,2054],{"class":617},[603,5622,646],{"class":609},[603,5624,5442],{"class":1598},[603,5626,5627],{"class":609}," },\n",[603,5629,5630,5633,5635,5637,5640,5642,5644,5646,5648],{"class":605,"line":720},[603,5631,5632],{"class":750},"  setZIndex",[603,5634,738],{"class":609},[603,5636,1447],{"class":609},[603,5638,5639],{"class":5376},"newZ",[603,5641,1716],{"class":609},[603,5643,2054],{"class":617},[603,5645,646],{"class":609},[603,5647,5442],{"class":1598},[603,5649,5627],{"class":609},[603,5651,5652,5655,5657,5659,5662,5664,5666,5668,5670],{"class":605,"line":727},[603,5653,5654],{"class":750},"  setVisibility",[603,5656,738],{"class":609},[603,5658,1447],{"class":609},[603,5660,5661],{"class":5376},"visible",[603,5663,1716],{"class":609},[603,5665,2054],{"class":617},[603,5667,646],{"class":609},[603,5669,5442],{"class":1598},[603,5671,5627],{"class":609},[603,5673,5674,5677,5679,5681,5683,5685,5687],{"class":605,"line":767},[603,5675,5676],{"class":750},"  remove",[603,5678,738],{"class":609},[603,5680,5618],{"class":609},[603,5682,2054],{"class":617},[603,5684,646],{"class":609},[603,5686,5442],{"class":1598},[603,5688,5627],{"class":609},[603,5690,5691,5693,5696,5698],{"class":605,"line":772},[603,5692,744],{"class":609},[603,5694,5695],{"class":642}," satisfies",[603,5697,5573],{"class":1943},[603,5699,764],{"class":649},[603,5701,5702,5704,5706,5708,5710,5712,5714,5717,5719,5721,5723,5725],{"class":605,"line":787},[603,5703,5483],{"class":750},[603,5705,753],{"class":649},[603,5707,2051],{"class":609},[603,5709,2054],{"class":617},[603,5711,5364],{"class":649},[603,5713,527],{"class":609},[603,5715,5716],{"class":750},"unregisterDecalEntry",[603,5718,753],{"class":649},[603,5720,756],{"class":609},[603,5722,5602],{"class":630},[603,5724,756],{"class":609},[603,5726,5727],{"class":649},"))\n",[5128,5729,5731],{"id":5730},"helper-utilities","Helper utilities",[4075,5733,5734,5743],{},[4078,5735,5736],{},[4081,5737,5738,5740],{},[4084,5739,291],{},[4084,5741,5742],{},"Use",[4094,5744,5745,5765,5777,5790],{},[4081,5746,5747,5752],{},[4099,5748,5749],{},[479,5750,5751],{},"ensureTextureNames(textures)",[4099,5753,5754,5755,5757,5758,5761,5762,527],{},"Back-fills ",[479,5756,1354],{}," from ",[479,5759,5760],{},"userData.name"," or the filename in ",[479,5763,5764],{},"image.src",[4081,5766,5767,5772],{},[4099,5768,5769],{},[479,5770,5771],{},"getTextureName(texture)",[4099,5773,5774,5775,527],{},"Single-texture variant — returns a stable name or ",[479,5776,2033],{},[4081,5778,5779,5784],{},[4099,5780,5781],{},[479,5782,5783],{},"getTextureAspect(texture)",[4099,5785,5786,5789],{},[479,5787,5788],{},"{ x, y }"," aspect ratio for custom-sized decals.",[4081,5791,5792,5797],{},[4099,5793,5794],{},[479,5795,5796],{},"invalidateDecalGeometry(mesh)",[4099,5798,5799],{},"Force a rebuild on the next frame — call when the parent mesh moved or swapped.",[5801,5802,5803],"style",{},"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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 pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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}",{"title":599,"searchDepth":606,"depth":639,"links":5805},[5806,5807,5808,5809,5810,5814,5815,5823,5824,5826,5828,5830,5832,5834,5835,5836,5837],{"id":577,"depth":639,"text":15},{"id":1161,"depth":639,"text":1162},{"id":1361,"depth":639,"text":533},{"id":1455,"depth":639,"text":1456},{"id":1550,"depth":639,"text":5811,"children":5812},"Editable mode + \u003CDecalDebugUI>",[5813],{"id":2502,"depth":679,"text":2503},{"id":2621,"depth":639,"text":1755},{"id":2720,"depth":639,"text":5816,"children":5817},"Targeting a loaded model (.glb)",[5818,5820,5822],{"id":2747,"depth":679,"text":5819},"When :object is a Mesh",{"id":2989,"depth":679,"text":5821},"When :object is a Group",{"id":3350,"depth":679,"text":3351},{"id":3811,"depth":639,"text":3812},{"id":4070,"depth":639,"text":5825},"\u003CDecal> props",{"id":4284,"depth":639,"text":5827},"\u003CDecal> events",{"id":4425,"depth":639,"text":5829},"\u003CDecal> exposed (via ref)",{"id":4598,"depth":639,"text":5831},"\u003CDecalDebugUI> props",{"id":4749,"depth":639,"text":5833},"\u003CDecalDebugUI> events",{"id":4795,"depth":639,"text":4796},{"id":4855,"depth":639,"text":4856},{"id":4930,"depth":639,"text":4931},{"id":5012,"depth":639,"text":5838},"Programmatic API (useDecalEditor)","Project a texture onto a mesh's surface — with an optional in-canvas editor UI.","md",null,{},{"title":49,"description":5839},"UXzJTvWzu0DUebb9Yjx34N2tvhWy1dqXuLm2nippsug",[5846,5848],{"title":45,"path":46,"stem":47,"description":5847,"children":-1},"Apply smooth camera shake to the active camera.",{"title":53,"path":54,"stem":55,"description":5849,"children":-1},"Render visible edges of objects with enhanced visual quality.",1781258578476]