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