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