Files
blender-portable-repo/scripts/addons/RetopoFlow/retopoflow/html/options_dialog.html
T
2026-03-17 14:30:01 -06:00

636 lines
46 KiB
HTML

<script type="python">
def theme_change(e):
if not e.target.checked: return
if e.target.value is None: return
options['color theme'] = e.target.value
def reset_options(self):
options.reset()
self.update_ui()
self.document.body.dirty(children=True)
def reset_alpha_options(self):
options.reset([
'target alpha point',
'target alpha point selected',
'target alpha point warning',
'target alpha point mirror',
'target alpha point mirror selected',
'target alpha point mirror warning',
'target alpha point highlight',
'target alpha line',
'target alpha line selected',
'target alpha line warning',
'target alpha line mirror',
'target alpha line mirror selected',
'target alpha line mirror warning',
'target alpha poly',
'target alpha poly selected',
'target alpha poly warning',
'target alpha poly mirror',
'target alpha poly mirror selected',
'target alpha poly mirror warning',
], version=False)
self.update_ui()
self.document.body.dirty(children=True)
def update_clip_distances(self, *, rescale=True):
def show_ui_if(ui_id, cond):
ui = self.ui_options.getElementById(ui_id)
ui.style = 'display:block' if cond else 'display:none'
ui.dirty()
ui.dirty_flow()
self.update_clip_settings(rescale=rescale)
ratio = options['clip auto end max'] / options['clip auto start min']
show_ui_if('clip-auto-ratio-warning', ratio > 500000)
# print(ratio)
show_ui_if('clip-auto-options', options['clip auto adjust'] == True)
show_ui_if('clip-options', options['clip auto adjust'] == False)
show_ui_if('fixed-clipping-distances', options['clip override'] == True)
show_ui_if('scaled-clipping-distances', options['clip override'] == False)
def update_hide_overlays(self):
if options['hide overlays']:
self.overlays_hide()
else:
self.overlays_restore()
def mirror_viz_change(e):
if not e.target.checked: return
options['symmetry view'] = e.target.value
def mirror_changed(self):
if not hasattr(self, 'ui_options'): return
s = []
if self.rftarget.mirror_mod.x: s += ['X']
if self.rftarget.mirror_mod.y: s += ['Y']
if self.rftarget.mirror_mod.z: s += ['Z']
if not s: s = ['(none)']
innerText = f'Symmetry: {",".join(s)}'
ui = self.ui_options.getElementById('mirroroptions_summary')
if ui.innerText == innerText: return
ui.innerText = innerText
self.check_target_symmetry()
self.dirty_render()
</script>
<dialog class="framed moveable minimizeable" id="optionsdialog-minimized" on_toggle="self.restore_options_window(event.target)">
<h1>Options</h1>
</dialog>
<dialog id="optionsdialog" class="framed minimizeable moveable" on_toggle="self.minimize_options_window(event.target)">
<h1>Options</h1>
<div class="contents" id='options-contents'>
<details id="generaloptions">
<summary title="General options">General</summary>
<div class="contents">
<details>
<summary title="These options control what runs when RetopoFlow starts and quits">Start Up and Quit</summary>
<div class="contents">
<label>
<input type="checkbox" checked="BoundBool('''options['welcome']''')" title="If enabled, the welcome message is displayed when RetopoFlow starts">
Show Welcome on Start
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['check auto save']''')" title="If enabled, check if Auto Save is disabled at start">
Check Auto Save on Start
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['check unsaved']''')" title="If enabled, check if blend file is unsaved at start">
Check Unsaved on Start
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['confirm tab quit']''')" title="Check to confirm quitting when pressing Tab">
Confirm Quit on Tab
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['escape to quit']''')" title="Check to allow Esc key to quit RetopoFlow">
Escape to Quit
</label>
</div>
</details>
<label>
<input type="checkbox" checked="BoundBool('''options['hide cursor on tweak']''')" title="Check to hide cursor when moving geometry">
Hide Cursor on Grab
</label>
<div class="collection">
<h1>Rip Automerge</h1>
<div class="contents">
<label>
<input type="checkbox" checked="BoundBool('''options['automerge']''')" title="If enabled, grabbed vertices automatically merged with nearby vertices">
Enable Automerge
</label>
<div class="labeled-input-text">
<label for="merge-distance">Merge distance</label>
<input id="merge-distance" type="number" value="BoundInt( '''options['merge dist'] ''')" title="Pixel distance for merging and snapping">
</div>
</div>
</div>
<div class="collection">
<h1 title="These options control the RetopoFlow UI">Interface</h1>
<div class="contents">
<div class="labeled-input-text">
<label for="interface-ui-scale">UI Scale</label>
<input id="interface-ui-scale" type="number" value="BoundFloat('''options['ui scale']''', min_value=0.25, max_value=4)" title="Custom UI scaling setting">
</div>
<label>
<input type="checkbox" checked="self._var_auto_hide_options" title="If enabled, options for selected tool will show while other tool options hide.">
Auto Hide Tool Options
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['show tooltips']''')" title="Check to show tooltips">
Show Tooltips
</label>
<div class="labeled-input-text">
<label for="interface-tooltips-delay">Tooltips Delay</label>
<input id="interface-tooltips-delay" type="number" value="BoundFloat('''options['tooltip delay']''', min_value=0.0)" title="Set delay before tooltips show">
</div>
</div>
</div>
<details>
<summary>Debugging</summary>
<div class="contents">
<div id='fpsdiv'>FPS: 0</div>
<label>
<input type="checkbox" checked="BoundBool('''self.cc_debug_all_enabled''')" title="Check to print all debugging info to text block">
Print All
</label>
<label>
<input type="checkbox" checked="BoundBool('''self.cc_debug_actions_enabled''')" title="Check to print (most) input actions to text block">
Print Actions
</label>
</div>
</details>
<button title="Reset RetopoFlow back to factory settings" on_mouseclick="reset_options(self)">Reset All Settings</button>
</div>
</details>
<details id="display-options">
<summary title="Display options, such as shading theme, selection theme, and clipping.">Viewport Display</summary>
<div class="contents">
<div class="collection">
<h1>Viewport Settings</h1>
<div class="contents">
<label>
<input type="checkbox" checked="BoundBool('''options['hide overlays']''')" on_input="update_hide_overlays(self)" title="If enabled, overlays (source wireframes, grid, axes, etc.) are hidden.">
Hide Overlays
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['hide header panel']''')" title="If enabled, header panel of 3D Viewport is hidden when starting RetopoFlow.">
Hide Header
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['hide panels no overlap']''')" title="If enabled, panels of 3D Viewport are hidden when starting RetopoFlow with region overlap disabled. Enabling this option can cause a slight jump when starting and ending RetopoFlow.">
Hide Panels With No Region Overlap
</label>
<div class="collection">
<h1>Optimize Shading</h1>
<div class="contents">
<label class="third-size">
<input type="radio" name="shading-light" value="light" checked="BoundString('''options['override shading']''')" on_input="self.blender_shading_update()" title="Override shading settings for better performance and use a light matcap">
Light
</label>
<label class="third-size">
<input type="radio" name="shading-dark" value="dark" checked="BoundString('''options['override shading']''')" on_input="self.blender_shading_update()" title="Override shading settings for better performance and use a dark matcap">
Dark
</label>
<label class="third-size">
<input type="radio" name="shading-custom" value="off" checked="BoundString('''options['override shading']''')" on_input="self.blender_shading_update()" title="Do not override shading">
Off
</label>
</div>
</div>
<div class="collection">
<h1>Selection Theme</h1>
<div class="contents">
<label class="third-size">
<input type="radio" id='theme-color-green' name="theme-color" value="Green" checked="BoundString('''options['color theme']''')" on_input="theme_change(event)" title="Draw the target mesh using a green theme.">
Green
</label>
<label class="third-size">
<input type="radio" id='theme-color-blue' name="theme-color" value="Blue" checked="BoundString('''options['color theme']''')" on_input="theme_change(event)" title="Draw the target mesh using a blue theme.">
Blue
</label>
<label class="third-size">
<input type="radio" id='theme-color-orange' name="theme-color" value="Orange" checked="BoundString('''options['color theme']''')" on_input="theme_change(event)" title="Draw the target mesh using a orange theme.">
Orange
</label>
</div>
</div>
<div class="collection">
<h1>Brush Settings</h1>
<div class="contents">
<div class="labeled-input-text">
<label for="brush-min-alpha">Min Alpha</label>
<input id="brush-min-alpha" type="number" value="BoundFloat('''options['brush min alpha']''', min_value=0.0, max_value=1.0)" title="Minimum alpha for Tweak and Relax brushes">
</div>
<div class="labeled-input-text">
<label for="brush-max-alpha">Max Alpha</label>
<input id="brush-max-alpha" type="number" value="BoundFloat('''options['brush max alpha']''', min_value=0.0, max_value=1.0)" title="Minimum alpha for Tweak and Relax brushes">
</div>
</div>
</div>
</div>
</div>
<div class="collection">
<h1>View Clipping</h1>
<div id="view-clipping-options" class="contents" on_visibilitychange="update_clip_distances(self, rescale=False)">
<label>
<input type="checkbox" id="clip-auto-adjust" checked="BoundBool('''options['clip auto adjust']''')" on_input="update_clip_distances(self)" title="If enabled, clipping settings are automatically adjusted based on view distance and bounding box of sources">
Automatically Adjust
</label>
<div id="clip-auto-options" class="show-hide">
<div id="clip-auto-ratio-warning">
WARNING: the ratio of End Maximum over Start Minimum is very large, which can result in odd "snapping" behavior when working inside or very close to the sources. Consider increasing Start Minimum or decreasing End Maximum.
</div>
<div class="labeled-input-text">
<label for="clip-auto-start-mult">Start Factor</label>
<input id="clip-auto-start-mult" type="number" value="BoundFloat('''options['clip auto start mult']''', min_value=0.0001)" on_input="update_clip_distances(self)" title="Multiplying factor for near clipping distance">
</div>
<div class="labeled-input-text">
<label for="clip-auto-start-min">Start Minimum</label>
<input id="clip-auto-start-min" type="number" value="BoundFloat('''options['clip auto start min']''', min_value=0.0005)" on_input="update_clip_distances(self)" title="Minimum value for near clipping distance">
</div>
<div class="labeled-input-text">
<label for="clip-auto-end-mult">End Factor</label>
<input id="clip-auto-end-mult" type="number" value="BoundFloat('''options['clip auto end mult']''', min_value=0.0001)" on_input="update_clip_distances(self)" title="Multiplying factor for far clipping distance">
</div>
<div class="labeled-input-text">
<label for="clip-auto-end-max">End Maximum</label>
<input id="clip-auto-end-max" type="number" value="BoundFloat('''options['clip auto end max']''', min_value=0.0005, max_value=10000)" on_input="update_clip_distances(self)" title="Maximum value for far clipping distance">
</div>
</div>
<div id="clip-options" class="show-hide">
<label>
<input type="checkbox" checked="BoundBool('''options['clip override']''')" on_input="update_clip_distances(self)" title="If enabled, clipping distances will be set to fixed override values rather than scaled.">
Override with Fixed Values
</label>
<div id="scaled-clipping-distances" class="show-hide">
<div class="labeled-input-text">
<label for="clip-start-scaled">Start (scaled)</label>
<input id="clip-start-scaled" type="number" value="BoundFloat('''self.actions.space.clip_start''', min_value=0)" title="Near clipping distance (scaled)">
</div>
<div class="labeled-input-text">
<label for="clip-end-scaled">End (scaled)</label>
<input id="clip-end-scaled" type="number" value="BoundFloat('''self.actions.space.clip_end''', min_value=0)" title="Far clipping distance (scaled)">
</div>
</div>
<div id="fixed-clipping-distances" class="show-hide">
<div class="labeled-input-text">
<label for="clip-start-fixed">Start</label>
<input id="clip-start-fixed" type="number" value="BoundFloat('''options['clip start override']''', min_value=0)" on_input="update_clip_distances(self)" title="Near clipping distance (fixed)">
</div>
<div class="labeled-input-text">
<label for="clip-end-fixed">End</label>
<input id="clip-end-fixed" type="number" value="BoundFloat('''options['clip end override']''', min_value=0)" on_input="update_clip_distances(self)" title="Far clipping distance (fixed)">
</div>
</div>
</div>
</div>
</div>
<div class="collection">
<h1>Target Mesh Drawing</h1>
<div class="contents">
<label>
<input type="checkbox" checked="BoundBool('''options['warn non-manifold']''')" title="Visualize non-manifold/detached vertices and edges">
Non-manifold Outline
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['show pinned']''')" title="Visualize pinned geometry (vertices, edges, polygons). Note: to avoid confusion, pinning is disabled if not showing pinned geometry">
Pinned Geometry
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['show seam']''')" title="Visualize seam edges. Note: to avoid confusion, seam pinning is disabled if not showing seam geometry">
Seam Edges
</label>
<div class="labeled-input-text">
<label for="target-draw-normal-offset">Normal Offset</label>
<input id="target-draw-normal-offset" type="number" value="BoundFloat('''options['normal offset multiplier']''', min_value=0.0, max_value=2.0)" title="Sets how far geometry is pushed in visualization">
</div>
<div class="labeled-input-text">
<label for="target-draw-alpha-above">Alpha Above</label>
<input id="target-draw-alpha-above" type="number" value="BoundFloat('''options['target alpha']''', min_value=0.0, max_value=1.0)" title="Set transparency of target mesh that is above the source">
</div>
<div class="labeled-input-text">
<label for="target-draw-alpha-below">Alpha Below</label>
<input id="target-draw-alpha-below" type="number" value="BoundFloat('''options['target hidden alpha']''', min_value=0.0, max_value=1.0)" title="Set transparency of target mesh that is below the source">
</div>
<div class="labeled-input-text">
<label for="target-draw-vertex-size">Vertex Size</label>
<input id="target-draw-vertex-size" type="number" value="BoundFloat('''options['target vert size']''', min_value=0.1)" title="Draw radius of vertices.">
</div>
<div class="labeled-input-text">
<label for="target-draw-edge-size">Edge Size</label>
<input id="target-draw-edge-size" type="number" value="BoundFloat('''options['target edge size']''', min_value=0.1)" title="Draw width of edges.">
</div>
</div>
<details>
<summary>Individual Alpha Values</summary>
<div class="contents">
<div class="collection">
<h1>Verts</h1>
<div class="contents">
<div class="labeled-input-text">
<label for="indiv-alpha-vert-normal">Normal</label>
<input id="indiv-alpha-vert-normal" type="number" value="BoundFloat('''options['target alpha point']''', min_value=0.0, max_value=1.0)" title='Set transparency of normal target vertices'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-vert-selected">Selected</label>
<input id="indiv-alpha-vert-selected" type="number" value="BoundFloat('''options['target alpha point selected']''', min_value=0.0, max_value=1.0)" title='Set transparency of selected target vertices'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-vert-warning">Warning</label>
<input id="indiv-alpha-vert-warning" type="number" value="BoundFloat('''options['target alpha point warning']''', min_value=0.0, max_value=1.0)" title='Set transparency of warning target vertices'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-vert-mirror">Mirror</label>
<input id="indiv-alpha-vert-mirror" type="number" value="BoundFloat('''options['target alpha point mirror']''', min_value=0.0, max_value=1.0)" title='Set transparency of mirrored target vertices'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-vert-mirror-selected">Mirror Selected</label>
<input id="indiv-alpha-vert-mirror-selected" type="number" value="BoundFloat('''options['target alpha point mirror selected']''', min_value=0.0, max_value=1.0)" title='Set transparency of selected, mirrored target vertices'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-vert-mirror-warning">Mirror Warning</label>
<input id="indiv-alpha-vert-mirror-warning" type="number" value="BoundFloat('''options['target alpha point mirror warning']''', min_value=0.0, max_value=1.0)" title='Set transparency of warning, mirrored target vertices'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-vert-highlight">Highlight</label>
<input id="indiv-alpha-vert-highlight" type="number" value="BoundFloat('''options['target alpha point highlight']''', min_value=0.0, max_value=1.0)" title='Set transparency of highlighted target vertices'>
</div>
</div>
</div>
<div class="collection">
<h1>Edges</h1>
<div class="contents">
<div class="labeled-input-text">
<label for="indiv-alpha-edge-normal">Normal</label>
<input id="indiv-alpha-edge-normal" type="number" value="BoundFloat('''options['target alpha line']''', min_value=0.0, max_value=1.0)" title='Set transparency of normal target edges'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-edge-selected">Selected</label>
<input id="indiv-alpha-edge-selected" type="number" value="BoundFloat('''options['target alpha line selected']''', min_value=0.0, max_value=1.0)" title='Set transparency of selected target edges'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-edge-warning">Warning</label>
<input id="indiv-alpha-edge-warning" type="number" value="BoundFloat('''options['target alpha line warning']''', min_value=0.0, max_value=1.0)" title='Set transparency of warning target edges'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-edge-mirror">Mirror</label>
<input id="indiv-alpha-edge-mirror" type="number" value="BoundFloat('''options['target alpha line mirror']''', min_value=0.0, max_value=1.0)" title='Set transparency of mirrored target edges'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-edge-mirror-selected">Mirror Selected</label>
<input id="indiv-alpha-edge-mirror-selected" type="number" value="BoundFloat('''options['target alpha line mirror selected']''', min_value=0.0, max_value=1.0)" title='Set transparency of selected, mirrored target edges'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-edge-mirror-warning">Mirror Warning</label>
<input id="indiv-alpha-edge-mirror-warning" type="number" value="BoundFloat('''options['target alpha line mirror warning']''', min_value=0.0, max_value=1.0)" title='Set transparency of warning, mirrored target edges'>
</div>
</div>
</div>
<div class="collection">
<h1>Faces</h1>
<div class="contents">
<div class="labeled-input-text">
<label for="indiv-alpha-face-normal">Normal</label>
<input id="indiv-alpha-face-normal" type="number" value="BoundFloat('''options['target alpha poly']''', min_value=0.0, max_value=1.0)" title='Set transparency of normal target faces'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-face-selected">Selected</label>
<input id="indiv-alpha-face-selected" type="number" value="BoundFloat('''options['target alpha poly selected']''', min_value=0.0, max_value=1.0)" title='Set transparency of selected target faces'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-face-warning">Warning</label>
<input id="indiv-alpha-face-warning" type="number" value="BoundFloat('''options['target alpha poly warning']''', min_value=0.0, max_value=1.0)" title='Set transparency of warning target faces'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-face-mirror">Mirror</label>
<input id="indiv-alpha-face-mirror" type="number" value="BoundFloat('''options['target alpha poly mirror']''', min_value=0.0, max_value=1.0)" title='Set transparency of mirrored target faces'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-face-mirror-selected">Mirror Selected</label>
<input id="indiv-alpha-face-mirror-selected" type="number" value="BoundFloat('''options['target alpha poly mirror selected']''', min_value=0.0, max_value=1.0)" title='Set transparency of selected, mirrored target faces'>
</div>
<div class="labeled-input-text">
<label for="indiv-alpha-face-mirror-warning">Mirror Warning</label>
<input id="indiv-alpha-face-mirror-warning" type="number" value="BoundFloat('''options['target alpha poly mirror warning']''', min_value=0.0, max_value=1.0)" title='Set transparency of warning, mirrored target faces'>
</div>
</div>
</div>
<button title="Reset individual alpha settings to default" on_mouseclick="reset_alpha_options(self)">Reset Individual Alpha Settings</button>
</div>
</details>
</div>
</div>
</details>
<details id="selection-options">
<summary title="Options for selection">Selection</summary>
<div class="contents">
<button title="Select everything connected to the current selection" on_mouseclick="self.select_linked()">Select Linked</button>
<label>
<input type="checkbox" checked="BoundBool('''options['selection occlusion test']''')" title="If enabled, target geometry that is occluded by source(s) are not selectable. Disable if a vertex is not selectable." on_change="self.get_accel_visible()">
Block Occluded
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['selection backface test']''')" title="If enabled, geometry that is facing away is not selectable. Disable if a vertex is not selectable." on_change="self.get_accel_visible()">
Block Backface
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['move rotate object if no selection']''')" title="If enabled, viewport orbitting will center on all sources when nothing is selected. Disable to keep orbit center at previous position.">
Center Orbit on Sources
</label>
<details>
<summary title="These options are used to tune the parameters for visibility testing">Advanced</summary>
<div class="contents">
<div class="labeled-input-text">
<label for="advanced-bbox-factor">BBox factor</label>
<input id="advanced-bbox-factor" type="number" value="BoundFloat('''options['visible bbox factor']''', min_value=0.0, max_value=1.0)" on_change="self.get_accel_visible()" title="Factor on minimum bounding box dimension that is added to max distance offset">
</div>
<div class="labeled-input-text">
<label for="advanced-distance-offset">Distance offset</label>
<input id="advanced-distance-offset" type="number" value="BoundFloat('''options['visible dist offset']''', min_value=0.0, max_value=1.0)" on_change="self.get_accel_visible()" title="Offsets target towards the camera when testing occlusion during selection. Increase this if a face appears unselectable">
</div>
<div class="collection">
<h1>Presets</h1>
<div class="contents">
<button title="Preset options for working on tiny objects" class="half-size" on_mouseclick="self.visibility_preset_tiny()">Tiny</button>
<button title="Preset options for working on normal-sized objects" class='half-size' on_mouseclick="self.visibility_preset_normal()">Normal</button>
</div>
</div>
</div>
</details>
</div>
</details>
<details id='target-visibility-options'>
<summary title="Hide/reveal target geometry">Target Visibility</summary>
<div class="contents">
<div class="collection">
<h1>Hide</h1>
<div class="contents">
<button title="Hide all currently selected geometry ({humanread('hide selected')})" class="half-size" on_mouseclick="self.hide_selected()">Selected</button>
<button title="Hide all currently unselected geometry ({humanread('hide unselected')})" class="half-size" on_mouseclick="self.hide_unselected()">Unselected</button>
<br> <!-- this is a hack to make buttons below size correctly -->
<button title="Hide all geometry currently visible" class="half-size" on_mouseclick="self.hide_visible()">Visible</button>
<button title="Hide all geometry currently not visible (obscured, offscreen, etc.)" class="half-size" on_mouseclick="self.hide_nonvisible()">Non-visible</button>
</div>
</div>
<div class="collection">
<h1>Reveal</h1>
<div class="contents">
<button title="Reveal all geometry currently hidden ({humanread('reveal hidden')})" on_mouseclick="self.reveal_hidden()">Reveal Hidden</button>
</div>
</div>
</div>
</details>
<details id='target-cleaning-options'>
<summary title="Clean up target geometry, such as snapping vertices to nearest point on source(s)">Target Cleaning</summary>
<div class="contents">
<div class="collection">
<h1>Snap Vertices</h1>
<div class="contents">
<div class="labeled-input-text">
<label for="push-snap-distance">Push Distance</label>
<input id="push-snap-distance" type="number" value="BoundFloat('''options['push and snap distance']''', min_value=0)" title="Distance to push vertex out along normal before snapping back to source surface.">
</div>
<button title='Snap selected and non-hidden target vertices to nearest point on source(s).' classes="half-size" on_mouseclick="self.push_then_snap_selected_verts()">Selected</button>
<button title='Snap all non-hidden target vertices to nearest point on source(s).' classes="half-size" on_mouseclick="self.push_then_snap_all_verts()">All</button>
</div>
</div>
<div class="collection">
<h1>Merge by Distance</h1>
<div class="contents">
<div class="labeled-input-text">
<label for="merge-by-distance">Distance</label>
<input id="merge-by-distance" type="number" value="BoundFloat('''options['remove doubles dist']''', min_value=0)" title='Distance within which vertices will be merged.'>
</div>
<button title='Merge selected vertices within given distance.' classes='half-size' on_mouseclick="self.remove_selected_doubles()">Selected</button>
<button title='Merge all non-hidden vertices within given distance.' classes='half-size' on_mouseclick="self.remove_all_doubles()">All</button>
</div>
</div>
<div class="collection">
<h1>Normals</h1>
<div class="contents">
<button title="Flip normal of selected faces" class="half-size" on_mouseclick="self.flip_face_normals()">Flip</button>
<button title="Recalculates the normal of selected faces, same as Recalculate Outside (Shift + N) in Edit Mode" class="half-size" on_mouseclick="self.recalculate_face_normals()">Recalculate</button>
</div>
</div>
<div class="collection">
<h1>Symmetry</h1>
<div class="contents">
<button title="Select vertices that are on the wrong side of symmetry plane" on_mouseclick="self.select_bad_symmetry()">Select Bad Symmetry</button>
<button title="Flip vertices that are on the wrong side of symmetry plane" on_mouseclick="self.flip_symmetry_verts_to_correct_side()">Flip Bad Symmetry</button>
</div>
</div>
</div>
</details>
<details id='target-pinning'>
<summary title="Target pinning options">Pinning / Seams</summary>
<div class="contents">
<div class="collection">
<h1>Geometry Pinning</h1>
<div class="contents">
<label class="pin-enable">
<input type="checkbox" checked="BoundBool('''options['pin enabled']''')" title="Check to enable geometry pinning, where pinned geometry cannot be moved. Note: to avoid confusion, pinning is disabled if not showing pinned geometry">
Enabled
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['show pinned']''')" title="Visualize pinned geometry (vertices, edges, polygons). Note: to avoid confusion, pinning is disabled if not showing pinned geometry">
Show
</label>
<button title="Pin selected geometry" on_mouseclick="self.pin_selected()">Pin Selected</button>
<button title="Unpin selected geometry" on_mouseclick="self.unpin_selected()" class="half-size">Unpin Selected</button>
<button title="Unpin all geometry" on_mouseclick="self.unpin_all()" class="half-size">Unpin All</button>
</div>
</div>
<div class="collection">
<h1>Seams</h1>
<div class="contents">
<label class="pin-seams">
<input type="checkbox" checked="BoundBool('''options['pin seam']''')" title="Check to pin seams, where seam edges cannot be moved. Note: to avoid confusion, seam pinning is disabled if not showing seams">
Pin
</label>
<label>
<input type="checkbox" checked="BoundBool('''options['show seam']''')" title="Visualize seam edges. Note: to avoid confusion, seam pinning is disabled if not showing seams">
Show
</label>
<button title="Mark selected edges as seam" on_mouseclick="self.mark_seam_selected()" class="half-size">Mark Selected</button>
<button title="Unmark selected edges as seam" on_mouseclick="self.clear_seam_selected()" class="half-size">Clear Selected</button>
</div>
</div>
</div>
</details>
<details id="mirror-options">
<summary id="mirroroptions_summary" title="Mirroring options" on_load='mirror_changed(self)'>Symmetry</summary>
<div class="contents">
<label class="mirror-enable">
<input type="checkbox" checked="BoundBool('''self.rftarget.mirror_mod.x''')" on_input="mirror_changed(self)" title="Check to mirror along x-axis">
x
</label>
<label class="mirror-enable">
<input type="checkbox" checked="BoundBool('''self.rftarget.mirror_mod.y''')" on_input="mirror_changed(self)" title="Check to mirror along y-axis">
y
</label>
<label class="mirror-enable">
<input type="checkbox" checked="BoundBool('''self.rftarget.mirror_mod.z''')" on_input="mirror_changed(self)" title="Check to mirror along z-axis">
z
</label>
<div class="collection">
<h1>Visualization</h1>
<div class="contents">
<label class='fourth-size'>
<input type="radio" id='mirror-viz-none' name='mirror-viz' value='None' checked="BoundString('''options['symmetry view']''')" on_input="mirror_viz_change(event)" title='If checked, no mirror will be visualized, even if mirror is enabled (above). This setting will improve overall performance when working with very large source mesh(es).'>
None
</label>
<label class='fourth-size'>
<input type="radio" id="mirror-viz-plane" name="mirror-viz" value="Plane" checked="BoundString('''options['symmetry view']''')" on_input="mirror_viz_change(event)" title='If checked, mirror will be visualized by drawing the mirror planes as colored quads. This setting will improve overall performance when working with very large source mesh(es).'>
Plane
</label>
<label class='fourth-size'>
<input type="radio" id="mirror-viz-edge" name="mirror-viz" value="Edge" checked="BoundString('''options['symmetry view']''')" on_input="mirror_viz_change(event)" title='If checked, mirror will be visualized as a line, the intersection of the source meshes and the mirroring plane(s).'>
Edge
</label>
<label class='fourth-size'>
<input type="radio" id="mirror-viz-face" name="mirror-viz" value="Face" checked="BoundString('''options['symmetry view']''')" on_input="mirror_viz_change(event)" title='If checked, mirror will be visualized by coloring the mirrored side of source mesh(es).'>
Face
</label>
<div class="labeled-input-text">
<label for="visualization-source-effect">Source Effect</label>
<input id="visualization-source-effect" type="number" value="BoundFloat('''options['symmetry effect']''', min_value=0.0, max_value=1.0)" title="Effect of mirror source visualization"> <!-- scrub -->
</div>
<input type="range" value="BoundFloat('''options['symmetry effect']''', min_value=0.0, max_value=1.0)">
<div class="labeled-input-text">
<label for="visualization-target-effect">Target Effect</label>
<input id="visualization-target-effect" type="number" value="BoundFloat('''options['target alpha mirror']''', min_value=0.0, max_value=1.0)" title="Factor for alpha of mirrored target visualization"> <!-- scrub -->
</div>
<input type="range" value="BoundFloat('''options['target alpha mirror']''', min_value=0.0, max_value=1.0)">
</div>
</div>
<label>
<input type="checkbox" checked="BoundBool('''options['symmetry mirror input']''')" title='If checked, input will be mirrored to "correct" side of symmetry. Otherwise it will be clamped or clipped.'>
Mirror Input
</label>
<div class="collection">
<h1>Merge / Apply</h1>
<div class="contents">
<div class="labeled-input-text">
<label for="merge-apply-threshold">Threshold</label>
<input id="merge-apply-threshold" type="number" value="BoundFloat('''self.rftarget.mirror_mod.symmetry_threshold''', min_value=0.0, step_size=0.00001)" title='Distance within which mirrored vertices will be merged'> <!-- scrub -->
</div>
<button title="Apply mirror symmetry to target mesh" on_mouseclick="self.apply_mirror_symmetry()">Apply Mirror</button>
</div>
</div>
<div class="collection">
<h1>Cleaning</h1>
<div class="contents">
<button title="Select vertices that are on the wrong side of symmetry plane" on_mouseclick="self.select_bad_symmetry()">Select Bad Symmetry</button>
<button title="Flip vertices that are on the wrong side of symmetry plane" on_mouseclick="self.flip_symmetry_verts_to_correct_side()">Flip Bad Symmetry</button>
</div>
</div>
</div>
</details>
</div>
</dialog>