forked from bartvdbraak/blender
Object Mode: move to workspace struct
- Read-only access can often use EvaluationContext.object_mode - Write access to go to WorkSpace.object_mode. - Some TODO's remain (marked as "TODO/OBMODE") - Add-ons will need updating (context.active_object.mode -> context.workspace.object_mode) - There will be small/medium issues that still need resolving this does work on a basic level though. See D3037
This commit is contained in:
parent
14a19fed78
commit
345c6298e9
@ -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;
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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):
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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')
|
||||
|
@ -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")
|
||||
|
@ -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"
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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
|
||||
|
||||
|
@ -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):
|
||||
|
@ -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':
|
||||
|
@ -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")
|
||||
|
||||
|
@ -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):
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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 DerivedMesh *multires_make_derived_from_derived(
|
||||
struct DerivedMesh *dm,
|
||||
struct MultiresModifierData *mmd,
|
||||
struct Object *ob,
|
||||
MultiresFlags flags);
|
||||
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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -54,6 +54,7 @@ struct ShrinkwrapModifierData;
|
||||
struct MDeformVert;
|
||||
struct BVHTree;
|
||||
struct SpaceTransform;
|
||||
struct EvaluationContext;
|
||||
|
||||
|
||||
typedef struct ShrinkwrapCalcData {
|
||||
@ -76,7 +77,9 @@ typedef struct ShrinkwrapCalcData {
|
||||
|
||||
} ShrinkwrapCalcData;
|
||||
|
||||
void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm,
|
||||
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);
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
|
@ -64,6 +64,8 @@
|
||||
#include "GPU_shader.h"
|
||||
#include "GPU_basic_shader.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <math.h>
|
||||
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -60,6 +60,8 @@
|
||||
|
||||
#include "BKE_object.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "CCGSubSurf.h"
|
||||
|
||||
#include <math.h>
|
||||
@ -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,
|
||||
DerivedMesh *multires_make_derived_from_derived(
|
||||
DerivedMesh *dm,
|
||||
MultiresModifierData *mmd,
|
||||
Object *ob,
|
||||
MultiresFlags flags)
|
||||
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,
|
||||
result = subsurf_dm_create_local(
|
||||
dm, lvl, mmd->simple,
|
||||
mmd->flags & eMultiresModifierFlag_ControlEdges,
|
||||
mmd->flags & eMultiresModifierFlag_PlainUv,
|
||||
flags & MULTIRES_ALLOC_PAINT_MASK);
|
||||
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);
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
FOREACH_OB_MODE_PAINT_ITER_BEGIN(scene, view_layer, object_mode, p)
|
||||
{
|
||||
Brush *br = p->brush;
|
||||
|
||||
if (!br)
|
||||
return;
|
||||
|
||||
if (br->mtex.tex == tex)
|
||||
if (br) {
|
||||
if (br->mtex.tex == tex) {
|
||||
overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_PRIMARY;
|
||||
if (br->mask_mtex.tex == tex)
|
||||
}
|
||||
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);
|
||||
FOREACH_OB_MODE_PAINT_ITER_BEGIN(scene, view_layer, object_mode, p)
|
||||
{
|
||||
Brush *br = p->brush;
|
||||
|
||||
if (br && br->curve == curve)
|
||||
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);
|
||||
|
@ -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);
|
||||
|
@ -983,7 +983,6 @@ 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;
|
||||
|
||||
/* deselect objects (for dataselect) */
|
||||
|
@ -57,6 +57,8 @@
|
||||
|
||||
#include "BLI_strict_flags.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
/* for timing... */
|
||||
#if 0
|
||||
# include "PIL_time_utildefines.h"
|
||||
@ -614,7 +616,8 @@ static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc)
|
||||
}
|
||||
|
||||
/* Main shrinkwrap function */
|
||||
void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedMesh *dm,
|
||||
void shrinkwrapModifier_deform(
|
||||
const EvaluationContext *eval_ctx, ShrinkwrapModifierData *smd, Object *ob, DerivedMesh *dm,
|
||||
float (*vertexCos)[3], int numVerts, bool for_render)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
@ -85,6 +85,8 @@
|
||||
|
||||
#include "CCGSubSurf.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#ifdef WITH_OPENSUBDIV
|
||||
# include "opensubdiv_capi.h"
|
||||
#endif
|
||||
@ -3788,14 +3790,16 @@ 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ccgdm->ehash)
|
||||
BLI_edgehash_free(ccgdm->ehash, NULL);
|
||||
@ -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). */
|
||||
|
@ -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;
|
||||
}
|
@ -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++)
|
||||
@ -5549,19 +5548,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);
|
||||
}
|
||||
|
@ -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)) {
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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__ */
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
@ -1434,7 +1446,10 @@ 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);
|
||||
|
@ -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:
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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 */
|
||||
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) {
|
||||
if (ob->mode & OB_MODE_TEXTURE_PAINT) {
|
||||
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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -172,9 +172,6 @@ typedef struct Object {
|
||||
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 */
|
||||
char *matbits; /* a boolean field, with each byte 1 if corresponding material is linked to object */
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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", "");
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -364,9 +364,12 @@ 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);
|
||||
}
|
||||
|
@ -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");
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user