Multi-Object mode support (design overview) #54242
Closed
opened 2018-03-07 03:05:05 +01:00 by Campbell Barton
·
16 comments
No Branch/Tag Specified
main
blender-v3.3-release
blender-v3.6-release
asset-browser-frontend-split
universal-scene-description
temp-sculpt-dyntopo
brush-assets-project
asset-shelf
anim/armature-drawing-refactor-3
temp-sculpt-dyntopo-hive-alloc
tmp-usd-python-mtl
tmp-usd-3.6
blender-v3.5-release
blender-projects-basics
blender-v2.93-release
temp-sculpt-attr-api
realtime-clock
sculpt-dev
gpencil-next
bevelv2
microfacet_hair
xr-dev
principled-v2
v3.6.3
v3.3.11
v3.6.2
v3.3.10
v3.6.1
v3.3.9
v3.6.0
v3.3.8
v3.3.7
v2.93.18
v3.5.1
v3.3.6
v2.93.17
v3.5.0
v2.93.16
v3.3.5
v3.3.4
v2.93.15
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.69
v2.68a
v2.68
v2.67b
v2.67a
v2.67
v2.66a
v2.66
v2.65a
v2.65
v2.64a
v2.64
v2.63a
v2.63
v2.61
v2.60a
v2.60
v2.59
v2.58a
v2.58
v2.57b
v2.57a
v2.57
v2.56a
v2.56
v2.55
v2.54
v2.53
v2.52
v2.51
v2.50
v2.49b
v2.49a
v2.49
v2.48a
v2.48
v2.47
v2.46
v2.45
v2.44
v2.43
v2.42a
v2.42
v2.41
v2.40
v2.37a
v2.37
v2.36
v2.35a
v2.35
v2.34
v2.33a
v2.33
v2.32
v2.31a
v2.31
v2.30
v2.28c
v2.28a
v2.28
v2.27
v2.26
v2.25
Labels
Clear labels
This issue affects/is about backward or forward compatibility
Issues relating to security: https://wiki.blender.org/wiki/Process/Vulnerability_Reports
Apply labels
Interest
Alembic
Interest
Animation & Rigging
Interest
Asset Browser
Interest
Asset Browser Project Overview
Interest
Audio
Interest
Automated Testing
Interest
Blender Asset Bundle
Interest
BlendFile
Interest
Collada
Interest
Compatibility
This issue affects/is about backward or forward compatibility
Interest
Compositing
Interest
Core
Interest
Cycles
Interest
Dependency Graph
Interest
Development Management
Interest
EEVEE & Viewport
Interest
Freestyle
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
ID Management
Interest
Images & Movies
Interest
Import Export
Interest
Line Art
Interest
Masking
Interest
Metal
Interest
Modeling
Interest
Modifiers
Interest
Motion Tracking
Interest
Nodes & Physics
Interest
OpenGL
Interest
Overrides
Interest
Performance
Interest
Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds & Tests
Interest
Python API
Interest
Render & Cycles
Interest
Render Pipeline
Interest
Sculpt, Paint & Texture
Interest
Text Editor
Interest
Translations
Interest
Triaging
Interest
Undo
Interest
USD
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Interest
Video Sequencer
Interest
Virtual Reality
Interest
Vulkan
Interest: Wayland
Legacy
Blender 2.8 Project
Legacy
Milestone 1: Basic, Local Asset Browser
Legacy
OpenGL Error
Meta
Good First Issue
Meta
Papercut
Meta
Retrospective
Meta
Security
Issues relating to security: https://wiki.blender.org/wiki/Process/Vulnerability_Reports
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
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 Info 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
BlendFile
Interest
Collada
Interest
Compatibility
Interest
Compositing
Interest
Core
Interest
Cycles
Interest
Dependency Graph
Interest
Development Management
Interest
EEVEE & Viewport
Interest
Freestyle
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
ID Management
Interest
Images & Movies
Interest
Import Export
Interest
Line Art
Interest
Masking
Interest
Metal
Interest
Modeling
Interest
Modifiers
Interest
Motion Tracking
Interest
Nodes & Physics
Interest
OpenGL
Interest
Overrides
Interest
Performance
Interest
Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds & Tests
Interest
Python API
Interest
Render & Cycles
Interest
Render Pipeline
Interest
Sculpt, Paint & Texture
Interest
Text Editor
Interest
Translations
Interest
Triaging
Interest
Undo
Interest
USD
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Interest
Video Sequencer
Interest
Virtual Reality
Interest
Vulkan
Interest: Wayland
Legacy
Blender 2.8 Project
Legacy
Milestone 1: Basic, Local Asset Browser
Legacy
OpenGL Error
Meta
Good First Issue
Meta
Papercut
Meta
Retrospective
Meta
Security
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
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 Info 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
8 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#54242
Reference in New Issue
There is no content yet.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may exist for a short time before cleaning up, in most cases it CANNOT be undone. Continue?
This task is to outline how multi-object mode support might be achieved.
This design task focuses on mesh edit-mode, I think this is one of the more complicated cases,
so supporting this should lead us to tackle most of the more tricky problems.
Motivation
Maybe obvious, including this for completeness - in case I miss something.
Certain operations are useful to apply on multiple objects at once.
Examples are:
Design Challenges
not essential, but users will likely want this.
more of a nice-to-have, mentioning for completeness.
Technical Challenges
In some cases these checks can be performed before making any destructive edits.
Print a message "Operations on ... objects failed", without rolling back changes, in some cases this is preferable as long as it's not leaving user data in a broken state.
Faking 'One Big Mesh'
Initial Steps
This isn't complete, it's just some ideas on how to start out developing this in a branch.
All selected objects in a matching mode are grouped (even if not active)
Active object is an exception, it's included even when not selected.
This is just a simple rule to start with, we might up using a different rule.
At first we don't handle undo at all (since this might rely on larger refactor to the undo stack).
Task Breakdown
Added subscriber: @ideasman42
Multi-Mode Support (design overview)to Multi-Object mode support (design overview)Added subscriber: @antoniov
Added subscriber: @michaelknubben
Added subscriber: @mano-wii
Added subscriber: @stilobique
Added subscriber: @mike.r.bermudez
Hi, I hope I'm understanding this correctly. Is this an attempt to make things work similar to Modo?
In Modo, you have Mesh Layers. You could have multiple meshes on a layer; 3 spheres on 1, 2 cubes on another, etc. These layers can be selected via Object Selection Mode—similar to Vert, Edge, or Face Selection modes. Once you've selected a layer there's no need to enter an "Edit Mode", simply enable Vert/Edge/Face selection, and you're good to go.
Meshes can be copied and pasted from layer to layer.
A very popular script is "Select That Mesh" by Seneca Menard, which will select whatever mesh is under the mouse cursor, regardless of which layer it's on. Allowing you to very quickly go from layer to layer, or mesh to mesh, to make edits.
As it stands, I use Heavypoly's custom menus, one of which allows you you add meshes in Edit mode. So unless I need something more than a cube, cylinder, sphere, or plane, I never have leave Edit Mode. Unless I want to make another Object for organizational reasons.
I personally believe doing away with Edit Mode and Object Mode is the way to go.
@mike.r.bermudez I don't use modo, but it seems like this isn't an exact equivalent (this ability has been discussed before modo was around).
The ability to select an single mesh, with multiple objects in edit-mode would be handy, so it's worth keeping that in mind.
As for having extra selection modes without an explicit edit-mode. This is not the plan being proposed, I realize this is how some applications handle it though.
Further, I'd rather comments here don't use other 3D applications as a short-hand for explaining how something should work, instead detail the design you think can work well for Blender.
Added subscriber: @JoshuaLeung
Hmm... lots of tricky issues here. Here are some rambling thoughts about how we could tackle these.
From a technical standpoint, IMO, one of the biggest issues concerns how most tools assume that there is a single "active object", and that all geometry comes from that object (e.g. most of the Pose Mode tools). Perhaps one of the simplest workarounds for that is that as a first pass, we simply take the existing operators, push the existing single-active-object code into a subroutine, a wrap that subroutine with a loop over the set of selected objects, operating on each as if it were the "active object" of the day. So, from a user perspective, we basically only have the concept of "selected objects" now, while the underlying code sees
"selected objects set" --> operate on this "active object [being processed]"
. That approach probably solves most of the tools.As for the other issues raised:
Cross Object Joining - Simply warning/complaining will probably be the simplest option. Especially since things like modifiers could be involved and/or you need to keep some objects separated (e.g. for mechanical models). But, if you just had simple geometry without modifiers, several options include: 1) use order in which vertices were selected - i.e. move the initial object's geometry into the second one, or 2) merge the smaller objects into the larger ones.
Linked Duplicates - It depends on the operation I guess. For example, consider selecting two regions on a pair of linked duplicate spheres, and trying to extrude those; as long as there are no vertices in common between those selections, it would be nice from a user standpoint to be able to do just extrude them as if they're separate meshes. However, on second thought, that probably wouldn't be possible, as selection data would be shared between objects, and thus the selected vertices from both would get operated on. Unless we do something crazy (and invasive), like having per-instance selection buffers, etc. it's probably another case where it's just easier to error out, to keep the project manageable in the short-term; then we can just leave that as an issue for the future, when users have actually been playing with multi-object editing for a while, and we have a better idea of what they need/don't need.
Data Layers, etc. - Probably it won't be an issue if we do the multi-object thing I described above. Then, most of the code can still keep working as-is
Accidental/Slow Mode Switching - Perhaps we could cheat this? If more than a sane number of objects (or more than a certain amount of geometry - sum(totvert), sum(totfaces), etc.) are in the selection, maybe we don't need to create edit structures for all of them until an editing operator is actually invoked. That is, maybe we can just enable the relevant draw engine overlays, causing the screen to suddenly get cluttered with vertex dots drowning out anything else, the user realises their mistake, backs out, problem averted. On the flip side, if they really do want to go ahead with all this, they probably will expect the operations to be slow, so the first selection can take longer as it builds up the relevant edit meshes.
Added subscriber: @hadrien
Right, that's how I've started it works in maybe half of all operators - for others however this does break-down badly (will write more on this later - example UV unwrap you want it not to overlap all resulting UV's).
Was considering moving geometry between objects but think its a bad convention - in simple case of two vertices it's obvious, but this ability opens a can of worms.
The effort to get this working even on a basic level, only to create confusing situations for users IMHO makes it not worthwhile.
There might be some rare exceptions - eg: Convex-hull could operate on all selected meshes, although resulting mesh would use the active.
Further IMHO this causes more trouble than it solves.
We're probably better off handling this use-case with an explicit operation to move selected geometry to the active object.
Agree with last part, it think we may end up having to accept limitations, eg:
Right, so far have found this to be the case.
Are you suggesting to lazy-initialize edit-mesh structure only when it's needed?
This would work fine in certain cases but am concerned it complicates code too much.
causing different code-paths for the same operations.
Eg, if you have selection, you would want to first know if the modifier options are different in edit/object mode, in that case you can't guess when selection would fail or not.
This option can be applied only in simple cases when there are no modifiers, so we could just allow for exceptions to the rule.
Think we could keep this in mind but no need to do it initially (as you say, summing geometry with warning might be enough), we could allow user to press Esc too .
I was thinking mouse-selection would be used to add objects to edit mode. Agree that would be terrible.
I assumed users would be asking for this early on, it's at least worth considering if we should support it or not.
An example where roughly similar functionality is useful is the ability to send objects out of local-view.
I recall it was very useful to quickly select a bunch of dense objects (a building and it's surroundings for eg).
Enter local-view, then notice some foliage around the building (select objects in same group). MKey to move out of local-view.
We could support this the same way, objects can be moved out of edit-mode, but not added back in.
Or we could support adding objects in with explicit actions:
Agree.
Yes, single selected meshes don't change their behavior.
Having said that - multi-object editing is not a different mode either. Operators just act on other objects too.
Ah, see what you're getting at. I didnt consider this a problem - but see your point that it's possible some users want the ability to enter edit-mode on a single object even when others are selected.
If we want this it's not hard to support it (option for operator, extra flag on objects for eg).
Think we can add it later - only if really needed.
These things crossed my mind too, although not sure why we would fade colors based on selection order?
Yes, the active object is still an important concept since it's used for all UI drawing. So we might want to draw non-active mesh data slightly differently.
Looked into this and I'm not all that concerned about the undo system. Mainly because AFAICS this is mostly a matter of putting existing undo steps into a container (
UndoStepGroup
). then applying/rolling back all at once.Changed status from 'Open' to: 'Resolved'
This is now in 2.8, closing.