[{"data":1,"prerenderedAt":2119},["ShallowReactive",2],{"navigation-docsCpp":3,"lib-picker-navigation":192,"docsCpp-\u002Fcpp\u002Fmodules\u002Fcsg":445,"docsCpp-\u002Fcpp\u002Fmodules\u002Fcsg-surround":2114},[4],{"title":5,"path":6,"stem":7,"children":8,"page":27},"Cpp","\u002Fcpp","cpp",[9,28,91,119,143,173],{"title":10,"path":11,"stem":12,"children":13,"icon":27},"Getting Started","\u002Fcpp\u002Fgetting-started","cpp\u002F1.getting-started\u002F1.index",[14,17,22],{"title":15,"path":11,"stem":12,"icon":16},"Introduction","i-lucide-house",{"title":18,"path":19,"stem":20,"icon":21},"Installation","\u002Fcpp\u002Fgetting-started\u002Finstallation","cpp\u002F1.getting-started\u002F2.installation","i-lucide-download",{"title":23,"path":24,"stem":25,"icon":26},"Live Examples","\u002Fcpp\u002Fgetting-started\u002Flive-examples","cpp\u002F1.getting-started\u002F3.live-examples","i-lucide-play",false,{"title":29,"path":30,"stem":31,"children":32,"icon":27},"Modules","\u002Fcpp\u002Fmodules","cpp\u002F2.modules\u002F00.index",[33,36,41,46,51,56,61,66,71,76,81,86],{"title":34,"path":30,"stem":31,"icon":35},"Overview","i-lucide-library",{"title":37,"path":38,"stem":39,"icon":40},"Core","\u002Fcpp\u002Fmodules\u002Fcore","cpp\u002F2.modules\u002F01.core","i-lucide-atom",{"title":42,"path":43,"stem":44,"icon":45},"Spatial","\u002Fcpp\u002Fmodules\u002Fspatial","cpp\u002F2.modules\u002F02.spatial","i-lucide-scale-3d",{"title":47,"path":48,"stem":49,"icon":50},"Topology","\u002Fcpp\u002Fmodules\u002Ftopology","cpp\u002F2.modules\u002F03.topology","i-lucide-git-graph",{"title":52,"path":53,"stem":54,"icon":55},"Geometry","\u002Fcpp\u002Fmodules\u002Fgeometry","cpp\u002F2.modules\u002F04.geometry","i-lucide-ruler",{"title":57,"path":58,"stem":59,"icon":60},"Remesh","\u002Fcpp\u002Fmodules\u002Fremesh","cpp\u002F2.modules\u002F05.remesh","i-lucide-triangle",{"title":62,"path":63,"stem":64,"icon":65},"Intersect","\u002Fcpp\u002Fmodules\u002Fintersect","cpp\u002F2.modules\u002F06.intersect","i-lucide-squares-intersect",{"title":67,"path":68,"stem":69,"icon":70},"Cut","\u002Fcpp\u002Fmodules\u002Fcut","cpp\u002F2.modules\u002F07.cut","i-lucide-scissors",{"title":72,"path":73,"stem":74,"icon":75},"CSG","\u002Fcpp\u002Fmodules\u002Fcsg","cpp\u002F2.modules\u002F08.csg","i-lucide-shapes",{"title":77,"path":78,"stem":79,"icon":80},"Clean","\u002Fcpp\u002Fmodules\u002Fclean","cpp\u002F2.modules\u002F09.clean","i-lucide-sparkles",{"title":82,"path":83,"stem":84,"icon":85},"Reindex","\u002Fcpp\u002Fmodules\u002Freindex","cpp\u002F2.modules\u002F10.reidx","i-lucide-shuffle",{"title":87,"path":88,"stem":89,"icon":90},"I\u002FO","\u002Fcpp\u002Fmodules\u002Fio","cpp\u002F2.modules\u002F11.io","i-lucide-file-input",{"title":92,"path":93,"stem":94,"children":95,"icon":27},"Benchmarks","\u002Fcpp\u002Fbenchmarks","cpp\u002F3.benchmarks\u002F1.index",[96,98,101,104,107,110,113,116],{"title":34,"path":93,"stem":94,"icon":97},"i-lucide-chart-bar-stacked",{"title":42,"path":99,"stem":100,"icon":45},"\u002Fcpp\u002Fbenchmarks\u002Fspatial","cpp\u002F3.benchmarks\u002F2.spatial",{"title":47,"path":102,"stem":103,"icon":50},"\u002Fcpp\u002Fbenchmarks\u002Ftopology","cpp\u002F3.benchmarks\u002F3.topology",{"title":52,"path":105,"stem":106,"icon":55},"\u002Fcpp\u002Fbenchmarks\u002Fgeometry","cpp\u002F3.benchmarks\u002F4.geometry",{"title":57,"path":108,"stem":109,"icon":60},"\u002Fcpp\u002Fbenchmarks\u002Fremesh","cpp\u002F3.benchmarks\u002F5.remesh",{"title":62,"path":111,"stem":112,"icon":65},"\u002Fcpp\u002Fbenchmarks\u002Fintersect","cpp\u002F3.benchmarks\u002F6.intersect",{"title":67,"path":114,"stem":115,"icon":70},"\u002Fcpp\u002Fbenchmarks\u002Fcut","cpp\u002F3.benchmarks\u002F7.cut",{"title":87,"path":117,"stem":118,"icon":90},"\u002Fcpp\u002Fbenchmarks\u002Fio","cpp\u002F3.benchmarks\u002F8.io",{"title":120,"path":121,"stem":122,"children":123,"icon":27},"VTK","\u002Fcpp\u002Fvtk","cpp\u002F4.vtk\u002F1.index",[124,126,129,134,139],{"title":34,"path":121,"stem":122,"icon":125},"i-lucide-layers",{"title":37,"path":127,"stem":128,"icon":40},"\u002Fcpp\u002Fvtk\u002Fcore","cpp\u002F4.vtk\u002F2.core",{"title":130,"path":131,"stem":132,"icon":133},"Functions","\u002Fcpp\u002Fvtk\u002Ffunctions","cpp\u002F4.vtk\u002F3.functions","i-lucide-function-square",{"title":135,"path":136,"stem":137,"icon":138},"Filters","\u002Fcpp\u002Fvtk\u002Ffilters","cpp\u002F4.vtk\u002F4.filters","i-lucide-filter",{"title":140,"path":141,"stem":142,"icon":26},"Examples","\u002Fcpp\u002Fvtk\u002Fexamples","cpp\u002F4.vtk\u002F5.examples",{"title":140,"path":144,"stem":145,"children":146,"icon":27},"\u002Fcpp\u002Fexamples","cpp\u002F5.examples\u002F0.index",[147,149,154,159,164,168],{"title":34,"path":144,"stem":145,"icon":148},"i-lucide-book-open",{"title":150,"path":151,"stem":152,"icon":153},"Geometry Walkthrough","\u002Fcpp\u002Fexamples\u002Fmesh-assembly","cpp\u002F5.examples\u002F1.mesh-assembly","i-lucide-box",{"title":155,"path":156,"stem":157,"icon":158},"Point Cloud Alignment","\u002Fcpp\u002Fexamples\u002Falignment","cpp\u002F5.examples\u002F2.alignment","i-lucide-move",{"title":160,"path":161,"stem":162,"icon":163},"Arrangements and Volumes","\u002Fcpp\u002Fexamples\u002Farrangements","cpp\u002F5.examples\u002F3.arrangements","i-lucide-layers-3",{"title":165,"path":166,"stem":167,"icon":125},"VTK Integration","\u002Fcpp\u002Fexamples\u002Fvtk","cpp\u002F5.examples\u002F4.vtk",{"title":169,"path":170,"stem":171,"icon":172},"Coming from Other Libraries","\u002Fcpp\u002Fexamples\u002Flibrary-comparisons","cpp\u002F5.examples\u002F5.library-comparisons","i-lucide-git-compare",{"title":174,"path":175,"stem":176,"children":177,"page":27},"About","\u002Fcpp\u002Fabout","cpp\u002F6.about",[178,182,187],{"title":179,"path":180,"stem":181,"icon":148},"Research","\u002Fcpp\u002Fabout\u002Fresearch","cpp\u002F6.about\u002F1.research",{"title":183,"path":184,"stem":185,"icon":186},"Contributing","\u002Fcpp\u002Fabout\u002Fcontributing","cpp\u002F6.about\u002F2.contributing","i-lucide-heart-handshake",{"title":188,"path":189,"stem":190,"icon":191},"License","\u002Fcpp\u002Fabout\u002Flicense","cpp\u002F6.about\u002F3.license","i-lucide-file-text",{"cpp":193,"py":245,"ts":358},[194],{"title":5,"path":6,"stem":7,"children":195,"page":27},[196,201,215,225,232,240],{"title":10,"path":11,"stem":12,"children":197,"icon":27},[198,199,200],{"title":15,"path":11,"stem":12,"icon":16},{"title":18,"path":19,"stem":20,"icon":21},{"title":23,"path":24,"stem":25,"icon":26},{"title":29,"path":30,"stem":31,"children":202,"icon":27},[203,204,205,206,207,208,209,210,211,212,213,214],{"title":34,"path":30,"stem":31,"icon":35},{"title":37,"path":38,"stem":39,"icon":40},{"title":42,"path":43,"stem":44,"icon":45},{"title":47,"path":48,"stem":49,"icon":50},{"title":52,"path":53,"stem":54,"icon":55},{"title":57,"path":58,"stem":59,"icon":60},{"title":62,"path":63,"stem":64,"icon":65},{"title":67,"path":68,"stem":69,"icon":70},{"title":72,"path":73,"stem":74,"icon":75},{"title":77,"path":78,"stem":79,"icon":80},{"title":82,"path":83,"stem":84,"icon":85},{"title":87,"path":88,"stem":89,"icon":90},{"title":92,"path":93,"stem":94,"children":216,"icon":27},[217,218,219,220,221,222,223,224],{"title":34,"path":93,"stem":94,"icon":97},{"title":42,"path":99,"stem":100,"icon":45},{"title":47,"path":102,"stem":103,"icon":50},{"title":52,"path":105,"stem":106,"icon":55},{"title":57,"path":108,"stem":109,"icon":60},{"title":62,"path":111,"stem":112,"icon":65},{"title":67,"path":114,"stem":115,"icon":70},{"title":87,"path":117,"stem":118,"icon":90},{"title":120,"path":121,"stem":122,"children":226,"icon":27},[227,228,229,230,231],{"title":34,"path":121,"stem":122,"icon":125},{"title":37,"path":127,"stem":128,"icon":40},{"title":130,"path":131,"stem":132,"icon":133},{"title":135,"path":136,"stem":137,"icon":138},{"title":140,"path":141,"stem":142,"icon":26},{"title":140,"path":144,"stem":145,"children":233,"icon":27},[234,235,236,237,238,239],{"title":34,"path":144,"stem":145,"icon":148},{"title":150,"path":151,"stem":152,"icon":153},{"title":155,"path":156,"stem":157,"icon":158},{"title":160,"path":161,"stem":162,"icon":163},{"title":165,"path":166,"stem":167,"icon":125},{"title":169,"path":170,"stem":171,"icon":172},{"title":174,"path":175,"stem":176,"children":241,"page":27},[242,243,244],{"title":179,"path":180,"stem":181,"icon":148},{"title":183,"path":184,"stem":185,"icon":186},{"title":188,"path":189,"stem":190,"icon":191},[246],{"title":247,"path":248,"stem":249,"children":250,"page":27},"Py","\u002Fpy","py",[251,262,297,302,323,345],{"title":10,"path":252,"stem":253,"children":254,"icon":27},"\u002Fpy\u002Fgetting-started","py\u002F1.getting-started\u002F1.index",[255,256,259],{"title":15,"path":252,"stem":253,"icon":16},{"title":18,"path":257,"stem":258,"icon":21},"\u002Fpy\u002Fgetting-started\u002Finstallation","py\u002F1.getting-started\u002F2.installation",{"title":23,"path":260,"stem":261,"icon":26},"\u002Fpy\u002Fgetting-started\u002Flive-examples","py\u002F1.getting-started\u002F3.live-examples",{"title":29,"path":263,"stem":264,"children":265,"icon":27},"\u002Fpy\u002Fmodules","py\u002F2.modules\u002F00.index",[266,267,270,273,276,279,282,285,288,291,294],{"title":34,"path":263,"stem":264,"icon":35},{"title":37,"path":268,"stem":269,"icon":40},"\u002Fpy\u002Fmodules\u002Fcore","py\u002F2.modules\u002F01.core",{"title":42,"path":271,"stem":272,"icon":45},"\u002Fpy\u002Fmodules\u002Fspatial","py\u002F2.modules\u002F02.spatial",{"title":47,"path":274,"stem":275,"icon":50},"\u002Fpy\u002Fmodules\u002Ftopology","py\u002F2.modules\u002F03.topology",{"title":52,"path":277,"stem":278,"icon":55},"\u002Fpy\u002Fmodules\u002Fgeometry","py\u002F2.modules\u002F04.geometry",{"title":57,"path":280,"stem":281,"icon":60},"\u002Fpy\u002Fmodules\u002Fremesh","py\u002F2.modules\u002F05.remesh",{"title":62,"path":283,"stem":284,"icon":65},"\u002Fpy\u002Fmodules\u002Fintersect","py\u002F2.modules\u002F06.intersect",{"title":67,"path":286,"stem":287,"icon":70},"\u002Fpy\u002Fmodules\u002Fcut","py\u002F2.modules\u002F07.cut",{"title":77,"path":289,"stem":290,"icon":80},"\u002Fpy\u002Fmodules\u002Fclean","py\u002F2.modules\u002F08.clean",{"title":82,"path":292,"stem":293,"icon":85},"\u002Fpy\u002Fmodules\u002Freindex","py\u002F2.modules\u002F09.reidx",{"title":87,"path":295,"stem":296,"icon":90},"\u002Fpy\u002Fmodules\u002Fio","py\u002F2.modules\u002F10.io",{"title":92,"path":298,"stem":299,"children":300,"icon":27},"\u002Fpy\u002Fbenchmarks","py\u002F3.benchmarks\u002F1.index",[301],{"title":34,"path":298,"stem":299,"icon":97},{"title":303,"path":304,"stem":305,"children":306,"icon":27},"Blender","\u002Fpy\u002Fblender","py\u002F4.blender\u002F1.index",[307,309,314,318],{"title":34,"path":304,"stem":305,"icon":308},"i-vscode-icons:file-type-blender",{"title":310,"path":311,"stem":312,"icon":313},"Convert","\u002Fpy\u002Fblender\u002Fconvert","py\u002F4.blender\u002F2.convert","i-lucide-repeat",{"title":315,"path":316,"stem":317,"icon":125},"Scene","\u002Fpy\u002Fblender\u002Fscene","py\u002F4.blender\u002F3.scene",{"title":319,"path":320,"stem":321,"icon":322},"Plugin Architecture","\u002Fpy\u002Fblender\u002Fplugin","py\u002F4.blender\u002F4.plugin","i-lucide-puzzle",{"title":140,"path":324,"stem":325,"children":326,"icon":27},"\u002Fpy\u002Fexamples","py\u002F5.examples\u002F0.index",[327,328,333,336,340],{"title":34,"path":324,"stem":325,"icon":148},{"title":329,"path":330,"stem":331,"icon":332},"Core Functionality","\u002Fpy\u002Fexamples\u002Fcore-functionality","py\u002F5.examples\u002F2.core-functionality","i-lucide-code",{"title":160,"path":334,"stem":335,"icon":163},"\u002Fpy\u002Fexamples\u002Farrangements","py\u002F5.examples\u002F3.arrangements",{"title":165,"path":337,"stem":338,"icon":339},"\u002Fpy\u002Fexamples\u002Fvtk-integration","py\u002F5.examples\u002F4.vtk-integration","i-lucide-grid-2x2",{"title":341,"path":342,"stem":343,"icon":344},"Raycast Rendering","\u002Fpy\u002Fexamples\u002Fraycast-rendering","py\u002F5.examples\u002F5.raycast-rendering","i-lucide-scan-line",{"title":174,"path":346,"stem":347,"children":348,"page":27},"\u002Fpy\u002Fabout","py\u002F6.about",[349,352,355],{"title":179,"path":350,"stem":351,"icon":148},"\u002Fpy\u002Fabout\u002Fresearch","py\u002F6.about\u002F1.research",{"title":183,"path":353,"stem":354,"icon":186},"\u002Fpy\u002Fabout\u002Fcontributing","py\u002F6.about\u002F2.contributing",{"title":188,"path":356,"stem":357,"icon":191},"\u002Fpy\u002Fabout\u002Flicense","py\u002F6.about\u002F3.license",[359],{"title":360,"path":361,"stem":362,"children":363,"page":27},"Ts","\u002Fts","ts",[364,375,410,415,432],{"title":10,"path":365,"stem":366,"children":367,"icon":27},"\u002Fts\u002Fgetting-started","ts\u002F1.getting-started\u002F1.index",[368,369,372],{"title":15,"path":365,"stem":366,"icon":16},{"title":18,"path":370,"stem":371,"icon":21},"\u002Fts\u002Fgetting-started\u002Finstallation","ts\u002F1.getting-started\u002F2.installation",{"title":23,"path":373,"stem":374,"icon":26},"\u002Fts\u002Fgetting-started\u002Flive-examples","ts\u002F1.getting-started\u002F3.live-examples",{"title":29,"path":376,"stem":377,"children":378,"icon":27},"\u002Fts\u002Fmodules","ts\u002F2.modules\u002F00.index",[379,380,383,386,389,392,395,398,401,404,407],{"title":34,"path":376,"stem":377,"icon":35},{"title":37,"path":381,"stem":382,"icon":40},"\u002Fts\u002Fmodules\u002Fcore","ts\u002F2.modules\u002F01.core",{"title":42,"path":384,"stem":385,"icon":45},"\u002Fts\u002Fmodules\u002Fspatial","ts\u002F2.modules\u002F02.spatial",{"title":47,"path":387,"stem":388,"icon":50},"\u002Fts\u002Fmodules\u002Ftopology","ts\u002F2.modules\u002F03.topology",{"title":52,"path":390,"stem":391,"icon":55},"\u002Fts\u002Fmodules\u002Fgeometry","ts\u002F2.modules\u002F04.geometry",{"title":57,"path":393,"stem":394,"icon":60},"\u002Fts\u002Fmodules\u002Fremesh","ts\u002F2.modules\u002F05.remesh",{"title":62,"path":396,"stem":397,"icon":65},"\u002Fts\u002Fmodules\u002Fintersect","ts\u002F2.modules\u002F06.intersect",{"title":67,"path":399,"stem":400,"icon":70},"\u002Fts\u002Fmodules\u002Fcut","ts\u002F2.modules\u002F07.cut",{"title":77,"path":402,"stem":403,"icon":80},"\u002Fts\u002Fmodules\u002Fclean","ts\u002F2.modules\u002F08.clean",{"title":82,"path":405,"stem":406,"icon":85},"\u002Fts\u002Fmodules\u002Freindex","ts\u002F2.modules\u002F09.reidx",{"title":87,"path":408,"stem":409,"icon":90},"\u002Fts\u002Fmodules\u002Fio","ts\u002F2.modules\u002F10.io",{"title":92,"path":411,"stem":412,"children":413,"icon":27},"\u002Fts\u002Fbenchmarks","ts\u002F3.benchmarks\u002F1.index",[414],{"title":34,"path":411,"stem":412,"icon":97},{"title":140,"path":416,"stem":417,"children":418,"icon":27},"\u002Fts\u002Fexamples","ts\u002F4.examples\u002F0.index",[419,420,423,428],{"title":34,"path":416,"stem":417,"icon":148},{"title":329,"path":421,"stem":422,"icon":332},"\u002Fts\u002Fexamples\u002Fcore-functionality","ts\u002F4.examples\u002F2.core-functionality",{"title":424,"path":425,"stem":426,"icon":427},"Alignment","\u002Fts\u002Fexamples\u002Falignment","ts\u002F4.examples\u002F3.alignment","i-lucide-move-3d",{"title":341,"path":429,"stem":430,"icon":431},"\u002Fts\u002Fexamples\u002Fraycast-render","ts\u002F4.examples\u002F4.raycast-render","i-lucide-image",{"title":174,"icon":27,"path":433,"stem":434,"children":435,"page":27},"\u002Fts\u002Fabout","ts\u002F5.about",[436,439,442],{"title":179,"path":437,"stem":438,"icon":148},"\u002Fts\u002Fabout\u002Fresearch","ts\u002F5.about\u002F1.research",{"title":183,"path":440,"stem":441,"icon":186},"\u002Fts\u002Fabout\u002Fcontributing","ts\u002F5.about\u002F2.contributing",{"title":188,"path":443,"stem":444,"icon":191},"\u002Fts\u002Fabout\u002Flicense","ts\u002F5.about\u002F3.license",{"id":446,"title":72,"body":447,"description":2107,"extension":2108,"links":2109,"meta":2110,"navigation":2111,"path":73,"seo":2112,"stem":74,"__hash__":2113},"docsCpp\u002Fcpp\u002F2.modules\u002F08.csg.md",{"type":448,"value":449,"toc":2096},"minimark",[450,454,457,486,490,493,539,731,738,743,766,816,829,911,917,920,924,934,984,1075,1083,1087,1097,1169,1178,1182,1188,1391,1395,1420,1712,1719,1723,1726,2027,2030,2034,2082,2092],[451,452,453],"p",{},"The CSG module builds an arrangement of N forms once and evaluates any boolean expression over them — no need to chain pairwise booleans.",[451,455,456],{},"Include the module with:",[458,459,463],"pre",{"className":460,"code":461,"language":7,"meta":462,"style":462},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","#include \u003Ctrueform\u002Fcsg.hpp>\n","",[464,465,466],"code",{"__ignoreMap":462},[467,468,471,475,479,483],"span",{"class":469,"line":470},"line",1,[467,472,474],{"class":473},"s7zQu","#include",[467,476,478],{"class":477},"sMK4o"," \u003C",[467,480,482],{"class":481},"sfazB","trueform\u002Fcsg.hpp",[467,484,485],{"class":477},">\n",[487,488,34],"h2",{"id":489},"overview",[451,491,492],{},"A CSG computation has three pieces:",[494,495,496,504,532],"ul",{},[497,498,499,500,503],"li",{},"A ",[464,501,502],{},"tf::csg_graph"," — the implicit arrangement of N forms, built once.",[497,505,499,506,509,510,513,514,513,517,513,520,523,524,527,528,531],{},[464,507,508],{},"tf::csg::expr"," — a runtime boolean expression over operand ids.\nBuilt from ",[464,511,512],{},"tf::csg::merge",", ",[464,515,516],{},"tf::csg::intersection",[464,518,519],{},"tf::csg::difference",[464,521,522],{},"tf::csg::complement",", plus ",[464,525,526],{},"tf::csg::any_of"," \u002F ",[464,529,530],{},"tf::csg::all_of"," for ranges.",[497,533,534,535,538],{},"An extraction call: ",[464,536,537],{},"tf::make_csg_mesh(graph, expr)",".",[458,540,543],{"className":460,"code":541,"filename":542,"language":7,"meta":462,"style":462},"std::vector forms{ mesh0.polygons(), mesh1.polygons(), mesh2.polygons() };\nauto graph = tf::make_csg_graph(tf::make_range(forms));\n\nauto expr = tf::csg::difference(0, tf::csg::merge(1, 2));   \u002F\u002F a \\ (b ∪ c)\nauto out  = tf::make_csg_mesh(graph, expr);\n","csg_basic.cpp",[464,544,545,595,635,642,701],{"__ignoreMap":462},[467,546,547,551,554,558,561,564,566,570,573,576,578,580,582,585,587,589,592],{"class":469,"line":470},[467,548,550],{"class":549},"sBMFI","std",[467,552,553],{"class":477},"::",[467,555,557],{"class":556},"sTEyZ","vector forms",[467,559,560],{"class":477},"{",[467,562,563],{"class":556}," mesh0",[467,565,538],{"class":477},[467,567,569],{"class":568},"s2Zo4","polygons",[467,571,572],{"class":477},"(),",[467,574,575],{"class":556}," mesh1",[467,577,538],{"class":477},[467,579,569],{"class":568},[467,581,572],{"class":477},[467,583,584],{"class":556}," mesh2",[467,586,538],{"class":477},[467,588,569],{"class":568},[467,590,591],{"class":477},"()",[467,593,594],{"class":477}," };\n",[467,596,598,602,605,608,611,613,616,619,622,624,627,629,632],{"class":469,"line":597},2,[467,599,601],{"class":600},"spNyl","auto",[467,603,604],{"class":556}," graph ",[467,606,607],{"class":477},"=",[467,609,610],{"class":549}," tf",[467,612,553],{"class":477},[467,614,615],{"class":568},"make_csg_graph",[467,617,618],{"class":477},"(",[467,620,621],{"class":549},"tf",[467,623,553],{"class":477},[467,625,626],{"class":568},"make_range",[467,628,618],{"class":477},[467,630,631],{"class":556},"forms",[467,633,634],{"class":477},"));\n",[467,636,638],{"class":469,"line":637},3,[467,639,641],{"emptyLinePlaceholder":640},true,"\n",[467,643,645,647,650,652,654,656,659,661,664,666,670,673,675,677,679,681,684,686,689,691,694,697],{"class":469,"line":644},4,[467,646,601],{"class":600},[467,648,649],{"class":556}," expr ",[467,651,607],{"class":477},[467,653,610],{"class":549},[467,655,553],{"class":477},[467,657,658],{"class":549},"csg",[467,660,553],{"class":477},[467,662,663],{"class":568},"difference",[467,665,618],{"class":477},[467,667,669],{"class":668},"sbssI","0",[467,671,672],{"class":477},",",[467,674,610],{"class":549},[467,676,553],{"class":477},[467,678,658],{"class":549},[467,680,553],{"class":477},[467,682,683],{"class":568},"merge",[467,685,618],{"class":477},[467,687,688],{"class":668},"1",[467,690,672],{"class":477},[467,692,693],{"class":668}," 2",[467,695,696],{"class":477},"));",[467,698,700],{"class":699},"sHwdD","   \u002F\u002F a \\ (b ∪ c)\n",[467,702,704,706,709,711,713,715,718,720,723,725,728],{"class":469,"line":703},5,[467,705,601],{"class":600},[467,707,708],{"class":556}," out  ",[467,710,607],{"class":477},[467,712,610],{"class":549},[467,714,553],{"class":477},[467,716,717],{"class":568},"make_csg_mesh",[467,719,618],{"class":477},[467,721,722],{"class":556},"graph",[467,724,672],{"class":477},[467,726,727],{"class":556}," expr",[467,729,730],{"class":477},");\n",[451,732,733,734,737],{},"Operand ids are positions in the forms range. Integers are auto-promoted to leaves, so ",[464,735,736],{},"tf::csg::merge(0, 1, 2)"," reads exactly like the algebra.",[739,740,742],"h3",{"id":741},"configuration-supported-input","Configuration & Supported Input",[451,744,745,748,749,756,757,760,761,765],{},[464,746,747],{},"tf::make_csg_graph"," takes an optional ",[750,751,753],"a",{"href":752},"\u002Fcpp\u002Fmodules\u002Fintersect#intersection-configuration",[464,754,755],{},"tf::intersect_config"," — the same config used by ",[464,758,759],{},"make_boolean"," and the arrangement constructors. ",[762,763,764],"strong",{},"The config's mode flags decide what kinds of input are accepted and how degeneracies are resolved."," What works in CSG is exactly what works under that mode:",[767,768,769,782],"table",{},[770,771,772],"thead",{},[773,774,775,779],"tr",{},[776,777,778],"th",{},"Mode flag",[776,780,781],{},"What CSG accepts when set",[783,784,785,796,806],"tbody",{},[773,786,787,793],{},[788,789,790],"td",{},[464,791,792],{},"tf::intersect_mode::primitives",[788,794,795],{},"Full 5-type intersection classification — handles shared edges, shared vertices, coplanar faces (aligned vs opposing boundary), and non-manifold edges shared by 3+ faces.",[773,797,798,803],{},[788,799,800],{},[464,801,802],{},"tf::intersect_mode::sos",[788,804,805],{},"Symbolic-perturbation path: all intersections are edge-face, no degenerate cases. Faster, but cannot represent coplanar overlap or shared-vertex contact.",[773,807,808,813],{},[788,809,810],{},[464,811,812],{},"tf::intersect_mode::resolve_crossing_contours",[788,814,815],{},"Resolves crossings between intersection curves from different form pairs that meet on the same face — required when more than two forms can pairwise intersect along the same face.",[451,817,818,819,821,822,825,826,828],{},"The default for ",[464,820,747],{}," is ",[464,823,824],{},"primitives | resolve_crossing_contours",", matching ",[464,827,759],{},". Override only when you have a reason to:",[458,830,832],{"className":460,"code":831,"language":7,"meta":462,"style":462},"tf::intersect_config cfg{tf::intersect_mode::primitives\n                          | tf::intersect_mode::resolve_crossing_contours};\nauto graph = tf::make_csg_graph(tf::make_range(forms), cfg);\n",[464,833,834,858,877],{"__ignoreMap":462},[467,835,836,838,840,843,845,847,849,852,854],{"class":469,"line":470},[467,837,621],{"class":549},[467,839,553],{"class":477},[467,841,842],{"class":556},"intersect_config cfg",[467,844,560],{"class":477},[467,846,621],{"class":549},[467,848,553],{"class":477},[467,850,851],{"class":549},"intersect_mode",[467,853,553],{"class":477},[467,855,857],{"class":856},"swJcz","primitives\n",[467,859,860,863,865,867,869,871,874],{"class":469,"line":597},[467,861,862],{"class":477},"                          |",[467,864,610],{"class":549},[467,866,553],{"class":477},[467,868,851],{"class":549},[467,870,553],{"class":477},[467,872,873],{"class":856},"resolve_crossing_contours",[467,875,876],{"class":477},"};\n",[467,878,879,881,883,885,887,889,891,893,895,897,899,901,903,906,909],{"class":469,"line":637},[467,880,601],{"class":600},[467,882,604],{"class":556},[467,884,607],{"class":477},[467,886,610],{"class":549},[467,888,553],{"class":477},[467,890,615],{"class":568},[467,892,618],{"class":477},[467,894,621],{"class":549},[467,896,553],{"class":477},[467,898,626],{"class":568},[467,900,618],{"class":477},[467,902,631],{"class":556},[467,904,905],{"class":477},"),",[467,907,908],{"class":556}," cfg",[467,910,730],{"class":477},[451,912,913,914,538],{},"Full flag semantics, the tolerance field, and the mode-vs-config equivalence are documented in ",[750,915,916],{"href":752},"Intersect: Intersection Configuration",[451,918,919],{},"Regardless of mode, each form should be PWN (piecewise winding number) — locally consistent orientation. The per-domain inclusion lattice that backs every boolean expression only carries meaning when each form draws a clean inside\u002Foutside boundary.",[739,921,923],{"id":922},"coordinate-precision","Coordinate Precision",[451,925,926,927,930,931,933],{},"The arrangement uses exact integer arithmetic internally. The lattice resolution is selected by the ",[464,928,929],{},"Int"," template parameter on ",[464,932,615],{}," and resolves automatically from the input coordinate type:",[767,935,936,948],{},[770,937,938],{},[773,939,940,943],{},[776,941,942],{},"Input scalar",[776,944,945,946],{},"Resolved ",[464,947,929],{},[783,949,950,962,974],{},[773,951,952,957],{},[788,953,954],{},[464,955,956],{},"float",[788,958,959],{},[464,960,961],{},"tf::exact::int32",[773,963,964,969],{},[788,965,966],{},[464,967,968],{},"double",[788,970,971],{},[464,972,973],{},"tf::exact::int64",[773,975,976,979],{},[788,977,978],{},"any other",[788,980,981,983],{},[464,982,961],{}," (fallback)",[458,985,987],{"className":460,"code":986,"language":7,"meta":462,"style":462},"\u002F\u002F Auto-resolved\nauto graph = tf::make_csg_graph(tf::make_range(forms));\n\n\u002F\u002F Explicit override\nauto graph = tf::make_csg_graph\u003Ctf::exact::int64>(tf::make_range(forms));\n",[464,988,989,994,1022,1026,1031],{"__ignoreMap":462},[467,990,991],{"class":469,"line":470},[467,992,993],{"class":699},"\u002F\u002F Auto-resolved\n",[467,995,996,998,1000,1002,1004,1006,1008,1010,1012,1014,1016,1018,1020],{"class":469,"line":597},[467,997,601],{"class":600},[467,999,604],{"class":556},[467,1001,607],{"class":477},[467,1003,610],{"class":549},[467,1005,553],{"class":477},[467,1007,615],{"class":568},[467,1009,618],{"class":477},[467,1011,621],{"class":549},[467,1013,553],{"class":477},[467,1015,626],{"class":568},[467,1017,618],{"class":477},[467,1019,631],{"class":556},[467,1021,634],{"class":477},[467,1023,1024],{"class":469,"line":637},[467,1025,641],{"emptyLinePlaceholder":640},[467,1027,1028],{"class":469,"line":644},[467,1029,1030],{"class":699},"\u002F\u002F Explicit override\n",[467,1032,1033,1035,1037,1039,1041,1043,1045,1048,1050,1052,1055,1057,1060,1063,1065,1067,1069,1071,1073],{"class":469,"line":703},[467,1034,601],{"class":600},[467,1036,604],{"class":556},[467,1038,607],{"class":477},[467,1040,610],{"class":549},[467,1042,553],{"class":477},[467,1044,615],{"class":568},[467,1046,1047],{"class":477},"\u003C",[467,1049,621],{"class":549},[467,1051,553],{"class":477},[467,1053,1054],{"class":549},"exact",[467,1056,553],{"class":477},[467,1058,1059],{"class":549},"int64",[467,1061,1062],{"class":477},">(",[467,1064,621],{"class":549},[467,1066,553],{"class":477},[467,1068,626],{"class":568},[467,1070,618],{"class":477},[467,1072,631],{"class":556},[467,1074,634],{"class":477},[451,1076,1077,1078,1082],{},"See ",[750,1079,1081],{"href":1080},"\u002Fcpp\u002Fmodules\u002Fintersect#exact-arithmetic","Intersect: Exact Arithmetic"," for the full precision chain.",[739,1084,1086],{"id":1085},"output-coordinate-type","Output Coordinate Type",[451,1088,1089,1090,930,1093,1096],{},"The output mesh's scalar type is controlled by the ",[464,1091,1092],{},"OutputCoordinateType",[464,1094,1095],{},"tf::make_csg_mesh",". It defaults to the input forms' real type; any floating-point type may be supplied.",[458,1098,1100],{"className":460,"code":1099,"language":7,"meta":462,"style":462},"\u002F\u002F Output matches input\nauto out = tf::make_csg_mesh(graph, expr);\n\n\u002F\u002F Explicit override (independent of the graph's Int)\nauto out = tf::make_csg_mesh\u003Cdouble>(graph, expr);\n",[464,1101,1102,1107,1132,1136,1141],{"__ignoreMap":462},[467,1103,1104],{"class":469,"line":470},[467,1105,1106],{"class":699},"\u002F\u002F Output matches input\n",[467,1108,1109,1111,1114,1116,1118,1120,1122,1124,1126,1128,1130],{"class":469,"line":597},[467,1110,601],{"class":600},[467,1112,1113],{"class":556}," out ",[467,1115,607],{"class":477},[467,1117,610],{"class":549},[467,1119,553],{"class":477},[467,1121,717],{"class":568},[467,1123,618],{"class":477},[467,1125,722],{"class":556},[467,1127,672],{"class":477},[467,1129,727],{"class":556},[467,1131,730],{"class":477},[467,1133,1134],{"class":469,"line":637},[467,1135,641],{"emptyLinePlaceholder":640},[467,1137,1138],{"class":469,"line":644},[467,1139,1140],{"class":699},"\u002F\u002F Explicit override (independent of the graph's Int)\n",[467,1142,1143,1145,1147,1149,1151,1153,1155,1157,1159,1161,1163,1165,1167],{"class":469,"line":703},[467,1144,601],{"class":600},[467,1146,1113],{"class":556},[467,1148,607],{"class":477},[467,1150,610],{"class":549},[467,1152,553],{"class":477},[467,1154,717],{"class":568},[467,1156,1047],{"class":477},[467,1158,968],{"class":600},[467,1160,1062],{"class":477},[467,1162,722],{"class":556},[467,1164,672],{"class":477},[467,1166,727],{"class":556},[467,1168,730],{"class":477},[451,1170,1171,1172,1174,1175,1177],{},"Internally the pipeline carries intersection points at full precision regardless of ",[464,1173,1092],{},"; the parameter only governs the coordinate type at output emission. The ",[464,1176,929],{}," chosen at graph-build time is unchanged.",[487,1179,1181],{"id":1180},"many-operations-one-graph","Many Operations, One Graph",[451,1183,1184,1185,1187],{},"The arrangement is the cost. Once ",[464,1186,722],{}," is built, every additional boolean expression evaluates without re-running the geometric pipeline:",[458,1189,1192],{"className":460,"code":1190,"filename":1191,"language":7,"meta":462,"style":462},"auto graph = tf::make_csg_graph(tf::make_range(forms));\n\nauto m_union = tf::make_csg_mesh(graph, tf::csg::merge(0, 1, 2));\nauto m_inter = tf::make_csg_mesh(graph, tf::csg::intersection(0, 1, 2));\nauto m_diff  = tf::make_csg_mesh(graph,\n                                  tf::csg::difference(0,\n                                    tf::csg::any_of({1, 2})));\n","csg_many.cpp",[464,1193,1194,1222,1226,1272,1318,1340,1360],{"__ignoreMap":462},[467,1195,1196,1198,1200,1202,1204,1206,1208,1210,1212,1214,1216,1218,1220],{"class":469,"line":470},[467,1197,601],{"class":600},[467,1199,604],{"class":556},[467,1201,607],{"class":477},[467,1203,610],{"class":549},[467,1205,553],{"class":477},[467,1207,615],{"class":568},[467,1209,618],{"class":477},[467,1211,621],{"class":549},[467,1213,553],{"class":477},[467,1215,626],{"class":568},[467,1217,618],{"class":477},[467,1219,631],{"class":556},[467,1221,634],{"class":477},[467,1223,1224],{"class":469,"line":597},[467,1225,641],{"emptyLinePlaceholder":640},[467,1227,1228,1230,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261,1263,1266,1268,1270],{"class":469,"line":637},[467,1229,601],{"class":600},[467,1231,1232],{"class":556}," m_union ",[467,1234,607],{"class":477},[467,1236,610],{"class":549},[467,1238,553],{"class":477},[467,1240,717],{"class":568},[467,1242,618],{"class":477},[467,1244,722],{"class":556},[467,1246,672],{"class":477},[467,1248,610],{"class":549},[467,1250,553],{"class":477},[467,1252,658],{"class":549},[467,1254,553],{"class":477},[467,1256,683],{"class":568},[467,1258,618],{"class":477},[467,1260,669],{"class":668},[467,1262,672],{"class":477},[467,1264,1265],{"class":668}," 1",[467,1267,672],{"class":477},[467,1269,693],{"class":668},[467,1271,634],{"class":477},[467,1273,1274,1276,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1304,1306,1308,1310,1312,1314,1316],{"class":469,"line":644},[467,1275,601],{"class":600},[467,1277,1278],{"class":556}," m_inter ",[467,1280,607],{"class":477},[467,1282,610],{"class":549},[467,1284,553],{"class":477},[467,1286,717],{"class":568},[467,1288,618],{"class":477},[467,1290,722],{"class":556},[467,1292,672],{"class":477},[467,1294,610],{"class":549},[467,1296,553],{"class":477},[467,1298,658],{"class":549},[467,1300,553],{"class":477},[467,1302,1303],{"class":568},"intersection",[467,1305,618],{"class":477},[467,1307,669],{"class":668},[467,1309,672],{"class":477},[467,1311,1265],{"class":668},[467,1313,672],{"class":477},[467,1315,693],{"class":668},[467,1317,634],{"class":477},[467,1319,1320,1322,1325,1327,1329,1331,1333,1335,1337],{"class":469,"line":703},[467,1321,601],{"class":600},[467,1323,1324],{"class":556}," m_diff  ",[467,1326,607],{"class":477},[467,1328,610],{"class":549},[467,1330,553],{"class":477},[467,1332,717],{"class":568},[467,1334,618],{"class":477},[467,1336,722],{"class":556},[467,1338,1339],{"class":477},",\n",[467,1341,1343,1346,1348,1350,1352,1354,1356,1358],{"class":469,"line":1342},6,[467,1344,1345],{"class":549},"                                  tf",[467,1347,553],{"class":477},[467,1349,658],{"class":549},[467,1351,553],{"class":477},[467,1353,663],{"class":568},[467,1355,618],{"class":477},[467,1357,669],{"class":668},[467,1359,1339],{"class":477},[467,1361,1363,1366,1368,1370,1372,1375,1377,1379,1381,1383,1385,1388],{"class":469,"line":1362},7,[467,1364,1365],{"class":549},"                                    tf",[467,1367,553],{"class":477},[467,1369,658],{"class":549},[467,1371,553],{"class":477},[467,1373,1374],{"class":568},"any_of",[467,1376,618],{"class":477},[467,1378,560],{"class":556},[467,1380,688],{"class":668},[467,1382,672],{"class":477},[467,1384,693],{"class":668},[467,1386,1387],{"class":556},"}",[467,1389,1390],{"class":477},")));\n",[487,1392,1394],{"id":1393},"with-precomputed-structures","With Precomputed Structures",[451,1396,1397,1399,1400,513,1406,1412,1413,1419],{},[464,1398,747],{}," auto-tags any form that's missing ",[750,1401,1403],{"href":1402},"\u002Fcpp\u002Fmodules\u002Ftopology#face-membership",[464,1404,1405],{},"tf::face_membership",[750,1407,1409],{"href":1408},"\u002Fcpp\u002Fmodules\u002Ftopology#manifold-edge-link",[464,1410,1411],{},"tf::manifold_edge_link",", or ",[750,1414,1416],{"href":1415},"\u002Fcpp\u002Fmodules\u002Fspatial#tftree",[464,1417,1418],{},"tf::tree",". For repeated work — for example, instancing the same canonical mesh many times — pre-tag once and share the structures:",[458,1421,1424],{"className":460,"code":1422,"filename":1423,"language":7,"meta":462,"style":462},"tf::face_membership\u003Cint> fm;\nfm.build(bunny.polygons());\ntf::manifold_edge_link\u003Cint, 3> mel;\nmel.build(bunny.polygons().faces(), fm);\ntf::aabb_tree\u003Cint, float, 3> tree(bunny.polygons(), tf::config_tree(4, 4));\n\nauto bunny_tagged = bunny.polygons() | tf::tag(fm) | tf::tag(mel) | tf::tag(tree);\n\nstd::vector forms{ sphere_tagged, bunny_tagged, bunny_tagged, bunny_tagged };\nauto graph = tf::make_csg_graph(tf::make_range(forms));\n","csg_precomputed.cpp",[464,1425,1426,1449,1471,1496,1525,1581,1585,1649,1654,1683],{"__ignoreMap":462},[467,1427,1428,1430,1432,1435,1437,1440,1443,1446],{"class":469,"line":470},[467,1429,621],{"class":549},[467,1431,553],{"class":477},[467,1433,1434],{"class":556},"face_membership",[467,1436,1047],{"class":477},[467,1438,1439],{"class":600},"int",[467,1441,1442],{"class":477},">",[467,1444,1445],{"class":556}," fm",[467,1447,1448],{"class":477},";\n",[467,1450,1451,1454,1456,1459,1461,1464,1466,1468],{"class":469,"line":597},[467,1452,1453],{"class":556},"fm",[467,1455,538],{"class":477},[467,1457,1458],{"class":568},"build",[467,1460,618],{"class":477},[467,1462,1463],{"class":556},"bunny",[467,1465,538],{"class":477},[467,1467,569],{"class":568},[467,1469,1470],{"class":477},"());\n",[467,1472,1473,1475,1477,1480,1482,1484,1486,1489,1491,1494],{"class":469,"line":637},[467,1474,621],{"class":549},[467,1476,553],{"class":477},[467,1478,1479],{"class":556},"manifold_edge_link",[467,1481,1047],{"class":477},[467,1483,1439],{"class":600},[467,1485,672],{"class":477},[467,1487,1488],{"class":668}," 3",[467,1490,1442],{"class":477},[467,1492,1493],{"class":556}," mel",[467,1495,1448],{"class":477},[467,1497,1498,1501,1503,1505,1507,1509,1511,1513,1516,1519,1521,1523],{"class":469,"line":644},[467,1499,1500],{"class":556},"mel",[467,1502,538],{"class":477},[467,1504,1458],{"class":568},[467,1506,618],{"class":477},[467,1508,1463],{"class":556},[467,1510,538],{"class":477},[467,1512,569],{"class":568},[467,1514,1515],{"class":477},"().",[467,1517,1518],{"class":568},"faces",[467,1520,572],{"class":477},[467,1522,1445],{"class":556},[467,1524,730],{"class":477},[467,1526,1527,1529,1531,1534,1536,1538,1540,1543,1545,1547,1549,1552,1554,1556,1558,1560,1562,1564,1566,1569,1571,1574,1576,1579],{"class":469,"line":703},[467,1528,621],{"class":549},[467,1530,553],{"class":477},[467,1532,1533],{"class":549},"aabb_tree",[467,1535,1047],{"class":477},[467,1537,1439],{"class":600},[467,1539,672],{"class":477},[467,1541,1542],{"class":600}," float",[467,1544,672],{"class":477},[467,1546,1488],{"class":668},[467,1548,1442],{"class":477},[467,1550,1551],{"class":568}," tree",[467,1553,618],{"class":477},[467,1555,1463],{"class":549},[467,1557,538],{"class":556},[467,1559,569],{"class":568},[467,1561,572],{"class":477},[467,1563,610],{"class":549},[467,1565,553],{"class":477},[467,1567,1568],{"class":568},"config_tree",[467,1570,618],{"class":477},[467,1572,1573],{"class":668},"4",[467,1575,672],{"class":477},[467,1577,1578],{"class":668}," 4",[467,1580,634],{"class":477},[467,1582,1583],{"class":469,"line":1342},[467,1584,641],{"emptyLinePlaceholder":640},[467,1586,1587,1589,1592,1594,1597,1599,1601,1603,1606,1608,1610,1613,1615,1617,1620,1622,1624,1626,1628,1630,1632,1634,1636,1638,1640,1642,1644,1647],{"class":469,"line":1362},[467,1588,601],{"class":600},[467,1590,1591],{"class":556}," bunny_tagged ",[467,1593,607],{"class":477},[467,1595,1596],{"class":556}," bunny",[467,1598,538],{"class":477},[467,1600,569],{"class":568},[467,1602,591],{"class":477},[467,1604,1605],{"class":477}," |",[467,1607,610],{"class":549},[467,1609,553],{"class":477},[467,1611,1612],{"class":568},"tag",[467,1614,618],{"class":477},[467,1616,1453],{"class":556},[467,1618,1619],{"class":477},")",[467,1621,1605],{"class":477},[467,1623,610],{"class":549},[467,1625,553],{"class":477},[467,1627,1612],{"class":568},[467,1629,618],{"class":477},[467,1631,1500],{"class":556},[467,1633,1619],{"class":477},[467,1635,1605],{"class":477},[467,1637,610],{"class":549},[467,1639,553],{"class":477},[467,1641,1612],{"class":568},[467,1643,618],{"class":477},[467,1645,1646],{"class":556},"tree",[467,1648,730],{"class":477},[467,1650,1652],{"class":469,"line":1651},8,[467,1653,641],{"emptyLinePlaceholder":640},[467,1655,1657,1659,1661,1663,1665,1668,1670,1673,1675,1677,1679,1681],{"class":469,"line":1656},9,[467,1658,550],{"class":549},[467,1660,553],{"class":477},[467,1662,557],{"class":556},[467,1664,560],{"class":477},[467,1666,1667],{"class":856}," sphere_tagged",[467,1669,672],{"class":477},[467,1671,1672],{"class":856}," bunny_tagged",[467,1674,672],{"class":477},[467,1676,1672],{"class":856},[467,1678,672],{"class":477},[467,1680,1591],{"class":856},[467,1682,876],{"class":477},[467,1684,1686,1688,1690,1692,1694,1696,1698,1700,1702,1704,1706,1708,1710],{"class":469,"line":1685},10,[467,1687,601],{"class":600},[467,1689,604],{"class":556},[467,1691,607],{"class":477},[467,1693,610],{"class":549},[467,1695,553],{"class":477},[467,1697,615],{"class":568},[467,1699,618],{"class":477},[467,1701,621],{"class":549},[467,1703,553],{"class":477},[467,1705,626],{"class":568},[467,1707,618],{"class":477},[467,1709,631],{"class":556},[467,1711,634],{"class":477},[451,1713,1714,1715,1718],{},"All copies of ",[464,1716,1717],{},"bunny_tagged"," share the same FM \u002F MEL \u002F tree — the arrangement build re-uses them across instances.",[487,1720,1722],{"id":1721},"with-transformations","With Transformations",[451,1724,1725],{},"Combine tagged structures with tagged transformations to instance the same canonical mesh at different positions without copying geometry:",[458,1727,1730],{"className":460,"code":1728,"filename":1729,"language":7,"meta":462,"style":462},"auto T1 = tf::make_transformation_from_translation(tf::make_vector(1.0f, 0, 0));\nauto T2 = tf::make_transformation_from_translation(tf::make_vector(0, 1.0f, 0));\n\nstd::vector forms{\n    sphere_tagged | tf::tag(tf::make_frame(tf::transformation\u003Cfloat, 3>{})),\n    bunny_tagged  | tf::tag(tf::make_frame(T1)),\n    bunny_tagged  | tf::tag(tf::make_frame(T2)),\n};\n\nauto graph = tf::make_csg_graph(tf::make_range(forms));\nauto out   = tf::make_csg_mesh(graph,\n                                tf::csg::difference(0, tf::csg::merge(1, 2)));\n","csg_transformed.cpp",[464,1731,1732,1773,1811,1815,1826,1874,1902,1929,1933,1937,1965,1987],{"__ignoreMap":462},[467,1733,1734,1736,1739,1741,1743,1745,1748,1750,1752,1754,1757,1759,1762,1764,1767,1769,1771],{"class":469,"line":470},[467,1735,601],{"class":600},[467,1737,1738],{"class":556}," T1 ",[467,1740,607],{"class":477},[467,1742,610],{"class":549},[467,1744,553],{"class":477},[467,1746,1747],{"class":568},"make_transformation_from_translation",[467,1749,618],{"class":477},[467,1751,621],{"class":549},[467,1753,553],{"class":477},[467,1755,1756],{"class":568},"make_vector",[467,1758,618],{"class":477},[467,1760,1761],{"class":668},"1.0f",[467,1763,672],{"class":477},[467,1765,1766],{"class":668}," 0",[467,1768,672],{"class":477},[467,1770,1766],{"class":668},[467,1772,634],{"class":477},[467,1774,1775,1777,1780,1782,1784,1786,1788,1790,1792,1794,1796,1798,1800,1802,1805,1807,1809],{"class":469,"line":597},[467,1776,601],{"class":600},[467,1778,1779],{"class":556}," T2 ",[467,1781,607],{"class":477},[467,1783,610],{"class":549},[467,1785,553],{"class":477},[467,1787,1747],{"class":568},[467,1789,618],{"class":477},[467,1791,621],{"class":549},[467,1793,553],{"class":477},[467,1795,1756],{"class":568},[467,1797,618],{"class":477},[467,1799,669],{"class":668},[467,1801,672],{"class":477},[467,1803,1804],{"class":668}," 1.0f",[467,1806,672],{"class":477},[467,1808,1766],{"class":668},[467,1810,634],{"class":477},[467,1812,1813],{"class":469,"line":637},[467,1814,641],{"emptyLinePlaceholder":640},[467,1816,1817,1819,1821,1823],{"class":469,"line":644},[467,1818,550],{"class":549},[467,1820,553],{"class":477},[467,1822,557],{"class":556},[467,1824,1825],{"class":477},"{\n",[467,1827,1828,1831,1834,1836,1838,1840,1842,1844,1846,1849,1851,1853,1855,1858,1860,1862,1864,1866,1868,1871],{"class":469,"line":703},[467,1829,1830],{"class":856},"    sphere_tagged ",[467,1832,1833],{"class":477},"|",[467,1835,610],{"class":549},[467,1837,553],{"class":477},[467,1839,1612],{"class":568},[467,1841,618],{"class":477},[467,1843,621],{"class":549},[467,1845,553],{"class":477},[467,1847,1848],{"class":568},"make_frame",[467,1850,618],{"class":477},[467,1852,621],{"class":549},[467,1854,553],{"class":477},[467,1856,1857],{"class":856},"transformation",[467,1859,1047],{"class":477},[467,1861,956],{"class":600},[467,1863,672],{"class":477},[467,1865,1488],{"class":668},[467,1867,1442],{"class":477},[467,1869,1870],{"class":856},"{}",[467,1872,1873],{"class":477},")),\n",[467,1875,1876,1879,1881,1883,1885,1887,1889,1891,1893,1895,1897,1900],{"class":469,"line":1342},[467,1877,1878],{"class":856},"    bunny_tagged  ",[467,1880,1833],{"class":477},[467,1882,610],{"class":549},[467,1884,553],{"class":477},[467,1886,1612],{"class":568},[467,1888,618],{"class":477},[467,1890,621],{"class":549},[467,1892,553],{"class":477},[467,1894,1848],{"class":568},[467,1896,618],{"class":477},[467,1898,1899],{"class":856},"T1",[467,1901,1873],{"class":477},[467,1903,1904,1906,1908,1910,1912,1914,1916,1918,1920,1922,1924,1927],{"class":469,"line":1362},[467,1905,1878],{"class":856},[467,1907,1833],{"class":477},[467,1909,610],{"class":549},[467,1911,553],{"class":477},[467,1913,1612],{"class":568},[467,1915,618],{"class":477},[467,1917,621],{"class":549},[467,1919,553],{"class":477},[467,1921,1848],{"class":568},[467,1923,618],{"class":477},[467,1925,1926],{"class":856},"T2",[467,1928,1873],{"class":477},[467,1930,1931],{"class":469,"line":1651},[467,1932,876],{"class":477},[467,1934,1935],{"class":469,"line":1656},[467,1936,641],{"emptyLinePlaceholder":640},[467,1938,1939,1941,1943,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963],{"class":469,"line":1685},[467,1940,601],{"class":600},[467,1942,604],{"class":556},[467,1944,607],{"class":477},[467,1946,610],{"class":549},[467,1948,553],{"class":477},[467,1950,615],{"class":568},[467,1952,618],{"class":477},[467,1954,621],{"class":549},[467,1956,553],{"class":477},[467,1958,626],{"class":568},[467,1960,618],{"class":477},[467,1962,631],{"class":556},[467,1964,634],{"class":477},[467,1966,1968,1970,1973,1975,1977,1979,1981,1983,1985],{"class":469,"line":1967},11,[467,1969,601],{"class":600},[467,1971,1972],{"class":556}," out   ",[467,1974,607],{"class":477},[467,1976,610],{"class":549},[467,1978,553],{"class":477},[467,1980,717],{"class":568},[467,1982,618],{"class":477},[467,1984,722],{"class":556},[467,1986,1339],{"class":477},[467,1988,1990,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025],{"class":469,"line":1989},12,[467,1991,1992],{"class":549},"                                tf",[467,1994,553],{"class":477},[467,1996,658],{"class":549},[467,1998,553],{"class":477},[467,2000,663],{"class":568},[467,2002,618],{"class":477},[467,2004,669],{"class":668},[467,2006,672],{"class":477},[467,2008,610],{"class":549},[467,2010,553],{"class":477},[467,2012,658],{"class":549},[467,2014,553],{"class":477},[467,2016,683],{"class":568},[467,2018,618],{"class":477},[467,2020,688],{"class":668},[467,2022,672],{"class":477},[467,2024,693],{"class":668},[467,2026,1390],{"class":477},[451,2028,2029],{},"One tagged canonical mesh + N frames + one graph is the cheapest way to fold many instances of the same shape into a single boolean.",[487,2031,2033],{"id":2032},"relationship-to-cut","Relationship to Cut",[767,2035,2036,2046],{},[770,2037,2038],{},[773,2039,2040,2042,2044],{},[776,2041],{},[776,2043,67],{},[776,2045,72],{},[783,2047,2048,2059,2071],{},[773,2049,2050,2053,2056],{},[788,2051,2052],{},"Operands",[788,2054,2055],{},"1 or 2",[788,2057,2058],{},"N",[773,2060,2061,2064,2066],{},[788,2062,2063],{},"Ops per call",[788,2065,688],{},[788,2067,2068,2069,1619],{},"unbounded (one graph, many ",[464,2070,717],{},[773,2072,2073,2076,2079],{},[788,2074,2075],{},"Output",[788,2077,2078],{},"materialized mesh + face labels",[788,2080,2081],{},"materialized mesh per expression",[451,2083,2084,2085,2091],{},"Anything binary fits cleanly in ",[750,2086,2088],{"href":2087},"\u002Fcpp\u002Fmodules\u002Fcut#boolean-operations",[464,2089,2090],{},"tf::make_boolean",". N-ary or repeated boolean over the same forms is what the CSG module is for.",[2093,2094,2095],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":462,"searchDepth":470,"depth":597,"links":2097},[2098,2103,2104,2105,2106],{"id":489,"depth":597,"text":34,"children":2099},[2100,2101,2102],{"id":741,"depth":637,"text":742},{"id":922,"depth":637,"text":923},{"id":1085,"depth":637,"text":1086},{"id":1180,"depth":597,"text":1181},{"id":1393,"depth":597,"text":1394},{"id":1721,"depth":597,"text":1722},{"id":2032,"depth":597,"text":2033},"N-form boolean expressions over implicit arrangements.","md",null,{},{"icon":75},{"title":72,"description":2107},"OR9c01-INDo5XKj7fmvMcby2kKiJPNIK4iwyxRmwvtQ",[2115,2117],{"title":67,"path":68,"stem":69,"description":2116,"icon":70,"children":-1},"Exact mesh arrangements, booleans, and curve embedding.",{"title":77,"path":78,"stem":79,"description":2118,"icon":80,"children":-1},"Remove duplicates, degenerates, and unreferenced elements.",1780947771348]