Repository: cdbrauer/VoxelFuse (language: python)

Issue:
Update documentation
Generate updated package documentation
- Documentation generated using [pdoc][1]
- Pull request auto-generated by [create-pull-request][2]

[1]: https://pdoc3.github.io/pdoc/
[2]: https://github.com/peter-evans/create-pull-request


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/generate-docs.yml b/.github/workflows/generate-docs.yml
new file mode 100644
index 0000000..e32aecc
--- /dev/null
+++ b/.github/workflows/generate-docs.yml
@@ -0,0 +1,55 @@
+name: Generate Documentation
+
+# Trigger the workflow on push events for the master branch
+on:  
+  push:
+    branches: [ master ]
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      # Set up Python build environment
+      - run: python3 -m pip install --upgrade wheel
+      - run: python3 -m pip install --upgrade setuptools
+      - run: python3 -m pip install --upgrade pip
+
+      # Install pdoc with reST tag support
+      - run: git clone -b reST_style_docstrings_support https://github.com/muecelee/pdoc.git
+      - run: python3 -m pip install pdoc/.
+      - run: rm -r pdoc
+
+      # Verify python packages installed properly
+      - run: python3 -m pip list
+
+      # Add python packages directory to PATH
+      - run: echo "$HOME/.local/bin" >> $GITHUB_PATH
+
+      # Check-out repository
+      - uses: actions/checkout@v2
+      - run: ls
+      - run: python3 -m pip install -r requirements.txt
+
+      # Generate documentation for each package
+      - run: pdoc --html -o docs -f voxelfuse
+      - run: pdoc --html -o docs -f voxelfuse_examples
+
+      # Create a pull request for updated documentation
+      - name: Create Pull Request
+        uses: peter-evans/create-pull-request@v3
+        with:
+          commit-message: Update documentation
+          branch: documentation-updates
+          delete-branch: true
+          title: 'Update documentation'
+          body: |
+            Generate updated package documentation
+
+            - Documentation generated using [pdoc][1] from [this][2] fork
+            - Pull request auto-generated by [create-pull-request][3]
+
+            [1]: https://pdoc3.github.io/pdoc/
+            [2]: https://github.com/muecelee/pdoc/tree/reST_style_docstrings_support
+            [3]: https://github.com/peter-evans/create-pull-request
+          labels: documentation
+          
diff --git a/docs/voxelfuse/gcode_tools.html b/docs/voxelfuse/gcode_tools.html
index a482165..e21a3f2 100644
--- a/docs/voxelfuse/gcode_tools.html
+++ b/docs/voxelfuse/gcode_tools.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse.gcode_tools API documentation</title>
 <meta name="description" content="Functions for manipulating gcode files …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -140,14 +142,16 @@ <h2 class="section-title" id="header-functions">Functions</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Export a list of strings to a gcode file.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name with extension</dd>
+<dd><p>File name with extension</p></dd>
 <dt><strong><code>lines</code></strong></dt>
-<dd>List of gcode lines</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>List of gcode lines</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -174,19 +178,21 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Insert comments before each voxel layer.</p>
 <p>Voxels are determined based on the position of the Z-axis and the specified
 voxel dimension. Comments are formatted as follows:</p>
-<p><code>;V0</code></p>
-<p><code>;Start of voxel 0</code></p>
-<p>pause_before_voxel references the <code>;V0</code> line of the comment. This line can
+<p><span class="docutils literal">;V0</span></p>
+<p><span class="docutils literal">;Start of voxel 0</span></p>
+<p>pause_before_voxel references the <span class="docutils literal">;V0</span> line of the comment. This line can
 also be used with remove_to_string to remove initialization code before the
 first voxel layer.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>gcode</code></strong></dt>
-<dd>List of gcode lines</dd>
+<dd><p>List of gcode lines</p></dd>
 <dt><strong><code>voxel_size</code></strong></dt>
-<dd>Size of voxels in mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Size of voxels in mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -228,12 +234,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Import the lines of a gcode file to a list</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name with extension</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>List</code> of <code>gcode lines</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>File name with extension</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>List of gcode lines</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -260,14 +268,16 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Insert a pause command (M601) before a specified voxel layer.</p>
 <p>Before using this command, use find_voxels to add comments before the start
 of each voxel layer.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>gcode</code></strong></dt>
-<dd>List of gcode lines</dd>
+<dd><p>List of gcode lines</p></dd>
 <dt><strong><code>voxel</code></strong></dt>
-<dd>Voxel layer</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Voxel layer</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -297,14 +307,16 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Remove all gcode commands before a specified comment string.</p>
 <p>find_voxels can be used before this command to add comments before the
 start of each voxel layer.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>gcode</code></strong></dt>
-<dd>List of gcode lines</dd>
+<dd><p>List of gcode lines</p></dd>
 <dt><strong><code>string</code></strong></dt>
-<dd>Comment string to find</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Comment string to find</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -357,9 +369,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse/index.html b/docs/voxelfuse/index.html
index 461d796..275bcd9 100644
--- a/docs/voxelfuse/index.html
+++ b/docs/voxelfuse/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse API documentation</title>
 <meta name="description" content="…" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -283,9 +285,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse/materials.html b/docs/voxelfuse/materials.html
index 17a6399..4c3b00e 100644
--- a/docs/voxelfuse/materials.html
+++ b/docs/voxelfuse/materials.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse.materials API documentation</title>
 <meta name="description" content="Material data array …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -168,9 +170,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse/mesh.html b/docs/voxelfuse/mesh.html
index 799fb3c..f6b1d23 100644
--- a/docs/voxelfuse/mesh.html
+++ b/docs/voxelfuse/mesh.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse.mesh API documentation</title>
 <meta name="description" content="Mesh Class …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -358,24 +360,26 @@ <h2 class="section-title" id="header-functions">Functions</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Find the applicable mesh vertices and triangles for a target voxel.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>voxel_model_array</code></strong></dt>
-<dd>VoxelModel.voxels</dd>
+<dd><p>VoxelModel.voxels</p></dd>
 <dt><strong><code>model_offsets</code></strong></dt>
-<dd>VoxelModel.coords</dd>
+<dd><p>VoxelModel.coords</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
+<dd><p>Number of voxels per mm</p></dd>
 <dt><strong><code>x</code></strong></dt>
-<dd>Target voxel X location</dd>
+<dd><p>Target voxel X location</p></dd>
 <dt><strong><code>y</code></strong></dt>
-<dd>Target voxel Y location</dd>
+<dd><p>Target voxel Y location</p></dd>
 <dt><strong><code>z</code></strong></dt>
-<dd>Target voxel Z location</dd>
+<dd><p>Target voxel Z location</p></dd>
 <dt><strong><code>vi</code></strong></dt>
-<dd>Current vertex index</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>New verts, Indices for new verts, New tris, New current vert index</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Current vertex index</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>New verts, Indices for new verts, New tris, New current vert index</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -484,20 +488,22 @@ <h2 id="args">Args</h2>
 <dd>
 <div class="desc"><p>Check if a target voxel has another voxel of the same material
 adjacent to it in the X direction.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>input_model</code></strong></dt>
-<dd>VoxelModel</dd>
+<dd><p>VoxelModel</p></dd>
 <dt><strong><code>x_coord</code></strong></dt>
-<dd>Target voxel X location</dd>
+<dd><p>Target voxel X location</p></dd>
 <dt><strong><code>y_coord</code></strong></dt>
-<dd>Target voxel Y location</dd>
+<dd><p>Target voxel Y location</p></dd>
 <dt><strong><code>z_coord</code></strong></dt>
-<dd>Target voxel Z location</dd>
+<dd><p>Target voxel Z location</p></dd>
 <dt><strong><code>x_dir</code></strong></dt>
-<dd>Specify X direction and distance (usually 1 or -1)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Adjacent voxel present/not present</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Specify X direction and distance (usually 1 or -1)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Adjacent voxel present/not present</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -533,20 +539,22 @@ <h2 id="args">Args</h2>
 <dd>
 <div class="desc"><p>Check if a target voxel has another voxel of the same material
 adjacent to it in the Y direction.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>input_model</code></strong></dt>
-<dd>VoxelModel</dd>
+<dd><p>VoxelModel</p></dd>
 <dt><strong><code>x_coord</code></strong></dt>
-<dd>Target voxel X location</dd>
+<dd><p>Target voxel X location</p></dd>
 <dt><strong><code>y_coord</code></strong></dt>
-<dd>Target voxel Y location</dd>
+<dd><p>Target voxel Y location</p></dd>
 <dt><strong><code>z_coord</code></strong></dt>
-<dd>Target voxel Z location</dd>
+<dd><p>Target voxel Z location</p></dd>
 <dt><strong><code>y_dir</code></strong></dt>
-<dd>Specify Y direction and distance (usually 1 or -1)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Adjacent voxel present/not present</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Specify Y direction and distance (usually 1 or -1)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Adjacent voxel present/not present</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -582,20 +590,22 @@ <h2 id="args">Args</h2>
 <dd>
 <div class="desc"><p>Check if a target voxel has another voxel of the same material
 adjacent to it in the Z direction.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>input_model</code></strong></dt>
-<dd>VoxelModel</dd>
+<dd><p>VoxelModel</p></dd>
 <dt><strong><code>x_coord</code></strong></dt>
-<dd>Target voxel X location</dd>
+<dd><p>Target voxel X location</p></dd>
 <dt><strong><code>y_coord</code></strong></dt>
-<dd>Target voxel Y location</dd>
+<dd><p>Target voxel Y location</p></dd>
 <dt><strong><code>z_coord</code></strong></dt>
-<dd>Target voxel Z location</dd>
+<dd><p>Target voxel Z location</p></dd>
 <dt><strong><code>z_dir</code></strong></dt>
-<dd>Specify Z direction and distance (usually 1 or -1)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Adjacent voxel present/not present</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Specify Z direction and distance (usually 1 or -1)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Adjacent voxel present/not present</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -637,18 +647,18 @@ <h2 class="section-title" id="header-classes">Classes</h2>
 <dd>
 <div class="desc"><p>Mesh object that can be exported or passed to a Plot object.</p>
 <p>Initialize a Mesh object.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>input_model</code></strong></dt>
-<dd>Voxel data array</dd>
+<dd><p>Voxel data array</p></dd>
 <dt><strong><code>verts</code></strong></dt>
-<dd>List of coordinates of surface vertices</dd>
+<dd><p>List of coordinates of surface vertices</p></dd>
 <dt><strong><code>verts_colors</code></strong></dt>
-<dd>List of colors associated with each vertex</dd>
+<dd><p>List of colors associated with each vertex</p></dd>
 <dt><strong><code>tris</code></strong></dt>
-<dd>List of the sets of vertices associated with triangular faces</dd>
+<dd><p>List of the sets of vertices associated with triangular faces</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
+<dd><p>Number of voxels per mm</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -794,18 +804,20 @@ <h3>Static methods</h3>
 </code></dt>
 <dd>
 <div class="desc"><p>Generate a mesh object from a VoxelModel object.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>mesh1 = Mesh.fromVoxelModel(model1)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">mesh1 = Mesh.fromVoxelModel(model1)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>voxel_model</code></strong></dt>
-<dd>VoxelModel object to be converted to a mesh</dd>
+<dd><p>VoxelModel object to be converted to a mesh</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm, -1 to use model resolution</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.mesh.Mesh" href="#voxelfuse.mesh.Mesh">Mesh</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of voxels per mm, -1 to use model resolution</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Mesh</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -907,16 +919,18 @@ <h3>Methods</h3>
 </code></dt>
 <dd>
 <div class="desc"><p>Save a copy of the mesh with the specified name and file format.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>mesh1.export('result.stl')</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal"><span class="pre">mesh1.export('result.stl')</span></span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name with extension</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>File name with extension</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -984,9 +998,7 @@ <h4><code><a title="voxelfuse.mesh.Mesh" href="#voxelfuse.mesh.Mesh">Mesh</a></c
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse/periodic.html b/docs/voxelfuse/periodic.html
index bcbe854..ec8e2e4 100644
--- a/docs/voxelfuse/periodic.html
+++ b/docs/voxelfuse/periodic.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse.periodic API documentation</title>
 <meta name="description" content="Functions for generating triply periodic structures …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -205,31 +207,33 @@ <h1 class="title">Module <code>voxelfuse.periodic</code></h1>
 <h2 class="section-title" id="header-functions">Functions</h2>
 <dl>
 <dt id="voxelfuse.periodic.FRD"><code class="name flex">
-<span>def <span class="ident">FRD</span></span>(<span>size: Tuple[int, int, int] = (15, 15, 15), scale: int = 15, coords: Tuple[int, int, int] = (0, 0, 0), material1: int = 1, material2: int = 2, resolution: float = 1)</span>
+<span>def <span class="ident">FRD</span></span>(<span>size: Tuple[int, int, int] = (15, 15, 15), scale: int = 15, coords: Tuple[int, int, int] = (0, 0, 0), material1: int = 1, material2: int = 2, resolution: float = 1)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Generate a FRD surface over a rectangular region.</p>
-<p>This function will generate two models representing the "positive" and
-"negative" halves of the pattern. If a thin surface is desired,
+<p>This function will generate two models representing the &quot;positive&quot; and
+&quot;negative&quot; halves of the pattern. If a thin surface is desired,
 these two models can be dilated and the intersection of the results found.
-However, due to the voxel-based representation, this "surface" will have
+However, due to the voxel-based representation, this &quot;surface&quot; will have
 a non-zero thickness.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>size</code></strong></dt>
-<dd>Size of rectangular region</dd>
+<dd><p>Size of rectangular region</p></dd>
 <dt><strong><code>scale</code></strong></dt>
-<dd>Period of the surface function in voxels</dd>
+<dd><p>Period of the surface function in voxels</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>material1</code></strong></dt>
-<dd>Material index for negative model, corresponds to materials.py</dd>
+<dd><p>Material index for negative model, corresponds to materials.py</p></dd>
 <dt><strong><code>material2</code></strong></dt>
-<dd>Material index for positive model, corresponds to materials.py</dd>
+<dd><p>Material index for positive model, corresponds to materials.py</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Negative model, Positive model</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of voxels per mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Negative model, Positive model</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -276,31 +280,33 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.periodic.gyroid"><code class="name flex">
-<span>def <span class="ident">gyroid</span></span>(<span>size: Tuple[int, int, int] = (15, 15, 15), scale: int = 15, coords: Tuple[int, int, int] = (0, 0, 0), material1: int = 1, material2: int = 2, resolution: float = 1)</span>
+<span>def <span class="ident">gyroid</span></span>(<span>size: Tuple[int, int, int] = (15, 15, 15), scale: int = 15, coords: Tuple[int, int, int] = (0, 0, 0), material1: int = 1, material2: int = 2, resolution: float = 1)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Generate a Gyroid pattern over a rectangular region.</p>
-<p>This function will generate two models representing the "positive" and
-"negative" halves of the pattern. If a thin surface is desired,
+<p>This function will generate two models representing the &quot;positive&quot; and
+&quot;negative&quot; halves of the pattern. If a thin surface is desired,
 these two models can be dilated and the intersection of the results found.
