No Branch/Tag Specified
main
refactor-mesh-face-generic
blender-v3.3-release
refactor-mesh-corners-generic
refactor-mesh-sharp-face-generic
gpencil-new-data-proposal
overlay-next
temp-sculpt-roll-mapping
sculpt-dev
tmp-volume-matrix-api-update
tmp-eevee-shadow-commit-mp
universal-scene-description
cycles_path_guiding
temp-vulkan-descriptor-sets
tmp-eevee-shadow-commit
temp-angavrilov
asset-shelf
brush-assets-project
tmp-workbench-rewrite2
temp-T101739-fix-seam-bleeding-non-manifold
tmp-mak-012623
temp-bundled-assets
asset-lite-greasepencil
temp-pbvh-split
temp-pbvh-texpaint-automasking
microfacet_hair
tmp-worbench-rewrite2-optimizations
temp-offset-array-ref
blender-v2.93-release
blender-projects-basics
temp-pbvh-seam-texturing-tweaks
temp-nodes-group-declarations
refactor-mesh-sharp-edge-generic
temp-asset-library-all
refactor-mesh-uv-map-generic
refactor-mesh-position-generic
temp-T102440
temp-rbf-pose-blender
geometry-nodes-tetrahedralization
nodes-matrix-types
temp-xr-painting
blender-v3.4-release
geometry-nodes-simulation
bli-matrix-template
temp-linux-35x-libs
refactor-mesh-corner-normals-lazy
temp-py-gpubatch-draw-advanced
xr-dev
temp-vulkan-shader
bevelv2
soc-2022-soft-bodies
arcpatch-D16436
tmp-dynamic-usd
temp-image-engine
tmp-vfx-platform-2023
soc-2022-many-lights-sampling
tracking_tools
nla-scale-fix
principled-v2
temp-ui-cpp
temp-ghost-vulkan
tmp-libs-2.93-lts
temp-T97352-3d-texturing-seam-bleeding-b2
temp-xr-virtual-camera-experiment
temp-vse-retiming-tool
gpencil-next
temp-sculpt-brush-channel
asset-browser-grid-view
temp-asset-representation
temp-gpencil-automask
tmp_libs_34
temp-T101905-gpu-backend-argument
node-add-asset-menu
temp-collection-objects-link-multiple
temp-texture-painting-gpu
tmp-workbench-perf-experiment
tmp_usd_import_unbound_mtls
tmp-drw-split-matrix
temp-sculpt-normals-masking
temp-sculpt-cavity-mask
temp-pbvh-vbos
tmp-usd-alab-v2-T100452
refactor-mesh-selection-generic
temp-T96708-brush-texture-refactoring
temp-chunk-list
feature-imformat
temp-geometry-nodes-evaluator-refactor
refactor-mesh-bevel-weight-generic
temp-chunked-list
temp-outliner-new-element-storage
refactor-mesh-remove-pointers
soc-2022-text-usability
refactor-mesh-material-index-generic
drw-manager-next
refactor-mesh-hide-generic
blender-v3.2-release
sculpt_curve_collisions
temp-anim-editors-redo-panel-D14960-D14977
retopo_transform
temp-libepoxy
temp-T99046-platform-reference-images
geometry-nodes-rigid-body-integration
file-browser-grid-view
temp-legacy-mesh-format-option
arcpatch-D14645
soc-2022-waveform-drawing
temp-T95933-object-mode-curve-selection
temp-deform-curves-on-surface
cycles_oneapi
temp-viewport-compositor-merge
temp-texpaint-automasking
temp-deform-curves-with-surface
asset-greasepencil
temp-T99046-render-test-increase-fail-threshold
temp-T98708-gpu-conservative-depth
lineart-shadow
temp-lineart-contained
cleanup-id-override-const
temp-T98375-share-gpu-textures
wintab
temp-T97352-3d-texturing-seam-bleeding
temp-T97905-compositor-meta-data
lineart-cas-2
temp-T97272
temp-T97907-compositor-meta-data
temp-T96952
tmp-usd-mak-c87f6242
temp-outliner-library-override-hierarchy
lineart-object-load
tmp-eevee-next-merge
draw-deferred-compilation-experiment
soc-2021-porting-modifiers-to-nodes-remesh-voxel
blender-v2.83-release
tmp_lib_update_32
temp-mesh-cpp
temp-viewport-compositor-compiler
temp-T96710-pbvh-pixels
tmp-new-gpu-codegen
devirtualizer
temp-T96709-painting-target
temp-collection-assets
temp-lineart-embree
temp-multi-function-eval-varray
temp-sculpt-colors
soc-2021-curves
blender-v3.1-release
temp-vertex-paint
temp-vse-channels-edge-panning
eevee-rewrite
temp-library-overrides-outliner
cycles_hydra
temp-3d-texturing-brush-b
temp-abc-features
tmp-transform-navigate
temp-image-buffer-rasterizer
soc-2021-porting-modifiers-to-nodes-remesh-blocks
temp-3d-texture-brush-prototype
temp-fix-normals-custom-data
viewport-compositor
bli-math-basic-types
soc-2021-simulation-display
greasepencil-object
temp-license-header-spdx
KTX_support
gsoc-2021-porting-modifiers-to-nodes-solidify
2d
gltf_vtree
soc-2021-porting-modifiers-to-nodes-decimate
temp-T95279-remap-referenced-data
temp-gpu-image-engine
tmp-eevee-rewrite-compilation-error
draw-viewport-data
temp-T94900-b
temp-T94900-gpu-viewport-default-layers
temp-T94185-id-remapper-ui
tmp-workbench-shader-create-infos
blender-v3.0-release
temp-geometry-nodes-extrude-mesh
tmp-T95052
tmp-gpu-polyline-shaders
tmp-gpu-shader-descriptor-2
temp-usd-prev-export2
tmp-core-id-remap-test-cases
temp-vert-normals-cleanup
temp-move-geometry-to-cpp
tmp-vector-template
drw-gpu-wrapper
temp-geometry-nodes-extrude-and-scale
temp-scale-elements-node-test
temp-usd-udim-import
temp-copy-on-write
temp-T94185-id_remapping-experiment-a
temp-llvm-testing
nurbs-opencascade
temp-usd-preview-surf-export
soc-2021-uv-edge-select-support
T93558
temp-gpu-texture-partial-updates
gpu-shader-descriptor
temp-geometry-nodes-text
tmp-vulkan
temp-T90535-usd-alab-material-import
node-tree-update-refactor
temp-sample-sound-node
temp-interface-region-search-cpp
temp-enum-socket
temp-link-portals
temp-unity-build-test
geometry-nodes-level-set-nodes
temp-virtual-array-value-type
soc-2020-io-performance
studio-sprite-fright
temp-cycles-source-reorganize
asset-browser-snap-dragging
temp-python-zstandard
soc-2021-porting-modifiers-to-nodes-merge-by-distance
temp-compositor-cleanups
temp-eevee-gpencil-rewrite
temp-vse-handles
temp-ui-tweaks
xr-controller-support
temp-node-common-cpp
temp-varray-get-set-multiple
soc-2021-uv-editor-improvements
temp-geometry-nodes-output-attributes
soc-2021-knife-tools
temp_test_sc_keymap
cycles-x
temp-field-visualization
soc-2021-curve-fillet
temp_bmesh_multires
temp-cocoa-scroll-acceleration-fix
temp-socket-decl-refactor
fluid-mantaflow-gpu
soc-2021-vse-strip-thumbnails
temp-noise-nodes-cpp
temp-compositor-canvas
T90952
temp-parallel-multi-function
temp-geometry-nodes-fields
grab_walk_fix
soc-2021-adaptive-cloth
temp-geometry-nodes-fields--fields-jacques
temp-cpp-ghc-filesystem
temp-geometry-nodes-fields--fields
temp-geometry-nodes-fields--anonymous-attributes
refactor-idprop-ui-data
compositor-full-frame
temp-runtime-node-def
temp-geometry-nodes-fields-prototype-visualization
temp-geometry-nodes-fields-prototype
temp-multi-function-procedure
soc-2021-porting-modifiers-to-nodes_all
cycles_texture_cache
experimental-build
cycles_procedural_api
soc-2021-porting-modifiers-to-nodes-extrude-and-move
soc-2021-porting-modifiers-to-nodes-extrude
temp-geometry-nodes-expandable-geometry-socket-prototype
fluid-mantaflow-2d
windows_make_docpy
usd-importer-T81257-merge
nodes-update-readonly-tag
geometry-nodes-closest-points
tmp-buildbot-gcc-10
soc-2021-geometry-nodes-regression-test
node-group-single-socket-nodes
curve-nodes-modifier
temp-geometry-nodes-curve-sample
geometry-nodes-unnamed-attributes
temp-nodes-intersect-alt-key
tmp_arcpath-D11868
refactor-vertex-group-names
temp-gpencil-bezier-stroke-type
temp-gpu-uniform-builtin-structs
wintab_fallback_walknav
temp-socket-inspection
temp-long-link-dimming
fixed_width_integers
lineart-bvh
temp-gpencil-camera-reproject
temp-gpu-push-constants
temp-attribute-processor
temp-cpp-type-cleanup
temp-geometry-nodes-curve-deform-node
wintab-logging
fix-tablet-walk
geometry-nodes-raycast
temp-spreadsheet-row-filter
lineart-fn-cached
temp-compact-node-prototype
asset-browser
geometry-nodes-curve-to-points-node
node-editor-edge-pan
eevee-gpencil
asset-system-filelist
temp-geometry-nodes-viewer-node
lineart-fn-thread-loading
tmp-buildbot-cleanup
temp-gpencil-masking
temp-ffmpeg-4.4
temp-attributes-panel
profiler-editor
FixT87160_DSE_Channel_Selection
temp-interface-cpp
geometry-nodes-curve-support
info-editor-cpp
temp-attribute-transfer-node
virtual-array-attributes
temp-pose-slide-D9054
spreadsheet-active-node
ui-asset-view-template
temp-node-tree-pages-prototype
override-outliner-view
temp-geometry-nodes-processor-prototype
temp-any-instead-of-variant
temp-unreachable-abort
temp-spreadsheet-instances
temp-geometry-nodes-instances-api-v2
temp-geometry-nodes-instances-attributes
geometry-nodes-mesh-primitives
temp-asset-tools-prototype
temp-geometry-nodes-mesh-primitive-line
lanpr-under-gp
temp_D10504-2_nla_keyframe_remap_upper_strips
blender-v2.92-release
usd-importer-T81257
temp-spreadsheet-editor-python-prototyping
temp-spreadsheet-editor
override-refactor-tmp-2
temp-derived-node-tree-refactor
T85799
tracking_scopes
temp-icons-fixes
temp_D10504_nla_keyframe_remap_upper_strips
temp-weight_mirror
temp_T76472_graph_editor_fcurve_extrapolation
eevee-closure-lib-cleanup
eevee-dof-refactor
eevee-probe-roughness-fix
eevee-ggx-lut-fix
df0bce3f7d0
temp-geometry-nodes-instances-api
tmp-ocio-v2
temp-nodes-redesign
tracking_proportional_editing_v2
blender-v2.91-release
temp-uv-face-select-no-thresh-when-inside
temp-D10103-nla_support_strip_overlap_during_transform
fracture_modifier
temp-point-distribution-refactor-experiment
temp-experimental-cpp-math-refactor
vfx-clip-ui-update
tmp-T82230-nla_remove_hold_reset_behavior
temp-D8687-directly_select_fcurves
geometry-nodes
soc-2020-testing-frameworks
geometry-nodes-point-separate-node
temp-nla-strip-alignment
temp-atomics-int16
geometry-nodes-deduplicate-float-math
asset-metadata
geometry-nodes-active-modifier-drawing
attribute-accessor
geometry-nodes-attribute-nodes
temp-T82588-box-select-invisible-keys
greasepencil-edit-curve
codesign_error_tracker
outliner-cpp-refactor
temp-fix-headerless-panels-switch-windows
temp-gpencil-fading-modifier
temp-D8915-copy-rotation-remove-sheer
geometry-nodes-boolean-node
temp-T81874-box-select-active-keyframe
geometry-nodes-transform-node
temp-trimesh-sculpt
geometry-tree-evaluation
fcurve-modifier-panels
temp-fcurve-key-insert-follow-curve
temp-fcurve-active-keyframe-D7737
mesh-to-volume-modifier
blender-v2.90-release
soc-2020-fluid-tools
property-search-ui-v2
tmp-T80603
soc-2020-greasepencil-curve
tmp-gldebuglayer
tmp-gltexture
soc-2020-custom-menus
active-fcurve-keyframe
soc-2020-soft-body
newboolean
fail-on-memleak
soc-2020-outliner
soc-2020-production-ready-light-tree-2
soc-2020-info-editor
property-search-ui
temp-ui-button-type-refactor
soc-2020-production-ready-light-tree
particle-solver-dev
tmp-gpu-context-isolation
soc-2020-xr-input
temp-remesh-octree
mac_arm64
tmp-eevee-glsl-cleanup
tmp-pointcloud-render
buildbot-lts
asset-engine--archived
asset-uuid--archived
eevee-motionblur-object
modifier-panels-ui
temp-cycles-tbb
wm-drag-drop-rewrite
temp-lanpr-review
gsoc-2018-many-light-sampling
tmp-eevee-material-refactor
tmp-widget-opti
tmp-texture-sampler
xr-world-navigation
blender-v2.82-release
node-tree-ref
simulation-access-modifier
blenloader-decentralization
temp-test-point-cloud-simulation-depsgraph-integration
functions
builtin-simulation-nodes
performance-test
obj-import-experiments
soc-2019-openxr
vr_scene_inspection
blenloader-api
tmp-workbench-rewrite
id-ensure-unique-memory-address
simulation-tree
greasepencil-refactor
draw-colormanagement
temp-gizmo-decoupled-redraws
fluid-mantaflow
blender-v2.81-release
tmp-overlay-engine
soc-2019-bevel-profiles
temp-npr-gpencil-modifiers
soc-2019-npr
temp-gpencil-drw-engine
soc-2019-embree-gpu
temp-npr-smooth-contour
temp-lanpr-staging
filebrowser_redesign
tmp-eevee-shadowmap-refactor
vamr-openxr-module
sculpt-mode-features
soc-2019-adaptive-cloth
tmp-drw-callbatching
soc-2019-outliner
soc-2019-cycles-procedural
temp-D5423-update
temp-vr-draw-thread
blender-v2.80-release
tmp-batch-cache-cleanup
soc-2019-fast-io
temp-toolsystem-multiwindow
blender2.7
collada
soc-2018-npr
temp-keymap-industry-compat
temp-fracture-modifier-2.8
temp-dna-rename
userpref_redesign
hair_object
motion_curve_fix
collada2.8
cycles_embree
interactive_physics
temp-ui-layout-2.8
cloth-improvements
soc-2018-cycles-volumes
hair_guides_grooming
hair_guides
benchmark
soc-2018-bevel
soc-2018-hair-shader-fixes
temp-udim-images
soc-2018-hair-shader
temp-volume-object
cycles_cryptomatte
temp-eeveelightcache
temp-tab_drag_drop
temp-keymap-save
temp-dynamic-overrides
fracture_modifier-master
ui_layout_gridflow
temp-keymap-changes
tmp-CollectionsAnim
tmp-b28-motionpath-drawing
uv_unwrapping_slim_algorithm
blender-v2.79b-release
tmp-COW_InsertKeyframe_Fix
temp-unified-collections
temp-modifier-rm-cddm
tmp-TimelineHeaderButtonsStretching
blender2.8-workbench
soc-2017-normal-tools
cycles_bvh8
blender-v2.79a-release
temp-scene-obedit-remove
temp-workspace-object-mode-removal
blender-v2.79-release
soc-2017-sculpting_brush
split-kernel-faster-building
id_override_static
openvdb
custom-manipulators
soc-2016-uv_tools
soc-2016-pbvh-painting
soc-2017-vertex_paint
soc-2017-sculpting_improvements
soc-2017-package_manager
strand_editmode
smooth-fcurves
id_copy_refactor
gsoc2016-improved_extrusion
temp-ssr
temp-cycles-opencl-staging
temp-cycles-denoising
ge_2df_textures
HMD_viewport
soc-2016-multiview
transform-manipulators
datablock_idprops
cycles_disney_brdf
temp_cycles_split_kernel
cycles_split_kernel
unlock_task_scheduler
uv_unwrapping_slim_and_ceres
surface-deform-modifier
cycles-tiles-rework
soc-2016-cycles_denoising
temp-layers-ui-table
uiTable
render-layers
clay-engine
multi_previews_id
cycles_disney_bsdf_transmittance
layers
pbr-viewport
temp_display_optimization
viewport_bvh_select
temp-cycles-microdisplacement
soc-2016-cycles_images
strand_nodes
object_nodes
asset-experiments
soc-2016-sculpt_tools
temp_viewport_fx_merge
custom-normals-bmesh
temp-decklink
compositor-2016
decklink
BendyBones
cycles_panorama_experiments
temp_remove_pointcache
temp_remove_particles
temp_depsgraph_split_ubereval
temp_textedit_comment_toggling
GPencil_Editing_Stage3
temp_bge_moto
UI-experiments
UI-graphical-redesign
missing-libs
free-refcount-ids
cycles_camera_nodes
epic-navigation
temp-ui-widget-refactor
gooseberry_farm
gooseberry
temp-ghash-experiments
temp-ghash-setops
temp_motionpaths
fcurves-simplify
soc-2014-fluid
GPU_data_request
depsgraph_refactor
multiview
vertex_paint_pbvh
alembic_pointcache
cycles-ptex-49
viewport_experiments
soc-2014-bge
texture_nodes_refactor
input_method_editor
GPencil_EditStrokes
soc-2014-shapekey
terrible_consequencer
GPencil_FillStrokes
libmv_prediction
blender2.4
dyntopo_holes
soc-2014-viewport_context
gtest-staging
blender-tiles
soc-2014-viewport_fx
soc-2014-remesh
soc-2014-nurbs
pie-menus
soc-2014-cycles
soc-2013-paint
particles_refactor
soc-2013-viewport_fx
tiles-scheduler
bake-cycles
soc-2013-cycles_volume
overscan
soc-2013-depsgraph_mt
soc-2013-dingto
soc-2013-sketch_mesh
soc-2013-rigid_body_sim
soc-2011-tomato
soc-2013-bge
soc-2013-motion_track
soc-2013-ui_replay
soc-2012-sushi
ge_dev
soc-2013-depsgraph_eval
soc-2008-mxcurioni
soc-2012-bratwurst
soc-2012-swiss_cheese
soc-2012-fried_chicken
meshdata_transfer
smoke2
tile
soc-2011-cucumber
bmesh
soc-2011-carrot
cycles
soc-2011-garlic
soc-2011-radish
soc-2010-nicks
vgroup_modifiers
soc-2011-pepper
soc-2010-jwilkins
merwin-spacenav
bge_components
soc-2010-merwin
render25
soc-2010-nicolasbishop
soc-2009-chingachgook
soc-2010-nexyon
soc-2010-aligorith
ge_eigen2
sculpt25
soc-2009-jaguarandi
soc-2009-imbusy
soc-2009-kazanbas
blender2.5
volume25
soundsystem
soc-2009-aligorith
sim_physics
ge_dome
etch-a-ton
soc-2008-nicholasbishop
animsys2
projection-paint
harmonic-skeleton
soc-2008-jaguarandi
fluidcontrol
apricot
soc-2008-quorn
cloth
ndof
orange
v2.93.14
v3.3.3
v2.93.13
v2.93.12
v3.4.1
v3.3.2
v3.4.0
v3.3.1
v2.93.11
v3.3.0
v3.2.2
v2.93.10
v3.2.1
v3.2.0
v2.83.20
v2.93.9
v3.1.2
v3.1.1
v3.1.0
v2.83.19
v2.93.8
v3.0.1
v2.93.7
v3.0.0
v2.93.6
v2.93.5
v2.83.18
v2.93.4
v2.93.3
v2.83.17
v2.93.2
v2.93.1
v2.83.16
v2.93.0
v2.83.15
v2.83.14
v2.83.13
v2.92.0
v2.83.12
v2.91.2
v2.83.10
v2.91.0
v2.83.9
v2.83.8
v2.83.7
v2.90.1
v2.83.6.1
v2.83.6
v2.90.0
v2.83.5
v2.83.4
v2.83.3
v2.83.2
v2.83.1
v2.83
v2.82a
v2.82
v2.81a
v2.81
v2.80
v2.80-rc3
v2.80-rc2
v2.80-rc1
v2.79b
v2.79a
v2.79
v2.79-rc2
v2.79-rc1
v2.78c
v2.78b
v2.78a
v2.78
v2.78-rc2
v2.78-rc1
v2.77a
v2.77
v2.77-rc2
v2.77-rc1
v2.76b
v2.76a
v2.76
v2.76-rc3
v2.76-rc2
v2.76-rc1
v2.75a
v2.75
v2.75-rc2
v2.75-rc1
v2.74
v2.74-rc4
v2.74-rc3
v2.74-rc2
v2.74-rc1
v2.73a
v2.73
v2.73-rc1
v2.72b
2.72b
v2.72a
v2.72
v2.72-rc1
v2.71
v2.71-rc2
v2.71-rc1
v2.70a
v2.70
v2.70-rc2
v2.70-rc
v2.66
v2.63
v2.60
v2.59
v2.58a
v2.58
v2.57b
v2.57a
v2.56a
v2.55
v2.45
softbody-stable-v1
softbody-stable-v2
softbody-stable-v3
v2.25
v2.26
v2.27
v2.28
v2.28a
v2.28c
v2.30
v2.31
v2.31a
v2.32
v2.33
v2.33a
v2.34
v2.35
v2.35a
v2.36
v2.37
v2.37a
v2.40
v2.41
v2.42
v2.42a
v2.43
v2.44
v2.46
v2.47
v2.48
v2.48a
v2.49
v2.49a
v2.49b
v2.50
v2.51
v2.52
v2.53
v2.54
v2.56
v2.57
v2.60a
v2.61
v2.63a
v2.64
v2.64a
v2.65
v2.65a
v2.66a
v2.67
v2.67a
v2.67b
v2.68
v2.68a
v2.69
Labels
Apply labels
Clear labels
Interest/Alembic
Interest/Animation & Rigging
Interest/Asset Browser
Interest/Asset Browser Project Overview
Interest/Audio
Interest/Automated Testing
Interest/Blender Asset Bundle
Interest/Collada
Interest/Compositing
Interest/Core
Interest/Cycles
Interest/Datablocks and Libraries
Interest/Dependency Graph
Interest/Development Management
Interest/Eevee
Interest/Eevee & Viewport
Interest/Freestyle
Interest/Geometry Nodes
Interest/Grease Pencil
Interest/Images & Movies
Interest/Import/Export
Interest/Line Art
Interest/Masking
Interest/Modeling
Interest/Modifiers
Interest/Motion Tracking
Interest/Overrides
Interest/Performance
Interest/Pipeline, Assets & I/O
Interest/Translations
Interest/Undo
Interest/USD
Interest/Video Sequencer
legacy module/Animation & Rigging
legacy module/Core
legacy module/Development Management
legacy module/Eevee & Viewport
legacy module/Grease Pencil
legacy module/Modeling
legacy module/Nodes & Physics
legacy module/Pipeline, Assets & IO
legacy module/Platforms, Builds, Tests & Devices
legacy module/Python API
legacy module/Rendering & Cycles
legacy module/Sculpt, Paint & Texture
legacy module/Triaging
legacy module/User Interface
legacy module/VFX & Video
legacy project/1.0.0-beta.2
legacy project/Asset Browser (Archived)
legacy project/BF Blender: 2.8
legacy project/BF Blender: After Release
legacy project/BF Blender: Next
legacy project/BF Blender: Regressions
legacy project/BF Blender: Unconfirmed
legacy project/Blender 2.70
legacy project/Code Quest
legacy project/Game Animation
legacy project/Game Audio
legacy project/Game Data Conversion
legacy project/Game Engine
legacy project/Game Logic
legacy project/Game Physics
legacy project/Game Python
legacy project/Game Rendering
legacy project/Game UI
legacy project/GPU / Viewport
legacy project/GSoC
legacy project/Infrastructure: Websites
legacy project/LibOverrides - Usability and UX
legacy project/Milestone 1: Basic, Local Asset Browser
legacy project/Nodes
legacy project/Nodes & Physics
legacy project/OpenGL Error
legacy project/Papercut
legacy project/Performance
legacy project/Physics
legacy project/Platforms, Builds, Tests & Devices
legacy project/Pose Library Basics
legacy project/Python API
legacy project/Render & Cycles
legacy project/Render Pipeline
legacy project/Retrospective
legacy project/Sculpt, Paint & Texture
legacy project/Text Editor
legacy project/Tracker Curfew
legacy project/Triaging
legacy project/User Interface
legacy project/UV Editing
legacy project/VFX & Video
legacy project/Virtual Reality
legacy project/Wintab High Frequency
Meta/Good First Issue
Meta/Papercut
migration/requires-manual-verification
Module › Animation & Rigging
Module › Core
Module › Development Management
Module › Eevee & Viewport
Module › Grease Pencil
Module › Modeling
Module › Nodes & Physics
Module › Pipeline, Assets & IO
Module › Platforms, Builds, Tests & Devices
Module › Python API
Module › Render & Cycles
Module › Sculpt, Paint & Texture
Module › Triaging
Module › User Interface
Module › VFX & Video
Platform/FreeBSD
Platform/Linux
Platform/macOS
Platform/Windows
Priority › High
Priority › Low
Priority › Normal
Priority › Unbreak Now!
Status › Archived
Status › Confirmed
Status › Duplicate
Status › Needs Information from Developers
Status › Needs Information from User
Status › Needs Triage
Status › Resolved
Type › Bug
Type › Design
Type › Known Issue
Type › Patch
Type › Report
Type › To Do
No Label
Interest/Alembic
Interest/Animation & Rigging
Interest/Asset Browser
Interest/Asset Browser Project Overview
Interest/Audio
Interest/Automated Testing
Interest/Blender Asset Bundle
Interest/Collada
Interest/Compositing
Interest/Core
Interest/Cycles
Interest/Datablocks and Libraries
Interest/Dependency Graph
Interest/Development Management
Interest/Eevee
Interest/Eevee & Viewport
Interest/Freestyle
Interest/Geometry Nodes
Interest/Grease Pencil
Interest/Images & Movies
Interest/Import/Export
Interest/Line Art
Interest/Masking
Interest/Modeling
Interest/Modifiers
Interest/Motion Tracking
Interest/Overrides
Interest/Performance
Interest/Pipeline, Assets & I/O
Interest/Translations
Interest/Undo
Interest/USD
Interest/Video Sequencer
legacy module/Animation & Rigging
legacy module/Core
legacy module/Development Management
legacy module/Eevee & Viewport
legacy module/Grease Pencil
legacy module/Modeling
legacy module/Nodes & Physics
legacy module/Pipeline, Assets & IO
legacy module/Platforms, Builds, Tests & Devices
legacy module/Python API
legacy module/Rendering & Cycles
legacy module/Sculpt, Paint & Texture
legacy module/Triaging
legacy module/User Interface
legacy module/VFX & Video
legacy project/1.0.0-beta.2
legacy project/Asset Browser (Archived)
legacy project/BF Blender: 2.8
legacy project/BF Blender: After Release
legacy project/BF Blender: Next
legacy project/BF Blender: Regressions
legacy project/BF Blender: Unconfirmed
legacy project/Blender 2.70
legacy project/Code Quest
legacy project/Game Animation
legacy project/Game Audio
legacy project/Game Data Conversion
legacy project/Game Engine
legacy project/Game Logic
legacy project/Game Physics
legacy project/Game Python
legacy project/Game Rendering
legacy project/Game UI
legacy project/GPU / Viewport
legacy project/GSoC
legacy project/Infrastructure: Websites
legacy project/LibOverrides - Usability and UX
legacy project/Milestone 1: Basic, Local Asset Browser
legacy project/Nodes
legacy project/Nodes & Physics
legacy project/OpenGL Error
legacy project/Papercut
legacy project/Performance
legacy project/Physics
legacy project/Platforms, Builds, Tests & Devices
legacy project/Pose Library Basics
legacy project/Python API
legacy project/Render & Cycles
legacy project/Render Pipeline
legacy project/Retrospective
legacy project/Sculpt, Paint & Texture
legacy project/Text Editor
legacy project/Tracker Curfew
legacy project/Triaging
legacy project/User Interface
legacy project/UV Editing
legacy project/VFX & Video
legacy project/Virtual Reality
legacy project/Wintab High Frequency
Meta/Good First Issue
Meta/Papercut
migration/requires-manual-verification
Module › Animation & Rigging
Module › Core
Module › Development Management
Module › Eevee & Viewport
Module › Grease Pencil
Module › Modeling
Module › Nodes & Physics
Module › Pipeline, Assets & IO
Module › Platforms, Builds, Tests & Devices
Module › Python API
Module › Render & Cycles
Module › Sculpt, Paint & Texture
Module › Triaging
Module › User Interface
Module › VFX & Video
Platform/FreeBSD
Platform/Linux
Platform/macOS
Platform/Windows
Priority › High
Priority › Low
Priority › Normal
Priority › Unbreak Now!
Status › Archived
Status › Confirmed
Status › Duplicate
Status › Needs Information from Developers
Status › Needs Information from User
Status › Needs Triage
Status › Resolved
Type › Bug
Type › Design
Type › Known Issue
Type › Patch
Type › Report
Type › To Do
Milestone
Set milestone
Clear milestone
No items
No Milestone
Projects
Set Project
Clear projects
No project
Assignees
Assign users
Clear assignees
No Assignees
61 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
No due date set.
Dependencies
No dependencies set.
Reference: blender/blender#73047
Reference in new issue
There is no content yet.
Delete Branch '%!s(<nil>)'
Deleting a branch is permanent. It CANNOT be undone. Continue?
No
Yes
The purpose of this task is to describe the main uses cases and functionality that should be provided by a Multires sculpting system, as well as to discuss a plan on how to implement that in Blender.
The main use case of Multires
The problem Multires solves
When you are working on any art medium (this also applies for painting), you should always try to work from the general shapes to the details. In case of digital sculpting, this means that you should always try to work with the minimum number of vertices that represent the level of detail you are trying to add to the model.
This is also true for the current workflow we have implemented (The Voxel remesher). By default, it provides a low poly mesh (about 10K vertices), that you should deform trying to get main shape of the object you want. After that, you increase the resolution of the remesher until you have enough vertices to represent the next level of detail you want to work on, and you continue from there.
The reasons you want to work this way are:
Performance: It is faster (more responsive, without lag) to deform a mesh with 10K vertices than a mesh with 25M vertices. If you use a big brush size needed to modify the object proportions on 25M vertices at the same time, it is going to lag. (Unrelated note, but we should not try to optimize Sculpt Mode to support these kind of operations as they don’t make any sense with a Multires system in place).
(Most important) Noise: If you sculpt with more vertices than needed for the size of details and shapes you are trying to get, you are going to end with a lot of uncontrolled shape noise produced by the tools. This is not a specific problem with Blender brushes and tools, this happens in any software and in every sculpting system. If you use the Draw brush to add some volume on a big area directly onto a 25M vertices mesh, you are going to need need to clean manually all small uncontrolled imperfections that big stroke stroke produced if you want that to be the final surface. If you start sculpting from a sphere with 1M vertices, you are going to spend more time cleaning shape noise than sculpting or the sculpt is just going to look bad. This is why nobody works this way. You don’t generate unintended shape noise if there aren’t enough vertices to represent it.
That is the main problem Multires sculpting solves. With Multires, you are able to choose at any moment the level of detail that is appropriate for the change you want to make in you model, solving both the performance and the noise issues. This gives an artist a huge amount of freedom as you know you can always go back to tweak low frequency details (proportions, general volumes) after sculpting mid/high frequency details (wrinkles, skin alphas...) if you consider that they don’t look right, without loosing any work.
Without this, the rest of the sculpting workflows (the Voxel remesher, Dyntopo) are the same as sculpting with real clay or marble, you can only sculpt bigger first shapes, then mid details and them the small details. If it does not look right, there is not way to fix it, you need to delete what looks wrong and start again. This is why those workflows are often used for concepting general shapes, and you want two switch to Multires as soon as you can. Sculpting a complex model without using Multires, on any software, is extremely (and unnecessarily) hard and it requires an insane amount of skill from the artist to workaround the limitation. It is like sculpting without using undo. It is too risky to create a high poly sculpt with projected alphas without this feature.
In order to solve this problem, the main thing Multires needs to guarantee is that when you sculpt shapes on your model in the appropriate resolution level, all the other levels are updated accordingly to reflect the changes you did. This is what people often refer as ¨detail propagation¨.
Multires Design
When designing a sculpting Multires system that provides the previously mentioned functionality, We need to take the following points into consideration:
All Multires subdivision levels contain valid information (sculpted shapes, mask, colors...) that should never be lost or damaged.
The user wants to modify any subdivision level, at any time, without restrictions (there should not be limits of how much the mesh should be deformed or “not allowed modifications”).
The user wants to delete and rebuild higher/lower subdivision levels in he/she considers that the shape information that level contains is not longer relevant.
For example, if the user wants to do a high poly sculpt, he/she switches to the higher level subdivision possible that the computer allows to create the high frequency detail projecting alphas. When that is done, the user may want to switch to a lower level to tweak proportions, or to a mid level to tweak small volumes with a soft brush. All the work the user put into applying the alphas should be propagated with the lower subdivision level changes with the Multires functionality and the model should look fine.
If, for some reason (a bug or an design issue in the implementation that did not consider point 1), switching and modifying lower levels may introduce mesh artifacts in the higher ones (the ones that contains the alpha projections and high frequency details), it will destroy all the work done previously by the user in that levels.
In that case, the user is again limited to not going back to select the mesh resolution needed for the modifications he/she wants to make in the mesh. A Multires system like this is not solving the intended problem and there is no reason to use it. It provides the same functionality as any of the other sculpting workflows (Voxel, Dyntopo), but even more limited as the user can’t modify the base topology to adapt it to a new shape. It does not have any reason to exist.
If you project requires you to use a fixed predefined topology in your model (for animation, for example), subdividing the mesh manually and deforming it with a cage or a datatransfer provides the same functionality. You can also get a lower subdivision level by duplicating the model and using unsubdivide if you need it for texture baking or animation. This is not the main problem Multires should be trying to solve.
Any unwanted mesh artifact in the detail propagation, no matter how small it is, invalidates all Multires sculpting features and makes it not functional for its intended use case, as it leads to irreparable data corruption.
Current Multires Modifier
Considering the previously design and use case description as valid Multires sculpting system:
The most advances tools Blender has right now that were added in the last releases (Quadriflow, Elastic deform, IK Pose brush...) are designed to work with a Multires system:
The main purpose of Quadriflow is to produce subdividable geometry for a Multires. When you are done sculpting with Dyntopo/Voxel remesher, where you can’t have the freedom to choose the level of detail you want to work on, you can quickly generate a base mesh, subdivide it and reproject the details back. That way you can tweak again general proportions and low frequency detail.
These brush tools are designed to tweak proportions/big shapes of models, which is something you most likely want to do after sculpting more detail to have an idea of how your model looks like. Multires solves that problem.
These brushes can’t be used directly on high poly meshes. These tools needs to have disabled some sculpt mode optimizations in order to work, so they are much slower than regular brushes. In fact, if you try to use the IK pose brush directly on a high poly mesh, most likely you are going to run out of memory. If you don’t, it is going to create terrible artifacts between each segment. In order for these brushes to work as intended on high poly meshes, you need to use Multires to switch to a lower level, use the brush, and then switch to a higher level again to get the intended result.
Multires implementation reference
SculptGL contains a valid and functional Multires sculpting implementation. You can try it by sculpting different details at different levels and switching between them, as well as creating and deleting subdivision levels:
https://stephaneginier.com/sculptgl/
This implementation of Multires provides:
Detail propagation that works across all levels. You can choose the desired level you want to sculpt on and that deformation is propagated correctly to all subdivision levels. There are not visible artifacts of any kind.
You can both create and delete levels in both directions (higher levels and lower levels) with subdivide/delete higher and reverse/delete lower.
These features are the minimum and required a Multires implementation in Blender should provide, as they are pretty much the definition of a Multires sculpting system. Any other Multires related feature or optimization (being part of the modifier stack, baking, shape keys, layers, exporting, reprojection, tool compatibility, Quadriflow...) should always come later. There should not be a design decisions that prioritize any other Multires feature or optimization without having those minimums perfectly working, bug free and functional.
Proposal
Given the fact that, as described here, Multires was never a functional feature for its intended purpose and:
Some options are:
Added subscriber: @PabloDobarro
Added subscriber: @WilliamReynish
Thanks for making this. A few comments:
1: IMO one of the main original use-cases for Multires, was as an alternative to using Sub-Ds, but with hierarchical detail. So you can animate, rig and play back simpler geometry, but render at a higher level. That is one of the core use-cases, which I don't think you mention here.
2: I'm not sure it even makes sense to keep the 'old' Multires modifier around. It barely works at all right now, so there isn't much value in keeping the code - and we have a potential upside in getting rid of the old cruft and simplifying the tools code that way.
Added subscriber: @Loner-2
Honestly, it's better to replace something that doesn't work than clutter up something else on this. All the more so because never worked she on 100%. So I'll say for replacement of the current multires with SculpGl if its author gives permission. A lot of users understand that multires 100% never worked. Those who have also seen the code also don't understand what works there or how it works. It's better to live with good code than to clutter up something else on a foundation that doesn't work.
I agree that it's better to delete all the old multires code than to hold it.
Added subscriber: @Stan_Pancakes
Added subscriber: @Frozen_Death_Knight
If SculptGL/a new system is the way to go, then you should delete the old MultiRes system. However, until the new system is in place, you can't delete the old one. There are tons of projects that have used it over the years and people need time to transition over their projects from MultiRes to MultiRes2 with Shrinkwraps and more. You need at least one official release where the legacy system and reworked system are available for this to happen.
I don't know about SculptGL, but one thing is true: if something doesn't work, it doesn't need to exist. Supporting legacy is impractical. It's infectious and counter-productive. If a scrap and rewrite is more sensible than maintenance, do it. Just do it!
@WilliamReynish I understand the use case of storing displacement information at different levels of subdivision, but that is not what a Multires Sculpting feature should do. In any case, Multires was added back then when Blender didn't have UDIMs, vector displacement and adaptive subdivision in the renderer. This is now the intended way to rig an animate VFX assets, that is compatible with most studio pipelines and with importing/exporting data to other texturing, sculpting softwares and render engines. I don't see a particular reason to keep it just for animation, but maybe there is still some use case for it that I'm not aware of (I have no idea about animation).
If we want to stop supporting that (which makes total sense), I think we should evaluate how much of the current code can be reused to implement a sculpting Multires (maybe the PBVH_GRIDS code and the iterators can be reused) before removing it completely. Maybe it is less work than it seems if we go with the standard workflow for animation.
Removed subscriber: @Frozen_Death_Knight
Added subscriber: @rubens9119
Added subscriber: @tux21b
Added subscriber: @Andruxa696
@WilliamReynish
I agreed with Pablo, more important to have properly working multires for sculpting , than for animation. Most studios use displacement for this task . We can make multires as an object data property(as vertex colors and shape keys) . In this case we only need proper baking displacement from multires , so later we can use it for animation.
Or we can add later support multires for animation, after base features of new multires will work.
Added subscriber: @JulianPerez
Added subscriber: @riceart
Added subscriber: @ErickNyanduKabongo
I m with @WilliamReynish in this and since you have no idea about animation it is wiser not to have a strong opinion on it. Having the ability to rig the lower level of the highly sculpted model is a time saver or being able to rig a model and add multires. on top of it, it is a real time saver. If decide to let this feature go then we need a very robust baking system, since the actual baking system is quiet confusing and has many hit and miss. The good baking system will help to bake all those high res. details sculpted with multires to a lower one.
I m pretty happy to read this thread and see that finally Multiresolution modifier problems is going to be tackle and as old Multiresolution modifier user and Multiresolution modifier advocate you have my benedictions to throw multiresolution modifier to the canal. May the force be with you.
It's true that this use-case also has some overlap with adaptive subdivision and baked displacement. It may probably be ok to make the scope of Multires narrower - as long as we do it knowingly.
In any case, at least initially it would be a major benefit to get to a point where it works reliably for a subset of the use-cases.
Added subscriber: @mankysee
Added subscriber: @smramsay
Added subscriber: @AlbertoVelazquez
It is a pleasure to read this proposal.
Personally, I don't know if the new system will work with rigging or not. I would certainly prefer to keep it. Now, if that's a reason to stop, delay or impede the development of a new multires... you have my blessing as a user to burn that feature.
I would certainly like to raise... is it really necessary that the multires be a modifier? Given that having more than one modifier of this type is a nonsense and that it is always forced to be the first modifier... wouldn't it be more logical that it simply be a property of the mesh like the vertex groups? Maybe I'm wrong, but I don't see any sense in it being a modifier. Also future sculpt layers could be placed in same mesh tab, like vertex groups or shapes, where have more sense than inside a modifier.
I agree with Alberto. Heavily delaying development just for having the new system support animation is really not an option. There are other solutions to the animation problem out there that are tried and tested. You can try and see if you can do it, but forcing a new MultiRes system to accomodate animation needs is honestly silly. Animators don't need MultiRes when the SubDiv modifier and displacement maps could handle pretty much all that work for them (Blender needs a way to create displacement maps from your sculpts that the animators can use like ZBrush does it.). Sculptors however just can't work without a MultiRes system, so their needs should be taken priority here.
Heck, why not just rename the old MultiRes modifier to Animation Resolution modifier or something and rework it so it has more features for animation while the sculptors get the new system? Isn't the current MultiRes already coded to accomodate their needs?
Added subscriber: @ThinkingPolygons
This is it, nuff said.
Added subscriber: @Traediras
Having played around with SculptGL, I feel that having a similar implementation in Blender would be hugely beneficial, as long as the ability to maintain fine levels of detail remains. My current workflow generally revolves around a high-poly sculpt, retopology, then capturing the finer details with a multires modifier from a subdiv'd/shrunkwrapped mesh. I like that the multires modifier basically encapsulates subdivision and displacement in a singular modifier, and I've found it to be particularly useful with armature deforming affecting the base mesh, though I do absolutely understand the challenges around the current implementation of multires, particularly when additional geometry needs to be added to the base mesh.
The current issue I have with voxel remeshing and other auto-retopology tools is that finer details can be lost from remeshing, such as spines, scale plating, membranes, and smaller concave regions like earholes, eyesockets, along with geometry that are situated close together such as digits and maw interiors. It's important that the new multires modifier is able to assist remeshing algorithms to preserve some finer details. Of course, some issues can't be resolved with basic remeshing and subdividing, eventually it's necessary for one to create a base mesh with proper topology to achieve the required result from the high-poly sculpt. If it's also possible with new multires to work with any addition or removal of geometry to the base mesh, then it'd essentially be perfect, but I understand that would be far easier said than done.
It's important at the very least that the chief feature (afaik) of multires - being able to have finer details for a mesh without needing a texture map - is kept. I'm not against a complete rewrite of the multires system as long as it brings improvements, though I do understand if it ends up breaking projects that use the old system, but as long as a workflow is accommodated for artists to be able to transfer projects from the old/legacy multires to the new multires, it shouldn't be an issue.
On an additional note, I feel that it would be highly beneficial for users that may not pay attention to developer forums or social media to have a tutorial or guide of the workflow that is intended with the updates to sculpting tools for Blender. Having basic documentation might not necessarily be enough guidance, particularly for a beginner.
Added subscriber: @ReinhardK
Added subscriber: @MassimilianoPuliero
I'm with the guys that would love a totally new multires modifier instead of try to fix the current one.
cheers and goodluck!
Added subscriber: @moisessalvador
As a way of storing data for animated models, Multires modifier has advantages over displacement textures. With displacement textures, you first have to UV map, you have to bake (which there is no support for baking vector displacement maps currently) you have to make sure the texture resolution is proper, sometimes you get artifacts if the mesh vertices changes or don't align, or other kinds of artifacts due to the model deforming and CatmullClark subdivision, then you have to worry about using the modifier vs using the shader node in case you need to see the detail in the viewport, etc etc. Some of these are fixable by the user by learning new practices but some inevitably make things slower.
Multires provides an easier and faster way of storing and using that data, per vertex which is all you need in a lot of cases
Now this looks like two distinct cases, so maybe it's worth separating both, and just create an easy way of transfering data from one to the other. Or maybe not, and the new multires ends up working good for animations out of the box. Maybe it could be a switch, where multires gets locked from being sculpted to be used in animation, and unlocked for the opposite. Maybe multires for sculpting should be a native mesh data thing, while multires for animation should be a modifier, where you choose a special file format that contains multires data per vertex index, plus being able to open different multires files
Whatever you guys end up deciding, don't do it at the cost of workflows that people have developed over the years, or without a plan on how to cover them. Put the burden of it on whoever wants to make potentially breaking changes
Added subscriber: @JulienKaspar
Added subscriber: @SecuoyaEx
One thing you can do with the current Multiresolution is modify the base mesh without losing or corrupting the already scupted parts in higher levels, you can add extra edgeloops, extrusions... I hope you guys don't break that
What one considers a priority is very subjective, it would be a shame to lose uniquely blender ways of working, losing flexibility, just to impose one vision of what is important.
Removed subscriber: @SecuoyaEx
Added subscriber: @RodDavis
Added subscriber: @hadrien
Multires as part of the mesh data sounds good to me - I also see a future where shapekeys can exist at different multires levels, like sculpt layers in other programs - they're really the same thing after all.
And there is another important aspect that I think went unsaid : in rigging, we either use blendshapes or displacement maps (baked from Zbrush multires) to correct deformations or add medium-frequency detail such as wrinkles : if it's a big structural modification/correction, then we're going to use blendshapes ; if it's smaller, superficial/cosmetic change then we're going to use displacement maps. Some corrections however, to be optimal, need a higher resolution than what the basemesh allows - a workflow with multires layers/shapekeys has the potential to completely streamline the creation of both corrective shapes and expressions, as well as everything in-between - so I think it's really essential to consider.
In that case we can imagine that only static, very high frequency detail would be left for rendertime displacement.
From there, it's not a big leap to imagine accessing different multires levels in edit mode as well, although I can see the conversions between edit mesh and sculpt bvh quickly become unmanageable.
Added subscriber: @dlc17
Added subscriber: @T.R.O.Nunes
Added subscriber: @theluthier
Added subscriber: @YegorSmirnov
Added subscriber: @DanieleViagi
Added subscriber: @TheCharacterhero-4
Added subscriber: @0o00o0oo
Added subscriber: @PetterLundh
I am agree, if multires will have shapekeys support in future, then we need to keep the ability to move the low level of mesh by bones and keep all details of multires on high levels in new bone pose. It will give more possibilities for realistic face rigging for example.
Of course it not should be in the first version of new implantation , but need to keep it in mind at the beginning.
Added subscriber: @BartekMoniewski
Added subscriber: @siebeneicher
An important aspect of Blender I rarely find someone speaking about. Its about how to push complexity of your project to its limit without freezing your PC.
Some people mentioned idea, that Multires should not be a modifier, but integrated directly into mesh objects.
On smaller projects, we might not bother about space efficiency. But, what happens, if we push a scene to its limits? Imagine a scene with many thousands of mesh objects.
We could apply same way of thinking on question, wether we use (multires) or (subdiv&displace) in our animation projects. A single multires sculpt could eat away 10G memory. Again, for smaller projects you wont need to bother. But if you have a more complex setup, with many objects (10G each), you freeze your machine by depleting its memory.
If we bake a high res model to displacement, it helps us to reduce memory footprint of our scenes.
@PabloDobarro
Overall this all sounds pretty good. One thing that concerns me right now is backwards compatibility.
Like @WilliamReynish said there is an important use-case for multires at the moment:
This is mainly because there is no alternative to this workflow right now since displacement baking is not there yet. But once it is and the old multires has no reason to stay, how will old files, even project files from the Blender Open Movies like Spring react if you open them in a new version of Blender?
Added subscriber: @MatthewHeimlich
I think we need to be careful in this case about being slavish to backwards compatibility. As a developer, I recognize that it's not always smart or sometimes even possible to force yourself to be beholden to the sins of past bad design choices. Sometimes you need to tear things down and start over without being concerned about what effect it's going to have on older work. Do we really have people storming the gate over the fact that you can really only open Sintel in a special Blender branch? I don't think so. Make a breaking change sometimes. It's freeing. The beauty of Blender is that old versions aren't going anywhere for people who want to open legacy data.
Added subscriber: @seaside98-4
Added subscriber: @MadMinstrel
Multires for sculpting is good, and baking vector displacement is also good, but one vital use case that is important in Blender (and not important in other pure sculpting apps) is sculpting on a rigged, posed, animated mesh. This is important for animating muscles and such. Blender has no alternative solution for this such as a muscle system or a robust system for rigging physics-simulated objects.
Granted, the old Multires system is bust anyway, so once you get rid of it, you might as well start small. But you should keep this important functionality in mind for the future.
Added subscriber: @luissantander
Added subscriber: @brecht
What I get from this proposal is mainly the requirement that propagation must be really reliable. So to be clear, the current code is just broken. There are bugs and incomplete code, so that even the intended algorithms are not working, and those algorithms might not be ideal. For me the interesting discussion is really a technical one, getting down to the actual code and algorithms and figuring out the solutions. And then if it turns out rewriting big parts is needed, so be it.
I looked at SculptGL, and found relatively simple code in these two files. However from reading this task I feel like I'm missing something, because to me it seems these algorithms are rather limited:
https://github.com/stephomi/sculptgl/blob/master/src/editing/Reversion.js
https://github.com/stephomi/sculptgl/blob/master/src/editing/Subdivision.js
For example this basic test:
Without proper handling of rotations, for example IK posing at lower levels will not work. For animation it's important to handle this kind of rotation case well of course. The implementation can be simpler like SculptGL if it's not important. But from reading the proposal, probably we need something more advanced.
The classic paper about multiresolution mesh editing is this one, it can be a good starting point for those wanting to understand the problem:
https://mrl.nyu.edu/publications/multires-mesh/
@brecht Right, the most important thing is a reliable detail propagation. I mentioned the SculptGL implementation because it has the expected design and behavior for a sculpting multires feature (no need for reshape/apply base, it creates and deletes levels in both directions), and it does not fail when working with brushes. I looked at the code and it also seemed to me that it was simple, so I assumed that it may have limitations like the artifact you mentioned with rotations.
Does the "fixed" version of the current multires modifier have a detail propagation without the SculptGL limitations? Also, some of the mentioned features (like delete lower) are considered as a TODO in the code, so I assume that they are possible to integrate into the current modifier, but I'm not sure if rebuilding lower levels will conflict with some of the existing assumptions (like apply base).
I think that before choosing a solution, we should know how much work different options are going to take to develop, how reliable the result will be and how easy it would be to maintain and integrate with existing and new features (layers, colors, baking, animation...).
I want to remember, that actual blender Multires baking is not reliable, because the bake is incorrect in at least the normal map baking.
I would like to chime in about the implementation of multires in terms of technical things. I haven't read the paper Brecht provided and haven't look into the code of the current multires system but from my user point of view implementation of something in vein of ptex would be the next best thing since it's fairly simple to implement for a quad-based mesh(its just a ptex with vertex displacement data instead of colored pixels), it supports animation pipelines and allow a user to go up and down in resolution at any given time.
the downside of this that the modification of the mesh after ptex multires created upon it can be difficult although it's something that needs to be investigated.
@mankysee I'd avoid ptxes by any means. Long story short, any scenario that I've experienced throughout my career with ptxes was a huge pain.
Why bother with an image-based format, especially one with such widely known performance and implementation limitations as PTex? There's no reason multires data can't be encoded directly into mesh data structures.
Added subscriber: @Teds
I think the important part is not PTex as such, but merely the separation of the vector displacement data from the tessellation scheme. An image format of some sort is good because it's well understood by users and relatively easy to edit, import and export. Additionally, with images you can easily visualize and debug the displacement data, and manipulate it with texture nodes in the future. Also makes layers simple.
A plain old UV-based image can be used as well as long as the initial automatic unwrap can be made quick, reliable and not too wasteful. That places some limitations on the extent of basemesh editing that can be done after starting to sculpt, but these limitation are again well understood thanks to users' experience with uvs in texturing, and can be mitigated with solid baking tools.
Yes, that's what I meant more or less. Ptex is a good example not in an actual implementation but of the principle of generating textures without the need of additional work required to map such images.
In terms of an actual implementation I can imagine a system generating uvs for each subdivided quad and applying sparse textures on top of those. Something not unlike Zbrush is doing(under the hood it's using subdivided meshes and displacement textures of some kind containing various information like depth, orientation and so forth).
Added subscriber: @Josephbburg
It's interesting that @AlbertoVelazquez should mention multi-res baking. Having done some poking around in the baking code myself, it seems multi-res baking is a major branch in the bake code that complicates things tremendously. I think it's one of the few parts of Blender that still uses DerivedMesh. Removing this branch in the bake code by redesigning multi-res may have the benefit of making it easier to design features like AOV baking, bake denoise, etc.
I'm of the opinion that there's no reason to maintain compatibility if the feature was broken to begin with. If people want to bring multi-res meshes in from older versions of Blender, they will probably still be able to do so by saving the various levels of subdivision and applying the shapes to the new multi-res modifier (perhaps this could even be automated somehow).
Added subscriber: @kfir
Added subscriber: @SpectreFirst
Added subscriber: @pawel.palenica
Added subscriber: @VladimirKunyansky
Added subscriber: @ckohl_art
Changed status from 'Needs Triage' to: 'Confirmed'
It sounds to me that the old multires modifier is built on a weak foundation and that maintaining it is increasingly difficult and more effort than is worth doing.
The path forward seems obvious: build a new multires from scratch on top of a strong foundation. Whether that means using SculptGL as a base or something else entirely is up to the implementer.
Added subscriber: @martinium
Added subscriber: @ostry
Added subscriber: @AlRedd-3
Hello, any idea when work on this is going to start?
Added subscriber: @AnityEx
Added subscriber: @slumber
Added subscriber: @EvanB
Added subscriber: @Munkle_Mark
Added subscriber: @DirSurya
Added subscriber: @Ape_in_outer_space
Added subscriber: @Isfuelo
This comment was removed by @Isfuelo
Removed subscriber: @moisessalvador
I support the first option. Starting clean with SculptGL base implementation and then add more features with time. It is very often the case with other older software that rely on very old code, always dragging its limitations and issues forward instead of starting clean with fast code...
Removed subscriber: @AnityEx
Added subscriber: @pauanyu_blender
Added subscriber: @JohanTriHandoyo
Added subscriber: @skarkkai
Added subscriber: @Kvendy
Added subscriber: @aoates