[{"data":1,"prerenderedAt":1463},["ShallowReactive",2],{"navigation-docsCpp":3,"lib-picker-navigation":178,"docsCpp-\u002Fcpp\u002Fgetting-started\u002Frelease-notes":438,"docsCpp-\u002Fcpp\u002Fgetting-started\u002Frelease-notes-surround":1458},[4],{"title":5,"path":6,"stem":7,"children":8,"page":32},"Cpp","\u002Fcpp","cpp",[9,33,100,105,129,159],{"title":10,"path":11,"stem":12,"children":13,"icon":32},"Getting Started","\u002Fcpp\u002Fgetting-started","cpp\u002F1.getting-started\u002F1.index",[14,17,22,27],{"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",{"title":28,"path":29,"stem":30,"icon":31},"Release Notes","\u002Fcpp\u002Fgetting-started\u002Frelease-notes","cpp\u002F1.getting-started\u002F4.release-notes","i-lucide-sparkles",false,{"title":34,"path":35,"stem":36,"children":37,"icon":32},"Modules","\u002Fcpp\u002Fmodules","cpp\u002F2.modules\u002F00.index",[38,41,46,51,56,61,66,71,76,81,86,90,95],{"title":39,"path":35,"stem":36,"icon":40},"Overview","i-lucide-library",{"title":42,"path":43,"stem":44,"icon":45},"Core","\u002Fcpp\u002Fmodules\u002Fcore","cpp\u002F2.modules\u002F01.core","i-lucide-atom",{"title":47,"path":48,"stem":49,"icon":50},"Spatial","\u002Fcpp\u002Fmodules\u002Fspatial","cpp\u002F2.modules\u002F02.spatial","i-lucide-scale-3d",{"title":52,"path":53,"stem":54,"icon":55},"Topology","\u002Fcpp\u002Fmodules\u002Ftopology","cpp\u002F2.modules\u002F03.topology","i-lucide-git-graph",{"title":57,"path":58,"stem":59,"icon":60},"Geometry","\u002Fcpp\u002Fmodules\u002Fgeometry","cpp\u002F2.modules\u002F04.geometry","i-lucide-ruler",{"title":62,"path":63,"stem":64,"icon":65},"Remesh","\u002Fcpp\u002Fmodules\u002Fremesh","cpp\u002F2.modules\u002F05.remesh","i-lucide-triangle",{"title":67,"path":68,"stem":69,"icon":70},"Intersect","\u002Fcpp\u002Fmodules\u002Fintersect","cpp\u002F2.modules\u002F06.intersect","i-lucide-squares-intersect",{"title":72,"path":73,"stem":74,"icon":75},"Arrangement","\u002Fcpp\u002Fmodules\u002Farrangement","cpp\u002F2.modules\u002F07.arrangement","i-lucide-scissors",{"title":77,"path":78,"stem":79,"icon":80},"Iso","\u002Fcpp\u002Fmodules\u002Fiso","cpp\u002F2.modules\u002F08.iso","i-lucide-waves",{"title":82,"path":83,"stem":84,"icon":85},"CSG","\u002Fcpp\u002Fmodules\u002Fcsg","cpp\u002F2.modules\u002F09.csg","i-lucide-shapes",{"title":87,"path":88,"stem":89,"icon":31},"Clean","\u002Fcpp\u002Fmodules\u002Fclean","cpp\u002F2.modules\u002F10.clean",{"title":91,"path":92,"stem":93,"icon":94},"Reindex","\u002Fcpp\u002Fmodules\u002Freindex","cpp\u002F2.modules\u002F11.reidx","i-lucide-shuffle",{"title":96,"path":97,"stem":98,"icon":99},"I\u002FO","\u002Fcpp\u002Fmodules\u002Fio","cpp\u002F2.modules\u002F12.io","i-lucide-file-input",{"title":101,"path":102,"stem":103,"icon":104},"Benchmarks","\u002Fcpp\u002Fbenchmarks","cpp\u002F3.benchmarks","i-lucide-chart-bar-stacked",{"title":106,"path":107,"stem":108,"children":109,"icon":32},"VTK","\u002Fcpp\u002Fvtk","cpp\u002F4.vtk\u002F1.index",[110,112,115,120,125],{"title":39,"path":107,"stem":108,"icon":111},"i-lucide-layers",{"title":42,"path":113,"stem":114,"icon":45},"\u002Fcpp\u002Fvtk\u002Fcore","cpp\u002F4.vtk\u002F2.core",{"title":116,"path":117,"stem":118,"icon":119},"Functions","\u002Fcpp\u002Fvtk\u002Ffunctions","cpp\u002F4.vtk\u002F3.functions","i-lucide-function-square",{"title":121,"path":122,"stem":123,"icon":124},"Filters","\u002Fcpp\u002Fvtk\u002Ffilters","cpp\u002F4.vtk\u002F4.filters","i-lucide-filter",{"title":126,"path":127,"stem":128,"icon":26},"Examples","\u002Fcpp\u002Fvtk\u002Fexamples","cpp\u002F4.vtk\u002F5.examples",{"title":126,"path":130,"stem":131,"children":132,"icon":32},"\u002Fcpp\u002Fexamples","cpp\u002F5.examples\u002F0.index",[133,135,140,145,150,154],{"title":39,"path":130,"stem":131,"icon":134},"i-lucide-book-open",{"title":136,"path":137,"stem":138,"icon":139},"Geometry Walkthrough","\u002Fcpp\u002Fexamples\u002Fmesh-assembly","cpp\u002F5.examples\u002F1.mesh-assembly","i-lucide-box",{"title":141,"path":142,"stem":143,"icon":144},"Point Cloud Alignment","\u002Fcpp\u002Fexamples\u002Falignment","cpp\u002F5.examples\u002F2.alignment","i-lucide-move",{"title":146,"path":147,"stem":148,"icon":149},"Booleans and Domains from One Build","\u002Fcpp\u002Fexamples\u002Farrangements","cpp\u002F5.examples\u002F3.arrangements","i-lucide-layers-3",{"title":151,"path":152,"stem":153,"icon":111},"VTK Integration","\u002Fcpp\u002Fexamples\u002Fvtk","cpp\u002F5.examples\u002F4.vtk",{"title":155,"path":156,"stem":157,"icon":158},"Coming from Other Libraries","\u002Fcpp\u002Fexamples\u002Flibrary-comparisons","cpp\u002F5.examples\u002F5.library-comparisons","i-lucide-git-compare",{"title":160,"path":161,"stem":162,"children":163,"page":32},"About","\u002Fcpp\u002Fabout","cpp\u002F6.about",[164,168,173],{"title":165,"path":166,"stem":167,"icon":134},"Research","\u002Fcpp\u002Fabout\u002Fresearch","cpp\u002F6.about\u002F1.research",{"title":169,"path":170,"stem":171,"icon":172},"Contributing","\u002Fcpp\u002Fabout\u002Fcontributing","cpp\u002F6.about\u002F2.contributing","i-lucide-heart-handshake",{"title":174,"path":175,"stem":176,"icon":177},"License","\u002Fcpp\u002Fabout\u002Flicense","cpp\u002F6.about\u002F3.license","i-lucide-file-text",{"cpp":179,"py":224,"ts":344},[180],{"title":5,"path":6,"stem":7,"children":181,"page":32},[182,188,203,204,211,219],{"title":10,"path":11,"stem":12,"children":183,"icon":32},[184,185,186,187],{"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":28,"path":29,"stem":30,"icon":31},{"title":34,"path":35,"stem":36,"children":189,"icon":32},[190,191,192,193,194,195,196,197,198,199,200,201,202],{"title":39,"path":35,"stem":36,"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":31},{"title":91,"path":92,"stem":93,"icon":94},{"title":96,"path":97,"stem":98,"icon":99},{"title":101,"path":102,"stem":103,"icon":104},{"title":106,"path":107,"stem":108,"children":205,"icon":32},[206,207,208,209,210],{"title":39,"path":107,"stem":108,"icon":111},{"title":42,"path":113,"stem":114,"icon":45},{"title":116,"path":117,"stem":118,"icon":119},{"title":121,"path":122,"stem":123,"icon":124},{"title":126,"path":127,"stem":128,"icon":26},{"title":126,"path":130,"stem":131,"children":212,"icon":32},[213,214,215,216,217,218],{"title":39,"path":130,"stem":131,"icon":134},{"title":136,"path":137,"stem":138,"icon":139},{"title":141,"path":142,"stem":143,"icon":144},{"title":146,"path":147,"stem":148,"icon":149},{"title":151,"path":152,"stem":153,"icon":111},{"title":155,"path":156,"stem":157,"icon":158},{"title":160,"path":161,"stem":162,"children":220,"page":32},[221,222,223],{"title":165,"path":166,"stem":167,"icon":134},{"title":169,"path":170,"stem":171,"icon":172},{"title":174,"path":175,"stem":176,"icon":177},[225],{"title":226,"path":227,"stem":228,"children":229,"page":32},"Py","\u002Fpy","py",[230,244,285,288,309,331],{"title":10,"path":231,"stem":232,"children":233,"icon":32},"\u002Fpy\u002Fgetting-started","py\u002F1.getting-started\u002F1.index",[234,235,238,241],{"title":15,"path":231,"stem":232,"icon":16},{"title":18,"path":236,"stem":237,"icon":21},"\u002Fpy\u002Fgetting-started\u002Finstallation","py\u002F1.getting-started\u002F2.installation",{"title":23,"path":239,"stem":240,"icon":26},"\u002Fpy\u002Fgetting-started\u002Flive-examples","py\u002F1.getting-started\u002F3.live-examples",{"title":28,"path":242,"stem":243,"icon":31},"\u002Fpy\u002Fgetting-started\u002Frelease-notes","py\u002F1.getting-started\u002F4.release-notes",{"title":34,"path":245,"stem":246,"children":247,"icon":32},"\u002Fpy\u002Fmodules","py\u002F2.modules\u002F00.index",[248,249,252,255,258,261,264,267,270,273,276,279,282],{"title":39,"path":245,"stem":246,"icon":40},{"title":42,"path":250,"stem":251,"icon":45},"\u002Fpy\u002Fmodules\u002Fcore","py\u002F2.modules\u002F01.core",{"title":47,"path":253,"stem":254,"icon":50},"\u002Fpy\u002Fmodules\u002Fspatial","py\u002F2.modules\u002F02.spatial",{"title":52,"path":256,"stem":257,"icon":55},"\u002Fpy\u002Fmodules\u002Ftopology","py\u002F2.modules\u002F03.topology",{"title":57,"path":259,"stem":260,"icon":60},"\u002Fpy\u002Fmodules\u002Fgeometry","py\u002F2.modules\u002F04.geometry",{"title":62,"path":262,"stem":263,"icon":65},"\u002Fpy\u002Fmodules\u002Fremesh","py\u002F2.modules\u002F05.remesh",{"title":67,"path":265,"stem":266,"icon":70},"\u002Fpy\u002Fmodules\u002Fintersect","py\u002F2.modules\u002F06.intersect",{"title":72,"path":268,"stem":269,"icon":75},"\u002Fpy\u002Fmodules\u002Farrangement","py\u002F2.modules\u002F07.arrangement",{"title":77,"path":271,"stem":272,"icon":80},"\u002Fpy\u002Fmodules\u002Fiso","py\u002F2.modules\u002F08.iso",{"title":82,"path":274,"stem":275,"icon":85},"\u002Fpy\u002Fmodules\u002Fcsg","py\u002F2.modules\u002F09.csg",{"title":87,"path":277,"stem":278,"icon":31},"\u002Fpy\u002Fmodules\u002Fclean","py\u002F2.modules\u002F10.clean",{"title":91,"path":280,"stem":281,"icon":94},"\u002Fpy\u002Fmodules\u002Freindex","py\u002F2.modules\u002F11.reidx",{"title":96,"path":283,"stem":284,"icon":99},"\u002Fpy\u002Fmodules\u002Fio","py\u002F2.modules\u002F12.io",{"title":101,"path":286,"stem":287,"icon":104},"\u002Fpy\u002Fbenchmarks","py\u002F3.benchmarks",{"title":289,"path":290,"stem":291,"children":292,"icon":32},"Blender","\u002Fpy\u002Fblender","py\u002F4.blender\u002F1.index",[293,295,300,304],{"title":39,"path":290,"stem":291,"icon":294},"i-vscode-icons:file-type-blender",{"title":296,"path":297,"stem":298,"icon":299},"Convert","\u002Fpy\u002Fblender\u002Fconvert","py\u002F4.blender\u002F2.convert","i-lucide-repeat",{"title":301,"path":302,"stem":303,"icon":111},"Scene","\u002Fpy\u002Fblender\u002Fscene","py\u002F4.blender\u002F3.scene",{"title":305,"path":306,"stem":307,"icon":308},"Plugin Architecture","\u002Fpy\u002Fblender\u002Fplugin","py\u002F4.blender\u002F4.plugin","i-lucide-puzzle",{"title":126,"path":310,"stem":311,"children":312,"icon":32},"\u002Fpy\u002Fexamples","py\u002F5.examples\u002F0.index",[313,314,319,322,326],{"title":39,"path":310,"stem":311,"icon":134},{"title":315,"path":316,"stem":317,"icon":318},"Core Functionality","\u002Fpy\u002Fexamples\u002Fcore-functionality","py\u002F5.examples\u002F2.core-functionality","i-lucide-code",{"title":146,"path":320,"stem":321,"icon":149},"\u002Fpy\u002Fexamples\u002Farrangements","py\u002F5.examples\u002F3.arrangements",{"title":151,"path":323,"stem":324,"icon":325},"\u002Fpy\u002Fexamples\u002Fvtk-integration","py\u002F5.examples\u002F4.vtk-integration","i-lucide-grid-2x2",{"title":327,"path":328,"stem":329,"icon":330},"Raycast Rendering","\u002Fpy\u002Fexamples\u002Fraycast-rendering","py\u002F5.examples\u002F5.raycast-rendering","i-lucide-scan-line",{"title":160,"path":332,"stem":333,"children":334,"page":32},"\u002Fpy\u002Fabout","py\u002F6.about",[335,338,341],{"title":165,"path":336,"stem":337,"icon":134},"\u002Fpy\u002Fabout\u002Fresearch","py\u002F6.about\u002F1.research",{"title":169,"path":339,"stem":340,"icon":172},"\u002Fpy\u002Fabout\u002Fcontributing","py\u002F6.about\u002F2.contributing",{"title":174,"path":342,"stem":343,"icon":177},"\u002Fpy\u002Fabout\u002Flicense","py\u002F6.about\u002F3.license",[345],{"title":346,"path":347,"stem":348,"children":349,"page":32},"Ts","\u002Fts","ts",[350,364,405,408,425],{"title":10,"path":351,"stem":352,"children":353,"icon":32},"\u002Fts\u002Fgetting-started","ts\u002F1.getting-started\u002F1.index",[354,355,358,361],{"title":15,"path":351,"stem":352,"icon":16},{"title":18,"path":356,"stem":357,"icon":21},"\u002Fts\u002Fgetting-started\u002Finstallation","ts\u002F1.getting-started\u002F2.installation",{"title":23,"path":359,"stem":360,"icon":26},"\u002Fts\u002Fgetting-started\u002Flive-examples","ts\u002F1.getting-started\u002F3.live-examples",{"title":28,"path":362,"stem":363,"icon":31},"\u002Fts\u002Fgetting-started\u002Frelease-notes","ts\u002F1.getting-started\u002F4.release-notes",{"title":34,"path":365,"stem":366,"children":367,"icon":32},"\u002Fts\u002Fmodules","ts\u002F2.modules\u002F00.index",[368,369,372,375,378,381,384,387,390,393,396,399,402],{"title":39,"path":365,"stem":366,"icon":40},{"title":42,"path":370,"stem":371,"icon":45},"\u002Fts\u002Fmodules\u002Fcore","ts\u002F2.modules\u002F01.core",{"title":47,"path":373,"stem":374,"icon":50},"\u002Fts\u002Fmodules\u002Fspatial","ts\u002F2.modules\u002F02.spatial",{"title":52,"path":376,"stem":377,"icon":55},"\u002Fts\u002Fmodules\u002Ftopology","ts\u002F2.modules\u002F03.topology",{"title":57,"path":379,"stem":380,"icon":60},"\u002Fts\u002Fmodules\u002Fgeometry","ts\u002F2.modules\u002F04.geometry",{"title":62,"path":382,"stem":383,"icon":65},"\u002Fts\u002Fmodules\u002Fremesh","ts\u002F2.modules\u002F05.remesh",{"title":67,"path":385,"stem":386,"icon":70},"\u002Fts\u002Fmodules\u002Fintersect","ts\u002F2.modules\u002F06.intersect",{"title":72,"path":388,"stem":389,"icon":75},"\u002Fts\u002Fmodules\u002Farrangement","ts\u002F2.modules\u002F07.arrangement",{"title":77,"path":391,"stem":392,"icon":80},"\u002Fts\u002Fmodules\u002Fiso","ts\u002F2.modules\u002F08.iso",{"title":82,"path":394,"stem":395,"icon":85},"\u002Fts\u002Fmodules\u002Fcsg","ts\u002F2.modules\u002F09.csg",{"title":87,"path":397,"stem":398,"icon":31},"\u002Fts\u002Fmodules\u002Fclean","ts\u002F2.modules\u002F10.clean",{"title":91,"path":400,"stem":401,"icon":94},"\u002Fts\u002Fmodules\u002Freindex","ts\u002F2.modules\u002F11.reidx",{"title":96,"path":403,"stem":404,"icon":99},"\u002Fts\u002Fmodules\u002Fio","ts\u002F2.modules\u002F12.io",{"title":101,"path":406,"stem":407,"icon":104},"\u002Fts\u002Fbenchmarks","ts\u002F3.benchmarks",{"title":126,"path":409,"stem":410,"children":411,"icon":32},"\u002Fts\u002Fexamples","ts\u002F4.examples\u002F0.index",[412,413,416,421],{"title":39,"path":409,"stem":410,"icon":134},{"title":315,"path":414,"stem":415,"icon":318},"\u002Fts\u002Fexamples\u002Fcore-functionality","ts\u002F4.examples\u002F2.core-functionality",{"title":417,"path":418,"stem":419,"icon":420},"Alignment","\u002Fts\u002Fexamples\u002Falignment","ts\u002F4.examples\u002F3.alignment","i-lucide-move-3d",{"title":327,"path":422,"stem":423,"icon":424},"\u002Fts\u002Fexamples\u002Fraycast-render","ts\u002F4.examples\u002F4.raycast-render","i-lucide-image",{"title":160,"icon":32,"path":426,"stem":427,"children":428,"page":32},"\u002Fts\u002Fabout","ts\u002F5.about",[429,432,435],{"title":165,"path":430,"stem":431,"icon":134},"\u002Fts\u002Fabout\u002Fresearch","ts\u002F5.about\u002F1.research",{"title":169,"path":433,"stem":434,"icon":172},"\u002Fts\u002Fabout\u002Fcontributing","ts\u002F5.about\u002F2.contributing",{"title":174,"path":436,"stem":437,"icon":177},"\u002Fts\u002Fabout\u002Flicense","ts\u002F5.about\u002F3.license",{"id":439,"title":28,"body":440,"description":1450,"extension":1451,"links":1452,"meta":1453,"navigation":1454,"path":29,"seo":1455,"sitemap":1456,"stem":30,"__hash__":1457},"docsCpp\u002Fcpp\u002F1.getting-started\u002F4.release-notes.md",{"type":441,"value":442,"toc":1436},"minimark",[443,448,469,473,478,493,499,505,514,538,542,548,551,555,562,881,892,896,903,945,1034,1050,1064,1068,1140,1152,1169,1173,1176,1229,1246,1250,1257,1314,1318,1418,1422,1432],[444,445,447],"h2",{"id":446},"v0101","v0.10.1",[449,450,451,452,456,457,460,461,464,465,468],"p",{},"Repairs; no API breaks. ",[453,454,455],"code",{},"orient_faces_consistently"," and\n",[453,458,459],{},"ensure_positive_orientation"," now return whether the surface is\norientable: every reversal is decided against the input winding and\napplied after the walk, so one call settles every orientable\nmanifold-edge component, and a non-orientable component is left\nuntouched rather than half-repaired. An integral coordinate type votes\nby face count, its lattice not holding a squared area.\n",[453,462,463],{},"euler_characteristic"," counts boundary edges correctly — a disk is 1,\nan uncapped tube 0. ",[453,466,467],{},"fit_similarity_alignment"," measures the source\nspread in the same space as its covariance, so a scaled frame no longer\nskews the recovered scale. The VTK wrappers delegate orientation to the\ncore and surface its verdict.",[444,470,472],{"id":471},"v0100-one-engine","v0.10.0 — one engine",[474,475,477],"h3",{"id":476},"the-engine","The engine",[449,479,480,484,485,488,489,492],{},[481,482,483],"strong",{},"Every boolean runs on the CSG engine."," ",[453,486,487],{},"tf::make_boolean"," builds the same\nN-form arrangement that powers ",[453,490,491],{},"tf::make_csg_graph"," and evaluates the\noperation as a boolean expression over it. One arrangement answers any number\nof boolean expressions, domain reads, and curve extractions; there is one\npipeline, one triangulator, one classification tier.",[449,494,495,498],{},[481,496,497],{},"The arrangement is two tiers."," The local arrangement is the identity tier:\npolygon intersections are classified exactly, and every crossing, landing,\nand coincidence names one created identity on an exact integer lattice — a\npoint's identity is a canonical name, not a coordinate. Coplanar faces,\nwithin a mesh and across meshes, pool onto one geometric plane, so one plane\nis one identity and coincident walls cannot disagree. The plane arrangement\nis the triangulation tier: each plane carrier triangulates against its own\nconstraint set, and a statement that cannot stand as given is resolved —\nsplit at its crossings, welded at its coincidences — in recovery waves that\nrepeat until nothing new is stated. Classification — components, fences,\nradial fans, domains — reads the finished arrangement, and every product\n(boolean meshes, domain cells, the outer shell, intersection curves) is a\nread.",[449,500,501,504],{},[481,502,503],{},"Coincidence is resolved at the root."," When quantization collapses\ngeometry — duplicate vertices, sub-epsilon edges, folded slivers, vertices\nlanding on the intersection curve — the arrangement resolves each such\ncoincidence to a single created identity, and the surrounding faces re-emit\nconformed to it. Raw arrangements are watertight by construction at these\nsites.",[449,506,507,513],{},[481,508,509,512],{},[453,510,511],{},"tf::triangulated"," is the same engine with the face as the carrier."," Every\nface triangulates on its own boundary, a shared edge is one identity in both\nfaces, and a self-crossing or folded face is resolved — split at its own\ncrossings, its coincident vertices welded — never refused silently or\ndropped. A resolved face's positions are unchanged; only its names are.",[449,515,516,484,519,522,523,525,526,529,530,533,534,537],{},[481,517,518],{},"Refusals are a surface, not a silence.",[453,520,521],{},"tf::return_refused"," on\n",[453,524,511],{},", ",[453,527,528],{},"tf::embedded_isocurves",", and ",[453,531,532],{},"tf::make_isobands","\nreturns the input faces a build declined, and ",[453,535,536],{},"failed()"," on a built graph\nnames the carriers still refusing after recovery. Nothing is dropped without\na name, and the surface costs zero when nothing refuses.",[474,539,541],{"id":540},"tolerance-is-a-statement-about-the-input","Tolerance is a statement about the input",[449,543,544,547],{},[481,545,546],{},"A tolerance is the pitch the input's planes are quantized to; it never\nwidens a predicate."," One converter is built over the union of the input\nforms; every face's plane — direction and offset — is rounded onto a grid\nof that pitch, so two faces whose planes differ by less than it share one\nplane. Every original vertex is then placed, at most the tolerance away,\nonto the quantized planes its own faces stand on — the meet of three where\nit is a corner, a line of two where it lies on a crease, its own tangent\nplane where the surface is smooth. The result is the exact arrangement of\nthat moved mesh: every predicate below the placement runs exact, and a\nweld is an identity, never a proximity. A tolerance of zero is the\nidentity — nothing moves, no placement table is built, and the result is\nbyte-identical to the exact arrangement of the input as given.",[449,549,550],{},"A wall doubled at less than the pitch becomes one wall; one doubled at\nmore stays two. A vertex a weld retires has no output point of its own —\nthe index map reports it absent. Plane identity is quantized-name\nequality, so results from calls with different converter domains are not\nidentity-comparable; a session that needs one perturbation across calls\npins one converter.",[474,552,554],{"id":553},"provenance-selection","Provenance selection",[449,556,557,558,561],{},"One arrangement, any read. ",[453,559,560],{},"tf::csg::selection"," names which forms' faces\nreach the output, orthogonally to the boolean algebra:",[563,564,568],"pre",{"className":565,"code":566,"language":7,"meta":567,"style":567},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","auto graph = tf::make_csg_graph(forms);              \u002F\u002F A=0, B=1, C=2\nauto e = (tf::csg::op(0) | tf::csg::op(1)) - tf::csg::op(2);\n\nauto solid = tf::make_csg_mesh(graph, e);                          \u002F\u002F as always\nauto partA = tf::make_csg_mesh(graph, tf::csg::selection(0, e));   \u002F\u002F A's walls of it\nauto inA   = tf::make_csg_mesh(graph, tf::csg::inside(2, tf::csg::op(0)));  \u002F\u002F C inside A\nauto embed = tf::make_csg_mesh(graph, tf::csg::selection({0}));    \u002F\u002F A cut by all, no boolean\n","",[453,569,570,611,688,695,728,775,834],{"__ignoreMap":567},[571,572,575,579,583,587,591,594,598,601,604,607],"span",{"class":573,"line":574},"line",1,[571,576,578],{"class":577},"spNyl","auto",[571,580,582],{"class":581},"sTEyZ"," graph ",[571,584,586],{"class":585},"sMK4o","=",[571,588,590],{"class":589},"sBMFI"," tf",[571,592,593],{"class":585},"::",[571,595,597],{"class":596},"s2Zo4","make_csg_graph",[571,599,600],{"class":585},"(",[571,602,603],{"class":581},"forms",[571,605,606],{"class":585},");",[571,608,610],{"class":609},"sHwdD","              \u002F\u002F A=0, B=1, C=2\n",[571,612,614,616,619,621,624,627,629,632,634,637,639,643,646,649,651,653,655,657,659,661,664,667,670,672,674,676,678,680,682,685],{"class":573,"line":613},2,[571,615,578],{"class":577},[571,617,618],{"class":581}," e ",[571,620,586],{"class":585},[571,622,623],{"class":585}," (",[571,625,626],{"class":589},"tf",[571,628,593],{"class":585},[571,630,631],{"class":589},"csg",[571,633,593],{"class":585},[571,635,636],{"class":596},"op",[571,638,600],{"class":585},[571,640,642],{"class":641},"sbssI","0",[571,644,645],{"class":585},")",[571,647,648],{"class":585}," |",[571,650,590],{"class":589},[571,652,593],{"class":585},[571,654,631],{"class":589},[571,656,593],{"class":585},[571,658,636],{"class":596},[571,660,600],{"class":585},[571,662,663],{"class":641},"1",[571,665,666],{"class":585},"))",[571,668,669],{"class":585}," -",[571,671,590],{"class":589},[571,673,593],{"class":585},[571,675,631],{"class":589},[571,677,593],{"class":585},[571,679,636],{"class":596},[571,681,600],{"class":585},[571,683,684],{"class":641},"2",[571,686,687],{"class":585},");\n",[571,689,691],{"class":573,"line":690},3,[571,692,694],{"emptyLinePlaceholder":693},true,"\n",[571,696,698,700,703,705,707,709,712,714,717,720,723,725],{"class":573,"line":697},4,[571,699,578],{"class":577},[571,701,702],{"class":581}," solid ",[571,704,586],{"class":585},[571,706,590],{"class":589},[571,708,593],{"class":585},[571,710,711],{"class":596},"make_csg_mesh",[571,713,600],{"class":585},[571,715,716],{"class":581},"graph",[571,718,719],{"class":585},",",[571,721,722],{"class":581}," e",[571,724,606],{"class":585},[571,726,727],{"class":609},"                          \u002F\u002F as always\n",[571,729,731,733,736,738,740,742,744,746,748,750,752,754,756,758,761,763,765,767,769,772],{"class":573,"line":730},5,[571,732,578],{"class":577},[571,734,735],{"class":581}," partA ",[571,737,586],{"class":585},[571,739,590],{"class":589},[571,741,593],{"class":585},[571,743,711],{"class":596},[571,745,600],{"class":585},[571,747,716],{"class":581},[571,749,719],{"class":585},[571,751,590],{"class":589},[571,753,593],{"class":585},[571,755,631],{"class":589},[571,757,593],{"class":585},[571,759,760],{"class":596},"selection",[571,762,600],{"class":585},[571,764,642],{"class":641},[571,766,719],{"class":585},[571,768,722],{"class":581},[571,770,771],{"class":585},"));",[571,773,774],{"class":609},"   \u002F\u002F A's walls of it\n",[571,776,778,780,783,785,787,789,791,793,795,797,799,801,803,805,808,810,812,814,816,818,820,822,824,826,828,831],{"class":573,"line":777},6,[571,779,578],{"class":577},[571,781,782],{"class":581}," inA   ",[571,784,586],{"class":585},[571,786,590],{"class":589},[571,788,593],{"class":585},[571,790,711],{"class":596},[571,792,600],{"class":585},[571,794,716],{"class":581},[571,796,719],{"class":585},[571,798,590],{"class":589},[571,800,593],{"class":585},[571,802,631],{"class":589},[571,804,593],{"class":585},[571,806,807],{"class":596},"inside",[571,809,600],{"class":585},[571,811,684],{"class":641},[571,813,719],{"class":585},[571,815,590],{"class":589},[571,817,593],{"class":585},[571,819,631],{"class":589},[571,821,593],{"class":585},[571,823,636],{"class":596},[571,825,600],{"class":585},[571,827,642],{"class":641},[571,829,830],{"class":585},")));",[571,832,833],{"class":609},"  \u002F\u002F C inside A\n",[571,835,837,839,842,844,846,848,850,852,854,856,858,860,862,864,866,868,871,873,876,878],{"class":573,"line":836},7,[571,838,578],{"class":577},[571,840,841],{"class":581}," embed ",[571,843,586],{"class":585},[571,845,590],{"class":589},[571,847,593],{"class":585},[571,849,711],{"class":596},[571,851,600],{"class":585},[571,853,716],{"class":581},[571,855,719],{"class":585},[571,857,590],{"class":589},[571,859,593],{"class":585},[571,861,631],{"class":589},[571,863,593],{"class":585},[571,865,760],{"class":596},[571,867,600],{"class":585},[571,869,870],{"class":581},"{",[571,872,642],{"class":641},[571,874,875],{"class":581},"}",[571,877,771],{"class":585},[571,879,880],{"class":609},"    \u002F\u002F A cut by all, no boolean\n",[449,882,883,884,887,888,891],{},"The per-form parts partition the result face-for-face and re-weld into the\nsolid. ",[453,885,886],{},"tf::csg::inside"," reads the other side of the same question — the\nnamed forms' surface lying INSIDE the expression's region, both sides of a\npiece in it, kept in the form's stored winding, which is how a sheet's\nsurface within a solid is asked for. ",[453,889,890],{},"tf::make_csg_domains"," takes the same\nselection — each cell's walls by contributor — in its boundary kind only.\nEvery existing expression call is unchanged.",[474,893,895],{"id":894},"the-module-map-breaking","The module map (breaking)",[449,897,898,899,902],{},"The ",[453,900,901],{},"cut"," module was named for the verb its first consumer needed. Its ground\nis split by mechanism, and there is no compatibility shim: the old names are\ngone, not deprecated.",[904,905,906,915,937],"ul",{},[907,908,909,914],"li",{},[481,910,911],{},[453,912,913],{},"\u003Ctrueform\u002Farrangement.hpp>"," — mesh, polygon, and segment\narrangements: the arrangement of a set of forms and its reads.",[907,916,917,922,923,926,927,525,930,525,933,936],{},[481,918,919],{},[453,920,921],{},"\u003Ctrueform\u002Fiso.hpp>"," — the scalar-field tier: ",[453,924,925],{},"embedded_isocurves",",\n",[453,928,929],{},"make_isobands",[453,931,932],{},"make_isocontours",[453,934,935],{},"scalar_field_intersections",".",[907,938,939,944],{},[481,940,941],{},[453,942,943],{},"\u003Ctrueform\u002Fcsg.hpp>"," — booleans, the CSG graph, expressions,\nselections, domains, and the outer shell.",[946,947,948,961],"table",{},[949,950,951],"thead",{},[952,953,954,958],"tr",{},[955,956,957],"th",{},"Old",[955,959,960],{},"New",[962,963,964,976,988,1000,1011,1022],"tbody",{},[952,965,966,972],{},[967,968,969],"td",{},[453,970,971],{},"\u003Ctrueform\u002Fcut.hpp>",[967,973,974],{},[453,975,913],{},[952,977,978,983],{},[967,979,980],{},[453,981,982],{},"\u003Ctrueform\u002Fcut\u002F...>",[967,984,985],{},[453,986,987],{},"\u003Ctrueform\u002Farrangement\u002F...>",[952,989,990,995],{},[967,991,992],{},[453,993,994],{},"tf::cut::",[967,996,997],{},[453,998,999],{},"tf::arrangement::",[952,1001,1002,1007],{},[967,1003,1004],{},[453,1005,1006],{},"\u003Ctrueform\u002Fintersect\u002Fmake_isocurves.hpp>",[967,1008,1009],{},[453,1010,921],{},[952,1012,1013,1018],{},[967,1014,1015],{},[453,1016,1017],{},"\u003Ctrueform\u002Fintersect\u002Fscalar_field_intersections.hpp>",[967,1019,1020],{},[453,1021,921],{},[952,1023,1024,1029],{},[967,1025,1026],{},[453,1027,1028],{},"tf::cut::iso::",[967,1030,1031],{},[453,1032,1033],{},"tf::iso::",[449,1035,1036,525,1039,525,1041,456,1043,1046,1047,936],{},[453,1037,1038],{},"tf::make_isocontours",[453,1040,532],{},[453,1042,528],{},[453,1044,1045],{},"tf::scalar_field_intersections"," keep their names; only their header and the\nmachinery namespace below them changed. See ",[1048,1049,77],"a",{"href":78},[449,1051,1052,1054,1055,1057,1058,1060,1061,936],{},[453,1053,487],{}," keeps its name but not its umbrella. A boolean is the\ntwo-operand case of the CSG arrangement, so the entry lives in\n",[453,1056,943],{}," — not ",[453,1059,913],{},". See\n",[1048,1062,82],{"href":1063},"\u002Fcpp\u002Fmodules\u002Fcsg#boolean-operations",[474,1065,1067],{"id":1066},"removed-entry-points","Removed entry points",[946,1069,1070,1080],{},[949,1071,1072],{},[952,1073,1074,1077],{},[955,1075,1076],{},"Removed",[955,1078,1079],{},"Use instead",[962,1081,1082,1094,1106,1118,1129],{},[952,1083,1084,1089],{},[967,1085,1086],{},[453,1087,1088],{},"tf::embedded_intersection_curves",[967,1090,1091],{},[453,1092,1093],{},"tf::make_mesh_arrangements",[952,1095,1096,1101],{},[967,1097,1098],{},[453,1099,1100],{},"tf::embedded_self_intersection_curves",[967,1102,1103],{},[453,1104,1105],{},"tf::make_polygon_arrangements",[952,1107,1108,1113],{},[967,1109,1110],{},[453,1111,1112],{},"tf::intersections_between_polygons",[967,1114,1115],{},[453,1116,1117],{},"tf::polygon_intersections",[952,1119,1120,1125],{},[967,1121,1122],{},[453,1123,1124],{},"tf::intersections_within_polygons",[967,1126,1127],{},[453,1128,1117],{},[952,1130,1131,1136],{},[967,1132,1133],{},[453,1134,1135],{},"tf::triangulated_faces",[967,1137,1138],{},[453,1139,511],{},[449,1141,1142,1144,1145,1147,1148,1151],{},[453,1143,1135],{}," returned corners alone, against a point table it did\nnot return. That was sound only while a triangulation could name no point the\ninput did not carry, and it no longer can: a face whose loop crosses itself is\nresolved, and the identity its crossing stands on is a corner the caller's own\narray has no row for. ",[453,1146,511],{}," returns the corners with the table\nthey index. Code that needs the connectivity without the mesh reads the\narrangement mesh tier (",[453,1149,1150],{},"\u003Ctrueform\u002Farrangement\u002Fmesh\u002Fmesh_triangulation.hpp>",")\ndirectly — it states the triangles, the minted identities and the refusal\nsurface as one product.",[449,1153,1154,1156,1157,1160,1161,1164,1165,1168],{},[453,1155,1117],{}," is not exported by ",[453,1158,1159],{},"\u003Ctrueform\u002Fintersect.hpp>",";\ninclude ",[453,1162,1163],{},"\u003Ctrueform\u002Fintersect\u002Fpolygon_intersections.hpp>"," directly. Arity plus\n",[453,1166,1167],{},"tf::intersect_config"," decide between- and within-form records, so the two\nalias types have no successor names.",[474,1170,1172],{"id":1171},"retired-triangulators","Retired triangulators",[449,1174,1175],{},"The constrained Delaunay family is the library's one triangulation engine.",[946,1177,1178,1186],{},[949,1179,1180],{},[952,1181,1182,1184],{},[955,1183,1076],{},[955,1185,1079],{},[962,1187,1188,1204,1219],{},[952,1189,1190,1195],{},[967,1191,1192],{},[453,1193,1194],{},"tf::ear_cutter",[967,1196,1197,1200,1201,1203],{},[453,1198,1199],{},"tf::constrained_delaunay_triangulator",", or ",[453,1202,511],{}," for a whole mesh",[952,1205,1206,1211],{},[967,1207,1208],{},[453,1209,1210],{},"tf::delaunay_triangulator",[967,1212,1213,1200,1216],{},[453,1214,1215],{},"tf::unconstrained_delaunay_triangulator",[453,1217,1218],{},"tf::make_cdt(points)",[952,1220,1221,1226],{},[967,1222,1223],{},[453,1224,1225],{},"tf::delaunay_flipper",[967,1227,1228],{},"— no replacement; it existed only for the batch triangulator",[449,1230,1231,1234,1235,1241,1242,1245],{},[453,1232,1233],{},"tf::constrained_delaunay_triangulator::build"," and its siblings take a\ntrailing ",[1048,1236,1238],{"href":1237},"\u002Fcpp\u002Fmodules\u002Ftopology#region-labels-cdt_region_mode",[453,1239,1240],{},"tf::cdt_region_mode","\nthat states what ",[453,1243,1244],{},"region_labels()"," mean.",[474,1247,1249],{"id":1248},"the-exact-lattice","The exact lattice",[449,1251,1252,1253,1256],{},"The lattice integer is read off the coordinate type or named by the caller —\nit is never a hardcoded default. Every entry point (",[453,1254,1255],{},"tf::make_cdt",", the\narrangements, the booleans, the iso cut) resolves it for you; direct class\ninstantiations are affected:",[904,1258,1259,1284],{},[907,1260,1261,456,1263,1265,1266,1269,1270,1273,1274,1277,1278,1280,1281,1283],{},[453,1262,1199],{},[453,1264,1215],{}," default their ",[453,1267,1268],{},"Int"," from the\ncoordinate type (float → ",[453,1271,1272],{},"int32",", double → ",[453,1275,1276],{},"int64","). A direct\ndouble-precision instantiation that leaned on the old fixed-",[453,1279,1272],{},"\ndefault now computes on the ",[453,1282,1276],{}," lattice.",[907,1285,1286,1287,926,1290,525,1293,525,1296,926,1299,1302,1303,1305,1306,1309,1310,1313],{},"The planar-graph classes — ",[453,1288,1289],{},"tf::planar_graph_regions",[453,1291,1292],{},"tf::face_hole_relations",[453,1294,1295],{},"tf::face_split_by_edges",[453,1297,1298],{},"tf::hole_patcher",[453,1300,1301],{},"tf::planar_embedding"," — carry no coordinate type, so ",[453,1304,1268],{}," has no\ndefault: ",[453,1307,1308],{},"tf::planar_embedding\u003Cint>"," does not compile; write\n",[453,1311,1312],{},"tf::planar_embedding\u003Cint, tf::exact::int32>"," (or the lattice your\ncoordinates call for).",[474,1315,1317],{"id":1316},"api-changes","API changes",[904,1319,1320,1334,1353,1366,1369,1375,1384,1393,1402],{},[907,1321,1322,1325,1326,1329,1330,1333],{},[453,1323,1324],{},"make_boolean(a, b, op[, sheets][, config])"," — operands listed in ",[453,1327,1328],{},"sheets","\nbound no volume and cut as oriented separators. An ",[481,1331,1332],{},"open operand is a\nvolume unless declared a sheet","; declare it a sheet for the previous\nopen-mesh behavior.",[907,1335,1336,1337,1340,1341,1344,1345,1348,1349,1352],{},"Booleans take ",[453,1338,1339],{},"tf::arrangement_config"," (an ",[453,1342,1343],{},"intersect_config",", a\n",[453,1346,1347],{},"triangulation_type",", or both); ",[453,1350,1351],{},"boolean_config"," does not exist.\nMulti-nesting is always on.",[907,1354,1355,1358,1359,1362,1363,936],{},[453,1356,1357],{},"make_boolean(..., tf::return_index_map)"," returns ",[453,1360,1361],{},"tf::stitch_index_map"," —\na producer-agnostic carrier consumed by ",[453,1364,1365],{},"tf::stitch_*",[907,1367,1368],{},"A swapped difference does not reverse winding.",[907,1370,1371,1374],{},[453,1372,1373],{},"intersect_config::tolerance"," is the distance an input vertex may move to\nreach the lattice — a statement about the input, exact below it. A band on\nthe predicates' comparisons does not exist.",[907,1376,1377,1380,1381,1383],{},[453,1378,1379],{},"tf::intersections_within_segments::build(segments)"," takes no\n",[453,1382,1343],{},": the segment tier is exact, like every tier.",[907,1385,1386,1389,1390,936],{},[453,1387,1388],{},"make_intersection_curves"," defaults to ",[453,1391,1392],{},"primitives",[907,1394,1395,1398,1399,936],{},[453,1396,1397],{},"triangulated"," resolves rather than refuses: a self-crossing face is\nsplit at its crossings, coincident vertices weld into one identity at the\nsame coordinate — a resolved face need not name every vertex it was\ngiven; positions are unchanged, only names. Region fill is ",[453,1400,1401],{},"labels != 0",[907,1403,1404,1406,1407,1410,1411,1417],{},[453,1405,467],{}," recovers the scale independent of the point\ncount; it was ",[453,1408,1409],{},"n"," times too small\n(",[1048,1412,1416],{"href":1413,"rel":1414},"https:\u002F\u002Fgithub.com\u002Fpolydera\u002Ftrueform\u002Fissues\u002F21",[1415],"nofollow","#21",").",[474,1419,1421],{"id":1420},"bindings","Bindings",[449,1423,1424,1425,1428,1429,936],{},"The Python and TypeScript layers follow the same map in the same release, so\nall three languages speak the same module names. See the\n",[1048,1426,1427],{"href":242},"Python release notes"," and the\n",[1048,1430,1431],{"href":362},"TypeScript release notes",[1433,1434,1435],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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);}",{"title":567,"searchDepth":574,"depth":613,"links":1437},[1438,1439],{"id":446,"depth":613,"text":447},{"id":471,"depth":613,"text":472,"children":1440},[1441,1442,1443,1444,1445,1446,1447,1448,1449],{"id":476,"depth":690,"text":477},{"id":540,"depth":690,"text":541},{"id":553,"depth":690,"text":554},{"id":894,"depth":690,"text":895},{"id":1066,"depth":690,"text":1067},{"id":1171,"depth":690,"text":1172},{"id":1248,"depth":690,"text":1249},{"id":1316,"depth":690,"text":1317},{"id":1420,"depth":690,"text":1421},"trueform v0.10.0 — one engine.","md",null,{},{"icon":31},{"title":28,"description":1450},{"loc":29},"cNgRFoRL6mW4ZHvuzbe0DKomgTyt3HL6E10gbjQmkqk",[1459,1461],{"title":23,"path":24,"stem":25,"description":1460,"icon":26,"children":-1},"Try trueform in your browser — no installation required.",{"title":39,"path":35,"stem":36,"description":1462,"icon":40,"children":-1},"Modules, namespaces, and file organization.",1788524225625]