[{"data":1,"prerenderedAt":4932},["ShallowReactive",2],{"navigation-docsCpp":3,"lib-picker-navigation":182,"docsCpp-\u002Fcpp\u002Fmodules\u002Fvolume":446,"docsCpp-\u002Fcpp\u002Fmodules\u002Fvolume-surround":4927},[4],{"title":5,"path":6,"stem":7,"children":8,"page":32},"Cpp","\u002Fcpp","cpp",[9,33,105,110,134,163],{"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,100],{"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},"Volume","\u002Fcpp\u002Fmodules\u002Fvolume","cpp\u002F2.modules\u002F13.volume","i-lucide-box",{"title":106,"path":107,"stem":108,"icon":109},"Benchmarks","\u002Fcpp\u002Fbenchmarks","cpp\u002F3.benchmarks","i-lucide-chart-bar-stacked",{"title":111,"path":112,"stem":113,"children":114,"icon":32},"VTK","\u002Fcpp\u002Fvtk","cpp\u002F4.vtk\u002F1.index",[115,117,120,125,130],{"title":39,"path":112,"stem":113,"icon":116},"i-lucide-layers",{"title":42,"path":118,"stem":119,"icon":45},"\u002Fcpp\u002Fvtk\u002Fcore","cpp\u002F4.vtk\u002F2.core",{"title":121,"path":122,"stem":123,"icon":124},"Functions","\u002Fcpp\u002Fvtk\u002Ffunctions","cpp\u002F4.vtk\u002F3.functions","i-lucide-function-square",{"title":126,"path":127,"stem":128,"icon":129},"Filters","\u002Fcpp\u002Fvtk\u002Ffilters","cpp\u002F4.vtk\u002F4.filters","i-lucide-filter",{"title":131,"path":132,"stem":133,"icon":26},"Examples","\u002Fcpp\u002Fvtk\u002Fexamples","cpp\u002F4.vtk\u002F5.examples",{"title":131,"path":135,"stem":136,"children":137,"icon":32},"\u002Fcpp\u002Fexamples","cpp\u002F5.examples\u002F0.index",[138,140,144,149,154,158],{"title":39,"path":135,"stem":136,"icon":139},"i-lucide-book-open",{"title":141,"path":142,"stem":143,"icon":104},"Geometry Walkthrough","\u002Fcpp\u002Fexamples\u002Fmesh-assembly","cpp\u002F5.examples\u002F1.mesh-assembly",{"title":145,"path":146,"stem":147,"icon":148},"Point Cloud Alignment","\u002Fcpp\u002Fexamples\u002Falignment","cpp\u002F5.examples\u002F2.alignment","i-lucide-move",{"title":150,"path":151,"stem":152,"icon":153},"Booleans and Domains from One Build","\u002Fcpp\u002Fexamples\u002Farrangements","cpp\u002F5.examples\u002F3.arrangements","i-lucide-layers-3",{"title":155,"path":156,"stem":157,"icon":116},"VTK Integration","\u002Fcpp\u002Fexamples\u002Fvtk","cpp\u002F5.examples\u002F4.vtk",{"title":159,"path":160,"stem":161,"icon":162},"Coming from Other Libraries","\u002Fcpp\u002Fexamples\u002Flibrary-comparisons","cpp\u002F5.examples\u002F5.library-comparisons","i-lucide-git-compare",{"title":164,"path":165,"stem":166,"children":167,"page":32},"About","\u002Fcpp\u002Fabout","cpp\u002F6.about",[168,172,177],{"title":169,"path":170,"stem":171,"icon":139},"Research","\u002Fcpp\u002Fabout\u002Fresearch","cpp\u002F6.about\u002F1.research",{"title":173,"path":174,"stem":175,"icon":176},"Contributing","\u002Fcpp\u002Fabout\u002Fcontributing","cpp\u002F6.about\u002F2.contributing","i-lucide-heart-handshake",{"title":178,"path":179,"stem":180,"icon":181},"License","\u002Fcpp\u002Fabout\u002Flicense","cpp\u002F6.about\u002F3.license","i-lucide-file-text",{"cpp":183,"py":229,"ts":352},[184],{"title":5,"path":6,"stem":7,"children":185,"page":32},[186,192,208,209,216,224],{"title":10,"path":11,"stem":12,"children":187,"icon":32},[188,189,190,191],{"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":193,"icon":32},[194,195,196,197,198,199,200,201,202,203,204,205,206,207],{"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,"icon":109},{"title":111,"path":112,"stem":113,"children":210,"icon":32},[211,212,213,214,215],{"title":39,"path":112,"stem":113,"icon":116},{"title":42,"path":118,"stem":119,"icon":45},{"title":121,"path":122,"stem":123,"icon":124},{"title":126,"path":127,"stem":128,"icon":129},{"title":131,"path":132,"stem":133,"icon":26},{"title":131,"path":135,"stem":136,"children":217,"icon":32},[218,219,220,221,222,223],{"title":39,"path":135,"stem":136,"icon":139},{"title":141,"path":142,"stem":143,"icon":104},{"title":145,"path":146,"stem":147,"icon":148},{"title":150,"path":151,"stem":152,"icon":153},{"title":155,"path":156,"stem":157,"icon":116},{"title":159,"path":160,"stem":161,"icon":162},{"title":164,"path":165,"stem":166,"children":225,"page":32},[226,227,228],{"title":169,"path":170,"stem":171,"icon":139},{"title":173,"path":174,"stem":175,"icon":176},{"title":178,"path":179,"stem":180,"icon":181},[230],{"title":231,"path":232,"stem":233,"children":234,"page":32},"Py","\u002Fpy","py",[235,249,293,296,317,339],{"title":10,"path":236,"stem":237,"children":238,"icon":32},"\u002Fpy\u002Fgetting-started","py\u002F1.getting-started\u002F1.index",[239,240,243,246],{"title":15,"path":236,"stem":237,"icon":16},{"title":18,"path":241,"stem":242,"icon":21},"\u002Fpy\u002Fgetting-started\u002Finstallation","py\u002F1.getting-started\u002F2.installation",{"title":23,"path":244,"stem":245,"icon":26},"\u002Fpy\u002Fgetting-started\u002Flive-examples","py\u002F1.getting-started\u002F3.live-examples",{"title":28,"path":247,"stem":248,"icon":31},"\u002Fpy\u002Fgetting-started\u002Frelease-notes","py\u002F1.getting-started\u002F4.release-notes",{"title":34,"path":250,"stem":251,"children":252,"icon":32},"\u002Fpy\u002Fmodules","py\u002F2.modules\u002F00.index",[253,254,257,260,263,266,269,272,275,278,281,284,287,290],{"title":39,"path":250,"stem":251,"icon":40},{"title":42,"path":255,"stem":256,"icon":45},"\u002Fpy\u002Fmodules\u002Fcore","py\u002F2.modules\u002F01.core",{"title":47,"path":258,"stem":259,"icon":50},"\u002Fpy\u002Fmodules\u002Fspatial","py\u002F2.modules\u002F02.spatial",{"title":52,"path":261,"stem":262,"icon":55},"\u002Fpy\u002Fmodules\u002Ftopology","py\u002F2.modules\u002F03.topology",{"title":57,"path":264,"stem":265,"icon":60},"\u002Fpy\u002Fmodules\u002Fgeometry","py\u002F2.modules\u002F04.geometry",{"title":62,"path":267,"stem":268,"icon":65},"\u002Fpy\u002Fmodules\u002Fremesh","py\u002F2.modules\u002F05.remesh",{"title":67,"path":270,"stem":271,"icon":70},"\u002Fpy\u002Fmodules\u002Fintersect","py\u002F2.modules\u002F06.intersect",{"title":72,"path":273,"stem":274,"icon":75},"\u002Fpy\u002Fmodules\u002Farrangement","py\u002F2.modules\u002F07.arrangement",{"title":77,"path":276,"stem":277,"icon":80},"\u002Fpy\u002Fmodules\u002Fiso","py\u002F2.modules\u002F08.iso",{"title":82,"path":279,"stem":280,"icon":85},"\u002Fpy\u002Fmodules\u002Fcsg","py\u002F2.modules\u002F09.csg",{"title":87,"path":282,"stem":283,"icon":31},"\u002Fpy\u002Fmodules\u002Fclean","py\u002F2.modules\u002F10.clean",{"title":91,"path":285,"stem":286,"icon":94},"\u002Fpy\u002Fmodules\u002Freindex","py\u002F2.modules\u002F11.reidx",{"title":96,"path":288,"stem":289,"icon":99},"\u002Fpy\u002Fmodules\u002Fio","py\u002F2.modules\u002F12.io",{"title":101,"path":291,"stem":292,"icon":104},"\u002Fpy\u002Fmodules\u002Fvolume","py\u002F2.modules\u002F13.volume",{"title":106,"path":294,"stem":295,"icon":109},"\u002Fpy\u002Fbenchmarks","py\u002F3.benchmarks",{"title":297,"path":298,"stem":299,"children":300,"icon":32},"Blender","\u002Fpy\u002Fblender","py\u002F4.blender\u002F1.index",[301,303,308,312],{"title":39,"path":298,"stem":299,"icon":302},"i-vscode-icons:file-type-blender",{"title":304,"path":305,"stem":306,"icon":307},"Convert","\u002Fpy\u002Fblender\u002Fconvert","py\u002F4.blender\u002F2.convert","i-lucide-repeat",{"title":309,"path":310,"stem":311,"icon":116},"Scene","\u002Fpy\u002Fblender\u002Fscene","py\u002F4.blender\u002F3.scene",{"title":313,"path":314,"stem":315,"icon":316},"Plugin Architecture","\u002Fpy\u002Fblender\u002Fplugin","py\u002F4.blender\u002F4.plugin","i-lucide-puzzle",{"title":131,"path":318,"stem":319,"children":320,"icon":32},"\u002Fpy\u002Fexamples","py\u002F5.examples\u002F0.index",[321,322,327,330,334],{"title":39,"path":318,"stem":319,"icon":139},{"title":323,"path":324,"stem":325,"icon":326},"Core Functionality","\u002Fpy\u002Fexamples\u002Fcore-functionality","py\u002F5.examples\u002F2.core-functionality","i-lucide-code",{"title":150,"path":328,"stem":329,"icon":153},"\u002Fpy\u002Fexamples\u002Farrangements","py\u002F5.examples\u002F3.arrangements",{"title":155,"path":331,"stem":332,"icon":333},"\u002Fpy\u002Fexamples\u002Fvtk-integration","py\u002F5.examples\u002F4.vtk-integration","i-lucide-grid-2x2",{"title":335,"path":336,"stem":337,"icon":338},"Raycast Rendering","\u002Fpy\u002Fexamples\u002Fraycast-rendering","py\u002F5.examples\u002F5.raycast-rendering","i-lucide-scan-line",{"title":164,"path":340,"stem":341,"children":342,"page":32},"\u002Fpy\u002Fabout","py\u002F6.about",[343,346,349],{"title":169,"path":344,"stem":345,"icon":139},"\u002Fpy\u002Fabout\u002Fresearch","py\u002F6.about\u002F1.research",{"title":173,"path":347,"stem":348,"icon":176},"\u002Fpy\u002Fabout\u002Fcontributing","py\u002F6.about\u002F2.contributing",{"title":178,"path":350,"stem":351,"icon":181},"\u002Fpy\u002Fabout\u002Flicense","py\u002F6.about\u002F3.license",[353],{"title":354,"path":355,"stem":356,"children":357,"page":32},"Ts","\u002Fts","ts",[358,372,413,416,433],{"title":10,"path":359,"stem":360,"children":361,"icon":32},"\u002Fts\u002Fgetting-started","ts\u002F1.getting-started\u002F1.index",[362,363,366,369],{"title":15,"path":359,"stem":360,"icon":16},{"title":18,"path":364,"stem":365,"icon":21},"\u002Fts\u002Fgetting-started\u002Finstallation","ts\u002F1.getting-started\u002F2.installation",{"title":23,"path":367,"stem":368,"icon":26},"\u002Fts\u002Fgetting-started\u002Flive-examples","ts\u002F1.getting-started\u002F3.live-examples",{"title":28,"path":370,"stem":371,"icon":31},"\u002Fts\u002Fgetting-started\u002Frelease-notes","ts\u002F1.getting-started\u002F4.release-notes",{"title":34,"path":373,"stem":374,"children":375,"icon":32},"\u002Fts\u002Fmodules","ts\u002F2.modules\u002F00.index",[376,377,380,383,386,389,392,395,398,401,404,407,410],{"title":39,"path":373,"stem":374,"icon":40},{"title":42,"path":378,"stem":379,"icon":45},"\u002Fts\u002Fmodules\u002Fcore","ts\u002F2.modules\u002F01.core",{"title":47,"path":381,"stem":382,"icon":50},"\u002Fts\u002Fmodules\u002Fspatial","ts\u002F2.modules\u002F02.spatial",{"title":52,"path":384,"stem":385,"icon":55},"\u002Fts\u002Fmodules\u002Ftopology","ts\u002F2.modules\u002F03.topology",{"title":57,"path":387,"stem":388,"icon":60},"\u002Fts\u002Fmodules\u002Fgeometry","ts\u002F2.modules\u002F04.geometry",{"title":62,"path":390,"stem":391,"icon":65},"\u002Fts\u002Fmodules\u002Fremesh","ts\u002F2.modules\u002F05.remesh",{"title":67,"path":393,"stem":394,"icon":70},"\u002Fts\u002Fmodules\u002Fintersect","ts\u002F2.modules\u002F06.intersect",{"title":72,"path":396,"stem":397,"icon":75},"\u002Fts\u002Fmodules\u002Farrangement","ts\u002F2.modules\u002F07.arrangement",{"title":77,"path":399,"stem":400,"icon":80},"\u002Fts\u002Fmodules\u002Fiso","ts\u002F2.modules\u002F08.iso",{"title":82,"path":402,"stem":403,"icon":85},"\u002Fts\u002Fmodules\u002Fcsg","ts\u002F2.modules\u002F09.csg",{"title":87,"path":405,"stem":406,"icon":31},"\u002Fts\u002Fmodules\u002Fclean","ts\u002F2.modules\u002F10.clean",{"title":91,"path":408,"stem":409,"icon":94},"\u002Fts\u002Fmodules\u002Freindex","ts\u002F2.modules\u002F11.reidx",{"title":96,"path":411,"stem":412,"icon":99},"\u002Fts\u002Fmodules\u002Fio","ts\u002F2.modules\u002F12.io",{"title":106,"path":414,"stem":415,"icon":109},"\u002Fts\u002Fbenchmarks","ts\u002F3.benchmarks",{"title":131,"path":417,"stem":418,"children":419,"icon":32},"\u002Fts\u002Fexamples","ts\u002F4.examples\u002F0.index",[420,421,424,429],{"title":39,"path":417,"stem":418,"icon":139},{"title":323,"path":422,"stem":423,"icon":326},"\u002Fts\u002Fexamples\u002Fcore-functionality","ts\u002F4.examples\u002F2.core-functionality",{"title":425,"path":426,"stem":427,"icon":428},"Alignment","\u002Fts\u002Fexamples\u002Falignment","ts\u002F4.examples\u002F3.alignment","i-lucide-move-3d",{"title":335,"path":430,"stem":431,"icon":432},"\u002Fts\u002Fexamples\u002Fraycast-render","ts\u002F4.examples\u002F4.raycast-render","i-lucide-image",{"title":164,"icon":32,"path":434,"stem":435,"children":436,"page":32},"\u002Fts\u002Fabout","ts\u002F5.about",[437,440,443],{"title":169,"path":438,"stem":439,"icon":139},"\u002Fts\u002Fabout\u002Fresearch","ts\u002F5.about\u002F1.research",{"title":173,"path":441,"stem":442,"icon":176},"\u002Fts\u002Fabout\u002Fcontributing","ts\u002F5.about\u002F2.contributing",{"title":178,"path":444,"stem":445,"icon":181},"\u002Fts\u002Fabout\u002Flicense","ts\u002F5.about\u002F3.license",{"id":447,"title":101,"body":448,"description":4919,"extension":4920,"links":4921,"meta":4922,"navigation":4923,"path":102,"seo":4924,"sitemap":4925,"stem":103,"__hash__":4926},"docsCpp\u002Fcpp\u002F2.modules\u002F13.volume.md",{"type":449,"value":450,"toc":4892},"minimark",[451,455,458,487,612,845,852,857,913,1147,1154,1332,1338,1343,1368,1461,1486,1489,1506,1602,1606,1613,1676,1680,1683,1768,1781,1785,1788,1790,2103,2191,2203,2206,2461,2560,2563,2577,2587,2783,2794,2799,2808,2861,3005,3011,3015,3017,3117,3174,3198,3234,3237,3244,3302,3386,3390,3393,3525,3541,3602,3613,3616,3620,3641,3648,3663,3667,3677,3763,3766,3770,3773,3976,4062,4081,4084,4087,4211,4225,4234,4238,4242,4359,4368,4372,4579,4585,4591,4600,4604,4625,4789,4801,4805,4882,4888],[452,453,454],"p",{},"The Volume module works on a dense scalar field sampled on a regular, axis-aligned grid. It generates such a field from a mesh or an analytic solid, combines fields with CSG operators, slices one onto a plane, and extracts the geometry a field's level set names.",[452,456,457],{},"Include the module with:",[459,460,464],"pre",{"className":461,"code":462,"language":7,"meta":463,"style":463},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","#include \u003Ctrueform\u002Fvolume.hpp>\n","",[465,466,467],"code",{"__ignoreMap":463},[468,469,472,476,480,484],"span",{"class":470,"line":471},"line",1,[468,473,475],{"class":474},"s7zQu","#include",[468,477,479],{"class":478},"sMK4o"," \u003C",[468,481,483],{"class":482},"sfazB","trueform\u002Fvolume.hpp",[468,485,486],{"class":478},">\n",[488,489,490,506],"table",{},[491,492,493],"thead",{},[494,495,496,500,503],"tr",{},[497,498,499],"th",{},"Entry",[497,501,502],{},"Returns",[497,504,505],{},"Does",[507,508,509,525,539,553,568,583,598],"tbody",{},[494,510,511,517,522],{},[512,513,514],"td",{},[465,515,516],{},"tf::make_sphere_sdf",[512,518,519],{},[465,520,521],{},"tf::volume_buffer",[512,523,524],{},"The analytic sphere field",[494,526,527,532,536],{},[512,528,529],{},[465,530,531],{},"tf::make_mesh_sdf",[512,533,534],{},[465,535,521],{},[512,537,538],{},"The signed distance field of a closed mesh",[494,540,541,546,550],{},[512,542,543],{},[465,544,545],{},"tf::make_boolean",[512,547,548],{},[465,549,521],{},[512,551,552],{},"Union \u002F intersection \u002F difference of two fields",[494,554,555,560,565],{},[512,556,557],{},[465,558,559],{},"tf::make_isosurface",[512,561,562],{},[465,563,564],{},"tf::polygons_buffer",[512,566,567],{},"A 3D field's level set as a triangle mesh",[494,569,570,575,580],{},[512,571,572],{},[465,573,574],{},"tf::make_isocontours",[512,576,577],{},[465,578,579],{},"tf::curves_buffer",[512,581,582],{},"A 2D field's level set, or a slice plane's, as polylines",[494,584,585,590,595],{},[512,586,587],{},[465,588,589],{},"tf::make_volume_slice",[512,591,592,594],{},[465,593,521],{}," (2D)",[512,596,597],{},"The field resampled onto an oriented plane",[494,599,600,605,609],{},[512,601,602],{},[465,603,604],{},"tf::make_resampled_volume",[512,606,607],{},[465,608,521],{},[512,610,611],{},"The field regridded onto a stated grid",[459,613,616],{"className":461,"code":614,"filename":615,"language":7,"meta":463,"style":463},"auto field = tf::make_sphere_sdf\u003Cfloat>({64, 64, 64},\n                                        tf::point\u003Cfloat, 3>{0.1f, 0.1f, 0.1f},\n                                        tf::point\u003Cfloat, 3>{-3.2f, -3.2f, -3.2f},\n                                        tf::point\u003Cfloat, 3>{0.f, 0.f, 0.f}, 1.5f);\n\nauto mesh = tf::make_isosurface(field.volume());   \u002F\u002F the zero level set\n","volume_basic.cpp",[465,617,618,674,715,759,802,809],{"__ignoreMap":463},[468,619,620,624,628,631,635,638,642,645,648,651,654,658,661,664,666,668,671],{"class":470,"line":471},[468,621,623],{"class":622},"spNyl","auto",[468,625,627],{"class":626},"sTEyZ"," field ",[468,629,630],{"class":478},"=",[468,632,634],{"class":633},"sBMFI"," tf",[468,636,637],{"class":478},"::",[468,639,641],{"class":640},"s2Zo4","make_sphere_sdf",[468,643,644],{"class":478},"\u003C",[468,646,647],{"class":622},"float",[468,649,650],{"class":478},">(",[468,652,653],{"class":626},"{",[468,655,657],{"class":656},"sbssI","64",[468,659,660],{"class":478},",",[468,662,663],{"class":656}," 64",[468,665,660],{"class":478},[468,667,663],{"class":656},[468,669,670],{"class":626},"}",[468,672,673],{"class":478},",\n",[468,675,677,680,682,685,687,689,691,694,697,699,702,704,707,709,711,713],{"class":470,"line":676},2,[468,678,679],{"class":633},"                                        tf",[468,681,637],{"class":478},[468,683,684],{"class":626},"point",[468,686,644],{"class":478},[468,688,647],{"class":622},[468,690,660],{"class":478},[468,692,693],{"class":656}," 3",[468,695,696],{"class":478},">",[468,698,653],{"class":626},[468,700,701],{"class":656},"0.1f",[468,703,660],{"class":478},[468,705,706],{"class":656}," 0.1f",[468,708,660],{"class":478},[468,710,706],{"class":656},[468,712,670],{"class":626},[468,714,673],{"class":478},[468,716,718,720,722,724,726,728,730,732,734,736,739,742,744,747,749,751,753,755,757],{"class":470,"line":717},3,[468,719,679],{"class":633},[468,721,637],{"class":478},[468,723,684],{"class":626},[468,725,644],{"class":478},[468,727,647],{"class":622},[468,729,660],{"class":478},[468,731,693],{"class":656},[468,733,696],{"class":478},[468,735,653],{"class":626},[468,737,738],{"class":478},"-",[468,740,741],{"class":656},"3.2f",[468,743,660],{"class":478},[468,745,746],{"class":478}," -",[468,748,741],{"class":656},[468,750,660],{"class":478},[468,752,746],{"class":478},[468,754,741],{"class":656},[468,756,670],{"class":626},[468,758,673],{"class":478},[468,760,762,764,766,768,770,772,774,776,778,780,783,785,788,790,792,794,796,799],{"class":470,"line":761},4,[468,763,679],{"class":633},[468,765,637],{"class":478},[468,767,684],{"class":626},[468,769,644],{"class":478},[468,771,647],{"class":622},[468,773,660],{"class":478},[468,775,693],{"class":656},[468,777,696],{"class":478},[468,779,653],{"class":626},[468,781,782],{"class":656},"0.f",[468,784,660],{"class":478},[468,786,787],{"class":656}," 0.f",[468,789,660],{"class":478},[468,791,787],{"class":656},[468,793,670],{"class":626},[468,795,660],{"class":478},[468,797,798],{"class":656}," 1.5f",[468,800,801],{"class":478},");\n",[468,803,805],{"class":470,"line":804},5,[468,806,808],{"emptyLinePlaceholder":807},true,"\n",[468,810,812,814,817,819,821,823,826,829,832,835,838,841],{"class":470,"line":811},6,[468,813,623],{"class":622},[468,815,816],{"class":626}," mesh ",[468,818,630],{"class":478},[468,820,634],{"class":633},[468,822,637],{"class":478},[468,824,825],{"class":640},"make_isosurface",[468,827,828],{"class":478},"(",[468,830,831],{"class":626},"field",[468,833,834],{"class":478},".",[468,836,837],{"class":640},"volume",[468,839,840],{"class":478},"());",[468,842,844],{"class":843},"sHwdD","   \u002F\u002F the zero level set\n",[452,846,847,848,851],{},"A volume boolean is a sample-wise combine of two fields: exact on the zero level set, approximate away from it, and bound by the grid's resolution. The ",[849,850,82],"a",{"href":83}," module's mesh boolean is exact everywhere and carries no resolution. Use fields when the input is already a field, when the shapes are offsets or blends, or when a self-intersecting input must be resolved by resampling; use CSG when the operands are meshes you want back unchanged.",[853,854,856],"h2",{"id":855},"the-carrier","The Carrier",[488,858,859,869],{},[491,860,861],{},[494,862,863,866],{},[497,864,865],{},"Type",[497,867,868],{},"Role",[507,870,871,899],{},[494,872,873,878],{},[512,874,875],{},[465,876,877],{},"tf::volume_buffer\u003CT, Coord, Dims>",[512,879,880,881,884,885,888,889,891,892,894,895,898],{},"Owns the samples in ",[465,882,883],{},"T"," — any arithmetic scalar, int16\u002Fuint16\u002Fuint8 included — on a ",[465,886,887],{},"Coord"," grid. ",[465,890,887],{}," defaults to ",[465,893,883],{},", ",[465,896,897],{},"Dims"," to 3",[494,900,901,906],{},[512,902,903],{},[465,904,905],{},"tf::volume\u003CPolicy>",[512,907,908,909,912],{},"The non-owning view every entry takes. ",[465,910,911],{},"buffer.volume()"," yields it",[459,914,917],{"className":461,"code":915,"filename":916,"language":7,"meta":463,"style":463},"tf::volume_buffer\u003Cfloat> field({64, 64, 64}, {0.1f, 0.1f, 0.1f},\n                               {-3.2f, -3.2f, -3.2f});\nfield(10, 12, 14) = -0.5f;               \u002F\u002F sample at voxel (x, y, z)\n\nauto vol = field.volume();               \u002F\u002F the view the entries take\nvol.dims();                              \u002F\u002F {64, 64, 64}\nvol.spacing();                           \u002F\u002F one voxel step along x, y, z\nvol.origin();                            \u002F\u002F local-space position of sample (0,0,0)\nvol.voxel_count();                       \u002F\u002F 262144\nvol.point_at(10, 12, 14);                \u002F\u002F origin + (x, y, z) * spacing\n","volume_carrier.cpp",[465,918,919,973,998,1034,1038,1059,1074,1089,1104,1119],{"__ignoreMap":463},[468,920,921,924,926,929,931,933,935,938,940,942,944,946,948,950,952,954,956,959,961,963,965,967,969,971],{"class":470,"line":471},[468,922,923],{"class":633},"tf",[468,925,637],{"class":478},[468,927,928],{"class":633},"volume_buffer",[468,930,644],{"class":478},[468,932,647],{"class":622},[468,934,696],{"class":478},[468,936,937],{"class":640}," field",[468,939,828],{"class":478},[468,941,653],{"class":626},[468,943,657],{"class":656},[468,945,660],{"class":478},[468,947,663],{"class":656},[468,949,660],{"class":478},[468,951,663],{"class":656},[468,953,670],{"class":626},[468,955,660],{"class":478},[468,957,958],{"class":626}," {",[468,960,701],{"class":656},[468,962,660],{"class":478},[468,964,706],{"class":656},[468,966,660],{"class":478},[468,968,706],{"class":656},[468,970,670],{"class":626},[468,972,673],{"class":478},[468,974,975,978,980,982,984,986,988,990,992,994,996],{"class":470,"line":676},[468,976,977],{"class":626},"                               {",[468,979,738],{"class":478},[468,981,741],{"class":656},[468,983,660],{"class":478},[468,985,746],{"class":478},[468,987,741],{"class":656},[468,989,660],{"class":478},[468,991,746],{"class":478},[468,993,741],{"class":656},[468,995,670],{"class":626},[468,997,801],{"class":478},[468,999,1000,1002,1004,1007,1009,1012,1014,1017,1020,1023,1025,1028,1031],{"class":470,"line":717},[468,1001,831],{"class":640},[468,1003,828],{"class":478},[468,1005,1006],{"class":656},"10",[468,1008,660],{"class":478},[468,1010,1011],{"class":656}," 12",[468,1013,660],{"class":478},[468,1015,1016],{"class":656}," 14",[468,1018,1019],{"class":478},")",[468,1021,1022],{"class":478}," =",[468,1024,746],{"class":478},[468,1026,1027],{"class":656},"0.5f",[468,1029,1030],{"class":478},";",[468,1032,1033],{"class":843},"               \u002F\u002F sample at voxel (x, y, z)\n",[468,1035,1036],{"class":470,"line":761},[468,1037,808],{"emptyLinePlaceholder":807},[468,1039,1040,1042,1045,1047,1049,1051,1053,1056],{"class":470,"line":804},[468,1041,623],{"class":622},[468,1043,1044],{"class":626}," vol ",[468,1046,630],{"class":478},[468,1048,937],{"class":626},[468,1050,834],{"class":478},[468,1052,837],{"class":640},[468,1054,1055],{"class":478},"();",[468,1057,1058],{"class":843},"               \u002F\u002F the view the entries take\n",[468,1060,1061,1064,1066,1069,1071],{"class":470,"line":811},[468,1062,1063],{"class":626},"vol",[468,1065,834],{"class":478},[468,1067,1068],{"class":640},"dims",[468,1070,1055],{"class":478},[468,1072,1073],{"class":843},"                              \u002F\u002F {64, 64, 64}\n",[468,1075,1077,1079,1081,1084,1086],{"class":470,"line":1076},7,[468,1078,1063],{"class":626},[468,1080,834],{"class":478},[468,1082,1083],{"class":640},"spacing",[468,1085,1055],{"class":478},[468,1087,1088],{"class":843},"                           \u002F\u002F one voxel step along x, y, z\n",[468,1090,1092,1094,1096,1099,1101],{"class":470,"line":1091},8,[468,1093,1063],{"class":626},[468,1095,834],{"class":478},[468,1097,1098],{"class":640},"origin",[468,1100,1055],{"class":478},[468,1102,1103],{"class":843},"                            \u002F\u002F local-space position of sample (0,0,0)\n",[468,1105,1107,1109,1111,1114,1116],{"class":470,"line":1106},9,[468,1108,1063],{"class":626},[468,1110,834],{"class":478},[468,1112,1113],{"class":640},"voxel_count",[468,1115,1055],{"class":478},[468,1117,1118],{"class":843},"                       \u002F\u002F 262144\n",[468,1120,1122,1124,1126,1129,1131,1133,1135,1137,1139,1141,1144],{"class":470,"line":1121},10,[468,1123,1063],{"class":626},[468,1125,834],{"class":478},[468,1127,1128],{"class":640},"point_at",[468,1130,828],{"class":478},[468,1132,1006],{"class":656},[468,1134,660],{"class":478},[468,1136,1011],{"class":656},[468,1138,660],{"class":478},[468,1140,1016],{"class":656},[468,1142,1143],{"class":478},");",[468,1145,1146],{"class":843},"                \u002F\u002F origin + (x, y, z) * spacing\n",[452,1148,1149,1150,1153],{},"Samples are stored with the first axis varying fastest: ",[465,1151,1152],{},"linear_index(x, y, z) == x + dims[0] * (y + dims[1] * z)",". A view over memory you already own is built without a copy:",[459,1155,1158],{"className":461,"code":1156,"filename":1157,"language":7,"meta":463,"style":463},"std::vector\u003Cfloat> samples(64 * 64 * 64);\nauto vol = tf::make_volume(samples.data(), std::array\u003Cint, 3>{64, 64, 64},\n                           tf::point\u003Cfloat, 3>{0.1f, 0.1f, 0.1f},\n                           tf::point\u003Cfloat, 3>{-3.2f, -3.2f, -3.2f});\n","volume_view.cpp",[465,1159,1160,1194,1257,1292],{"__ignoreMap":463},[468,1161,1162,1165,1167,1170,1172,1174,1176,1179,1181,1183,1186,1188,1190,1192],{"class":470,"line":471},[468,1163,1164],{"class":633},"std",[468,1166,637],{"class":478},[468,1168,1169],{"class":633},"vector",[468,1171,644],{"class":478},[468,1173,647],{"class":622},[468,1175,696],{"class":478},[468,1177,1178],{"class":640}," samples",[468,1180,828],{"class":478},[468,1182,657],{"class":656},[468,1184,1185],{"class":622}," *",[468,1187,663],{"class":656},[468,1189,1185],{"class":622},[468,1191,663],{"class":656},[468,1193,801],{"class":478},[468,1195,1196,1198,1200,1202,1204,1206,1209,1211,1214,1216,1219,1222,1225,1227,1230,1232,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255],{"class":470,"line":676},[468,1197,623],{"class":622},[468,1199,1044],{"class":626},[468,1201,630],{"class":478},[468,1203,634],{"class":633},[468,1205,637],{"class":478},[468,1207,1208],{"class":640},"make_volume",[468,1210,828],{"class":478},[468,1212,1213],{"class":626},"samples",[468,1215,834],{"class":478},[468,1217,1218],{"class":640},"data",[468,1220,1221],{"class":478},"(),",[468,1223,1224],{"class":633}," std",[468,1226,637],{"class":478},[468,1228,1229],{"class":626},"array",[468,1231,644],{"class":478},[468,1233,1234],{"class":622},"int",[468,1236,660],{"class":478},[468,1238,693],{"class":656},[468,1240,696],{"class":478},[468,1242,653],{"class":626},[468,1244,657],{"class":656},[468,1246,660],{"class":478},[468,1248,663],{"class":656},[468,1250,660],{"class":478},[468,1252,663],{"class":656},[468,1254,670],{"class":626},[468,1256,673],{"class":478},[468,1258,1259,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290],{"class":470,"line":717},[468,1260,1261],{"class":633},"                           tf",[468,1263,637],{"class":478},[468,1265,684],{"class":626},[468,1267,644],{"class":478},[468,1269,647],{"class":622},[468,1271,660],{"class":478},[468,1273,693],{"class":656},[468,1275,696],{"class":478},[468,1277,653],{"class":626},[468,1279,701],{"class":656},[468,1281,660],{"class":478},[468,1283,706],{"class":656},[468,1285,660],{"class":478},[468,1287,706],{"class":656},[468,1289,670],{"class":626},[468,1291,673],{"class":478},[468,1293,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318,1320,1322,1324,1326,1328,1330],{"class":470,"line":761},[468,1295,1261],{"class":633},[468,1297,637],{"class":478},[468,1299,684],{"class":626},[468,1301,644],{"class":478},[468,1303,647],{"class":622},[468,1305,660],{"class":478},[468,1307,693],{"class":656},[468,1309,696],{"class":478},[468,1311,653],{"class":626},[468,1313,738],{"class":478},[468,1315,741],{"class":656},[468,1317,660],{"class":478},[468,1319,746],{"class":478},[468,1321,741],{"class":656},[468,1323,660],{"class":478},[468,1325,746],{"class":478},[468,1327,741],{"class":656},[468,1329,670],{"class":626},[468,1331,801],{"class":478},[452,1333,1334,1337],{},[465,1335,1336],{},"tf::make_volume_buffer\u003COutputCoordinateType>(vol)"," copies a view into its own buffer: stated, the request becomes both types of the copy; unstated, the copy keeps the view's own two.",[1339,1340,1342],"h3",{"id":1341},"sample-type-and-coordinate-type","Sample Type and Coordinate Type",[452,1344,1345,1346,1349,1350,1354,1355,1358,1359,1362,1363,894,1365,1367],{},"A volume is a sampled function, so it carries two types: ",[465,1347,1348],{},"sample_type"," (what a sample ",[1351,1352,1353],"strong",{},"is",") and ",[465,1356,1357],{},"coordinate_type"," (where samples ",[1351,1360,1361],{},"stand"," — the scalar of ",[465,1364,1083],{},[465,1366,1098],{}," and every emitted position). They are the same by default. State them apart for measurements whose grid is not their own scale — int16 CT counts on a fractional-millimetre grid:",[459,1369,1372],{"className":461,"code":1370,"filename":1371,"language":7,"meta":463,"style":463},"tf::volume_buffer\u003Cstd::int16_t, float> ct({512, 512, 300},\n                                          {0.7f, 0.7f, 1.5f},\n                                          {0.f, 0.f, 0.f});\n","volume_two_types.cpp",[465,1373,1374,1422,1443],{"__ignoreMap":463},[468,1375,1376,1378,1380,1382,1384,1386,1388,1391,1393,1396,1398,1401,1403,1405,1408,1410,1413,1415,1418,1420],{"class":470,"line":471},[468,1377,923],{"class":633},[468,1379,637],{"class":478},[468,1381,928],{"class":633},[468,1383,644],{"class":478},[468,1385,1164],{"class":633},[468,1387,637],{"class":478},[468,1389,1390],{"class":622},"int16_t",[468,1392,660],{"class":478},[468,1394,1395],{"class":622}," float",[468,1397,696],{"class":478},[468,1399,1400],{"class":640}," ct",[468,1402,828],{"class":478},[468,1404,653],{"class":626},[468,1406,1407],{"class":656},"512",[468,1409,660],{"class":478},[468,1411,1412],{"class":656}," 512",[468,1414,660],{"class":478},[468,1416,1417],{"class":656}," 300",[468,1419,670],{"class":626},[468,1421,673],{"class":478},[468,1423,1424,1427,1430,1432,1435,1437,1439,1441],{"class":470,"line":676},[468,1425,1426],{"class":626},"                                          {",[468,1428,1429],{"class":656},"0.7f",[468,1431,660],{"class":478},[468,1433,1434],{"class":656}," 0.7f",[468,1436,660],{"class":478},[468,1438,798],{"class":656},[468,1440,670],{"class":626},[468,1442,673],{"class":478},[468,1444,1445,1447,1449,1451,1453,1455,1457,1459],{"class":470,"line":717},[468,1446,1426],{"class":626},[468,1448,782],{"class":656},[468,1450,660],{"class":478},[468,1452,787],{"class":656},[468,1454,660],{"class":478},[468,1456,787],{"class":656},[468,1458,670],{"class":626},[468,1460,801],{"class":478},[452,1462,1463,1464,1467,1468,1471,1472,1474,1475,1477,1478,1481,1482,1485],{},"Every entry emits in one type: the ",[465,1465,1466],{},"OutputCoordinateType"," template argument, or — when you state none — its own input's coordinate type. That is the volume's for every entry that takes one, and the ",[1351,1469,1470],{},"mesh's"," for ",[465,1473,531],{},", which takes no volume. ",[465,1476,516],{}," carries no such request at all: its ",[465,1479,1480],{},"RealType"," template argument is the field's type outright, deduced from the ",[465,1483,1484],{},"tf::point"," arguments or stated.",[452,1487,1488],{},"The emitted type must be floating, so an integer-sampled field emits in the grid's floating coordinate type unless you ask otherwise. Each sample is read through exactly one cast into that type, so a crossing always lands on the edge it belongs to.",[452,1490,1491,1492,1495,1496,1498,1499,1505],{},"An entry that also names an index type takes ",[465,1493,1494],{},"Index"," first and ",[465,1497,1466],{}," second, the slot order ",[849,1500,1502],{"href":1501},"\u002Fcpp\u002Fmodules\u002Fgeometry#triangulation",[465,1503,1504],{},"tf::triangulated"," and the other geometry entries use:",[459,1507,1510],{"className":461,"code":1508,"filename":1509,"language":7,"meta":463,"style":463},"auto mesh   = tf::make_isosurface(vol);                   \u002F\u002F float samples -> float mesh\nauto wide64 = tf::make_isosurface\u003Cstd::int64_t>(vol);     \u002F\u002F 64-bit face indices\nauto wide   = tf::make_isosurface\u003Cint, double>(vol);      \u002F\u002F double coordinates\n","volume_request.cpp",[465,1511,1512,1536,1569],{"__ignoreMap":463},[468,1513,1514,1516,1519,1521,1523,1525,1527,1529,1531,1533],{"class":470,"line":471},[468,1515,623],{"class":622},[468,1517,1518],{"class":626}," mesh   ",[468,1520,630],{"class":478},[468,1522,634],{"class":633},[468,1524,637],{"class":478},[468,1526,825],{"class":640},[468,1528,828],{"class":478},[468,1530,1063],{"class":626},[468,1532,1143],{"class":478},[468,1534,1535],{"class":843},"                   \u002F\u002F float samples -> float mesh\n",[468,1537,1538,1540,1543,1545,1547,1549,1551,1553,1555,1557,1560,1562,1564,1566],{"class":470,"line":676},[468,1539,623],{"class":622},[468,1541,1542],{"class":626}," wide64 ",[468,1544,630],{"class":478},[468,1546,634],{"class":633},[468,1548,637],{"class":478},[468,1550,825],{"class":640},[468,1552,644],{"class":478},[468,1554,1164],{"class":633},[468,1556,637],{"class":478},[468,1558,1559],{"class":622},"int64_t",[468,1561,650],{"class":478},[468,1563,1063],{"class":626},[468,1565,1143],{"class":478},[468,1567,1568],{"class":843},"     \u002F\u002F 64-bit face indices\n",[468,1570,1571,1573,1576,1578,1580,1582,1584,1586,1588,1590,1593,1595,1597,1599],{"class":470,"line":717},[468,1572,623],{"class":622},[468,1574,1575],{"class":626}," wide   ",[468,1577,630],{"class":478},[468,1579,634],{"class":633},[468,1581,637],{"class":478},[468,1583,825],{"class":640},[468,1585,644],{"class":478},[468,1587,1234],{"class":622},[468,1589,660],{"class":478},[468,1591,1592],{"class":622}," double",[468,1594,650],{"class":478},[468,1596,1063],{"class":626},[468,1598,1143],{"class":478},[468,1600,1601],{"class":843},"      \u002F\u002F double coordinates\n",[1339,1603,1605],{"id":1604},"axis-count","Axis Count",[452,1607,1608,1609,1612],{},"The axis count is read off the carrier by ",[465,1610,1611],{},"tf::coordinate_dims_v",", never passed. Each entry constrains on what its own operation means:",[488,1614,1615,1624],{},[491,1616,1617],{},[494,1618,1619,1621],{},[497,1620,499],{},[497,1622,1623],{},"Axes",[507,1625,1626,1635,1645,1654,1663],{},[494,1627,1628,1632],{},[512,1629,1630],{},[465,1631,559],{},[512,1633,1634],{},"3 — a level set of a 3D field is a surface",[494,1636,1637,1642],{},[512,1638,1639,1641],{},[465,1640,574],{}," (grid overload)",[512,1643,1644],{},"2 — a level set of a 2D field is a curve",[494,1646,1647,1651],{},[512,1648,1649],{},[465,1650,589],{},[512,1652,1653],{},"3 in, 2 out — a plane through a 3D field",[494,1655,1656,1660],{},[512,1657,1658],{},[465,1659,531],{},[512,1661,1662],{},"3 — a closed surface encloses a 3D solid",[494,1664,1665,1673],{},[512,1666,1667,894,1669,894,1671],{},[465,1668,545],{},[465,1670,516],{},[465,1672,604],{},[512,1674,1675],{},"any",[1339,1677,1679],{"id":1678},"posed-volumes","Posed Volumes",[452,1681,1682],{},"The grid is axis-aligned in its own local space. World placement is a tagged frame, as it is for any form:",[459,1684,1687],{"className":461,"code":1685,"filename":1686,"language":7,"meta":463,"style":463},"auto frame = tf::make_frame(scanner_pose);        \u002F\u002F e.g. a NIfTI affine\nauto posed = vol | tf::tag(frame);\nauto mesh  = tf::make_isosurface(posed);          \u002F\u002F world-space triangles\n","volume_posed.cpp",[465,1688,1689,1715,1743],{"__ignoreMap":463},[468,1690,1691,1693,1696,1698,1700,1702,1705,1707,1710,1712],{"class":470,"line":471},[468,1692,623],{"class":622},[468,1694,1695],{"class":626}," frame ",[468,1697,630],{"class":478},[468,1699,634],{"class":633},[468,1701,637],{"class":478},[468,1703,1704],{"class":640},"make_frame",[468,1706,828],{"class":478},[468,1708,1709],{"class":626},"scanner_pose",[468,1711,1143],{"class":478},[468,1713,1714],{"class":843},"        \u002F\u002F e.g. a NIfTI affine\n",[468,1716,1717,1719,1722,1724,1726,1729,1731,1733,1736,1738,1741],{"class":470,"line":676},[468,1718,623],{"class":622},[468,1720,1721],{"class":626}," posed ",[468,1723,630],{"class":478},[468,1725,1044],{"class":626},[468,1727,1728],{"class":478},"|",[468,1730,634],{"class":633},[468,1732,637],{"class":478},[468,1734,1735],{"class":640},"tag",[468,1737,828],{"class":478},[468,1739,1740],{"class":626},"frame",[468,1742,801],{"class":478},[468,1744,1745,1747,1750,1752,1754,1756,1758,1760,1763,1765],{"class":470,"line":717},[468,1746,623],{"class":622},[468,1748,1749],{"class":626}," mesh  ",[468,1751,630],{"class":478},[468,1753,634],{"class":633},[468,1755,637],{"class":478},[468,1757,825],{"class":640},[468,1759,828],{"class":478},[468,1761,1762],{"class":626},"posed",[468,1764,1143],{"class":478},[468,1766,1767],{"class":843},"          \u002F\u002F world-space triangles\n",[452,1769,1770,1771,1774,1775,1777,1778,1780],{},"The geometry-emitting entries emit through the stated frame, and a reflecting frame (negative determinant) swaps each triangle's corners so the surface stays wound outward. Positional ",[1351,1772,1773],{},"inputs"," — a slice plane's origin and axes — stay in the volume's local space. The exception is ",[465,1776,604],{},": for a posed volume its target ",[465,1779,1098],{}," and grid are world space.",[853,1782,1784],{"id":1783},"signed-distance-fields","Signed Distance Fields",[452,1786,1787],{},"A signed distance field is negative inside the solid, positive outside, and zero on its surface; extracting the isosurface at 0 recovers the shape.",[1339,1789,641],{"id":641},[459,1791,1794],{"className":461,"code":1792,"filename":1793,"language":7,"meta":463,"style":463},"auto ball = tf::make_sphere_sdf\u003Cfloat>({64, 64, 64},\n                                       tf::point\u003Cfloat, 3>{0.1f, 0.1f, 0.1f},\n                                       tf::point\u003Cfloat, 3>{-3.2f, -3.2f, -3.2f},\n                                       tf::point\u003Cfloat, 3>{0.f, 0.f, 0.f}, 1.5f);\n\n\u002F\u002F any axis count — a 2D dims states a disc\nauto disc = tf::make_sphere_sdf\u003Cfloat>(std::array\u003Cint, 2>{64, 64},\n                                       tf::point\u003Cfloat, 2>{0.1f, 0.1f},\n                                       tf::point\u003Cfloat, 2>{-3.2f, -3.2f},\n                                       tf::point\u003Cfloat, 2>{0.f, 0.f}, 1.5f);\n","volume_sphere_sdf.cpp",[465,1795,1796,1833,1868,1908,1946,1950,1955,2005,2035,2069],{"__ignoreMap":463},[468,1797,1798,1800,1803,1805,1807,1809,1811,1813,1815,1817,1819,1821,1823,1825,1827,1829,1831],{"class":470,"line":471},[468,1799,623],{"class":622},[468,1801,1802],{"class":626}," ball ",[468,1804,630],{"class":478},[468,1806,634],{"class":633},[468,1808,637],{"class":478},[468,1810,641],{"class":640},[468,1812,644],{"class":478},[468,1814,647],{"class":622},[468,1816,650],{"class":478},[468,1818,653],{"class":626},[468,1820,657],{"class":656},[468,1822,660],{"class":478},[468,1824,663],{"class":656},[468,1826,660],{"class":478},[468,1828,663],{"class":656},[468,1830,670],{"class":626},[468,1832,673],{"class":478},[468,1834,1835,1838,1840,1842,1844,1846,1848,1850,1852,1854,1856,1858,1860,1862,1864,1866],{"class":470,"line":676},[468,1836,1837],{"class":633},"                                       tf",[468,1839,637],{"class":478},[468,1841,684],{"class":626},[468,1843,644],{"class":478},[468,1845,647],{"class":622},[468,1847,660],{"class":478},[468,1849,693],{"class":656},[468,1851,696],{"class":478},[468,1853,653],{"class":626},[468,1855,701],{"class":656},[468,1857,660],{"class":478},[468,1859,706],{"class":656},[468,1861,660],{"class":478},[468,1863,706],{"class":656},[468,1865,670],{"class":626},[468,1867,673],{"class":478},[468,1869,1870,1872,1874,1876,1878,1880,1882,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902,1904,1906],{"class":470,"line":717},[468,1871,1837],{"class":633},[468,1873,637],{"class":478},[468,1875,684],{"class":626},[468,1877,644],{"class":478},[468,1879,647],{"class":622},[468,1881,660],{"class":478},[468,1883,693],{"class":656},[468,1885,696],{"class":478},[468,1887,653],{"class":626},[468,1889,738],{"class":478},[468,1891,741],{"class":656},[468,1893,660],{"class":478},[468,1895,746],{"class":478},[468,1897,741],{"class":656},[468,1899,660],{"class":478},[468,1901,746],{"class":478},[468,1903,741],{"class":656},[468,1905,670],{"class":626},[468,1907,673],{"class":478},[468,1909,1910,1912,1914,1916,1918,1920,1922,1924,1926,1928,1930,1932,1934,1936,1938,1940,1942,1944],{"class":470,"line":761},[468,1911,1837],{"class":633},[468,1913,637],{"class":478},[468,1915,684],{"class":626},[468,1917,644],{"class":478},[468,1919,647],{"class":622},[468,1921,660],{"class":478},[468,1923,693],{"class":656},[468,1925,696],{"class":478},[468,1927,653],{"class":626},[468,1929,782],{"class":656},[468,1931,660],{"class":478},[468,1933,787],{"class":656},[468,1935,660],{"class":478},[468,1937,787],{"class":656},[468,1939,670],{"class":626},[468,1941,660],{"class":478},[468,1943,798],{"class":656},[468,1945,801],{"class":478},[468,1947,1948],{"class":470,"line":804},[468,1949,808],{"emptyLinePlaceholder":807},[468,1951,1952],{"class":470,"line":811},[468,1953,1954],{"class":843},"\u002F\u002F any axis count — a 2D dims states a disc\n",[468,1956,1957,1959,1962,1964,1966,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988,1991,1993,1995,1997,1999,2001,2003],{"class":470,"line":1076},[468,1958,623],{"class":622},[468,1960,1961],{"class":626}," disc ",[468,1963,630],{"class":478},[468,1965,634],{"class":633},[468,1967,637],{"class":478},[468,1969,641],{"class":640},[468,1971,644],{"class":478},[468,1973,647],{"class":622},[468,1975,650],{"class":478},[468,1977,1164],{"class":633},[468,1979,637],{"class":478},[468,1981,1229],{"class":626},[468,1983,644],{"class":478},[468,1985,1234],{"class":622},[468,1987,660],{"class":478},[468,1989,1990],{"class":656}," 2",[468,1992,696],{"class":478},[468,1994,653],{"class":626},[468,1996,657],{"class":656},[468,1998,660],{"class":478},[468,2000,663],{"class":656},[468,2002,670],{"class":626},[468,2004,673],{"class":478},[468,2006,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025,2027,2029,2031,2033],{"class":470,"line":1091},[468,2008,1837],{"class":633},[468,2010,637],{"class":478},[468,2012,684],{"class":626},[468,2014,644],{"class":478},[468,2016,647],{"class":622},[468,2018,660],{"class":478},[468,2020,1990],{"class":656},[468,2022,696],{"class":478},[468,2024,653],{"class":626},[468,2026,701],{"class":656},[468,2028,660],{"class":478},[468,2030,706],{"class":656},[468,2032,670],{"class":626},[468,2034,673],{"class":478},[468,2036,2037,2039,2041,2043,2045,2047,2049,2051,2053,2055,2057,2059,2061,2063,2065,2067],{"class":470,"line":1106},[468,2038,1837],{"class":633},[468,2040,637],{"class":478},[468,2042,684],{"class":626},[468,2044,644],{"class":478},[468,2046,647],{"class":622},[468,2048,660],{"class":478},[468,2050,1990],{"class":656},[468,2052,696],{"class":478},[468,2054,653],{"class":626},[468,2056,738],{"class":478},[468,2058,741],{"class":656},[468,2060,660],{"class":478},[468,2062,746],{"class":478},[468,2064,741],{"class":656},[468,2066,670],{"class":626},[468,2068,673],{"class":478},[468,2070,2071,2073,2075,2077,2079,2081,2083,2085,2087,2089,2091,2093,2095,2097,2099,2101],{"class":470,"line":1121},[468,2072,1837],{"class":633},[468,2074,637],{"class":478},[468,2076,684],{"class":626},[468,2078,644],{"class":478},[468,2080,647],{"class":622},[468,2082,660],{"class":478},[468,2084,1990],{"class":656},[468,2086,696],{"class":478},[468,2088,653],{"class":626},[468,2090,782],{"class":656},[468,2092,660],{"class":478},[468,2094,787],{"class":656},[468,2096,670],{"class":626},[468,2098,660],{"class":478},[468,2100,798],{"class":656},[468,2102,801],{"class":478},[488,2104,2105,2117],{},[491,2106,2107],{},[494,2108,2109,2112,2114],{},[497,2110,2111],{},"Parameter",[497,2113,865],{},[497,2115,2116],{},"Description",[507,2118,2119,2133,2147,2163,2177],{},[494,2120,2121,2125,2130],{},[512,2122,2123],{},[465,2124,1068],{},[512,2126,2127],{},[465,2128,2129],{},"std::array\u003Cint, Dims>",[512,2131,2132],{},"Number of samples along each axis",[494,2134,2135,2139,2144],{},[512,2136,2137],{},[465,2138,1083],{},[512,2140,2141],{},[465,2142,2143],{},"tf::point\u003CRealType, Dims>",[512,2145,2146],{},"Physical size of one grid step along each axis",[494,2148,2149,2153,2157],{},[512,2150,2151],{},[465,2152,1098],{},[512,2154,2155],{},[465,2156,2143],{},[512,2158,2159,2160],{},"Local-space position of sample ",[465,2161,2162],{},"(0, ..., 0)",[494,2164,2165,2170,2174],{},[512,2166,2167],{},[465,2168,2169],{},"center",[512,2171,2172],{},[465,2173,2143],{},[512,2175,2176],{},"Sphere centre, in the volume's local frame",[494,2178,2179,2184,2188],{},[512,2180,2181],{},[465,2182,2183],{},"radius",[512,2185,2186],{},[465,2187,1480],{},[512,2189,2190],{},"Sphere radius",[452,2192,2193,2195,2196,2199,2200,834],{},[465,2194,1480],{}," is the field's sample and coordinate type, stated at the call. Each sample holds ",[465,2197,2198],{},"distance(point, center) - radius","; the result is a ",[465,2201,2202],{},"tf::volume_buffer\u003CRealType, RealType, Dims>",[1339,2204,2205],{"id":2205},"make_mesh_sdf",[459,2207,2210],{"className":461,"code":2208,"filename":2209,"language":7,"meta":463,"style":463},"auto field = tf::make_mesh_sdf(polygons, {64, 64, 64},\n                               tf::point\u003Cfloat, 3>{0.1f, 0.1f, 0.1f},\n                               tf::point\u003Cfloat, 3>{-3.2f, -3.2f, -3.2f});\n\n\u002F\u002F the banded mode: the band measured, the far field swept\nauto fast = tf::make_mesh_sdf(polygons, {64, 64, 64},\n                              tf::point\u003Cfloat, 3>{0.1f, 0.1f, 0.1f},\n                              tf::point\u003Cfloat, 3>{-3.2f, -3.2f, -3.2f},\n                              tf::mesh_sdf_mode::banded);\n","volume_mesh_sdf.cpp",[465,2211,2212,2249,2284,2324,2328,2333,2370,2405,2445],{"__ignoreMap":463},[468,2213,2214,2216,2218,2220,2222,2224,2226,2228,2231,2233,2235,2237,2239,2241,2243,2245,2247],{"class":470,"line":471},[468,2215,623],{"class":622},[468,2217,627],{"class":626},[468,2219,630],{"class":478},[468,2221,634],{"class":633},[468,2223,637],{"class":478},[468,2225,2205],{"class":640},[468,2227,828],{"class":478},[468,2229,2230],{"class":626},"polygons",[468,2232,660],{"class":478},[468,2234,958],{"class":626},[468,2236,657],{"class":656},[468,2238,660],{"class":478},[468,2240,663],{"class":656},[468,2242,660],{"class":478},[468,2244,663],{"class":656},[468,2246,670],{"class":626},[468,2248,673],{"class":478},[468,2250,2251,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2282],{"class":470,"line":676},[468,2252,2253],{"class":633},"                               tf",[468,2255,637],{"class":478},[468,2257,684],{"class":626},[468,2259,644],{"class":478},[468,2261,647],{"class":622},[468,2263,660],{"class":478},[468,2265,693],{"class":656},[468,2267,696],{"class":478},[468,2269,653],{"class":626},[468,2271,701],{"class":656},[468,2273,660],{"class":478},[468,2275,706],{"class":656},[468,2277,660],{"class":478},[468,2279,706],{"class":656},[468,2281,670],{"class":626},[468,2283,673],{"class":478},[468,2285,2286,2288,2290,2292,2294,2296,2298,2300,2302,2304,2306,2308,2310,2312,2314,2316,2318,2320,2322],{"class":470,"line":717},[468,2287,2253],{"class":633},[468,2289,637],{"class":478},[468,2291,684],{"class":626},[468,2293,644],{"class":478},[468,2295,647],{"class":622},[468,2297,660],{"class":478},[468,2299,693],{"class":656},[468,2301,696],{"class":478},[468,2303,653],{"class":626},[468,2305,738],{"class":478},[468,2307,741],{"class":656},[468,2309,660],{"class":478},[468,2311,746],{"class":478},[468,2313,741],{"class":656},[468,2315,660],{"class":478},[468,2317,746],{"class":478},[468,2319,741],{"class":656},[468,2321,670],{"class":626},[468,2323,801],{"class":478},[468,2325,2326],{"class":470,"line":761},[468,2327,808],{"emptyLinePlaceholder":807},[468,2329,2330],{"class":470,"line":804},[468,2331,2332],{"class":843},"\u002F\u002F the banded mode: the band measured, the far field swept\n",[468,2334,2335,2337,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368],{"class":470,"line":811},[468,2336,623],{"class":622},[468,2338,2339],{"class":626}," fast ",[468,2341,630],{"class":478},[468,2343,634],{"class":633},[468,2345,637],{"class":478},[468,2347,2205],{"class":640},[468,2349,828],{"class":478},[468,2351,2230],{"class":626},[468,2353,660],{"class":478},[468,2355,958],{"class":626},[468,2357,657],{"class":656},[468,2359,660],{"class":478},[468,2361,663],{"class":656},[468,2363,660],{"class":478},[468,2365,663],{"class":656},[468,2367,670],{"class":626},[468,2369,673],{"class":478},[468,2371,2372,2375,2377,2379,2381,2383,2385,2387,2389,2391,2393,2395,2397,2399,2401,2403],{"class":470,"line":1076},[468,2373,2374],{"class":633},"                              tf",[468,2376,637],{"class":478},[468,2378,684],{"class":626},[468,2380,644],{"class":478},[468,2382,647],{"class":622},[468,2384,660],{"class":478},[468,2386,693],{"class":656},[468,2388,696],{"class":478},[468,2390,653],{"class":626},[468,2392,701],{"class":656},[468,2394,660],{"class":478},[468,2396,706],{"class":656},[468,2398,660],{"class":478},[468,2400,706],{"class":656},[468,2402,670],{"class":626},[468,2404,673],{"class":478},[468,2406,2407,2409,2411,2413,2415,2417,2419,2421,2423,2425,2427,2429,2431,2433,2435,2437,2439,2441,2443],{"class":470,"line":1091},[468,2408,2374],{"class":633},[468,2410,637],{"class":478},[468,2412,684],{"class":626},[468,2414,644],{"class":478},[468,2416,647],{"class":622},[468,2418,660],{"class":478},[468,2420,693],{"class":656},[468,2422,696],{"class":478},[468,2424,653],{"class":626},[468,2426,738],{"class":478},[468,2428,741],{"class":656},[468,2430,660],{"class":478},[468,2432,746],{"class":478},[468,2434,741],{"class":656},[468,2436,660],{"class":478},[468,2438,746],{"class":478},[468,2440,741],{"class":656},[468,2442,670],{"class":626},[468,2444,673],{"class":478},[468,2446,2447,2449,2451,2454,2456,2459],{"class":470,"line":1106},[468,2448,2374],{"class":633},[468,2450,637],{"class":478},[468,2452,2453],{"class":633},"mesh_sdf_mode",[468,2455,637],{"class":478},[468,2457,2458],{"class":626},"banded",[468,2460,801],{"class":478},[488,2462,2463,2473],{},[491,2464,2465],{},[494,2466,2467,2469,2471],{},[497,2468,2111],{},[497,2470,865],{},[497,2472,2116],{},[507,2474,2475,2490,2504,2518,2530,2545],{},[494,2476,2477,2481,2484],{},[512,2478,2479],{},[465,2480,1466],{},[512,2482,2483],{},"template argument",[512,2485,2486,2487,2489],{},"The sample and coordinate type of the field. Unstated: the ",[1351,2488,1470],{}," own coordinate type",[494,2491,2492,2496,2501],{},[512,2493,2494],{},[465,2495,2230],{},[512,2497,2498],{},[465,2499,2500],{},"tf::polygons\u003CPolicy>",[512,2502,2503],{},"A closed surface mesh, optionally tagged",[494,2505,2506,2510,2515],{},[512,2507,2508],{},[465,2509,1068],{},[512,2511,2512],{},[465,2513,2514],{},"std::array\u003Cint, 3>",[512,2516,2517],{},"Number of samples along x, y, z",[494,2519,2520,2524,2527],{},[512,2521,2522],{},[465,2523,1083],{},[512,2525,2526],{},"point-like, 3D",[512,2528,2529],{},"Physical size of one voxel step along x, y, z",[494,2531,2532,2536,2538],{},[512,2533,2534],{},[465,2535,1098],{},[512,2537,2526],{},[512,2539,2540,2541,2544],{},"Position of sample ",[465,2542,2543],{},"(0, 0, 0)",", in the mesh's own frame — world space when it is frame-tagged",[494,2546,2547,2552,2557],{},[512,2548,2549],{},[465,2550,2551],{},"config",[512,2553,2554],{},[465,2555,2556],{},"tf::mesh_sdf_config",[512,2558,2559],{},"The magnitude mode; default measures every sample",[452,2561,2562],{},"Each sample takes the distance to the nearest point of the surface, signed by exact crossing parity on the integer lattice: negative inside by winding, so an inverted shell inverts its field and nested shells stay solid inside. A sample landing exactly on the surface gets distance zero, and its sign is decided the same way on every run.",[2564,2565,2567],"warning",{"icon":2566},"i-lucide-alert-triangle",[452,2568,2569,2570,2576],{},"The surface must be closed — an open mesh has no inside, and the parity sign is undefined on one. Repair an open mesh with ",[849,2571,2573],{"href":2572},"\u002Fcpp\u002Fmodules\u002Fcsg#outer-shell",[465,2574,2575],{},"tf::make_outer_shell"," first.",[452,2578,2579,2580,2586],{},"A mesh carrying a ",[849,2581,2583],{"href":2582},"\u002Fcpp\u002Fmodules\u002Fspatial#tftree",[465,2584,2585],{},"tf::tree"," is queried through it; a mesh without one gets a tree built for the call. Tag the mesh when you already have a tree or will call more than once:",[459,2588,2591],{"className":461,"code":2589,"filename":2590,"language":7,"meta":463,"style":463},"tf::aabb_tree\u003Cint, float, 3> tree(polygons, tf::config_tree(4, 4));\nauto form  = polygons | tf::tag(tree);\nauto field = tf::make_mesh_sdf(form, {64, 64, 64},\n                               tf::point\u003Cfloat, 3>{0.1f, 0.1f, 0.1f},\n                               tf::point\u003Cfloat, 3>{-3.2f, -3.2f, -3.2f});\n","volume_mesh_sdf_tagged.cpp",[465,2592,2593,2645,2672,2709,2743],{"__ignoreMap":463},[468,2594,2595,2597,2599,2602,2604,2606,2608,2610,2612,2614,2616,2619,2621,2623,2625,2627,2629,2632,2634,2637,2639,2642],{"class":470,"line":471},[468,2596,923],{"class":633},[468,2598,637],{"class":478},[468,2600,2601],{"class":633},"aabb_tree",[468,2603,644],{"class":478},[468,2605,1234],{"class":622},[468,2607,660],{"class":478},[468,2609,1395],{"class":622},[468,2611,660],{"class":478},[468,2613,693],{"class":656},[468,2615,696],{"class":478},[468,2617,2618],{"class":640}," tree",[468,2620,828],{"class":478},[468,2622,2230],{"class":633},[468,2624,660],{"class":478},[468,2626,634],{"class":633},[468,2628,637],{"class":478},[468,2630,2631],{"class":640},"config_tree",[468,2633,828],{"class":478},[468,2635,2636],{"class":656},"4",[468,2638,660],{"class":478},[468,2640,2641],{"class":656}," 4",[468,2643,2644],{"class":478},"));\n",[468,2646,2647,2649,2652,2654,2657,2659,2661,2663,2665,2667,2670],{"class":470,"line":676},[468,2648,623],{"class":622},[468,2650,2651],{"class":626}," form  ",[468,2653,630],{"class":478},[468,2655,2656],{"class":626}," polygons ",[468,2658,1728],{"class":478},[468,2660,634],{"class":633},[468,2662,637],{"class":478},[468,2664,1735],{"class":640},[468,2666,828],{"class":478},[468,2668,2669],{"class":626},"tree",[468,2671,801],{"class":478},[468,2673,2674,2676,2678,2680,2682,2684,2686,2688,2691,2693,2695,2697,2699,2701,2703,2705,2707],{"class":470,"line":717},[468,2675,623],{"class":622},[468,2677,627],{"class":626},[468,2679,630],{"class":478},[468,2681,634],{"class":633},[468,2683,637],{"class":478},[468,2685,2205],{"class":640},[468,2687,828],{"class":478},[468,2689,2690],{"class":626},"form",[468,2692,660],{"class":478},[468,2694,958],{"class":626},[468,2696,657],{"class":656},[468,2698,660],{"class":478},[468,2700,663],{"class":656},[468,2702,660],{"class":478},[468,2704,663],{"class":656},[468,2706,670],{"class":626},[468,2708,673],{"class":478},[468,2710,2711,2713,2715,2717,2719,2721,2723,2725,2727,2729,2731,2733,2735,2737,2739,2741],{"class":470,"line":761},[468,2712,2253],{"class":633},[468,2714,637],{"class":478},[468,2716,684],{"class":626},[468,2718,644],{"class":478},[468,2720,647],{"class":622},[468,2722,660],{"class":478},[468,2724,693],{"class":656},[468,2726,696],{"class":478},[468,2728,653],{"class":626},[468,2730,701],{"class":656},[468,2732,660],{"class":478},[468,2734,706],{"class":656},[468,2736,660],{"class":478},[468,2738,706],{"class":656},[468,2740,670],{"class":626},[468,2742,673],{"class":478},[468,2744,2745,2747,2749,2751,2753,2755,2757,2759,2761,2763,2765,2767,2769,2771,2773,2775,2777,2779,2781],{"class":470,"line":804},[468,2746,2253],{"class":633},[468,2748,637],{"class":478},[468,2750,684],{"class":626},[468,2752,644],{"class":478},[468,2754,647],{"class":622},[468,2756,660],{"class":478},[468,2758,693],{"class":656},[468,2760,696],{"class":478},[468,2762,653],{"class":626},[468,2764,738],{"class":478},[468,2766,741],{"class":656},[468,2768,660],{"class":478},[468,2770,746],{"class":478},[468,2772,741],{"class":656},[468,2774,660],{"class":478},[468,2776,746],{"class":478},[468,2778,741],{"class":656},[468,2780,670],{"class":626},[468,2782,801],{"class":478},[452,2784,2785,2786,894,2788,2790,2791,2793],{},"The grid samples the mesh in world space when the form carries a frame tag and in its local frame otherwise, so ",[465,2787,1068],{},[465,2789,1083],{}," and ",[465,2792,1098],{}," describe the grid in that same space.",[2795,2796,2798],"h4",{"id":2797},"banded-mode","Banded mode",[452,2800,2801,2803,2804,2807],{},[465,2802,2556],{}," is implicitly constructible from a ",[465,2805,2806],{},"tf::mesh_sdf_mode",", so a call site that only chooses the mode writes it directly.",[488,2809,2810,2823],{},[491,2811,2812],{},[494,2813,2814,2817,2820],{},[497,2815,2816],{},"Field",[497,2818,2819],{},"Default",[497,2821,2822],{},"Meaning",[507,2824,2825,2846],{},[494,2826,2827,2832,2837],{},[512,2828,2829],{},[465,2830,2831],{},"mode",[512,2833,2834],{},[465,2835,2836],{},"tf::mesh_sdf_mode::exact",[512,2838,2839,2842,2843,2845],{},[465,2840,2841],{},"exact"," measures every sample; ",[465,2844,2458],{}," measures a band and sweeps the rest",[494,2847,2848,2853,2858],{},[512,2849,2850],{},[465,2851,2852],{},"band",[512,2854,2855],{},[465,2856,2857],{},"2",[512,2859,2860],{},"Banded only: voxels of exactly measured magnitude on each side of the surface",[459,2862,2865],{"className":461,"code":2863,"filename":2864,"language":7,"meta":463,"style":463},"auto wide = tf::make_mesh_sdf(polygons, {64, 64, 64},\n                              tf::point\u003Cfloat, 3>{0.1f, 0.1f, 0.1f},\n                              tf::point\u003Cfloat, 3>{-3.2f, -3.2f, -3.2f},\n                              tf::mesh_sdf_config{tf::mesh_sdf_mode::banded, 4});\n","volume_mesh_sdf_band.cpp",[465,2866,2867,2904,2938,2978],{"__ignoreMap":463},[468,2868,2869,2871,2874,2876,2878,2880,2882,2884,2886,2888,2890,2892,2894,2896,2898,2900,2902],{"class":470,"line":471},[468,2870,623],{"class":622},[468,2872,2873],{"class":626}," wide ",[468,2875,630],{"class":478},[468,2877,634],{"class":633},[468,2879,637],{"class":478},[468,2881,2205],{"class":640},[468,2883,828],{"class":478},[468,2885,2230],{"class":626},[468,2887,660],{"class":478},[468,2889,958],{"class":626},[468,2891,657],{"class":656},[468,2893,660],{"class":478},[468,2895,663],{"class":656},[468,2897,660],{"class":478},[468,2899,663],{"class":656},[468,2901,670],{"class":626},[468,2903,673],{"class":478},[468,2905,2906,2908,2910,2912,2914,2916,2918,2920,2922,2924,2926,2928,2930,2932,2934,2936],{"class":470,"line":676},[468,2907,2374],{"class":633},[468,2909,637],{"class":478},[468,2911,684],{"class":626},[468,2913,644],{"class":478},[468,2915,647],{"class":622},[468,2917,660],{"class":478},[468,2919,693],{"class":656},[468,2921,696],{"class":478},[468,2923,653],{"class":626},[468,2925,701],{"class":656},[468,2927,660],{"class":478},[468,2929,706],{"class":656},[468,2931,660],{"class":478},[468,2933,706],{"class":656},[468,2935,670],{"class":626},[468,2937,673],{"class":478},[468,2939,2940,2942,2944,2946,2948,2950,2952,2954,2956,2958,2960,2962,2964,2966,2968,2970,2972,2974,2976],{"class":470,"line":717},[468,2941,2374],{"class":633},[468,2943,637],{"class":478},[468,2945,684],{"class":626},[468,2947,644],{"class":478},[468,2949,647],{"class":622},[468,2951,660],{"class":478},[468,2953,693],{"class":656},[468,2955,696],{"class":478},[468,2957,653],{"class":626},[468,2959,738],{"class":478},[468,2961,741],{"class":656},[468,2963,660],{"class":478},[468,2965,746],{"class":478},[468,2967,741],{"class":656},[468,2969,660],{"class":478},[468,2971,746],{"class":478},[468,2973,741],{"class":656},[468,2975,670],{"class":626},[468,2977,673],{"class":478},[468,2979,2980,2982,2984,2987,2989,2991,2993,2995,2997,2999,3001,3003],{"class":470,"line":761},[468,2981,2374],{"class":633},[468,2983,637],{"class":478},[468,2985,2986],{"class":626},"mesh_sdf_config{",[468,2988,923],{"class":633},[468,2990,637],{"class":478},[468,2992,2453],{"class":633},[468,2994,637],{"class":478},[468,2996,2458],{"class":626},[468,2998,660],{"class":478},[468,3000,2641],{"class":656},[468,3002,670],{"class":626},[468,3004,801],{"class":478},[452,3006,3007,3008,3010],{},"Banded mode measures only the samples within ",[465,3009,2852],{}," voxels of the surface and propagates the far field with a seeded distance sweep — an order of magnitude faster at routine grids. The sign is exact everywhere and the magnitude is exact inside the band. Beyond it, on grids whose lines resolve the surface, the 99th percentile of the error is under about one voxel and shrinks with resolution; the deep interior near the medial axis may locally undershoot by a few voxels. A feature no grid line meets is not found when the band is measured, so its neighbourhood takes the swept far field's value instead.",[853,3012,3014],{"id":3013},"isosurface-extraction","Isosurface Extraction",[1339,3016,825],{"id":825},[459,3018,3021],{"className":461,"code":3019,"filename":3020,"language":7,"meta":463,"style":463},"auto mesh   = tf::make_isosurface(vol);                \u002F\u002F the zero level set\nauto offset = tf::make_isosurface(vol, 0.25f);         \u002F\u002F an offset surface\nauto sharp  = tf::make_isosurface(vol, 0.f,\n                                  tf::isosurface_method::dual_contouring);\n","volume_isosurface.cpp",[465,3022,3023,3046,3075,3100],{"__ignoreMap":463},[468,3024,3025,3027,3029,3031,3033,3035,3037,3039,3041,3043],{"class":470,"line":471},[468,3026,623],{"class":622},[468,3028,1518],{"class":626},[468,3030,630],{"class":478},[468,3032,634],{"class":633},[468,3034,637],{"class":478},[468,3036,825],{"class":640},[468,3038,828],{"class":478},[468,3040,1063],{"class":626},[468,3042,1143],{"class":478},[468,3044,3045],{"class":843},"                \u002F\u002F the zero level set\n",[468,3047,3048,3050,3053,3055,3057,3059,3061,3063,3065,3067,3070,3072],{"class":470,"line":676},[468,3049,623],{"class":622},[468,3051,3052],{"class":626}," offset ",[468,3054,630],{"class":478},[468,3056,634],{"class":633},[468,3058,637],{"class":478},[468,3060,825],{"class":640},[468,3062,828],{"class":478},[468,3064,1063],{"class":626},[468,3066,660],{"class":478},[468,3068,3069],{"class":656}," 0.25f",[468,3071,1143],{"class":478},[468,3073,3074],{"class":843},"         \u002F\u002F an offset surface\n",[468,3076,3077,3079,3082,3084,3086,3088,3090,3092,3094,3096,3098],{"class":470,"line":717},[468,3078,623],{"class":622},[468,3080,3081],{"class":626}," sharp  ",[468,3083,630],{"class":478},[468,3085,634],{"class":633},[468,3087,637],{"class":478},[468,3089,825],{"class":640},[468,3091,828],{"class":478},[468,3093,1063],{"class":626},[468,3095,660],{"class":478},[468,3097,787],{"class":656},[468,3099,673],{"class":478},[468,3101,3102,3105,3107,3110,3112,3115],{"class":470,"line":761},[468,3103,3104],{"class":633},"                                  tf",[468,3106,637],{"class":478},[468,3108,3109],{"class":633},"isosurface_method",[468,3111,637],{"class":478},[468,3113,3114],{"class":626},"dual_contouring",[468,3116,801],{"class":478},[488,3118,3119,3129],{},[491,3120,3121],{},[494,3122,3123,3125,3127],{},[497,3124,2111],{},[497,3126,2819],{},[497,3128,2116],{},[507,3130,3131,3143,3158],{},[494,3132,3133,3137,3140],{},[512,3134,3135],{},[465,3136,1063],{},[512,3138,3139],{},"—",[512,3141,3142],{},"The 3D scalar volume",[494,3144,3145,3150,3155],{},[512,3146,3147],{},[465,3148,3149],{},"iso",[512,3151,3152],{},[465,3153,3154],{},"0",[512,3156,3157],{},"The isovalue to extract, in the type the call emits in",[494,3159,3160,3164,3169],{},[512,3161,3162],{},[465,3163,2551],{},[512,3165,3166],{},[465,3167,3168],{},"{flying_edges, refine = true, stabilizer = 0.01}",[512,3170,3171],{},[465,3172,3173],{},"tf::isosurface_config",[452,3175,3176,3177,3182,3183,3186,3187,3190,3191,894,3194,3197],{},"The result is a welded, indexed ",[849,3178,3180],{"href":3179},"\u002Fcpp\u002Fmodules\u002Fcore#polygons-buffer",[465,3181,564],{}," of triangles — no soup, no post-hoc weld. A corner is inside when ",[465,3184,3185],{},"sample \u003C iso",", so a signed distance field (negative inside) yields outward windings. For an SDF a nonzero isovalue is an offset surface: ",[465,3188,3189],{},"+d"," inflates by ",[465,3192,3193],{},"d",[465,3195,3196],{},"-d"," deflates by it.",[488,3199,3200,3212],{},[491,3201,3202],{},[494,3203,3204,3209],{},[497,3205,3206],{},[465,3207,3208],{},"tf::isosurface_method",[497,3210,3211],{},"What it places",[507,3213,3214,3225],{},[494,3215,3216,3222],{},[512,3217,3218,3221],{},[465,3219,3220],{},"flying_edges"," (default)",[512,3223,3224],{},"One vertex per crossing grid edge: the fastest regular output, defined for any scalar field",[494,3226,3227,3231],{},[512,3228,3229],{},[465,3230,3114],{},[512,3232,3233],{},"One vertex per surface component of a cell, fitted to the field's own crossings, so creases and corners survive. Assumes a distance-like field",[452,3235,3236],{},"Dual contouring's output is manifold by construction, including where two contour arcs of one grid face join the same pair of cells. Reach for it on an SDF of a machined or faceted shape, where flying edges rounds every crease off to the grid.",[452,3238,3239,2803,3241,3243],{},[465,3240,3173],{},[465,3242,3208],{},", so a call site that only chooses the method writes it directly:",[488,3245,3246,3256],{},[491,3247,3248],{},[494,3249,3250,3252,3254],{},[497,3251,2816],{},[497,3253,2819],{},[497,3255,2822],{},[507,3257,3258,3272,3287],{},[494,3259,3260,3265,3269],{},[512,3261,3262],{},[465,3263,3264],{},"method",[512,3266,3267],{},[465,3268,3220],{},[512,3270,3271],{},"Which extractor produces the surface",[494,3273,3274,3279,3284],{},[512,3275,3276],{},[465,3277,3278],{},"refine",[512,3280,3281],{},[465,3282,3283],{},"true",[512,3285,3286],{},"Dual contouring only: refit each feature vertex to the planes its neighbourhood's crossings state",[494,3288,3289,3294,3299],{},[512,3290,3291],{},[465,3292,3293],{},"stabilizer",[512,3295,3296],{},[465,3297,3298],{},"0.01",[512,3300,3301],{},"Dual contouring only: the dimensionless pull toward the crossing centroid. Must be finite and nonnegative",[459,3303,3306],{"className":461,"code":3304,"filename":3305,"language":7,"meta":463,"style":463},"tf::isosurface_config config;\nconfig.method = tf::isosurface_method::dual_contouring;\nconfig.refine = false;\nauto mesh = tf::make_isosurface(vol, 0.f, config);\n","volume_config.cpp",[465,3307,3308,3320,3343,3357],{"__ignoreMap":463},[468,3309,3310,3312,3314,3317],{"class":470,"line":471},[468,3311,923],{"class":633},[468,3313,637],{"class":478},[468,3315,3316],{"class":626},"isosurface_config config",[468,3318,3319],{"class":478},";\n",[468,3321,3322,3324,3326,3329,3331,3333,3335,3337,3339,3341],{"class":470,"line":676},[468,3323,2551],{"class":626},[468,3325,834],{"class":478},[468,3327,3328],{"class":626},"method ",[468,3330,630],{"class":478},[468,3332,634],{"class":633},[468,3334,637],{"class":478},[468,3336,3109],{"class":633},[468,3338,637],{"class":478},[468,3340,3114],{"class":626},[468,3342,3319],{"class":478},[468,3344,3345,3347,3349,3352,3354],{"class":470,"line":717},[468,3346,2551],{"class":626},[468,3348,834],{"class":478},[468,3350,3351],{"class":626},"refine ",[468,3353,630],{"class":478},[468,3355,3356],{"class":478}," false;\n",[468,3358,3359,3361,3363,3365,3367,3369,3371,3373,3375,3377,3379,3381,3384],{"class":470,"line":761},[468,3360,623],{"class":622},[468,3362,816],{"class":626},[468,3364,630],{"class":478},[468,3366,634],{"class":633},[468,3368,637],{"class":478},[468,3370,825],{"class":640},[468,3372,828],{"class":478},[468,3374,1063],{"class":626},[468,3376,660],{"class":478},[468,3378,787],{"class":656},[468,3380,660],{"class":478},[468,3382,3383],{"class":626}," config",[468,3385,801],{"class":478},[853,3387,3389],{"id":3388},"boolean-csg-of-fields","Boolean CSG of Fields",[1339,3391,3392],{"id":3392},"make_boolean",[459,3394,3397],{"className":461,"code":3395,"filename":3396,"language":7,"meta":463,"style":463},"auto merged = tf::make_boolean(a.volume(), b.volume(),\n                               tf::volume_boolean_op::union_);\nauto carved = tf::make_boolean(a.volume(), b.volume(),\n                               tf::volume_boolean_op::difference);\nauto surface = tf::make_isosurface(carved.volume());\n","volume_boolean.cpp",[465,3398,3399,3434,3450,3483,3498],{"__ignoreMap":463},[468,3400,3401,3403,3406,3408,3410,3412,3414,3416,3418,3420,3422,3424,3427,3429,3431],{"class":470,"line":471},[468,3402,623],{"class":622},[468,3404,3405],{"class":626}," merged ",[468,3407,630],{"class":478},[468,3409,634],{"class":633},[468,3411,637],{"class":478},[468,3413,3392],{"class":640},[468,3415,828],{"class":478},[468,3417,849],{"class":626},[468,3419,834],{"class":478},[468,3421,837],{"class":640},[468,3423,1221],{"class":478},[468,3425,3426],{"class":626}," b",[468,3428,834],{"class":478},[468,3430,837],{"class":640},[468,3432,3433],{"class":478},"(),\n",[468,3435,3436,3438,3440,3443,3445,3448],{"class":470,"line":676},[468,3437,2253],{"class":633},[468,3439,637],{"class":478},[468,3441,3442],{"class":633},"volume_boolean_op",[468,3444,637],{"class":478},[468,3446,3447],{"class":626},"union_",[468,3449,801],{"class":478},[468,3451,3452,3454,3457,3459,3461,3463,3465,3467,3469,3471,3473,3475,3477,3479,3481],{"class":470,"line":717},[468,3453,623],{"class":622},[468,3455,3456],{"class":626}," carved ",[468,3458,630],{"class":478},[468,3460,634],{"class":633},[468,3462,637],{"class":478},[468,3464,3392],{"class":640},[468,3466,828],{"class":478},[468,3468,849],{"class":626},[468,3470,834],{"class":478},[468,3472,837],{"class":640},[468,3474,1221],{"class":478},[468,3476,3426],{"class":626},[468,3478,834],{"class":478},[468,3480,837],{"class":640},[468,3482,3433],{"class":478},[468,3484,3485,3487,3489,3491,3493,3496],{"class":470,"line":761},[468,3486,2253],{"class":633},[468,3488,637],{"class":478},[468,3490,3442],{"class":633},[468,3492,637],{"class":478},[468,3494,3495],{"class":626},"difference",[468,3497,801],{"class":478},[468,3499,3500,3502,3505,3507,3509,3511,3513,3515,3518,3520,3522],{"class":470,"line":804},[468,3501,623],{"class":622},[468,3503,3504],{"class":626}," surface ",[468,3506,630],{"class":478},[468,3508,634],{"class":633},[468,3510,637],{"class":478},[468,3512,825],{"class":640},[468,3514,828],{"class":478},[468,3516,3517],{"class":626},"carved",[468,3519,834],{"class":478},[468,3521,837],{"class":640},[468,3523,3524],{"class":478},"());\n",[452,3526,3527,3528,3533,3534,3537,3538,834],{},"This is the library's ",[849,3529,3531],{"href":3530},"\u002Fcpp\u002Fmodules\u002Fcsg#boolean-operations",[465,3532,545],{},", distinguished by the carriers it takes: volumes and a ",[465,3535,3536],{},"tf::volume_boolean_op"," rather than meshes and a ",[465,3539,3540],{},"tf::boolean_op",[488,3542,3543,3555],{},[491,3544,3545],{},[494,3546,3547,3550,3553],{},[497,3548,3549],{},"Operation",[497,3551,3552],{},"Combinator",[497,3554,2822],{},[507,3556,3557,3572,3587],{},[494,3558,3559,3564,3569],{},[512,3560,3561],{},[465,3562,3563],{},"tf::volume_boolean_op::union_",[512,3565,3566],{},[465,3567,3568],{},"min(a, b)",[512,3570,3571],{},"A ∪ B — inside either field",[494,3573,3574,3579,3584],{},[512,3575,3576],{},[465,3577,3578],{},"tf::volume_boolean_op::intersection",[512,3580,3581],{},[465,3582,3583],{},"max(a, b)",[512,3585,3586],{},"A ∩ B — inside both",[494,3588,3589,3594,3599],{},[512,3590,3591],{},[465,3592,3593],{},"tf::volume_boolean_op::difference",[512,3595,3596],{},[465,3597,3598],{},"max(a, -b)",[512,3600,3601],{},"A \\ B — inside A, outside B",[452,3603,3604,3605,3608,3609,3612],{},"The combinators are exact on the zero level set, so the extracted isosurface is exactly the boolean of the two solids; away from the surface ",[465,3606,3607],{},"min","\u002F",[465,3610,3611],{},"max"," under- and over-estimate distance, which matters only if you offset the result afterwards.",[452,3614,3615],{},"Both operands must carry the same axis count. Unsigned sample types are refused at compile time — an SDF has a negative inside — as is any non-floating emitted type.",[2795,3617,3619],{"id":3618},"the-shared-grid","The shared grid",[452,3621,3622,3623,3626,3627,3632,3633,3636,3637,3640],{},"The combine happens on one grid. Matching grids (identical dims, spacing and origin) ",[1351,3624,3625],{},"and"," matching poses combine sample-wise with no interpolation. Anything else — a different grid, a different pose — resamples both operands through ",[849,3628,3630],{"href":3629},"#make_resampled_volume",[465,3631,604],{}," onto a common world-axis-aligned grid spanning the union of their ",[1351,3634,3635],{},"world"," domains to within one truncated step, at the finer of the two ",[1351,3638,3639],{},"local"," spacings (a scaling pose does not enter that election), capped so far-apart fine grids cannot exhaust memory. Pose equality is exact matrix equality in the type the call emits in, so poses differing below that type's resolution are one pose.",[452,3642,3643,3644,3647],{},"Out of an operand's domain is ",[1351,3645,3646],{},"outside its solid",": every operand reads the far-outside sentinel past its own box, so no field is continued outward past the grid it was sampled on — a solid that reaches its own domain boundary stops there.",[452,3649,3650,3651,894,3654,894,3657,894,3660,834],{},"An empty operand is the empty set and the algebra answers for it: ",[465,3652,3653],{},"A ∪ ∅ = A",[465,3655,3656],{},"A ∩ ∅ = ∅",[465,3658,3659],{},"A \\ ∅ = A",[465,3661,3662],{},"∅ \\ B = ∅",[2795,3664,3666],{"id":3665},"posed-operands","Posed operands",[452,3668,3669,3670,3673,3674,3676],{},"With any ",[849,3671,1762],{"href":3672},"#posed-volumes"," operand the call returns the field ",[1351,3675,3625],{}," the pose it stands in — the shared pose on the matched path, identity for the world-axis-aligned general result:",[459,3678,3681],{"className":461,"code":3679,"filename":3680,"language":7,"meta":463,"style":463},"auto [merged, pose] = tf::make_boolean(a | tf::tag(pose_a), b | tf::tag(pose_b),\n                                       tf::volume_boolean_op::union_);\n","volume_posed_boolean.cpp",[465,3682,3683,3749],{"__ignoreMap":463},[468,3684,3685,3687,3690,3693,3695,3698,3701,3703,3705,3707,3709,3711,3714,3716,3718,3720,3722,3724,3727,3730,3733,3735,3737,3739,3741,3743,3746],{"class":470,"line":471},[468,3686,623],{"class":622},[468,3688,3689],{"class":478}," [",[468,3691,3692],{"class":626},"merged",[468,3694,660],{"class":478},[468,3696,3697],{"class":626}," pose",[468,3699,3700],{"class":478},"]",[468,3702,1022],{"class":478},[468,3704,634],{"class":633},[468,3706,637],{"class":478},[468,3708,3392],{"class":640},[468,3710,828],{"class":478},[468,3712,3713],{"class":626},"a ",[468,3715,1728],{"class":478},[468,3717,634],{"class":633},[468,3719,637],{"class":478},[468,3721,1735],{"class":640},[468,3723,828],{"class":478},[468,3725,3726],{"class":626},"pose_a",[468,3728,3729],{"class":478},"),",[468,3731,3732],{"class":626}," b ",[468,3734,1728],{"class":478},[468,3736,634],{"class":633},[468,3738,637],{"class":478},[468,3740,1735],{"class":640},[468,3742,828],{"class":478},[468,3744,3745],{"class":626},"pose_b",[468,3747,3748],{"class":478},"),\n",[468,3750,3751,3753,3755,3757,3759,3761],{"class":470,"line":676},[468,3752,1837],{"class":633},[468,3754,637],{"class":478},[468,3756,3442],{"class":633},[468,3758,637],{"class":478},[468,3760,3447],{"class":626},[468,3762,801],{"class":478},[452,3764,3765],{},"Unposed operands return the buffer alone.",[853,3767,3769],{"id":3768},"slicing-and-resampling","Slicing and Resampling",[1339,3771,3772],{"id":3772},"make_volume_slice",[459,3774,3777],{"className":461,"code":3775,"filename":3776,"language":7,"meta":463,"style":463},"auto slice = tf::make_volume_slice(vol, tf::point\u003Cfloat, 3>{-3.2f, -3.2f, 0.f},\n                                   tf::point\u003Cfloat, 3>{1.f, 0.f, 0.f},\n                                   tf::point\u003Cfloat, 3>{0.f, 1.f, 0.f},\n                                   {256, 256}, {0.025f, 0.025f});\n\nauto flat = tf::make_isocontours(slice.volume(), 0.f);   \u002F\u002F in the slice's 2D frame\n","volume_slice.cpp",[465,3778,3779,3836,3872,3907,3938,3942],{"__ignoreMap":463},[468,3780,3781,3783,3786,3788,3790,3792,3794,3796,3798,3800,3802,3804,3806,3808,3810,3812,3814,3816,3818,3820,3822,3824,3826,3828,3830,3832,3834],{"class":470,"line":471},[468,3782,623],{"class":622},[468,3784,3785],{"class":626}," slice ",[468,3787,630],{"class":478},[468,3789,634],{"class":633},[468,3791,637],{"class":478},[468,3793,3772],{"class":640},[468,3795,828],{"class":478},[468,3797,1063],{"class":626},[468,3799,660],{"class":478},[468,3801,634],{"class":633},[468,3803,637],{"class":478},[468,3805,684],{"class":626},[468,3807,644],{"class":478},[468,3809,647],{"class":622},[468,3811,660],{"class":478},[468,3813,693],{"class":656},[468,3815,696],{"class":478},[468,3817,653],{"class":626},[468,3819,738],{"class":478},[468,3821,741],{"class":656},[468,3823,660],{"class":478},[468,3825,746],{"class":478},[468,3827,741],{"class":656},[468,3829,660],{"class":478},[468,3831,787],{"class":656},[468,3833,670],{"class":626},[468,3835,673],{"class":478},[468,3837,3838,3841,3843,3845,3847,3849,3851,3853,3855,3857,3860,3862,3864,3866,3868,3870],{"class":470,"line":676},[468,3839,3840],{"class":633},"                                   tf",[468,3842,637],{"class":478},[468,3844,684],{"class":626},[468,3846,644],{"class":478},[468,3848,647],{"class":622},[468,3850,660],{"class":478},[468,3852,693],{"class":656},[468,3854,696],{"class":478},[468,3856,653],{"class":626},[468,3858,3859],{"class":656},"1.f",[468,3861,660],{"class":478},[468,3863,787],{"class":656},[468,3865,660],{"class":478},[468,3867,787],{"class":656},[468,3869,670],{"class":626},[468,3871,673],{"class":478},[468,3873,3874,3876,3878,3880,3882,3884,3886,3888,3890,3892,3894,3896,3899,3901,3903,3905],{"class":470,"line":717},[468,3875,3840],{"class":633},[468,3877,637],{"class":478},[468,3879,684],{"class":626},[468,3881,644],{"class":478},[468,3883,647],{"class":622},[468,3885,660],{"class":478},[468,3887,693],{"class":656},[468,3889,696],{"class":478},[468,3891,653],{"class":626},[468,3893,782],{"class":656},[468,3895,660],{"class":478},[468,3897,3898],{"class":656}," 1.f",[468,3900,660],{"class":478},[468,3902,787],{"class":656},[468,3904,670],{"class":626},[468,3906,673],{"class":478},[468,3908,3909,3912,3915,3917,3920,3922,3924,3926,3929,3931,3934,3936],{"class":470,"line":761},[468,3910,3911],{"class":626},"                                   {",[468,3913,3914],{"class":656},"256",[468,3916,660],{"class":478},[468,3918,3919],{"class":656}," 256",[468,3921,670],{"class":626},[468,3923,660],{"class":478},[468,3925,958],{"class":626},[468,3927,3928],{"class":656},"0.025f",[468,3930,660],{"class":478},[468,3932,3933],{"class":656}," 0.025f",[468,3935,670],{"class":626},[468,3937,801],{"class":478},[468,3939,3940],{"class":470,"line":804},[468,3941,808],{"emptyLinePlaceholder":807},[468,3943,3944,3946,3949,3951,3953,3955,3958,3960,3963,3965,3967,3969,3971,3973],{"class":470,"line":811},[468,3945,623],{"class":622},[468,3947,3948],{"class":626}," flat ",[468,3950,630],{"class":478},[468,3952,634],{"class":633},[468,3954,637],{"class":478},[468,3956,3957],{"class":640},"make_isocontours",[468,3959,828],{"class":478},[468,3961,3962],{"class":626},"slice",[468,3964,834],{"class":478},[468,3966,837],{"class":640},[468,3968,1221],{"class":478},[468,3970,787],{"class":656},[468,3972,1143],{"class":478},[468,3974,3975],{"class":843},"   \u002F\u002F in the slice's 2D frame\n",[488,3977,3978,3988],{},[491,3979,3980],{},[494,3981,3982,3984,3986],{},[497,3983,2111],{},[497,3985,865],{},[497,3987,2116],{},[507,3989,3990,4002,4017,4032,4047],{},[494,3991,3992,3996,4000],{},[512,3993,3994],{},[465,3995,1063],{},[512,3997,3998],{},[465,3999,905],{},[512,4001,3142],{},[494,4003,4004,4009,4011],{},[512,4005,4006],{},[465,4007,4008],{},"plane_origin",[512,4010,2526],{},[512,4012,4013,4014],{},"Local-space position of slice grid node ",[465,4015,4016],{},"(0, 0)",[494,4018,4019,4027,4029],{},[512,4020,4021,894,4024],{},[465,4022,4023],{},"u",[465,4025,4026],{},"v",[512,4028,2526],{},[512,4030,4031],{},"Unit directions of the slice grid's i and j axes",[494,4033,4034,4039,4044],{},[512,4035,4036],{},[465,4037,4038],{},"dims2",[512,4040,4041],{},[465,4042,4043],{},"std::array\u003Cint, 2>",[512,4045,4046],{},"Number of slice grid nodes along u and v",[494,4048,4049,4054,4059],{},[512,4050,4051],{},[465,4052,4053],{},"spacing2",[512,4055,4056],{},[465,4057,4058],{},"std::array\u003CReal, 2>",[512,4060,4061],{},"Slice grid step along u and v, in the type the call emits in",[452,4063,4064,4065,4068,4069,4072,4073,4075,4076,894,4078,4080],{},"The slice of a volume is a volume one dimension down, and that is what comes back. Node ",[465,4066,4067],{},"(i, j)"," samples the volume at ",[465,4070,4071],{},"plane_origin + i * spacing2[0] * u + j * spacing2[1] * v",", so the slice's own 2D frame has its origin at ",[465,4074,4016],{}," and axes ",[465,4077,4023],{},[465,4079,4026],{},". The plane is stated in the volume's local space; a tagged frame does not move it.",[452,4082,4083],{},"Nodes outside the volume's box receive a sentinel above the field's maximum rather than a clamped boundary sample, so contours extracted from the slice terminate cleanly at the volume boundary.",[1339,4085,4086],{"id":4086},"make_resampled_volume",[459,4088,4091],{"className":461,"code":4089,"filename":4090,"language":7,"meta":463,"style":463},"auto coarse = tf::make_resampled_volume(field.volume(), {32, 32, 32},\n                                        tf::point\u003Cfloat, 3>{0.5f, 0.5f, 0.5f},\n                                        tf::point\u003Cfloat, 3>{-3.2f, -3.2f, -3.2f});\n","volume_resample.cpp",[465,4092,4093,4136,4171],{"__ignoreMap":463},[468,4094,4095,4097,4100,4102,4104,4106,4108,4110,4112,4114,4116,4118,4120,4123,4125,4128,4130,4132,4134],{"class":470,"line":471},[468,4096,623],{"class":622},[468,4098,4099],{"class":626}," coarse ",[468,4101,630],{"class":478},[468,4103,634],{"class":633},[468,4105,637],{"class":478},[468,4107,4086],{"class":640},[468,4109,828],{"class":478},[468,4111,831],{"class":626},[468,4113,834],{"class":478},[468,4115,837],{"class":640},[468,4117,1221],{"class":478},[468,4119,958],{"class":626},[468,4121,4122],{"class":656},"32",[468,4124,660],{"class":478},[468,4126,4127],{"class":656}," 32",[468,4129,660],{"class":478},[468,4131,4127],{"class":656},[468,4133,670],{"class":626},[468,4135,673],{"class":478},[468,4137,4138,4140,4142,4144,4146,4148,4150,4152,4154,4156,4158,4160,4163,4165,4167,4169],{"class":470,"line":676},[468,4139,679],{"class":633},[468,4141,637],{"class":478},[468,4143,684],{"class":626},[468,4145,644],{"class":478},[468,4147,647],{"class":622},[468,4149,660],{"class":478},[468,4151,693],{"class":656},[468,4153,696],{"class":478},[468,4155,653],{"class":626},[468,4157,1027],{"class":656},[468,4159,660],{"class":478},[468,4161,4162],{"class":656}," 0.5f",[468,4164,660],{"class":478},[468,4166,4162],{"class":656},[468,4168,670],{"class":626},[468,4170,673],{"class":478},[468,4172,4173,4175,4177,4179,4181,4183,4185,4187,4189,4191,4193,4195,4197,4199,4201,4203,4205,4207,4209],{"class":470,"line":717},[468,4174,679],{"class":633},[468,4176,637],{"class":478},[468,4178,684],{"class":626},[468,4180,644],{"class":478},[468,4182,647],{"class":622},[468,4184,660],{"class":478},[468,4186,693],{"class":656},[468,4188,696],{"class":478},[468,4190,653],{"class":626},[468,4192,738],{"class":478},[468,4194,741],{"class":656},[468,4196,660],{"class":478},[468,4198,746],{"class":478},[468,4200,741],{"class":656},[468,4202,660],{"class":478},[468,4204,746],{"class":478},[468,4206,741],{"class":656},[468,4208,670],{"class":626},[468,4210,801],{"class":478},[452,4212,4213,4214,4217,4218,4220,4221,4224],{},"Each target node at ",[465,4215,4216],{},"origin + index * spacing"," takes the field's multilinear value. An untagged volume regrids in its own local space, clamped at the edge. A ",[849,4219,1762],{"href":3672}," volume regrids ",[1351,4222,4223],{},"through"," its frame: the target grid is world space, each node maps back through the frame's inverse into the field's local space, and nodes outside the posed domain take a sentinel above the field's maximum. The result stands on the grid that was asked for and carries no pose of its own.",[452,4226,4227,4228,4233],{},"Two reads, two contracts — and ",[849,4229,4231],{"href":4230},"#make_boolean",[465,4232,545],{}," always takes the posed one: an untagged operand is tagged with an identity frame before it is resampled, so every operand reads the far-outside sentinel past its own box instead of clamping. That is what makes out-of-domain mean outside the solid.",[853,4235,4237],{"id":4236},"isocontours","Isocontours",[1339,4239,4241],{"id":4240},"make_isocontours-2d-grid","make_isocontours (2D grid)",[459,4243,4246],{"className":461,"code":4244,"filename":4245,"language":7,"meta":463,"style":463},"auto rings = tf::make_isocontours(disc.volume(), 0.f);\n\nstd::array\u003Cfloat, 3> levels{-0.25f, 0.f, 0.25f};\nauto many = tf::make_isocontours(disc.volume(), tf::make_range(levels));\n","volume_isocontours_2d.cpp",[465,4247,4248,4278,4282,4320],{"__ignoreMap":463},[468,4249,4250,4252,4255,4257,4259,4261,4263,4265,4268,4270,4272,4274,4276],{"class":470,"line":471},[468,4251,623],{"class":622},[468,4253,4254],{"class":626}," rings ",[468,4256,630],{"class":478},[468,4258,634],{"class":633},[468,4260,637],{"class":478},[468,4262,3957],{"class":640},[468,4264,828],{"class":478},[468,4266,4267],{"class":626},"disc",[468,4269,834],{"class":478},[468,4271,837],{"class":640},[468,4273,1221],{"class":478},[468,4275,787],{"class":656},[468,4277,801],{"class":478},[468,4279,4280],{"class":470,"line":676},[468,4281,808],{"emptyLinePlaceholder":807},[468,4283,4284,4286,4288,4290,4292,4294,4296,4298,4300,4303,4306,4309,4311,4313,4315,4317],{"class":470,"line":717},[468,4285,1164],{"class":633},[468,4287,637],{"class":478},[468,4289,1229],{"class":633},[468,4291,644],{"class":478},[468,4293,647],{"class":622},[468,4295,660],{"class":478},[468,4297,693],{"class":656},[468,4299,696],{"class":478},[468,4301,4302],{"class":626}," levels",[468,4304,4305],{"class":478},"{-",[468,4307,4308],{"class":656},"0.25f",[468,4310,660],{"class":478},[468,4312,787],{"class":656},[468,4314,660],{"class":478},[468,4316,3069],{"class":656},[468,4318,4319],{"class":478},"};\n",[468,4321,4322,4324,4327,4329,4331,4333,4335,4337,4339,4341,4343,4345,4347,4349,4352,4354,4357],{"class":470,"line":761},[468,4323,623],{"class":622},[468,4325,4326],{"class":626}," many ",[468,4328,630],{"class":478},[468,4330,634],{"class":633},[468,4332,637],{"class":478},[468,4334,3957],{"class":640},[468,4336,828],{"class":478},[468,4338,4267],{"class":626},[468,4340,834],{"class":478},[468,4342,837],{"class":640},[468,4344,1221],{"class":478},[468,4346,634],{"class":633},[468,4348,637],{"class":478},[468,4350,4351],{"class":640},"make_range",[468,4353,828],{"class":478},[468,4355,4356],{"class":626},"levels",[468,4358,2644],{"class":478},[452,4360,4361,4362,4367],{},"The level set of a 2D volume's bilinear field, connected into polylines — the same product ",[849,4363,4365],{"href":4364},"\u002Fcpp\u002Fmodules\u002Fiso#isocontours",[465,4366,574],{}," yields for a scalar field on a mesh, one dimension down. A single isovalue or a range of them.",[1339,4369,4371],{"id":4370},"make_isocontours-slice-plane","make_isocontours (slice plane)",[459,4373,4376],{"className":461,"code":4374,"filename":4375,"language":7,"meta":463,"style":463},"std::array\u003Cfloat, 3> levels{-0.25f, 0.f, 0.25f};\nauto curves = tf::make_isocontours(vol,\n                                   tf::point\u003Cfloat, 3>{-3.2f, -3.2f, 0.f},\n                                   tf::point\u003Cfloat, 3>{1.f, 0.f, 0.f},\n                                   tf::point\u003Cfloat, 3>{0.f, 1.f, 0.f},\n                                   {256, 256}, {0.025f, 0.025f},\n                                   tf::make_range(levels));\n","volume_slice_contours.cpp",[465,4377,4378,4412,4433,4471,4505,4539,4565],{"__ignoreMap":463},[468,4379,4380,4382,4384,4386,4388,4390,4392,4394,4396,4398,4400,4402,4404,4406,4408,4410],{"class":470,"line":471},[468,4381,1164],{"class":633},[468,4383,637],{"class":478},[468,4385,1229],{"class":633},[468,4387,644],{"class":478},[468,4389,647],{"class":622},[468,4391,660],{"class":478},[468,4393,693],{"class":656},[468,4395,696],{"class":478},[468,4397,4302],{"class":626},[468,4399,4305],{"class":478},[468,4401,4308],{"class":656},[468,4403,660],{"class":478},[468,4405,787],{"class":656},[468,4407,660],{"class":478},[468,4409,3069],{"class":656},[468,4411,4319],{"class":478},[468,4413,4414,4416,4419,4421,4423,4425,4427,4429,4431],{"class":470,"line":676},[468,4415,623],{"class":622},[468,4417,4418],{"class":626}," curves ",[468,4420,630],{"class":478},[468,4422,634],{"class":633},[468,4424,637],{"class":478},[468,4426,3957],{"class":640},[468,4428,828],{"class":478},[468,4430,1063],{"class":626},[468,4432,673],{"class":478},[468,4434,4435,4437,4439,4441,4443,4445,4447,4449,4451,4453,4455,4457,4459,4461,4463,4465,4467,4469],{"class":470,"line":717},[468,4436,3840],{"class":633},[468,4438,637],{"class":478},[468,4440,684],{"class":626},[468,4442,644],{"class":478},[468,4444,647],{"class":622},[468,4446,660],{"class":478},[468,4448,693],{"class":656},[468,4450,696],{"class":478},[468,4452,653],{"class":626},[468,4454,738],{"class":478},[468,4456,741],{"class":656},[468,4458,660],{"class":478},[468,4460,746],{"class":478},[468,4462,741],{"class":656},[468,4464,660],{"class":478},[468,4466,787],{"class":656},[468,4468,670],{"class":626},[468,4470,673],{"class":478},[468,4472,4473,4475,4477,4479,4481,4483,4485,4487,4489,4491,4493,4495,4497,4499,4501,4503],{"class":470,"line":761},[468,4474,3840],{"class":633},[468,4476,637],{"class":478},[468,4478,684],{"class":626},[468,4480,644],{"class":478},[468,4482,647],{"class":622},[468,4484,660],{"class":478},[468,4486,693],{"class":656},[468,4488,696],{"class":478},[468,4490,653],{"class":626},[468,4492,3859],{"class":656},[468,4494,660],{"class":478},[468,4496,787],{"class":656},[468,4498,660],{"class":478},[468,4500,787],{"class":656},[468,4502,670],{"class":626},[468,4504,673],{"class":478},[468,4506,4507,4509,4511,4513,4515,4517,4519,4521,4523,4525,4527,4529,4531,4533,4535,4537],{"class":470,"line":804},[468,4508,3840],{"class":633},[468,4510,637],{"class":478},[468,4512,684],{"class":626},[468,4514,644],{"class":478},[468,4516,647],{"class":622},[468,4518,660],{"class":478},[468,4520,693],{"class":656},[468,4522,696],{"class":478},[468,4524,653],{"class":626},[468,4526,782],{"class":656},[468,4528,660],{"class":478},[468,4530,3898],{"class":656},[468,4532,660],{"class":478},[468,4534,787],{"class":656},[468,4536,670],{"class":626},[468,4538,673],{"class":478},[468,4540,4541,4543,4545,4547,4549,4551,4553,4555,4557,4559,4561,4563],{"class":470,"line":811},[468,4542,3911],{"class":626},[468,4544,3914],{"class":656},[468,4546,660],{"class":478},[468,4548,3919],{"class":656},[468,4550,670],{"class":626},[468,4552,660],{"class":478},[468,4554,958],{"class":626},[468,4556,3928],{"class":656},[468,4558,660],{"class":478},[468,4560,3933],{"class":656},[468,4562,670],{"class":626},[468,4564,673],{"class":478},[468,4566,4567,4569,4571,4573,4575,4577],{"class":470,"line":1076},[468,4568,3840],{"class":633},[468,4570,637],{"class":478},[468,4572,4351],{"class":640},[468,4574,828],{"class":478},[468,4576,4356],{"class":626},[468,4578,2644],{"class":478},[452,4580,4581,4582,4584],{},"The slice-then-contour composition, with every contour point lifted into world space for a posed volume and into the volume's local frame otherwise. Take ",[465,4583,589],{}," plus the 2D overload instead when you want the curves in the slice's own 2D frame.",[452,4586,4587,4588,4590],{},"The grid and its step are numbers in the type the call emits in, so a braced pair is what both entries take. The plane's origin and axes are geometry and accept any point form — a ",[465,4589,1484],{}," of either width, or a view into a mesh's points — which is why those are spelled out.",[452,4592,4593,4594,4599],{},"Both overloads return a ",[849,4595,4597],{"href":4596},"\u002Fcpp\u002Fmodules\u002Fcore#curves-buffer",[465,4598,579],{}," of connected polylines; a closed contour repeats its first index last. The crossings are welded, so the connection is topological rather than a coordinate search.",[853,4601,4603],{"id":4602},"reading-and-writing-volumes","Reading and Writing Volumes",[452,4605,4606,2790,4609,4612,4613,4616,4617,4620,4621,4624],{},[465,4607,4608],{},"tf::read_nifti",[465,4610,4611],{},"tf::write_nifti"," move volumes through NIfTI-1 as ",[465,4614,4615],{},".nii"," or ",[465,4618,4619],{},".nii.gz",", the compression decided by the path's extension. See ",[849,4622,96],{"href":4623},"\u002Fcpp\u002Fmodules\u002Fio#nifti-volumes"," for the full contract.",[459,4626,4629],{"className":461,"code":4627,"filename":4628,"language":7,"meta":463,"style":463},"auto ct = tf::read_nifti\u003Cstd::int16_t>(\"scan.nii.gz\");\nif (ct) {\n  auto surface = ct.posed\n                     ? tf::make_isosurface(\n                           ct.volume.volume() | tf::tag(ct.frame), 300.f)\n                     : tf::make_isosurface(ct.volume.volume(), 300.f);\n}\n","volume_nifti.cpp",[465,4630,4631,4667,4683,4700,4714,4755,4784],{"__ignoreMap":463},[468,4632,4633,4635,4638,4640,4642,4644,4647,4649,4651,4653,4655,4657,4660,4663,4665],{"class":470,"line":471},[468,4634,623],{"class":622},[468,4636,4637],{"class":626}," ct ",[468,4639,630],{"class":478},[468,4641,634],{"class":633},[468,4643,637],{"class":478},[468,4645,4646],{"class":640},"read_nifti",[468,4648,644],{"class":478},[468,4650,1164],{"class":633},[468,4652,637],{"class":478},[468,4654,1390],{"class":622},[468,4656,650],{"class":478},[468,4658,4659],{"class":478},"\"",[468,4661,4662],{"class":482},"scan.nii.gz",[468,4664,4659],{"class":478},[468,4666,801],{"class":478},[468,4668,4669,4672,4675,4678,4680],{"class":470,"line":676},[468,4670,4671],{"class":474},"if",[468,4673,4674],{"class":478}," (",[468,4676,4677],{"class":626},"ct",[468,4679,1019],{"class":478},[468,4681,4682],{"class":478}," {\n",[468,4684,4685,4688,4691,4693,4695,4697],{"class":470,"line":717},[468,4686,4687],{"class":622},"  auto",[468,4689,4690],{"class":626}," surface",[468,4692,1022],{"class":478},[468,4694,1400],{"class":626},[468,4696,834],{"class":478},[468,4698,4699],{"class":626},"posed\n",[468,4701,4702,4705,4707,4709,4711],{"class":470,"line":761},[468,4703,4704],{"class":478},"                     ?",[468,4706,634],{"class":633},[468,4708,637],{"class":478},[468,4710,825],{"class":640},[468,4712,4713],{"class":478},"(\n",[468,4715,4716,4719,4721,4723,4725,4727,4730,4733,4735,4737,4739,4741,4743,4745,4747,4749,4752],{"class":470,"line":804},[468,4717,4718],{"class":626},"                           ct",[468,4720,834],{"class":478},[468,4722,837],{"class":626},[468,4724,834],{"class":478},[468,4726,837],{"class":640},[468,4728,4729],{"class":478},"()",[468,4731,4732],{"class":478}," |",[468,4734,634],{"class":633},[468,4736,637],{"class":478},[468,4738,1735],{"class":640},[468,4740,828],{"class":478},[468,4742,4677],{"class":626},[468,4744,834],{"class":478},[468,4746,1740],{"class":626},[468,4748,3729],{"class":478},[468,4750,4751],{"class":656}," 300.f",[468,4753,4754],{"class":478},")\n",[468,4756,4757,4760,4762,4764,4766,4768,4770,4772,4774,4776,4778,4780,4782],{"class":470,"line":811},[468,4758,4759],{"class":478},"                     :",[468,4761,634],{"class":633},[468,4763,637],{"class":478},[468,4765,825],{"class":640},[468,4767,828],{"class":478},[468,4769,4677],{"class":626},[468,4771,834],{"class":478},[468,4773,837],{"class":626},[468,4775,834],{"class":478},[468,4777,837],{"class":640},[468,4779,1221],{"class":478},[468,4781,4751],{"class":656},[468,4783,801],{"class":478},[468,4785,4786],{"class":470,"line":1076},[468,4787,4788],{"class":478},"}\n",[452,4790,4791,4792,4794,4795,4797,4798,4800],{},"A file holds one sampled function with one placement, and the read splits it: spacing and any axis-aligned translation land on the grid — in the file's stated spatial unit, unconverted — while an orientation the axis-aligned grid cannot absorb comes back as a ",[465,4793,1740],{}," to tag with, ",[465,4796,1762],{}," set. A frame tag transforms per point, so consume the volume bare when ",[465,4799,1762],{}," is false.",[853,4802,4804],{"id":4803},"relationship-to-iso-and-csg","Relationship to Iso and CSG",[488,4806,4807,4823],{},[491,4808,4809],{},[494,4810,4811,4813,4815,4819],{},[497,4812],{},[497,4814,101],{},[497,4816,4817],{},[849,4818,77],{"href":78},[497,4820,4821],{},[849,4822,82],{"href":83},[507,4824,4825,4838,4852,4869],{},[494,4826,4827,4830,4833,4836],{},[512,4828,4829],{},"Field lives on",[512,4831,4832],{},"a regular grid",[512,4834,4835],{},"a mesh's vertices",[512,4837,3139],{},[494,4839,4840,4843,4848,4850],{},[512,4841,4842],{},"Level set of a 3D field",[512,4844,4845,4847],{},[465,4846,559],{}," → triangle mesh",[512,4849,3139],{},[512,4851,3139],{},[494,4853,4854,4857,4862,4867],{},[512,4855,4856],{},"Level set of a 2D field",[512,4858,4859,4861],{},[465,4860,574],{}," → 2D curves",[512,4863,4864,4866],{},[465,4865,574],{}," → 3D curves on the mesh",[512,4868,3139],{},[494,4870,4871,4874,4877,4879],{},[512,4872,4873],{},"Booleans",[512,4875,4876],{},"sample-wise on fields, resolution-bound",[512,4878,3139],{},[512,4880,4881],{},"exact on meshes, resolution-free",[452,4883,4884,4885,4887],{},"The two ",[465,4886,574],{}," families are the same operation on different carriers: a scalar field's level set, connected into polylines. The Volume module's overloads take a grid; the Iso module's take a mesh plus per-vertex scalars.",[4889,4890,4891],"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 .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 .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 .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}",{"title":463,"searchDepth":471,"depth":676,"links":4893},[4894,4899,4903,4906,4909,4913,4917,4918],{"id":855,"depth":676,"text":856,"children":4895},[4896,4897,4898],{"id":1341,"depth":717,"text":1342},{"id":1604,"depth":717,"text":1605},{"id":1678,"depth":717,"text":1679},{"id":1783,"depth":676,"text":1784,"children":4900},[4901,4902],{"id":641,"depth":717,"text":641},{"id":2205,"depth":717,"text":2205},{"id":3013,"depth":676,"text":3014,"children":4904},[4905],{"id":825,"depth":717,"text":825},{"id":3388,"depth":676,"text":3389,"children":4907},[4908],{"id":3392,"depth":717,"text":3392},{"id":3768,"depth":676,"text":3769,"children":4910},[4911,4912],{"id":3772,"depth":717,"text":3772},{"id":4086,"depth":717,"text":4086},{"id":4236,"depth":676,"text":4237,"children":4914},[4915,4916],{"id":4240,"depth":717,"text":4241},{"id":4370,"depth":717,"text":4371},{"id":4602,"depth":676,"text":4603},{"id":4803,"depth":676,"text":4804},"Dense scalar grids — signed distance fields, boolean CSG, slicing, and isosurface extraction.","md",null,{},{"icon":104},{"title":101,"description":4919},{"loc":102},"wh7VZghdPnBW3-5yFLU5tLYWkiXy1kJJrhsgnE1cJIs",[4928,4930],{"title":96,"path":97,"stem":98,"description":4929,"icon":99,"children":-1},"File I\u002FO operations for reading and writing mesh data.",{"title":106,"path":107,"stem":108,"description":4931,"icon":109,"children":-1},"Performance comparisons against MeshLib, VTK, CGAL, libigl, Coal, FCL, and nanoflann.",1789502616846]