-However, due to the voxel-based representation, this "surface" will have
+However, due to the voxel-based representation, this &quot;surface&quot; will have
 a non-zero thickness.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>size</code></strong></dt>
-<dd>Size of rectangular region</dd>
+<dd><p>Size of rectangular region</p></dd>
 <dt><strong><code>scale</code></strong></dt>
-<dd>Period of the surface function in voxels</dd>
+<dd><p>Period of the surface function in voxels</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>material1</code></strong></dt>
-<dd>Material index for negative model, corresponds to materials.py</dd>
+<dd><p>Material index for negative model, corresponds to materials.py</p></dd>
 <dt><strong><code>material2</code></strong></dt>
-<dd>Material index for positive model, corresponds to materials.py</dd>
+<dd><p>Material index for positive model, corresponds to materials.py</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Negative model, Positive model</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of voxels per mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Negative model, Positive model</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -346,31 +352,33 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.periodic.schwarzD"><code class="name flex">
-<span>def <span class="ident">schwarzD</span></span>(<span>size: Tuple[int, int, int] = (15, 15, 15), scale: int = 15, coords: Tuple[int, int, int] = (0, 0, 0), material1: int = 1, material2: int = 2, resolution: float = 1)</span>
+<span>def <span class="ident">schwarzD</span></span>(<span>size: Tuple[int, int, int] = (15, 15, 15), scale: int = 15, coords: Tuple[int, int, int] = (0, 0, 0), material1: int = 1, material2: int = 2, resolution: float = 1)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Generate a Schwarz D-surface over a rectangular region.</p>
-<p>This function will generate two models representing the "positive" and
-"negative" halves of the pattern. If a thin surface is desired,
+<p>This function will generate two models representing the &quot;positive&quot; and
+&quot;negative&quot; halves of the pattern. If a thin surface is desired,
 these two models can be dilated and the intersection of the results found.
-However, due to the voxel-based representation, this "surface" will have
+However, due to the voxel-based representation, this &quot;surface&quot; will have
 a non-zero thickness.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>size</code></strong></dt>
-<dd>Size of rectangular region</dd>
+<dd><p>Size of rectangular region</p></dd>
 <dt><strong><code>scale</code></strong></dt>
-<dd>Period of the surface function in voxels</dd>
+<dd><p>Period of the surface function in voxels</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>material1</code></strong></dt>
-<dd>Material index for negative model, corresponds to materials.py</dd>
+<dd><p>Material index for negative model, corresponds to materials.py</p></dd>
 <dt><strong><code>material2</code></strong></dt>
-<dd>Material index for positive model, corresponds to materials.py</dd>
+<dd><p>Material index for positive model, corresponds to materials.py</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Negative model, Positive model</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of voxels per mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Negative model, Positive model</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -417,31 +425,33 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.periodic.schwarzP"><code class="name flex">
-<span>def <span class="ident">schwarzP</span></span>(<span>size: Tuple[int, int, int] = (15, 15, 15), scale: int = 15, coords: Tuple[int, int, int] = (0, 0, 0), material1: int = 1, material2: int = 2, resolution: float = 1)</span>
+<span>def <span class="ident">schwarzP</span></span>(<span>size: Tuple[int, int, int] = (15, 15, 15), scale: int = 15, coords: Tuple[int, int, int] = (0, 0, 0), material1: int = 1, material2: int = 2, resolution: float = 1)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Generate a Schwarz P-surface over a rectangular region.</p>
-<p>This function will generate two models representing the "positive" and
-"negative" halves of the pattern. If a thin surface is desired,
+<p>This function will generate two models representing the &quot;positive&quot; and
+&quot;negative&quot; halves of the pattern. If a thin surface is desired,
 these two models can be dilated and the intersection of the results found.
-However, due to the voxel-based representation, this "surface" will have
+However, due to the voxel-based representation, this &quot;surface&quot; will have
 a non-zero thickness.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>size</code></strong></dt>
-<dd>Size of rectangular region</dd>
+<dd><p>Size of rectangular region</p></dd>
 <dt><strong><code>scale</code></strong></dt>
-<dd>Period of the surface function in voxels</dd>
+<dd><p>Period of the surface function in voxels</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>material1</code></strong></dt>
-<dd>Material index for negative model, corresponds to materials.py</dd>
+<dd><p>Material index for negative model, corresponds to materials.py</p></dd>
 <dt><strong><code>material2</code></strong></dt>
-<dd>Material index for positive model, corresponds to materials.py</dd>
+<dd><p>Material index for positive model, corresponds to materials.py</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Negative model, Positive model</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of voxels per mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Negative model, Positive model</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -514,9 +524,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse/plot.html b/docs/voxelfuse/plot.html
index 028058e..41752d8 100644
--- a/docs/voxelfuse/plot.html
+++ b/docs/voxelfuse/plot.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse.plot API documentation</title>
 <meta name="description" content="Plot Class …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -184,29 +186,29 @@ <h2 class="section-title" id="header-classes">Classes</h2>
 <dl>
 <dt id="voxelfuse.plot.Plot"><code class="flex name class">
 <span>class <span class="ident">Plot</span></span>
-<span>(</span><span>mesh, grids: bool = False, drawEdges: bool = True, edgeColor: Tuple[float, float, float, float] = (0, 0, 0, 0.5), positionOffset: Tuple[int, int, int] = (0, 0, 0), viewAngle: Tuple[int, int, int] = (40, 30, 300), resolution: Tuple[int, int] = (1280, 720), name: str = 'Plot 1')</span>
+<span>(</span><span>mesh, grids: bool = False, drawEdges: bool = True, edgeColor: Tuple[float, float, float, float] = (0, 0, 0, 0.5), positionOffset: Tuple[int, int, int] = (0, 0, 0), viewAngle: Tuple[int, int, int] = (40, 30, 300), resolution: Tuple[int, int] = (1280, 720), name: str = 'Plot 1')</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Plot object that can be displayed or exported.</p>
 <p>Initialize a Plot object from a Mesh object.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>mesh</code></strong></dt>
-<dd>Mesh object to be plotted</dd>
+<dd><p>Mesh object to be plotted</p></dd>
 <dt><strong><code>grids</code></strong></dt>
-<dd>Enable/disable display of XYZ axes and grids</dd>
+<dd><p>Enable/disable display of XYZ axes and grids</p></dd>
 <dt><strong><code>drawEdges</code></strong></dt>
-<dd>Enable/disable display of voxel edges</dd>
+<dd><p>Enable/disable display of voxel edges</p></dd>
 <dt><strong><code>edgeColor</code></strong></dt>
-<dd>Set display color of voxel edges</dd>
+<dd><p>Set display color of voxel edges</p></dd>
 <dt><strong><code>positionOffset</code></strong></dt>
-<dd>Offset of the camera target from the center of the model in voxels</dd>
+<dd><p>Offset of the camera target from the center of the model in voxels</p></dd>
 <dt><strong><code>viewAngle</code></strong></dt>
-<dd>Elevation, Azimuth, and Distance of the camera</dd>
+<dd><p>Elevation, Azimuth, and Distance of the camera</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
+<dd><p>Number of voxels per mm</p></dd>
 <dt><strong><code>name</code></strong></dt>
-<dd>Plot window name</dd>
+<dd><p>Plot window name</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -348,21 +350,23 @@ <h3>Methods</h3>
 </code></dt>
 <dd>
 <div class="desc"><p>Save a screenshot of the last generated plot widget with the specified name and file format.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>app1 = qg.QApplication(sys.argv)</code></p>
-<p><code>plot1 = Plot(mesh1)</code></p>
-<p><code>plot1.show()</code></p>
-<p><code>app1.processEvents()</code></p>
-<p><code>plot1.export('result.png')</code></p>
-<p><code>app1.exec_()</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">app1 = qg.QApplication(sys.argv)</span></p>
+<p><span class="docutils literal">plot1 = Plot(mesh1)</span></p>
+<p><span class="docutils literal">plot1.show()</span></p>
+<p><span class="docutils literal">app1.processEvents()</span></p>
+<p><span class="docutils literal"><span class="pre">plot1.export('result.png')</span></span></p>
+<p><span class="docutils literal">app1.exec_()</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name with extension</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>File name with extension</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -403,15 +407,18 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Generate an display widget based on the plot settings and display it.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>app1 = qg.QApplication(sys.argv)</code></p>
-<p><code>plot1 = Plot(mesh1)</code></p>
-<p><code>plot1.show()</code></p>
-<p><code>app1.processEvents()</code></p>
-<p><code>app1.exec_()</code></p>
-<hr>
-<p>Returns: None</p></div>
+<p><span class="docutils literal">app1 = qg.QApplication(sys.argv)</span></p>
+<p><span class="docutils literal">plot1 = Plot(mesh1)</span></p>
+<p><span class="docutils literal">plot1.show()</span></p>
+<p><span class="docutils literal">app1.processEvents()</span></p>
+<p><span class="docutils literal">app1.exec_()</span></p>
+<hr class="docutils" />
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -520,9 +527,7 @@ <h4><code><a title="voxelfuse.plot.Plot" href="#voxelfuse.plot.Plot">Plot</a></c
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse/primitives.html b/docs/voxelfuse/primitives.html
index 5f78fdf..dca9b6b 100644
--- a/docs/voxelfuse/primitives.html
+++ b/docs/voxelfuse/primitives.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse.primitives API documentation</title>
 <meta name="description" content="Functions for generating primitive solids …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -203,26 +205,28 @@ <h1 class="title">Module <code>voxelfuse.primitives</code></h1>
 <h2 class="section-title" id="header-functions">Functions</h2>
 <dl>
 <dt id="voxelfuse.primitives.cone"><code class="name flex">
