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