diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp index 1499390f1d5..5ed021aa1e4 100644 --- a/intern/cycles/blender/blender_curves.cpp +++ b/intern/cycles/blender/blender_curves.cpp @@ -894,7 +894,8 @@ void BlenderSync::sync_curves(Mesh *mesh, /* obtain general settings */ const bool use_curves = scene->curve_system_manager->use_curves; - if(!(use_curves && b_ob.mode() != b_ob.mode_PARTICLE_EDIT)) { + /* TODO/OBMODE, make cycles mode aware. */ + if(!(use_curves /* && b_ob.mode() != b_ob.mode_PARTICLE_EDIT */ )) { if(!motion) mesh->compute_bounds(); return; diff --git a/release/scripts/modules/bpy_extras/object_utils.py b/release/scripts/modules/bpy_extras/object_utils.py index 04b3858bb0d..31938f3ad3e 100644 --- a/release/scripts/modules/bpy_extras/object_utils.py +++ b/release/scripts/modules/bpy_extras/object_utils.py @@ -119,6 +119,7 @@ def object_data_add(context, obdata, operator=None, name=None): :return: the newly created object in the scene. :rtype: :class:`bpy.types.Object` """ + workspace = context.workspace scene = context.scene layer = context.view_layer layer_collection = context.layer_collection @@ -146,9 +147,9 @@ def object_data_add(context, obdata, operator=None, name=None): # caused because entering edit-mode does not add a empty undo slot! if context.user_preferences.edit.use_enter_edit_mode: if not (obj_act and - obj_act.mode == 'EDIT' and - obj_act.type == obj_new.type): - + obj_act.type == obj_new.type and + workspace.object_mode == 'EDIT' + ): _obdata = bpy.data.meshes.new(name) obj_act = bpy.data.objects.new(_obdata.name, _obdata) obj_act.matrix_world = obj_new.matrix_world @@ -159,7 +160,10 @@ def object_data_add(context, obdata, operator=None, name=None): bpy.ops.ed.undo_push(message="Enter Editmode") # XXX - if obj_act and obj_act.mode == 'EDIT' and obj_act.type == obj_new.type: + if (obj_act and + obj_act.type == obj_new.type and + workspace.object_mode == 'EDIT' + ): bpy.ops.mesh.select_all(action='DESELECT') obj_act.select_set(action='SELECT') bpy.ops.object.mode_set(mode='OBJECT') @@ -249,9 +253,10 @@ def object_image_guess(obj, bm=None): first checking the texture-faces, then the material. """ # TODO, cycles/nodes materials + workspace = context.workspace me = obj.data if bm is None: - if obj.mode == 'EDIT': + if workspace.object_mode == 'EDIT': import bmesh bm = bmesh.from_edit_mesh(me) diff --git a/release/scripts/modules/keyingsets_utils.py b/release/scripts/modules/keyingsets_utils.py index 7ce5f3e029b..40e74e27ed2 100644 --- a/release/scripts/modules/keyingsets_utils.py +++ b/release/scripts/modules/keyingsets_utils.py @@ -57,9 +57,10 @@ def path_add_property(path, prop): # selected objects (active object must be in object mode) def RKS_POLL_selected_objects(ksi, context): + workspace = context.workspace ob = context.active_object if ob: - return ob.mode == 'OBJECT' + return workspace.object_mode == 'OBJECT' else: return bool(context.selected_objects) @@ -67,8 +68,9 @@ def RKS_POLL_selected_objects(ksi, context): # selected bones def RKS_POLL_selected_bones(ksi, context): # we must be in Pose Mode, and there must be some bones selected + workspace = context.workspace ob = context.active_object - if ob and ob.mode == 'POSE': + if ob and workspace.object_mode == 'POSE': if context.active_pose_bone or context.selected_pose_bones: return True @@ -87,8 +89,9 @@ def RKS_POLL_selected_items(ksi, context): # all selected objects or pose bones, depending on which we've got def RKS_ITER_selected_item(ksi, context, ks): + workspace = context.workspace ob = context.active_object - if ob and ob.mode == 'POSE': + if ob and workspace.object_mode == 'POSE': for bone in context.selected_pose_bones: ksi.generate(context, ks, bone) else: diff --git a/release/scripts/startup/bl_operators/freestyle.py b/release/scripts/startup/bl_operators/freestyle.py index 0cfe78879db..9b1d054cc15 100644 --- a/release/scripts/startup/bl_operators/freestyle.py +++ b/release/scripts/startup/bl_operators/freestyle.py @@ -53,6 +53,7 @@ class SCENE_OT_freestyle_fill_range_by_selection(bpy.types.Operator): def execute(self, context): import sys + workspace = context.workspace scene = context.scene view_layer = scene.view_layers.active lineset = view_layer.freestyle_settings.linesets.active @@ -79,7 +80,7 @@ class SCENE_OT_freestyle_fill_range_by_selection(bpy.types.Operator): return {'CANCELLED'} # Find selected vertices in editmesh ob = context.active_object - if ob.type == 'MESH' and ob.mode == 'EDIT' and ob.name != ref.name: + if ob.type == 'MESH' and workspace.object_mode == 'EDIT' and ob.name != ref.name: bpy.ops.object.mode_set(mode='OBJECT') selected_verts = [v for v in ob.data.vertices if v.select] bpy.ops.object.mode_set(mode='EDIT') @@ -143,6 +144,7 @@ class SCENE_OT_freestyle_add_edge_marks_to_keying_set(bpy.types.Operator): def execute(self, context): # active keying set + workspace = context.workspace scene = context.scene ks = scene.keying_sets.active if ks is None: @@ -150,7 +152,7 @@ class SCENE_OT_freestyle_add_edge_marks_to_keying_set(bpy.types.Operator): ks.bl_description = "" # add data paths to the keying set ob = context.active_object - ob_mode = ob.mode + ob_mode = workspace.object_mode mesh = ob.data bpy.ops.object.mode_set(mode='OBJECT', toggle=False) for i, edge in enumerate(mesh.edges): @@ -174,6 +176,7 @@ class SCENE_OT_freestyle_add_face_marks_to_keying_set(bpy.types.Operator): def execute(self, context): # active keying set + workspace = context.workspace scene = context.scene ks = scene.keying_sets.active if ks is None: @@ -181,7 +184,7 @@ class SCENE_OT_freestyle_add_face_marks_to_keying_set(bpy.types.Operator): ks.bl_description = "" # add data paths to the keying set ob = context.active_object - ob_mode = ob.mode + ob_mode = workspace.object_mode mesh = ob.data bpy.ops.object.mode_set(mode='OBJECT', toggle=False) for i, polygon in enumerate(mesh.polygons): diff --git a/release/scripts/startup/bl_operators/mesh.py b/release/scripts/startup/bl_operators/mesh.py index c7a11c23c3f..ccc592e80b8 100644 --- a/release/scripts/startup/bl_operators/mesh.py +++ b/release/scripts/startup/bl_operators/mesh.py @@ -57,8 +57,9 @@ class MeshMirrorUV(Operator): precision = self.precision double_warn = 0 + workspace = context.workspace ob = context.active_object - is_editmode = (ob.mode == 'EDIT') + is_editmode = (workspace.object_mode == 'EDIT') if is_editmode: bpy.ops.object.mode_set(mode='OBJECT', toggle=False) diff --git a/release/scripts/startup/bl_operators/object.py b/release/scripts/startup/bl_operators/object.py index 566487d9d0e..58f3afa3d6c 100644 --- a/release/scripts/startup/bl_operators/object.py +++ b/release/scripts/startup/bl_operators/object.py @@ -63,12 +63,13 @@ class SelectPattern(Operator): pattern_match = (lambda a, b: fnmatch.fnmatchcase(a.upper(), b.upper())) is_ebone = False + workspace = context.workspace obj = context.object - if obj and obj.mode == 'POSE': + if obj and workspace.object_mode == 'POSE': items = obj.data.bones if not self.extend: bpy.ops.pose.select_all(action='DESELECT') - elif obj and obj.type == 'ARMATURE' and obj.mode == 'EDIT': + elif obj and obj.type == 'ARMATURE' and workspace.object_mode == 'EDIT': items = obj.data.edit_bones if not self.extend: bpy.ops.armature.select_all(action='DESELECT') @@ -248,6 +249,8 @@ class SubdivisionSet(Operator): if not relative and level < 0: self.level = level = 0 + workspace = context.workspace + def set_object_subd(obj): for mod in obj.modifiers: if mod.type == 'MULTIRES': @@ -257,18 +260,18 @@ class SubdivisionSet(Operator): for i in range(sub): bpy.ops.object.multires_subdivide(modifier="Multires") - if obj.mode == 'SCULPT': + if workspace.object_mode == 'SCULPT': if mod.sculpt_levels != level: mod.sculpt_levels = level - elif obj.mode == 'OBJECT': + elif workspace.object_mode == 'OBJECT': if mod.levels != level: mod.levels = level return else: - if obj.mode == 'SCULPT': + if workspace.object_mode == 'SCULPT': if mod.sculpt_levels + level <= mod.total_levels: mod.sculpt_levels += level - elif obj.mode == 'OBJECT': + elif workspace.object_mode == 'OBJECT': if mod.levels + level <= mod.total_levels: mod.levels += level return @@ -284,7 +287,7 @@ class SubdivisionSet(Operator): # add a new modifier try: - if obj.mode == 'SCULPT': + if workspace.object_mode == 'SCULPT': mod = obj.modifiers.new("Multires", 'MULTIRES') if level > 0: for i in range(0, level): @@ -467,8 +470,9 @@ class ShapeTransfer(Operator): @classmethod def poll(cls, context): + workspace = context.workspace obj = context.active_object - return (obj and obj.mode != 'EDIT') + return (obj and workspace.object_mode != 'EDIT') def execute(self, context): ob_act = context.active_object @@ -508,10 +512,11 @@ class JoinUVs(Operator): def _main(self, context): import array + workspace = context.workspace obj = context.active_object mesh = obj.data - is_editmode = (obj.mode == 'EDIT') + is_editmode = (workspace.object_mode == 'EDIT') if is_editmode: bpy.ops.object.mode_set(mode='OBJECT', toggle=False) diff --git a/release/scripts/startup/bl_operators/object_quick_effects.py b/release/scripts/startup/bl_operators/object_quick_effects.py index ae64caca91e..9fa6dbf6eef 100644 --- a/release/scripts/startup/bl_operators/object_quick_effects.py +++ b/release/scripts/startup/bl_operators/object_quick_effects.py @@ -73,9 +73,10 @@ class QuickFur(Operator): ) def execute(self, context): + workspace = context.workspace fake_context = context.copy() mesh_objects = [obj for obj in context.selected_objects - if obj.type == 'MESH' and obj.mode == 'OBJECT'] + if obj.type == 'MESH' and workspace.object_mode == 'OBJECT'] if not mesh_objects: self.report({'ERROR'}, "Select at least one mesh object") diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py index 61ceb3c04c4..dde98ce9013 100644 --- a/release/scripts/startup/bl_operators/uvcalc_lightmap.py +++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py @@ -558,8 +558,8 @@ def lightmap_uvpack(meshes, def unwrap(operator, context, **kwargs): - - is_editmode = (context.object.mode == 'EDIT') + workspace = context.workspace + is_editmode = (workspace.object_mode == 'EDIT') if is_editmode: bpy.ops.object.mode_set(mode='OBJECT', toggle=False) diff --git a/release/scripts/startup/bl_operators/uvcalc_smart_project.py b/release/scripts/startup/bl_operators/uvcalc_smart_project.py index 25783653414..f648bebed26 100644 --- a/release/scripts/startup/bl_operators/uvcalc_smart_project.py +++ b/release/scripts/startup/bl_operators/uvcalc_smart_project.py @@ -748,7 +748,8 @@ def main(context, USER_FILL_HOLES_QUALITY = 50 # Only for hole filling. USER_VIEW_INIT = 0 # Only for hole filling. - is_editmode = (context.active_object.mode == 'EDIT') + workspace = context.workspace + is_editmode = (workspace.object_mode == 'EDIT') if is_editmode: obList = [ob for ob in [context.active_object] if ob and ob.type == 'MESH'] else: @@ -781,7 +782,7 @@ def main(context, # Toggle Edit mode - is_editmode = (context.active_object.mode == 'EDIT') + is_editmode = (workspace.object_mode == 'EDIT') if is_editmode: bpy.ops.object.mode_set(mode='OBJECT') # Assume face select mode! an annoying hack to toggle face select mode because Mesh doesn't like faceSelectMode. diff --git a/release/scripts/startup/bl_operators/view3d.py b/release/scripts/startup/bl_operators/view3d.py index 18f91110053..e54ead6a5fc 100644 --- a/release/scripts/startup/bl_operators/view3d.py +++ b/release/scripts/startup/bl_operators/view3d.py @@ -30,8 +30,9 @@ class VIEW3D_OT_edit_mesh_extrude_individual_move(Operator): @classmethod def poll(cls, context): + workspace = context.workspace obj = context.active_object - return (obj is not None and obj.mode == 'EDIT') + return (obj is not None and workspace.object_mode == 'EDIT') def execute(self, context): mesh = context.object.data @@ -68,8 +69,9 @@ class VIEW3D_OT_edit_mesh_extrude_move(Operator): @classmethod def poll(cls, context): + workspace = context.workspace obj = context.active_object - return (obj is not None and obj.mode == 'EDIT') + return (obj is not None and workspace.object_mode == 'EDIT') @staticmethod def extrude_region(context, use_vert_normals): @@ -117,8 +119,9 @@ class VIEW3D_OT_edit_mesh_extrude_shrink_fatten(Operator): @classmethod def poll(cls, context): + workspace = context.workspace obj = context.active_object - return (obj is not None and obj.mode == 'EDIT') + return (obj is not None and workspace.object_mode == 'EDIT') def execute(self, context): return VIEW3D_OT_edit_mesh_extrude_move.extrude_region(context, True) @@ -173,7 +176,8 @@ class VIEW3D_OT_select_or_deselect_all(Operator): def poll(cls, context): active_object = context.active_object if active_object: - return active_object.mode in {'EDIT', 'OBJECT', 'POSE'} + workspace = context.workspace + return workspace.object_mode in {'EDIT', 'OBJECT', 'POSE'} return True def invoke(self, context, event): @@ -184,7 +188,9 @@ class VIEW3D_OT_select_or_deselect_all(Operator): active_object = context.active_object if active_object: - if active_object.mode == 'EDIT': + workspace = context.workspace + object_mode = workspace.object_mode + if object_mode == 'EDIT': if active_object.type == 'MESH': bpy.ops.mesh.select_all(action='DESELECT') elif active_object.type == 'CURVE': @@ -197,9 +203,9 @@ class VIEW3D_OT_select_or_deselect_all(Operator): bpy.ops.mball.select_all(action='DESELECT') elif active_object.type == 'ARMATURE': bpy.ops.armature.select_all(action='DESELECT') - elif active_object.mode == 'POSE': + elif object_mode == 'POSE': bpy.ops.pose.select_all(action='DESELECT') - elif active_object.mode == 'PARTICLE_EDIT': + elif object_mode == 'PARTICLE_EDIT': bpy.ops.particle.select_all(action='DESELECT') else: bpy.ops.object.select_all(action='DESELECT') diff --git a/release/scripts/startup/bl_ui/properties_constraint.py b/release/scripts/startup/bl_ui/properties_constraint.py index 9b61101778f..f374d95c493 100644 --- a/release/scripts/startup/bl_ui/properties_constraint.py +++ b/release/scripts/startup/bl_ui/properties_constraint.py @@ -910,8 +910,9 @@ class OBJECT_PT_constraints(ConstraintButtonsPanel, Panel): layout = self.layout obj = context.object + workspace = context.workspace - if obj.type == 'ARMATURE' and obj.mode == 'POSE': + if obj.type == 'ARMATURE' and workspace.object_mode == 'POSE': box = layout.box() box.alert = True # XXX: this should apply to the box background box.label(icon='INFO', text="Constraints for active bone do not live here") diff --git a/release/scripts/startup/bl_ui/properties_data_bone.py b/release/scripts/startup/bl_ui/properties_data_bone.py index f0ef0032059..e8f290772d8 100644 --- a/release/scripts/startup/bl_ui/properties_data_bone.py +++ b/release/scripts/startup/bl_ui/properties_data_bone.py @@ -58,7 +58,8 @@ class BONE_PT_transform(BoneButtonsPanel, Panel): return True ob = context.object - return ob and ob.mode == 'POSE' and context.bone + workspace = context.workspace + return ob and workspace.object_mode == 'POSE' and context.bone def draw(self, context): layout = self.layout @@ -110,7 +111,8 @@ class BONE_PT_transform_locks(BoneButtonsPanel, Panel): @classmethod def poll(cls, context): ob = context.object - return ob and ob.mode == 'POSE' and context.bone + workspace = context.workspace + return ob and workspace.object_mode == 'POSE' and context.bone def draw(self, context): layout = self.layout @@ -311,7 +313,8 @@ class BONE_PT_inverse_kinematics(BoneButtonsPanel, Panel): @classmethod def poll(cls, context): ob = context.object - return ob and ob.mode == 'POSE' and context.bone + workspace = context.workspace + return ob and workspace.object_mode == 'POSE' and context.bone def draw(self, context): layout = self.layout @@ -439,7 +442,8 @@ class BONE_PT_custom_props(BoneButtonsPanel, PropertyPanel, Panel): @property def _context_path(self): obj = bpy.context.object - if obj and obj.mode == 'POSE': + workspace = context.workspace + if obj and workspace.object_mode == 'POSE': return "active_pose_bone" else: return "active_bone" diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py index 9f927fe3368..ee6e09039be 100644 --- a/release/scripts/startup/bl_ui/properties_data_mesh.py +++ b/release/scripts/startup/bl_ui/properties_data_mesh.py @@ -94,10 +94,13 @@ class MESH_UL_shape_keys(UIList): # key = data key_block = item if self.layout_type in {'DEFAULT', 'COMPACT'}: + workspace = context.workspace split = layout.split(0.66, False) split.prop(key_block, "name", text="", emboss=False, icon_value=icon) row = split.row(align=True) - if key_block.mute or (obj.mode == 'EDIT' and not (obj.use_shape_key_edit_mode and obj.type == 'MESH')): + if (key_block.mute or + (workspace.object_mode == 'EDIT' and not (obj.use_shape_key_edit_mode and obj.type == 'MESH')) + ): row.active = False if not item.id_data.use_relative: row.prop(key_block, "frame", text="", emboss=False) @@ -205,6 +208,7 @@ class DATA_PT_vertex_groups(MeshButtonsPanel, Panel): def draw(self, context): layout = self.layout + workspace = context.workspace ob = context.object group = ob.vertex_groups.active @@ -225,7 +229,10 @@ class DATA_PT_vertex_groups(MeshButtonsPanel, Panel): col.operator("object.vertex_group_move", icon='TRIA_UP', text="").direction = 'UP' col.operator("object.vertex_group_move", icon='TRIA_DOWN', text="").direction = 'DOWN' - if ob.vertex_groups and (ob.mode == 'EDIT' or (ob.mode == 'WEIGHT_PAINT' and ob.type == 'MESH' and ob.data.use_paint_mask_vertex)): + if (ob.vertex_groups and + ((workspace.object_mode == 'EDIT') or + (workspace.object_mode == 'WEIGHT_PAINT' and ob.type == 'MESH' and ob.data.use_paint_mask_vertex)) + ): row = layout.row() sub = row.row(align=True) @@ -251,6 +258,7 @@ class DATA_PT_face_maps(MeshButtonsPanel, Panel): def draw(self, context): layout = self.layout + workspace = context.workspace ob = context.object facemap = ob.face_maps.active @@ -269,7 +277,7 @@ class DATA_PT_face_maps(MeshButtonsPanel, Panel): col.operator("object.face_map_move", icon='TRIA_UP', text="").direction = 'UP' col.operator("object.face_map_move", icon='TRIA_DOWN', text="").direction = 'DOWN' - if ob.face_maps and (ob.mode == 'EDIT' and ob.type == 'MESH'): + if ob.face_maps and (workspace.object_mode == 'EDIT' and ob.type == 'MESH'): row = layout.row() sub = row.row(align=True) @@ -293,11 +301,12 @@ class DATA_PT_shape_keys(MeshButtonsPanel, Panel): def draw(self, context): layout = self.layout + workspace = context.workspace ob = context.object key = ob.data.shape_keys kb = ob.active_shape_key - enable_edit = ob.mode != 'EDIT' + enable_edit = workspace.object_mode != 'EDIT' enable_edit_value = False if ob.show_only_shape_key is False: @@ -419,6 +428,7 @@ class DATA_PT_customdata(MeshButtonsPanel, Panel): def draw(self, context): layout = self.layout + workspace = context.workspace obj = context.object me = context.mesh col = layout.column() @@ -433,7 +443,7 @@ class DATA_PT_customdata(MeshButtonsPanel, Panel): col = layout.column() - col.enabled = (obj.mode != 'EDIT') + col.enabled = (workspace.object_mode != 'EDIT') col.prop(me, "use_customdata_vertex_bevel") col.prop(me, "use_customdata_edge_bevel") col.prop(me, "use_customdata_edge_crease") diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 3169878ffe3..599b7c943a4 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -414,6 +414,8 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): layout.label(text="Settings are inside the Physics tab") def HOOK(self, layout, ob, md): + from bpy import context + workspace = context.workspace use_falloff = (md.falloff_type != 'NONE') split = layout.split() @@ -445,7 +447,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col = split.column() col.prop(md, "use_falloff_uniform") - if ob.mode == 'EDIT': + if workspace.object_mode == 'EDIT': row = col.row(align=True) row.operator("object.hook_reset", text="Reset") row.operator("object.hook_recenter", text="Recenter") @@ -601,6 +603,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col.prop(md, "mirror_object", text="") def MULTIRES(self, layout, ob, md): + from bpy import context + workspace = context.workspace + layout.row().prop(md, "subdivision_type", expand=True) split = layout.split() @@ -611,7 +616,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col = split.column() - col.enabled = ob.mode != 'EDIT' + col.enabled = workspace.object_mode != 'EDIT' col.operator("object.multires_subdivide", text="Subdivide") col.operator("object.multires_higher_levels_delete", text="Delete Higher") col.operator("object.multires_reshape", text="Reshape") diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index 9aed338bad4..2dc7bffa527 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -148,7 +148,7 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel, Panel): col.operator("object.material_slot_move", icon='TRIA_UP', text="").direction = 'UP' col.operator("object.material_slot_move", icon='TRIA_DOWN', text="").direction = 'DOWN' - if ob.mode == 'EDIT': + if context.workspace.object_mode == 'EDIT': row = layout.row(align=True) row.operator("object.material_slot_assign", text="Assign") row.operator("object.material_slot_select", text="Select") @@ -1094,7 +1094,7 @@ class EEVEE_MATERIAL_PT_context_material(MaterialButtonsPanel, Panel): col.operator("object.material_slot_move", icon='TRIA_UP', text="").direction = 'UP' col.operator("object.material_slot_move", icon='TRIA_DOWN', text="").direction = 'DOWN' - if ob.mode == 'EDIT': + if context.workspace.object_mode == 'EDIT': row = layout.row(align=True) row.operator("object.material_slot_assign", text="Assign") row.operator("object.material_slot_select", text="Select") diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py index 123e95c013c..14ecb86e577 100644 --- a/release/scripts/startup/bl_ui/space_image.py +++ b/release/scripts/startup/bl_ui/space_image.py @@ -1208,7 +1208,8 @@ class ImageScopesPanel: if sima.mode == 'PAINT': return False ob = context.active_object - if ob and ob.mode in {'TEXTURE_PAINT', 'EDIT'}: + workspace = context.workspace + if ob and workspace.object_mode in {'TEXTURE_PAINT', 'EDIT'}: return False return True diff --git a/release/scripts/startup/bl_ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py index f032f6a899b..8c69e733a2d 100644 --- a/release/scripts/startup/bl_ui/space_info.py +++ b/release/scripts/startup/bl_ui/space_info.py @@ -48,10 +48,7 @@ class INFO_HT_header(Header): layout.template_ID(window, "workspace", new="workspace.workspace_add_menu", unlink="workspace.workspace_delete") layout.template_search_preview(window, "screen", workspace, "screens", new="screen.new", unlink="screen.delete", rows=2, cols=6) - if hasattr(window, 'object_mode'): - act_mode_item = bpy.types.Object.bl_rna.properties['mode'].enum_items[window.object_mode] - else: - act_mode_item = bpy.types.Object.bl_rna.properties['mode'].enum_items[layer.objects.active.mode] + act_mode_item = bpy.types.WorkSpace.bl_rna.properties['object_mode'].enum_items[workspace.object_mode] layout.operator_menu_enum("object.mode_set", "mode", text=act_mode_item.name, icon=act_mode_item.icon) row = layout.row() @@ -87,7 +84,7 @@ class INFO_HT_header(Header): return row.operator("wm.splash", text="", icon='BLENDER', emboss=False) - row.label(text=scene.statistics(context.view_layer), translate=False) + row.label(text=scene.statistics(workspace, context.view_layer), translate=False) class INFO_MT_editor_menus(Menu): diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 9fd620eec76..a4c452857f2 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -48,7 +48,7 @@ class VIEW3D_HT_header(Header): layout.template_header_3D() if obj: - mode = obj.mode + mode = context.workspace.object_mode # Particle edit if mode == 'PARTICLE_EDIT': row.prop(toolsettings.particle_edit, "select_mode", text="", expand=True) @@ -317,8 +317,9 @@ class VIEW3D_MT_transform_armature(VIEW3D_MT_transform_base): VIEW3D_MT_transform_base.draw(self, context) # armature specific extensions follow... + workspace = context.workspace obj = context.object - if obj.type == 'ARMATURE' and obj.mode in {'EDIT', 'POSE'}: + if obj.type == 'ARMATURE' and workspace.object_mode in {'EDIT', 'POSE'}: if obj.data.draw_type == 'BBONE': layout.separator() @@ -1955,7 +1956,10 @@ class VIEW3D_MT_vertex_group(Menu): layout.operator("object.vertex_group_assign_new") ob = context.active_object - if ob.mode == 'EDIT' or (ob.mode == 'WEIGHT_PAINT' and ob.type == 'MESH' and ob.data.use_paint_mask_vertex): + workspace = context.workspace + if ((workspace.object_mode == 'EDIT') or + (workspace.object_mode == 'WEIGHT_PAINT' and ob.type == 'MESH' and ob.data.use_paint_mask_vertex) + ): if ob.vertex_groups.active: layout.separator() @@ -3388,7 +3392,7 @@ class VIEW3D_PT_view3d_properties(Panel): if lock_object: if lock_object.type == 'ARMATURE': col.prop_search(view, "lock_bone", lock_object.data, - "edit_bones" if lock_object.mode == 'EDIT' + "edit_bones" if context.mode == 'EDIT_ARMATURE' else "bones", text="") else: @@ -3441,12 +3445,13 @@ class VIEW3D_PT_view3d_name(Panel): def draw(self, context): layout = self.layout + workspace = context.workspace ob = context.active_object row = layout.row() row.label(text="", icon='OBJECT_DATA') row.prop(ob, "name", text="") - if ob.type == 'ARMATURE' and ob.mode in {'EDIT', 'POSE'}: + if ob.type == 'ARMATURE' and workspace.object_mode in {'EDIT', 'POSE'}: bone = context.active_bone if bone: row = layout.row() @@ -3764,7 +3769,8 @@ class VIEW3D_PT_etch_a_ton(Panel): def poll(cls, context): scene = context.space_data ob = context.active_object - return scene and ob and ob.type == 'ARMATURE' and ob.mode == 'EDIT' + workspace = context.workspace + return scene and ob and (ob.type == 'ARMATURE') and (workspace.object_mode == 'EDIT') def draw_header(self, context): layout = self.layout @@ -3820,7 +3826,8 @@ class VIEW3D_PT_context_properties(Panel): def _active_context_member(context): obj = context.object if obj: - mode = obj.mode + workspace = context.workspace + mode = workspace.object_mode if mode == 'POSE': return "active_pose_bone" elif mode == 'EDIT' and obj.type == 'ARMATURE': diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index e29971e1835..7a3b0f26edc 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -2051,7 +2051,7 @@ class VIEW3D_PT_tools_history(View3DPanel, Panel): row = col.row(align=True) row.operator("ed.undo") row.operator("ed.redo") - if obj is None or obj.mode != 'SCULPT': + if obj is None or workspace.object_mode != 'SCULPT': # Sculpt mode does not generate an undo menu it seems... col.operator("ed.undo_history") diff --git a/release/scripts/startup/keyingsets_builtins.py b/release/scripts/startup/keyingsets_builtins.py index 390c043bb31..0a6ece6eb5a 100644 --- a/release/scripts/startup/keyingsets_builtins.py +++ b/release/scripts/startup/keyingsets_builtins.py @@ -388,8 +388,9 @@ class BUILTIN_KSI_WholeCharacter(KeyingSetInfo): # poll - pose-mode on active object only def poll(ksi, context): - return ((context.active_object) and (context.active_object.pose) and - (context.active_object.mode == 'POSE')) + workspace = context.workspace + ob = context.active_object + return (ob and ob.pose and (workspace.object_mode == 'POSE')) # iterator - all bones regardless of selection def iterator(ksi, context, ks): diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 9bb44a726de..c3cea6c883c 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -100,6 +100,8 @@ struct GPUDrawObject; struct PBVH; struct EvaluationContext; +#include "DNA_object_enums.h" + /* number of sub-elements each mesh element has (for interpolation) */ #define SUB_ELEMS_VERT 0 #define SUB_ELEMS_EDGE 2 @@ -381,7 +383,7 @@ struct DerivedMesh { /** Get the BVH used for paint modes */ - struct PBVH *(*getPBVH)(struct Object *ob, DerivedMesh *dm); + struct PBVH *(*getPBVH)(struct Object *ob, DerivedMesh *dm, eObjectMode object_mode); /* Drawing Operations */ diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index 761bb7e8acb..22933a093ed 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -48,20 +48,21 @@ struct MVert; struct MPoly; struct MLoopTri; +#include "DNA_object_enums.h" + /* Delete mesh mdisps and grid paint masks */ void multires_customdata_delete(struct Mesh *me); -void multires_set_tot_level(struct Object *ob, - struct MultiresModifierData *mmd, int lvl); +void multires_set_tot_level(struct MultiresModifierData *mmd, int lvl, eObjectMode object_mode); void multires_mark_as_modified(struct Object *ob, enum MultiresModifiedFlags flags); void multires_force_update(struct Object *ob); -void multires_force_render_update(struct Object *ob); +void multires_force_render_update(struct Object *ob, eObjectMode object_mode); void multires_force_external_reload(struct Object *ob); /* internal, only called in subsurf_ccg.c */ -void multires_modifier_update_mdisps(struct DerivedMesh *dm); +void multires_modifier_update_mdisps(struct DerivedMesh *dm, eObjectMode object_mode); void multires_modifier_update_hidden(struct DerivedMesh *dm); void multiresModifier_set_levels_from_disps(struct MultiresModifierData *mmd, struct Object *ob); @@ -73,21 +74,27 @@ typedef enum { MULTIRES_IGNORE_SIMPLIFY = 8 } MultiresFlags; -struct DerivedMesh *multires_make_derived_from_derived(struct DerivedMesh *dm, - struct MultiresModifierData *mmd, - struct Object *ob, - MultiresFlags flags); +struct DerivedMesh *multires_make_derived_from_derived( + struct DerivedMesh *dm, + struct MultiresModifierData *mmd, + struct Object *ob, + MultiresFlags flags, + eObjectMode object_mode); struct MultiresModifierData *find_multires_modifier_before(struct Scene *scene, struct ModifierData *lastmd); struct MultiresModifierData *get_multires_modifier(struct Scene *scene, struct Object *ob, bool use_first); struct DerivedMesh *get_multires_dm(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct MultiresModifierData *mmd, struct Object *ob); -void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction); -void multiresModifier_base_apply(struct MultiresModifierData *mmd, struct Object *ob); -void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob, int updateblock, int simple); +void multiresModifier_del_levels( + struct MultiresModifierData *, struct Object *, int direction, eObjectMode object_mode); +void multiresModifier_base_apply( + struct MultiresModifierData *mmd, struct Object *ob, eObjectMode object_mode); +void multiresModifier_subdivide( + struct MultiresModifierData *mmd, struct Object *ob, int updateblock, int simple, eObjectMode object_mode); void multiresModifier_sync_levels_ex( - struct Object *ob_dst, struct MultiresModifierData *mmd_src, struct MultiresModifierData *mmd_dst); + struct Object *ob_dst, struct MultiresModifierData *mmd_src, struct MultiresModifierData *mmd_dst, + eObjectMode object_mode); int multiresModifier_reshape(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct MultiresModifierData *mmd, struct Object *dst, struct Object *src); int multiresModifier_reshapeFromDM(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct MultiresModifierData *mmd, @@ -103,7 +110,7 @@ enum { MULTIRES_SPACE_OBJECT, MULTIRES_SPACE_ABSOLUTE }; -void multires_set_space(struct DerivedMesh *dm, struct Object *ob, int from, int to); +void multires_set_space(struct DerivedMesh *dm, struct Object *ob, int from, int to, eObjectMode object_mode); /* Related to the old multires */ void multires_free(struct Multires *mr); diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 7ee70b12c91..f4983741071 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -74,7 +74,9 @@ void BKE_object_modifier_hook_reset(struct Object *ob, struct HookModifierData * bool BKE_object_support_modifier_type_check(struct Object *ob, int modifier_type); -void BKE_object_link_modifiers(struct Object *ob_dst, const struct Object *ob_src); +void BKE_object_link_modifiers( + struct Object *ob_dst, const struct Object *ob_src, + eObjectMode object_mode); void BKE_object_free_modifiers(struct Object *ob); void BKE_object_make_proxy(struct Object *ob, struct Object *target, struct Object *gob); diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h index 0e40930e813..17f6438870c 100644 --- a/source/blender/blenkernel/BKE_paint.h +++ b/source/blender/blenkernel/BKE_paint.h @@ -93,8 +93,10 @@ typedef enum eOverlayControlFlags { PAINT_OVERLAY_OVERRIDE_PRIMARY | \ PAINT_OVERLAY_OVERRIDE_CURSOR) -void BKE_paint_invalidate_overlay_tex(struct Scene *scene, struct ViewLayer *view_layer, const struct Tex *tex); -void BKE_paint_invalidate_cursor_overlay(struct Scene *scene, struct ViewLayer *view_layer, struct CurveMapping *curve); +void BKE_paint_invalidate_overlay_tex( + struct Scene *scene, struct ViewLayer *view_layer, const struct Tex *tex, eObjectMode object_mode); +void BKE_paint_invalidate_cursor_overlay( + struct Scene *scene, struct ViewLayer *view_layer, struct CurveMapping *curve, eObjectMode object_mode); void BKE_paint_invalidate_overlay_all(void); eOverlayControlFlags BKE_paint_get_overlay_flags(void); void BKE_paint_reset_overlay_invalid(eOverlayControlFlags flag); diff --git a/source/blender/blenkernel/BKE_shrinkwrap.h b/source/blender/blenkernel/BKE_shrinkwrap.h index d2ab4f3164c..0c4f2bc9c05 100644 --- a/source/blender/blenkernel/BKE_shrinkwrap.h +++ b/source/blender/blenkernel/BKE_shrinkwrap.h @@ -54,6 +54,7 @@ struct ShrinkwrapModifierData; struct MDeformVert; struct BVHTree; struct SpaceTransform; +struct EvaluationContext; typedef struct ShrinkwrapCalcData { @@ -76,8 +77,10 @@ typedef struct ShrinkwrapCalcData { } ShrinkwrapCalcData; -void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm, - float (*vertexCos)[3], int numVerts, bool for_render); +void shrinkwrapModifier_deform( + const struct EvaluationContext *eval_ctx, + struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm, + float (*vertexCos)[3], int numVerts, bool for_render); /* * This function casts a ray in the given BVHTree.. but it takes into consideration the space_transform, that is: diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h index 1c1f15ec99a..f839d4cdf76 100644 --- a/source/blender/blenkernel/BKE_workspace.h +++ b/source/blender/blenkernel/BKE_workspace.h @@ -34,17 +34,6 @@ struct Scene; struct TransformOrientation; struct ViewLayer; -/** - * Plan is to store the object-mode per workspace, not per object anymore. - * However, there's quite some work to be done for that, so for now, there is just a basic - * implementation of an object <-> workspace object-mode syncing for testing, with some known - * problems. Main problem being that the modes can get out of sync when changing object selection. - * Would require a pile of temporary changes to always sync modes when changing selection. So just - * leaving this here for some testing until object-mode is really a workspace level setting. - */ -#define USE_WORKSPACE_MODE - - /* -------------------------------------------------------------------- */ /* Create, delete, init */ @@ -106,15 +95,6 @@ void BKE_workspace_active_layout_set(struct WorkSpaceInstanceHook *h struct bScreen *BKE_workspace_active_screen_get(const struct WorkSpaceInstanceHook *hook) GETTER_ATTRS; void BKE_workspace_active_screen_set( struct WorkSpaceInstanceHook *hook, struct WorkSpace *workspace, struct bScreen *screen) SETTER_ATTRS; -#ifdef USE_WORKSPACE_MODE -enum eObjectMode BKE_workspace_object_mode_get( - const struct WorkSpace *workspace, - const struct Scene *scene) GETTER_ATTRS; -void BKE_workspace_object_mode_set( - struct WorkSpace *workspace, - struct Scene *scene, - const enum eObjectMode mode) SETTER_ATTRS; -#endif struct Base *BKE_workspace_active_base_get(const struct WorkSpace *workspace, const struct Scene *scene); struct ListBase *BKE_workspace_transform_orientations_get(struct WorkSpace *workspace) GETTER_ATTRS; struct ViewLayer *BKE_workspace_view_layer_get( @@ -151,8 +131,7 @@ void BKE_workspace_update_tagged(struct EvaluationContext *eval_ctx, void BKE_workspace_update_object_mode( struct EvaluationContext *eval_ctx, - struct WorkSpace *workspace, - struct Scene *scene); + struct WorkSpace *workspace); #undef GETTER_ATTRS #undef SETTER_ATTRS diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index ea54548ab09..c4e9ace2d5d 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -64,6 +64,8 @@ #include "GPU_shader.h" #include "GPU_basic_shader.h" +#include "DEG_depsgraph.h" + #include #include #include @@ -260,7 +262,8 @@ static bool can_pbvh_draw(Object *ob, DerivedMesh *dm) return cddm->mvert == me->mvert || ob->sculpt->kb; } -static PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm) +static PBVH *cdDM_getPBVH( + Object *ob, DerivedMesh *dm, eObjectMode UNUSED(object_mode)) { CDDerivedMesh *cddm = (CDDerivedMesh *) dm; diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index 9ac4831a047..8b7356eaa9e 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -1035,9 +1035,11 @@ int CTX_data_mode_enum_ex(const Object *obedit, const Object *ob, const eObjectM int CTX_data_mode_enum(const bContext *C) { + EvaluationContext eval_ctx; + CTX_data_eval_ctx(C, &eval_ctx); Object *obedit = CTX_data_edit_object(C); Object *obact = obedit ? NULL : CTX_data_active_object(C); - return CTX_data_mode_enum_ex(obedit, obact, obact ? obact->mode : OB_MODE_OBJECT); + return CTX_data_mode_enum_ex(obedit, obact, eval_ctx.object_mode); } /* would prefer if we can use the enum version below over this one - Campbell */ @@ -1273,10 +1275,10 @@ void CTX_data_eval_ctx(const bContext *C, EvaluationContext *eval_ctx) Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); - Object *obact = OBACT(view_layer); RenderEngineType *engine_type = CTX_data_engine_type(C); + WorkSpace *workspace = CTX_wm_workspace(C); DEG_evaluation_context_init_from_scene( eval_ctx, scene, view_layer, engine_type, - obact ? obact->mode : OB_MODE_OBJECT, DAG_EVAL_VIEWPORT); + workspace->object_mode, DAG_EVAL_VIEWPORT); } diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 55f11604710..e7c36685c42 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -60,6 +60,8 @@ #include "BKE_object.h" +#include "DEG_depsgraph.h" + #include "CCGSubSurf.h" #include @@ -336,12 +338,13 @@ MultiresModifierData *get_multires_modifier(Scene *scene, Object *ob, bool use_f return mmd; } -static int multires_get_level(Object *ob, MultiresModifierData *mmd, - bool render, bool ignore_simplify) +static int multires_get_level( + MultiresModifierData *mmd, + bool render, bool ignore_simplify, eObjectMode object_mode) { if (render) return (mmd->modifier.scene) ? get_render_subsurf_level(&mmd->modifier.scene->r, mmd->renderlvl, true) : mmd->renderlvl; - else if (ob->mode == OB_MODE_SCULPT) + else if (object_mode == OB_MODE_SCULPT) return mmd->sculptlvl; else if (ignore_simplify) return mmd->lvl; @@ -349,12 +352,13 @@ static int multires_get_level(Object *ob, MultiresModifierData *mmd, return (mmd->modifier.scene) ? get_render_subsurf_level(&mmd->modifier.scene->r, mmd->lvl, false) : mmd->lvl; } -void multires_set_tot_level(Object *ob, MultiresModifierData *mmd, int lvl) +void multires_set_tot_level(MultiresModifierData *mmd, int lvl, eObjectMode object_mode) { mmd->totlvl = lvl; - if (ob->mode != OB_MODE_SCULPT) + if (object_mode != OB_MODE_SCULPT) { mmd->lvl = CLAMPIS(MAX2(mmd->lvl, lvl), 0, mmd->totlvl); + } mmd->sculptlvl = CLAMPIS(MAX2(mmd->sculptlvl, lvl), 0, mmd->totlvl); mmd->renderlvl = CLAMPIS(MAX2(mmd->renderlvl, lvl), 0, mmd->totlvl); @@ -392,9 +396,9 @@ void multires_force_external_reload(Object *ob) multires_force_update(ob); } -void multires_force_render_update(Object *ob) +void multires_force_render_update(Object *ob, eObjectMode object_mode) { - if (ob && (ob->mode & OB_MODE_SCULPT) && modifiers_findByType(ob, eModifierType_Multires)) + if (ob && (object_mode & OB_MODE_SCULPT) && modifiers_findByType(ob, eModifierType_Multires)) multires_force_update(ob); } @@ -434,7 +438,7 @@ int multiresModifier_reshapeFromDeformMod(const struct EvaluationContext *eval_c int numVerts, result; float (*deformedVerts)[3]; - if (multires_get_level(ob, mmd, false, true) == 0) + if (multires_get_level(mmd, false, true, eval_ctx->object_mode) == 0) return 0; /* Create DerivedMesh for deformation modifier */ @@ -614,7 +618,7 @@ static void multires_grid_paint_mask_downsample(GridPaintMask *gpm, int level) } } -static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl) +static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl, eObjectMode object_mode) { Mesh *me = (Mesh *)ob->data; int levels = mmd->totlvl - lvl; @@ -676,14 +680,14 @@ static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl) } } - multires_set_tot_level(ob, mmd, lvl); + multires_set_tot_level(mmd, lvl, object_mode); } /* (direction = 1) for delete higher, (direction = 0) for lower (not implemented yet) */ -void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int direction) +void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int direction, eObjectMode object_mode) { Mesh *me = BKE_mesh_from_object(ob); - int lvl = multires_get_level(ob, mmd, false, true); + int lvl = multires_get_level(mmd, false, true, object_mode); int levels = mmd->totlvl - lvl; MDisps *mdisps; @@ -694,13 +698,14 @@ void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int dire multires_force_update(ob); if (mdisps && levels > 0 && direction == 1) { - multires_del_higher(mmd, ob, lvl); + multires_del_higher(mmd, ob, lvl, object_mode); } - multires_set_tot_level(ob, mmd, lvl); + multires_set_tot_level(mmd, lvl, object_mode); } -static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int totlvl, int simple, bool alloc_paint_mask) +static DerivedMesh *multires_dm_create_local( + Object *ob, DerivedMesh *dm, int lvl, int totlvl, int simple, bool alloc_paint_mask, eObjectMode object_mode) { MultiresModifierData mmd = {{NULL}}; MultiresFlags flags = MULTIRES_USE_LOCAL_MMD; @@ -714,10 +719,12 @@ static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lv if (alloc_paint_mask) flags |= MULTIRES_ALLOC_PAINT_MASK; - return multires_make_derived_from_derived(dm, &mmd, ob, flags); + return multires_make_derived_from_derived(dm, &mmd, ob, flags, object_mode); } -static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal, int plain_uv, int alloc_paint_mask) +static DerivedMesh *subsurf_dm_create_local( + DerivedMesh *dm, int lvl, int simple, + int optimal, int plain_uv, int alloc_paint_mask, eObjectMode object_mode) { SubsurfModifierData smd = {{NULL}}; SubsurfFlags flags = 0; @@ -730,7 +737,7 @@ static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl if (optimal) smd.flags |= eSubsurfModifierFlag_ControlEdges; - if (ob->mode & OB_MODE_EDIT) + if (object_mode & OB_MODE_EDIT) flags |= SUBSURF_IN_EDIT_MODE; if (alloc_paint_mask) @@ -750,7 +757,7 @@ static float v3_dist_from_plane(float v[3], float center[3], float no[3]) return dot_v3v3(s, no); } -void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob) +void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob, eObjectMode object_mode) { DerivedMesh *cddm, *dispdm, *origdm; Mesh *me; @@ -772,7 +779,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob) /* generate highest level with displacements */ cddm = CDDM_from_mesh(me); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - dispdm = multires_dm_create_local(ob, cddm, totlvl, totlvl, 0, 0); + dispdm = multires_dm_create_local(ob, cddm, totlvl, totlvl, 0, 0, object_mode); cddm->release(cddm); /* copy the new locations of the base verts into the mesh */ @@ -868,7 +875,9 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob) /* subdivide the mesh to highest level without displacements */ cddm = CDDM_from_mesh(me); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0); + origdm = subsurf_dm_create_local( + cddm, totlvl, 0, + 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0, object_mode); cddm->release(cddm); /* calc disps */ @@ -878,7 +887,8 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob) dispdm->release(dispdm); } -static void multires_subdivide(MultiresModifierData *mmd, Object *ob, int totlvl, int updateblock, int simple) +static void multires_subdivide( + MultiresModifierData *mmd, Object *ob, int totlvl, int updateblock, int simple, eObjectMode object_mode) { Mesh *me = ob->data; MDisps *mdisps; @@ -907,11 +917,13 @@ static void multires_subdivide(MultiresModifierData *mmd, Object *ob, int totlvl /* create subsurf DM from original mesh at high level */ cddm = CDDM_from_mesh(me); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask); + highdm = subsurf_dm_create_local( + cddm, totlvl, simple, + 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask, object_mode); ss = ((CCGDerivedMesh *)highdm)->ss; /* create multires DM from original mesh at low level */ - lowdm = multires_dm_create_local(ob, cddm, lvl, lvl, simple, has_mask); + lowdm = multires_dm_create_local(ob, cddm, lvl, lvl, simple, has_mask, object_mode); BLI_assert(lowdm != cddm); cddm->release(cddm); @@ -958,12 +970,13 @@ static void multires_subdivide(MultiresModifierData *mmd, Object *ob, int totlvl multires_reallocate_mdisps(me->totloop, mdisps, totlvl); } - multires_set_tot_level(ob, mmd, totlvl); + multires_set_tot_level(mmd, totlvl, object_mode); } -void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updateblock, int simple) +void multiresModifier_subdivide( + MultiresModifierData *mmd, Object *ob, int updateblock, int simple, eObjectMode object_mode) { - multires_subdivide(mmd, ob, mmd->totlvl + 1, updateblock, simple); + multires_subdivide(mmd, ob, mmd->totlvl + 1, updateblock, simple, object_mode); } static void grid_tangent(const CCGKey *key, int x, int y, int axis, CCGElem *grid, float t[3]) @@ -1196,7 +1209,7 @@ static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm } } -void multires_modifier_update_mdisps(struct DerivedMesh *dm) +void multires_modifier_update_mdisps(struct DerivedMesh *dm, eObjectMode object_mode) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm; Object *ob; @@ -1228,11 +1241,13 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm) else cddm = CDDM_from_mesh(me); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask); + highdm = subsurf_dm_create_local( + cddm, totlvl, mmd->simple, + 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask, object_mode); ss = ((CCGDerivedMesh *)highdm)->ss; /* create multires DM from original mesh and displacements */ - lowdm = multires_dm_create_local(ob, cddm, lvl, totlvl, mmd->simple, has_mask); + lowdm = multires_dm_create_local(ob, cddm, lvl, totlvl, mmd->simple, has_mask, object_mode); cddm->release(cddm); /* gather grid data */ @@ -1290,7 +1305,9 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm) else cddm = CDDM_from_mesh(me); DM_set_only_copy(cddm, CD_MASK_BAREMESH); - subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask); + subdm = subsurf_dm_create_local( + cddm, mmd->totlvl, mmd->simple, + 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask, object_mode); cddm->release(cddm); multiresModifier_disp_run(dm, me, NULL, CALC_DISPLACEMENTS, subdm->getGridData(subdm), mmd->totlvl); @@ -1332,7 +1349,7 @@ void multires_modifier_update_hidden(DerivedMesh *dm) } } -void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to) +void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to, eObjectMode object_mode) { DerivedMesh *ccgdm = NULL, *subsurf = NULL; CCGElem **gridData, **subGridData = NULL; @@ -1353,10 +1370,11 @@ void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to) } totlvl = mmd->totlvl; - ccgdm = multires_dm_create_local(ob, dm, totlvl, totlvl, mmd->simple, false); + ccgdm = multires_dm_create_local(ob, dm, totlvl, totlvl, mmd->simple, false, object_mode); - subsurf = subsurf_dm_create_local(ob, dm, totlvl, - mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges, mmd->flags & eMultiresModifierFlag_PlainUv, 0); + subsurf = subsurf_dm_create_local( + dm, totlvl, mmd->simple, + mmd->flags & eMultiresModifierFlag_ControlEdges, mmd->flags & eMultiresModifierFlag_PlainUv, 0, object_mode); numGrids = subsurf->getNumGrids(subsurf); gridSize = subsurf->getGridSize(subsurf); @@ -1471,10 +1489,12 @@ void multires_stitch_grids(Object *ob) } } -DerivedMesh *multires_make_derived_from_derived(DerivedMesh *dm, - MultiresModifierData *mmd, - Object *ob, - MultiresFlags flags) +DerivedMesh *multires_make_derived_from_derived( + DerivedMesh *dm, + MultiresModifierData *mmd, + Object *ob, + MultiresFlags flags, + eObjectMode object_mode) { Mesh *me = ob->data; DerivedMesh *result; @@ -1483,16 +1503,18 @@ DerivedMesh *multires_make_derived_from_derived(DerivedMesh *dm, CCGKey key; const bool render = (flags & MULTIRES_USE_RENDER_PARAMS) != 0; const bool ignore_simplify = (flags & MULTIRES_IGNORE_SIMPLIFY) != 0; - int lvl = multires_get_level(ob, mmd, render, ignore_simplify); + int lvl = multires_get_level(mmd, render, ignore_simplify, object_mode); int i, gridSize, numGrids; if (lvl == 0) return dm; - result = subsurf_dm_create_local(ob, dm, lvl, - mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges, - mmd->flags & eMultiresModifierFlag_PlainUv, - flags & MULTIRES_ALLOC_PAINT_MASK); + result = subsurf_dm_create_local( + dm, lvl, mmd->simple, + mmd->flags & eMultiresModifierFlag_ControlEdges, + mmd->flags & eMultiresModifierFlag_PlainUv, + flags & MULTIRES_ALLOC_PAINT_MASK, + object_mode); if (!(flags & MULTIRES_USE_LOCAL_MMD)) { ccgdm = (CCGDerivedMesh *)result; @@ -2120,6 +2142,7 @@ void multires_load_old(Object *ob, Mesh *me) DerivedMesh *dm, *orig; CustomDataLayer *l; int i; + const eObjectMode object_mode = OB_MODE_OBJECT; /* Load original level into the mesh */ lvl = me->mr->levels.first; @@ -2168,7 +2191,7 @@ void multires_load_old(Object *ob, Mesh *me) BLI_insertlinkbefore(&ob->modifiers, md, mmd); for (i = 0; i < me->mr->level_count - 1; ++i) - multiresModifier_subdivide(mmd, ob, 1, 0); + multiresModifier_subdivide(mmd, ob, 1, 0, object_mode); mmd->lvl = mmd->totlvl; orig = CDDM_from_mesh(me); @@ -2177,7 +2200,7 @@ void multires_load_old(Object *ob, Mesh *me) * reference subsurfed dm with this option, before calling multiresModifier_disp_run(), * which implicitly expects both subsurfs from its first dm and oldGridData parameters to * be of the same "format"! */ - dm = multires_make_derived_from_derived(orig, mmd, ob, 0); + dm = multires_make_derived_from_derived(orig, mmd, ob, 0, object_mode); multires_load_old_dm(dm, me, mmd->totlvl + 1); @@ -2192,21 +2215,22 @@ void multires_load_old(Object *ob, Mesh *me) /* If 'ob_src' and 'ob_dst' both have multires modifiers, synchronize them * such that 'ob_dst' has the same total number of levels as 'ob_src'. */ -void multiresModifier_sync_levels_ex(Object *ob_dst, MultiresModifierData *mmd_src, MultiresModifierData *mmd_dst) +void multiresModifier_sync_levels_ex( + Object *ob_dst, MultiresModifierData *mmd_src, MultiresModifierData *mmd_dst, eObjectMode object_mode) { if (mmd_src->totlvl == mmd_dst->totlvl) { return; } if (mmd_src->totlvl > mmd_dst->totlvl) { - multires_subdivide(mmd_dst, ob_dst, mmd_src->totlvl, false, mmd_dst->simple); + multires_subdivide(mmd_dst, ob_dst, mmd_src->totlvl, false, mmd_dst->simple, object_mode); } else { - multires_del_higher(mmd_dst, ob_dst, mmd_src->totlvl); + multires_del_higher(mmd_dst, ob_dst, mmd_src->totlvl, object_mode); } } -static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst) +static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst, eObjectMode object_mode) { MultiresModifierData *mmd_src = get_multires_modifier(scene, ob_src, true); MultiresModifierData *mmd_dst = get_multires_modifier(scene, ob_dst, true); @@ -2221,7 +2245,7 @@ static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst) } if (mmd_src && mmd_dst) { - multiresModifier_sync_levels_ex(ob_dst, mmd_src, mmd_dst); + multiresModifier_sync_levels_ex(ob_dst, mmd_src, mmd_dst, object_mode); } } @@ -2314,7 +2338,9 @@ static void multires_apply_smat(const struct EvaluationContext *eval_ctx, Scene MEM_freeN(vertCos); /* scaled ccgDM for tangent space of object with applied scale */ - dm = subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0); + dm = subsurf_dm_create_local( + cddm, high_mmd.totlvl, high_mmd.simple, + 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0, eval_ctx->object_mode); cddm->release(cddm); gridSize = dm->getGridSize(dm); @@ -2377,7 +2403,7 @@ void multiresModifier_scale_disp(const struct EvaluationContext *eval_ctx, Scene void multiresModifier_prepare_join(const struct EvaluationContext *eval_ctx, Scene *scene, Object *ob, Object *to_ob) { float smat[3][3], tmat[3][3], mat[3][3]; - multires_sync_levels(scene, to_ob, ob); + multires_sync_levels(scene, to_ob, ob, eval_ctx->object_mode); /* construct scale matrix for displacement */ BKE_object_scale_to_mat3(to_ob, tmat); diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 1cf926c609d..7f20c2f271b 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -262,7 +262,9 @@ bool BKE_object_support_modifier_type_check(Object *ob, int modifier_type) return true; } -void BKE_object_link_modifiers(struct Object *ob_dst, const struct Object *ob_src) +void BKE_object_link_modifiers( + struct Object *ob_dst, const struct Object *ob_src, + eObjectMode object_mode) { ModifierData *md; BKE_object_free_modifiers(ob_dst); @@ -301,7 +303,8 @@ void BKE_object_link_modifiers(struct Object *ob_dst, const struct Object *ob_sr if (md->type == eModifierType_Multires) { /* Has to be done after mod creation, but *before* we actually copy its settings! */ - multiresModifier_sync_levels_ex(ob_dst, (MultiresModifierData *)md, (MultiresModifierData *)nmd); + multiresModifier_sync_levels_ex( + ob_dst, (MultiresModifierData *)md, (MultiresModifierData *)nmd, object_mode); } modifier_copyData(md, nmd); @@ -1155,7 +1158,9 @@ bool BKE_object_pose_context_check(Object *ob) if ((ob) && (ob->type == OB_ARMATURE) && (ob->pose) && - (ob->mode & OB_MODE_POSE)) + // (ob->mode & OB_MODE_POSE) + (((bArmature *)ob->data)->flag & ARM_POSEMODE) + ) { return true; } @@ -1241,7 +1246,6 @@ void BKE_object_copy_data(Main *UNUSED(bmain), Object *ob_dst, const Object *ob_ BKE_object_facemap_copy_list(&ob_dst->fmaps, &ob_src->fmaps); BKE_constraints_copy_ex(&ob_dst->constraints, &ob_src->constraints, flag_subdata, true); - ob_dst->mode = OB_MODE_OBJECT; ob_dst->sculpt = NULL; if (ob_src->pd) { diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index 5ba4face835..5a267f97d03 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -75,29 +75,67 @@ const char PAINT_CURSOR_TEXTURE_PAINT[3] = {255, 255, 255}; static eOverlayControlFlags overlay_flags = 0; -void BKE_paint_invalidate_overlay_tex(Scene *scene, ViewLayer *view_layer, const Tex *tex) +/* Keep in sync with 'BKE_paint_get_active' */ +#define OB_MODE_HAS_PAINT_STRUCT(SEP) \ + OB_MODE_SCULPT SEP \ + OB_MODE_VERTEX_PAINT SEP \ + OB_MODE_WEIGHT_PAINT SEP \ + OB_MODE_TEXTURE_PAINT SEP \ + OB_MODE_EDIT + +#define COMMA , +static const eObjectMode ob_mode_has_paint_struct = OB_MODE_HAS_PAINT_STRUCT(|); +static const eObjectMode ob_mode_has_paint_struct_array[] = {OB_MODE_HAS_PAINT_STRUCT(COMMA)}; +#undef COMMA + +#define FOREACH_OB_MODE_PAINT_ITER_BEGIN(scene, view_layer, object_mode, p) \ +{ \ + eObjectMode object_mode_test = object_mode & ob_mode_has_paint_struct; \ + for (uint _i = 0; _i < ARRAY_SIZE(ob_mode_has_paint_struct_array) && object_mode_test; _i++) { \ + eObjectMode object_mode_single = ob_mode_has_paint_struct_array[_i]; \ + if (object_mode_test & object_mode_single) { \ + object_mode_test &= ~object_mode_single; \ + Paint *p = BKE_paint_get_active(scene, view_layer, object_mode_single); \ + { + +#define FOREACH_OB_MODE_PAINT_ITER_END \ + } \ + } \ + } \ +} ((void)0) + +void BKE_paint_invalidate_overlay_tex( + Scene *scene, ViewLayer *view_layer, const Tex *tex, eObjectMode object_mode) { - /* TODO/OBMODE (we should combine all) */ - Paint *p = BKE_paint_get_active(scene, view_layer, G.main->eval_ctx->object_mode); - Brush *br = p->brush; - - if (!br) - return; - - if (br->mtex.tex == tex) - overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_PRIMARY; - if (br->mask_mtex.tex == tex) - overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_SECONDARY; + FOREACH_OB_MODE_PAINT_ITER_BEGIN(scene, view_layer, object_mode, p) + { + Brush *br = p->brush; + if (br) { + if (br->mtex.tex == tex) { + overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_PRIMARY; + } + if (br->mask_mtex.tex == tex) { + overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_SECONDARY; + } + } + } + FOREACH_OB_MODE_PAINT_ITER_END; } -void BKE_paint_invalidate_cursor_overlay(Scene *scene, ViewLayer *view_layer, CurveMapping *curve) +void BKE_paint_invalidate_cursor_overlay( + Scene *scene, ViewLayer *view_layer, CurveMapping *curve, eObjectMode object_mode) { - /* TODO/OBMODE (we should combine all) */ - Paint *p = BKE_paint_get_active(scene, view_layer, G.main->eval_ctx->object_mode); - Brush *br = p->brush; - - if (br && br->curve == curve) - overlay_flags |= PAINT_INVALID_OVERLAY_CURVE; + FOREACH_OB_MODE_PAINT_ITER_BEGIN(scene, view_layer, object_mode, p) + { + Brush *br = p->brush; + if (br) { + if (br->curve == curve) { + overlay_flags |= PAINT_INVALID_OVERLAY_CURVE; + break; + } + } + } + FOREACH_OB_MODE_PAINT_ITER_END; } void BKE_paint_invalidate_overlay_all(void) @@ -794,7 +832,7 @@ void BKE_sculptsession_free(Object *ob) BM_log_free(ss->bm_log); if (dm && dm->getPBVH) - dm->getPBVH(NULL, dm); /* signal to clear */ + dm->getPBVH(NULL, dm, OB_MODE_OBJECT); /* signal to clear */ if (ss->texcache) MEM_freeN(ss->texcache); @@ -949,7 +987,7 @@ void BKE_sculpt_update_mesh_elements( ss->vmask = CustomData_get_layer(&me->vdata, CD_PAINT_MASK); } - ss->pbvh = dm->getPBVH(ob, dm); + ss->pbvh = dm->getPBVH(ob, dm, eval_ctx->object_mode); ss->pmap = (need_pmap && dm->getPolyMap) ? dm->getPolyMap(ob, dm) : NULL; pbvh_show_diffuse_color_set(ss->pbvh, ss->show_diffuse_color); diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 0ca83fba4b5..d227ea55816 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -3223,8 +3223,6 @@ void object_remove_particle_system(Scene *UNUSED(scene), Object *ob) if (ob->particlesystem.first) ((ParticleSystem *) ob->particlesystem.first)->flag |= PSYS_CURRENT; - else - ob->mode &= ~OB_MODE_PARTICLE_EDIT; DEG_relations_tag_update(G.main); DEG_id_tag_update(&ob->id, OB_RECALC_DATA); diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 16e9844241d..e3166b7d0b2 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -983,8 +983,7 @@ void BKE_scene_set_background(Main *bmain, Scene *scene) BKE_scene_validate_setscene(bmain, scene); /* can happen when switching modes in other scenes */ - if (scene->obedit && !(scene->obedit->mode & OB_MODE_EDIT)) - scene->obedit = NULL; + scene->obedit = NULL; /* deselect objects (for dataselect) */ for (ob = bmain->object.first; ob; ob = ob->id.next) diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 618f495dbf1..e91c3e43b83 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -57,6 +57,8 @@ #include "BLI_strict_flags.h" +#include "DEG_depsgraph.h" + /* for timing... */ #if 0 # include "PIL_time_utildefines.h" @@ -614,8 +616,9 @@ static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc) } /* Main shrinkwrap function */ -void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedMesh *dm, - float (*vertexCos)[3], int numVerts, bool for_render) +void shrinkwrapModifier_deform( + const EvaluationContext *eval_ctx, ShrinkwrapModifierData *smd, Object *ob, DerivedMesh *dm, + float (*vertexCos)[3], int numVerts, bool for_render) { DerivedMesh *ss_mesh = NULL; @@ -670,7 +673,8 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedM ssmd.subdivType = ME_CC_SUBSURF; /* catmull clark */ ssmd.levels = smd->subsurfLevels; /* levels */ - ss_mesh = subsurf_make_derived_from_derived(dm, &ssmd, NULL, (ob->mode & OB_MODE_EDIT) ? SUBSURF_IN_EDIT_MODE : 0); + ss_mesh = subsurf_make_derived_from_derived( + dm, &ssmd, NULL, (eval_ctx->object_mode & OB_MODE_EDIT) ? SUBSURF_IN_EDIT_MODE : 0); if (ss_mesh) { calc.vert = ss_mesh->getVertDataArray(ss_mesh, CD_MVERT); diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 9280341b4e4..10792b7d579 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -85,6 +85,8 @@ #include "CCGSubSurf.h" +#include "DEG_depsgraph.h" + #ifdef WITH_OPENSUBDIV # include "opensubdiv_capi.h" #endif @@ -3788,12 +3790,14 @@ static void ccgDM_release(DerivedMesh *dm) { ccgdm->multires.mmd = NULL; } - if (ccgdm->multires.mmd) { - if (ccgdm->multires.modified_flags & MULTIRES_COORDS_MODIFIED) - multires_modifier_update_mdisps(dm); - if (ccgdm->multires.modified_flags & MULTIRES_HIDDEN_MODIFIED) + if (ccgdm->multires.modified_flags & MULTIRES_COORDS_MODIFIED) { + /* TODO/OBMODE, pass real mode? */ + multires_modifier_update_mdisps(dm, OB_MODE_OBJECT); + } + if (ccgdm->multires.modified_flags & MULTIRES_HIDDEN_MODIFIED) { multires_modifier_update_hidden(dm); + } } } @@ -4187,7 +4191,8 @@ static int ccgDM_use_grid_pbvh(CCGDerivedMesh *ccgdm) return 1; } -static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm) +static struct PBVH *ccgDM_getPBVH( + Object *ob, DerivedMesh *dm, eObjectMode object_mode) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm; CCGKey key; @@ -4204,7 +4209,7 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm) return NULL; bool grid_pbvh = ccgDM_use_grid_pbvh(ccgdm); - if ((ob->mode & OB_MODE_SCULPT) == 0) { + if ((object_mode & OB_MODE_SCULPT) == 0) { /* In vwpaint, we may use a grid_pbvh for multires/subsurf, under certain conditions. * More complex cases break 'history' trail back to original vertices, in that case we fall back to * deformed cage only (i.e. original deformed mesh). */ diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c index 4b6bd3ac35b..dcd4183210d 100644 --- a/source/blender/blenkernel/intern/workspace.c +++ b/source/blender/blenkernel/intern/workspace.c @@ -415,21 +415,6 @@ void BKE_workspace_active_screen_set(WorkSpaceInstanceHook *hook, WorkSpace *wor BKE_workspace_hook_layout_for_workspace_set(hook, workspace, layout); } -#ifdef USE_WORKSPACE_MODE -eObjectMode BKE_workspace_object_mode_get(const WorkSpace *workspace, const Scene *scene) -{ - Base *active_base = BKE_workspace_active_base_get(workspace, scene); - return active_base ? active_base->object->mode : OB_MODE_OBJECT; -} -void BKE_workspace_object_mode_set(WorkSpace *workspace, Scene *scene, const eObjectMode mode) -{ - Base *active_base = BKE_workspace_active_base_get(workspace, scene); - if (active_base) { - active_base->object->mode = mode; - } -} -#endif - Base *BKE_workspace_active_base_get(const WorkSpace *workspace, const Scene *scene) { ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene); @@ -526,14 +511,10 @@ void BKE_workspace_update_tagged(struct EvaluationContext *eval_ctx, void BKE_workspace_update_object_mode( struct EvaluationContext *eval_ctx, - WorkSpace *workspace, Scene *scene) + WorkSpace *workspace) { - ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene); - /* TODO(campbell): Investigate how this should work exactly, * for now without this 'bmain->eval_ctx' is never set. */ - { - Object *ob = view_layer->basact ? view_layer->basact->object : NULL; - eval_ctx->object_mode = ob ? (eObjectMode)ob->mode : OB_MODE_OBJECT; - } + + eval_ctx->object_mode = workspace->object_mode; } \ No newline at end of file diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index faf4b3f5c8b..a91aeee52df 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4940,8 +4940,7 @@ static void lib_link_object(FileData *fd, Main *main) #else MEM_freeN(ob->pose); #endif - ob->pose= NULL; - ob->mode &= ~OB_MODE_POSE; + ob->pose = NULL; } } for (a=0; a < ob->totcol; a++) @@ -5548,19 +5547,6 @@ static void direct_link_object(FileData *fd, Object *ob) /* XXX This should not be needed - but seems like it can happen in some cases, so for now play safe... */ ob->proxy_from = NULL; - - /* loading saved files with editmode enabled works, but for undo we like - * to stay in object mode during undo presses so keep editmode disabled. - * - * Also when linking in a file don't allow edit and pose modes. - * See [#34776, #42780] for more information. - */ - if (fd->memfile || (ob->id.tag & (LIB_TAG_EXTERN | LIB_TAG_INDIRECT))) { - ob->mode &= ~(OB_MODE_EDIT | OB_MODE_PARTICLE_EDIT); - if (!fd->memfile) { - ob->mode &= ~OB_MODE_POSE; - } - } ob->adt = newdataadr(fd, ob->adt); direct_link_animdata(fd, ob->adt); @@ -10456,7 +10442,6 @@ static void link_object_postprocess(ID *id, Scene *scene, ViewLayer *view_layer, SceneCollection *sc; ob = (Object *)id; - ob->mode = OB_MODE_OBJECT; sc = get_scene_collection_active_or_create(scene, view_layer, flag); BKE_collection_object_add(&scene->id, sc, ob); @@ -10499,8 +10484,6 @@ void BLO_library_link_copypaste(Main *mainl, BlendHandle *bh) if (bhead->code == ID_OB) { /* Instead of instancing Base's directly, postpone until after groups are loaded * otherwise the base's flag is set incorrectly when groups are used */ - Object *ob = (Object *)id; - ob->mode = OB_MODE_OBJECT; /* ensure give_base_to_objects runs on this object */ BLI_assert(id->us == 0); } diff --git a/source/blender/blenloader/intern/versioning_250.c b/source/blender/blenloader/intern/versioning_250.c index f5a4a33860f..59dc6e9d6b7 100644 --- a/source/blender/blenloader/intern/versioning_250.c +++ b/source/blender/blenloader/intern/versioning_250.c @@ -1087,8 +1087,6 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *main) if (main->versionfile < 250 || (main->versionfile == 250 && main->subversionfile < 2)) { Scene *sce; - Object *ob; - for (sce = main->scene.first; sce; sce = sce->id.next) { if (fd->fileflags & G_FILE_ENABLE_ALL_FRAMES) sce->gm.flag |= GAME_ENABLE_ALL_FRAMES; @@ -1120,11 +1118,6 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *main) else sce->gm.matmode = GAME_MAT_TEXFACE; } - - for (ob = main->object.first; ob; ob = ob->id.next) { - if (ob->flag & 8192) // OB_POSEMODE = 8192 - ob->mode |= OB_MODE_POSE; - } } if (main->versionfile < 250 || (main->versionfile == 250 && main->subversionfile < 4)) { diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c index 67db51446df..8533083af22 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.c +++ b/source/blender/bmesh/intern/bmesh_mesh.c @@ -1019,7 +1019,8 @@ void BM_loops_calc_normal_vcos( } } -static void UNUSED_FUNCTION(bm_mdisps_space_set)(Object *ob, BMesh *bm, int from, int to) +static void UNUSED_FUNCTION(bm_mdisps_space_set)( + Object *ob, BMesh *bm, int from, int to, eObjectMode object_mode) { /* switch multires data out of tangent space */ if (CustomData_has_layer(&bm->ldata, CD_MDISPS)) { @@ -1030,7 +1031,7 @@ static void UNUSED_FUNCTION(bm_mdisps_space_set)(Object *ob, BMesh *bm, int from BMIter iter; // int i = 0; // UNUSED - multires_set_space(dm, ob, from, to); + multires_set_space(dm, ob, from, to, object_mode); mdisps = CustomData_get_layer(&dm->loopData, CD_MDISPS); diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc index 4ccf712e7d1..5daf4629708 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc @@ -436,11 +436,9 @@ void update_special_pointers(const Depsgraph *depsgraph, * new copy of the object. */ Object *object_cow = (Object *)id_cow; - const Object *object_orig = (const Object *)id_orig; (void) object_cow; /* Ignored for release builds. */ BLI_assert(object_cow->derivedFinal == NULL); BLI_assert(object_cow->derivedDeform == NULL); - object_cow->mode = object_orig->mode; break; } case ID_ME: @@ -652,7 +650,6 @@ void update_copy_on_write_object(const Depsgraph * /*depsgraph*/, extract_pose_from_pose(pose_cow, pose_orig); /* Update object itself. */ BKE_object_transform_copy(object_cow, object_orig); - object_cow->mode = object_orig->mode; } /* Update copy-on-write version of datablock from it's original ID without re-building diff --git a/source/blender/editors/armature/armature_relations.c b/source/blender/editors/armature/armature_relations.c index de2611f7092..8fc7aeaf029 100644 --- a/source/blender/editors/armature/armature_relations.c +++ b/source/blender/editors/armature/armature_relations.c @@ -281,7 +281,6 @@ int join_armature_exec(bContext *C, wmOperator *op) /* get pose of active object and move it out of posemode */ pose = ob->pose; - ob->mode &= ~OB_MODE_POSE; CTX_DATA_BEGIN(C, Base *, base, selected_editable_bases) { @@ -302,8 +301,6 @@ int join_armature_exec(bContext *C, wmOperator *op) /* Get Pose of current armature */ opose = base->object->pose; - base->object->mode &= ~OB_MODE_POSE; - //BASACT->flag &= ~OB_MODE_POSE; /* Find the difference matrix */ invert_m4_m4(oimat, ob->obmat); @@ -608,8 +605,6 @@ static int separate_armature_exec(bContext *C, wmOperator *op) /* 1) store starting settings and exit editmode */ oldob = obedit; oldbase = view_layer->basact; - oldob->mode &= ~OB_MODE_POSE; - //oldbase->flag &= ~OB_POSEMODE; ED_armature_from_edit(obedit->data); ED_armature_edit_free(obedit->data); diff --git a/source/blender/editors/armature/pose_edit.c b/source/blender/editors/armature/pose_edit.c index 74e29b2e8da..119a27cd4a7 100644 --- a/source/blender/editors/armature/pose_edit.c +++ b/source/blender/editors/armature/pose_edit.c @@ -94,13 +94,16 @@ void ED_armature_enter_posemode(bContext *C, Base *base) switch (ob->type) { case OB_ARMATURE: - ob->restore_mode = ob->mode; - ob->mode |= OB_MODE_POSE; + { + WorkSpace *workspace = CTX_wm_workspace(C); + workspace->object_mode_restore = workspace->object_mode; + workspace->object_mode |= OB_MODE_POSE; /* Inform all CoW versions that we changed the mode. */ DEG_id_tag_update_ex(CTX_data_main(C), &ob->id, DEG_TAG_COPY_ON_WRITE); WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_POSE, NULL); break; + } default: return; } @@ -112,10 +115,11 @@ void ED_armature_enter_posemode(bContext *C, Base *base) void ED_armature_exit_posemode(bContext *C, Base *base) { if (base) { + WorkSpace *workspace = CTX_wm_workspace(C); Object *ob = base->object; - ob->restore_mode = ob->mode; - ob->mode &= ~OB_MODE_POSE; + workspace->object_mode_restore = workspace->object_mode; + workspace->object_mode &= ~OB_MODE_POSE; /* Inform all CoW versions that we changed the mode. */ DEG_id_tag_update_ex(CTX_data_main(C), &ob->id, DEG_TAG_COPY_ON_WRITE); diff --git a/source/blender/editors/include/ED_image.h b/source/blender/editors/include/ED_image.h index cb824b3c9b7..9802f8c3c03 100644 --- a/source/blender/editors/include/ED_image.h +++ b/source/blender/editors/include/ED_image.h @@ -40,6 +40,7 @@ struct wmWindowManager; struct ARegion; struct Scene; struct ViewLayer; +struct WorkSpace; /* image_edit.c, exported for transform */ struct Image *ED_space_image(struct SpaceImage *sima); @@ -75,7 +76,10 @@ bool ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit); bool ED_space_image_paint_curve(const struct bContext *C); -bool ED_space_image_check_show_maskedit(struct SpaceImage *sima, struct ViewLayer *view_layer); +bool ED_space_image_check_show_maskedit( + struct SpaceImage *sima, + const struct WorkSpace *workspace, + struct ViewLayer *view_layer); int ED_space_image_maskedit_poll(struct bContext *C); int ED_space_image_maskedit_mask_poll(struct bContext *C); diff --git a/source/blender/editors/include/ED_info.h b/source/blender/editors/include/ED_info.h index 072b1a135a3..3d873906ecf 100644 --- a/source/blender/editors/include/ED_info.h +++ b/source/blender/editors/include/ED_info.h @@ -27,8 +27,11 @@ #ifndef __ED_INFO_H__ #define __ED_INFO_H__ +struct EvaluationContext; + /* info_stats.c */ void ED_info_stats_clear(struct ViewLayer *view_layer); -const char *ED_info_stats_string(struct Scene *scene, struct ViewLayer *view_layer); +const char *ED_info_stats_string( + struct Scene *scene, struct WorkSpace *workspace, struct ViewLayer *view_layer); #endif /* __ED_INFO_H__ */ diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 5c04614f4f1..94ee228f4f8 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -56,6 +56,7 @@ struct PointerRNA; struct PropertyRNA; struct EnumPropertyItem; struct EvaluationContext; +struct WorkSpace; #include "DNA_object_enums.h" @@ -116,7 +117,7 @@ struct Base *ED_object_add_duplicate(struct Main *bmain, struct Scene *scene, st void ED_object_parent(struct Object *ob, struct Object *parent, const int type, const char *substr); -bool ED_object_mode_compat_set(struct bContext *C, struct Object *ob, eObjectMode mode, struct ReportList *reports); +bool ED_object_mode_compat_set(struct bContext *C, struct WorkSpace *workspace, eObjectMode mode, struct ReportList *reports); void ED_object_toggle_modes(struct bContext *C, eObjectMode mode); /* bitflags for enter/exit editmode */ @@ -190,15 +191,17 @@ enum { MODIFIER_APPLY_SHAPE }; -struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, - struct Object *ob, const char *name, int type); +struct ModifierData *ED_object_modifier_add( + struct ReportList *reports, struct Main *bmain, struct Scene *scene, + struct Object *ob, eObjectMode object_mode, const char *name, int type); bool ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain, struct Object *ob, struct ModifierData *md); void ED_object_modifier_clear(struct Main *bmain, struct Object *ob); int ED_object_modifier_move_down(struct ReportList *reports, struct Object *ob, struct ModifierData *md); int ED_object_modifier_move_up(struct ReportList *reports, struct Object *ob, struct ModifierData *md); -int ED_object_modifier_convert(struct ReportList *reports, struct Main *bmain, struct Scene *scene, - struct ViewLayer *view_layer, struct Object *ob, struct ModifierData *md); +int ED_object_modifier_convert( + struct ReportList *reports, struct Main *bmain, struct Scene *scene, + struct ViewLayer *view_layer, struct Object *ob, eObjectMode object_mode, struct ModifierData *md); int ED_object_modifier_apply(struct ReportList *reports, const struct bContext *C, struct Scene *scene, struct Object *ob, struct ModifierData *md, int mode); int ED_object_modifier_copy(struct ReportList *reports, struct Object *ob, struct ModifierData *md); @@ -223,7 +226,9 @@ const struct EnumPropertyItem *ED_object_vgroup_selection_itemf_helper( bool *r_free, const unsigned int selection_mask); -void ED_object_check_force_modifiers(struct Main *bmain, struct Scene *scene, struct Object *object); +void ED_object_check_force_modifiers( + struct Main *bmain, struct Scene *scene, + struct Object *object, eObjectMode object_mode); /* object_facemap_ops.c */ void ED_object_facemap_face_add(struct Object *ob, struct bFaceMap *fmap, int facenum); diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index 942292788fc..18480d01ed7 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -147,6 +147,7 @@ struct ScrArea *ED_screen_state_toggle(struct bContext *C, struct wmWindow *win, void ED_screens_header_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg); bool ED_screen_stereo3d_required(const struct bScreen *screen, const struct Scene *scene); Scene *ED_screen_scene_find(const struct bScreen *screen, const struct wmWindowManager *wm); +Scene *ED_screen_scene_find_with_window(const struct bScreen *screen, const struct wmWindowManager *wm, struct wmWindow **r_window); void ED_screen_preview_render(const struct bScreen *screen, int size_x, int size_y, unsigned int *r_rect) ATTR_NONNULL(); /* workspaces */ @@ -159,7 +160,7 @@ struct WorkSpace *ED_workspace_add( bool ED_workspace_change( struct WorkSpace *workspace_new, struct bContext *C, - struct wmWindowManager *wm, struct wmWindow *win) ATTR_NONNULL(); + struct wmWindow *win) ATTR_NONNULL(); struct WorkSpace *ED_workspace_duplicate( struct WorkSpace *workspace_old, struct Main *bmain, struct wmWindow *win); diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 34a347979a8..3a01ff16297 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -46,6 +46,7 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "DNA_workspace_types.h" #include "BLI_math.h" #include "BLI_listbase.h" @@ -5232,12 +5233,11 @@ static int ui_do_but_COLOR( if (event->type == LEFTMOUSE && event->val == KM_RELEASE) { if ((int)(but->a1) == UI_PALETTE_COLOR) { if (!event->ctrl) { - EvaluationContext eval_ctx; - CTX_data_eval_ctx(C, &eval_ctx); float color[3]; + const WorkSpace *workspace = CTX_wm_workspace(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); - Paint *paint = BKE_paint_get_active(scene, view_layer, eval_ctx.object_mode); + Paint *paint = BKE_paint_get_active(scene, view_layer, workspace->object_mode); Brush *brush = BKE_paint_brush(paint); if (brush->flag & BRUSH_USE_GRADIENT) { @@ -6153,6 +6153,7 @@ static int ui_do_but_CURVE( { int mx, my, a; bool changed = false; + Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); @@ -6269,6 +6270,7 @@ static int ui_do_but_CURVE( } else if (event->type == LEFTMOUSE && event->val != KM_PRESS) { if (data->dragsel != -1) { + const WorkSpace *workspace = CTX_wm_workspace(C); CurveMapping *cumap = (CurveMapping *)but->poin; CurveMap *cuma = cumap->cm + cumap->cur; CurveMapPoint *cmp = cuma->curve; @@ -6283,7 +6285,7 @@ static int ui_do_but_CURVE( } else { curvemapping_changed(cumap, true); /* remove doubles */ - BKE_paint_invalidate_cursor_overlay(scene, view_layer, cumap); + BKE_paint_invalidate_cursor_overlay(scene, view_layer, cumap, workspace->object_mode); } } diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 56279522c88..18c18f10c13 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -2081,7 +2081,9 @@ void OBJECT_OT_convert(wmOperatorType *ot) /* used below, assumes id.new is correct */ /* leaves selection of base/object unaltered */ /* Does set ID->newid pointers. */ -static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, ViewLayer *view_layer, Object *ob, int dupflag) +static Base *object_add_duplicate_internal( + Main *bmain, Scene *scene, + ViewLayer *view_layer, Object *ob, int dupflag) { #define ID_NEW_REMAP_US(a) if ( (a)->id.newid) { (a) = (void *)(a)->id.newid; (a)->id.us++; } #define ID_NEW_REMAP_US2(a) if (((ID *)a)->newid) { (a) = ((ID *)a)->newid; ((ID *)a)->us++; } @@ -2092,10 +2094,14 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, ViewLayer ID *id; int a, didit; - if (ob->mode & OB_MODE_POSE) { + /* ignore pose mode now, Caller can inspect mode. */ +#if 0 + if (eval_ctx->object_mode & OB_MODE_POSE) { ; /* nothing? */ } - else { + else +#endif + { obn = ID_NEW_SET(ob, BKE_object_copy(bmain, ob)); DEG_id_tag_update(&obn->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME); diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c index 3efb6253f6f..cf00e657fbf 100644 --- a/source/blender/editors/object/object_bake.c +++ b/source/blender/editors/object/object_bake.c @@ -206,7 +206,8 @@ static bool multiresbake_check(bContext *C, wmOperator *op) return ok; } -static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *lvl) +static DerivedMesh *multiresbake_create_loresdm( + Scene *scene, Object *ob, eObjectMode object_mode, int *lvl) { DerivedMesh *dm; MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0); @@ -226,13 +227,15 @@ static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *l tmp_mmd.lvl = *lvl; tmp_mmd.sculptlvl = *lvl; - dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0); + dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0, object_mode); cddm->release(cddm); return dm; } -static DerivedMesh *multiresbake_create_hiresdm(Scene *scene, Object *ob, int *lvl, bool *simple) +static DerivedMesh *multiresbake_create_hiresdm( + Scene *scene, Object *ob, eObjectMode object_mode, + int *lvl, bool *simple) { Mesh *me = (Mesh *)ob->data; MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0); @@ -253,7 +256,7 @@ static DerivedMesh *multiresbake_create_hiresdm(Scene *scene, Object *ob, int *l tmp_mmd.lvl = mmd->totlvl; tmp_mmd.sculptlvl = mmd->totlvl; - dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0); + dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0, object_mode); cddm->release(cddm); return dm; @@ -323,6 +326,9 @@ static int multiresbake_image_exec_locked(bContext *C, wmOperator *op) if (!multiresbake_check(C, op)) return OPERATOR_CANCELLED; + EvaluationContext eval_ctx; + CTX_data_eval_ctx(C, &eval_ctx); + if (scene->r.bake_flag & R_BAKE_CLEAR) { /* clear images */ CTX_DATA_BEGIN (C, Base *, base, selected_editable_bases) { @@ -371,8 +377,8 @@ static int multiresbake_image_exec_locked(bContext *C, wmOperator *op) bkr.ob_image.array = BKE_object_material_edit_image_get_array(ob); bkr.ob_image.len = ob->totcol; - bkr.hires_dm = multiresbake_create_hiresdm(scene, ob, &bkr.tot_lvl, &bkr.simple); - bkr.lores_dm = multiresbake_create_loresdm(scene, ob, &bkr.lvl); + bkr.hires_dm = multiresbake_create_hiresdm(scene, ob, eval_ctx.object_mode, &bkr.tot_lvl, &bkr.simple); + bkr.lores_dm = multiresbake_create_loresdm(scene, ob, eval_ctx.object_mode, &bkr.lvl); RE_multires_bake_images(&bkr); @@ -399,6 +405,9 @@ static void init_multiresbake_job(bContext *C, MultiresBakeJob *bkj) Scene *scene = CTX_data_scene(C); Object *ob; + EvaluationContext eval_ctx; + CTX_data_eval_ctx(C, &eval_ctx); + /* backup scene settings, so their changing in UI would take no effect on baker */ bkj->bake_filter = scene->r.bake_filter; bkj->mode = scene->r.bake_mode; @@ -427,8 +436,8 @@ static void init_multiresbake_job(bContext *C, MultiresBakeJob *bkj) data->ob_image.len = ob->totcol; /* create low-resolution DM (to bake to) and hi-resolution DM (to bake from) */ - data->hires_dm = multiresbake_create_hiresdm(scene, ob, &data->tot_lvl, &data->simple); - data->lores_dm = multiresbake_create_loresdm(scene, ob, &lvl); + data->hires_dm = multiresbake_create_hiresdm(scene, ob, eval_ctx.object_mode, &data->tot_lvl, &data->simple); + data->lores_dm = multiresbake_create_loresdm(scene, ob, eval_ctx.object_mode, &lvl); data->lvl = lvl; BLI_addtail(&bkj->data, data); diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c index 37d6efa7746..50922be76eb 100644 --- a/source/blender/editors/object/object_bake_api.c +++ b/source/blender/editors/object/object_bake_api.c @@ -853,7 +853,7 @@ static int bake( /* triangulating so BVH returns the primitive_id that will be used for rendering */ highpoly[i].tri_mod = ED_object_modifier_add( - reports, bmain, scene, highpoly[i].ob, + reports, bmain, scene, highpoly[i].ob, OB_MODE_OBJECT, "TmpTriangulate", eModifierType_Triangulate); tmd = (TriangulateModifierData *)highpoly[i].tri_mod; tmd->quad_method = MOD_TRIANGULATE_QUAD_FIXED; diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 72378cfba05..b9956876cb3 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -263,8 +263,8 @@ void ED_object_editmode_exit(bContext *C, int flag) { /* Note! only in exceptional cases should 'EM_DO_UNDO' NOT be in the flag */ /* Note! if 'EM_FREEDATA' isn't in the flag, use ED_object_editmode_load directly */ + WorkSpace *workspace = CTX_wm_workspace(C); Scene *scene = CTX_data_scene(C); - ViewLayer *view_layer = CTX_data_view_layer(C); Object *obedit = CTX_data_edit_object(C); const bool freedata = (flag & EM_FREEDATA) != 0; @@ -273,9 +273,7 @@ void ED_object_editmode_exit(bContext *C, int flag) if (ED_object_editmode_load_ex(CTX_data_main(C), obedit, freedata) == false) { /* in rare cases (background mode) its possible active object * is flagged for editmode, without 'obedit' being set [#35489] */ - if (UNLIKELY(view_layer->basact && (view_layer->basact->object->mode & OB_MODE_EDIT))) { - view_layer->basact->object->mode &= ~OB_MODE_EDIT; - } + workspace->object_mode &= ~OB_MODE_EDIT; if (flag & EM_WAITCURSOR) waitcursor(0); return; } @@ -306,7 +304,7 @@ void ED_object_editmode_exit(bContext *C, int flag) WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene); - obedit->mode &= ~OB_MODE_EDIT; + workspace->object_mode &= ~OB_MODE_EDIT; } if (flag & EM_WAITCURSOR) waitcursor(0); @@ -318,6 +316,7 @@ void ED_object_editmode_exit(bContext *C, int flag) void ED_object_editmode_enter(bContext *C, int flag) { + WorkSpace *workspace = CTX_wm_workspace(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); Object *ob; @@ -347,14 +346,14 @@ void ED_object_editmode_enter(bContext *C, int flag) if (flag & EM_WAITCURSOR) waitcursor(1); - ob->restore_mode = ob->mode; + workspace->object_mode_restore = workspace->object_mode; /* note, when switching scenes the object can have editmode data but * not be scene->obedit: bug 22954, this avoids calling self eternally */ - if ((ob->restore_mode & OB_MODE_EDIT) == 0) - ED_object_toggle_modes(C, ob->mode); + if ((workspace->object_mode_restore & OB_MODE_EDIT) == 0) + ED_object_toggle_modes(C, workspace->object_mode); - ob->mode = OB_MODE_EDIT; + workspace->object_mode = OB_MODE_EDIT; if (ob->type == OB_MESH) { BMEditMesh *em; @@ -433,7 +432,7 @@ void ED_object_editmode_enter(bContext *C, int flag) } else { scene->obedit = NULL; /* XXX for context */ - ob->mode &= ~OB_MODE_EDIT; + workspace->object_mode &= ~OB_MODE_EDIT; WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene); } @@ -443,13 +442,13 @@ void ED_object_editmode_enter(bContext *C, int flag) static int editmode_toggle_exec(bContext *C, wmOperator *op) { + WorkSpace *workspace = CTX_wm_workspace(C); const int mode_flag = OB_MODE_EDIT; const bool is_mode_set = (CTX_data_edit_object(C) != NULL); Scene *scene = CTX_data_scene(C); if (!is_mode_set) { - Object *ob = CTX_data_active_object(C); - if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) { + if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) { return OPERATOR_CANCELLED; } } @@ -503,13 +502,14 @@ void OBJECT_OT_editmode_toggle(wmOperatorType *ot) static int posemode_exec(bContext *C, wmOperator *op) { + WorkSpace *workspace = CTX_wm_workspace(C); Base *base = CTX_data_active_base(C); Object *ob = base->object; const int mode_flag = OB_MODE_POSE; - const bool is_mode_set = (ob->mode & mode_flag) != 0; - + const bool is_mode_set = (workspace->object_mode & mode_flag) != 0; + if (!is_mode_set) { - if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) { + if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) { return OPERATOR_CANCELLED; } } @@ -1002,7 +1002,7 @@ static void UNUSED_FUNCTION(copy_attr_menu) (Main *bmain, Scene *scene, ViewLaye /* ******************* force field toggle operator ***************** */ -void ED_object_check_force_modifiers(Main *bmain, Scene *scene, Object *object) +void ED_object_check_force_modifiers(Main *bmain, Scene *scene, Object *object, eObjectMode object_mode) { PartDeflect *pd = object->pd; ModifierData *md = modifiers_findByType(object, eModifierType_Surface); @@ -1011,7 +1011,7 @@ void ED_object_check_force_modifiers(Main *bmain, Scene *scene, Object *object) if (!md) { if (pd && (pd->shape == PFIELD_SHAPE_SURFACE) && !ELEM(pd->forcefield, 0, PFIELD_GUIDE, PFIELD_TEXTURE)) { if (ELEM(object->type, OB_MESH, OB_SURF, OB_FONT, OB_CURVE)) { - ED_object_modifier_add(NULL, bmain, scene, object, NULL, eModifierType_Surface); + ED_object_modifier_add(NULL, bmain, scene, object, object_mode, NULL, eModifierType_Surface); } } } @@ -1024,6 +1024,8 @@ void ED_object_check_force_modifiers(Main *bmain, Scene *scene, Object *object) static int forcefield_toggle_exec(bContext *C, wmOperator *UNUSED(op)) { + EvaluationContext eval_ctx; + CTX_data_eval_ctx(C, &eval_ctx); Object *ob = CTX_data_active_object(C); if (ob->pd == NULL) @@ -1033,7 +1035,7 @@ static int forcefield_toggle_exec(bContext *C, wmOperator *UNUSED(op)) else ob->pd->forcefield = 0; - ED_object_check_force_modifiers(CTX_data_main(C), CTX_data_scene(C), ob); + ED_object_check_force_modifiers(CTX_data_main(C), CTX_data_scene(C), ob, eval_ctx.object_mode); WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); @@ -1545,18 +1547,14 @@ static bool object_mode_compat_test(Object *ob, eObjectMode mode) * * This is so each mode's exec function can call */ -bool ED_object_mode_compat_set(bContext *C, Object *ob, eObjectMode mode, ReportList *reports) +bool ED_object_mode_compat_set(bContext *C, WorkSpace *workspace, eObjectMode mode, ReportList *reports) { bool ok; - if (!ELEM(ob->mode, mode, OB_MODE_OBJECT)) { - const char *opstring = object_mode_op_string(ob->mode); + if (!ELEM(workspace->object_mode, mode, OB_MODE_OBJECT)) { + const char *opstring = object_mode_op_string(workspace->object_mode); WM_operator_name_call(C, opstring, WM_OP_EXEC_REGION_WIN, NULL); -#ifdef USE_WORKSPACE_MODE - BKE_workspace_object_mode_set(CTX_wm_workspace(C), CTX_data_scene(C), ob->mode); -#endif - - ok = ELEM(ob->mode, mode, OB_MODE_OBJECT); + ok = ELEM(workspace->object_mode, mode, OB_MODE_OBJECT); if (!ok) { wmOperatorType *ot = WM_operatortype_find(opstring, false); BKE_reportf(reports, RPT_ERROR, "Unable to execute '%s', error changing modes", ot->name); @@ -1584,10 +1582,11 @@ static int object_mode_set_poll(bContext *C) static int object_mode_set_exec(bContext *C, wmOperator *op) { + WorkSpace *workspace = CTX_wm_workspace(C); Object *ob = CTX_data_active_object(C); bGPdata *gpd = CTX_data_gpencil_data(C); eObjectMode mode = RNA_enum_get(op->ptr, "mode"); - eObjectMode restore_mode = (ob) ? ob->mode : OB_MODE_OBJECT; + eObjectMode restore_mode = workspace->object_mode; const bool toggle = RNA_boolean_get(op->ptr, "toggle"); if (gpd) { @@ -1611,28 +1610,31 @@ static int object_mode_set_exec(bContext *C, wmOperator *op) if (!ob || !object_mode_compat_test(ob, mode)) return OPERATOR_PASS_THROUGH; - if (ob->mode != mode) { + if (workspace->object_mode != mode) { /* we should be able to remove this call, each operator calls */ - ED_object_mode_compat_set(C, ob, mode, op->reports); + ED_object_mode_compat_set(C, workspace, mode, op->reports); } /* Exit current mode if it's not the mode we're setting */ - if (mode != OB_MODE_OBJECT && (ob->mode != mode || toggle)) { + if (mode != OB_MODE_OBJECT && (workspace->object_mode != mode || toggle)) { /* Enter new mode */ ED_object_toggle_modes(C, mode); } if (toggle) { /* Special case for Object mode! */ - if (mode == OB_MODE_OBJECT && restore_mode == OB_MODE_OBJECT && ob->restore_mode != OB_MODE_OBJECT) { - ED_object_toggle_modes(C, ob->restore_mode); + if ((mode == OB_MODE_OBJECT) && + (restore_mode == OB_MODE_OBJECT) && + (workspace->object_mode_restore != OB_MODE_OBJECT)) + { + ED_object_toggle_modes(C, workspace->object_mode_restore); } - else if (ob->mode == mode) { + else if (workspace->object_mode == mode) { /* For toggling, store old mode so we know what to go back to */ - ob->restore_mode = restore_mode; + workspace->object_mode_restore = restore_mode; } - else if (ob->restore_mode != OB_MODE_OBJECT && ob->restore_mode != mode) { - ED_object_toggle_modes(C, ob->restore_mode); + else if (!ELEM(workspace->object_mode_restore, mode, OB_MODE_OBJECT)) { + ED_object_toggle_modes(C, workspace->object_mode_restore); } } @@ -1670,17 +1672,7 @@ void ED_object_toggle_modes(bContext *C, eObjectMode mode) const char *opstring = object_mode_op_string(mode); if (opstring) { -#ifdef USE_WORKSPACE_MODE - WorkSpace *workspace = CTX_wm_workspace(C); -#endif WM_operator_name_call(C, opstring, WM_OP_EXEC_REGION_WIN, NULL); - -#ifdef USE_WORKSPACE_MODE - Object *ob = CTX_data_active_object(C); - if (ob) { - BKE_workspace_object_mode_set(workspace, CTX_data_scene(C), ob->mode); - } -#endif } } } diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index f3934fde356..6411676420a 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -95,7 +95,10 @@ static void modifier_skin_customdata_delete(struct Object *ob); /******************************** API ****************************/ -ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type) +ModifierData *ED_object_modifier_add( + ReportList *reports, + Main *bmain, Scene *scene, + Object *ob, eObjectMode object_mode, const char *name, int type) { ModifierData *md = NULL, *new_md = NULL; const ModifierTypeInfo *mti = modifierType_getInfo(type); @@ -162,7 +165,7 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *sc /* set totlvl from existing MDISPS layer if object already had it */ multiresModifier_set_levels_from_disps((MultiresModifierData *)new_md, ob); - if (ob->mode & OB_MODE_SCULPT) { + if (object_mode & OB_MODE_SCULPT) { /* ensure that grid paint mask layer is created */ BKE_sculpt_mask_layers_ensure(ob, (MultiresModifierData *)new_md); } @@ -252,7 +255,7 @@ static bool object_has_modifier_cb( * for any multires modifiers on the object to the int pointed to by * callback_data. */ bool ED_object_multires_update_totlevels_cb( - const struct EvaluationContext *UNUSED(eval_ctx), + const struct EvaluationContext *eval_ctx, Object *ob, void *totlevel_v) { ModifierData *md; @@ -260,7 +263,7 @@ bool ED_object_multires_update_totlevels_cb( for (md = ob->modifiers.first; md; md = md->next) { if (md->type == eModifierType_Multires) { - multires_set_tot_level(ob, (MultiresModifierData *)md, totlevel); + multires_set_tot_level((MultiresModifierData *)md, totlevel, eval_ctx->object_mode); DEG_id_tag_update(&ob->id, OB_RECALC_DATA); } } @@ -322,11 +325,13 @@ static bool object_modifier_remove(Main *bmain, Object *ob, ModifierData *md, modifier_skin_customdata_delete(ob); } +#if 0 /* not needed now modes are in workspace */ if (ELEM(md->type, eModifierType_Softbody, eModifierType_Cloth) && BLI_listbase_is_empty(&ob->particlesystem)) { ob->mode &= ~OB_MODE_PARTICLE_EDIT; } +#endif DEG_relations_tag_update(bmain); @@ -419,7 +424,9 @@ int ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData * return 1; } -int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene *scene, ViewLayer *view_layer, Object *ob, ModifierData *md) +int ED_object_modifier_convert( + ReportList *UNUSED(reports), Main *bmain, Scene *scene, + ViewLayer *view_layer, Object *UNUSED(ob), eObjectMode object_mode, ModifierData *md) { Object *obn; ParticleSystem *psys; @@ -433,7 +440,7 @@ int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene * int totpart = 0, totchild = 0; if (md->type != eModifierType_ParticleSystem) return 0; - if (ob && ob->mode & OB_MODE_PARTICLE_EDIT) return 0; + if (object_mode & OB_MODE_PARTICLE_EDIT) return 0; psys = ((ParticleSystemModifierData *)md)->psys; part = psys->part; @@ -747,12 +754,14 @@ int ED_object_modifier_copy(ReportList *UNUSED(reports), Object *ob, ModifierDat static int modifier_add_exec(bContext *C, wmOperator *op) { + EvaluationContext eval_ctx; + CTX_data_eval_ctx(C, &eval_ctx); Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); Object *ob = ED_object_active_context(C); int type = RNA_enum_get(op->ptr, "type"); - if (!ED_object_modifier_add(op->reports, bmain, scene, ob, NULL, type)) + if (!ED_object_modifier_add(op->reports, bmain, scene, ob, eval_ctx.object_mode, NULL, type)) return OPERATOR_CANCELLED; WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); @@ -1068,14 +1077,17 @@ void OBJECT_OT_modifier_apply(wmOperatorType *ot) static int modifier_convert_exec(bContext *C, wmOperator *op) { + EvaluationContext eval_ctx; + CTX_data_eval_ctx(C, &eval_ctx); Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); Object *ob = ED_object_active_context(C); ModifierData *md = edit_modifier_property_get(op, ob, 0); - - if (!md || !ED_object_modifier_convert(op->reports, bmain, scene, view_layer, ob, md)) + + if (!md || !ED_object_modifier_convert(op->reports, bmain, scene, view_layer, ob, eval_ctx.object_mode, md)) { return OPERATOR_CANCELLED; + } DEG_id_tag_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); @@ -1163,7 +1175,7 @@ static int multires_higher_levels_delete_exec(bContext *C, wmOperator *op) EvaluationContext eval_ctx; CTX_data_eval_ctx(C, &eval_ctx); - multiresModifier_del_levels(mmd, ob, 1); + multiresModifier_del_levels(mmd, ob, 1, eval_ctx.object_mode); ED_object_iter_other(&eval_ctx, CTX_data_main(C), ob, true, ED_object_multires_update_totlevels_cb, @@ -1209,7 +1221,7 @@ static int multires_subdivide_exec(bContext *C, wmOperator *op) EvaluationContext eval_ctx; CTX_data_eval_ctx(C, &eval_ctx); - multiresModifier_subdivide(mmd, ob, 0, mmd->simple); + multiresModifier_subdivide(mmd, ob, 0, mmd->simple, eval_ctx.object_mode); ED_object_iter_other( &eval_ctx, CTX_data_main(C), ob, true, @@ -1433,8 +1445,11 @@ static int multires_base_apply_exec(bContext *C, wmOperator *op) if (!mmd) return OPERATOR_CANCELLED; - - multiresModifier_base_apply(mmd, ob); + + EvaluationContext eval_ctx; + CTX_data_eval_ctx(C, &eval_ctx); + + multiresModifier_base_apply(mmd, ob, eval_ctx.object_mode); DEG_id_tag_update(&ob->id, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob); diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 43d29b6f931..d76019e9172 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -717,7 +717,8 @@ bool ED_object_parent_set(ReportList *reports, const bContext *C, Scene *scene, switch (partype) { case PAR_CURVE: /* curve deform */ if (modifiers_isDeformedByCurve(ob) != par) { - md = ED_object_modifier_add(reports, bmain, scene, ob, NULL, eModifierType_Curve); + md = ED_object_modifier_add( + reports, bmain, scene, ob, eval_ctx.object_mode, NULL, eModifierType_Curve); if (md) { ((CurveModifierData *)md)->object = par; } @@ -728,7 +729,8 @@ bool ED_object_parent_set(ReportList *reports, const bContext *C, Scene *scene, break; case PAR_LATTICE: /* lattice deform */ if (modifiers_isDeformedByLattice(ob) != par) { - md = ED_object_modifier_add(reports, bmain, scene, ob, NULL, eModifierType_Lattice); + md = ED_object_modifier_add( + reports, bmain, scene, ob, eval_ctx.object_mode, NULL, eModifierType_Lattice); if (md) { ((LatticeModifierData *)md)->object = par; } @@ -736,7 +738,8 @@ bool ED_object_parent_set(ReportList *reports, const bContext *C, Scene *scene, break; default: /* armature deform */ if (modifiers_isDeformedByArmature(ob) != par) { - md = ED_object_modifier_add(reports, bmain, scene, ob, NULL, eModifierType_Armature); + md = ED_object_modifier_add( + reports, bmain, scene, ob, eval_ctx.object_mode, NULL, eModifierType_Armature); if (md) { ((ArmatureModifierData *)md)->object = par; } @@ -1425,6 +1428,9 @@ static bool allow_make_links_data(const int type, Object *ob_src, Object *ob_dst static int make_links_data_exec(bContext *C, wmOperator *op) { + EvaluationContext eval_ctx; + CTX_data_eval_ctx(C, &eval_ctx); + Main *bmain = CTX_data_main(C); const int type = RNA_enum_get(op->ptr, "type"); Object *ob_src; @@ -1509,7 +1515,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op) } break; case MAKE_LINKS_MODIFIERS: - BKE_object_link_modifiers(ob_dst, ob_src); + BKE_object_link_modifiers(ob_dst, ob_src, eval_ctx.object_mode); DEG_id_tag_update(&ob_dst->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME); break; case MAKE_LINKS_FONTS: diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index d5a719515f8..8c9281e3e61 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -121,12 +121,35 @@ void ED_object_base_select(Base *base, eObjectSelect_Mode mode) void ED_object_base_activate(bContext *C, Base *base) { ViewLayer *view_layer = CTX_data_view_layer(C); + + WorkSpace *workspace = CTX_wm_workspace(C); + + bool reset = true; + if (base) { + Object *ob_prev = OBACT(view_layer); + Object *ob_curr = base->object; + if (ob_prev != NULL) { + if (ob_prev->type == ob_curr->type) { + reset = false; + } + } + } + + eObjectMode object_mode = workspace->object_mode; + workspace->object_mode = OB_MODE_OBJECT; + view_layer->basact = base; + if (reset == false) { + wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_mode_set", false); + PointerRNA ptr; + WM_operator_properties_create_ptr(&ptr, ot); + RNA_enum_set(&ptr, "mode", object_mode); + WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &ptr); + WM_operator_properties_free(&ptr); + } + if (base) { -#ifdef USE_WORKSPACE_MODE - BKE_workspace_object_mode_set(CTX_wm_workspace(C), CTX_data_scene(C), base->object->mode); -#endif WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, view_layer); } else { diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index aeb7f0b9222..63eee657c3a 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -43,6 +43,7 @@ #include "DNA_view3d_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" +#include "DNA_workspace_types.h" #include "BLI_math.h" #include "BLI_lasso.h" @@ -4784,26 +4785,27 @@ static int particle_edit_toggle_poll(bContext *C) static int particle_edit_toggle_exec(bContext *C, wmOperator *op) { + struct WorkSpace *workspace = CTX_wm_workspace(C); + EvaluationContext eval_ctx; + CTX_data_eval_ctx(C, &eval_ctx); Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_active_object(C); const int mode_flag = OB_MODE_PARTICLE_EDIT; - const bool is_mode_set = (ob->mode & mode_flag) != 0; + const bool is_mode_set = (eval_ctx.object_mode & mode_flag) != 0; BKE_report(op->reports, RPT_INFO, "Particles are changing, editing is not possible"); return OPERATOR_CANCELLED; if (!is_mode_set) { - if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) { + if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) { return OPERATOR_CANCELLED; } } if (!is_mode_set) { PTCacheEdit *edit; - EvaluationContext eval_ctx; - CTX_data_eval_ctx(C, &eval_ctx); - ob->mode |= mode_flag; + workspace->object_mode |= mode_flag; edit= PE_create_current(&eval_ctx, scene, ob); /* mesh may have changed since last entering editmode. @@ -4815,7 +4817,7 @@ static int particle_edit_toggle_exec(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_PARTICLE, NULL); } else { - ob->mode &= ~mode_flag; + workspace->object_mode &= ~mode_flag; toggle_particle_cursor(C, 0); WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL); } diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c index 1536c15525f..7a22a0d81d9 100644 --- a/source/blender/editors/physics/particle_object.c +++ b/source/blender/editors/physics/particle_object.c @@ -133,23 +133,25 @@ void OBJECT_OT_particle_system_add(wmOperatorType *ot) static int particle_system_remove_exec(bContext *C, wmOperator *UNUSED(op)) { + WorkSpace *workspace = CTX_wm_workspace(C); Object *ob = ED_object_context(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); - int mode_orig; + eObjectMode mode_orig; if (!scene || !ob) return OPERATOR_CANCELLED; - mode_orig = ob->mode; + mode_orig = workspace->object_mode; object_remove_particle_system(scene, ob); /* possible this isn't the active object * object_remove_particle_system() clears the mode on the last psys */ if (mode_orig & OB_MODE_PARTICLE_EDIT) { - if ((ob->mode & OB_MODE_PARTICLE_EDIT) == 0) { + if ((workspace->object_mode & OB_MODE_PARTICLE_EDIT) == 0) { if (view_layer->basact && view_layer->basact->object == ob) { + workspace->object_mode &= ~OB_MODE_PARTICLE_EDIT; WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL); } } diff --git a/source/blender/editors/render/render_update.c b/source/blender/editors/render/render_update.c index 4943222f038..92f9dd9ee26 100644 --- a/source/blender/editors/render/render_update.c +++ b/source/blender/editors/render/render_update.c @@ -401,10 +401,12 @@ static void texture_changed(Main *bmain, Tex *tex) /* icons */ BKE_icon_changed(BKE_icon_id_ensure(&tex->id)); + const eObjectMode object_mode = WM_windows_object_mode_get(bmain->wm.first); + /* paint overlays */ for (scene = bmain->scene.first; scene; scene = scene->id.next) { for (view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { - BKE_paint_invalidate_overlay_tex(scene, view_layer, tex); + BKE_paint_invalidate_overlay_tex(scene, view_layer, tex, object_mode); } } @@ -524,8 +526,18 @@ static void scene_changed(Main *bmain, Scene *scene) Object *ob; /* glsl */ - for (ob = bmain->object.first; ob; ob = ob->id.next) { - if (ob->mode & OB_MODE_TEXTURE_PAINT) { + bool has_texture_mode = false; + wmWindowManager *wm = bmain->wm.first; + for (wmWindow *win = wm->windows.first; win; win = win->next) { + WorkSpace *workspace = WM_window_get_active_workspace(win); + if (workspace->object_mode & OB_MODE_TEXTURE_PAINT) { + has_texture_mode = true; + break; + } + } + + if (has_texture_mode) { + for (ob = bmain->object.first; ob; ob = ob->id.next) { BKE_texpaint_slots_refresh_object(scene, ob); BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL); GPU_drawobject_free(ob->derivedFinal); @@ -558,8 +570,10 @@ void ED_render_id_flush_update(const DEGEditorUpdateContext *update_ctx, ID *id) lamp_changed(bmain, (Lamp *)id); break; case ID_IM: + { image_changed(bmain, (Image *)id); break; + } case ID_SCE: scene_changed(bmain, (Scene *)id); render_engine_flag_changed(bmain, RE_ENGINE_UPDATE_OTHER); diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index 0b78590d4d8..604a86a1519 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -1850,10 +1850,14 @@ bool ED_screen_stereo3d_required(const bScreen *screen, const Scene *scene) * Find the scene displayed in \a screen. * \note Assumes \a screen to be visible/active! */ -Scene *ED_screen_scene_find(const bScreen *screen, const wmWindowManager *wm) + +Scene *ED_screen_scene_find_with_window(const bScreen *screen, const wmWindowManager *wm, struct wmWindow **r_window) { for (wmWindow *win = wm->windows.first; win; win = win->next) { if (WM_window_get_active_screen(win) == screen) { + if (r_window) { + *r_window = win; + } return WM_window_get_active_scene(win); } } @@ -1861,3 +1865,9 @@ Scene *ED_screen_scene_find(const bScreen *screen, const wmWindowManager *wm) BLI_assert(0); return NULL; } + + +Scene *ED_screen_scene_find(const bScreen *screen, const wmWindowManager *wm) +{ + return ED_screen_scene_find_with_window(screen, wm, NULL); +} diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 9167c4c3d4d..9f5a3c84243 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -573,9 +573,10 @@ int ED_operator_mask(bContext *C) } case SPACE_IMAGE: { + WorkSpace *workspace = CTX_wm_workspace(C); SpaceImage *sima = sa->spacedata.first; ViewLayer *view_layer = CTX_data_view_layer(C); - return ED_space_image_check_show_maskedit(sima, view_layer); + return ED_space_image_check_show_maskedit(sima, workspace, view_layer); } } } diff --git a/source/blender/editors/screen/workspace_edit.c b/source/blender/editors/screen/workspace_edit.c index 00dc1003121..1ec83ed7c08 100644 --- a/source/blender/editors/screen/workspace_edit.c +++ b/source/blender/editors/screen/workspace_edit.c @@ -79,33 +79,9 @@ WorkSpace *ED_workspace_add( BKE_workspace_view_layer_set(workspace, act_view_layer, scene); BKE_viewrender_copy(&workspace->view_render, view_render); -#ifdef USE_WORKSPACE_MODE - BKE_workspace_object_mode_set(workspace, scene, OB_MODE_OBJECT); -#endif - return workspace; } -#ifdef USE_WORKSPACE_MODE -/** - * Changes the object mode (if needed) to the one set in \a workspace_new. - * Object mode is still stored on object level. In future it should all be workspace level instead. - */ -static void workspace_change_update_mode( - const WorkSpace *workspace_old, const WorkSpace *workspace_new, - bContext *C, Object *ob_act, ReportList *reports) -{ - const Scene *scene = CTX_data_scene(C); - eObjectMode mode_old = BKE_workspace_object_mode_get(workspace_old, scene); - eObjectMode mode_new = BKE_workspace_object_mode_get(workspace_new, scene); - - if (mode_old != mode_new) { - ED_object_mode_compat_set(C, ob_act, mode_new, reports); - ED_object_toggle_modes(C, mode_new); - } -} -#endif - static void workspace_change_update_view_layer( WorkSpace *workspace_new, const WorkSpace *workspace_old, Scene *scene) @@ -117,15 +93,10 @@ static void workspace_change_update_view_layer( static void workspace_change_update( WorkSpace *workspace_new, const WorkSpace *workspace_old, - bContext *C, wmWindowManager *wm) + bContext *C) { /* needs to be done before changing mode! (to ensure right context) */ workspace_change_update_view_layer(workspace_new, workspace_old, CTX_data_scene(C)); -#ifdef USE_WORKSPACE_MODE - workspace_change_update_mode(workspace_old, workspace_new, C, CTX_data_active_object(C), &wm->reports); -#else - UNUSED_VARS(C, wm); -#endif } static bool workspace_change_find_new_layout_cb(const WorkSpaceLayout *layout, void *UNUSED(arg)) @@ -177,7 +148,7 @@ static WorkSpaceLayout *workspace_change_get_new_layout( * \returns if workspace changing was successful. */ bool ED_workspace_change( - WorkSpace *workspace_new, bContext *C, wmWindowManager *wm, wmWindow *win) + WorkSpace *workspace_new, bContext *C, wmWindow *win) { Main *bmain = CTX_data_main(C); WorkSpace *workspace_old = WM_window_get_active_workspace(win); @@ -200,7 +171,7 @@ bool ED_workspace_change( /* update screen *after* changing workspace - which also causes the actual screen change */ screen_changed_update(C, win, screen_new); - workspace_change_update(workspace_new, workspace_old, C, wm); + workspace_change_update(workspace_new, workspace_old, C); BLI_assert(BKE_workspace_view_layer_get(workspace_new, CTX_data_scene(C)) != NULL); BLI_assert(CTX_wm_workspace(C) == workspace_new); @@ -231,9 +202,6 @@ WorkSpace *ED_workspace_duplicate( ListBase *transform_orientations_old = BKE_workspace_transform_orientations_get(workspace_old); ListBase *transform_orientations_new = BKE_workspace_transform_orientations_get(workspace_new); -#ifdef USE_WORKSPACE_MODE - BKE_workspace_object_mode_set(workspace_new, scene, BKE_workspace_object_mode_get(workspace_old, scene)); -#endif BLI_duplicatelist(transform_orientations_new, transform_orientations_old); workspace_new->tool = workspace_old->tool; @@ -264,7 +232,7 @@ bool ED_workspace_delete( WorkSpace *prev = workspace_id->prev; WorkSpace *next = workspace_id->next; - ED_workspace_change((prev != NULL) ? prev : next, C, wm, win); + ED_workspace_change((prev != NULL) ? prev : next, C, win); } BKE_libblock_free(bmain, workspace_id); diff --git a/source/blender/editors/sculpt_paint/paint_hide.c b/source/blender/editors/sculpt_paint/paint_hide.c index 8377b22756e..4c6cd8d6d22 100644 --- a/source/blender/editors/sculpt_paint/paint_hide.c +++ b/source/blender/editors/sculpt_paint/paint_hide.c @@ -384,7 +384,7 @@ static int hide_show_exec(bContext *C, wmOperator *op) clip_planes_from_rect(C, clip_planes, &rect); dm = mesh_get_derived_final(&eval_ctx, CTX_data_scene(C), ob, CD_MASK_BAREMESH); - pbvh = dm->getPBVH(ob, dm); + pbvh = dm->getPBVH(ob, dm, eval_ctx.object_mode); ob->sculpt->pbvh = pbvh; get_pbvh_nodes(pbvh, &nodes, &totnode, clip_planes, area); diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index 1ae13fcaec0..662485bf4f7 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -1376,19 +1376,20 @@ static int texture_paint_toggle_poll(bContext *C) static int texture_paint_toggle_exec(bContext *C, wmOperator *op) { + WorkSpace *workspace = CTX_wm_workspace(C); Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_active_object(C); const int mode_flag = OB_MODE_TEXTURE_PAINT; - const bool is_mode_set = (ob->mode & mode_flag) != 0; + const bool is_mode_set = (workspace->object_mode & mode_flag) != 0; if (!is_mode_set) { - if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) { + if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) { return OPERATOR_CANCELLED; } } - if (ob->mode & mode_flag) { - ob->mode &= ~mode_flag; + if (workspace->object_mode & mode_flag) { + workspace->object_mode &= ~mode_flag; if (U.glreslimit != 0) GPU_free_images(); @@ -1436,7 +1437,7 @@ static int texture_paint_toggle_exec(bContext *C, wmOperator *op) } } - ob->mode |= mode_flag; + workspace->object_mode |= mode_flag; BKE_paint_init(scene, ePaintTextureProjective, PAINT_CURSOR_TEXTURE_PAINT); diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c index 1ec1e052d43..6b14f97d80c 100644 --- a/source/blender/editors/sculpt_paint/paint_utils.c +++ b/source/blender/editors/sculpt_paint/paint_utils.c @@ -566,10 +566,11 @@ static int brush_curve_preset_exec(bContext *C, wmOperator *op) Brush *br = BKE_paint_brush(BKE_paint_get_active_from_context(C)); if (br) { + const WorkSpace *workspace = CTX_wm_workspace(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); BKE_brush_curve_preset(br, RNA_enum_get(op->ptr, "shape")); - BKE_paint_invalidate_cursor_overlay(scene, view_layer, br->curve); + BKE_paint_invalidate_cursor_overlay(scene, view_layer, br->curve, workspace->object_mode); } return OPERATOR_FINISHED; diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index 43bb19639cf..3a20973c465 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -1045,23 +1045,24 @@ static void vertex_paint_init_session_data( */ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op) { + WorkSpace *workspace = CTX_wm_workspace(C); Object *ob = CTX_data_active_object(C); const int mode_flag = OB_MODE_WEIGHT_PAINT; - const bool is_mode_set = (ob->mode & mode_flag) != 0; + const bool is_mode_set = (workspace->object_mode & mode_flag) != 0; Scene *scene = CTX_data_scene(C); VPaint *wp = scene->toolsettings->wpaint; Mesh *me; if (!is_mode_set) { - if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) { + if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) { return OPERATOR_CANCELLED; } } me = BKE_mesh_from_object(ob); - if (ob->mode & mode_flag) { - ob->mode &= ~mode_flag; + if (workspace->object_mode & mode_flag) { + workspace->object_mode &= ~mode_flag; if (me->editflag & ME_EDIT_PAINT_VERT_SEL) { BKE_mesh_flush_select_from_verts(me); @@ -1085,7 +1086,7 @@ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op) paint_cursor_delete_textures(); } else { - ob->mode |= mode_flag; + workspace->object_mode |= mode_flag; if (wp == NULL) wp = scene->toolsettings->wpaint = new_vpaint(); @@ -2222,15 +2223,16 @@ void PAINT_OT_weight_paint(wmOperatorType *ot) */ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op) { + WorkSpace *workspace = CTX_wm_workspace(C); Object *ob = CTX_data_active_object(C); const int mode_flag = OB_MODE_VERTEX_PAINT; - const bool is_mode_set = (ob->mode & mode_flag) != 0; + const bool is_mode_set = (workspace->object_mode & mode_flag) != 0; Scene *scene = CTX_data_scene(C); VPaint *vp = scene->toolsettings->vpaint; Mesh *me; if (!is_mode_set) { - if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) { + if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) { return OPERATOR_CANCELLED; } } @@ -2239,7 +2241,7 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op) /* toggle: end vpaint */ if (is_mode_set) { - ob->mode &= ~mode_flag; + workspace->object_mode &= ~mode_flag; if (me->editflag & ME_EDIT_PAINT_FACE_SEL) { BKE_mesh_flush_select_from_polys(me); @@ -2259,7 +2261,7 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op) paint_cursor_delete_textures(); } else { - ob->mode |= mode_flag; + workspace->object_mode |= mode_flag; ED_mesh_color_ensure(me, NULL); diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index e121030da0c..d6b279008f0 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -5221,7 +5221,7 @@ void sculpt_pbvh_clear(Object *ob) BKE_pbvh_free(ss->pbvh); ss->pbvh = NULL; if (dm) - dm->getPBVH(NULL, dm); + dm->getPBVH(NULL, dm, OB_MODE_OBJECT); BKE_object_free_derived_caches(ob); } @@ -5616,16 +5616,17 @@ static void sculpt_init_session(const bContext *C, Scene *scene, Object *ob) static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op) { + WorkSpace *workspace = CTX_wm_workspace(C); Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_active_object(C); const int mode_flag = OB_MODE_SCULPT; - const bool is_mode_set = (ob->mode & mode_flag) != 0; + const bool is_mode_set = (workspace->object_mode & mode_flag) != 0; Mesh *me; MultiresModifierData *mmd = BKE_sculpt_multires_active(scene, ob); int flush_recalc = 0; if (!is_mode_set) { - if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) { + if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) { return OPERATOR_CANCELLED; } } @@ -5659,7 +5660,7 @@ static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op) } /* Leave sculptmode */ - ob->mode &= ~mode_flag; + workspace->object_mode &= ~mode_flag; BKE_sculptsession_free(ob); @@ -5667,14 +5668,15 @@ static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op) } else { /* Enter sculptmode */ - ob->mode |= mode_flag; + workspace->object_mode |= mode_flag; if (flush_recalc) DEG_id_tag_update(&ob->id, OB_RECALC_DATA); /* Create sculpt mode session data */ - if (ob->sculpt) + if (ob->sculpt) { BKE_sculptsession_free(ob); + } sculpt_init_session(C, scene, ob); diff --git a/source/blender/editors/space_image/image_edit.c b/source/blender/editors/space_image/image_edit.c index 8db9f8fb720..68bef3fd142 100644 --- a/source/blender/editors/space_image/image_edit.c +++ b/source/blender/editors/space_image/image_edit.c @@ -378,11 +378,12 @@ bool ED_space_image_show_uvedit(SpaceImage *sima, Object *obedit) } /* matches clip function */ -bool ED_space_image_check_show_maskedit(SpaceImage *sima, ViewLayer *view_layer) +bool ED_space_image_check_show_maskedit( + SpaceImage *sima, const WorkSpace *workspace, ViewLayer *view_layer) { /* check editmode - this is reserved for UV editing */ Object *ob = OBACT(view_layer); - if (ob && ob->mode & OB_MODE_EDIT && ED_space_image_show_uvedit(sima, ob)) { + if (ob && (workspace->object_mode & OB_MODE_EDIT) && ED_space_image_show_uvedit(sima, ob)) { return false; } @@ -392,10 +393,10 @@ bool ED_space_image_check_show_maskedit(SpaceImage *sima, ViewLayer *view_layer) int ED_space_image_maskedit_poll(bContext *C) { SpaceImage *sima = CTX_wm_space_image(C); - if (sima) { + WorkSpace *workspace = CTX_wm_workspace(C); ViewLayer *view_layer = CTX_data_view_layer(C); - return ED_space_image_check_show_maskedit(sima, view_layer); + return ED_space_image_check_show_maskedit(sima, workspace, view_layer); } return false; diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 6c8f9a12b7e..0ff30c228b4 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -791,6 +791,7 @@ void IMAGE_OT_view_all(wmOperatorType *ot) static int image_view_selected_exec(bContext *C, wmOperator *UNUSED(op)) { + WorkSpace *workspace = CTX_wm_workspace(C); SpaceImage *sima; ARegion *ar; Scene *scene; @@ -814,7 +815,7 @@ static int image_view_selected_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_CANCELLED; } } - else if (ED_space_image_check_show_maskedit(sima, view_layer)) { + else if (ED_space_image_check_show_maskedit(sima, workspace, view_layer)) { if (!ED_mask_selected_minmax(C, min, max)) { return OPERATOR_CANCELLED; } diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index e20d2a620d7..aa6120942d8 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -551,7 +551,7 @@ static void image_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn, Sc { ViewLayer *view_layer = BKE_view_layer_from_workspace_get(scene, workspace); Object *ob = OBACT(view_layer); - if (ob && (ob == wmn->reference) && (ob->mode & OB_MODE_EDIT)) { + if (ob && (ob == wmn->reference) && (workspace->object_mode & OB_MODE_EDIT)) { if (sima->lock && (sima->flag & SI_DRAWSHADOW)) { ED_area_tag_refresh(sa); ED_area_tag_redraw(sa); diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c index 25d590550ce..118be88216e 100644 --- a/source/blender/editors/space_info/info_stats.c +++ b/source/blender/editors/space_info/info_stats.c @@ -36,6 +36,7 @@ #include "DNA_lattice_types.h" #include "DNA_meta_types.h" #include "DNA_scene_types.h" +#include "DNA_workspace_types.h" #include "BLI_math.h" #include "BLI_string.h" @@ -526,14 +527,12 @@ void ED_info_stats_clear(ViewLayer *view_layer) } } -const char *ED_info_stats_string(Scene *scene, ViewLayer *view_layer) +const char *ED_info_stats_string(Scene *scene, WorkSpace *workspace, ViewLayer *view_layer) { - const eObjectMode object_mode = (view_layer->basact) ? view_layer->basact->object->mode : OB_MODE_OBJECT; - if (!view_layer->stats) { - stats_update(scene, view_layer, object_mode); + stats_update(scene, view_layer, workspace->object_mode); } - stats_string(scene, view_layer, object_mode); + stats_string(scene, view_layer, workspace->object_mode); return view_layer->stats->infostr; } diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c index 283dbf3b4e2..853c24390d9 100644 --- a/source/blender/editors/space_time/space_time.c +++ b/source/blender/editors/space_time/space_time.c @@ -402,6 +402,7 @@ static void time_draw_caches_keyframes(Main *bmain, ViewLayer *view_layer, View2 /* draw keyframe lines for timeline */ static void time_draw_keyframes(const bContext *C, ARegion *ar) { + WorkSpace *workspace = CTX_wm_workspace(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); Object *ob = CTX_data_active_object(C); @@ -443,7 +444,7 @@ static void time_draw_keyframes(const bContext *C, ARegion *ar) */ UI_GetThemeColor3ubv(TH_TIME_KEYFRAME, color); - if (ob && ((ob->mode == OB_MODE_POSE) || onlysel)) { + if (ob && ((workspace->object_mode == OB_MODE_POSE) || onlysel)) { /* draw keyframes for active object only */ time_draw_idblock_keyframes(v2d, (ID *)ob, onlysel, color); } diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c index 8973c96c438..02443af0bfc 100644 --- a/source/blender/editors/util/ed_util.c +++ b/source/blender/editors/util/ed_util.c @@ -41,6 +41,7 @@ #include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_packedFile_types.h" +#include "DNA_workspace_types.h" #include "BLI_utildefines.h" #include "BLI_string.h" @@ -70,6 +71,8 @@ #include "ED_space_api.h" #include "ED_util.h" +#include "DEG_depsgraph.h" + #include "GPU_immediate.h" #include "UI_interface.h" @@ -86,11 +89,7 @@ void ED_editors_init(bContext *C) { wmWindowManager *wm = CTX_wm_manager(C); - Main *bmain = CTX_data_main(C); Scene *sce = CTX_data_scene(C); - ViewLayer *view_layer = CTX_data_view_layer(C); - Object *ob, *obact = (view_layer && view_layer->basact) ? view_layer->basact->object : NULL; - ID *data; /* This is called during initialization, so we don't want to store any reports */ ReportList *reports = CTX_wm_reports(C); @@ -98,24 +97,6 @@ void ED_editors_init(bContext *C) SWAP(int, reports->flag, reports_flag_prev); - /* toggle on modes for objects that were saved with these enabled. for - * e.g. linked objects we have to ensure that they are actually the - * active object in this scene. */ - for (ob = bmain->object.first; ob; ob = ob->id.next) { - int mode = ob->mode; - - if (mode == OB_MODE_OBJECT) { - /* pass */ - } - else { - data = ob->data; - ob->mode = OB_MODE_OBJECT; - if ((ob == obact) && !ID_IS_LINKED(ob) && !(data && ID_IS_LINKED(data))) { - ED_object_toggle_modes(C, mode); - } - } - } - /* image editor paint mode */ if (sce) { ED_space_image_paint_update(wm, sce); @@ -170,11 +151,16 @@ bool ED_editors_flush_edits(const bContext *C, bool for_render) Object *ob; Main *bmain = CTX_data_main(C); + eObjectMode object_mode = WM_windows_object_mode_get(bmain->wm.first); + if ((object_mode & (OB_MODE_SCULPT | OB_MODE_EDIT)) == 0) { + return has_edited; + } + /* loop through all data to find edit mode or object mode, because during * exiting we might not have a context for edit object and multiple sculpt * objects can exist at the same time */ for (ob = bmain->object.first; ob; ob = ob->id.next) { - if (ob->mode & OB_MODE_SCULPT) { + if (object_mode & OB_MODE_SCULPT) { /* Don't allow flushing while in the middle of a stroke (frees data in use). * Auto-save prevents this from happening but scripts may cause a flush on saving: T53986. */ if ((ob->sculpt && ob->sculpt->cache) == 0) { @@ -193,7 +179,7 @@ bool ED_editors_flush_edits(const bContext *C, bool for_render) } } } - else if (ob->mode & OB_MODE_EDIT) { + else if (object_mode & OB_MODE_EDIT) { /* get editmode results */ has_edited = true; ED_object_editmode_load(ob); diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 17ee64fd7d8..0b7dccee9ab 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -171,9 +171,6 @@ typedef struct Object { ListBase defbase; /* list of bDeformGroup (vertex groups) names and flag only */ ListBase modifiers; /* list of ModifierData structures */ ListBase fmaps; /* list of facemaps */ - - int mode; /* Local object mode */ - int restore_mode; /* Keep track of what mode to return to after toggling a mode */ /* materials */ struct Material **mat; /* material slots */ diff --git a/source/blender/makesdna/DNA_workspace_types.h b/source/blender/makesdna/DNA_workspace_types.h index adc3c1fef2b..dbcc278ea15 100644 --- a/source/blender/makesdna/DNA_workspace_types.h +++ b/source/blender/makesdna/DNA_workspace_types.h @@ -92,6 +92,9 @@ typedef struct WorkSpace { int pad; int flags DNA_PRIVATE_WORKSPACE; /* enum eWorkSpaceFlags */ + short object_mode, object_mode_restore; + char _pad[4]; + /* should be: '#ifdef USE_WORKSPACE_TOOL'. */ bToolDef tool; diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c index 5336a63fb76..aa37c9ffa88 100644 --- a/source/blender/makesrna/intern/rna_brush.c +++ b/source/blender/makesrna/intern/rna_brush.c @@ -31,6 +31,7 @@ #include "DNA_texture_types.h" #include "DNA_scene_types.h" #include "DNA_object_types.h" +#include "DNA_workspace_types.h" #include "BLI_math.h" @@ -43,6 +44,8 @@ #include "WM_types.h" +#include "DEG_depsgraph.h" + static const EnumPropertyItem prop_direction_items[] = { {0, "ADD", 0, "Add", "Add effect of brush"}, {BRUSH_DIR_IN, "SUBTRACT", 0, "Subtract", "Subtract effect of brush"}, @@ -373,21 +376,23 @@ static void rna_Brush_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerR static void rna_Brush_main_tex_update(bContext *C, PointerRNA *ptr) { + const WorkSpace *workspace = CTX_wm_workspace(C); Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); Brush *br = (Brush *)ptr->data; - BKE_paint_invalidate_overlay_tex(scene, view_layer, br->mtex.tex); + BKE_paint_invalidate_overlay_tex(scene, view_layer, br->mtex.tex, workspace->object_mode); rna_Brush_update(bmain, scene, ptr); } static void rna_Brush_secondary_tex_update(bContext *C, PointerRNA *ptr) { Main *bmain = CTX_data_main(C); + const WorkSpace *workspace = CTX_wm_workspace(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); Brush *br = (Brush *)ptr->data; - BKE_paint_invalidate_overlay_tex(scene, view_layer, br->mask_mtex.tex); + BKE_paint_invalidate_overlay_tex(scene, view_layer, br->mask_mtex.tex, workspace->object_mode); rna_Brush_update(bmain, scene, ptr); } @@ -449,8 +454,9 @@ static void rna_TextureSlot_brush_angle_update(bContext *C, PointerRNA *ptr) MTex *mtex = ptr->data; /* skip invalidation of overlay for stencil mode */ if (mtex->mapping != MTEX_MAP_MODE_STENCIL) { + const WorkSpace *workspace = CTX_wm_workspace(C); ViewLayer *view_layer = CTX_data_view_layer(C); - BKE_paint_invalidate_overlay_tex(scene, view_layer, mtex->tex); + BKE_paint_invalidate_overlay_tex(scene, view_layer, mtex->tex, workspace->object_mode); } rna_TextureSlot_update(C, ptr); diff --git a/source/blender/makesrna/intern/rna_layer.c b/source/blender/makesrna/intern/rna_layer.c index 6930aa115c7..a3d570df40a 100644 --- a/source/blender/makesrna/intern/rna_layer.c +++ b/source/blender/makesrna/intern/rna_layer.c @@ -64,6 +64,7 @@ const EnumPropertyItem rna_enum_collection_type_items[] = { #include "DNA_group_types.h" #include "DNA_object_types.h" +#include "DNA_workspace_types.h" #include "RNA_access.h" @@ -72,6 +73,7 @@ const EnumPropertyItem rna_enum_collection_type_items[] = { #include "BKE_node.h" #include "BKE_scene.h" #include "BKE_mesh.h" +#include "BKE_workspace.h" #include "DEG_depsgraph_build.h" #include "DEG_depsgraph_query.h" @@ -835,6 +837,23 @@ static void rna_LayerObjects_active_object_set(PointerRNA *ptr, PointerRNA value view_layer->basact = NULL; } +static void rna_LayerObjects_active_object_update(struct bContext *C, PointerRNA *ptr) +{ + wmWindow *win = CTX_wm_window(C); + Scene *scene = WM_window_get_active_scene(win); + + if (scene != ptr->id.data) { + return; + } + + WorkSpace *workspace = WM_window_get_active_workspace(win); + ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene); + if (scene->obedit) { + ED_object_editmode_exit(C, EM_FREEDATA); + } + ED_object_base_activate(C, view_layer->basact); +} + static IDProperty *rna_ViewLayer_idprops(PointerRNA *ptr, bool create) { ViewLayer *view_layer = (ViewLayer *)ptr->data; @@ -2129,11 +2148,11 @@ static void rna_def_layer_objects(BlenderRNA *brna, PropertyRNA *cprop) prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "Object"); RNA_def_property_pointer_funcs(prop, "rna_LayerObjects_active_object_get", "rna_LayerObjects_active_object_set", NULL, NULL); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK); + RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK | PROP_CONTEXT_UPDATE); RNA_def_property_ui_text(prop, "Active Object", "Active object for this layer"); /* Could call: ED_object_base_activate(C, rl->basact); * but would be a bad level call and it seems the notifier is enough */ - RNA_def_property_update(prop, NC_SCENE | ND_OB_ACTIVE, NULL); + RNA_def_property_update(prop, NC_SCENE | ND_OB_ACTIVE, "rna_LayerObjects_active_object_update"); prop = RNA_def_property(srna, "selected", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "object_bases", NULL); diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 6b495c61258..195db6ec429 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -337,7 +337,7 @@ static void rna_Object_data_set(PointerRNA *ptr, PointerRNA value) Object *ob = (Object *)ptr->data; ID *id = value.data; - if (ob->mode & OB_MODE_EDIT) { + if (BKE_object_is_in_editmode(ob)) { return; } @@ -1394,7 +1394,10 @@ static void rna_Object_constraints_clear(Object *object) static ModifierData *rna_Object_modifier_new(Object *object, bContext *C, ReportList *reports, const char *name, int type) { - return ED_object_modifier_add(reports, CTX_data_main(C), CTX_data_scene(C), object, name, type); + Main *bmain = CTX_data_main(C); + EvaluationContext eval_ctx; + CTX_data_eval_ctx(C, &eval_ctx); + return ED_object_modifier_add(reports, bmain, CTX_data_scene(C), object, eval_ctx.object_mode, name, type); } static void rna_Object_modifier_remove(Object *object, bContext *C, ReportList *reports, PointerRNA *md_ptr) @@ -2419,12 +2422,6 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Type", "Type of Object"); - prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "mode"); - RNA_def_property_enum_items(prop, rna_enum_object_mode_items); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Mode", "Object interaction mode"); - prop = RNA_def_property(srna, "layers_local_view", PROP_BOOLEAN, PROP_LAYER_MEMBER); RNA_def_property_boolean_sdna(prop, NULL, "lay", 0x01000000); RNA_def_property_array(prop, 8); diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c index 941cef0eafe..32edabe37d9 100644 --- a/source/blender/makesrna/intern/rna_object_force.c +++ b/source/blender/makesrna/intern/rna_object_force.c @@ -53,6 +53,7 @@ static const EnumPropertyItem effector_shape_items[] = { #include "BLI_math_base.h" +#include "BKE_main.h" /* type specific return values only used from functions */ static const EnumPropertyItem curve_shape_items[] = { @@ -523,7 +524,7 @@ static void rna_FieldSettings_shape_update(Main *bmain, Scene *scene, PointerRNA { if (!particle_id_check(ptr)) { Object *ob = (Object *)ptr->id.data; - ED_object_check_force_modifiers(bmain, scene, ob); + ED_object_check_force_modifiers(bmain, scene, ob, bmain->eval_ctx->object_mode); WM_main_add_notifier(NC_OBJECT | ND_DRAW, ob); WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, ob); } @@ -710,7 +711,7 @@ static void rna_CollisionSettings_dependency_update(Main *bmain, Scene *scene, P /* add/remove modifier as needed */ if (ob->pd->deflect && !md) - ED_object_modifier_add(NULL, bmain, scene, ob, NULL, eModifierType_Collision); + ED_object_modifier_add(NULL, bmain, scene, ob, bmain->eval_ctx->object_mode , NULL, eModifierType_Collision); else if (!ob->pd->deflect && md) ED_object_modifier_remove(NULL, bmain, ob, md); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index c2bf62da043..90c653fdf2a 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -6964,6 +6964,7 @@ void RNA_def_scene(BlenderRNA *brna) /* Statistics */ func = RNA_def_function(srna, "statistics", "ED_info_stats_string"); + parm = RNA_def_pointer(func, "workspace", "WorkSpace", "", "Active workspace"); parm = RNA_def_pointer(func, "view_layer", "ViewLayer", "", "Active layer"); RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED); parm = RNA_def_string(func, "statistics", NULL, 0, "Statistics", ""); diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 7d17af4addb..b4a42b3a909 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -866,10 +866,11 @@ static int rna_SpaceImageEditor_show_maskedit_get(PointerRNA *ptr) { SpaceImage *sima = (SpaceImage *)(ptr->data); bScreen *sc = (bScreen *)ptr->id.data; - Scene *scene = ED_screen_scene_find(sc, G.main->wm.first); + wmWindow *window = NULL; + Scene *scene = ED_screen_scene_find_with_window(sc, G.main->wm.first, &window); ViewLayer *view_layer = BKE_view_layer_context_active_PLACEHOLDER(scene); - - return ED_space_image_check_show_maskedit(sima, view_layer); + const WorkSpace *workspace = WM_window_get_active_workspace(window); + return ED_space_image_check_show_maskedit(sima, workspace, view_layer); } static void rna_SpaceImageEditor_image_set(PointerRNA *ptr, PointerRNA value) diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c index 42e3e2c83fb..e2e44a8ac5c 100644 --- a/source/blender/makesrna/intern/rna_texture.c +++ b/source/blender/makesrna/intern/rna_texture.c @@ -37,6 +37,7 @@ #include "DNA_node_types.h" #include "DNA_particle_types.h" #include "DNA_scene_types.h" /* MAXFRAME only */ +#include "DNA_workspace_types.h" #include "BLI_utildefines.h" @@ -247,10 +248,11 @@ void rna_TextureSlot_update(bContext *C, PointerRNA *ptr) break; case ID_BR: { + const WorkSpace *workspace = CTX_wm_workspace(C); Scene *scene = CTX_data_scene(C); MTex *mtex = ptr->data; ViewLayer *view_layer = CTX_data_view_layer(C); - BKE_paint_invalidate_overlay_tex(scene, view_layer, mtex->tex); + BKE_paint_invalidate_overlay_tex(scene, view_layer, mtex->tex, workspace->object_mode); WM_main_add_notifier(NC_BRUSH, id); break; } diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 1ae946fda9e..69997883c42 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -364,8 +364,11 @@ static void rna_UserDef_weight_color_update(Main *bmain, Scene *scene, PointerRN vDM_ColorBand_store((U.flag & USER_CUSTOM_RANGE) ? (&U.coba_weight) : NULL, btheme->tv3d.vertex_unreferenced); for (ob = bmain->object.first; ob; ob = ob->id.next) { - if (ob->mode & OB_MODE_WEIGHT_PAINT) + /* TODO/OBMODE (not urgent) */ + // if (ob->mode & OB_MODE_WEIGHT_PAINT) + { DEG_id_tag_update(&ob->id, OB_RECALC_DATA); + } } rna_userdef_update(bmain, scene, ptr); diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index bcb5bb524f0..f3cf2bb0d64 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -473,6 +473,7 @@ const EnumPropertyItem rna_enum_wm_report_items[] = { #include "DNA_workspace_types.h" #include "ED_screen.h" +#include "ED_object.h" #include "UI_interface.h" @@ -778,28 +779,21 @@ static void rna_Window_view_layer_set(PointerRNA *ptr, PointerRNA value) BKE_workspace_view_layer_set(workspace, value.data, scene); } -#ifdef USE_WORKSPACE_MODE - -static int rna_Window_object_mode_get(PointerRNA *ptr) +static void rna_Window_view_layer_update(struct bContext *C, PointerRNA *ptr) { wmWindow *win = ptr->data; Scene *scene = WM_window_get_active_scene(win); WorkSpace *workspace = WM_window_get_active_workspace(win); + ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene); - return (int)BKE_workspace_object_mode_get(workspace, scene); + eObjectMode object_mode = workspace->object_mode; + if (scene->obedit) { + ED_object_editmode_exit(C, EM_FREEDATA); + } + workspace->object_mode = object_mode; + ED_object_base_activate(C, view_layer->basact); } -static void rna_Window_object_mode_set(PointerRNA *ptr, int value) -{ - wmWindow *win = ptr->data; - Scene *scene = WM_window_get_active_scene(win); - WorkSpace *workspace = WM_window_get_active_workspace(win); - - BKE_workspace_object_mode_set(workspace, scene, value); -} - -#endif /* USE_WORKSPACE_MODE */ - static PointerRNA rna_KeyMapItem_properties_get(PointerRNA *ptr) { wmKeyMapItem *kmi = ptr->data; @@ -2083,15 +2077,8 @@ static void rna_def_window(BlenderRNA *brna) RNA_def_property_struct_type(prop, "ViewLayer"); RNA_def_property_pointer_funcs(prop, "rna_Window_view_layer_get", "rna_Window_view_layer_set", NULL, NULL); RNA_def_property_ui_text(prop, "Active View Layer", "The active workspace view layer showing in the window"); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_NULL); - RNA_def_property_update(prop, NC_SCREEN | ND_LAYER, NULL); - -#ifdef USE_WORKSPACE_MODE - prop = RNA_def_property(srna, "object_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, rna_enum_object_mode_items); - RNA_def_property_enum_funcs(prop, "rna_Window_object_mode_get", "rna_Window_object_mode_set", NULL); - RNA_def_property_ui_text(prop, "Mode", "Object interaction mode used in this window"); -#endif + RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_NULL | PROP_CONTEXT_UPDATE); + RNA_def_property_update(prop, NC_SCREEN | ND_LAYER, "rna_Window_view_layer_update"); prop = RNA_def_property(srna, "x", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "posx"); diff --git a/source/blender/makesrna/intern/rna_workspace.c b/source/blender/makesrna/intern/rna_workspace.c index 0bed91f2807..5e0a4b97981 100644 --- a/source/blender/makesrna/intern/rna_workspace.c +++ b/source/blender/makesrna/intern/rna_workspace.c @@ -121,6 +121,10 @@ static void rna_def_workspace(BlenderRNA *brna) "rna_workspace_transform_orientations_item_get", NULL, NULL, NULL, NULL); RNA_def_property_ui_text(prop, "Transform Orientations", ""); + prop = RNA_def_property(srna, "object_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, rna_enum_object_mode_items); + RNA_def_property_ui_text(prop, "Mode", "Object interaction mode used in this window"); + /* View Render */ prop = RNA_def_property(srna, "view_render", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_NEVER_NULL); diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c index 2b675d36140..6704526ea03 100644 --- a/source/blender/modifiers/intern/MOD_multires.c +++ b/source/blender/modifiers/intern/MOD_multires.c @@ -48,6 +48,8 @@ #include "MOD_modifiertypes.h" +#include "DEG_depsgraph.h" + static void initData(ModifierData *md) { MultiresModifierData *mmd = (MultiresModifierData *)md; @@ -67,7 +69,7 @@ static void copyData(ModifierData *md, ModifierData *target) modifier_copyData_generic(md, target); } -static DerivedMesh *applyModifier(ModifierData *md, const struct EvaluationContext *UNUSED(eval_ctx), Object *ob, +static DerivedMesh *applyModifier(ModifierData *md, const struct EvaluationContext *eval_ctx, Object *ob, DerivedMesh *dm, ModifierApplyFlag flag) { MultiresModifierData *mmd = (MultiresModifierData *)md; @@ -94,7 +96,7 @@ static DerivedMesh *applyModifier(ModifierData *md, const struct EvaluationConte if (ignore_simplify) flags |= MULTIRES_IGNORE_SIMPLIFY; - result = multires_make_derived_from_derived(dm, mmd, ob, flags); + result = multires_make_derived_from_derived(dm, mmd, ob, flags, eval_ctx->object_mode); if (result == dm) return dm; diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c index c87fdd321ab..8b9a7c42eb2 100644 --- a/source/blender/modifiers/intern/MOD_shrinkwrap.c +++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c @@ -103,7 +103,7 @@ static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, walk(userData, ob, &smd->auxTarget, IDWALK_CB_NOP); } -static void deformVerts(ModifierData *md, const struct EvaluationContext *UNUSED(eval_ctx), +static void deformVerts(ModifierData *md, const struct EvaluationContext *eval_ctx, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, @@ -118,13 +118,13 @@ static void deformVerts(ModifierData *md, const struct EvaluationContext *UNUSED dm = get_cddm(ob, NULL, dm, vertexCos, dependsOnNormals(md)); } - shrinkwrapModifier_deform((ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts, forRender); + shrinkwrapModifier_deform(eval_ctx, (ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts, forRender); if (dm != derivedData) dm->release(dm); } -static void deformVertsEM(ModifierData *md, const struct EvaluationContext *UNUSED(eval_ctx), Object *ob, +static void deformVertsEM(ModifierData *md, const struct EvaluationContext *eval_ctx, Object *ob, struct BMEditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts) { @@ -136,7 +136,7 @@ static void deformVertsEM(ModifierData *md, const struct EvaluationContext *UNUS dm = get_cddm(ob, editData, dm, vertexCos, dependsOnNormals(md)); } - shrinkwrapModifier_deform((ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts, false); + shrinkwrapModifier_deform(eval_ctx, (ShrinkwrapModifierData *)md, ob, dm, vertexCos, numVerts, false); if (dm != derivedData) dm->release(dm); diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 7a66cc04014..50efc4d3252 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -68,6 +68,8 @@ struct ScrArea; struct Main; struct bToolDef; +#include "DNA_object_enums.h" + #ifdef WITH_INPUT_NDOF struct wmNDOFMotionData; #endif @@ -103,6 +105,7 @@ bool WM_window_is_fullscreen (struct wmWindow *win); void WM_windows_scene_data_sync(const ListBase *win_lb, struct Scene *scene) ATTR_NONNULL(); struct Scene *WM_windows_scene_get_from_screen(const struct wmWindowManager *wm, const struct bScreen *screen) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; struct WorkSpace *WM_windows_workspace_get_from_screen(const wmWindowManager *wm, const struct bScreen *screen) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; +eObjectMode WM_windows_object_mode_get(const struct wmWindowManager *wm) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; struct Scene *WM_window_get_active_scene(const struct wmWindow *win) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT; void WM_window_change_active_scene(struct Main *bmain, struct bContext *C, struct wmWindow *win, diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 5d34d0a7549..b26bbda6855 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -340,7 +340,7 @@ void wm_event_do_refresh_wm_and_depsgraph(bContext *C) WorkSpace *workspace = WM_window_get_active_workspace(win); - BKE_workspace_update_object_mode(bmain->eval_ctx, workspace, scene); + BKE_workspace_update_object_mode(bmain->eval_ctx, workspace); BKE_workspace_update_tagged(bmain->eval_ctx, bmain, workspace, scene); } @@ -386,7 +386,7 @@ void wm_event_do_notifiers(bContext *C) UI_popup_handlers_remove_all(C, &win->modalhandlers); - ED_workspace_change(ref_ws, C, wm, win); + ED_workspace_change(ref_ws, C, win); if (G.debug & G_DEBUG_EVENTS) printf("%s: Workspace set %p\n", __func__, note->reference); } diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 0e07b66996d..7557abffee4 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -1948,6 +1948,18 @@ WorkSpace *WM_windows_workspace_get_from_screen(const wmWindowManager *wm, const return NULL; } +eObjectMode WM_windows_object_mode_get(const struct wmWindowManager *wm) +{ + eObjectMode object_mode = 0; + for (wmWindow *win = wm->windows.first; win; win = win->next) { + const WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook); + if (workspace != NULL) { + object_mode |= workspace->object_mode; + } + } + return object_mode; +} + Scene *WM_window_get_active_scene(const wmWindow *win) { return win->scene; diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index abeda263333..c2358324a19 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -521,7 +521,7 @@ bool ANIM_remove_driver(struct ReportList *reports, struct ID *id, const char rn void ED_space_image_release_buffer(struct SpaceImage *sima, struct ImBuf *ibuf, void *lock) RET_NONE struct ImBuf *ED_space_image_acquire_buffer(struct SpaceImage *sima, void **r_lock) RET_NULL void ED_space_image_get_zoom(struct SpaceImage *sima, struct ARegion *ar, float *zoomx, float *zoomy) RET_NONE -const char *ED_info_stats_string(struct Scene *scene, struct ViewLayer *view_layer) RET_NULL +const char *ED_info_stats_string(struct Scene *scene, struct ViewLayer *view_layer, const short object_mode) RET_NULL void ED_area_tag_redraw(struct ScrArea *sa) RET_NONE void ED_area_tag_refresh(struct ScrArea *sa) RET_NONE void ED_area_newspace(struct bContext *C, struct ScrArea *sa, int type, const bool skip_ar_exit) RET_NONE