-<span>def <span class="ident">cone</span></span>(<span>min_radius: int = 0, max_radius: int = 4, height: int = 5, coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1)</span>
+<span>def <span class="ident">cone</span></span>(<span>min_radius: int = 0, max_radius: int = 4, height: int = 5, coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Create a VoxelModel containing a cylinder.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>min_radius</code></strong></dt>
-<dd>Point radius of cone in voxels</dd>
+<dd><p>Point radius of cone in voxels</p></dd>
 <dt><strong><code>max_radius</code></strong></dt>
-<dd>Base radius of cone in voxels</dd>
+<dd><p>Base radius of cone in voxels</p></dd>
 <dt><strong><code>height</code></strong></dt>
-<dd>Height of cone in voxels</dd>
+<dd><p>Height of cone in voxels</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>VoxelModel</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of voxels per mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -260,22 +264,24 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.primitives.cube"><code class="name flex">
-<span>def <span class="ident">cube</span></span>(<span>size: int = 1, coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1)</span>
+<span>def <span class="ident">cube</span></span>(<span>size: int = 1, coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Create a VoxelModel containing a cube.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>size</code></strong></dt>
-<dd>Length of cube side in voxels</dd>
+<dd><p>Length of cube side in voxels</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>VoxelModel</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of voxels per mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -297,22 +303,24 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.primitives.cuboid"><code class="name flex">
-<span>def <span class="ident">cuboid</span></span>(<span>size: Tuple[int, int, int] = (1, 1, 1), coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1)</span>
+<span>def <span class="ident">cuboid</span></span>(<span>size: Tuple[int, int, int] = (1, 1, 1), coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Create a VoxelModel containing a cuboid.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>size</code></strong></dt>
-<dd>Lengths of cuboid sides in voxels</dd>
+<dd><p>Lengths of cuboid sides in voxels</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>VoxelModel</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of voxels per mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -334,24 +342,26 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.primitives.cylinder"><code class="name flex">
-<span>def <span class="ident">cylinder</span></span>(<span>radius: int = 1, height: int = 1, coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1)</span>
+<span>def <span class="ident">cylinder</span></span>(<span>radius: int = 1, height: int = 1, coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Create a VoxelModel containing a cylinder.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Radius of cylinder in voxels</dd>
+<dd><p>Radius of cylinder in voxels</p></dd>
 <dt><strong><code>height</code></strong></dt>
-<dd>Height of cylinder in voxels</dd>
+<dd><p>Height of cylinder in voxels</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>VoxelModel</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of voxels per mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -387,20 +397,22 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.primitives.empty"><code class="name flex">
-<span>def <span class="ident">empty</span></span>(<span>coords: Tuple[int, int, int] = (0, 0, 0), resolution: float = 1, num_materials: int = 14)</span>
+<span>def <span class="ident">empty</span></span>(<span>coords: Tuple[int, int, int] = (0, 0, 0), resolution: float = 1, num_materials: int = 14)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Create a VoxelModel containing a single empty voxel at the specified coordinates.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
+<dd><p>Number of voxels per mm</p></dd>
 <dt><strong><code>num_materials</code></strong></dt>
-<dd>Number of material types in materials vector</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>VoxelModel</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of material types in materials vector</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -422,26 +434,28 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.primitives.pyramid"><code class="name flex">
-<span>def <span class="ident">pyramid</span></span>(<span>min_radius: int = 0, max_radius: int = 4, height: int = 5, coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1)</span>
+<span>def <span class="ident">pyramid</span></span>(<span>min_radius: int = 0, max_radius: int = 4, height: int = 5, coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Create a VoxelModel containing a cylinder.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>min_radius</code></strong></dt>
-<dd>Point radius of pyramid in voxels</dd>
+<dd><p>Point radius of pyramid in voxels</p></dd>
 <dt><strong><code>max_radius</code></strong></dt>
-<dd>Base radius of pyramid in voxels</dd>
+<dd><p>Base radius of pyramid in voxels</p></dd>
 <dt><strong><code>height</code></strong></dt>
-<dd>Height of pyramid in voxels</dd>
+<dd><p>Height of pyramid in voxels</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>VoxelModel</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of voxels per mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -475,22 +489,24 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.primitives.sphere"><code class="name flex">
-<span>def <span class="ident">sphere</span></span>(<span>radius: int = 1, coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1)</span>
+<span>def <span class="ident">sphere</span></span>(<span>radius: int = 1, coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Create a VoxelModel containing a sphere.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Radius of sphere in voxels</dd>
+<dd><p>Radius of sphere in voxels</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>VoxelModel</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of voxels per mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -555,9 +571,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse/simulation.html b/docs/voxelfuse/simulation.html
index ee972ba..c082273 100644
--- a/docs/voxelfuse/simulation.html
+++ b/docs/voxelfuse/simulation.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse.simulation API documentation</title>
 <meta name="description" content="Simulation Class …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -1399,14 +1401,16 @@ <h2 class="section-title" id="header-functions">Functions</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Initialize shared result variables.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>disp_result_array</code></strong></dt>
-<dd>Multiprocessing array to hold displacement results</dd>
+<dd><p>Multiprocessing array to hold displacement results</p></dd>
 <dt><strong><code>t_result_array</code></strong></dt>
-<dd>Multiprocessing array to hold time results</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Multiprocessing array to hold time results</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -1430,12 +1434,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Simulation process.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>simulation</code></strong></dt>
-<dd>Simulation object to run</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Simulation object to run</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -1471,12 +1477,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Simulation process.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>simulation</code></strong></dt>
-<dd>Simulation object to run</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Simulation object to run</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -1600,14 +1608,14 @@ <h3>Class variables</h3>
 <dd>
 <div class="desc"><p>MultiSimulation object that holds settings for generating a simulation and running multiple parallel trials of it using different parameters.</p>
 <p>Initialize a MultiSimulation object.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>setup_fcn</code></strong></dt>
-<dd>Function to use for initializing Simulation objects. Should take a single tuple as an input and return a single Simulation object.</dd>
+<dd><p>Function to use for initializing Simulation objects. Should take a single tuple as an input and return a single Simulation object.</p></dd>
 <dt><strong><code>setup_params</code></strong></dt>
-<dd>List containing the desired input tuples for setup_fcn</dd>
+<dd><p>List containing the desired input tuples for setup_fcn</p></dd>
 <dt><strong><code>thread_count</code></strong></dt>
-<dd>Maximum number of CPU threads</dd>
+<dd><p>Maximum number of CPU threads</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -1762,7 +1770,10 @@ <h3>Methods</h3>
 </code></dt>
 <dd>
 <div class="desc"><p>Print the number of simulations to be run and confirm that the user would like to continue.</p>
-<p>Returns: None</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -1782,14 +1793,16 @@ <h3>Methods</h3>
 </code></dt>
 <dd>
 <div class="desc"><p>Export a CSV file containing simulation setup parameters and the corresponding simulation results.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name</dd>
+<dd><p>File name</p></dd>
 <dt><strong><code>labels</code></strong></dt>
-<dd>Column headers for simulation setup parameters</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Column headers for simulation setup parameters</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -1843,14 +1856,16 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Export VXA files for all or specified simulation configurations.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name</dd>
+<dd><p>File name</p></dd>
 <dt><strong><code>config_number</code></strong></dt>
-<dd>Config to export, -1 to export all configs</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Config to export, -1 to export all configs</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -1879,7 +1894,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get the current simulation setup parameters.</p>
-<p>Returns: List containing the current input tuples for setup_fcn</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>List containing the current input tuples for setup_fcn</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -1898,7 +1916,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Run all simulation configurations and save the results.</p>
-<p>Returns: None</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -1942,12 +1963,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Update the simulation setup parameters.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>setup_params</code></strong></dt>
-<dd>List containing the desired input tuples for setup_fcn</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>List containing the desired input tuples for setup_fcn</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -1977,10 +2000,10 @@ <h2 id="args">Args</h2>
 <p>Models located at positive coordinate values will have their workspace
 size adjusted to maintain their position in the exported simulation.
 Models located at negative coordinate values will be shifted to the origin.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>voxel_model</code></strong></dt>
-<dd>VoxelModel</dd>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3092,12 +3115,14 @@ <h3>Static methods</h3>
 </code></dt>
 <dd>
 <div class="desc"><p>Create new Simulation object with the same settings as an existing Simulation object.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>simulation</code></strong></dt>
-<dd>Simulation to copy</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.simulation.Simulation" href="#voxelfuse.simulation.Simulation">Simulation</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Simulation to copy</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Simulation</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3130,7 +3155,7 @@ <h2 id="args">Args</h2>
 <h3>Methods</h3>
 <dl>
 <dt id="voxelfuse.simulation.Simulation.addBoundaryConditionBox"><code class="name flex">
-<span>def <span class="ident">addBoundaryConditionBox</span></span>(<span>self, position: Tuple[float, float, float] = (0.0, 0.0, 0.0), size: Tuple[float, float, float] = (1.0, 1.0, 0.01), fixed_dof: int = 63, force: Tuple[float, float, float] = (0, 0, 0), displacement: Tuple[float, float, float] = (0, 0, 0), torque: Tuple[float, float, float] = (0, 0, 0), angular_displacement: Tuple[float, float, float] = (0, 0, 0))</span>
+<span>def <span class="ident">addBoundaryConditionBox</span></span>(<span>self, position: Tuple[float, float, float] = (0.0, 0.0, 0.0), size: Tuple[float, float, float] = (1.0, 1.0, 0.01), fixed_dof: int = 63, force: Tuple[float, float, float] = (0, 0, 0), displacement: Tuple[float, float, float] = (0, 0, 0), torque: Tuple[float, float, float] = (0, 0, 0), angular_displacement: Tuple[float, float, float] = (0, 0, 0))</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Add a box-shaped boundary condition.</p>
@@ -3140,24 +3165,26 @@ <h3>Methods</h3>
 If a bit is set to 0, the corresponding force/torque will be applied. If
 a bit is set to 1, the DOF will be fixed and the displacement will be
 applied.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>position</code></strong></dt>
-<dd>Box corner position (0-1)</dd>
+<dd><p>Box corner position (0-1)</p></dd>
 <dt><strong><code>size</code></strong></dt>
-<dd>Box size (0-1)</dd>
+<dd><p>Box size (0-1)</p></dd>
 <dt><strong><code>fixed_dof</code></strong></dt>
-<dd>Fixed degrees of freedom</dd>
+<dd><p>Fixed degrees of freedom</p></dd>
 <dt><strong><code>force</code></strong></dt>
-<dd>Force vector in N</dd>
+<dd><p>Force vector in N</p></dd>
 <dt><strong><code>displacement</code></strong></dt>
-<dd>Displacement vector in mm</dd>
+<dd><p>Displacement vector in mm</p></dd>
 <dt><strong><code>torque</code></strong></dt>
-<dd>Torque values in Nm</dd>
+<dd><p>Torque values in Nm</p></dd>
 <dt><strong><code>angular_displacement</code></strong></dt>
-<dd>Angular displacement values in deg</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Angular displacement values in deg</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3193,7 +3220,7 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.simulation.Simulation.addBoundaryConditionCylinder"><code class="name flex">
-<span>def <span class="ident">addBoundaryConditionCylinder</span></span>(<span>self, position: Tuple[float, float, float] = (0.45, 0.5, 0.5), axis: int = 0, height: float = 0.1, radius: float = 0.05, fixed_dof: int = 63, force: Tuple[float, float, float] = (0, 0, 0), displacement: Tuple[float, float, float] = (0, 0, 0), torque: Tuple[float, float, float] = (0, 0, 0), angular_displacement: Tuple[float, float, float] = (0, 0, 0))</span>
+<span>def <span class="ident">addBoundaryConditionCylinder</span></span>(<span>self, position: Tuple[float, float, float] = (0.45, 0.5, 0.5), axis: int = 0, height: float = 0.1, radius: float = 0.05, fixed_dof: int = 63, force: Tuple[float, float, float] = (0, 0, 0), displacement: Tuple[float, float, float] = (0, 0, 0), torque: Tuple[float, float, float] = (0, 0, 0), angular_displacement: Tuple[float, float, float] = (0, 0, 0))</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Add a cylindrical boundary condition.</p>
@@ -3203,28 +3230,30 @@ <h2 id="args">Args</h2>
 If a bit is set to 0, the corresponding force/torque will be applied. If
 a bit is set to 1, the DOF will be fixed and the displacement will be
 applied.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>position</code></strong></dt>
-<dd>Boundary condition origin position (0-1)</dd>
+<dd><p>Boundary condition origin position (0-1)</p></dd>
 <dt><strong><code>axis</code></strong></dt>
-<dd>Cylinder axis (0-2)</dd>
+<dd><p>Cylinder axis (0-2)</p></dd>
 <dt><strong><code>height</code></strong></dt>
-<dd>Cylinder height (0-1)</dd>
+<dd><p>Cylinder height (0-1)</p></dd>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Cylinder radius (0-1)</dd>
+<dd><p>Cylinder radius (0-1)</p></dd>
 <dt><strong><code>fixed_dof</code></strong></dt>
-<dd>Fixed degrees of freedom</dd>
+<dd><p>Fixed degrees of freedom</p></dd>
 <dt><strong><code>force</code></strong></dt>
-<dd>Force vector in N</dd>
+<dd><p>Force vector in N</p></dd>
 <dt><strong><code>displacement</code></strong></dt>
-<dd>Displacement vector in mm</dd>
+<dd><p>Displacement vector in mm</p></dd>
 <dt><strong><code>torque</code></strong></dt>
-<dd>Torque values in Nm</dd>
+<dd><p>Torque values in Nm</p></dd>
 <dt><strong><code>angular_displacement</code></strong></dt>
-<dd>Angular displacement values in deg</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Angular displacement values in deg</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3265,7 +3294,7 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.simulation.Simulation.addBoundaryConditionSphere"><code class="name flex">
-<span>def <span class="ident">addBoundaryConditionSphere</span></span>(<span>self, position: Tuple[float, float, float] = (0.5, 0.5, 0.5), radius: float = 0.05, fixed_dof: int = 63, force: Tuple[float, float, float] = (0, 0, 0), displacement: Tuple[float, float, float] = (0, 0, 0), torque: Tuple[float, float, float] = (0, 0, 0), angular_displacement: Tuple[float, float, float] = (0, 0, 0))</span>
+<span>def <span class="ident">addBoundaryConditionSphere</span></span>(<span>self, position: Tuple[float, float, float] = (0.5, 0.5, 0.5), radius: float = 0.05, fixed_dof: int = 63, force: Tuple[float, float, float] = (0, 0, 0), displacement: Tuple[float, float, float] = (0, 0, 0), torque: Tuple[float, float, float] = (0, 0, 0), angular_displacement: Tuple[float, float, float] = (0, 0, 0))</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Add a spherical boundary condition.</p>
@@ -3275,24 +3304,26 @@ <h2 id="args">Args</h2>
 If a bit is set to 0, the corresponding force/torque will be applied. If
 a bit is set to 1, the DOF will be fixed and the displacement will be
 applied.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>position</code></strong></dt>
-<dd>Sphere center position (0-1)</dd>
+<dd><p>Sphere center position (0-1)</p></dd>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Sphere radius (0-1)</dd>
+<dd><p>Sphere radius (0-1)</p></dd>
 <dt><strong><code>fixed_dof</code></strong></dt>
-<dd>Fixed degrees of freedom</dd>
+<dd><p>Fixed degrees of freedom</p></dd>
 <dt><strong><code>force</code></strong></dt>
-<dd>Force vector in N</dd>
+<dd><p>Force vector in N</p></dd>
 <dt><strong><code>displacement</code></strong></dt>
-<dd>Displacement vector in mm</dd>
+<dd><p>Displacement vector in mm</p></dd>
 <dt><strong><code>torque</code></strong></dt>
-<dd>Torque values in Nm</dd>
+<dd><p>Torque values in Nm</p></dd>
 <dt><strong><code>angular_displacement</code></strong></dt>
-<dd>Angular displacement values in deg</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Angular displacement values in deg</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3328,7 +3359,7 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.simulation.Simulation.addBoundaryConditionVoxel"><code class="name flex">
-<span>def <span class="ident">addBoundaryConditionVoxel</span></span>(<span>self, position: Tuple[int, int, int] = (0, 0, 0), fixed_dof: int = 63, force: Tuple[float, float, float] = (0, 0, 0), displacement: Tuple[float, float, float] = (0, 0, 0), torque: Tuple[float, float, float] = (0, 0, 0), angular_displacement: Tuple[float, float, float] = (0, 0, 0))</span>
+<span>def <span class="ident">addBoundaryConditionVoxel</span></span>(<span>self, position: Tuple[int, int, int] = (0, 0, 0), fixed_dof: int = 63, force: Tuple[float, float, float] = (0, 0, 0), displacement: Tuple[float, float, float] = (0, 0, 0), torque: Tuple[float, float, float] = (0, 0, 0), angular_displacement: Tuple[float, float, float] = (0, 0, 0))</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Add a boundary condition at a specific voxel.</p>
@@ -3336,22 +3367,24 @@ <h2 id="args">Args</h2>
 correspond to: Rz, Ry, Rx, Z, Y, X. If a bit is set to 0, the corresponding force/torque
 will be applied. If a bit is set to 1, the DOF will be fixed and the displacement will be
 applied.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>position</code></strong></dt>
-<dd>Position in voxels</dd>
+<dd><p>Position in voxels</p></dd>
 <dt><strong><code>fixed_dof</code></strong></dt>
-<dd>Fixed degrees of freedom</dd>
+<dd><p>Fixed degrees of freedom</p></dd>
 <dt><strong><code>force</code></strong></dt>
-<dd>Force vector in N</dd>
+<dd><p>Force vector in N</p></dd>
 <dt><strong><code>displacement</code></strong></dt>
-<dd>Displacement vector in mm</dd>
+<dd><p>Displacement vector in mm</p></dd>
 <dt><strong><code>torque</code></strong></dt>
-<dd>Torque values in Nm</dd>
+<dd><p>Torque values in Nm</p></dd>
 <dt><strong><code>angular_displacement</code></strong></dt>
-<dd>Angular displacement values in deg</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Angular displacement values in deg</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3398,14 +3431,17 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Specify a pair of voxels which should be disconnected</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>voxel_1</code></strong></dt>
-<dd>Coordinates in voxels</dd>
+<dd><p>Coordinates in voxels</p></dd>
 <dt><strong><code>voxel_2</code></strong></dt>
-<dd>Coordinates in voxels</dd>
+<dd><p>Coordinates in voxels</p></dd>
 </dl>
-<p>Returns:</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3422,19 +3458,21 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.simulation.Simulation.addSensor"><code class="name flex">
-<span>def <span class="ident">addSensor</span></span>(<span>self, location: Tuple[int, int, int] = (0, 0, 0), axis: <a title="voxelfuse.simulation.Axis" href="#voxelfuse.simulation.Axis">Axis</a> = Axis.NONE)</span>
+<span>def <span class="ident">addSensor</span></span>(<span>self, location: Tuple[int, int, int] = (0, 0, 0), axis: <a title="voxelfuse.simulation.Axis" href="#voxelfuse.simulation.Axis">Axis</a> = Axis.NONE)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Add a sensor to a voxel.</p>
 <p>This feature is not currently supported by VoxCad</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>location</code></strong></dt>
-<dd>Sensor location in voxels</dd>
+<dd><p>Sensor location in voxels</p></dd>
 <dt><strong><code>axis</code></strong></dt>
-<dd>Sensor measurement axis</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Sensor measurement axis</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3459,31 +3497,33 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.simulation.Simulation.addTempControl"><code class="name flex">
-<span>def <span class="ident">addTempControl</span></span>(<span>self, location: Tuple[int, int, int] = (0, 0, 0), amplitude1: float = 0, amplitude2: float = 0, changeX: float = 0.5, phase_offset: float = 0, temp_offset: float = 0, const_temp: bool = False, square_wave: bool = False)</span>
+<span>def <span class="ident">addTempControl</span></span>(<span>self, location: Tuple[int, int, int] = (0, 0, 0), amplitude1: float = 0, amplitude2: float = 0, changeX: float = 0.5, phase_offset: float = 0, temp_offset: float = 0, const_temp: bool = False, square_wave: bool = False)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Add a temperature control element to a voxel.</p>
 <p>This feature is not currently supported by VoxCad</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>location</code></strong></dt>
-<dd>Control element location in voxels</dd>
+<dd><p>Control element location in voxels</p></dd>
 <dt><strong><code>amplitude1</code></strong></dt>
-<dd>Control element positive temperature amplitude (deg C)</dd>
+<dd><p>Control element positive temperature amplitude (deg C)</p></dd>
 <dt><strong><code>amplitude2</code></strong></dt>
-<dd>Control element negative temperature amplitude (deg C)</dd>
+<dd><p>Control element negative temperature amplitude (deg C)</p></dd>
 <dt><strong><code>changeX</code></strong></dt>
-<dd>Percent of period spanned by positive temperature amplitude (0-1)</dd>
+<dd><p>Percent of period spanned by positive temperature amplitude (0-1)</p></dd>
 <dt><strong><code>phase_offset</code></strong></dt>
-<dd>Control element phase offset for time-varying thermal (rad)</dd>
+<dd><p>Control element phase offset for time-varying thermal (rad)</p></dd>
 <dt><strong><code>temp_offset</code></strong></dt>
-<dd>Control element temperature offset for time-varying thermal (deg C)</dd>
+<dd><p>Control element temperature offset for time-varying thermal (deg C)</p></dd>
 <dt><strong><code>const_temp</code></strong></dt>
-<dd>Enable/disable setting a constant target temperature that respects heating/cooling rates</dd>
+<dd><p>Enable/disable setting a constant target temperature that respects heating/cooling rates</p></dd>
 <dt><strong><code>square_wave</code></strong></dt>
-<dd>Enable/disable converting signal to a square wave (positive -&gt; a = amplitude1, negative -&gt; a = 0)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable converting signal to a square wave (positive -&gt; a = amplitude1, negative -&gt; a = 0)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3519,24 +3559,27 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set the simulation temperature control elements based on a value maps of target temperature settings.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>amp1_map</code></strong></dt>
-<dd>Array of target positive temperature amplitudes for each voxel (deg C)</dd>
+<dd><p>Array of target positive temperature amplitudes for each voxel (deg C)</p></dd>
 <dt><strong><code>amp2_map</code></strong></dt>
-<dd>Array of target negative temperature amplitudes for each voxel (deg C)</dd>
+<dd><p>Array of target negative temperature amplitudes for each voxel (deg C)</p></dd>
 <dt><strong><code>changeX_map</code></strong></dt>
-<dd>Array containing percent of period spanned by positive temperature amplitude for each voxel</dd>
+<dd><p>Array containing percent of period spanned by positive temperature amplitude for each voxel</p></dd>
 <dt><strong><code>phase_map</code></strong></dt>
-<dd>Array of phase offsets for each voxel (rad)</dd>
+<dd><p>Array of phase offsets for each voxel (rad)</p></dd>
 <dt><strong><code>offset_map</code></strong></dt>
-<dd>Array of temperature offsets for each voxel (deg C)</dd>
+<dd><p>Array of temperature offsets for each voxel (deg C)</p></dd>
 <dt><strong><code>const_temp_map</code></strong></dt>
-<dd>Array of boolean values to enable/disable constant temperature mode</dd>
+<dd><p>Array of boolean values to enable/disable constant temperature mode</p></dd>
 <dt><strong><code>square_wave_map</code></strong></dt>
-<dd>Array of boolean values to enable/disable square wave mode</dd>
+<dd><p>Array of boolean values to enable/disable square wave mode</p></dd>
 </dl>
-<p>Returns:</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3608,7 +3651,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Remove all boundary conditions from a Simulation object.</p>
-<p>Returns: None</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3627,7 +3673,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Clear all disconnected voxel bonds.</p>
-<p>Returns: None</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3646,7 +3695,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Remove all sensors from a Simulation object.</p>
-<p>Returns: None</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3665,7 +3717,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Remove all temperature control elements from a Simulation object.</p>
-<p>Returns: None</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3684,7 +3739,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get simulation collision parameters.</p>
-<p>Returns: Enable/disable collisions, Collision damping</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Enable/disable collisions, Collision damping</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3703,7 +3761,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get simulation damping parameters.</p>
-<p>Returns: Voxel bond damping, Environment damping</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Voxel bond damping, Environment damping</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3722,7 +3783,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get simulation equilibrium mode.</p>
-<p>Returns: Enable/disable equilibrium mode</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Enable/disable equilibrium mode</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3741,7 +3805,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get simulation gravity parameters.</p>
-<p>Returns: Enable/disable gravity, Acceleration due to gravity in m/sec^2, Enable/disable ground plane</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Enable/disable gravity, Acceleration due to gravity in m/sec^2, Enable/disable ground plane</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3760,7 +3827,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get hydrogel model parameters.</p>
-<p>Returns: Enable/disable hydrogel model</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Enable/disable hydrogel model</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3779,7 +3849,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get the simulation model.</p>
-<p>Returns: VoxelModel</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3798,7 +3871,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get simulation stop condition.</p>
-<p>Returns: Stop condition type, Stop condition value</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Stop condition type, Stop condition value</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3817,7 +3893,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get simulation temperature parameters.</p>
-<p>Returns: Enable/disable temperature, Base temperature in degrees C, Enable/disable temperature fluctuation, Temperature fluctuation amplitude, Temperature fluctuation period, Temperature offset</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Enable/disable temperature, Base temperature in degrees C, Enable/disable temperature fluctuation, Temperature fluctuation amplitude, Temperature fluctuation period, Temperature offset</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3836,7 +3915,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get the side dimension of a voxel in mm.</p>
-<p>Returns: Float</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Float</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3859,24 +3941,26 @@ <h2 id="args">Args</h2>
 <p>This function will create a .vxa file, run the file with Voxelyze, and then load the .xml results file into
 the results attribute of the Simulation object. Enabling delete_files will delete both the .vxa and .xml files
 once the results have been loaded.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name for .vxa and .xml files</dd>
+<dd><p>File name for .vxa and .xml files</p></dd>
 <dt><strong><code>value_map</code></strong></dt>
-<dd>Index of the desired value map type</dd>
+<dd><p>Index of the desired value map type</p></dd>
 <dt><strong><code>log_interval</code></strong></dt>
-<dd>Set the step interval at which sensor log entries should be recorded, -1 to disable log</dd>
+<dd><p>Set the step interval at which sensor log entries should be recorded, -1 to disable log</p></dd>
 <dt><strong><code>history_interval</code></strong></dt>
-<dd>Set the step interval at which history file entries should be recorded, -1 for default interval</dd>
+<dd><p>Set the step interval at which history file entries should be recorded, -1 for default interval</p></dd>
 <dt><strong><code>delete_files</code></strong></dt>
-<dd>Enable/disable deleting simulation file when process is complete</dd>
+<dd><p>Enable/disable deleting simulation file when process is complete</p></dd>
 <dt><strong><code>voxelyze_on_path</code></strong></dt>
-<dd>Enable/disable using system Voxelyze rather than bundled Voxelyze</dd>
+<dd><p>Enable/disable using system Voxelyze rather than bundled Voxelyze</p></dd>
 <dt><strong><code>wsl</code></strong></dt>
-<dd>Enable/disable using Windows Subsystem for Linux with bundled Voxelyze</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable using Windows Subsystem for Linux with bundled Voxelyze</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4019,25 +4103,27 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Run a Simulation object using the VoxCad GUI.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>simulation = Simulation(modelResult)</code></p>
-<p><code>simulation.setCollision()</code></p>
-<p><code>simulation.setStopCondition(<a title="voxelfuse.simulation.StopCondition.TIME_VALUE" href="#voxelfuse.simulation.StopCondition.TIME_VALUE">StopCondition.TIME_VALUE</a>, 0.01)</code></p>
-<p><code>simulation.runSimVoxCad('collision_sim_1', delete_files=False)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">simulation = Simulation(modelResult)</span></p>
+<p><span class="docutils literal">simulation.setCollision()</span></p>
+<p><span class="docutils literal">simulation.setStopCondition(StopCondition.TIME_VALUE, 0.01)</span></p>
+<p><span class="docutils literal"><span class="pre">simulation.runSimVoxCad('collision_sim_1',</span> delete_files=False)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name</dd>
+<dd><p>File name</p></dd>
 <dt><strong><code>delete_files</code></strong></dt>
-<dd>Enable/disable deleting simulation file when VoxCad is closed</dd>
+<dd><p>Enable/disable deleting simulation file when VoxCad is closed</p></dd>
 <dt><strong><code>voxcad_on_path</code></strong></dt>
-<dd>Enable/disable using system VoxCad rather than bundled VoxCad</dd>
+<dd><p>Enable/disable using system VoxCad rather than bundled VoxCad</p></dd>
 <dt><strong><code>wsl</code></strong></dt>
-<dd>Enable/disable using Windows Subsystem for Linux with bundled VoxCad</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable using Windows Subsystem for Linux with bundled VoxCad</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4098,12 +4184,15 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Saves a simulation's results dictionary to a .csv file.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>Name of output file</dd>
+<dd><p>Name of output file</p></dd>
 </dl>
-<p>Returns:</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -4147,14 +4236,16 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Save the temperature control elements applied to a model to a .csv file.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name</dd>
+<dd><p>File name</p></dd>
 <dt><strong><code>figure</code></strong></dt>
-<dd>Enable/disable exporting a figure as well</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable exporting a figure as well</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4213,14 +4304,16 @@ <h2 id="args">Args</h2>
 small models.</p>
 <p>The .vxa file type can be opened using VoxCad simulation software. However, it
 cannot currently be reopened by a VoxelFuse script.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name</dd>
+<dd><p>File name</p></dd>
 <dt><strong><code>compression</code></strong></dt>
-<dd>Enable/disable voxel data compression</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable voxel data compression</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4267,14 +4360,16 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Set simulation collision parameters.</p>
 <p>A damping value of 0 represents completely elastic collisions and
 higher values represent inelastic collisions.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>enable</code></strong></dt>
-<dd>Enable/disable collisions</dd>
+<dd><p>Enable/disable collisions</p></dd>
 <dt><strong><code>damping</code></strong></dt>
-<dd>Collision damping (0-2)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Collision damping (0-2)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4302,14 +4397,16 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Set simulation damping parameters.</p>
 <p>Environment damping can be used to simulate fluid environments. 0 represents
 a vacuum and larger values represent a viscous fluid.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>bond</code></strong></dt>
-<dd>Voxel bond damping (0-1)</dd>
+<dd><p>Voxel bond damping (0-1)</p></dd>
 <dt><strong><code>environment</code></strong></dt>
-<dd>Environment damping (0-0.1)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Environment damping (0-0.1)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4335,12 +4432,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set simulation equilibrium mode.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>enable</code></strong></dt>
-<dd>Enable/disable equilibrium mode</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable equilibrium mode</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4361,16 +4460,18 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set a fixed environment temperature.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>enable</code></strong></dt>
-<dd>Enable/disable temperature</dd>
+<dd><p>Enable/disable temperature</p></dd>
 <dt><strong><code>base_temp</code></strong></dt>
-<dd>Temperature in degrees C</dd>
+<dd><p>Temperature in degrees C</p></dd>
 <dt><strong><code>growth_amplitude</code></strong></dt>
-<dd>Set to 1 to enable expansion from base size</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Set to 1 to enable expansion from base size</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4396,16 +4497,18 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set simulation gravity parameters.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>enable</code></strong></dt>
-<dd>Enable/disable gravity</dd>
+<dd><p>Enable/disable gravity</p></dd>
 <dt><strong><code>value</code></strong></dt>
-<dd>Acceleration due to gravity in m/sec^2</dd>
+<dd><p>Acceleration due to gravity in m/sec^2</p></dd>
 <dt><strong><code>enable_floor</code></strong></dt>
-<dd>Enable/disable ground plane</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable ground plane</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4430,12 +4533,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set hydrogel model parameters.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>enable</code></strong></dt>
-<dd>Enable/disable hydrogel model</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable hydrogel model</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4459,12 +4564,14 @@ <h2 id="args">Args</h2>
 <p>Models located at positive coordinate values will have their workspace
 size adjusted to maintain their position in the exported simulation.
 Models located at negative coordinate values will be shifted to the origin.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>voxel_model</code></strong></dt>
-<dd>VoxelModel</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>VoxelModel</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4490,14 +4597,16 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set simulation stop condition.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>condition</code></strong></dt>
-<dd>Stop condition type, set using StopCondition class</dd>
+<dd><p>Stop condition type, set using StopCondition class</p></dd>
 <dt><strong><code>value</code></strong></dt>
-<dd>Stop condition value</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Stop condition value</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4520,22 +4629,24 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set a varying environment temperature.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>enable</code></strong></dt>
-<dd>Enable/disable temperature</dd>
+<dd><p>Enable/disable temperature</p></dd>
 <dt><strong><code>base_temp</code></strong></dt>
-<dd>Base temperature in degrees C</dd>
+<dd><p>Base temperature in degrees C</p></dd>
 <dt><strong><code>amplitude</code></strong></dt>
-<dd>Temperature fluctuation amplitude</dd>
+<dd><p>Temperature fluctuation amplitude</p></dd>
 <dt><strong><code>period</code></strong></dt>
-<dd>Temperature fluctuation period</dd>
+<dd><p>Temperature fluctuation period</p></dd>
 <dt><strong><code>offset</code></strong></dt>
-<dd>Temperature offset (not currently supported)</dd>
+<dd><p>Temperature offset (not currently supported)</p></dd>
 <dt><strong><code>growth_amplitude</code></strong></dt>
-<dd>Set to 1 to enable expansion from base size</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Set to 1 to enable expansion from base size</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4564,16 +4675,18 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.simulation.Simulation.writeDisconnections"><code class="name flex">
-<span>def <span class="ident">writeDisconnections</span></span>(<span>self, f: <class 'TextIO'>)</span>
+<span>def <span class="ident">writeDisconnections</span></span>(<span>self, f: TextIO)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Write bond disconnections to a text file using the .vxa format.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>f</code></strong></dt>
-<dd>File to write to</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>File to write to</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4596,16 +4709,18 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.simulation.Simulation.writeEnvironmentData"><code class="name flex">
-<span>def <span class="ident">writeEnvironmentData</span></span>(<span>self, f: <class 'TextIO'>)</span>
+<span>def <span class="ident">writeEnvironmentData</span></span>(<span>self, f: TextIO)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Write simulation environment parameters to a text file using the .vxa format.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>f</code></strong></dt>
-<dd>File to write to</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>File to write to</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4672,16 +4787,18 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.simulation.Simulation.writeSensors"><code class="name flex">
-<span>def <span class="ident">writeSensors</span></span>(<span>self, f: <class 'TextIO'>)</span>
+<span>def <span class="ident">writeSensors</span></span>(<span>self, f: TextIO)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Write voxel sensors to a text file using the .vxa format.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>f</code></strong></dt>
-<dd>File to write to</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>File to write to</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4704,16 +4821,18 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.simulation.Simulation.writeSimData"><code class="name flex">
-<span>def <span class="ident">writeSimData</span></span>(<span>self, f: <class 'TextIO'>)</span>
+<span>def <span class="ident">writeSimData</span></span>(<span>self, f: TextIO)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Write simulation parameters to a text file using the .vxa format.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>f</code></strong></dt>
-<dd>File to write to</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>File to write to</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4767,16 +4886,18 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.simulation.Simulation.writeTempControls"><code class="name flex">
-<span>def <span class="ident">writeTempControls</span></span>(<span>self, f: <class 'TextIO'>)</span>
+<span>def <span class="ident">writeTempControls</span></span>(<span>self, f: TextIO)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Write temperature control element to a text file using the .vxa format.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>f</code></strong></dt>
-<dd>File to write to</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>File to write to</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -4981,9 +5102,7 @@ <h4><code><a title="voxelfuse.simulation.StopCondition" href="#voxelfuse.simulat
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse/utils/index.html b/docs/voxelfuse/utils/index.html
index 4de4e2b..a0ded2a 100644
--- a/docs/voxelfuse/utils/index.html
+++ b/docs/voxelfuse/utils/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse.utils API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -58,9 +60,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse/utils/onelab.html b/docs/voxelfuse/utils/onelab.html
index 72ce293..514ebc0 100644
--- a/docs/voxelfuse/utils/onelab.html
+++ b/docs/voxelfuse/utils/onelab.html
@@ -3,16 +3,18 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse.utils.onelab API documentation</title>
 <meta name="description" content="ONELAB - Copyright (C) 2011-2020 Universite de Liege - Universite catholique
 de Louvain …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -2044,9 +2046,7 @@ <h4><code><a title="voxelfuse.utils.onelab.client" href="#voxelfuse.utils.onelab
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse/voxel_model.html b/docs/voxelfuse/voxel_model.html
index 072b60a..97caf12 100644
--- a/docs/voxelfuse/voxel_model.html
+++ b/docs/voxelfuse/voxel_model.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse.voxel_model API documentation</title>
 <meta name="description" content="VoxelModel Class …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -2685,14 +2687,16 @@ <h2 class="section-title" id="header-functions">Functions</h2>
 <dd>
 <div class="desc"><p>Make object dimensions compatible for solid body operations.</p>
 <p>This function accounts for location coordinates.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>modelA</code></strong></dt>
-<dd>Input model A</dd>
+<dd><p>Input model A</p></dd>
 <dt><strong><code>modelB</code></strong></dt>
-<dd>Input model B</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Resized model A, resized model B, New model coordinates</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Input model B</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Resized model A, resized model B, New model coordinates</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -2749,14 +2753,16 @@ <h2 id="args">Args</h2>
 <p>Incompatible resolutions will print an error. This will not prevent the
 operation from running, but it may indicate that the models are at
 different scales or that a resolution value has been incorrectly set.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>modelA</code></strong></dt>
-<dd>Input model A</dd>
+<dd><p>Input model A</p></dd>
 <dt><strong><code>modelB</code></strong></dt>
-<dd>Input model B</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Check successful T/F</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Input model B</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Check successful T/F</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -2875,12 +2881,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Generate the materials table for a single-material VoxelModel.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>m</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Array containing the specified material and the empty material</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Array containing the specified material and the empty material</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -2906,16 +2914,18 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Import mesh data from file</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name with extension</dd>
+<dd><p>File name with extension</p></dd>
 <dt><strong><code>delete_files</code></strong></dt>
-<dd>Enable/disable deleting temporary files when finished</dd>
+<dd><p>Enable/disable deleting temporary files when finished</p></dd>
 <dt><strong><code>gmsh_on_path</code></strong></dt>
-<dd>Enable/disable using system gmsh rather than bundled gmsh</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Mesh data (points, tris, and tets)</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable using system gmsh rather than bundled gmsh</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Mesh data (points, tris, and tets)</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -2972,14 +2982,16 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Generate a spherical structuring element.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Radius of structuring element in voxels</dd>
+<dd><p>Radius of structuring element in voxels</p></dd>
 <dt><strong><code>plane</code></strong></dt>
-<dd>Structuring element directions, set using Axes class</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Structuring element array</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Structuring element directions, set using Axes class</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Structuring element array</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3028,14 +3040,16 @@ <h2 id="args">Args</h2>
 <p>0,0,0 | 0,1,0 | 1,1,1</p>
 <p>0,1,0 | 1,1,1 | 1,1,1</p>
 <p>0,0,0 | 0,1,0 | 1,1,1</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>connectivity</code></strong></dt>
-<dd>Connectivity of structuring element (1-3)</dd>
+<dd><p>Connectivity of structuring element (1-3)</p></dd>
 <dt><strong><code>plane</code></strong></dt>
-<dd>Structuring element directions, set using Axes class</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Structuring element array</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Structuring element directions, set using Axes class</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Structuring element array</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3078,16 +3092,18 @@ <h2 id="args">Args</h2>
 full material mixtures at every voxel.</p>
 <p>This representation requires much more memory, but is
 needed for some operations. Also see toIndexedMaterials().</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>voxels</code></strong></dt>
-<dd>VoxelModel.voxels</dd>
+<dd><p>VoxelModel.voxels</p></dd>
 <dt><strong><code>materials</code></strong></dt>
-<dd>VoxelModel.materials</dd>
+<dd><p>VoxelModel.materials</p></dd>
 <dt><strong><code>n_materials</code></strong></dt>
-<dd>Number of materials in the material properties table</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Model data array</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of materials in the material properties table</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Model data array</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3129,15 +3145,19 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Convert from storing full material mixtures at every voxel
 to index-based material mixture storage.</p>
 <p>Also see toFullMaterials().</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>voxels</code></strong></dt>
-<dd>Model data array</dd>
+<dd><p>Model data array</p></dd>
 <dt><strong><code>model</code></strong></dt>
-<dd>Reference VoxelModel for size and coords</dd>
+<dd><p>Reference VoxelModel for size and coords</p></dd>
+<dt><strong><code>resolution</code></strong></dt>
+<dd>&nbsp;</dd>
 </dl>
-<p>resolution:
-Returns:</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3177,20 +3197,22 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.voxel_model.writeClos"><code class="name flex">
-<span>def <span class="ident">writeClos</span></span>(<span>f: <class 'TextIO'>, name: str, tab_level: int = 0)</span>
+<span>def <span class="ident">writeClos</span></span>(<span>f: TextIO, name: str, tab_level: int = 0)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Write a closing tag.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>f</code></strong></dt>
-<dd>File object</dd>
+<dd><p>File object</p></dd>
 <dt><strong><code>name</code></strong></dt>
-<dd>Tag name</dd>
+<dd><p>Tag name</p></dd>
 <dt><strong><code>tab_level</code></strong></dt>
-<dd>Number of tabs (2 spaces) before start of line</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of tabs (2 spaces) before start of line</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3211,22 +3233,24 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.voxel_model.writeData"><code class="name flex">
-<span>def <span class="ident">writeData</span></span>(<span>f: <class 'TextIO'>, name: str, value, tab_level: int = 0)</span>
+<span>def <span class="ident">writeData</span></span>(<span>f: TextIO, name: str, value, tab_level: int = 0)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Write a data element and the surrounding tags.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>f</code></strong></dt>
-<dd>File object</dd>
+<dd><p>File object</p></dd>
 <dt><strong><code>name</code></strong></dt>
-<dd>Tag name</dd>
+<dd><p>Tag name</p></dd>
 <dt><strong><code>value</code></strong></dt>
-<dd>Data value</dd>
+<dd><p>Data value</p></dd>
 <dt><strong><code>tab_level</code></strong></dt>
-<dd>Number of tabs (2 spaces) before start of line</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of tabs (2 spaces) before start of line</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3250,20 +3274,22 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.voxel_model.writeHeader"><code class="name flex">
-<span>def <span class="ident">writeHeader</span></span>(<span>f: <class 'TextIO'>, version: str, encoding: str)</span>
+<span>def <span class="ident">writeHeader</span></span>(<span>f: TextIO, version: str, encoding: str)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Write XML file header</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>f</code></strong></dt>
-<dd>File object</dd>
+<dd><p>File object</p></dd>
 <dt><strong><code>version</code></strong></dt>
-<dd>XML version number</dd>
+<dd><p>XML version number</p></dd>
 <dt><strong><code>encoding</code></strong></dt>
-<dd>Encoding type</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Encoding type</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3282,20 +3308,22 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.voxel_model.writeOpen"><code class="name flex">
-<span>def <span class="ident">writeOpen</span></span>(<span>f: <class 'TextIO'>, name: str, tab_level: int = 0)</span>
+<span>def <span class="ident">writeOpen</span></span>(<span>f: TextIO, name: str, tab_level: int = 0)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Write an opening tag.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>f</code></strong></dt>
-<dd>File object</dd>
+<dd><p>File object</p></dd>
 <dt><strong><code>name</code></strong></dt>
-<dd>Tag name</dd>
+<dd><p>Tag name</p></dd>
 <dt><strong><code>tab_level</code></strong></dt>
-<dd>Number of tabs (2 spaces) before start of line</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of tabs (2 spaces) before start of line</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3511,7 +3539,10 @@ <h3>Methods</h3>
 <dd>
 <div class="desc"><p>Apply GPU settings as overrides.</p>
 <p>These changes will only persist for the current python session.</p>
-<p>Returns: None</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -3533,14 +3564,16 @@ <h3>Methods</h3>
 </code></dt>
 <dd>
 <div class="desc"><p>Set overrides for CUDA settings.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>CUDA_enable</code></strong></dt>
-<dd>Enable/disable CUDA acceleration</dd>
+<dd><p>Enable/disable CUDA acceleration</p></dd>
 <dt><strong><code>CUDA_device</code></strong></dt>
-<dd>Select CUDA device</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Select CUDA device</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -3643,21 +3676,21 @@ <h3>Class variables</h3>
 </dd>
 <dt id="voxelfuse.voxel_model.VoxelModel"><code class="flex name class">
 <span>class <span class="ident">VoxelModel</span></span>
-<span>(</span><span>voxels, materials, coords: Tuple[int, int, int] = (0, 0, 0), resolution: float = 1)</span>
+<span>(</span><span>voxels, materials, coords: Tuple[int, int, int] = (0, 0, 0), resolution: float = 1)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>VoxelModel object that stores geometry, position, and material information.</p>
 <p>Initialize a VoxelModel object.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>voxels</code></strong></dt>
-<dd>Array storing the index of the material present at each voxel</dd>
+<dd><p>Array storing the index of the material present at each voxel</p></dd>
 <dt><strong><code>materials</code></strong></dt>
-<dd>Array of all material mixtures present in model, material format: (a, m0, m1, &hellip; mn)</dd>
+<dd><p>Array of all material mixtures present in model, material format: (a, m0, m1, &hellip; mn)</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm (higher number = finer resolution)</dd>
+<dd><p>Number of voxels per mm (higher number = finer resolution)</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -5761,12 +5794,14 @@ <h3>Static methods</h3>
 </code></dt>
 <dd>
 <div class="desc"><p>Initialize an VoxelModel that is a copy of another model.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>voxel_model</code></strong></dt>
-<dd>Reference VoxelModel object</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Reference VoxelModel object</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -5791,16 +5826,18 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Initialize an empty VoxelModel.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>size</code></strong></dt>
-<dd>Size of the empty model in voxels</dd>
+<dd><p>Size of the empty model in voxels</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
+<dd><p>Number of voxels per mm</p></dd>
 <dt><strong><code>num_materials</code></strong></dt>
-<dd>Number of material types in materials vector</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of material types in materials vector</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -5827,12 +5864,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Initialize an empty VoxelModel with the same size, coords, and resolution as another model.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>voxel_model</code></strong></dt>
-<dd>Reference VoxelModel object</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Reference VoxelModel object</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -5851,28 +5890,30 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.voxel_model.VoxelModel.fromMeshFile"><code class="name flex">
-<span>def <span class="ident">fromMeshFile</span></span>(<span>filename: str, coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1, gmsh_on_path: bool = False)</span>
+<span>def <span class="ident">fromMeshFile</span></span>(<span>filename: str, coords: Tuple[int, int, int] = (0, 0, 0), material: int = 1, resolution: float = 1, gmsh_on_path: bool = False)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Create a VoxelModel from an imported mesh file.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>model1 = VoxelModel.fromMeshFile('center.stl', (67, 3, 0), 2, 1)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model1 = <span class="pre">VoxelModel.fromMeshFile('center.stl',</span> (67, 3, 0), 2, 1)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name with extension</dd>
+<dd><p>File name with extension</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
+<dd><p>Number of voxels per mm</p></dd>
 <dt><strong><code>gmsh_on_path</code></strong></dt>
-<dd>Enable/disable using system gmsh rather than bundled gmsh</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable using system gmsh rather than bundled gmsh</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -5961,24 +6002,26 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.voxel_model.VoxelModel.fromVoxFile"><code class="name flex">
-<span>def <span class="ident">fromVoxFile</span></span>(<span>filename: str, coords: Tuple[int, int, int] = (0, 0, 0), resolution: float = 1)</span>
+<span>def <span class="ident">fromVoxFile</span></span>(<span>filename: str, coords: Tuple[int, int, int] = (0, 0, 0), resolution: float = 1)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Create a VoxelModel from an imported .vox file.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>model1 = VoxelModel.fromVoxFile('cylinder-red.vox', (0, 5, 0), 1)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model1 = <span class="pre">VoxelModel.fromVoxFile('cylinder-red.vox',</span> (0, 5, 0), 1)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name with extension</dd>
+<dd><p>File name with extension</p></dd>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Model origin coordinates</dd>
+<dd><p>Model origin coordinates</p></dd>
 <dt><strong><code>resolution</code></strong></dt>
-<dd>Number of voxels per mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Number of voxels per mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6032,16 +6075,18 @@ <h2 id="args">Args</h2>
 <p>This method will create a new VoxelModel object using the data from the .vf file.
 Material attributes are stored in the materials.py file, so the same version of
 this file must be used when saving and opening models.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>model1.openVF("test-file")</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal"><span class="pre">model1.openVF(&quot;test-file&quot;)</span></span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>File name</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6157,27 +6202,25 @@ <h3>Methods</h3>
 <dd>
 <div class="desc"><p>Find the material-wise addition of two models.</p>
 <p>The materials of the result are calculated by adding the material vectors for each voxel together.</p>
-<p>Example &ndash; Adding a voxel containing material 1 and a voxel containing material 3:</p>
-<blockquote>
-<blockquote>
-<p>Voxel A = [1, 0, 1, 0, 0]</p>
-<p>Voxel B = [1, 0, 0, 0, 1]</p>
-<p>A + B = [1, 0, 1, 0, 1]</p>
-<p>Scale Result (see Cleanup Operations) → [1, 0, 0.5, 0, 0.5]</p>
-</blockquote>
-</blockquote>
+<p>Example -- Adding a voxel containing material 1 and a voxel containing material 3:</p>
+<p>&gt;&gt; Voxel A = [1, 0, 1, 0, 0]</p>
+<p>&gt;&gt; Voxel B = [1, 0, 0, 0, 1]</p>
+<p>&gt;&gt; A + B = [1, 0, 1, 0, 1]</p>
+<p>&gt;&gt; Scale Result (see Cleanup Operations) → [1, 0, 0.5, 0, 0.5]</p>
 <p>This operation can also be applied using the addition operator (+).</p>
-<hr>
+<hr class="docutils" />
 <p>Examples:</p>
-<p><code>model3 = model1.add(model2)</code></p>
-<p><code>model3 = model1 + model2</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model3 = model1.add(model2)</span></p>
+<p><span class="docutils literal">model3 = model1 + model2</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>model_to_add</code></strong></dt>
-<dd>VoxelModel to add to self</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>VoxelModel to add to self</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6250,16 +6293,18 @@ <h2 id="args">Args</h2>
 <p>The blur radius corresponds to two times the standard deviation
 (2 * sigma) of the Gaussian distribution. The blurred effect is limited
 to voxels that were occupied by material in the input model.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>model2 = model1.blur(2)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model2 = model1.blur(2)</span></p>
+<p>___</p>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Blur radius in voxels</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Blur radius in voxels</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6308,18 +6353,20 @@ <h2 id="args">Args</h2>
 (2 * sigma) of the Gaussian distribution. The blurred effect is limited
 to voxels that were occupied by material in the intersection result
 and the material of the region model is ignored.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>model2 = model1.blurRegion(3, regionModel)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model2 = model1.blurRegion(3, regionModel)</span></p>
+<p>___</p>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Blur radius in voxels</dd>
+<dd><p>Blur radius in voxels</p></dd>
 <dt><strong><code>region</code></strong></dt>
-<dd>VoxelModel defining the target blur region</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>VoxelModel defining the target blur region</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6357,7 +6404,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set all null material percentages to zero.</p>
-<p>Returns: VoxelModel</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -6382,18 +6432,20 @@ <h2 id="args">Args</h2>
 will be affected by the process acting on the part. Clearance can be
 used to identify regions of a model that conflict with the manufacturing
 of another model.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>modelResult = model1.clearance(Process.PRINT)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">modelResult = model1.clearance(Process.PRINT)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>method</code></strong></dt>
-<dd>Target manufacturing method, set using Process class</dd>
+<dd><p>Target manufacturing method, set using Process class</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6439,18 +6491,20 @@ <h2 id="args">Args</h2>
 <p>This algorithm consists of dilation followed by erosion and will remove small holes.
 Depending on the structuring element used, this will apply a chamfer or fillet effect
 to inside corners.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Radius for dilation/erosion in voxels</dd>
+<dd><p>Radius for dilation/erosion in voxels</p></dd>
 <dt><strong><code>plane</code></strong></dt>
-<dd>Dilation/erosion directions, set using Axes class</dd>
+<dd><p>Dilation/erosion directions, set using Axes class</p></dd>
 <dt><strong><code>structType</code></strong></dt>
-<dd>Shape of structuring element, set using Struct class</dd>
+<dd><p>Shape of structuring element, set using Struct class</p></dd>
 <dt><strong><code>connectivity</code></strong></dt>
-<dd>connectivity of structuring element (1-3)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>connectivity of structuring element (1-3)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6481,16 +6535,18 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Find the geometric difference of two models.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>model3 = model1.difference(model2)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model3 = model1.difference(model2)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>model_to_sub</code></strong></dt>
-<dd>VoxelModel to subtract from self</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>VoxelModel to subtract from self</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6523,23 +6579,25 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Dilate a model along the specified axes.</p>
-<hr>
+<hr class="docutils" />
 <p>Examples:</p>
-<p><code>model2 = model1.dilate(3)</code></p>
-<p><code>model4 = model3.dilate(1, Axes.XY, Struct.SPHERE, 2)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model2 = model1.dilate(3)</span></p>
+<p><span class="docutils literal">model4 = model3.dilate(1, Axes.XY, Struct.SPHERE, 2)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Dilation radius in voxels</dd>
+<dd><p>Dilation radius in voxels</p></dd>
 <dt><strong><code>plane</code></strong></dt>
-<dd>Dilation directions, set using Axes class</dd>
+<dd><p>Dilation directions, set using Axes class</p></dd>
 <dt><strong><code>structType</code></strong></dt>
-<dd>Shape of structuring element, set using Struct class</dd>
+<dd><p>Shape of structuring element, set using Struct class</p></dd>
 <dt><strong><code>connectivity</code></strong></dt>
-<dd>Connectivity of structuring element (1-3)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Connectivity of structuring element (1-3)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6591,18 +6649,20 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Dilate a model along the specified axes without increasing the size of its bounding box.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Dilation radius in voxels</dd>
+<dd><p>Dilation radius in voxels</p></dd>
 <dt><strong><code>plane</code></strong></dt>
-<dd>Dilation directions, set using Axes class</dd>
+<dd><p>Dilation directions, set using Axes class</p></dd>
 <dt><strong><code>structType</code></strong></dt>
-<dd>Shape of structuring element, set using Struct class</dd>
+<dd><p>Shape of structuring element, set using Struct class</p></dd>
 <dt><strong><code>connectivity</code></strong></dt>
-<dd>Connectivity of structuring element (1-3)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Connectivity of structuring element (1-3)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6642,24 +6702,26 @@ <h2 id="args">Args</h2>
 <p>Applying dithering will modify the model so that each voxel contains material in only a single material channel.
 Regions of the model which contained mixtures of materials will be converted to distributions of adjacent single
 material voxels.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>use_full</code></strong></dt>
-<dd>Enabling will use a Stucki error diffusion filter. Disabling will use the provided values for x, y, and z error</dd>
+<dd><p>Enabling will use a Stucki error diffusion filter. Disabling will use the provided values for x, y, and z error</p></dd>
 <dt><strong><code>x_error</code></strong></dt>
-<dd>Percentage of error to spread in X</dd>
+<dd><p>Percentage of error to spread in X</p></dd>
 <dt><strong><code>y_error</code></strong></dt>
-<dd>Percentage of error to spread in Y</dd>
+<dd><p>Percentage of error to spread in Y</p></dd>
 <dt><strong><code>z_error</code></strong></dt>
-<dd>Percentage of error to spread in Z</dd>
+<dd><p>Percentage of error to spread in Z</p></dd>
 <dt><strong><code>error_spread_threshold</code></strong></dt>
-<dd>If a voxel contains a material channel that accounts for more than this percentage of the voxel, no additional error will be spread to it</dd>
+<dd><p>If a voxel contains a material channel that accounts for more than this percentage of the voxel, no additional error will be spread to it</p></dd>
 <dt><strong><code>blur</code></strong></dt>
-<dd>Enable/disable applying a blur operation before the dither operation</dd>
+<dd><p>Enable/disable applying a blur operation before the dither operation</p></dd>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Radius value for the optional blur operation</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Radius value for the optional blur operation</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6706,18 +6768,20 @@ <h2 id="args">Args</h2>
 the first material vector by the second. This function also supports
 division by a scalar.</p>
 <p>This operation can also be applied using the division operator (/).</p>
-<hr>
+<hr class="docutils" />
 <p>Examples:</p>
-<p><code>model3 = model1.divide(model2)</code></p>
-<p><code>model3 = model1 / model2</code></p>
-<p><code>model5 = model4 / 3</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model3 = model1.divide(model2)</span></p>
+<p><span class="docutils literal">model3 = model1 / model2</span></p>
+<p><span class="docutils literal">model5 = model4 / 3</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>other</code></strong></dt>
-<dd>VoxelModel to divide self by</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>VoxelModel to divide self by</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6794,23 +6858,25 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Erode a model along the specified axes.</p>
-<hr>
+<hr class="docutils" />
 <p>Examples:</p>
-<p><code>model2 = model1.erode(5, connectivity=2)</code></p>
-<p><code>model4 = model3.erode(2, Axes.X, Struct.SPHERE, 1)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model2 = model1.erode(5, connectivity=2)</span></p>
+<p><span class="docutils literal">model4 = model3.erode(2, Axes.X, Struct.SPHERE, 1)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Erosion radius in voxels</dd>
+<dd><p>Erosion radius in voxels</p></dd>
 <dt><strong><code>plane</code></strong></dt>
-<dd>Erosion directions, set using Axes class</dd>
+<dd><p>Erosion directions, set using Axes class</p></dd>
 <dt><strong><code>structType</code></strong></dt>
-<dd>Shape of structuring element, set using Struct class</dd>
+<dd><p>Shape of structuring element, set using Struct class</p></dd>
 <dt><strong><code>connectivity</code></strong></dt>
-<dd>Connectivity of structuring element (1-3)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Connectivity of structuring element (1-3)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -6861,7 +6927,10 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Remove excess empty space from a model.</p>
 <p>Resize the workspace around a model to remove excess empty space.
 Model coordinates are updated to reflect the change.</p>
-<p>Returns: VoxelModel</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -6939,7 +7008,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get all voxels contained in the bounding box of the input model.</p>
-<p>Returns: VoxelModel</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -6963,7 +7035,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Find the coordinates of the center of a model.</p>
-<p>Returns: Center coordinates in voxels</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Center coordinates in voxels</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -6992,12 +7067,14 @@ <h2 id="args">Args</h2>
 <p>This function uses a disconnected components algorithm and assumes that adjacent
 voxels with different materials are connected. Connectivity can be set to 1-3
 and defines the shape of the structuring element.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>connectivity</code></strong></dt>
-<dd>Connectivity of structuring element (1-3)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Connectivity of structuring element (1-3)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7027,12 +7104,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get the average material properties of a row in a model's material array.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Dictionary</code> of <code>material properties</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material index</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Dictionary of material properties</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7072,7 +7151,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get all voxels occupied by the input model.</p>
-<p>Returns: VoxelModel</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -7094,12 +7176,14 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Get the stress-strain data for a row in a model's material array.</p>
 <p>This is currently returned based on the material present in the highest percentage.</p>
 <p>TODO: Make this average multiple stress-strain curves</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Dictionary</code> of <code>material properties</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material index</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Dictionary of material properties</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7133,12 +7217,15 @@ <h2 id="args">Args</h2>
 <dd>
 <div class="desc"><p>Get all voxels not occupied by the input model.</p>
 <p>This operation can also be applied using the invert operator (~).</p>
-<hr>
+<hr class="docutils" />
 <p>Examples:</p>
-<p><code>model2 = model1.getUnoccupied()</code></p>
-<p><code>model2 = ~model1</code></p>
-<hr>
-<p>Returns: VoxelModel</p></div>
+<p><span class="docutils literal">model2 = model1.getUnoccupied()</span></p>
+<p><span class="docutils literal">model2 = ~model1</span></p>
+<hr class="docutils" />
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -7170,14 +7257,16 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get the volume of a model or model component.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>component</code></strong></dt>
-<dd>Component label to measure, set to 0 for all components</dd>
+<dd><p>Component label to measure, set to 0 for all components</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index to measure, set to 0 for all materials</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Volume in voxels, volume in mm^3</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material index to measure, set to 0 for all materials</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Volume in voxels, volume in mm^3</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7206,7 +7295,10 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get the side dimension of a voxel in mm.</p>
-<p>Returns: Float</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Float</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -7226,12 +7318,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get the average material properties of a specific voxel.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Voxel coordinates</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>Dictionary</code> of <code>material properties</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Voxel coordinates</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>Dictionary of material properties</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7254,17 +7348,19 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Find the geometric intersection of two models.</p>
 <p>The materials from self will be used in the resulting model.
 This operation can also be applied using the AND operator (&amp;)</p>
-<hr>
+<hr class="docutils" />
 <p>Examples:</p>
-<p><code>model3 = model1.intersection(model2)</code></p>
-<p><code>model3 = model1 &amp; model2</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model3 = model1.intersection(model2)</span></p>
+<p><span class="docutils literal">model3 = model1 &amp; model2</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>model_2</code></strong></dt>
-<dd>VoxelModel to intersect with self</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>VoxelModel to intersect with self</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7309,12 +7405,14 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Isolate a component by its component label.</p>
 <p>Component labels must first be updated with getComponents.
 Unrecognized component labels will return an empty object.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>component</code></strong></dt>
-<dd>Component label to isolate</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Component label to isolate</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7340,16 +7438,18 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get all voxels in a specified layer.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>model2 = model1.isolateLayer(8)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model2 = model1.isolateLayer(8)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>layer</code></strong></dt>
-<dd>Voxel layer to isolate</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Voxel layer to isolate</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7380,16 +7480,18 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Get all voxels with a specified material.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>model2 = model1.isolateMaterial(4)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model2 = model1.isolateMaterial(4)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to the materials array for the model</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material index corresponding to the materials array for the model</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7427,18 +7529,20 @@ <h2 id="args">Args</h2>
 in the final part and regions of the workspace that cannot be accessed
 without affecting this material. In general, additive processes will have
 no keep-out region because they deposit material from the bottom up.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>modelResult = model1.keepout(Process.MILL)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">modelResult = model1.keepout(Process.MILL)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>method</code></strong></dt>
-<dd>Target manufacturing method, set using Process class</dd>
+<dd><p>Target manufacturing method, set using Process class</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7486,18 +7590,20 @@ <h2 id="args">Args</h2>
 <p>The materials of the result are calculated by multiplying the material vectors
 for each voxel. This function also supports multiplication by a scalar.</p>
 <p>This operation can also be applied using the multiplication operator (*).</p>
-<hr>
+<hr class="docutils" />
 <p>Examples:</p>
-<p><code>model3 = model1.multiply(model2)</code></p>
-<p><code>model3 = model1 * model2</code></p>
-<p><code>model5 = model4 * 3</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model3 = model1.multiply(model2)</span></p>
+<p><span class="docutils literal">model3 = model1 * model2</span></p>
+<p><span class="docutils literal">model5 = model4 * 3</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>other</code></strong></dt>
-<dd>VoxelModel to multiply with self</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>VoxelModel to multiply with self</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7572,18 +7678,20 @@ <h2 id="args">Args</h2>
 <p>This algorithm consists of erosion followed by dilation and will remove small features.
 Depending on the structuring element used, this will apply a chamfer or fillet effect
 to outside corners.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>radius</code></strong></dt>
-<dd>Radius for dilation/erosion in voxels</dd>
+<dd><p>Radius for dilation/erosion in voxels</p></dd>
 <dt><strong><code>plane</code></strong></dt>
-<dd>Dilation/erosion directions, set using Axes class</dd>
+<dd><p>Dilation/erosion directions, set using Axes class</p></dd>
 <dt><strong><code>structType</code></strong></dt>
-<dd>Shape of structuring element, set using Struct class</dd>
+<dd><p>Shape of structuring element, set using Struct class</p></dd>
 <dt><strong><code>connectivity</code></strong></dt>
-<dd>Connectivity of structuring element (1-3)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Connectivity of structuring element (1-3)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7628,18 +7736,20 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Generate a model representing all voxels within the workspace that contain
 material or that lie in the specified direction with respect to a voxel
 that contains material.</p>
-<hr>
+<p>---</p>
 <p>Example:</p>
-<p><code>modelResult = model1.projection(Dir.DOWN)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">modelResult = model1.projection(Dir.DOWN)</span></p>
+<p>---</p>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>direction</code></strong></dt>
-<dd>Projection direction, set using Dir class</dd>
+<dd><p>Projection direction, set using Dir class</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7704,7 +7814,10 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Remove duplicate rows from a model's material array.</p>
 <p>This function can be greatly accelerated using CUDA. For more information on how to enable CUDA in VoxelFuse,
 see the GpuSettings class.</p>
-<p>Returns: VoxelModel</p></div>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -7759,11 +7872,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Remove negative material values from a model (these have no physical meaning).</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>model2 = model1.removeNegatives()</code></p>
-<hr>
-<p>Returns: VoxelModel</p></div>
+<p><span class="docutils literal">model2 = model1.removeNegatives()</span></p>
+<p>___</p>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -7797,14 +7913,16 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Rotate a model about its center.</p>
 <p>Floating point errors may slightly affect the angle of the resulting model.
 To rotate a model in precise 90 degree increments, use rotate90().</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>angle</code></strong></dt>
-<dd>Angle of rotation in degrees</dd>
+<dd><p>Angle of rotation in degrees</p></dd>
 <dt><strong><code>axis</code></strong></dt>
-<dd>Axis of rotation, set using Axes class</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Axis of rotation, set using Axes class</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7841,14 +7959,16 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Rotate a model about its center in increments of 90 degrees.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>times</code></strong></dt>
-<dd>Number of 90 degree increments to rotate model</dd>
+<dd><p>Number of 90 degree increments to rotate model</p></dd>
 <dt><strong><code>axis</code></strong></dt>
-<dd>Axis of rotation, set using Axes class</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Axis of rotation, set using Axes class</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7882,12 +8002,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Round material percentages to nearest multiple of an input value.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>toNearest</code></strong></dt>
-<dd>Value to round to</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Value to round to</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -7924,16 +8046,18 @@ <h2 id="args">Args</h2>
 attributes remain stored in the materials.py file, so the same version of
 this file must be used when saving and opening models. The .vf file type can be reopened
 by a VoxelFuse script.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>modelResult.saveVF("test-file")</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal"><span class="pre">modelResult.saveVF(&quot;test-file&quot;)</span></span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>File name</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8029,18 +8153,20 @@ <h2 id="args">Args</h2>
 small models.</p>
 <p>The .vxc file type can be opened using VoxCad simulation software. However, it
 cannot currently be reopened by a VoxelFuse script.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>modelResult.saveVXC("test-file", compression=False)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal"><span class="pre">modelResult.saveVXC(&quot;test-file&quot;,</span> compression=False)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>filename</code></strong></dt>
-<dd>File name</dd>
+<dd><p>File name</p></dd>
 <dt><strong><code>compression</code></strong></dt>
-<dd>Enable/disable voxel data compression</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable voxel data compression</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8094,14 +8220,16 @@ <h2 id="args">Args</h2>
 also be multiplied by the scaling factor.
 Enable adjustResolution if using this operation to change the resolution of a model.
 Disable adjustResolution if using this operation to change the size of a model.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>factor</code></strong></dt>
-<dd>Scale factor</dd>
+<dd><p>Scale factor</p></dd>
 <dt><strong><code>adjustResolution</code></strong></dt>
-<dd>Enable/disable automatic resolution adjustment</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable automatic resolution adjustment</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8152,11 +8280,14 @@ <h2 id="args">Args</h2>
 <p>Voxels that contained less than 100% material will contain the same material percentages as
 before, but will have varying density. Voxels that contained greater than 100% material
 will be scaled using scaleValues().</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>model2 = model1.scaleNull()</code></p>
-<hr>
-<p>Returns: VoxelModel</p></div>
+<p><span class="docutils literal">model2 = model1.scaleNull()</span></p>
+<p>___</p>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -8193,12 +8324,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Scale a model to fit the given dimensions.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>size</code></strong></dt>
-<dd>Target dimensions in voxels</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Target dimensions in voxels</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8234,11 +8367,14 @@ <h2 id="args">Args</h2>
 <dd>
 <div class="desc"><p>Scale nonzero material values to make all voxels contain 100% material while
 maintaining the ratio between materials.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>model2 = model1.scaleValues()</code></p>
-<hr>
-<p>Returns: VoxelModel</p></div>
+<p><span class="docutils literal">model2 = model1.scaleValues()</span></p>
+<p>___</p>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
+</dl></div>
 <details class="source">
 <summary>
 <span>Expand source code</span>
@@ -8271,12 +8407,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set the center of a model to the specified coordinates.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Target coordinates in voxels</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Target coordinates in voxels</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8304,12 +8442,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set the origin of a model to the specified coordinates.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>coords</code></strong></dt>
-<dd>Target coordinates in voxels</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Target coordinates in voxels</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8332,12 +8472,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set the density of all voxels.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>density</code></strong></dt>
-<dd>Target density value</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Target density value</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8363,17 +8505,19 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set the material of all voxels in a model.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>model2 = model1.getBoundingBox()</code></p>
-<p><code>model3 = model2.setMaterial(2)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model2 = model1.getBoundingBox()</span></p>
+<p><span class="docutils literal">model3 = model2.setMaterial(2)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8411,20 +8555,22 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Set the material of all voxels in a model.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>material_vector = np.zeros(len(materials) + 1)</code></p>
-<p><code>material_vector[0] = 1 # Set a to 1</code></p>
-<p><code>material_vector[3] = 0.3 # Set material 3 to 30%</code></p>
-<p><code>material_vector[4] = 0.7 # Set material 4 to 70%</code></p>
-<p><code>model2 = model1.setMaterialVector(material_vector)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">material_vector = np.zeros(len(materials) + 1)</span></p>
+<p><span class="docutils literal">material_vector[0] = 1 # Set a to 1</span></p>
+<p><span class="docutils literal">material_vector[3] = 0.3 # Set material 3 to 30%</span></p>
+<p><span class="docutils literal">material_vector[4] = 0.7 # Set material 4 to 70%</span></p>
+<p><span class="docutils literal">model2 = model1.setMaterialVector(material_vector)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>material_vector</code></strong></dt>
-<dd>Material mixture vector, format: (a, m0, m1, &hellip; mn)</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>VoxelMode</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material mixture vector, format: (a, m0, m1, &hellip; mn)</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelMode</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8467,28 +8613,26 @@ <h2 id="args">Args</h2>
 <div class="desc"><p>Find the material-wise difference of two models.</p>
 <p>The materials of the result are calculated for each voxel by subtracting the
 second material vector from the first.</p>
-<p>Example &ndash; Subtracting a voxel containing material 3 from the result of the
+<p>Example -- Subtracting a voxel containing material 3 from the result of the
 addition example:</p>
-<blockquote>
-<blockquote>
-<p>Voxel A = [1, 0, 0.5, 0, 0.5]</p>
-<p>Voxel B = [1, 0, 0, 0, 1]</p>
-<p>A - B = [1, 0, 0.5, 0, -0.5]</p>
-<p>Remove negatives (see Cleanup Operations) → [1, 0, 0.5, 0, 0]</p>
-</blockquote>
-</blockquote>
+<p>&gt;&gt; Voxel A = [1, 0, 0.5, 0, 0.5]</p>
+<p>&gt;&gt; Voxel B = [1, 0, 0, 0, 1]</p>
+<p>&gt;&gt; A - B = [1, 0, 0.5, 0, -0.5]</p>
+<p>&gt;&gt; Remove negatives (see Cleanup Operations) → [1, 0, 0.5, 0, 0]</p>
 <p>This operation can also be applied using the subtraction operator (-).</p>
-<hr>
+<hr class="docutils" />
 <p>Examples:</p>
-<p><code>model3 = model1.subtract(model2)</code></p>
-<p><code>model3 = model1 - model2</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model3 = model1.subtract(model2)</span></p>
+<p><span class="docutils literal">model3 = model1 - model2</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>model_to_sub</code></strong></dt>
-<dd>VoxelModel to subtract from self</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>VoxelModel to subtract from self</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8561,25 +8705,27 @@ <h2 id="args">Args</h2>
 <dd>
 <div class="desc"><p>Generate a model representing where support material may be added to an
 object as characterized by the process that is used to remove the supports.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>modelResult = model1.support(Process.LASER)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">modelResult = model1.support(Process.LASER)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>method</code></strong></dt>
-<dd>Target support removal method, set using Process class</dd>
+<dd><p>Target support removal method, set using Process class</p></dd>
 <dt><strong><code>r1</code></strong></dt>
-<dd>Parameter used to determine areas where support is ineffective
-based on proximity to empty regions that are inaccessible to the removal process</dd>
+<dd><p>Parameter used to determine areas where support is ineffective
+based on proximity to empty regions that are inaccessible to the removal process</p></dd>
 <dt><strong><code>r2</code></strong></dt>
-<dd>Desired thickness of the support material</dd>
+<dd><p>Desired thickness of the support material</p></dd>
 <dt><strong><code>plane</code></strong></dt>
-<dd>Directions in which to add support material, set using Axes class</dd>
+<dd><p>Directions in which to add support material, set using Axes class</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8617,12 +8763,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Translate a model by the specified vector.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>vector</code></strong></dt>
-<dd>Translation vector in voxels</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Translation vector in voxels</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8646,12 +8794,14 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Translate a model by the specified vector.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>vector</code></strong></dt>
-<dd>Translation vector in mm</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Translation vector in mm</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8680,17 +8830,19 @@ <h2 id="args">Args</h2>
 <p>The materials from self will take priority in overlapping areas
 of the resulting model. This operation can also be applied using
 the OR operator (|)</p>
-<hr>
+<hr class="docutils" />
 <p>Examples:</p>
-<p><code>model3 = model1.union(model2)</code></p>
-<p><code>model3 = model1 | model2</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model3 = model1.union(model2)</span></p>
+<p><span class="docutils literal">model3 = model1 | model2</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>model_to_add</code></strong></dt>
-<dd>VoxelModel to union with self</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>VoxelModel to union with self</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8739,27 +8891,29 @@ <h2 id="args">Args</h2>
 </code></dt>
 <dd>
 <div class="desc"><p>Generate a model representing the intersection of the supportable region and a user support model.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>modelResult = model1.userSupport(model2, Process.LASER)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">modelResult = model1.userSupport(model2, Process.LASER)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>support_model</code></strong></dt>
-<dd>User provided support model</dd>
+<dd><p>User provided support model</p></dd>
 <dt><strong><code>method</code></strong></dt>
-<dd>Target support removal method, set using Process class</dd>
+<dd><p>Target support removal method, set using Process class</p></dd>
 <dt><strong><code>r1</code></strong></dt>
-<dd>Parameter used to determine areas where support is ineffective
-based on proximity to empty regions that are inaccessible to the removal process</dd>
+<dd><p>Parameter used to determine areas where support is ineffective
+based on proximity to empty regions that are inaccessible to the removal process</p></dd>
 <dt><strong><code>r2</code></strong></dt>
-<dd>Desired thickness of the support material</dd>
+<dd><p>Desired thickness of the support material</p></dd>
 <dt><strong><code>plane</code></strong></dt>
-<dd>Directions in which to add support material, set using Axes class</dd>
+<dd><p>Directions in which to add support material, set using Axes class</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py, set to -1 to use support model material</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material index corresponding to materials.py, set to -1 to use support model material</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8801,24 +8955,26 @@ <h2 id="args">Args</h2>
 <dd>
 <div class="desc"><p>Generate a model representing the scrap material surrounding a model.</p>
 <p>Web can be used in the creation of supports or layer alignment fixtures.</p>
-<hr>
+<hr class="docutils" />
 <p>Example:</p>
-<p><code>modelResult = model1.web(Process.LASER, 1, 5)</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">modelResult = model1.web(Process.LASER, 1, 5)</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>method</code></strong></dt>
-<dd>Target web removal method, set using Process class</dd>
+<dd><p>Target web removal method, set using Process class</p></dd>
 <dt><strong><code>r1</code></strong></dt>
-<dd>Distance from surface of part to inside of web in voxels</dd>
+<dd><p>Distance from surface of part to inside of web in voxels</p></dd>
 <dt><strong><code>r2</code></strong></dt>
-<dd>Width of web in voxels</dd>
+<dd><p>Width of web in voxels</p></dd>
 <dt><strong><code>layer</code></strong></dt>
-<dd>Voxel layer at which to generate web, set to -1 to generate for all layers</dd>
+<dd><p>Voxel layer at which to generate web, set to -1 to generate for all layers</p></dd>
 <dt><strong><code>material</code></strong></dt>
-<dd>Material index corresponding to materials.py</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Material index corresponding to materials.py</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -8854,20 +9010,22 @@ <h2 id="args">Args</h2>
 </details>
 </dd>
 <dt id="voxelfuse.voxel_model.VoxelModel.writeVXCData"><code class="name flex">
-<span>def <span class="ident">writeVXCData</span></span>(<span>self, f: <class 'TextIO'>, compression: bool = False)</span>
+<span>def <span class="ident">writeVXCData</span></span>(<span>self, f: TextIO, compression: bool = False)</span>
 </code></dt>
 <dd>
 <div class="desc"><p>Write geometry and material data to a text file using the .vxc format.</p>
 <p>The VXC/VXA format stores geometry as a 3D grid of single-digit decimal numbers. As such, it is limited to 9
 distinct materials.</p>
-<h2 id="args">Args</h2>
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>f</code></strong></dt>
-<dd>File to write to</dd>
+<dd><p>File to write to</p></dd>
 <dt><strong><code>compression</code></strong></dt>
-<dd>Enable/disable voxel data compression</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code>None</code></dt>
-<dd>&nbsp;</dd>
+<dd><p>Enable/disable voxel data compression</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>None</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -9005,17 +9163,19 @@ <h2 id="args">Args</h2>
 <dd>
 <div class="desc"><p>Find the geometric exclusive or of two models.</p>
 <p>This operation can also be applied using the XOR operator (^)</p>
-<hr>
+<hr class="docutils" />
 <p>Examples:</p>
-<p><code>model3 = model1.xor(model2)</code></p>
-<p><code>model3 = model1 ^ model2</code></p>
-<hr>
-<h2 id="args">Args</h2>
+<p><span class="docutils literal">model3 = model1.xor(model2)</span></p>
+<p><span class="docutils literal">model3 = model1 ^ model2</span></p>
+<hr class="docutils" />
+<h2 id="args">Args:</h2>
 <dl>
 <dt><strong><code>model_2</code></strong></dt>
-<dd>VoxelModel to xor with self</dd>
-<dt><strong><code>Returns</code></strong> :&ensp;<code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_model.VoxelModel">VoxelModel</a></code></dt>
-<dd>&nbsp;</dd>
+<dd><p>VoxelModel to xor with self</p></dd>
+</dl>
+<h2 id="returns">Returns:</h2>
+<dl>
+<dd><p>VoxelModel</p></dd>
 </dl></div>
 <details class="source">
 <summary>
@@ -9210,9 +9370,7 @@ <h4><code><a title="voxelfuse.voxel_model.VoxelModel" href="#voxelfuse.voxel_mod
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/blurred_materials/blurred_materials.html b/docs/voxelfuse_examples/blurred_materials/blurred_materials.html
index 14d0262..c775725 100644
--- a/docs/voxelfuse_examples/blurred_materials/blurred_materials.html
+++ b/docs/voxelfuse_examples/blurred_materials/blurred_materials.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.blurred_materials.blurred_materials API documentation</title>
 <meta name="description" content="Multimaterial 3D printing with blurring/dithering …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -121,9 +123,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/blurred_materials/index.html b/docs/voxelfuse_examples/blurred_materials/index.html
index 8234b3c..1f551df 100644
--- a/docs/voxelfuse_examples/blurred_materials/index.html
+++ b/docs/voxelfuse_examples/blurred_materials/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.blurred_materials API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -57,9 +59,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/dithered_materials/dither_joint.html b/docs/voxelfuse_examples/dithered_materials/dither_joint.html
index a71cf59..e134c2f 100644
--- a/docs/voxelfuse_examples/dithered_materials/dither_joint.html
+++ b/docs/voxelfuse_examples/dithered_materials/dither_joint.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.dithered_materials.dither_joint API documentation</title>
 <meta name="description" content="Material Dithering …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -98,9 +100,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/dithered_materials/dither_structure.html b/docs/voxelfuse_examples/dithered_materials/dither_structure.html
index 79e667c..feb810e 100644
--- a/docs/voxelfuse_examples/dithered_materials/dither_structure.html
+++ b/docs/voxelfuse_examples/dithered_materials/dither_structure.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.dithered_materials.dither_structure API documentation</title>
 <meta name="description" content="Material Dithering …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -92,9 +94,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/dithered_materials/index.html b/docs/voxelfuse_examples/dithered_materials/index.html
index b9b9b97..6bdf5ea 100644
--- a/docs/voxelfuse_examples/dithered_materials/index.html
+++ b/docs/voxelfuse_examples/dithered_materials/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.dithered_materials API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -62,9 +64,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/fish_tail/gcode_pause.html b/docs/voxelfuse_examples/fish_tail/gcode_pause.html
index 0d9a598..2135d5f 100644
--- a/docs/voxelfuse_examples/fish_tail/gcode_pause.html
+++ b/docs/voxelfuse_examples/fish_tail/gcode_pause.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.fish_tail.gcode_pause API documentation</title>
 <meta name="description" content="Add a pause to the input gcode file at the specified voxel layer …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -77,9 +79,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/fish_tail/index.html b/docs/voxelfuse_examples/fish_tail/index.html
index 1b990f4..874c33b 100644
--- a/docs/voxelfuse_examples/fish_tail/index.html
+++ b/docs/voxelfuse_examples/fish_tail/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.fish_tail API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -67,9 +69,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/fish_tail/joint.html b/docs/voxelfuse_examples/fish_tail/joint.html
index c1c6f20..8318d2b 100644
--- a/docs/voxelfuse_examples/fish_tail/joint.html
+++ b/docs/voxelfuse_examples/fish_tail/joint.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.fish_tail.joint API documentation</title>
 <meta name="description" content="Joint with Embedded Servo …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -173,9 +175,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/fish_tail/tail.html b/docs/voxelfuse_examples/fish_tail/tail.html
index a773996..6af7b57 100644
--- a/docs/voxelfuse_examples/fish_tail/tail.html
+++ b/docs/voxelfuse_examples/fish_tail/tail.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.fish_tail.tail API documentation</title>
 <meta name="description" content="Multimaterial fish tail …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -123,9 +125,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/gcode_modification/gcode_modification.html b/docs/voxelfuse_examples/gcode_modification/gcode_modification.html
index e31d533..faa6574 100644
--- a/docs/voxelfuse_examples/gcode_modification/gcode_modification.html
+++ b/docs/voxelfuse_examples/gcode_modification/gcode_modification.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.gcode_modification.gcode_modification API documentation</title>
 <meta name="description" content="Demonstrates removing the header generated by the slicer and replacing it with a header from a template file …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -83,9 +85,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/gcode_modification/index.html b/docs/voxelfuse_examples/gcode_modification/index.html
index 9165e56..33da3b0 100644
--- a/docs/voxelfuse_examples/gcode_modification/index.html
+++ b/docs/voxelfuse_examples/gcode_modification/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.gcode_modification API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -57,9 +59,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/index.html b/docs/voxelfuse_examples/index.html
index b0b5785..4b53db4 100644
--- a/docs/voxelfuse_examples/index.html
+++ b/docs/voxelfuse_examples/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -64,10 +66,6 @@ <h2 class="section-title" id="header-submodules">Sub-modules</h2>
 <dd>
 <div class="desc"></div>
 </dd>
-<dt><code class="name"><a title="voxelfuse_examples.testing" href="testing/index.html">voxelfuse_examples.testing</a></code></dt>
-<dd>
-<div class="desc"></div>
-</dd>
 <dt><code class="name"><a title="voxelfuse_examples.voxelyze_integration" href="voxelyze_integration/index.html">voxelfuse_examples.voxelyze_integration</a></code></dt>
 <dd>
 <div class="desc"></div>
@@ -99,7 +97,6 @@ <h1>Index</h1>
 <li><code><a title="voxelfuse_examples.load_mesh" href="load_mesh/index.html">voxelfuse_examples.load_mesh</a></code></li>
 <li><code><a title="voxelfuse_examples.primitive_generation" href="primitive_generation/index.html">voxelfuse_examples.primitive_generation</a></code></li>
 <li><code><a title="voxelfuse_examples.surface_voxels" href="surface_voxels/index.html">voxelfuse_examples.surface_voxels</a></code></li>
-<li><code><a title="voxelfuse_examples.testing" href="testing/index.html">voxelfuse_examples.testing</a></code></li>
 <li><code><a title="voxelfuse_examples.voxelyze_integration" href="voxelyze_integration/index.html">voxelfuse_examples.voxelyze_integration</a></code></li>
 </ul>
 </li>
@@ -107,9 +104,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/infill/index.html b/docs/voxelfuse_examples/infill/index.html
index 208e492..2978c44 100644
--- a/docs/voxelfuse_examples/infill/index.html
+++ b/docs/voxelfuse_examples/infill/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.infill API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -62,9 +64,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/infill/infill.html b/docs/voxelfuse_examples/infill/infill.html
index eed41f6..7a7d086 100644
--- a/docs/voxelfuse_examples/infill/infill.html
+++ b/docs/voxelfuse_examples/infill/infill.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.infill.infill API documentation</title>
 <meta name="description" content="Infill Generation …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -132,9 +134,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/infill/periodic_element.html b/docs/voxelfuse_examples/infill/periodic_element.html
index 5e81630..b4acd1a 100644
--- a/docs/voxelfuse_examples/infill/periodic_element.html
+++ b/docs/voxelfuse_examples/infill/periodic_element.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.infill.periodic_element API documentation</title>
 <meta name="description" content="Periodic Element Generation …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -98,9 +100,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/lattice_generation/index.html b/docs/voxelfuse_examples/lattice_generation/index.html
index 7bfcb09..3da269e 100644
--- a/docs/voxelfuse_examples/lattice_generation/index.html
+++ b/docs/voxelfuse_examples/lattice_generation/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.lattice_generation API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -57,9 +59,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/lattice_generation/lattice_generation.html b/docs/voxelfuse_examples/lattice_generation/lattice_generation.html
index 86ae3e7..c0708da 100644
--- a/docs/voxelfuse_examples/lattice_generation/lattice_generation.html
+++ b/docs/voxelfuse_examples/lattice_generation/lattice_generation.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.lattice_generation.lattice_generation API documentation</title>
 <meta name="description" content="Lattice structure generation …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -117,9 +119,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/load_mesh/index.html b/docs/voxelfuse_examples/load_mesh/index.html
index ff58176..acc8861 100644
--- a/docs/voxelfuse_examples/load_mesh/index.html
+++ b/docs/voxelfuse_examples/load_mesh/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.load_mesh API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -57,9 +59,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/load_mesh/load_mesh.html b/docs/voxelfuse_examples/load_mesh/load_mesh.html
index 7945021..c3ba7fd 100644
--- a/docs/voxelfuse_examples/load_mesh/load_mesh.html
+++ b/docs/voxelfuse_examples/load_mesh/load_mesh.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.load_mesh.load_mesh API documentation</title>
 <meta name="description" content="Import mesh data …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -88,9 +90,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/primitive_generation/index.html b/docs/voxelfuse_examples/primitive_generation/index.html
index 501325a..c846377 100644
--- a/docs/voxelfuse_examples/primitive_generation/index.html
+++ b/docs/voxelfuse_examples/primitive_generation/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.primitive_generation API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -62,9 +64,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/primitive_generation/primitive_generation.html b/docs/voxelfuse_examples/primitive_generation/primitive_generation.html
index f5591e3..e7b35b3 100644
--- a/docs/voxelfuse_examples/primitive_generation/primitive_generation.html
+++ b/docs/voxelfuse_examples/primitive_generation/primitive_generation.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.primitive_generation.primitive_generation API documentation</title>
 <meta name="description" content="Generate a series of primitive solids …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -90,9 +92,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/primitive_generation/sphere_resources.html b/docs/voxelfuse_examples/primitive_generation/sphere_resources.html
index 3b07734..e49969c 100644
--- a/docs/voxelfuse_examples/primitive_generation/sphere_resources.html
+++ b/docs/voxelfuse_examples/primitive_generation/sphere_resources.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.primitive_generation.sphere_resources API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -137,9 +139,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/surface_voxels/index.html b/docs/voxelfuse_examples/surface_voxels/index.html
index 4b004d6..859901c 100644
--- a/docs/voxelfuse_examples/surface_voxels/index.html
+++ b/docs/voxelfuse_examples/surface_voxels/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.surface_voxels API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -57,9 +59,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/surface_voxels/surface_voxels.html b/docs/voxelfuse_examples/surface_voxels/surface_voxels.html
index 6fd411f..869a2a2 100644
--- a/docs/voxelfuse_examples/surface_voxels/surface_voxels.html
+++ b/docs/voxelfuse_examples/surface_voxels/surface_voxels.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.surface_voxels.surface_voxels API documentation</title>
 <meta name="description" content="Find the surface voxels of a model and output a list of their coordinates …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -90,9 +92,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/voxelyze_integration/basic_sim.html b/docs/voxelfuse_examples/voxelyze_integration/basic_sim.html
index e862ad7..f8736c8 100644
--- a/docs/voxelfuse_examples/voxelyze_integration/basic_sim.html
+++ b/docs/voxelfuse_examples/voxelyze_integration/basic_sim.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.voxelyze_integration.basic_sim API documentation</title>
 <meta name="description" content="Export a simulation that applies forces to two simple objects …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -81,9 +83,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/voxelyze_integration/collision_sim_1.html b/docs/voxelfuse_examples/voxelyze_integration/collision_sim_1.html
index f67deff..d8cf249 100644
--- a/docs/voxelfuse_examples/voxelyze_integration/collision_sim_1.html
+++ b/docs/voxelfuse_examples/voxelyze_integration/collision_sim_1.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.voxelyze_integration.collision_sim_1 API documentation</title>
 <meta name="description" content="Export a simulation of a single falling object …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -77,9 +79,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/voxelyze_integration/collision_sim_2.html b/docs/voxelfuse_examples/voxelyze_integration/collision_sim_2.html
index ed49b89..42b17d1 100644
--- a/docs/voxelfuse_examples/voxelyze_integration/collision_sim_2.html
+++ b/docs/voxelfuse_examples/voxelyze_integration/collision_sim_2.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.voxelyze_integration.collision_sim_2 API documentation</title>
 <meta name="description" content="Export a simulation of multiple falling objects …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -106,9 +108,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/voxelyze_integration/collision_sim_3.html b/docs/voxelfuse_examples/voxelyze_integration/collision_sim_3.html
index 6020404..1a8eb03 100644
--- a/docs/voxelfuse_examples/voxelyze_integration/collision_sim_3.html
+++ b/docs/voxelfuse_examples/voxelyze_integration/collision_sim_3.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.voxelyze_integration.collision_sim_3 API documentation</title>
 <meta name="description" content="Export multiple simulations of a falling object …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -99,9 +101,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/voxelyze_integration/index.html b/docs/voxelfuse_examples/voxelyze_integration/index.html
index 6807f0e..dbfc765 100644
--- a/docs/voxelfuse_examples/voxelyze_integration/index.html
+++ b/docs/voxelfuse_examples/voxelyze_integration/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.voxelyze_integration API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -77,9 +79,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/voxelyze_integration/vxc_export.html b/docs/voxelfuse_examples/voxelyze_integration/vxc_export.html
index cedfeb4..2f866ba 100644
--- a/docs/voxelfuse_examples/voxelyze_integration/vxc_export.html
+++ b/docs/voxelfuse_examples/voxelyze_integration/vxc_export.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.voxelyze_integration.vxc_export API documentation</title>
 <meta name="description" content="Export a VoxelFuse model as a .vxc file that can be imported into VoxCad …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -90,9 +92,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 19256e0..7767ad3 100644
--- a/setup.py
+++ b/setup.py
@@ -8,7 +8,7 @@
 
 setuptools.setup(
     name="voxelfuse",
-    version="1.2.6",
+    version="1.2.7",
     author="Cole Brauer",
     description="A toolkit for processing 3D components made with mixtures of materials and multiple manufacturing processes",
     long_description=long_description,
diff --git a/voxelfuse/__init__.py b/voxelfuse/__init__.py
index 6ef0cdc..43376e3 100644
--- a/voxelfuse/__init__.py
+++ b/voxelfuse/__init__.py
@@ -96,4 +96,4 @@
 """
 
 name = "voxelfuse"
-__version__ = "1.2.6"
\ No newline at end of file
+__version__ = "1.2.7"
\ No newline at end of file


Test patch:
diff --git a/docs/voxelfuse_examples/basic_strength_test_coupon/index.html b/docs/voxelfuse_examples/basic_strength_test_coupon/index.html
index 9b3a751..d80f30a 100644
--- a/docs/voxelfuse_examples/basic_strength_test_coupon/index.html
+++ b/docs/voxelfuse_examples/basic_strength_test_coupon/index.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.basic_strength_test_coupon API documentation</title>
 <meta name="description" content="" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -57,9 +59,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file
diff --git a/docs/voxelfuse_examples/basic_strength_test_coupon/strength_test_coupon.html b/docs/voxelfuse_examples/basic_strength_test_coupon/strength_test_coupon.html
index b1d8a91..a214328 100644
--- a/docs/voxelfuse_examples/basic_strength_test_coupon/strength_test_coupon.html
+++ b/docs/voxelfuse_examples/basic_strength_test_coupon/strength_test_coupon.html
@@ -3,15 +3,17 @@
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
-<meta name="generator" content="pdoc 0.8.2.dev6+g840cf93" />
+<meta name="generator" content="pdoc 0.9.2.dev21+g6d35cca" />
 <title>voxelfuse_examples.basic_strength_test_coupon.strength_test_coupon API documentation</title>
 <meta name="description" content="Generate a coupon for tensile testing …" />
-<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
-<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
-<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
-<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
 <style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
 <style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
 </head>
 <body>
 <main>
@@ -177,9 +179,7 @@ <h1>Index</h1>
 </nav>
 </main>
 <footer id="footer">
-<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.8.2.dev6+g840cf93</a>.</p>
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2.dev21+g6d35cca</a>.</p>
 </footer>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-<script>hljs.initHighlightingOnLoad()</script>
 </body>
 </html>
\ No newline at end of file