forked from bartvdbraak/blender
Remove workspace object mode, reverts changes w/ 2.8
This caused too many problems syncing object modes with multiple objects/windows/workspaces, see: D3130 for details.
This commit is contained in:
parent
57329304b0
commit
1c24c04e60
@ -903,8 +903,7 @@ void BlenderSync::sync_curves(BL::Depsgraph& b_depsgraph,
|
||||
/* obtain general settings */
|
||||
const bool use_curves = scene->curve_system_manager->use_curves;
|
||||
|
||||
/* TODO/OBMODE, make cycles mode aware. */
|
||||
if(!(use_curves /* && b_ob.mode() != b_ob.mode_PARTICLE_EDIT */ )) {
|
||||
if(!(use_curves && b_ob.mode() != b_ob.mode_PARTICLE_EDIT)) {
|
||||
if(!motion)
|
||||
mesh->compute_bounds();
|
||||
return;
|
||||
|
@ -119,7 +119,6 @@ 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
|
||||
@ -147,9 +146,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.type == obj_new.type and
|
||||
workspace.object_mode == 'EDIT'
|
||||
):
|
||||
obj_act.mode == 'EDIT' and
|
||||
obj_act.type == obj_new.type):
|
||||
|
||||
_obdata = bpy.data.meshes.new(name)
|
||||
obj_act = bpy.data.objects.new(_obdata.name, _obdata)
|
||||
obj_act.matrix_world = obj_new.matrix_world
|
||||
@ -160,10 +159,7 @@ 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.type == obj_new.type and
|
||||
workspace.object_mode == 'EDIT'
|
||||
):
|
||||
if obj_act and obj_act.mode == 'EDIT' and obj_act.type == obj_new.type:
|
||||
bpy.ops.mesh.select_all(action='DESELECT')
|
||||
obj_act.select_set(action='SELECT')
|
||||
bpy.ops.object.mode_set(mode='OBJECT')
|
||||
@ -253,10 +249,9 @@ 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 workspace.object_mode == 'EDIT':
|
||||
if obj.mode == 'EDIT':
|
||||
import bmesh
|
||||
bm = bmesh.from_edit_mesh(me)
|
||||
|
||||
|
@ -57,10 +57,9 @@ 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 workspace.object_mode == 'OBJECT'
|
||||
return ob.mode == 'OBJECT'
|
||||
else:
|
||||
return bool(context.selected_objects)
|
||||
|
||||
@ -68,9 +67,8 @@ 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 workspace.object_mode == 'POSE':
|
||||
if ob and ob.mode == 'POSE':
|
||||
if context.active_pose_bone or context.selected_pose_bones:
|
||||
return True
|
||||
|
||||
@ -89,9 +87,8 @@ 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 workspace.object_mode == 'POSE':
|
||||
if ob and ob.mode == 'POSE':
|
||||
for bone in context.selected_pose_bones:
|
||||
ksi.generate(context, ks, bone)
|
||||
else:
|
||||
|
@ -53,7 +53,6 @@ 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
|
||||
@ -80,7 +79,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 workspace.object_mode == 'EDIT' and ob.name != ref.name:
|
||||
if ob.type == 'MESH' and ob.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')
|
||||
@ -144,7 +143,6 @@ 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:
|
||||
@ -152,7 +150,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 = workspace.object_mode
|
||||
ob_mode = ob.mode
|
||||
mesh = ob.data
|
||||
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
|
||||
for i, edge in enumerate(mesh.edges):
|
||||
@ -176,7 +174,6 @@ 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:
|
||||
@ -184,7 +181,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 = workspace.object_mode
|
||||
ob_mode = ob.mode
|
||||
mesh = ob.data
|
||||
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
|
||||
for i, polygon in enumerate(mesh.polygons):
|
||||
|
@ -57,9 +57,8 @@ class MeshMirrorUV(Operator):
|
||||
precision = self.precision
|
||||
double_warn = 0
|
||||
|
||||
workspace = context.workspace
|
||||
ob = context.active_object
|
||||
is_editmode = (workspace.object_mode == 'EDIT')
|
||||
is_editmode = (ob.mode == 'EDIT')
|
||||
if is_editmode:
|
||||
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
|
||||
|
||||
|
@ -63,13 +63,12 @@ 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 workspace.object_mode == 'POSE':
|
||||
if obj and obj.mode == 'POSE':
|
||||
items = obj.data.bones
|
||||
if not self.extend:
|
||||
bpy.ops.pose.select_all(action='DESELECT')
|
||||
elif obj and obj.type == 'ARMATURE' and workspace.object_mode == 'EDIT':
|
||||
elif obj and obj.type == 'ARMATURE' and obj.mode == 'EDIT':
|
||||
items = obj.data.edit_bones
|
||||
if not self.extend:
|
||||
bpy.ops.armature.select_all(action='DESELECT')
|
||||
@ -249,8 +248,6 @@ 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':
|
||||
@ -260,18 +257,18 @@ class SubdivisionSet(Operator):
|
||||
for i in range(sub):
|
||||
bpy.ops.object.multires_subdivide(modifier="Multires")
|
||||
|
||||
if workspace.object_mode == 'SCULPT':
|
||||
if obj.mode == 'SCULPT':
|
||||
if mod.sculpt_levels != level:
|
||||
mod.sculpt_levels = level
|
||||
elif workspace.object_mode == 'OBJECT':
|
||||
elif obj.mode == 'OBJECT':
|
||||
if mod.levels != level:
|
||||
mod.levels = level
|
||||
return
|
||||
else:
|
||||
if workspace.object_mode == 'SCULPT':
|
||||
if obj.mode == 'SCULPT':
|
||||
if mod.sculpt_levels + level <= mod.total_levels:
|
||||
mod.sculpt_levels += level
|
||||
elif workspace.object_mode == 'OBJECT':
|
||||
elif obj.mode == 'OBJECT':
|
||||
if mod.levels + level <= mod.total_levels:
|
||||
mod.levels += level
|
||||
return
|
||||
@ -287,7 +284,7 @@ class SubdivisionSet(Operator):
|
||||
|
||||
# add a new modifier
|
||||
try:
|
||||
if workspace.object_mode == 'SCULPT':
|
||||
if obj.mode == 'SCULPT':
|
||||
mod = obj.modifiers.new("Multires", 'MULTIRES')
|
||||
if level > 0:
|
||||
for i in range(0, level):
|
||||
@ -470,9 +467,8 @@ class ShapeTransfer(Operator):
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
workspace = context.workspace
|
||||
obj = context.active_object
|
||||
return (obj and workspace.object_mode != 'EDIT')
|
||||
return (obj and obj.mode != 'EDIT')
|
||||
|
||||
def execute(self, context):
|
||||
ob_act = context.active_object
|
||||
@ -512,11 +508,10 @@ class JoinUVs(Operator):
|
||||
|
||||
def _main(self, context):
|
||||
import array
|
||||
workspace = context.workspace
|
||||
obj = context.active_object
|
||||
mesh = obj.data
|
||||
|
||||
is_editmode = (workspace.object_mode == 'EDIT')
|
||||
is_editmode = (obj.mode == 'EDIT')
|
||||
if is_editmode:
|
||||
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
|
||||
|
||||
|
@ -73,10 +73,9 @@ 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 workspace.object_mode == 'OBJECT']
|
||||
if obj.type == 'MESH' and obj.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):
|
||||
workspace = context.workspace
|
||||
is_editmode = (workspace.object_mode == 'EDIT')
|
||||
|
||||
is_editmode = (context.object.mode == 'EDIT')
|
||||
if is_editmode:
|
||||
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
|
||||
|
||||
|
@ -748,8 +748,7 @@ def main(context,
|
||||
USER_FILL_HOLES_QUALITY = 50 # Only for hole filling.
|
||||
USER_VIEW_INIT = 0 # Only for hole filling.
|
||||
|
||||
workspace = context.workspace
|
||||
is_editmode = (workspace.object_mode == 'EDIT')
|
||||
is_editmode = (context.active_object.mode == 'EDIT')
|
||||
if is_editmode:
|
||||
obList = [ob for ob in [context.active_object] if ob and ob.type == 'MESH']
|
||||
else:
|
||||
@ -782,7 +781,7 @@ def main(context,
|
||||
|
||||
|
||||
# Toggle Edit mode
|
||||
is_editmode = (workspace.object_mode == 'EDIT')
|
||||
is_editmode = (context.active_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,9 +30,8 @@ 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 workspace.object_mode == 'EDIT')
|
||||
return (obj is not None and obj.mode == 'EDIT')
|
||||
|
||||
def execute(self, context):
|
||||
mesh = context.object.data
|
||||
@ -69,9 +68,8 @@ 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 workspace.object_mode == 'EDIT')
|
||||
return (obj is not None and obj.mode == 'EDIT')
|
||||
|
||||
@staticmethod
|
||||
def extrude_region(context, use_vert_normals):
|
||||
@ -119,9 +117,8 @@ 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 workspace.object_mode == 'EDIT')
|
||||
return (obj is not None and obj.mode == 'EDIT')
|
||||
|
||||
def execute(self, context):
|
||||
return VIEW3D_OT_edit_mesh_extrude_move.extrude_region(context, True)
|
||||
@ -176,8 +173,7 @@ class VIEW3D_OT_select_or_deselect_all(Operator):
|
||||
def poll(cls, context):
|
||||
active_object = context.active_object
|
||||
if active_object:
|
||||
workspace = context.workspace
|
||||
return workspace.object_mode in {'EDIT', 'OBJECT', 'POSE'}
|
||||
return active_object.mode in {'EDIT', 'OBJECT', 'POSE'}
|
||||
return True
|
||||
|
||||
def invoke(self, context, event):
|
||||
@ -188,9 +184,7 @@ class VIEW3D_OT_select_or_deselect_all(Operator):
|
||||
active_object = context.active_object
|
||||
|
||||
if active_object:
|
||||
workspace = context.workspace
|
||||
object_mode = workspace.object_mode
|
||||
if object_mode == 'EDIT':
|
||||
if active_object.mode == 'EDIT':
|
||||
if active_object.type == 'MESH':
|
||||
bpy.ops.mesh.select_all(action='DESELECT')
|
||||
elif active_object.type == 'CURVE':
|
||||
@ -203,9 +197,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 object_mode == 'POSE':
|
||||
elif active_object.mode == 'POSE':
|
||||
bpy.ops.pose.select_all(action='DESELECT')
|
||||
elif object_mode == 'PARTICLE_EDIT':
|
||||
elif active_object.mode == 'PARTICLE_EDIT':
|
||||
bpy.ops.particle.select_all(action='DESELECT')
|
||||
else:
|
||||
bpy.ops.object.select_all(action='DESELECT')
|
||||
|
@ -910,9 +910,8 @@ class OBJECT_PT_constraints(ConstraintButtonsPanel, Panel):
|
||||
layout = self.layout
|
||||
|
||||
obj = context.object
|
||||
workspace = context.workspace
|
||||
|
||||
if obj.type == 'ARMATURE' and workspace.object_mode == 'POSE':
|
||||
if obj.type == 'ARMATURE' and obj.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,8 +58,7 @@ class BONE_PT_transform(BoneButtonsPanel, Panel):
|
||||
return True
|
||||
|
||||
ob = context.object
|
||||
workspace = context.workspace
|
||||
return ob and workspace.object_mode == 'POSE' and context.bone
|
||||
return ob and ob.mode == 'POSE' and context.bone
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
@ -111,8 +110,7 @@ class BONE_PT_transform_locks(BoneButtonsPanel, Panel):
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
ob = context.object
|
||||
workspace = context.workspace
|
||||
return ob and workspace.object_mode == 'POSE' and context.bone
|
||||
return ob and ob.mode == 'POSE' and context.bone
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
@ -313,8 +311,7 @@ class BONE_PT_inverse_kinematics(BoneButtonsPanel, Panel):
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
ob = context.object
|
||||
workspace = context.workspace
|
||||
return ob and workspace.object_mode == 'POSE' and context.bone
|
||||
return ob and ob.mode == 'POSE' and context.bone
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
@ -442,8 +439,7 @@ class BONE_PT_custom_props(BoneButtonsPanel, PropertyPanel, Panel):
|
||||
@property
|
||||
def _context_path(self):
|
||||
obj = bpy.context.object
|
||||
workspace = context.workspace
|
||||
if obj and workspace.object_mode == 'POSE':
|
||||
if obj and obj.mode == 'POSE':
|
||||
return "active_pose_bone"
|
||||
else:
|
||||
return "active_bone"
|
||||
|
@ -94,13 +94,10 @@ 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
|
||||
(workspace.object_mode == 'EDIT' and not (obj.use_shape_key_edit_mode and obj.type == 'MESH'))
|
||||
):
|
||||
if key_block.mute or (obj.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)
|
||||
@ -208,7 +205,6 @@ 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
|
||||
|
||||
@ -229,10 +225,7 @@ 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
|
||||
((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 and (ob.mode == 'EDIT' or (ob.mode == 'WEIGHT_PAINT' and ob.type == 'MESH' and ob.data.use_paint_mask_vertex)):
|
||||
row = layout.row()
|
||||
|
||||
sub = row.row(align=True)
|
||||
@ -258,7 +251,6 @@ 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
|
||||
|
||||
@ -277,7 +269,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 (workspace.object_mode == 'EDIT' and ob.type == 'MESH'):
|
||||
if ob.face_maps and (ob.mode == 'EDIT' and ob.type == 'MESH'):
|
||||
row = layout.row()
|
||||
|
||||
sub = row.row(align=True)
|
||||
@ -301,12 +293,11 @@ 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 = workspace.object_mode != 'EDIT'
|
||||
enable_edit = ob.mode != 'EDIT'
|
||||
enable_edit_value = False
|
||||
|
||||
if ob.show_only_shape_key is False:
|
||||
@ -428,7 +419,6 @@ 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()
|
||||
@ -443,7 +433,7 @@ class DATA_PT_customdata(MeshButtonsPanel, Panel):
|
||||
|
||||
col = layout.column()
|
||||
|
||||
col.enabled = (workspace.object_mode != 'EDIT')
|
||||
col.enabled = (obj.mode != 'EDIT')
|
||||
col.prop(me, "use_customdata_vertex_bevel")
|
||||
col.prop(me, "use_customdata_edge_bevel")
|
||||
col.prop(me, "use_customdata_edge_crease")
|
||||
|
@ -404,8 +404,6 @@ 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()
|
||||
|
||||
@ -437,7 +435,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
||||
col = split.column()
|
||||
col.prop(md, "use_falloff_uniform")
|
||||
|
||||
if workspace.object_mode == 'EDIT':
|
||||
if ob.mode == 'EDIT':
|
||||
row = col.row(align=True)
|
||||
row.operator("object.hook_reset", text="Reset")
|
||||
row.operator("object.hook_recenter", text="Recenter")
|
||||
@ -593,9 +591,6 @@ 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()
|
||||
@ -606,7 +601,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
||||
|
||||
col = split.column()
|
||||
|
||||
col.enabled = workspace.object_mode != 'EDIT'
|
||||
col.enabled = ob.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 context.workspace.object_mode == 'EDIT':
|
||||
if ob.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 context.workspace.object_mode == 'EDIT':
|
||||
if ob.mode == 'EDIT':
|
||||
row = layout.row(align=True)
|
||||
row.operator("object.material_slot_assign", text="Assign")
|
||||
row.operator("object.material_slot_select", text="Select")
|
||||
|
@ -1208,8 +1208,7 @@ class ImageScopesPanel:
|
||||
if sima.mode == 'PAINT':
|
||||
return False
|
||||
ob = context.active_object
|
||||
workspace = context.workspace
|
||||
if ob and workspace.object_mode in {'TEXTURE_PAINT', 'EDIT'}:
|
||||
if ob and ob.mode in {'TEXTURE_PAINT', 'EDIT'}:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
@ -48,7 +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)
|
||||
|
||||
act_mode_item = bpy.types.WorkSpace.bl_rna.properties['object_mode'].enum_items[workspace.object_mode]
|
||||
act_mode_item = bpy.types.Object.bl_rna.properties["mode"].enum_items[layer.objects.active.mode]
|
||||
layout.operator_menu_enum("object.mode_set", "mode", text=act_mode_item.name, icon=act_mode_item.icon)
|
||||
|
||||
row = layout.row()
|
||||
@ -84,7 +84,7 @@ class INFO_HT_header(Header):
|
||||
return
|
||||
|
||||
row.operator("wm.splash", text="", icon='BLENDER', emboss=False)
|
||||
row.label(text=scene.statistics(workspace, context.view_layer), translate=False)
|
||||
row.label(text=scene.statistics(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 = context.workspace.object_mode
|
||||
mode = obj.mode
|
||||
# Particle edit
|
||||
if mode == 'PARTICLE_EDIT':
|
||||
row.prop(toolsettings.particle_edit, "select_mode", text="", expand=True)
|
||||
@ -317,9 +317,8 @@ 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 workspace.object_mode in {'EDIT', 'POSE'}:
|
||||
if obj.type == 'ARMATURE' and obj.mode in {'EDIT', 'POSE'}:
|
||||
if obj.data.draw_type == 'BBONE':
|
||||
layout.separator()
|
||||
|
||||
@ -1956,10 +1955,7 @@ class VIEW3D_MT_vertex_group(Menu):
|
||||
layout.operator("object.vertex_group_assign_new")
|
||||
|
||||
ob = context.active_object
|
||||
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.mode == 'EDIT' or (ob.mode == 'WEIGHT_PAINT' and ob.type == 'MESH' and ob.data.use_paint_mask_vertex):
|
||||
if ob.vertex_groups.active:
|
||||
layout.separator()
|
||||
|
||||
@ -3405,7 +3401,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 context.mode == 'EDIT_ARMATURE'
|
||||
"edit_bones" if lock_object.mode == 'EDIT'
|
||||
else "bones",
|
||||
text="")
|
||||
else:
|
||||
@ -3458,13 +3454,12 @@ 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 workspace.object_mode in {'EDIT', 'POSE'}:
|
||||
if ob.type == 'ARMATURE' and ob.mode in {'EDIT', 'POSE'}:
|
||||
bone = context.active_bone
|
||||
if bone:
|
||||
row = layout.row()
|
||||
@ -3782,8 +3777,7 @@ class VIEW3D_PT_etch_a_ton(Panel):
|
||||
def poll(cls, context):
|
||||
scene = context.space_data
|
||||
ob = context.active_object
|
||||
workspace = context.workspace
|
||||
return scene and ob and (ob.type == 'ARMATURE') and (workspace.object_mode == 'EDIT')
|
||||
return scene and ob and ob.type == 'ARMATURE' and ob.mode == 'EDIT'
|
||||
|
||||
def draw_header(self, context):
|
||||
layout = self.layout
|
||||
@ -3839,8 +3833,7 @@ class VIEW3D_PT_context_properties(Panel):
|
||||
def _active_context_member(context):
|
||||
obj = context.object
|
||||
if obj:
|
||||
workspace = context.workspace
|
||||
mode = workspace.object_mode
|
||||
mode = obj.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 context.workspace.object_mode != 'SCULPT':
|
||||
if obj is None or obj.mode != 'SCULPT':
|
||||
# Sculpt mode does not generate an undo menu it seems...
|
||||
col.operator("ed.undo_history")
|
||||
|
||||
|
@ -388,9 +388,8 @@ class BUILTIN_KSI_WholeCharacter(KeyingSetInfo):
|
||||
|
||||
# poll - pose-mode on active object only
|
||||
def poll(ksi, context):
|
||||
workspace = context.workspace
|
||||
ob = context.active_object
|
||||
return (ob and ob.pose and (workspace.object_mode == 'POSE'))
|
||||
return ((context.active_object) and (context.active_object.pose) and
|
||||
(context.active_object.mode == 'POSE'))
|
||||
|
||||
# iterator - all bones regardless of selection
|
||||
def iterator(ksi, context, ks):
|
||||
|
@ -100,8 +100,6 @@ 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
|
||||
@ -383,7 +381,7 @@ struct DerivedMesh {
|
||||
|
||||
/** Get the BVH used for paint modes
|
||||
*/
|
||||
struct PBVH *(*getPBVH)(struct Object *ob, DerivedMesh *dm, eObjectMode object_mode);
|
||||
struct PBVH *(*getPBVH)(struct Object *ob, DerivedMesh *dm);
|
||||
|
||||
/* Drawing Operations */
|
||||
|
||||
|
@ -237,7 +237,6 @@ void bvhselftree_update_from_cloth(struct ClothModifierData *clmd, bool moving);
|
||||
|
||||
// needed for button_object.c
|
||||
void cloth_clear_cache(
|
||||
const struct EvaluationContext *eval_ctx,
|
||||
struct Object *ob, struct ClothModifierData *clmd, float framenr );
|
||||
|
||||
void cloth_parallel_transport_hair_frame(float mat[3][3], const float dir_old[3], const float dir_new[3]);
|
||||
|
@ -376,8 +376,7 @@ struct Object *modifiers_isDeformedByArmature(struct Object *ob);
|
||||
struct Object *modifiers_isDeformedByLattice(struct Object *ob);
|
||||
struct Object *modifiers_isDeformedByCurve(struct Object *ob);
|
||||
bool modifiers_usesArmature(struct Object *ob, struct bArmature *arm);
|
||||
bool modifiers_isCorrectableDeformed(
|
||||
const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob);
|
||||
bool modifiers_isCorrectableDeformed(struct Scene *scene, struct Object *ob);
|
||||
void modifier_freeTemporaryData(struct ModifierData *md);
|
||||
bool modifiers_isPreview(struct Object *ob);
|
||||
|
||||
|
@ -48,21 +48,20 @@ 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 MultiresModifierData *mmd, int lvl, eObjectMode object_mode);
|
||||
void multires_set_tot_level(struct Object *ob,
|
||||
struct MultiresModifierData *mmd, int lvl);
|
||||
|
||||
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, eObjectMode object_mode);
|
||||
void multires_force_render_update(struct Object *ob);
|
||||
void multires_force_external_reload(struct Object *ob);
|
||||
|
||||
/* internal, only called in subsurf_ccg.c */
|
||||
void multires_modifier_update_mdisps(struct DerivedMesh *dm, eObjectMode object_mode);
|
||||
void multires_modifier_update_mdisps(struct DerivedMesh *dm);
|
||||
void multires_modifier_update_hidden(struct DerivedMesh *dm);
|
||||
|
||||
void multiresModifier_set_levels_from_disps(struct MultiresModifierData *mmd, struct Object *ob);
|
||||
@ -74,27 +73,21 @@ typedef enum {
|
||||
MULTIRES_IGNORE_SIMPLIFY = 8
|
||||
} MultiresFlags;
|
||||
|
||||
struct DerivedMesh *multires_make_derived_from_derived(
|
||||
struct DerivedMesh *dm,
|
||||
struct MultiresModifierData *mmd,
|
||||
struct Object *ob,
|
||||
MultiresFlags flags,
|
||||
eObjectMode object_mode);
|
||||
struct DerivedMesh *multires_make_derived_from_derived(struct DerivedMesh *dm,
|
||||
struct MultiresModifierData *mmd,
|
||||
struct Object *ob,
|
||||
MultiresFlags flags);
|
||||
|
||||
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, 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_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_sync_levels_ex(
|
||||
struct Object *ob_dst, struct MultiresModifierData *mmd_src, struct MultiresModifierData *mmd_dst,
|
||||
eObjectMode object_mode);
|
||||
struct Object *ob_dst, struct MultiresModifierData *mmd_src, struct MultiresModifierData *mmd_dst);
|
||||
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,
|
||||
@ -110,7 +103,7 @@ enum {
|
||||
MULTIRES_SPACE_OBJECT,
|
||||
MULTIRES_SPACE_ABSOLUTE
|
||||
};
|
||||
void multires_set_space(struct DerivedMesh *dm, struct Object *ob, int from, int to, eObjectMode object_mode);
|
||||
void multires_set_space(struct DerivedMesh *dm, struct Object *ob, int from, int to);
|
||||
|
||||
/* Related to the old multires */
|
||||
void multires_free(struct Multires *mr);
|
||||
|
@ -74,18 +74,16 @@ 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,
|
||||
eObjectMode object_mode);
|
||||
void BKE_object_link_modifiers(struct Object *ob_dst, const struct Object *ob_src);
|
||||
void BKE_object_free_modifiers(struct Object *ob, const int flag);
|
||||
|
||||
void BKE_object_make_proxy(struct Object *ob, struct Object *target, struct Object *gob);
|
||||
void BKE_object_copy_proxy_drivers(struct Object *ob, struct Object *target);
|
||||
|
||||
bool BKE_object_exists_check(struct Object *obtest);
|
||||
bool BKE_object_is_in_editmode(const struct Object *ob);
|
||||
bool BKE_object_is_in_editmode(struct Object *ob);
|
||||
bool BKE_object_is_in_editmode_vgroup(struct Object *ob);
|
||||
bool BKE_object_is_in_wpaint_select_vert(const struct Object *ob, eObjectMode object_mode);
|
||||
bool BKE_object_is_in_wpaint_select_vert(const struct Object *ob);
|
||||
|
||||
typedef enum eObjectVisibilityCheck {
|
||||
OB_VISIBILITY_CHECK_FOR_VIEWPORT,
|
||||
@ -117,12 +115,9 @@ void BKE_object_lod_add(struct Object *ob);
|
||||
void BKE_object_lod_sort(struct Object *ob);
|
||||
bool BKE_object_lod_remove(struct Object *ob, int level);
|
||||
void BKE_object_lod_update(struct Object *ob, const float camera_position[3]);
|
||||
bool BKE_object_lod_is_usable(
|
||||
struct Object *ob, struct ViewLayer *view_layer, const eObjectMode object_mode);
|
||||
struct Object *BKE_object_lod_meshob_get(
|
||||
struct Object *ob, struct ViewLayer *view_layer, const eObjectMode object_mode);
|
||||
struct Object *BKE_object_lod_matob_get(
|
||||
struct Object *ob, struct ViewLayer *view_layer, const eObjectMode object_mode);
|
||||
bool BKE_object_lod_is_usable(struct Object *ob, struct ViewLayer *view_layer);
|
||||
struct Object *BKE_object_lod_meshob_get(struct Object *ob, struct ViewLayer *view_layer);
|
||||
struct Object *BKE_object_lod_matob_get(struct Object *ob, struct ViewLayer *view_layer);
|
||||
|
||||
void BKE_object_copy_data(struct Main *bmain, struct Object *ob_dst, const struct Object *ob_src, const int flag);
|
||||
struct Object *BKE_object_copy(struct Main *bmain, const struct Object *ob);
|
||||
@ -141,7 +136,6 @@ void BKE_object_to_mat4(struct Object *ob, float mat[4][4]);
|
||||
void BKE_object_apply_mat4(struct Object *ob, float mat[4][4], const bool use_compat, const bool use_parent);
|
||||
void BKE_object_matrix_local_get(struct Object *ob, float mat[4][4]);
|
||||
|
||||
bool BKE_object_pose_context_check_ex(struct Object *ob, bool selected);
|
||||
bool BKE_object_pose_context_check(struct Object *ob);
|
||||
struct Object *BKE_object_pose_armature_get(struct Object *ob);
|
||||
struct Object *BKE_object_pose_armature_get_visible(struct Object *ob, struct ViewLayer *view_layer);
|
||||
|
@ -93,10 +93,8 @@ 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, 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_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_all(void);
|
||||
eOverlayControlFlags BKE_paint_get_overlay_flags(void);
|
||||
void BKE_paint_reset_overlay_invalid(eOverlayControlFlags flag);
|
||||
@ -130,8 +128,7 @@ void BKE_paint_cavity_curve_preset(struct Paint *p, int preset);
|
||||
|
||||
eObjectMode BKE_paint_object_mode_from_paint_mode(ePaintMode mode);
|
||||
struct Paint *BKE_paint_get_active_from_paintmode(struct Scene *sce, ePaintMode mode);
|
||||
struct Paint *BKE_paint_get_active(
|
||||
struct Scene *sce, struct ViewLayer *view_layer, const eObjectMode object_mode);
|
||||
struct Paint *BKE_paint_get_active(struct Scene *sce, struct ViewLayer *view_layer);
|
||||
struct Paint *BKE_paint_get_active_from_context(const struct bContext *C);
|
||||
ePaintMode BKE_paintmode_get_active_from_context(const struct bContext *C);
|
||||
struct Brush *BKE_paint_brush(struct Paint *paint);
|
||||
@ -147,9 +144,9 @@ bool BKE_paint_proj_mesh_data_check(struct Scene *scene, struct Object *ob, bool
|
||||
/* testing face select mode
|
||||
* Texture paint could be removed since selected faces are not used
|
||||
* however hiding faces is useful */
|
||||
bool BKE_paint_select_face_test(struct Object *ob, eObjectMode object_mode);
|
||||
bool BKE_paint_select_vert_test(struct Object *ob, eObjectMode object_mode);
|
||||
bool BKE_paint_select_elem_test(struct Object *ob, eObjectMode object_mode);
|
||||
bool BKE_paint_select_face_test(struct Object *ob);
|
||||
bool BKE_paint_select_vert_test(struct Object *ob);
|
||||
bool BKE_paint_select_elem_test(struct Object *ob);
|
||||
|
||||
/* partial visibility */
|
||||
bool paint_is_face_hidden(const struct MLoopTri *lt, const struct MVert *mvert, const struct MLoop *mloop);
|
||||
|
@ -301,8 +301,7 @@ void psys_set_current_num(Object *ob, int index);
|
||||
|
||||
struct LatticeDeformData *psys_create_lattice_deform_data(struct ParticleSimulationData *sim);
|
||||
|
||||
bool psys_in_edit_mode(
|
||||
const struct EvaluationContext *eval_ctx, struct ViewLayer *view_layer, struct ParticleSystem *psys);
|
||||
bool psys_in_edit_mode(struct ViewLayer *view_layer, struct ParticleSystem *psys);
|
||||
bool psys_check_enabled(struct Object *ob, struct ParticleSystem *psys, const bool use_render_params);
|
||||
bool psys_check_edited(struct ParticleSystem *psys);
|
||||
|
||||
|
@ -54,7 +54,6 @@ struct ShrinkwrapModifierData;
|
||||
struct MDeformVert;
|
||||
struct BVHTree;
|
||||
struct SpaceTransform;
|
||||
struct EvaluationContext;
|
||||
|
||||
|
||||
typedef struct ShrinkwrapCalcData {
|
||||
@ -77,10 +76,8 @@ typedef struct ShrinkwrapCalcData {
|
||||
|
||||
} ShrinkwrapCalcData;
|
||||
|
||||
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);
|
||||
void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm,
|
||||
float (*vertexCos)[3], int numVerts, bool for_render);
|
||||
|
||||
/*
|
||||
* This function casts a ray in the given BVHTree.. but it takes into consideration the space_transform, that is:
|
||||
|
@ -95,6 +95,7 @@ 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;
|
||||
|
||||
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(
|
||||
@ -129,13 +130,6 @@ void BKE_workspace_update_tagged(struct EvaluationContext *eval_ctx,
|
||||
struct WorkSpace *workspace,
|
||||
struct Scene *scene);
|
||||
|
||||
void BKE_workspace_update_object_mode(
|
||||
struct EvaluationContext *eval_ctx,
|
||||
struct WorkSpace *workspace);
|
||||
|
||||
struct Object *BKE_workspace_edit_object(
|
||||
struct WorkSpace *workspace, struct Scene *scene);
|
||||
|
||||
bool BKE_workspace_owner_id_check(
|
||||
const struct WorkSpace *workspace, const char *owner_id) ATTR_NONNULL();
|
||||
|
||||
|
@ -51,8 +51,6 @@
|
||||
#include "BLI_linklist.h"
|
||||
#include "BLI_task.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "BKE_cdderivedmesh.h"
|
||||
#include "BKE_colorband.h"
|
||||
#include "BKE_editmesh.h"
|
||||
@ -352,7 +350,7 @@ void DM_init(
|
||||
dm->numPolyData = numPolys;
|
||||
|
||||
DM_init_funcs(dm);
|
||||
|
||||
|
||||
dm->needsFree = 1;
|
||||
dm->auto_bump_scale = -1.0f;
|
||||
dm->dirty = 0;
|
||||
@ -412,7 +410,6 @@ int DM_release(DerivedMesh *dm)
|
||||
if (dm->needsFree) {
|
||||
bvhcache_free(&dm->bvhCache);
|
||||
GPU_drawobject_free(dm);
|
||||
|
||||
CustomData_free(&dm->vertData, dm->numVertData);
|
||||
CustomData_free(&dm->edgeData, dm->numEdgeData);
|
||||
CustomData_free(&dm->faceData, dm->numTessFaceData);
|
||||
@ -1778,19 +1775,17 @@ static void mesh_calc_modifiers(
|
||||
MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
|
||||
const bool has_multires = (mmd && mmd->sculptlvl != 0);
|
||||
bool multires_applied = false;
|
||||
const bool sculpt_mode = eval_ctx->object_mode & OB_MODE_SCULPT && ob->sculpt && !useRenderParams;
|
||||
const bool sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->sculpt && !useRenderParams;
|
||||
const bool sculpt_dyntopo = (sculpt_mode && ob->sculpt->bm) && !useRenderParams;
|
||||
const int draw_flag = dm_drawflag_calc(scene->toolsettings, me);
|
||||
|
||||
/* Generic preview only in object mode! */
|
||||
const bool do_mod_mcol = (eval_ctx->object_mode == OB_MODE_OBJECT);
|
||||
const bool do_mod_mcol = (ob->mode == OB_MODE_OBJECT);
|
||||
#if 0 /* XXX Will re-enable this when we have global mod stack options. */
|
||||
const bool do_final_wmcol = (scene->toolsettings->weights_preview == WP_WPREVIEW_FINAL) && do_wmcol;
|
||||
#endif
|
||||
const bool do_final_wmcol = false;
|
||||
const bool do_init_wmcol = (
|
||||
(dataMask & CD_MASK_PREVIEW_MLOOPCOL) &&
|
||||
(eval_ctx->object_mode & OB_MODE_WEIGHT_PAINT) && !do_final_wmcol);
|
||||
const bool do_init_wmcol = ((dataMask & CD_MASK_PREVIEW_MLOOPCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT) && !do_final_wmcol);
|
||||
/* XXX Same as above... For now, only weights preview in WPaint mode. */
|
||||
const bool do_mod_wmcol = do_init_wmcol;
|
||||
|
||||
@ -2628,7 +2623,7 @@ static bool calc_modifiers_skip_orco(const EvaluationContext *eval_ctx,
|
||||
if (U.opensubdiv_compute_type == USER_OPENSUBDIV_COMPUTE_NONE) {
|
||||
return false;
|
||||
}
|
||||
else if ((eval_ctx->object_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) != 0) {
|
||||
else if ((ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) != 0) {
|
||||
return false;
|
||||
}
|
||||
else if ((DEG_get_eval_flags_for_id(eval_ctx->depsgraph, &ob->id) & DAG_EVAL_NEED_CPU) != 0) {
|
||||
@ -2669,7 +2664,7 @@ static void mesh_build_data(
|
||||
ob->lastDataMask = dataMask;
|
||||
ob->lastNeedMapping = need_mapping;
|
||||
|
||||
if ((eval_ctx->object_mode & OB_MODE_ALL_SCULPT) && ob->sculpt) {
|
||||
if ((ob->mode & OB_MODE_ALL_SCULPT) && ob->sculpt) {
|
||||
/* create PBVH immediately (would be created on the fly too,
|
||||
* but this avoids waiting on first stroke) */
|
||||
|
||||
@ -2707,9 +2702,7 @@ static void editbmesh_build_data(
|
||||
BLI_assert(!(em->derivedFinal->dirty & DM_DIRTY_NORMALS));
|
||||
}
|
||||
|
||||
static CustomDataMask object_get_datamask(
|
||||
const EvaluationContext *eval_ctx,
|
||||
const Scene *scene, Object *ob, bool *r_need_mapping)
|
||||
static CustomDataMask object_get_datamask(const Scene *scene, Object *ob, bool *r_need_mapping)
|
||||
{
|
||||
/* TODO(sergey): Avoid this linear list lookup. */
|
||||
ViewLayer *view_layer = BKE_view_layer_context_active_PLACEHOLDER(scene);
|
||||
@ -2721,28 +2714,28 @@ static CustomDataMask object_get_datamask(
|
||||
}
|
||||
|
||||
if (ob == actob) {
|
||||
bool editing = BKE_paint_select_face_test(ob, eval_ctx->object_mode);
|
||||
bool editing = BKE_paint_select_face_test(ob);
|
||||
|
||||
/* weight paint and face select need original indices because of selection buffer drawing */
|
||||
if (r_need_mapping) {
|
||||
*r_need_mapping = (editing || (eval_ctx->object_mode & (OB_MODE_WEIGHT_PAINT | OB_MODE_VERTEX_PAINT)));
|
||||
*r_need_mapping = (editing || (ob->mode & (OB_MODE_WEIGHT_PAINT | OB_MODE_VERTEX_PAINT)));
|
||||
}
|
||||
|
||||
/* check if we need tfaces & mcols due to face select or texture paint */
|
||||
if ((eval_ctx->object_mode & OB_MODE_TEXTURE_PAINT) || editing) {
|
||||
if ((ob->mode & OB_MODE_TEXTURE_PAINT) || editing) {
|
||||
mask |= CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL;
|
||||
}
|
||||
|
||||
/* check if we need mcols due to vertex paint or weightpaint */
|
||||
if (eval_ctx->object_mode & OB_MODE_VERTEX_PAINT) {
|
||||
if (ob->mode & OB_MODE_VERTEX_PAINT) {
|
||||
mask |= CD_MASK_MLOOPCOL;
|
||||
}
|
||||
|
||||
if (eval_ctx->object_mode & OB_MODE_WEIGHT_PAINT) {
|
||||
if (ob->mode & OB_MODE_WEIGHT_PAINT) {
|
||||
mask |= CD_MASK_PREVIEW_MLOOPCOL;
|
||||
}
|
||||
|
||||
if (eval_ctx->object_mode & OB_MODE_EDIT)
|
||||
if (ob->mode & OB_MODE_EDIT)
|
||||
mask |= CD_MASK_MVERT_SKIN;
|
||||
}
|
||||
|
||||
@ -2754,7 +2747,7 @@ void makeDerivedMesh(
|
||||
CustomDataMask dataMask, const bool build_shapekey_layers)
|
||||
{
|
||||
bool need_mapping;
|
||||
dataMask |= object_get_datamask(eval_ctx, scene, ob, &need_mapping);
|
||||
dataMask |= object_get_datamask(scene, ob, &need_mapping);
|
||||
|
||||
if (em) {
|
||||
editbmesh_build_data(eval_ctx, scene, ob, em, dataMask);
|
||||
@ -2773,7 +2766,7 @@ DerivedMesh *mesh_get_derived_final(
|
||||
* the data we need, rebuild the derived mesh
|
||||
*/
|
||||
bool need_mapping;
|
||||
dataMask |= object_get_datamask(eval_ctx, scene, ob, &need_mapping);
|
||||
dataMask |= object_get_datamask(scene, ob, &need_mapping);
|
||||
|
||||
if (!ob->derivedFinal ||
|
||||
((dataMask & ob->lastDataMask) != dataMask) ||
|
||||
@ -2793,7 +2786,7 @@ DerivedMesh *mesh_get_derived_deform(const struct EvaluationContext *eval_ctx, S
|
||||
*/
|
||||
bool need_mapping;
|
||||
|
||||
dataMask |= object_get_datamask(eval_ctx, scene, ob, &need_mapping);
|
||||
dataMask |= object_get_datamask(scene, ob, &need_mapping);
|
||||
|
||||
if (!ob->derivedDeform ||
|
||||
((dataMask & ob->lastDataMask) != dataMask) ||
|
||||
@ -2912,7 +2905,7 @@ DerivedMesh *editbmesh_get_derived_cage_and_final(
|
||||
/* if there's no derived mesh or the last data mask used doesn't include
|
||||
* the data we need, rebuild the derived mesh
|
||||
*/
|
||||
dataMask |= object_get_datamask(eval_ctx, scene, obedit, NULL);
|
||||
dataMask |= object_get_datamask(scene, obedit, NULL);
|
||||
|
||||
if (!em->derivedCage ||
|
||||
(em->lastDataMask & dataMask) != dataMask)
|
||||
@ -2932,7 +2925,7 @@ DerivedMesh *editbmesh_get_derived_cage(
|
||||
/* if there's no derived mesh or the last data mask used doesn't include
|
||||
* the data we need, rebuild the derived mesh
|
||||
*/
|
||||
dataMask |= object_get_datamask(eval_ctx, scene, obedit, NULL);
|
||||
dataMask |= object_get_datamask(scene, obedit, NULL);
|
||||
|
||||
if (!em->derivedCage ||
|
||||
(em->lastDataMask & dataMask) != dataMask)
|
||||
|
@ -64,8 +64,6 @@
|
||||
#include "GPU_shader.h"
|
||||
#include "GPU_basic_shader.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <math.h>
|
||||
@ -262,8 +260,7 @@ 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, eObjectMode UNUSED(object_mode))
|
||||
static PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
|
||||
{
|
||||
CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
|
||||
|
||||
|
@ -306,14 +306,14 @@ void bvhselftree_update_from_cloth(ClothModifierData *clmd, bool moving)
|
||||
}
|
||||
}
|
||||
|
||||
void cloth_clear_cache(const EvaluationContext *eval_ctx, Object *ob, ClothModifierData *clmd, float framenr)
|
||||
void cloth_clear_cache(Object *ob, ClothModifierData *clmd, float framenr)
|
||||
{
|
||||
PTCacheID pid;
|
||||
|
||||
BKE_ptcache_id_from_cloth(&pid, ob, clmd);
|
||||
|
||||
// don't do anything as long as we're in editmode!
|
||||
if (pid.cache->edit && eval_ctx->object_mode & OB_MODE_PARTICLE_EDIT)
|
||||
if (pid.cache->edit && ob->mode & OB_MODE_PARTICLE_EDIT)
|
||||
return;
|
||||
|
||||
BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_AFTER, framenr);
|
||||
|
@ -1035,10 +1035,9 @@ int CTX_data_mode_enum_ex(const Object *obedit, const Object *ob, const eObjectM
|
||||
|
||||
int CTX_data_mode_enum(const bContext *C)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *obedit = CTX_data_edit_object(C);
|
||||
Object *obact = obedit ? NULL : CTX_data_active_object(C);
|
||||
return CTX_data_mode_enum_ex(obedit, obact, workspace->object_mode);
|
||||
return CTX_data_mode_enum_ex(obedit, obact, obact ? obact->mode : OB_MODE_OBJECT);
|
||||
}
|
||||
|
||||
/* would prefer if we can use the enum version below over this one - Campbell */
|
||||
@ -1275,9 +1274,8 @@ 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);
|
||||
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,
|
||||
workspace->object_mode, DAG_EVAL_VIEWPORT);
|
||||
DAG_EVAL_VIEWPORT);
|
||||
}
|
||||
|
@ -684,13 +684,13 @@ bool modifier_isCorrectableDeformed(ModifierData *md)
|
||||
return (mti->deformMatricesEM != NULL);
|
||||
}
|
||||
|
||||
bool modifiers_isCorrectableDeformed(const EvaluationContext *eval_ctx, struct Scene *scene, Object *ob)
|
||||
bool modifiers_isCorrectableDeformed(struct Scene *scene, Object *ob)
|
||||
{
|
||||
VirtualModifierData virtualModifierData;
|
||||
ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
|
||||
int required_mode = eModifierMode_Realtime;
|
||||
|
||||
if (eval_ctx->object_mode == OB_MODE_EDIT) {
|
||||
if (ob->mode == OB_MODE_EDIT) {
|
||||
required_mode |= eModifierMode_Editmode;
|
||||
}
|
||||
for (; md; md = md->next) {
|
||||
|
@ -60,8 +60,6 @@
|
||||
|
||||
#include "BKE_object.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "CCGSubSurf.h"
|
||||
|
||||
#include <math.h>
|
||||
@ -338,13 +336,12 @@ MultiresModifierData *get_multires_modifier(Scene *scene, Object *ob, bool use_f
|
||||
return mmd;
|
||||
}
|
||||
|
||||
static int multires_get_level(
|
||||
MultiresModifierData *mmd,
|
||||
bool render, bool ignore_simplify, eObjectMode object_mode)
|
||||
static int multires_get_level(Object *ob, MultiresModifierData *mmd,
|
||||
bool render, bool ignore_simplify)
|
||||
{
|
||||
if (render)
|
||||
return (mmd->modifier.scene) ? get_render_subsurf_level(&mmd->modifier.scene->r, mmd->renderlvl, true) : mmd->renderlvl;
|
||||
else if (object_mode == OB_MODE_SCULPT)
|
||||
else if (ob->mode == OB_MODE_SCULPT)
|
||||
return mmd->sculptlvl;
|
||||
else if (ignore_simplify)
|
||||
return mmd->lvl;
|
||||
@ -352,13 +349,12 @@ static int multires_get_level(
|
||||
return (mmd->modifier.scene) ? get_render_subsurf_level(&mmd->modifier.scene->r, mmd->lvl, false) : mmd->lvl;
|
||||
}
|
||||
|
||||
void multires_set_tot_level(MultiresModifierData *mmd, int lvl, eObjectMode object_mode)
|
||||
void multires_set_tot_level(Object *ob, MultiresModifierData *mmd, int lvl)
|
||||
{
|
||||
mmd->totlvl = lvl;
|
||||
|
||||
if (object_mode != OB_MODE_SCULPT) {
|
||||
if (ob->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);
|
||||
@ -396,9 +392,9 @@ void multires_force_external_reload(Object *ob)
|
||||
multires_force_update(ob);
|
||||
}
|
||||
|
||||
void multires_force_render_update(Object *ob, eObjectMode object_mode)
|
||||
void multires_force_render_update(Object *ob)
|
||||
{
|
||||
if (ob && (object_mode & OB_MODE_SCULPT) && modifiers_findByType(ob, eModifierType_Multires))
|
||||
if (ob && (ob->mode & OB_MODE_SCULPT) && modifiers_findByType(ob, eModifierType_Multires))
|
||||
multires_force_update(ob);
|
||||
}
|
||||
|
||||
@ -438,7 +434,7 @@ int multiresModifier_reshapeFromDeformMod(const struct EvaluationContext *eval_c
|
||||
int numVerts, result;
|
||||
float (*deformedVerts)[3];
|
||||
|
||||
if (multires_get_level(mmd, false, true, eval_ctx->object_mode) == 0)
|
||||
if (multires_get_level(ob, mmd, false, true) == 0)
|
||||
return 0;
|
||||
|
||||
/* Create DerivedMesh for deformation modifier */
|
||||
@ -618,7 +614,7 @@ static void multires_grid_paint_mask_downsample(GridPaintMask *gpm, int level)
|
||||
}
|
||||
}
|
||||
|
||||
static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl, eObjectMode object_mode)
|
||||
static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl)
|
||||
{
|
||||
Mesh *me = (Mesh *)ob->data;
|
||||
int levels = mmd->totlvl - lvl;
|
||||
@ -680,14 +676,14 @@ static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl,
|
||||
}
|
||||
}
|
||||
|
||||
multires_set_tot_level(mmd, lvl, object_mode);
|
||||
multires_set_tot_level(ob, mmd, lvl);
|
||||
}
|
||||
|
||||
/* (direction = 1) for delete higher, (direction = 0) for lower (not implemented yet) */
|
||||
void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int direction, eObjectMode object_mode)
|
||||
void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int direction)
|
||||
{
|
||||
Mesh *me = BKE_mesh_from_object(ob);
|
||||
int lvl = multires_get_level(mmd, false, true, object_mode);
|
||||
int lvl = multires_get_level(ob, mmd, false, true);
|
||||
int levels = mmd->totlvl - lvl;
|
||||
MDisps *mdisps;
|
||||
|
||||
@ -698,14 +694,13 @@ 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, object_mode);
|
||||
multires_del_higher(mmd, ob, lvl);
|
||||
}
|
||||
|
||||
multires_set_tot_level(mmd, lvl, object_mode);
|
||||
multires_set_tot_level(ob, mmd, lvl);
|
||||
}
|
||||
|
||||
static DerivedMesh *multires_dm_create_local(
|
||||
Object *ob, DerivedMesh *dm, int lvl, int totlvl, int simple, bool alloc_paint_mask, eObjectMode object_mode)
|
||||
static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int totlvl, int simple, bool alloc_paint_mask)
|
||||
{
|
||||
MultiresModifierData mmd = {{NULL}};
|
||||
MultiresFlags flags = MULTIRES_USE_LOCAL_MMD;
|
||||
@ -719,12 +714,10 @@ static DerivedMesh *multires_dm_create_local(
|
||||
if (alloc_paint_mask)
|
||||
flags |= MULTIRES_ALLOC_PAINT_MASK;
|
||||
|
||||
return multires_make_derived_from_derived(dm, &mmd, ob, flags, object_mode);
|
||||
return multires_make_derived_from_derived(dm, &mmd, ob, flags);
|
||||
}
|
||||
|
||||
static DerivedMesh *subsurf_dm_create_local(
|
||||
DerivedMesh *dm, int lvl, int simple,
|
||||
int optimal, int plain_uv, int alloc_paint_mask, eObjectMode 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)
|
||||
{
|
||||
SubsurfModifierData smd = {{NULL}};
|
||||
SubsurfFlags flags = 0;
|
||||
@ -737,7 +730,7 @@ static DerivedMesh *subsurf_dm_create_local(
|
||||
if (optimal)
|
||||
smd.flags |= eSubsurfModifierFlag_ControlEdges;
|
||||
|
||||
if (object_mode & OB_MODE_EDIT)
|
||||
if (ob->mode & OB_MODE_EDIT)
|
||||
flags |= SUBSURF_IN_EDIT_MODE;
|
||||
|
||||
if (alloc_paint_mask)
|
||||
@ -757,7 +750,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, eObjectMode object_mode)
|
||||
void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob)
|
||||
{
|
||||
DerivedMesh *cddm, *dispdm, *origdm;
|
||||
Mesh *me;
|
||||
@ -779,7 +772,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob, eObjectM
|
||||
/* 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, object_mode);
|
||||
dispdm = multires_dm_create_local(ob, cddm, totlvl, totlvl, 0, 0);
|
||||
cddm->release(cddm);
|
||||
|
||||
/* copy the new locations of the base verts into the mesh */
|
||||
@ -875,9 +868,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob, eObjectM
|
||||
/* 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(
|
||||
cddm, totlvl, 0,
|
||||
0, mmd->flags & eMultiresModifierFlag_PlainUv, 0, object_mode);
|
||||
origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0);
|
||||
cddm->release(cddm);
|
||||
|
||||
/* calc disps */
|
||||
@ -887,8 +878,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob, eObjectM
|
||||
dispdm->release(dispdm);
|
||||
}
|
||||
|
||||
static void multires_subdivide(
|
||||
MultiresModifierData *mmd, Object *ob, int totlvl, int updateblock, int simple, eObjectMode object_mode)
|
||||
static void multires_subdivide(MultiresModifierData *mmd, Object *ob, int totlvl, int updateblock, int simple)
|
||||
{
|
||||
Mesh *me = ob->data;
|
||||
MDisps *mdisps;
|
||||
@ -917,13 +907,11 @@ static void multires_subdivide(
|
||||
/* 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(
|
||||
cddm, totlvl, simple,
|
||||
0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask, object_mode);
|
||||
highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask);
|
||||
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, object_mode);
|
||||
lowdm = multires_dm_create_local(ob, cddm, lvl, lvl, simple, has_mask);
|
||||
BLI_assert(lowdm != cddm);
|
||||
cddm->release(cddm);
|
||||
|
||||
@ -970,13 +958,12 @@ static void multires_subdivide(
|
||||
multires_reallocate_mdisps(me->totloop, mdisps, totlvl);
|
||||
}
|
||||
|
||||
multires_set_tot_level(mmd, totlvl, object_mode);
|
||||
multires_set_tot_level(ob, mmd, totlvl);
|
||||
}
|
||||
|
||||
void multiresModifier_subdivide(
|
||||
MultiresModifierData *mmd, Object *ob, int updateblock, int simple, eObjectMode object_mode)
|
||||
void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updateblock, int simple)
|
||||
{
|
||||
multires_subdivide(mmd, ob, mmd->totlvl + 1, updateblock, simple, object_mode);
|
||||
multires_subdivide(mmd, ob, mmd->totlvl + 1, updateblock, simple);
|
||||
}
|
||||
|
||||
static void grid_tangent(const CCGKey *key, int x, int y, int axis, CCGElem *grid, float t[3])
|
||||
@ -1209,7 +1196,7 @@ static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm
|
||||
}
|
||||
}
|
||||
|
||||
void multires_modifier_update_mdisps(struct DerivedMesh *dm, eObjectMode object_mode)
|
||||
void multires_modifier_update_mdisps(struct DerivedMesh *dm)
|
||||
{
|
||||
CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
|
||||
Object *ob;
|
||||
@ -1241,13 +1228,11 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, eObjectMode object_
|
||||
else cddm = CDDM_from_mesh(me);
|
||||
DM_set_only_copy(cddm, CD_MASK_BAREMESH);
|
||||
|
||||
highdm = subsurf_dm_create_local(
|
||||
cddm, totlvl, mmd->simple,
|
||||
0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask, object_mode);
|
||||
highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask);
|
||||
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, object_mode);
|
||||
lowdm = multires_dm_create_local(ob, cddm, lvl, totlvl, mmd->simple, has_mask);
|
||||
cddm->release(cddm);
|
||||
|
||||
/* gather grid data */
|
||||
@ -1305,9 +1290,7 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, eObjectMode object_
|
||||
else cddm = CDDM_from_mesh(me);
|
||||
DM_set_only_copy(cddm, CD_MASK_BAREMESH);
|
||||
|
||||
subdm = subsurf_dm_create_local(
|
||||
cddm, mmd->totlvl, mmd->simple,
|
||||
0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask, object_mode);
|
||||
subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, has_mask);
|
||||
cddm->release(cddm);
|
||||
|
||||
multiresModifier_disp_run(dm, me, NULL, CALC_DISPLACEMENTS, subdm->getGridData(subdm), mmd->totlvl);
|
||||
@ -1349,7 +1332,7 @@ void multires_modifier_update_hidden(DerivedMesh *dm)
|
||||
}
|
||||
}
|
||||
|
||||
void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to, eObjectMode object_mode)
|
||||
void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to)
|
||||
{
|
||||
DerivedMesh *ccgdm = NULL, *subsurf = NULL;
|
||||
CCGElem **gridData, **subGridData = NULL;
|
||||
@ -1370,11 +1353,10 @@ void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to, eObjectMo
|
||||
}
|
||||
|
||||
totlvl = mmd->totlvl;
|
||||
ccgdm = multires_dm_create_local(ob, dm, totlvl, totlvl, mmd->simple, false, object_mode);
|
||||
ccgdm = multires_dm_create_local(ob, dm, totlvl, totlvl, mmd->simple, false);
|
||||
|
||||
subsurf = subsurf_dm_create_local(
|
||||
dm, totlvl, mmd->simple,
|
||||
mmd->flags & eMultiresModifierFlag_ControlEdges, mmd->flags & eMultiresModifierFlag_PlainUv, 0, object_mode);
|
||||
subsurf = subsurf_dm_create_local(ob, dm, totlvl,
|
||||
mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges, mmd->flags & eMultiresModifierFlag_PlainUv, 0);
|
||||
|
||||
numGrids = subsurf->getNumGrids(subsurf);
|
||||
gridSize = subsurf->getGridSize(subsurf);
|
||||
@ -1489,12 +1471,10 @@ void multires_stitch_grids(Object *ob)
|
||||
}
|
||||
}
|
||||
|
||||
DerivedMesh *multires_make_derived_from_derived(
|
||||
DerivedMesh *dm,
|
||||
MultiresModifierData *mmd,
|
||||
Object *ob,
|
||||
MultiresFlags flags,
|
||||
eObjectMode object_mode)
|
||||
DerivedMesh *multires_make_derived_from_derived(DerivedMesh *dm,
|
||||
MultiresModifierData *mmd,
|
||||
Object *ob,
|
||||
MultiresFlags flags)
|
||||
{
|
||||
Mesh *me = ob->data;
|
||||
DerivedMesh *result;
|
||||
@ -1503,18 +1483,16 @@ DerivedMesh *multires_make_derived_from_derived(
|
||||
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(mmd, render, ignore_simplify, object_mode);
|
||||
int lvl = multires_get_level(ob, mmd, render, ignore_simplify);
|
||||
int i, gridSize, numGrids;
|
||||
|
||||
if (lvl == 0)
|
||||
return dm;
|
||||
|
||||
result = subsurf_dm_create_local(
|
||||
dm, lvl, mmd->simple,
|
||||
mmd->flags & eMultiresModifierFlag_ControlEdges,
|
||||
mmd->flags & eMultiresModifierFlag_PlainUv,
|
||||
flags & MULTIRES_ALLOC_PAINT_MASK,
|
||||
object_mode);
|
||||
result = subsurf_dm_create_local(ob, dm, lvl,
|
||||
mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges,
|
||||
mmd->flags & eMultiresModifierFlag_PlainUv,
|
||||
flags & MULTIRES_ALLOC_PAINT_MASK);
|
||||
|
||||
if (!(flags & MULTIRES_USE_LOCAL_MMD)) {
|
||||
ccgdm = (CCGDerivedMesh *)result;
|
||||
@ -2142,7 +2120,6 @@ 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;
|
||||
@ -2191,7 +2168,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, object_mode);
|
||||
multiresModifier_subdivide(mmd, ob, 1, 0);
|
||||
|
||||
mmd->lvl = mmd->totlvl;
|
||||
orig = CDDM_from_mesh(me);
|
||||
@ -2200,7 +2177,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, object_mode);
|
||||
dm = multires_make_derived_from_derived(orig, mmd, ob, 0);
|
||||
|
||||
multires_load_old_dm(dm, me, mmd->totlvl + 1);
|
||||
|
||||
@ -2215,22 +2192,21 @@ 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, eObjectMode object_mode)
|
||||
void multiresModifier_sync_levels_ex(Object *ob_dst, MultiresModifierData *mmd_src, MultiresModifierData *mmd_dst)
|
||||
{
|
||||
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, object_mode);
|
||||
multires_subdivide(mmd_dst, ob_dst, mmd_src->totlvl, false, mmd_dst->simple);
|
||||
}
|
||||
else {
|
||||
multires_del_higher(mmd_dst, ob_dst, mmd_src->totlvl, object_mode);
|
||||
multires_del_higher(mmd_dst, ob_dst, mmd_src->totlvl);
|
||||
}
|
||||
}
|
||||
|
||||
static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst, eObjectMode object_mode)
|
||||
static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst)
|
||||
{
|
||||
MultiresModifierData *mmd_src = get_multires_modifier(scene, ob_src, true);
|
||||
MultiresModifierData *mmd_dst = get_multires_modifier(scene, ob_dst, true);
|
||||
@ -2245,7 +2221,7 @@ static void multires_sync_levels(Scene *scene, Object *ob_src, Object *ob_dst, e
|
||||
}
|
||||
|
||||
if (mmd_src && mmd_dst) {
|
||||
multiresModifier_sync_levels_ex(ob_dst, mmd_src, mmd_dst, object_mode);
|
||||
multiresModifier_sync_levels_ex(ob_dst, mmd_src, mmd_dst);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2338,9 +2314,7 @@ 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(
|
||||
cddm, high_mmd.totlvl, high_mmd.simple,
|
||||
0, mmd->flags & eMultiresModifierFlag_PlainUv, 0, eval_ctx->object_mode);
|
||||
dm = subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv, 0);
|
||||
cddm->release(cddm);
|
||||
|
||||
gridSize = dm->getGridSize(dm);
|
||||
@ -2403,7 +2377,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, eval_ctx->object_mode);
|
||||
multires_sync_levels(scene, to_ob, ob);
|
||||
|
||||
/* construct scale matrix for displacement */
|
||||
BKE_object_scale_to_mat3(to_ob, tmat);
|
||||
|
@ -262,9 +262,7 @@ 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,
|
||||
eObjectMode object_mode)
|
||||
void BKE_object_link_modifiers(struct Object *ob_dst, const struct Object *ob_src)
|
||||
{
|
||||
ModifierData *md;
|
||||
BKE_object_free_modifiers(ob_dst, 0);
|
||||
@ -303,8 +301,7 @@ void BKE_object_link_modifiers(
|
||||
|
||||
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, object_mode);
|
||||
multiresModifier_sync_levels_ex(ob_dst, (MultiresModifierData *)md, (MultiresModifierData *)nmd);
|
||||
}
|
||||
|
||||
modifier_copyData(md, nmd);
|
||||
@ -490,7 +487,7 @@ void BKE_object_free(Object *ob)
|
||||
}
|
||||
|
||||
/* actual check for internal data, not context or flags */
|
||||
bool BKE_object_is_in_editmode(const Object *ob)
|
||||
bool BKE_object_is_in_editmode(Object *ob)
|
||||
{
|
||||
if (ob->data == NULL)
|
||||
return false;
|
||||
@ -539,11 +536,11 @@ bool BKE_object_is_in_editmode_vgroup(Object *ob)
|
||||
BKE_object_is_in_editmode(ob));
|
||||
}
|
||||
|
||||
bool BKE_object_is_in_wpaint_select_vert(const Object *ob, eObjectMode object_mode)
|
||||
bool BKE_object_is_in_wpaint_select_vert(const Object *ob)
|
||||
{
|
||||
if (ob->type == OB_MESH) {
|
||||
const Mesh *me = ob->data;
|
||||
return ((object_mode & OB_MODE_WEIGHT_PAINT) &&
|
||||
Mesh *me = ob->data;
|
||||
return ((ob->mode & OB_MODE_WEIGHT_PAINT) &&
|
||||
(me->edit_btmesh == NULL) &&
|
||||
(ME_EDIT_PAINT_SEL_MODE(me) == SCE_SELECT_VERTEX));
|
||||
}
|
||||
@ -888,10 +885,10 @@ static LodLevel *lod_level_select(Object *ob, const float camera_position[3])
|
||||
return current;
|
||||
}
|
||||
|
||||
bool BKE_object_lod_is_usable(Object *ob, ViewLayer *view_layer, const eObjectMode object_mode)
|
||||
bool BKE_object_lod_is_usable(Object *ob, ViewLayer *view_layer)
|
||||
{
|
||||
bool active = (view_layer) ? ob == OBACT(view_layer) : false;
|
||||
return (object_mode == OB_MODE_OBJECT || !active);
|
||||
return (ob->mode == OB_MODE_OBJECT || !active);
|
||||
}
|
||||
|
||||
void BKE_object_lod_update(Object *ob, const float camera_position[3])
|
||||
@ -904,11 +901,11 @@ void BKE_object_lod_update(Object *ob, const float camera_position[3])
|
||||
}
|
||||
}
|
||||
|
||||
static Object *lod_ob_get(Object *ob, ViewLayer *view_layer, int flag, const eObjectMode object_mode)
|
||||
static Object *lod_ob_get(Object *ob, ViewLayer *view_layer, int flag)
|
||||
{
|
||||
LodLevel *current = ob->currentlod;
|
||||
|
||||
if (!current || !BKE_object_lod_is_usable(ob, view_layer, object_mode))
|
||||
if (!current || !BKE_object_lod_is_usable(ob, view_layer))
|
||||
return ob;
|
||||
|
||||
while (current->prev && (!(current->flags & flag) || !current->source || current->source->type != OB_MESH)) {
|
||||
@ -918,14 +915,14 @@ static Object *lod_ob_get(Object *ob, ViewLayer *view_layer, int flag, const eOb
|
||||
return current->source;
|
||||
}
|
||||
|
||||
struct Object *BKE_object_lod_meshob_get(Object *ob, ViewLayer *view_layer, const eObjectMode object_mode)
|
||||
struct Object *BKE_object_lod_meshob_get(Object *ob, ViewLayer *view_layer)
|
||||
{
|
||||
return lod_ob_get(ob, view_layer, OB_LOD_USE_MESH, object_mode);
|
||||
return lod_ob_get(ob, view_layer, OB_LOD_USE_MESH);
|
||||
}
|
||||
|
||||
struct Object *BKE_object_lod_matob_get(Object *ob, ViewLayer *view_layer, const eObjectMode object_mode)
|
||||
struct Object *BKE_object_lod_matob_get(Object *ob, ViewLayer *view_layer)
|
||||
{
|
||||
return lod_ob_get(ob, view_layer, OB_LOD_USE_MAT, object_mode);
|
||||
return lod_ob_get(ob, view_layer, OB_LOD_USE_MAT);
|
||||
}
|
||||
|
||||
#endif /* WITH_GAMEENGINE */
|
||||
@ -1154,13 +1151,12 @@ static void copy_object_lod(Object *obn, const Object *ob, const int UNUSED(flag
|
||||
obn->currentlod = (LodLevel *)obn->lodlevels.first;
|
||||
}
|
||||
|
||||
bool BKE_object_pose_context_check_ex(Object *ob, bool selected)
|
||||
bool BKE_object_pose_context_check(Object *ob)
|
||||
{
|
||||
if ((ob) &&
|
||||
(ob->type == OB_ARMATURE) &&
|
||||
(ob->pose) &&
|
||||
/* Currently using selection when the object isn't active. */
|
||||
((selected == false) || (ob->flag & SELECT)))
|
||||
(ob->mode & OB_MODE_POSE))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -1169,23 +1165,18 @@ bool BKE_object_pose_context_check_ex(Object *ob, bool selected)
|
||||
}
|
||||
}
|
||||
|
||||
bool BKE_object_pose_context_check(Object *ob)
|
||||
{
|
||||
return BKE_object_pose_context_check_ex(ob, false);
|
||||
}
|
||||
|
||||
Object *BKE_object_pose_armature_get(Object *ob)
|
||||
{
|
||||
if (ob == NULL)
|
||||
return NULL;
|
||||
|
||||
if (BKE_object_pose_context_check_ex(ob, false))
|
||||
if (BKE_object_pose_context_check(ob))
|
||||
return ob;
|
||||
|
||||
ob = modifiers_isDeformedByArmature(ob);
|
||||
|
||||
/* Only use selected check when non-active. */
|
||||
if (BKE_object_pose_context_check_ex(ob, true))
|
||||
if (BKE_object_pose_context_check(ob))
|
||||
return ob;
|
||||
|
||||
return NULL;
|
||||
@ -1265,6 +1256,7 @@ 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) {
|
||||
|
@ -108,8 +108,8 @@ static void init_context(DupliContext *r_ctx, const EvaluationContext *eval_ctx,
|
||||
r_ctx->animated = false;
|
||||
r_ctx->group = NULL;
|
||||
|
||||
r_ctx->obedit = OBEDIT_FROM_EVAL_CTX(eval_ctx);
|
||||
r_ctx->object = ob;
|
||||
r_ctx->obedit = OBEDIT_FROM_OBACT(ob);
|
||||
if (space_mat)
|
||||
copy_m4_m4(r_ctx->space_mat, space_mat);
|
||||
else
|
||||
|
@ -172,7 +172,7 @@ void BKE_object_handle_data_update(
|
||||
switch (ob->type) {
|
||||
case OB_MESH:
|
||||
{
|
||||
BMEditMesh *em = (eval_ctx->object_mode & OB_MODE_EDIT) ? BKE_editmesh_from_object(ob) : NULL;
|
||||
BMEditMesh *em = (ob->mode & OB_MODE_EDIT) ? BKE_editmesh_from_object(ob) : NULL;
|
||||
uint64_t data_mask = scene->customdata_mask | CD_MASK_BAREMESH;
|
||||
#ifdef WITH_FREESTYLE
|
||||
/* make sure Freestyle edge/face marks appear in DM for render (see T40315) */
|
||||
@ -222,7 +222,7 @@ void BKE_object_handle_data_update(
|
||||
}
|
||||
|
||||
/* particles */
|
||||
if ((ob != OBEDIT_FROM_EVAL_CTX(eval_ctx)) && ob->particlesystem.first) {
|
||||
if ((ob != OBEDIT_FROM_VIEW_LAYER(eval_ctx->view_layer)) && ob->particlesystem.first) {
|
||||
ParticleSystem *tpsys, *psys;
|
||||
DerivedMesh *dm;
|
||||
ob->transflag &= ~OB_DUPLIPARTS;
|
||||
|
@ -76,67 +76,27 @@ const char PAINT_CURSOR_TEXTURE_PAINT[3] = {255, 255, 255};
|
||||
|
||||
static eOverlayControlFlags overlay_flags = 0;
|
||||
|
||||
/* 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)
|
||||
void BKE_paint_invalidate_overlay_tex(Scene *scene, ViewLayer *view_layer, const Tex *tex)
|
||||
{
|
||||
FOREACH_OB_MODE_PAINT_ITER_BEGIN(scene, view_layer, object_mode, p)
|
||||
{
|
||||
Brush *br = p->brush;
|
||||
if (br) {
|
||||
if (br->mtex.tex == tex) {
|
||||
overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_PRIMARY;
|
||||
}
|
||||
if (br->mask_mtex.tex == tex) {
|
||||
overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_SECONDARY;
|
||||
}
|
||||
}
|
||||
}
|
||||
FOREACH_OB_MODE_PAINT_ITER_END;
|
||||
Paint *p = BKE_paint_get_active(scene, view_layer);
|
||||
Brush *br = p->brush;
|
||||
|
||||
if (!br)
|
||||
return;
|
||||
|
||||
if (br->mtex.tex == tex)
|
||||
overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_PRIMARY;
|
||||
if (br->mask_mtex.tex == tex)
|
||||
overlay_flags |= PAINT_INVALID_OVERLAY_TEXTURE_SECONDARY;
|
||||
}
|
||||
|
||||
void BKE_paint_invalidate_cursor_overlay(
|
||||
Scene *scene, ViewLayer *view_layer, CurveMapping *curve, eObjectMode object_mode)
|
||||
void BKE_paint_invalidate_cursor_overlay(Scene *scene, ViewLayer *view_layer, CurveMapping *curve)
|
||||
{
|
||||
FOREACH_OB_MODE_PAINT_ITER_BEGIN(scene, view_layer, object_mode, p)
|
||||
{
|
||||
Brush *br = p->brush;
|
||||
if (br) {
|
||||
if (br->curve == curve) {
|
||||
overlay_flags |= PAINT_INVALID_OVERLAY_CURVE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
FOREACH_OB_MODE_PAINT_ITER_END;
|
||||
Paint *p = BKE_paint_get_active(scene, view_layer);
|
||||
Brush *br = p->brush;
|
||||
|
||||
if (br && br->curve == curve)
|
||||
overlay_flags |= PAINT_INVALID_OVERLAY_CURVE;
|
||||
}
|
||||
|
||||
void BKE_paint_invalidate_overlay_all(void)
|
||||
@ -198,13 +158,13 @@ Paint *BKE_paint_get_active_from_paintmode(Scene *sce, ePaintMode mode)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Paint *BKE_paint_get_active(Scene *sce, ViewLayer *view_layer, const eObjectMode object_mode)
|
||||
Paint *BKE_paint_get_active(Scene *sce, ViewLayer *view_layer)
|
||||
{
|
||||
if (sce && view_layer) {
|
||||
ToolSettings *ts = sce->toolsettings;
|
||||
|
||||
if (view_layer->basact && view_layer->basact->object) {
|
||||
switch (object_mode) {
|
||||
switch (view_layer->basact->object->mode) {
|
||||
case OB_MODE_SCULPT:
|
||||
return &ts->sculpt->paint;
|
||||
case OB_MODE_VERTEX_PAINT:
|
||||
@ -236,7 +196,6 @@ Paint *BKE_paint_get_active_from_context(const bContext *C)
|
||||
SpaceImage *sima;
|
||||
|
||||
if (sce && view_layer) {
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
ToolSettings *ts = sce->toolsettings;
|
||||
Object *obact = NULL;
|
||||
|
||||
@ -244,7 +203,7 @@ Paint *BKE_paint_get_active_from_context(const bContext *C)
|
||||
obact = view_layer->basact->object;
|
||||
|
||||
if ((sima = CTX_wm_space_image(C)) != NULL) {
|
||||
if (obact && workspace->object_mode == OB_MODE_EDIT) {
|
||||
if (obact && obact->mode == OB_MODE_EDIT) {
|
||||
if (sima->mode == SI_MODE_PAINT)
|
||||
return &ts->imapaint.paint;
|
||||
else if (ts->use_uv_sculpt)
|
||||
@ -255,7 +214,7 @@ Paint *BKE_paint_get_active_from_context(const bContext *C)
|
||||
}
|
||||
}
|
||||
else if (obact) {
|
||||
switch (workspace->object_mode) {
|
||||
switch (obact->mode) {
|
||||
case OB_MODE_SCULPT:
|
||||
return &ts->sculpt->paint;
|
||||
case OB_MODE_VERTEX_PAINT:
|
||||
@ -288,7 +247,6 @@ ePaintMode BKE_paintmode_get_active_from_context(const bContext *C)
|
||||
SpaceImage *sima;
|
||||
|
||||
if (sce && view_layer) {
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
ToolSettings *ts = sce->toolsettings;
|
||||
Object *obact = NULL;
|
||||
|
||||
@ -296,7 +254,7 @@ ePaintMode BKE_paintmode_get_active_from_context(const bContext *C)
|
||||
obact = view_layer->basact->object;
|
||||
|
||||
if ((sima = CTX_wm_space_image(C)) != NULL) {
|
||||
if (obact && workspace->object_mode == OB_MODE_EDIT) {
|
||||
if (obact && obact->mode == OB_MODE_EDIT) {
|
||||
if (sima->mode == SI_MODE_PAINT)
|
||||
return ePaintTexture2D;
|
||||
else if (ts->use_uv_sculpt)
|
||||
@ -307,7 +265,7 @@ ePaintMode BKE_paintmode_get_active_from_context(const bContext *C)
|
||||
}
|
||||
}
|
||||
else if (obact) {
|
||||
switch (workspace->object_mode) {
|
||||
switch (obact->mode) {
|
||||
case OB_MODE_SCULPT:
|
||||
return ePaintSculpt;
|
||||
case OB_MODE_VERTEX_PAINT:
|
||||
@ -498,24 +456,24 @@ bool BKE_palette_is_empty(const struct Palette *palette)
|
||||
|
||||
|
||||
/* are we in vertex paint or weight pain face select mode? */
|
||||
bool BKE_paint_select_face_test(Object *ob, eObjectMode object_mode)
|
||||
bool BKE_paint_select_face_test(Object *ob)
|
||||
{
|
||||
return ( (ob != NULL) &&
|
||||
(ob->type == OB_MESH) &&
|
||||
(ob->data != NULL) &&
|
||||
(((Mesh *)ob->data)->editflag & ME_EDIT_PAINT_FACE_SEL) &&
|
||||
(object_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT))
|
||||
(ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT))
|
||||
);
|
||||
}
|
||||
|
||||
/* are we in weight paint vertex select mode? */
|
||||
bool BKE_paint_select_vert_test(Object *ob, eObjectMode object_mode)
|
||||
bool BKE_paint_select_vert_test(Object *ob)
|
||||
{
|
||||
return ( (ob != NULL) &&
|
||||
(ob->type == OB_MESH) &&
|
||||
(ob->data != NULL) &&
|
||||
(((Mesh *)ob->data)->editflag & ME_EDIT_PAINT_VERT_SEL) &&
|
||||
(object_mode & OB_MODE_WEIGHT_PAINT || object_mode & OB_MODE_VERTEX_PAINT)
|
||||
(ob->mode & OB_MODE_WEIGHT_PAINT || ob->mode & OB_MODE_VERTEX_PAINT)
|
||||
);
|
||||
}
|
||||
|
||||
@ -523,10 +481,10 @@ bool BKE_paint_select_vert_test(Object *ob, eObjectMode object_mode)
|
||||
* used to check if selection is possible
|
||||
* (when we don't care if its face or vert)
|
||||
*/
|
||||
bool BKE_paint_select_elem_test(Object *ob, eObjectMode object_mode)
|
||||
bool BKE_paint_select_elem_test(Object *ob)
|
||||
{
|
||||
return (BKE_paint_select_vert_test(ob, object_mode) ||
|
||||
BKE_paint_select_face_test(ob, object_mode));
|
||||
return (BKE_paint_select_vert_test(ob) ||
|
||||
BKE_paint_select_face_test(ob));
|
||||
}
|
||||
|
||||
void BKE_paint_cavity_curve_preset(Paint *p, int preset)
|
||||
@ -829,7 +787,7 @@ void BKE_sculptsession_free(Object *ob)
|
||||
BM_log_free(ss->bm_log);
|
||||
|
||||
if (dm && dm->getPBVH)
|
||||
dm->getPBVH(NULL, dm, OB_MODE_OBJECT); /* signal to clear */
|
||||
dm->getPBVH(NULL, dm); /* signal to clear */
|
||||
|
||||
if (ss->texcache)
|
||||
MEM_freeN(ss->texcache);
|
||||
@ -966,7 +924,7 @@ void BKE_sculpt_update_mesh_elements(
|
||||
dm = mesh_get_derived_final(eval_ctx, scene, ob, CD_MASK_BAREMESH);
|
||||
|
||||
/* VWPaint require mesh info for loop lookup, so require sculpt mode here */
|
||||
if (mmd && eval_ctx->object_mode & OB_MODE_SCULPT) {
|
||||
if (mmd && ob->mode & OB_MODE_SCULPT) {
|
||||
ss->multires = mmd;
|
||||
ss->totvert = dm->getNumVerts(dm);
|
||||
ss->totpoly = dm->getNumPolys(dm);
|
||||
@ -984,7 +942,7 @@ void BKE_sculpt_update_mesh_elements(
|
||||
ss->vmask = CustomData_get_layer(&me->vdata, CD_PAINT_MASK);
|
||||
}
|
||||
|
||||
ss->pbvh = dm->getPBVH(ob, dm, eval_ctx->object_mode);
|
||||
ss->pbvh = dm->getPBVH(ob, dm);
|
||||
ss->pmap = (need_pmap && dm->getPolyMap) ? dm->getPolyMap(ob, dm) : NULL;
|
||||
|
||||
pbvh_show_diffuse_color_set(ss->pbvh, ss->show_diffuse_color);
|
||||
|
@ -251,7 +251,7 @@ struct LatticeDeformData *psys_create_lattice_deform_data(ParticleSimulationData
|
||||
{
|
||||
struct LatticeDeformData *lattice_deform_data = NULL;
|
||||
|
||||
if (psys_in_edit_mode(sim->eval_ctx, sim->eval_ctx->view_layer, sim->psys) == 0) {
|
||||
if (psys_in_edit_mode(sim->eval_ctx->view_layer, sim->psys) == 0) {
|
||||
Object *lattice = NULL;
|
||||
ModifierData *md = (ModifierData *)psys_get_modifier(sim->ob, sim->psys);
|
||||
int mode = G.is_rendering ? eModifierMode_Render : eModifierMode_Realtime;
|
||||
@ -288,12 +288,11 @@ void psys_enable_all(Object *ob)
|
||||
psys->flag &= ~PSYS_DISABLED;
|
||||
}
|
||||
|
||||
bool psys_in_edit_mode(const EvaluationContext *eval_ctx, ViewLayer *view_layer, ParticleSystem *psys)
|
||||
bool psys_in_edit_mode(ViewLayer *view_layer, ParticleSystem *psys)
|
||||
{
|
||||
/* TODO(mai): the check for view_layer shouldnt be needed, remove when render engine api is updated for this */
|
||||
return (view_layer && view_layer->basact &&
|
||||
(eval_ctx->object_mode & OB_MODE_PARTICLE_EDIT) &&
|
||||
psys == psys_get_current(view_layer->basact->object) &&
|
||||
return (view_layer->basact &&
|
||||
(view_layer->basact->object->mode & OB_MODE_PARTICLE_EDIT) &&
|
||||
psys == psys_get_current((view_layer->basact)->object) &&
|
||||
(psys->edit || psys->pointcache->edit) &&
|
||||
!psys->renderdata);
|
||||
}
|
||||
@ -2095,7 +2094,7 @@ static bool psys_thread_context_init_path(
|
||||
psys_thread_context_init(ctx, sim);
|
||||
|
||||
/*---start figuring out what is actually wanted---*/
|
||||
if (psys_in_edit_mode(sim->eval_ctx, sim->eval_ctx->view_layer, psys)) {
|
||||
if (psys_in_edit_mode(sim->eval_ctx->view_layer, psys)) {
|
||||
ParticleEditSettings *pset = &scene->toolsettings->particle;
|
||||
|
||||
if ((psys->renderdata == 0 && use_render_params == 0) && (psys->edit == NULL || pset->flag & PE_DRAW_PART) == 0)
|
||||
@ -2192,7 +2191,7 @@ static void psys_thread_create_path(ParticleTask *task, struct ChildParticle *cp
|
||||
ParticleSystem *psys = ctx->sim.psys;
|
||||
ParticleSettings *part = psys->part;
|
||||
ParticleCacheKey **cache = psys->childcache;
|
||||
ParticleCacheKey **pcache = psys_in_edit_mode(ctx->sim.eval_ctx, ctx->sim.eval_ctx->view_layer, psys) && psys->edit ? psys->edit->pathcache : psys->pathcache;
|
||||
ParticleCacheKey **pcache = psys_in_edit_mode(ctx->sim.eval_ctx->view_layer, psys) && psys->edit ? psys->edit->pathcache : psys->pathcache;
|
||||
ParticleCacheKey *child, *key[4];
|
||||
ParticleTexture ptex;
|
||||
float *cpa_fuv = 0, *par_rot = 0, rot[4];
|
||||
@ -2616,7 +2615,7 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra, const bool use_re
|
||||
return;
|
||||
|
||||
#if 0 /* TODO(mai): something is very wrong with these conditionals, they dont make sense and the cache isnt updating */
|
||||
if (psys_in_edit_mode(sim->eval_ctx, sim->eval_ctx->view_layer, psys))
|
||||
if (psys_in_edit_mode(sim->eval_ctx->view_layer, psys))
|
||||
if (psys->renderdata == 0 && (psys->edit == NULL || pset->flag & PE_DRAW_PART) == 0)
|
||||
return;
|
||||
#endif
|
||||
@ -3244,6 +3243,8 @@ 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);
|
||||
@ -3829,7 +3830,7 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
|
||||
pind.bspline = (psys->part->flag & PART_HAIR_BSPLINE);
|
||||
/* pind.dm disabled in editmode means we don't get effectors taken into
|
||||
* account when subdividing for instance */
|
||||
pind.dm = psys_in_edit_mode(sim->eval_ctx, sim->eval_ctx->view_layer, psys) ? NULL : psys->hair_out_dm;
|
||||
pind.dm = psys_in_edit_mode(sim->eval_ctx->view_layer, psys) ? NULL : psys->hair_out_dm;
|
||||
init_particle_interpolation(sim->ob, psys, pa, &pind);
|
||||
do_particle_interpolation(psys, p, pa, t, &pind, state);
|
||||
|
||||
|
@ -2911,11 +2911,8 @@ static void psys_update_path_cache(ParticleSimulationData *sim, float cfra, cons
|
||||
if ((psys->part->childtype && psys->totchild != psys_get_tot_child(sim->scene, psys)) || psys->recalc&PSYS_RECALC_RESET)
|
||||
alloc=1;
|
||||
|
||||
if (alloc || psys->recalc&PSYS_RECALC_CHILD ||
|
||||
(psys->vgroup[PSYS_VG_DENSITY] && (sim->ob && sim->eval_ctx->object_mode & OB_MODE_WEIGHT_PAINT)))
|
||||
{
|
||||
if (alloc || psys->recalc&PSYS_RECALC_CHILD || (psys->vgroup[PSYS_VG_DENSITY] && (sim->ob && sim->ob->mode & OB_MODE_WEIGHT_PAINT)))
|
||||
distr=1;
|
||||
}
|
||||
|
||||
if (distr) {
|
||||
if (alloc)
|
||||
@ -2945,7 +2942,7 @@ static void psys_update_path_cache(ParticleSimulationData *sim, float cfra, cons
|
||||
skip = 1; /* no need to cache paths while baking dynamics */
|
||||
|
||||
#if 0 /* TODO(mai): something is very wrong with these conditionals, they dont make sense and the cache isnt updating */
|
||||
else if (psys_in_edit_mode(sim->eval_ctx, sim->eval_ctx->view_layer, psys)) {
|
||||
else if (psys_in_edit_mode(sim->eval_ctx->view_layer, psys)) {
|
||||
if ((pset->flag & PE_DRAW_PART)==0)
|
||||
skip = 1;
|
||||
else if (part->childtype==0 && (psys->flag & PSYS_HAIR_DYNAMICS && psys->pointcache->flag & PTCACHE_BAKED)==0)
|
||||
|
@ -1353,7 +1353,7 @@ static bool check_rendered_viewport_visible(Main *bmain)
|
||||
/* TODO(campbell): shouldn't we be able to use 'eval_ctx->view_layer' here?
|
||||
* Currently this is NULL on load, so don't. */
|
||||
static void prepare_mesh_for_viewport_render(
|
||||
Main *bmain, const EvaluationContext *eval_ctx, const ViewLayer *view_layer)
|
||||
Main *bmain, const ViewLayer *view_layer)
|
||||
{
|
||||
/* This is needed to prepare mesh to be used by the render
|
||||
* engine from the viewport rendering. We do loading here
|
||||
@ -1364,8 +1364,7 @@ static void prepare_mesh_for_viewport_render(
|
||||
* call loading of the edit data for the mesh objects.
|
||||
*/
|
||||
|
||||
/* Expanded 'OBEDIT_FROM_EVAL_CTX' */
|
||||
Object *obedit = (eval_ctx->object_mode & OB_MODE_EDIT) ? OBACT(view_layer) : NULL;
|
||||
Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
|
||||
if (obedit) {
|
||||
Mesh *mesh = obedit->data;
|
||||
if ((obedit->type == OB_MESH) &&
|
||||
@ -1407,7 +1406,7 @@ void BKE_scene_graph_update_tagged(EvaluationContext *eval_ctx,
|
||||
/* Uncomment this to check if graph was properly tagged for update. */
|
||||
// DEG_debug_graph_relations_validate(depsgraph, bmain, scene);
|
||||
/* Flush editing data if needed. */
|
||||
prepare_mesh_for_viewport_render(bmain, eval_ctx, view_layer);
|
||||
prepare_mesh_for_viewport_render(bmain, view_layer);
|
||||
/* Flush recalc flags to dependencies. */
|
||||
DEG_graph_flush_update(bmain, depsgraph);
|
||||
/* Update all objects: drivers, matrices, displists, etc. flags set
|
||||
|
@ -57,8 +57,6 @@
|
||||
|
||||
#include "BLI_strict_flags.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
/* for timing... */
|
||||
#if 0
|
||||
# include "PIL_time_utildefines.h"
|
||||
@ -616,9 +614,8 @@ static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc)
|
||||
}
|
||||
|
||||
/* Main shrinkwrap function */
|
||||
void shrinkwrapModifier_deform(
|
||||
const EvaluationContext *eval_ctx, ShrinkwrapModifierData *smd, Object *ob, DerivedMesh *dm,
|
||||
float (*vertexCos)[3], int numVerts, bool for_render)
|
||||
void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedMesh *dm,
|
||||
float (*vertexCos)[3], int numVerts, bool for_render)
|
||||
{
|
||||
|
||||
DerivedMesh *ss_mesh = NULL;
|
||||
@ -673,8 +670,7 @@ void shrinkwrapModifier_deform(
|
||||
ssmd.subdivType = ME_CC_SUBSURF; /* catmull clark */
|
||||
ssmd.levels = smd->subsurfLevels; /* levels */
|
||||
|
||||
ss_mesh = subsurf_make_derived_from_derived(
|
||||
dm, &ssmd, NULL, (eval_ctx->object_mode & OB_MODE_EDIT) ? SUBSURF_IN_EDIT_MODE : 0);
|
||||
ss_mesh = subsurf_make_derived_from_derived(dm, &ssmd, NULL, (ob->mode & OB_MODE_EDIT) ? SUBSURF_IN_EDIT_MODE : 0);
|
||||
|
||||
if (ss_mesh) {
|
||||
calc.vert = ss_mesh->getVertDataArray(ss_mesh, CD_MVERT);
|
||||
|
@ -85,8 +85,6 @@
|
||||
|
||||
#include "CCGSubSurf.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#ifdef WITH_OPENSUBDIV
|
||||
# include "opensubdiv_capi.h"
|
||||
#endif
|
||||
@ -3790,14 +3788,12 @@ static void ccgDM_release(DerivedMesh *dm)
|
||||
{
|
||||
ccgdm->multires.mmd = NULL;
|
||||
}
|
||||
|
||||
if (ccgdm->multires.mmd) {
|
||||
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) {
|
||||
if (ccgdm->multires.modified_flags & MULTIRES_COORDS_MODIFIED)
|
||||
multires_modifier_update_mdisps(dm);
|
||||
if (ccgdm->multires.modified_flags & MULTIRES_HIDDEN_MODIFIED)
|
||||
multires_modifier_update_hidden(dm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -4191,8 +4187,7 @@ static int ccgDM_use_grid_pbvh(CCGDerivedMesh *ccgdm)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static struct PBVH *ccgDM_getPBVH(
|
||||
Object *ob, DerivedMesh *dm, eObjectMode object_mode)
|
||||
static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
|
||||
{
|
||||
CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
|
||||
CCGKey key;
|
||||
@ -4209,7 +4204,7 @@ static struct PBVH *ccgDM_getPBVH(
|
||||
return NULL;
|
||||
|
||||
bool grid_pbvh = ccgDM_use_grid_pbvh(ccgdm);
|
||||
if ((object_mode & OB_MODE_SCULPT) == 0) {
|
||||
if ((ob->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). */
|
||||
|
@ -511,30 +511,6 @@ void BKE_workspace_update_tagged(struct EvaluationContext *eval_ctx,
|
||||
BKE_scene_graph_update_tagged(eval_ctx, depsgraph, bmain, scene, view_layer);
|
||||
}
|
||||
|
||||
void BKE_workspace_update_object_mode(
|
||||
struct EvaluationContext *eval_ctx,
|
||||
WorkSpace *workspace)
|
||||
{
|
||||
/* TODO(campbell): Investigate how this should work exactly,
|
||||
* for now without this 'bmain->eval_ctx' is never set. */
|
||||
|
||||
eval_ctx->object_mode = workspace->object_mode;
|
||||
}
|
||||
|
||||
Object *BKE_workspace_edit_object(WorkSpace *workspace, Scene *scene)
|
||||
{
|
||||
if (workspace->object_mode & OB_MODE_EDIT) {
|
||||
ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene);
|
||||
if (view_layer) {
|
||||
Object *obedit = OBACT(view_layer);
|
||||
if (obedit) {
|
||||
BLI_assert(BKE_object_is_in_editmode(obedit));
|
||||
return obedit;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool BKE_workspace_owner_id_check(
|
||||
const WorkSpace *workspace, const char *owner_id)
|
||||
@ -549,3 +525,4 @@ bool BKE_workspace_owner_id_check(
|
||||
return BLI_findstring(&workspace->owner_ids, owner_id, offsetof(wmOwnerID, name)) != NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4944,7 +4944,8 @@ static void lib_link_object(FileData *fd, Main *main)
|
||||
#else
|
||||
MEM_freeN(ob->pose);
|
||||
#endif
|
||||
ob->pose = NULL;
|
||||
ob->pose= NULL;
|
||||
ob->mode &= ~OB_MODE_POSE;
|
||||
}
|
||||
}
|
||||
for (a=0; a < ob->totcol; a++)
|
||||
@ -5553,6 +5554,19 @@ 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);
|
||||
@ -10500,6 +10514,7 @@ 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);
|
||||
@ -10542,6 +10557,8 @@ 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,6 +1087,8 @@ 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;
|
||||
@ -1118,6 +1120,11 @@ 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)) {
|
||||
|
@ -1042,7 +1042,7 @@ void BM_edges_sharp_from_angle_set(BMesh *bm, const float split_angle)
|
||||
}
|
||||
|
||||
static void UNUSED_FUNCTION(bm_mdisps_space_set)(
|
||||
Object *ob, BMesh *bm, int from, int to, eObjectMode object_mode)
|
||||
Object *ob, BMesh *bm, int from, int to)
|
||||
{
|
||||
/* switch multires data out of tangent space */
|
||||
if (CustomData_has_layer(&bm->ldata, CD_MDISPS)) {
|
||||
@ -1053,7 +1053,7 @@ static void UNUSED_FUNCTION(bm_mdisps_space_set)(
|
||||
BMIter iter;
|
||||
// int i = 0; // UNUSED
|
||||
|
||||
multires_set_space(dm, ob, from, to, object_mode);
|
||||
multires_set_space(dm, ob, from, to);
|
||||
|
||||
mdisps = CustomData_get_layer(&dm->loopData, CD_MDISPS);
|
||||
|
||||
|
@ -403,7 +403,7 @@ void AnimationExporter::export_morph_animation(Object *ob)
|
||||
|
||||
void AnimationExporter::make_anim_frames_from_targets(Object *ob, std::vector<float> &frames )
|
||||
{
|
||||
ListBase *conlist = get_active_constraints(this->eval_ctx, ob);
|
||||
ListBase *conlist = get_active_constraints(ob);
|
||||
if (conlist == NULL) return;
|
||||
bConstraint *con;
|
||||
for (con = (bConstraint *)conlist->first; con; con = con->next) {
|
||||
@ -1006,7 +1006,7 @@ std::string AnimationExporter::create_source_from_fcurve(COLLADASW::InputSemanti
|
||||
void AnimationExporter::evaluate_anim_with_constraints(Object *ob, float ctime)
|
||||
{
|
||||
BKE_animsys_evaluate_animdata(scene, &ob->id, ob->adt, ctime, ADT_RECALC_ALL);
|
||||
ListBase *conlist = get_active_constraints(this->eval_ctx, ob);
|
||||
ListBase *conlist = get_active_constraints(ob);
|
||||
bConstraint *con;
|
||||
for (con = (bConstraint *)conlist->first; con; con = con->next) {
|
||||
ListBase targets = { NULL, NULL };
|
||||
|
@ -227,7 +227,7 @@ void SkinInfo::link_armature(bContext *C, Object *ob, std::map<COLLADAFW::Unique
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
|
||||
ModifierData *md = ED_object_modifier_add(NULL, bmain, scene, ob, OB_MODE_OBJECT, NULL, eModifierType_Armature);
|
||||
ModifierData *md = ED_object_modifier_add(NULL, bmain, scene, ob, NULL, eModifierType_Armature);
|
||||
ArmatureModifierData *amd = (ArmatureModifierData *)md;
|
||||
amd->object = ob_arm;
|
||||
|
||||
|
@ -75,8 +75,6 @@ typedef enum eEvaluationMode {
|
||||
DAG_EVAL_RENDER = 2, /* evaluate for render purposes */
|
||||
} eEvaluationMode;
|
||||
|
||||
#include "DNA_object_enums.h"
|
||||
|
||||
/* Dependency graph evaluation context
|
||||
*
|
||||
* This structure stores all the local dependency graph data,
|
||||
@ -85,7 +83,6 @@ typedef enum eEvaluationMode {
|
||||
typedef struct EvaluationContext {
|
||||
eEvaluationMode mode;
|
||||
float ctime;
|
||||
eObjectMode object_mode;
|
||||
|
||||
struct Depsgraph *depsgraph;
|
||||
struct ViewLayer *view_layer;
|
||||
@ -221,7 +218,6 @@ void DEG_evaluation_context_init_from_scene(
|
||||
struct Scene *scene,
|
||||
struct ViewLayer *view_layer,
|
||||
struct RenderEngineType *engine_type,
|
||||
const eObjectMode object_mode,
|
||||
eEvaluationMode mode);
|
||||
|
||||
void DEG_evaluation_context_init_from_view_layer_for_render(
|
||||
|
@ -84,7 +84,6 @@ void DEG_evaluation_context_init_from_scene(
|
||||
Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
RenderEngineType *engine_type,
|
||||
eObjectMode object_mode,
|
||||
eEvaluationMode mode)
|
||||
{
|
||||
DEG_evaluation_context_init(eval_ctx, mode);
|
||||
@ -92,7 +91,6 @@ void DEG_evaluation_context_init_from_scene(
|
||||
eval_ctx->view_layer = view_layer;
|
||||
eval_ctx->engine_type = engine_type;
|
||||
eval_ctx->ctime = BKE_scene_frame_get(scene);
|
||||
eval_ctx->object_mode = object_mode;
|
||||
}
|
||||
|
||||
void DEG_evaluation_context_init_from_view_layer_for_render(
|
||||
@ -107,7 +105,6 @@ void DEG_evaluation_context_init_from_view_layer_for_render(
|
||||
|
||||
DEG_evaluation_context_init(eval_ctx, DAG_EVAL_RENDER);
|
||||
eval_ctx->ctime = BKE_scene_frame_get(scene);
|
||||
eval_ctx->object_mode = OB_MODE_OBJECT;
|
||||
eval_ctx->depsgraph = depsgraph;
|
||||
eval_ctx->view_layer = view_layer_original;
|
||||
eval_ctx->engine_type = NULL;
|
||||
@ -121,7 +118,6 @@ void DEG_evaluation_context_init_from_depsgraph(
|
||||
Scene *scene = DEG_get_evaluated_scene(depsgraph);
|
||||
DEG_evaluation_context_init(eval_ctx, mode);
|
||||
eval_ctx->ctime = (float)scene->r.cfra + scene->r.subframe;
|
||||
eval_ctx->object_mode = OB_MODE_OBJECT;
|
||||
eval_ctx->depsgraph = depsgraph;
|
||||
eval_ctx->view_layer = DEG_get_evaluated_view_layer(depsgraph);
|
||||
eval_ctx->engine_type = NULL;
|
||||
|
@ -437,9 +437,11 @@ 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:
|
||||
@ -634,6 +636,7 @@ 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
|
||||
|
@ -101,26 +101,26 @@ void DRW_draw_view(const struct bContext *C);
|
||||
void DRW_draw_render_loop_ex(
|
||||
struct Depsgraph *depsgraph,
|
||||
struct RenderEngineType *engine_type,
|
||||
struct ARegion *ar, struct View3D *v3d, const eObjectMode object_mode,
|
||||
struct ARegion *ar, struct View3D *v3d,
|
||||
const struct bContext *evil_C);
|
||||
void DRW_draw_render_loop(
|
||||
struct Depsgraph *depsgraph,
|
||||
struct ARegion *ar, struct View3D *v3d, const eObjectMode object_mode);
|
||||
struct ARegion *ar, struct View3D *v3d);
|
||||
void DRW_draw_render_loop_offscreen(
|
||||
struct Depsgraph *depsgraph,
|
||||
struct RenderEngineType *engine_type,
|
||||
struct ARegion *ar, struct View3D *v3d, const eObjectMode object_mode,
|
||||
struct ARegion *ar, struct View3D *v3d,
|
||||
const bool draw_background,
|
||||
struct GPUOffScreen *ofs,
|
||||
struct GPUViewport *viewport);
|
||||
void DRW_draw_select_loop(
|
||||
struct Depsgraph *depsgraph,
|
||||
struct ARegion *ar, struct View3D *v3d, const eObjectMode object_mode,
|
||||
struct ARegion *ar, struct View3D *v3d,
|
||||
bool use_obedit_skip, bool use_nearest, const struct rcti *rect,
|
||||
DRW_SelectPassFn select_pass_fn, void *select_pass_user_data);
|
||||
void DRW_draw_depth_loop(
|
||||
struct Depsgraph *depsgraph,
|
||||
struct ARegion *ar, struct View3D *v3d, const eObjectMode object_mode);
|
||||
struct ARegion *ar, struct View3D *v3d);
|
||||
|
||||
/* This is here because GPUViewport needs it */
|
||||
void DRW_pass_free(struct DRWPass *pass);
|
||||
|
@ -358,13 +358,19 @@ static void drw_state_eval_ctx_init(DRWManager *dst)
|
||||
draw_ctx->scene,
|
||||
draw_ctx->view_layer,
|
||||
draw_ctx->engine_type,
|
||||
draw_ctx->object_mode,
|
||||
DST.options.is_scene_render ? DAG_EVAL_RENDER : DAG_EVAL_VIEWPORT);
|
||||
}
|
||||
|
||||
/* Not a viewport variable, we could split this out. */
|
||||
static void drw_context_state_init(void)
|
||||
{
|
||||
if (DST.draw_ctx.obact) {
|
||||
DST.draw_ctx.object_mode = DST.draw_ctx.obact->mode;
|
||||
}
|
||||
else {
|
||||
DST.draw_ctx.object_mode = OB_MODE_OBJECT;
|
||||
}
|
||||
|
||||
/* Edit object. */
|
||||
if (DST.draw_ctx.object_mode & OB_MODE_EDIT) {
|
||||
DST.draw_ctx.object_edit = DST.draw_ctx.obact;
|
||||
@ -1125,7 +1131,7 @@ void DRW_draw_view(const bContext *C)
|
||||
|
||||
/* Reset before using it. */
|
||||
drw_state_prepare_clean_for_draw(&DST);
|
||||
DRW_draw_render_loop_ex(eval_ctx.depsgraph, engine_type, ar, v3d, eval_ctx.object_mode, C);
|
||||
DRW_draw_render_loop_ex(eval_ctx.depsgraph, engine_type, ar, v3d, C);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1135,7 +1141,7 @@ void DRW_draw_view(const bContext *C)
|
||||
void DRW_draw_render_loop_ex(
|
||||
struct Depsgraph *depsgraph,
|
||||
RenderEngineType *engine_type,
|
||||
ARegion *ar, View3D *v3d, const eObjectMode object_mode,
|
||||
ARegion *ar, View3D *v3d,
|
||||
const bContext *evil_C)
|
||||
{
|
||||
|
||||
@ -1155,7 +1161,7 @@ void DRW_draw_render_loop_ex(
|
||||
.ar = ar, .rv3d = rv3d, .v3d = v3d,
|
||||
.scene = scene, .view_layer = view_layer, .obact = OBACT(view_layer),
|
||||
.engine_type = engine_type,
|
||||
.depsgraph = depsgraph, .object_mode = object_mode,
|
||||
.depsgraph = depsgraph,
|
||||
|
||||
/* reuse if caller sets */
|
||||
.evil_C = DST.draw_ctx.evil_C,
|
||||
@ -1280,7 +1286,7 @@ void DRW_draw_render_loop_ex(
|
||||
|
||||
void DRW_draw_render_loop(
|
||||
struct Depsgraph *depsgraph,
|
||||
ARegion *ar, View3D *v3d, const eObjectMode object_mode)
|
||||
ARegion *ar, View3D *v3d)
|
||||
{
|
||||
/* Reset before using it. */
|
||||
drw_state_prepare_clean_for_draw(&DST);
|
||||
@ -1288,13 +1294,13 @@ void DRW_draw_render_loop(
|
||||
Scene *scene = DEG_get_evaluated_scene(depsgraph);
|
||||
RenderEngineType *engine_type = RE_engines_find(scene->view_render.engine_id);
|
||||
|
||||
DRW_draw_render_loop_ex(depsgraph, engine_type, ar, v3d, object_mode, NULL);
|
||||
DRW_draw_render_loop_ex(depsgraph, engine_type, ar, v3d, NULL);
|
||||
}
|
||||
|
||||
/* @viewport CAN be NULL, in this case we create one. */
|
||||
void DRW_draw_render_loop_offscreen(
|
||||
struct Depsgraph *depsgraph, RenderEngineType *engine_type,
|
||||
ARegion *ar, View3D *v3d, const eObjectMode object_mode,
|
||||
ARegion *ar, View3D *v3d,
|
||||
const bool draw_background, GPUOffScreen *ofs,
|
||||
GPUViewport *viewport)
|
||||
{
|
||||
@ -1318,7 +1324,7 @@ void DRW_draw_render_loop_offscreen(
|
||||
drw_state_prepare_clean_for_draw(&DST);
|
||||
DST.options.is_image_render = true;
|
||||
DST.options.draw_background = draw_background;
|
||||
DRW_draw_render_loop_ex(depsgraph, engine_type, ar, v3d, object_mode, NULL);
|
||||
DRW_draw_render_loop_ex(depsgraph, engine_type, ar, v3d, NULL);
|
||||
|
||||
/* restore */
|
||||
{
|
||||
@ -1476,7 +1482,7 @@ void DRW_render_instance_buffer_finish(void)
|
||||
*/
|
||||
void DRW_draw_select_loop(
|
||||
struct Depsgraph *depsgraph,
|
||||
ARegion *ar, View3D *v3d, const eObjectMode object_mode,
|
||||
ARegion *ar, View3D *v3d,
|
||||
bool UNUSED(use_obedit_skip), bool UNUSED(use_nearest), const rcti *rect,
|
||||
DRW_SelectPassFn select_pass_fn, void *select_pass_user_data)
|
||||
{
|
||||
@ -1484,6 +1490,7 @@ void DRW_draw_select_loop(
|
||||
RenderEngineType *engine_type = RE_engines_find(scene->view_render.engine_id);
|
||||
ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph);
|
||||
Object *obact = OBACT(view_layer);
|
||||
Object *obedit = OBEDIT_FROM_OBACT(obact);
|
||||
#ifndef USE_GPU_SELECT
|
||||
UNUSED_VARS(vc, scene, view_layer, v3d, ar, rect);
|
||||
#else
|
||||
@ -1498,12 +1505,12 @@ void DRW_draw_select_loop(
|
||||
|
||||
bool use_obedit = false;
|
||||
int obedit_mode = 0;
|
||||
if (object_mode & OB_MODE_EDIT) {
|
||||
if (obact->type == OB_MBALL) {
|
||||
if (obedit != NULL) {
|
||||
if (obedit->type == OB_MBALL) {
|
||||
use_obedit = true;
|
||||
obedit_mode = CTX_MODE_EDIT_METABALL;
|
||||
}
|
||||
else if (obact->type == OB_ARMATURE) {
|
||||
else if (obedit->type == OB_ARMATURE) {
|
||||
use_obedit = true;
|
||||
obedit_mode = CTX_MODE_EDIT_ARMATURE;
|
||||
}
|
||||
@ -1533,7 +1540,7 @@ void DRW_draw_select_loop(
|
||||
.ar = ar, .rv3d = rv3d, .v3d = v3d,
|
||||
.scene = scene, .view_layer = view_layer, .obact = obact,
|
||||
.engine_type = engine_type,
|
||||
.depsgraph = depsgraph, .object_mode = object_mode,
|
||||
.depsgraph = depsgraph,
|
||||
};
|
||||
drw_context_state_init();
|
||||
drw_viewport_var_init();
|
||||
@ -1662,7 +1669,7 @@ static void draw_depth_texture_to_screen(GPUTexture *texture)
|
||||
*/
|
||||
void DRW_draw_depth_loop(
|
||||
Depsgraph *depsgraph,
|
||||
ARegion *ar, View3D *v3d, const eObjectMode object_mode)
|
||||
ARegion *ar, View3D *v3d)
|
||||
{
|
||||
Scene *scene = DEG_get_evaluated_scene(depsgraph);
|
||||
RenderEngineType *engine_type = RE_engines_find(scene->view_render.engine_id);
|
||||
@ -1706,7 +1713,7 @@ void DRW_draw_depth_loop(
|
||||
.ar = ar, .rv3d = rv3d, .v3d = v3d,
|
||||
.scene = scene, .view_layer = view_layer, .obact = OBACT(view_layer),
|
||||
.engine_type = engine_type,
|
||||
.depsgraph = depsgraph, .object_mode = object_mode,
|
||||
.depsgraph = depsgraph,
|
||||
};
|
||||
drw_context_state_init();
|
||||
drw_viewport_var_init();
|
||||
|
@ -625,7 +625,7 @@ static bool is_cursor_visible(const DRWContextState *draw_ctx, Scene *scene, Vie
|
||||
}
|
||||
/* exception: object in texture paint mode, clone brush, use_clone_layer disabled */
|
||||
else if (draw_ctx->object_mode & OB_MODE_TEXTURE_PAINT) {
|
||||
const Paint *p = BKE_paint_get_active(scene, view_layer, draw_ctx->object_mode);
|
||||
const Paint *p = BKE_paint_get_active(scene, view_layer);
|
||||
|
||||
if (p && p->brush && p->brush->imagepaint_tool == PAINT_TOOL_CLONE) {
|
||||
if ((scene->toolsettings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_CLONE) == 0) {
|
||||
|
@ -1579,9 +1579,6 @@ void ANIM_OT_keyframe_delete(wmOperatorType *ot)
|
||||
|
||||
static int clear_anim_v3d_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
bool changed = false;
|
||||
|
||||
CTX_DATA_BEGIN (C, Object *, ob, selected_objects)
|
||||
@ -1598,7 +1595,7 @@ static int clear_anim_v3d_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
fcn = fcu->next;
|
||||
|
||||
/* in pose mode, only delete the F-Curve if it belongs to a selected bone */
|
||||
if (eval_ctx.object_mode & OB_MODE_POSE) {
|
||||
if (ob->mode & OB_MODE_POSE) {
|
||||
if ((fcu->rna_path) && strstr(fcu->rna_path, "pose.bones[")) {
|
||||
bPoseChannel *pchan;
|
||||
char *bone_name;
|
||||
@ -1661,10 +1658,8 @@ void ANIM_OT_keyframe_clear_v3d(wmOperatorType *ot)
|
||||
|
||||
static int delete_key_v3d_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
const float cfra = eval_ctx.ctime;
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
float cfra = (float)CFRA;
|
||||
|
||||
CTX_DATA_BEGIN (C, Object *, ob, selected_objects)
|
||||
{
|
||||
@ -1692,7 +1687,7 @@ static int delete_key_v3d_exec(bContext *C, wmOperator *op)
|
||||
/* special exception for bones, as this makes this operator more convenient to use
|
||||
* NOTE: This is only done in pose mode. In object mode, we're dealign with the entire object.
|
||||
*/
|
||||
if ((eval_ctx.object_mode & OB_MODE_POSE) && strstr(fcu->rna_path, "pose.bones[\"")) {
|
||||
if ((ob->mode & OB_MODE_POSE) && strstr(fcu->rna_path, "pose.bones[\"")) {
|
||||
bPoseChannel *pchan;
|
||||
char *bone_name;
|
||||
|
||||
|
@ -281,6 +281,7 @@ 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)
|
||||
{
|
||||
@ -301,6 +302,8 @@ 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);
|
||||
@ -605,6 +608,8 @@ 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);
|
||||
|
@ -192,7 +192,6 @@ static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap)
|
||||
}
|
||||
|
||||
static void envelope_bone_weighting(
|
||||
const EvaluationContext *eval_ctx,
|
||||
Object *ob, Mesh *mesh, float (*verts)[3], int numbones, Bone **bonelist,
|
||||
bDeformGroup **dgrouplist, bDeformGroup **dgroupflip,
|
||||
float (*root)[3], float (*tip)[3], const int *selected, float scale)
|
||||
@ -206,7 +205,7 @@ static void envelope_bone_weighting(
|
||||
bool use_topology = (mesh->editflag & ME_EDIT_MIRROR_TOPO) != 0;
|
||||
bool use_mask = false;
|
||||
|
||||
if ((eval_ctx->object_mode & OB_MODE_WEIGHT_PAINT) &&
|
||||
if ((ob->mode & OB_MODE_WEIGHT_PAINT) &&
|
||||
(mesh->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)))
|
||||
{
|
||||
use_mask = true;
|
||||
@ -277,12 +276,13 @@ static void add_verts_to_dgroups(
|
||||
float (*root)[3], (*tip)[3], (*verts)[3];
|
||||
int *selected;
|
||||
int numbones, vertsfilled = 0, i, j, segments = 0;
|
||||
const bool wpmode = (ob->mode & OB_MODE_WEIGHT_PAINT);
|
||||
struct { Object *armob; void *list; int heat; bool is_weight_paint; } looper_data;
|
||||
|
||||
looper_data.armob = par;
|
||||
looper_data.heat = heat;
|
||||
looper_data.list = NULL;
|
||||
looper_data.is_weight_paint = (eval_ctx->object_mode & OB_MODE_WEIGHT_PAINT);
|
||||
looper_data.is_weight_paint = wpmode;
|
||||
|
||||
/* count the number of skinnable bones */
|
||||
numbones = bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable_cb);
|
||||
@ -355,7 +355,7 @@ static void add_verts_to_dgroups(
|
||||
mul_m4_v3(par->obmat, tip[j]);
|
||||
|
||||
/* set selected */
|
||||
if (eval_ctx->object_mode & OB_MODE_WEIGHT_PAINT) {
|
||||
if (wpmode) {
|
||||
if ((arm->layer & bone->layer) && (bone->flag & BONE_SELECTED))
|
||||
selected[j] = 1;
|
||||
}
|
||||
@ -375,7 +375,7 @@ static void add_verts_to_dgroups(
|
||||
mesh = (Mesh *)ob->data;
|
||||
verts = MEM_callocN(mesh->totvert * sizeof(*verts), "closestboneverts");
|
||||
|
||||
if (eval_ctx->object_mode & OB_MODE_WEIGHT_PAINT) {
|
||||
if (wpmode) {
|
||||
/* if in weight paint mode, use final verts from derivedmesh */
|
||||
DerivedMesh *dm = mesh_get_derived_final(eval_ctx, scene, ob, CD_MASK_BAREMESH);
|
||||
|
||||
@ -406,7 +406,7 @@ static void add_verts_to_dgroups(
|
||||
const char *error = NULL;
|
||||
|
||||
heat_bone_weighting(
|
||||
eval_ctx, ob, mesh, verts, numbones, dgrouplist, dgroupflip,
|
||||
ob, mesh, verts, numbones, dgrouplist, dgroupflip,
|
||||
root, tip, selected, &error);
|
||||
if (error) {
|
||||
BKE_report(reports, RPT_WARNING, error);
|
||||
@ -414,7 +414,7 @@ static void add_verts_to_dgroups(
|
||||
}
|
||||
else {
|
||||
envelope_bone_weighting(
|
||||
eval_ctx, ob, mesh, verts, numbones, bonelist, dgrouplist,
|
||||
ob, mesh, verts, numbones, bonelist, dgrouplist,
|
||||
dgroupflip, root, tip, selected, mat4_to_scale(par->obmat));
|
||||
}
|
||||
|
||||
|
@ -603,7 +603,6 @@ static float heat_limit_weight(float weight)
|
||||
}
|
||||
|
||||
void heat_bone_weighting(
|
||||
const EvaluationContext *eval_ctx,
|
||||
Object *ob, Mesh *me, float (*verts)[3], int numsource,
|
||||
bDeformGroup **dgrouplist, bDeformGroup **dgroupflip,
|
||||
float (*root)[3], float (*tip)[3], int *selected, const char **err_str)
|
||||
@ -627,7 +626,7 @@ void heat_bone_weighting(
|
||||
tottri = poly_to_tri_count(me->totpoly, me->totloop);
|
||||
|
||||
/* count triangles and create mask */
|
||||
if (eval_ctx->object_mode & OB_MODE_WEIGHT_PAINT &&
|
||||
if (ob->mode & OB_MODE_WEIGHT_PAINT &&
|
||||
(use_face_sel || use_vert_sel))
|
||||
{
|
||||
mask = MEM_callocN(sizeof(int) * me->totvert, "heat_bone_weighting mask");
|
||||
|
@ -53,7 +53,6 @@ float laplacian_system_get_solution(LaplacianSystem *sys, int v);
|
||||
/* Heat Weighting */
|
||||
|
||||
void heat_bone_weighting(
|
||||
const struct EvaluationContext *eval_ctx,
|
||||
struct Object *ob, struct Mesh *me, float (*verts)[3],
|
||||
int numbones, struct bDeformGroup **dgrouplist,
|
||||
struct bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3],
|
||||
|
@ -94,16 +94,13 @@ void ED_armature_enter_posemode(bContext *C, Base *base)
|
||||
|
||||
switch (ob->type) {
|
||||
case OB_ARMATURE:
|
||||
{
|
||||
WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
workspace->object_mode_restore = workspace->object_mode;
|
||||
workspace->object_mode |= OB_MODE_POSE;
|
||||
ob->restore_mode = ob->mode;
|
||||
ob->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;
|
||||
}
|
||||
@ -115,11 +112,10 @@ 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;
|
||||
|
||||
workspace->object_mode_restore = workspace->object_mode;
|
||||
workspace->object_mode &= ~OB_MODE_POSE;
|
||||
ob->restore_mode = ob->mode;
|
||||
ob->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);
|
||||
|
@ -134,7 +134,6 @@ void ED_pose_bone_select(Object *ob, bPoseChannel *pchan, bool select)
|
||||
/* called from editview.c, for mode-less pose selection */
|
||||
/* assumes scene obact and basact is still on old situation */
|
||||
bool ED_do_pose_selectbuffer(
|
||||
const EvaluationContext *eval_ctx,
|
||||
ViewLayer *view_layer, Base *base, const unsigned int *buffer, short hits,
|
||||
bool extend, bool deselect, bool toggle, bool do_nearest)
|
||||
{
|
||||
@ -144,7 +143,7 @@ bool ED_do_pose_selectbuffer(
|
||||
if (!ob || !ob->pose) return 0;
|
||||
|
||||
Object *ob_act = OBACT(view_layer);
|
||||
Object *obedit = OBEDIT_FROM_EVAL_CTX(eval_ctx);
|
||||
Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
|
||||
|
||||
nearBone = get_bone_from_selectbuffer(base, obedit, buffer, hits, 1, do_nearest);
|
||||
|
||||
@ -157,7 +156,7 @@ bool ED_do_pose_selectbuffer(
|
||||
* note, special exception for armature mode so we can do multi-select
|
||||
* we could check for multi-select explicitly but think its fine to
|
||||
* always give predictable behavior in weight paint mode - campbell */
|
||||
if ((ob_act == NULL) || ((ob_act != ob) && (eval_ctx->object_mode & OB_MODE_WEIGHT_PAINT) == 0)) {
|
||||
if ((ob_act == NULL) || ((ob_act != ob) && (ob_act->mode & OB_MODE_WEIGHT_PAINT) == 0)) {
|
||||
/* when we are entering into posemode via toggle-select,
|
||||
* from another active object - always select the bone. */
|
||||
if (!extend && !deselect && toggle) {
|
||||
@ -198,7 +197,7 @@ bool ED_do_pose_selectbuffer(
|
||||
|
||||
if (ob_act) {
|
||||
/* in weightpaint we select the associated vertex group too */
|
||||
if (eval_ctx->object_mode & OB_MODE_WEIGHT_PAINT) {
|
||||
if (ob_act->mode & OB_MODE_WEIGHT_PAINT) {
|
||||
if (nearBone == arm->act_bone) {
|
||||
ED_vgroup_select_by_name(ob_act, nearBone->name);
|
||||
DEG_id_tag_update(&ob_act->id, OB_RECALC_DATA);
|
||||
@ -876,7 +875,6 @@ void POSE_OT_select_grouped(wmOperatorType *ot)
|
||||
*/
|
||||
static int pose_select_mirror_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob_act = CTX_data_active_object(C);
|
||||
Object *ob = BKE_object_pose_armature_get(ob_act);
|
||||
bArmature *arm;
|
||||
@ -884,6 +882,10 @@ static int pose_select_mirror_exec(bContext *C, wmOperator *op)
|
||||
const bool active_only = RNA_boolean_get(op->ptr, "only_active");
|
||||
const bool extend = RNA_boolean_get(op->ptr, "extend");
|
||||
|
||||
if ((ob && (ob->mode & OB_MODE_POSE)) == 0) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
arm = ob->data;
|
||||
|
||||
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
|
||||
@ -920,7 +922,7 @@ static int pose_select_mirror_exec(bContext *C, wmOperator *op)
|
||||
arm->act_bone = pchan_mirror_act->bone;
|
||||
|
||||
/* in weightpaint we select the associated vertex group too */
|
||||
if (workspace->object_mode & OB_MODE_WEIGHT_PAINT) {
|
||||
if (ob_act->mode & OB_MODE_WEIGHT_PAINT) {
|
||||
ED_vgroup_select_by_name(ob_act, pchan_mirror_act->name);
|
||||
DEG_id_tag_update(&ob_act->id, OB_RECALC_DATA);
|
||||
}
|
||||
|
@ -1294,7 +1294,7 @@ static int gp_convert_poll(bContext *C)
|
||||
bGPDframe *gpf = NULL;
|
||||
ScrArea *sa = CTX_wm_area(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
|
||||
/* only if the current view is 3D View, if there's valid data (i.e. at least one stroke!),
|
||||
* and if we are not in edit mode!
|
||||
@ -1303,7 +1303,7 @@ static int gp_convert_poll(bContext *C)
|
||||
(gpl = BKE_gpencil_layer_getactive(gpd)) &&
|
||||
(gpf = BKE_gpencil_layer_getframe(gpl, CFRA, 0)) &&
|
||||
(gpf->strokes.first) &&
|
||||
((workspace->object_mode & OB_MODE_EDIT) == 0));
|
||||
(OBEDIT_FROM_VIEW_LAYER(view_layer) == NULL));
|
||||
}
|
||||
|
||||
static int gp_convert_layer_exec(bContext *C, wmOperator *op)
|
||||
|
@ -143,7 +143,6 @@ void ED_armature_deselect_all(struct Object *obedit);
|
||||
void ED_armature_deselect_all_visible(struct Object *obedit);
|
||||
|
||||
bool ED_do_pose_selectbuffer(
|
||||
const struct EvaluationContext *eval_ctx,
|
||||
struct ViewLayer *view_layer, struct Base *base, const unsigned int *buffer, short hits,
|
||||
bool extend, bool deselect, bool toggle, bool do_nearest);
|
||||
bool ED_armature_select_pick(struct bContext *C, const int mval[2], bool extend, bool deselect, bool toggle);
|
||||
@ -190,8 +189,6 @@ void unique_editbone_name(struct ListBase *ebones, char *name, EditBone *bone);
|
||||
void ED_armature_bone_rename(struct bArmature *arm, const char *oldnamep, const char *newnamep);
|
||||
void ED_armature_bones_flip_names(struct bArmature *arm, struct ListBase *bones_names, const bool do_strip_numbers);
|
||||
|
||||
void undo_push_armature(struct bContext *C, const char *name);
|
||||
|
||||
/* low level selection functions which handle */
|
||||
int ED_armature_ebone_selectflag_get(const EditBone *ebone);
|
||||
void ED_armature_ebone_selectflag_set(EditBone *ebone, int flag);
|
||||
|
@ -40,7 +40,6 @@ struct wmWindowManager;
|
||||
struct ARegion;
|
||||
struct Scene;
|
||||
struct ViewLayer;
|
||||
struct WorkSpace;
|
||||
|
||||
/* image_edit.c, exported for transform */
|
||||
struct Image *ED_space_image(struct SpaceImage *sima);
|
||||
@ -76,10 +75,7 @@ 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,
|
||||
const struct WorkSpace *workspace,
|
||||
struct ViewLayer *view_layer);
|
||||
bool ED_space_image_check_show_maskedit(struct SpaceImage *sima, struct ViewLayer *view_layer);
|
||||
int ED_space_image_maskedit_poll(struct bContext *C);
|
||||
int ED_space_image_maskedit_mask_poll(struct bContext *C);
|
||||
|
||||
|
@ -27,11 +27,8 @@
|
||||
#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 WorkSpace *workspace, struct ViewLayer *view_layer);
|
||||
const char *ED_info_stats_string(struct Scene *scene, struct ViewLayer *view_layer);
|
||||
|
||||
#endif /* __ED_INFO_H__ */
|
||||
|
@ -36,7 +36,6 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
struct ID;
|
||||
struct EvaluationContext;
|
||||
struct View3D;
|
||||
struct ARegion;
|
||||
struct bContext;
|
||||
@ -267,7 +266,6 @@ void ED_vgroup_vert_remove(struct Object *ob, struct bDeformGrou
|
||||
float ED_vgroup_vert_weight(struct Object *ob, struct bDeformGroup *dg, int vertnum);
|
||||
void ED_vgroup_vert_active_mirror(struct Object *ob, int def_nr);
|
||||
|
||||
|
||||
/* mesh_data.c */
|
||||
// void ED_mesh_geometry_add(struct Mesh *mesh, struct ReportList *reports, int verts, int edges, int faces);
|
||||
void ED_mesh_polys_add(struct Mesh *mesh, struct ReportList *reports, int count);
|
||||
|
@ -52,13 +52,12 @@ struct wmKeyConfig;
|
||||
struct wmKeyMap;
|
||||
struct wmOperator;
|
||||
struct wmOperatorType;
|
||||
struct wmWindow;
|
||||
struct wmWindowManager;
|
||||
struct PointerRNA;
|
||||
struct PropertyRNA;
|
||||
struct EnumPropertyItem;
|
||||
struct EvaluationContext;
|
||||
struct WorkSpace;
|
||||
struct wmWindow;
|
||||
struct wmWindowManager;
|
||||
|
||||
#include "DNA_object_enums.h"
|
||||
|
||||
@ -126,7 +125,7 @@ void ED_object_parent(struct Object *ob, struct Object *parent, const int type,
|
||||
#define EM_DO_UNDO 8
|
||||
#define EM_IGNORE_LAYER 16
|
||||
void ED_object_editmode_exit_ex(
|
||||
struct bContext *C, struct WorkSpace *workspace, struct Scene *scene, struct Object *obedit, int flag);
|
||||
struct bContext *C, struct Scene *scene, struct Object *obedit, int flag);
|
||||
void ED_object_editmode_exit(struct bContext *C, int flag);
|
||||
void ED_object_editmode_enter(struct bContext *C, int flag);
|
||||
bool ED_object_editmode_load(struct Object *obedit);
|
||||
@ -136,26 +135,26 @@ bool ED_object_editmode_calc_active_center(struct Object *obedit, const bool sel
|
||||
|
||||
void ED_object_vpaintmode_enter_ex(
|
||||
const struct EvaluationContext *eval_ctx, struct wmWindowManager *wm,
|
||||
struct WorkSpace *workspace, struct Scene *scene, struct Object *ob);
|
||||
struct Scene *scene, struct Object *ob);
|
||||
void ED_object_vpaintmode_enter(struct bContext *C);
|
||||
void ED_object_wpaintmode_enter_ex(
|
||||
const struct EvaluationContext *eval_ctx, struct wmWindowManager *wm,
|
||||
struct WorkSpace *workspace, struct Scene *scene, struct Object *ob);
|
||||
struct Scene *scene, struct Object *ob);
|
||||
void ED_object_wpaintmode_enter(struct bContext *C);
|
||||
|
||||
void ED_object_vpaintmode_exit_ex(struct WorkSpace *workspace, struct Object *ob);
|
||||
void ED_object_vpaintmode_exit_ex(struct Object *ob);
|
||||
void ED_object_vpaintmode_exit(struct bContext *C);
|
||||
void ED_object_wpaintmode_exit_ex(struct WorkSpace *workspace, struct Object *ob);
|
||||
void ED_object_wpaintmode_exit_ex(struct Object *ob);
|
||||
void ED_object_wpaintmode_exit(struct bContext *C);
|
||||
|
||||
void ED_object_sculptmode_enter_ex(
|
||||
const struct EvaluationContext *eval_ctx,
|
||||
struct WorkSpace *workspace, struct Scene *scene, struct Object *ob,
|
||||
struct Scene *scene, struct Object *ob,
|
||||
struct ReportList *reports);
|
||||
void ED_object_sculptmode_enter(struct bContext *C, struct ReportList *reports);
|
||||
void ED_object_sculptmode_exit_ex(
|
||||
const struct EvaluationContext *eval_ctx,
|
||||
struct WorkSpace *workspace, struct Scene *scene, struct Object *ob);
|
||||
struct Scene *scene, struct Object *ob);
|
||||
void ED_object_sculptmode_exit(struct bContext *C);
|
||||
|
||||
void ED_object_location_from_view(struct bContext *C, float loc[3]);
|
||||
@ -190,9 +189,9 @@ void ED_objects_clear_paths(struct bContext *C, bool only_selected);
|
||||
void ED_objects_recalculate_paths(struct bContext *C, struct Scene *scene);
|
||||
|
||||
/* constraints */
|
||||
struct ListBase *get_active_constraints(const struct EvaluationContext *eval_ctx, struct Object *ob);
|
||||
struct ListBase *get_active_constraints(struct Object *ob);
|
||||
struct ListBase *get_constraint_lb(struct Object *ob, struct bConstraint *con, struct bPoseChannel **r_pchan);
|
||||
struct bConstraint *get_active_constraint(const struct EvaluationContext *eval_ctx, struct Object *ob);
|
||||
struct bConstraint *get_active_constraint(struct Object *ob);
|
||||
|
||||
void object_test_constraints(struct Object *ob);
|
||||
|
||||
@ -205,7 +204,7 @@ void ED_object_constraint_dependency_tag_update(struct Main *bmain, struct Objec
|
||||
|
||||
/* object_modes.c */
|
||||
bool ED_object_mode_compat_test(const struct Object *ob, eObjectMode mode);
|
||||
bool ED_object_mode_compat_set(struct bContext *C, struct WorkSpace *workspace, eObjectMode mode, struct ReportList *reports);
|
||||
bool ED_object_mode_compat_set(struct bContext *C, struct Object *ob, eObjectMode mode, struct ReportList *reports);
|
||||
void ED_object_mode_toggle(struct bContext *C, eObjectMode mode);
|
||||
void ED_object_mode_set(struct bContext *C, eObjectMode mode);
|
||||
|
||||
@ -214,18 +213,11 @@ bool ED_object_mode_generic_enter(
|
||||
eObjectMode object_mode);
|
||||
void ED_object_mode_generic_exit(
|
||||
const struct EvaluationContext *eval_ctx,
|
||||
struct WorkSpace *workspace, struct Scene *scene, struct Object *ob);
|
||||
struct Scene *scene, struct Object *ob);
|
||||
bool ED_object_mode_generic_has_data(
|
||||
const struct EvaluationContext *eval_ctx,
|
||||
struct Object *ob);
|
||||
|
||||
bool ED_object_mode_generic_enter_or_other_window(
|
||||
struct bContext *C, const struct wmWindow *win_compare,
|
||||
eObjectMode object_mode);
|
||||
void ED_object_mode_generic_exit_or_other_window(
|
||||
const struct EvaluationContext *eval_ctx, struct wmWindowManager *wm,
|
||||
struct WorkSpace *workspace, struct Scene *scene, struct Object *ob);
|
||||
|
||||
bool ED_object_mode_generic_exists(
|
||||
struct wmWindowManager *wm, struct Object *ob,
|
||||
eObjectMode object_mode);
|
||||
@ -236,30 +228,25 @@ enum {
|
||||
MODIFIER_APPLY_SHAPE
|
||||
};
|
||||
|
||||
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);
|
||||
struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene,
|
||||
struct Object *ob, 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, eObjectMode object_mode, struct ModifierData *md);
|
||||
int ED_object_modifier_apply(struct ReportList *reports, const struct bContext *C, struct Scene *scene,
|
||||
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_apply(struct ReportList *reports, const struct EvaluationContext *eval_ctx, 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);
|
||||
|
||||
bool ED_object_iter_other(
|
||||
const struct EvaluationContext *eval_ctx, struct Main *bmain,
|
||||
struct Object *orig_ob, const bool include_orig,
|
||||
bool (*callback)(const struct EvaluationContext *eval_ctx, struct Object *ob, void *callback_data),
|
||||
struct Main *bmain, struct Object *orig_ob, const bool include_orig,
|
||||
bool (*callback)(struct Object *ob, void *callback_data),
|
||||
void *callback_data);
|
||||
|
||||
bool ED_object_multires_update_totlevels_cb(
|
||||
const struct EvaluationContext *eval_ctx,
|
||||
struct Object *ob, void *totlevel_v);
|
||||
bool ED_object_multires_update_totlevels_cb(struct Object *ob, void *totlevel_v);
|
||||
|
||||
/* object_select.c */
|
||||
void ED_object_select_linked_by_id(struct bContext *C, struct ID *id);
|
||||
@ -271,9 +258,7 @@ 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, eObjectMode object_mode);
|
||||
void ED_object_check_force_modifiers(struct Main *bmain, struct Scene *scene, struct Object *object);
|
||||
|
||||
/* object_facemap_ops.c */
|
||||
void ED_object_facemap_face_add(struct Object *ob, struct bFaceMap *fmap, int facenum);
|
||||
|
@ -162,7 +162,7 @@ struct WorkSpace *ED_workspace_add(
|
||||
bool ED_workspace_change(
|
||||
struct WorkSpace *workspace_new,
|
||||
struct bContext *C,
|
||||
struct wmWindow *win) ATTR_NONNULL();
|
||||
struct wmWindowManager *wm, struct wmWindow *win) ATTR_NONNULL();
|
||||
struct WorkSpace *ED_workspace_duplicate(
|
||||
struct WorkSpace *workspace_old,
|
||||
struct Main *bmain, struct wmWindow *win);
|
||||
@ -194,10 +194,6 @@ void ED_workspace_object_mode_sync_from_object(
|
||||
void ED_workspace_object_mode_sync_from_scene(
|
||||
struct wmWindowManager *wm, WorkSpace *workspace, struct Scene *scene);
|
||||
|
||||
bool ED_workspace_object_mode_in_other_window(
|
||||
struct wmWindowManager *wm, const struct wmWindow *win_compare, struct Object *obact,
|
||||
eObjectMode *r_object_mode);
|
||||
|
||||
/* anim */
|
||||
void ED_update_for_newframe(struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer, struct Depsgraph *depsgraph);
|
||||
|
||||
|
@ -131,7 +131,7 @@ void ED_unwrap_lscm(struct Scene *scene, struct Object *obedit, const short sel)
|
||||
void ED_image_draw_cursor(
|
||||
struct ARegion *ar, const float cursor[2]);
|
||||
void ED_uvedit_draw_main(
|
||||
struct SpaceImage *sima, const struct EvaluationContext *eval_ctx,
|
||||
struct SpaceImage *sima,
|
||||
struct ARegion *ar, struct Scene *scene, struct ViewLayer *view_layer,
|
||||
struct Object *obedit, struct Object *obact, struct Depsgraph *depsgraph);
|
||||
|
||||
|
@ -46,7 +46,6 @@
|
||||
#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"
|
||||
@ -74,8 +73,6 @@
|
||||
#include "BKE_unit.h"
|
||||
#include "BKE_paint.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "ED_screen.h"
|
||||
#include "ED_undo.h"
|
||||
#include "ED_keyframing.h"
|
||||
@ -5234,10 +5231,9 @@ static int ui_do_but_COLOR(
|
||||
if ((int)(but->a1) == UI_PALETTE_COLOR) {
|
||||
if (!event->ctrl) {
|
||||
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, workspace->object_mode);
|
||||
Paint *paint = BKE_paint_get_active(scene, view_layer);
|
||||
Brush *brush = BKE_paint_brush(paint);
|
||||
|
||||
if (brush->flag & BRUSH_USE_GRADIENT) {
|
||||
@ -6153,7 +6149,6 @@ 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);
|
||||
|
||||
@ -6270,7 +6265,6 @@ 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;
|
||||
@ -6285,7 +6279,7 @@ static int ui_do_but_CURVE(
|
||||
}
|
||||
else {
|
||||
curvemapping_changed(cumap, true); /* remove doubles */
|
||||
BKE_paint_invalidate_cursor_overlay(scene, view_layer, cumap, workspace->object_mode);
|
||||
BKE_paint_invalidate_cursor_overlay(scene, view_layer, cumap);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1289,7 +1289,6 @@ static int ui_id_brush_get_icon(const bContext *C, ID *id)
|
||||
ui_id_icon_render(C, id, true);
|
||||
}
|
||||
else {
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = CTX_data_active_object(C);
|
||||
SpaceImage *sima;
|
||||
const EnumPropertyItem *items = NULL;
|
||||
@ -1300,11 +1299,11 @@ static int ui_id_brush_get_icon(const bContext *C, ID *id)
|
||||
* checking various context stuff here */
|
||||
|
||||
if (CTX_wm_view3d(C) && ob) {
|
||||
if (workspace->object_mode & OB_MODE_SCULPT)
|
||||
if (ob->mode & OB_MODE_SCULPT)
|
||||
mode = OB_MODE_SCULPT;
|
||||
else if (workspace->object_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT))
|
||||
else if (ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT))
|
||||
mode = OB_MODE_VERTEX_PAINT;
|
||||
else if (workspace->object_mode & OB_MODE_TEXTURE_PAINT)
|
||||
else if (ob->mode & OB_MODE_TEXTURE_PAINT)
|
||||
mode = OB_MODE_TEXTURE_PAINT;
|
||||
}
|
||||
else if ((sima = CTX_wm_space_image(C)) &&
|
||||
|
@ -575,9 +575,6 @@ static void template_ID(
|
||||
bContext *C, uiLayout *layout, TemplateID *template_ui, StructRNA *type, int flag,
|
||||
const char *newop, const char *openop, const char *unlinkop)
|
||||
{
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
uiBut *but;
|
||||
uiBlock *block;
|
||||
PointerRNA idptr;
|
||||
@ -662,7 +659,7 @@ static void template_ID(
|
||||
(idfrom && idfrom->lib) ||
|
||||
(!editable) ||
|
||||
/* object in editmode - don't change data */
|
||||
(idfrom && GS(idfrom->name) == ID_OB && (eval_ctx.object_mode & OB_MODE_EDIT)))
|
||||
(idfrom && GS(idfrom->name) == ID_OB && (((Object *)idfrom)->mode & OB_MODE_EDIT)))
|
||||
{
|
||||
UI_but_flag_enable(but, UI_BUT_DISABLED);
|
||||
}
|
||||
@ -1210,8 +1207,7 @@ static int modifier_is_simulation(ModifierData *md)
|
||||
}
|
||||
|
||||
static uiLayout *draw_modifier(
|
||||
uiLayout *layout,
|
||||
const EvaluationContext *eval_ctx, Scene *scene, Object *ob,
|
||||
uiLayout *layout, Scene *scene, Object *ob,
|
||||
ModifierData *md, int index, int cageIndex, int lastCageIndex)
|
||||
{
|
||||
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
||||
@ -1348,7 +1344,7 @@ static uiLayout *draw_modifier(
|
||||
if (md->type == eModifierType_ParticleSystem) {
|
||||
ParticleSystem *psys = ((ParticleSystemModifierData *)md)->psys;
|
||||
|
||||
if (!(eval_ctx->object_mode & OB_MODE_PARTICLE_EDIT)) {
|
||||
if (!(ob->mode & OB_MODE_PARTICLE_EDIT)) {
|
||||
if (ELEM(psys->part->ren_as, PART_DRAW_GR, PART_DRAW_OB))
|
||||
uiItemO(row, CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Convert"), ICON_NONE,
|
||||
"OBJECT_OT_duplicates_make_real");
|
||||
@ -1397,8 +1393,6 @@ static uiLayout *draw_modifier(
|
||||
|
||||
uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
|
||||
{
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob;
|
||||
ModifierData *md, *vmd;
|
||||
@ -1429,7 +1423,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
|
||||
|
||||
for (i = 0; vmd; i++, vmd = vmd->next) {
|
||||
if (md == vmd)
|
||||
return draw_modifier(layout, &eval_ctx, scene, ob, md, i, cageIndex, lastCageIndex);
|
||||
return draw_modifier(layout, scene, ob, md, i, cageIndex, lastCageIndex);
|
||||
else if (vmd->mode & eModifierMode_Virtual)
|
||||
i--;
|
||||
}
|
||||
|
@ -295,7 +295,7 @@ bool EDBM_backbuf_border_mask_init(const struct EvaluationContext *eval_ctx, Vie
|
||||
|
||||
/* method in use for face selecting too */
|
||||
if (vc->obedit == NULL) {
|
||||
if (!BKE_paint_select_elem_test(vc->obact, eval_ctx->object_mode)) {
|
||||
if (!BKE_paint_select_elem_test(vc->obact)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -347,7 +347,7 @@ bool EDBM_backbuf_circle_init(
|
||||
|
||||
/* method in use for face selecting too */
|
||||
if (vc->obedit == NULL) {
|
||||
if (!BKE_paint_select_elem_test(vc->obact, eval_ctx->object_mode)) {
|
||||
if (!BKE_paint_select_elem_test(vc->obact)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -506,14 +506,13 @@ static int layers_poll(bContext *C)
|
||||
|
||||
static int mesh_uv_texture_add_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = ED_object_context(C);
|
||||
Mesh *me = ob->data;
|
||||
|
||||
if (ED_mesh_uv_texture_add(me, NULL, true) == -1)
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
if (workspace->object_mode & OB_MODE_TEXTURE_PAINT) {
|
||||
if (ob->mode & OB_MODE_TEXTURE_PAINT) {
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_TOOLSETTINGS, NULL);
|
||||
@ -623,14 +622,13 @@ void MESH_OT_drop_named_image(wmOperatorType *ot)
|
||||
|
||||
static int mesh_uv_texture_remove_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = ED_object_context(C);
|
||||
Mesh *me = ob->data;
|
||||
|
||||
if (!ED_mesh_uv_texture_remove_active(me))
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
if (workspace->object_mode & OB_MODE_TEXTURE_PAINT) {
|
||||
if (ob->mode & OB_MODE_TEXTURE_PAINT) {
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_TOOLSETTINGS, NULL);
|
||||
@ -744,14 +742,13 @@ static int mesh_customdata_mask_clear_poll(bContext *C)
|
||||
{
|
||||
Object *ob = ED_object_context(C);
|
||||
if (ob && ob->type == OB_MESH) {
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Mesh *me = ob->data;
|
||||
|
||||
/* special case - can't run this if we're in sculpt mode */
|
||||
if (workspace->object_mode & OB_MODE_SCULPT) {
|
||||
if (ob->mode & OB_MODE_SCULPT) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Mesh *me = ob->data;
|
||||
if (!ID_IS_LINKED(me)) {
|
||||
CustomData *data = GET_CD_DATA(me, vdata);
|
||||
if (CustomData_has_layer(data, CD_PAINT_MASK)) {
|
||||
|
@ -662,10 +662,8 @@ void MESH_OT_navmesh_face_add(struct wmOperatorType *ot)
|
||||
|
||||
static int navmesh_obmode_data_poll(bContext *C)
|
||||
{
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
if (ob && (eval_ctx.object_mode == OB_MODE_OBJECT) && (ob->type == OB_MESH)) {
|
||||
if (ob && (ob->mode == OB_MODE_OBJECT) && (ob->type == OB_MESH)) {
|
||||
Mesh *me = ob->data;
|
||||
return CustomData_has_layer(&me->pdata, CD_RECAST);
|
||||
}
|
||||
@ -674,10 +672,8 @@ static int navmesh_obmode_data_poll(bContext *C)
|
||||
|
||||
static int navmesh_obmode_poll(bContext *C)
|
||||
{
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
if (ob && (eval_ctx.object_mode == OB_MODE_OBJECT) && (ob->type == OB_MESH)) {
|
||||
if (ob && (ob->mode == OB_MODE_OBJECT) && (ob->type == OB_MESH)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -79,7 +79,7 @@
|
||||
* return 0 if no join is made (error) and 1 if the join is done */
|
||||
|
||||
static void join_mesh_single(
|
||||
bContext *C, Main *bmain, Scene *scene,
|
||||
const EvaluationContext *eval_ctx, Main *bmain, Scene *scene,
|
||||
Object *ob_dst, Object *ob_src, float imat[4][4],
|
||||
MVert **mvert_pp, MEdge **medge_pp, MLoop **mloop_pp, MPoly **mpoly_pp,
|
||||
CustomData *vdata, CustomData *edata, CustomData *ldata, CustomData *pdata,
|
||||
@ -88,7 +88,6 @@ static void join_mesh_single(
|
||||
Material **matar, int *matmap, int totcol,
|
||||
int *vertofs, int *edgeofs, int *loopofs, int *polyofs)
|
||||
{
|
||||
EvaluationContext eval_ctx;
|
||||
int a, b;
|
||||
|
||||
Mesh *me = ob_src->data;
|
||||
@ -97,8 +96,6 @@ static void join_mesh_single(
|
||||
MLoop *mloop = *mloop_pp;
|
||||
MPoly *mpoly = *mpoly_pp;
|
||||
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
if (me->totvert) {
|
||||
/* merge customdata flag */
|
||||
((Mesh *)ob_dst->data)->cd_flag |= me->cd_flag;
|
||||
@ -210,13 +207,12 @@ static void join_mesh_single(
|
||||
if (ob_src != ob_dst) {
|
||||
MultiresModifierData *mmd;
|
||||
|
||||
multiresModifier_prepare_join(&eval_ctx, scene, ob_src, ob_dst);
|
||||
multiresModifier_prepare_join(eval_ctx, scene, ob_src, ob_dst);
|
||||
|
||||
if ((mmd = get_multires_modifier(scene, ob_src, true))) {
|
||||
ED_object_iter_other(
|
||||
&eval_ctx, bmain, ob_src, true,
|
||||
ED_object_multires_update_totlevels_cb,
|
||||
&mmd->totlvl);
|
||||
ED_object_iter_other(bmain, ob_src, true,
|
||||
ED_object_multires_update_totlevels_cb,
|
||||
&mmd->totlvl);
|
||||
}
|
||||
}
|
||||
|
||||
@ -266,7 +262,6 @@ static void join_mesh_single(
|
||||
|
||||
int join_mesh_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob = CTX_data_active_object(C);
|
||||
@ -286,7 +281,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
|
||||
bDeformGroup *dg, *odg;
|
||||
CustomData vdata, edata, fdata, ldata, pdata;
|
||||
|
||||
if (workspace->object_mode & OB_MODE_EDIT) {
|
||||
if (ob->mode & OB_MODE_EDIT) {
|
||||
BKE_report(op->reports, RPT_WARNING, "Cannot join while in edit mode");
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
@ -296,7 +291,10 @@ int join_mesh_exec(bContext *C, wmOperator *op)
|
||||
BKE_report(op->reports, RPT_WARNING, "Active object is not a mesh");
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
/* count & check */
|
||||
CTX_DATA_BEGIN (C, Base *, base, selected_editable_bases)
|
||||
{
|
||||
@ -491,7 +489,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
|
||||
* active mesh will remain first ones in new result of the merge, in same order for CD layers, etc. See also T50084.
|
||||
*/
|
||||
join_mesh_single(
|
||||
C, bmain, scene,
|
||||
&eval_ctx, bmain, scene,
|
||||
ob, ob, imat,
|
||||
&mvert, &medge, &mloop, &mpoly,
|
||||
&vdata, &edata, &ldata, &pdata,
|
||||
@ -508,7 +506,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
|
||||
/* only join if this is a mesh */
|
||||
if (base->object->type == OB_MESH) {
|
||||
join_mesh_single(
|
||||
C, bmain, scene,
|
||||
&eval_ctx, bmain, scene,
|
||||
ob, base->object, imat,
|
||||
&mvert, &medge, &mloop, &mpoly,
|
||||
&vdata, &edata, &ldata, &pdata,
|
||||
@ -1253,17 +1251,17 @@ bool ED_mesh_pick_vert(bContext *C, Object *ob, const int mval[2], unsigned int
|
||||
|
||||
MDeformVert *ED_mesh_active_dvert_get_em(Object *ob, BMVert **r_eve)
|
||||
{
|
||||
if (ob->type == OB_MESH && ob->defbase.first) {
|
||||
if (ob->mode & OB_MODE_EDIT && ob->type == OB_MESH && ob->defbase.first) {
|
||||
Mesh *me = ob->data;
|
||||
if (me->edit_btmesh != NULL) {
|
||||
BMesh *bm = me->edit_btmesh->bm;
|
||||
const int cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
|
||||
if (cd_dvert_offset != -1) {
|
||||
BMVert *eve = BM_mesh_active_vert_get(bm);
|
||||
if (eve) {
|
||||
if (r_eve) *r_eve = eve;
|
||||
return BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
|
||||
}
|
||||
BMesh *bm = me->edit_btmesh->bm;
|
||||
const int cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
|
||||
|
||||
if (cd_dvert_offset != -1) {
|
||||
BMVert *eve = BM_mesh_active_vert_get(bm);
|
||||
|
||||
if (eve) {
|
||||
if (r_eve) *r_eve = eve;
|
||||
return BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1288,8 +1286,7 @@ MDeformVert *ED_mesh_active_dvert_get_ob(Object *ob, int *r_index)
|
||||
MDeformVert *ED_mesh_active_dvert_get_only(Object *ob)
|
||||
{
|
||||
if (ob->type == OB_MESH) {
|
||||
Mesh *me = ob->data;
|
||||
if (me->edit_btmesh != NULL) {
|
||||
if (ob->mode & OB_MODE_EDIT) {
|
||||
return ED_mesh_active_dvert_get_em(ob, NULL);
|
||||
}
|
||||
else {
|
||||
|
@ -2081,9 +2081,7 @@ 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++; }
|
||||
@ -2094,14 +2092,10 @@ static Base *object_add_duplicate_internal(
|
||||
ID *id;
|
||||
int a, didit;
|
||||
|
||||
/* ignore pose mode now, Caller can inspect mode. */
|
||||
#if 0
|
||||
if (eval_ctx->object_mode & OB_MODE_POSE) {
|
||||
if (ob->mode & OB_MODE_POSE) {
|
||||
; /* nothing? */
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
else {
|
||||
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);
|
||||
|
||||
@ -2529,10 +2523,9 @@ static int join_poll(bContext *C)
|
||||
|
||||
static int join_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = CTX_data_active_object(C);
|
||||
|
||||
if (workspace->object_mode & OB_MODE_EDIT) {
|
||||
if (ob->mode & OB_MODE_EDIT) {
|
||||
BKE_report(op->reports, RPT_ERROR, "This data does not support joining in edit mode");
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
@ -2583,10 +2576,9 @@ static int join_shapes_poll(bContext *C)
|
||||
|
||||
static int join_shapes_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = CTX_data_active_object(C);
|
||||
|
||||
if (workspace->object_mode & OB_MODE_EDIT) {
|
||||
if (ob->mode & OB_MODE_EDIT) {
|
||||
BKE_report(op->reports, RPT_ERROR, "This data does not support joining in edit mode");
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
@ -206,8 +206,7 @@ static bool multiresbake_check(bContext *C, wmOperator *op)
|
||||
return ok;
|
||||
}
|
||||
|
||||
static DerivedMesh *multiresbake_create_loresdm(
|
||||
Scene *scene, Object *ob, eObjectMode object_mode, int *lvl)
|
||||
static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *lvl)
|
||||
{
|
||||
DerivedMesh *dm;
|
||||
MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
|
||||
@ -227,15 +226,13 @@ static DerivedMesh *multiresbake_create_loresdm(
|
||||
|
||||
tmp_mmd.lvl = *lvl;
|
||||
tmp_mmd.sculptlvl = *lvl;
|
||||
dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0, object_mode);
|
||||
dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0);
|
||||
cddm->release(cddm);
|
||||
|
||||
return dm;
|
||||
}
|
||||
|
||||
static DerivedMesh *multiresbake_create_hiresdm(
|
||||
Scene *scene, Object *ob, eObjectMode object_mode,
|
||||
int *lvl, bool *simple)
|
||||
static DerivedMesh *multiresbake_create_hiresdm(Scene *scene, Object *ob, int *lvl, bool *simple)
|
||||
{
|
||||
Mesh *me = (Mesh *)ob->data;
|
||||
MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
|
||||
@ -256,7 +253,7 @@ static DerivedMesh *multiresbake_create_hiresdm(
|
||||
|
||||
tmp_mmd.lvl = mmd->totlvl;
|
||||
tmp_mmd.sculptlvl = mmd->totlvl;
|
||||
dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0, object_mode);
|
||||
dm = multires_make_derived_from_derived(cddm, &tmp_mmd, ob, 0);
|
||||
cddm->release(cddm);
|
||||
|
||||
return dm;
|
||||
@ -320,7 +317,6 @@ static void clear_images_poly(Image **ob_image_array, int ob_image_array_len, Cl
|
||||
static int multiresbake_image_exec_locked(bContext *C, wmOperator *op)
|
||||
{
|
||||
Object *ob;
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
int objects_baked = 0;
|
||||
|
||||
@ -375,8 +371,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, workspace->object_mode, &bkr.tot_lvl, &bkr.simple);
|
||||
bkr.lores_dm = multiresbake_create_loresdm(scene, ob, workspace->object_mode, &bkr.lvl);
|
||||
bkr.hires_dm = multiresbake_create_hiresdm(scene, ob, &bkr.tot_lvl, &bkr.simple);
|
||||
bkr.lores_dm = multiresbake_create_loresdm(scene, ob, &bkr.lvl);
|
||||
|
||||
RE_multires_bake_images(&bkr);
|
||||
|
||||
@ -400,7 +396,6 @@ static int multiresbake_image_exec_locked(bContext *C, wmOperator *op)
|
||||
/* Multiresbake adopted for job-system executing */
|
||||
static void init_multiresbake_job(bContext *C, MultiresBakeJob *bkj)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob;
|
||||
|
||||
@ -432,8 +427,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, workspace->object_mode, &data->tot_lvl, &data->simple);
|
||||
data->lores_dm = multiresbake_create_loresdm(scene, ob, workspace->object_mode, &lvl);
|
||||
data->hires_dm = multiresbake_create_hiresdm(scene, ob, &data->tot_lvl, &data->simple);
|
||||
data->lores_dm = multiresbake_create_loresdm(scene, ob, &lvl);
|
||||
data->lvl = lvl;
|
||||
|
||||
BLI_addtail(&bkj->data, data);
|
||||
|
@ -866,7 +866,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, OB_MODE_OBJECT,
|
||||
reports, bmain, scene, highpoly[i].ob,
|
||||
"TmpTriangulate", eModifierType_Triangulate);
|
||||
tmd = (TriangulateModifierData *)highpoly[i].tri_mod;
|
||||
tmd->quad_method = MOD_TRIANGULATE_QUAD_FIXED;
|
||||
|
@ -87,12 +87,12 @@
|
||||
/* -------------- Get Active Constraint Data ---------------------- */
|
||||
|
||||
/* if object in posemode, active bone constraints, else object constraints */
|
||||
ListBase *get_active_constraints(const EvaluationContext *eval_ctx, Object *ob)
|
||||
ListBase *get_active_constraints(Object *ob)
|
||||
{
|
||||
if (ob == NULL)
|
||||
return NULL;
|
||||
|
||||
if (eval_ctx->object_mode & OB_MODE_POSE) {
|
||||
if (ob->mode & OB_MODE_POSE) {
|
||||
bPoseChannel *pchan;
|
||||
|
||||
pchan = BKE_pose_channel_active(ob);
|
||||
@ -142,9 +142,9 @@ ListBase *get_constraint_lb(Object *ob, bConstraint *con, bPoseChannel **r_pchan
|
||||
}
|
||||
|
||||
/* single constraint */
|
||||
bConstraint *get_active_constraint(const EvaluationContext *eval_ctx, Object *ob)
|
||||
bConstraint *get_active_constraint(Object *ob)
|
||||
{
|
||||
return BKE_constraints_active_get(get_active_constraints(eval_ctx, ob));
|
||||
return BKE_constraints_active_get(get_active_constraints(ob));
|
||||
}
|
||||
|
||||
/* -------------- Constraint Management (Add New, Remove, Rename) -------------------- */
|
||||
@ -639,8 +639,7 @@ static int edit_constraint_invoke_properties(bContext *C, wmOperator *op)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bConstraint *edit_constraint_property_get(
|
||||
const EvaluationContext *eval_ctx, wmOperator *op, Object *ob, int type)
|
||||
static bConstraint *edit_constraint_property_get(wmOperator *op, Object *ob, int type)
|
||||
{
|
||||
char constraint_name[MAX_NAME];
|
||||
int owner = RNA_enum_get(op->ptr, "owner");
|
||||
@ -665,7 +664,7 @@ static bConstraint *edit_constraint_property_get(
|
||||
else {
|
||||
//if (G.debug & G_DEBUG)
|
||||
//printf("edit_constraint_property_get: defaulting to getting list in the standard way\n");
|
||||
list = get_active_constraints(eval_ctx, ob);
|
||||
list = get_active_constraints(ob);
|
||||
}
|
||||
|
||||
con = BKE_constraints_find_name(list, constraint_name);
|
||||
@ -688,7 +687,7 @@ static int stretchto_reset_exec(bContext *C, wmOperator *op)
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
bConstraint *con = edit_constraint_property_get(&eval_ctx, op, ob, CONSTRAINT_TYPE_STRETCHTO);
|
||||
bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_STRETCHTO);
|
||||
bStretchToConstraint *data = (con) ? (bStretchToConstraint *)con->data : NULL;
|
||||
|
||||
/* despite 3 layers of checks, we may still not be able to find a constraint */
|
||||
@ -736,7 +735,7 @@ static int limitdistance_reset_exec(bContext *C, wmOperator *op)
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
bConstraint *con = edit_constraint_property_get(&eval_ctx, op, ob, CONSTRAINT_TYPE_DISTLIMIT);
|
||||
bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_DISTLIMIT);
|
||||
bDistLimitConstraint *data = (con) ? (bDistLimitConstraint *)con->data : NULL;
|
||||
|
||||
/* despite 3 layers of checks, we may still not be able to find a constraint */
|
||||
@ -875,7 +874,7 @@ static int childof_set_inverse_exec(bContext *C, wmOperator *op)
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
bConstraint *con = edit_constraint_property_get(&eval_ctx, op, ob, CONSTRAINT_TYPE_CHILDOF);
|
||||
bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_CHILDOF);
|
||||
bChildOfConstraint *data = (con) ? (bChildOfConstraint *)con->data : NULL;
|
||||
const int owner = RNA_enum_get(op->ptr, "owner");
|
||||
|
||||
@ -926,7 +925,7 @@ static int childof_clear_inverse_exec(bContext *C, wmOperator *op)
|
||||
Object *ob = ED_object_active_context(C);
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
bConstraint *con = edit_constraint_property_get(&eval_ctx, op, ob, CONSTRAINT_TYPE_CHILDOF);
|
||||
bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_CHILDOF);
|
||||
bChildOfConstraint *data = (con) ? (bChildOfConstraint *)con->data : NULL;
|
||||
|
||||
if (data == NULL) {
|
||||
@ -976,7 +975,7 @@ static int followpath_path_animate_exec(bContext *C, wmOperator *op)
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
bConstraint *con = edit_constraint_property_get(&eval_ctx, op, ob, CONSTRAINT_TYPE_FOLLOWPATH);
|
||||
bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_FOLLOWPATH);
|
||||
bFollowPathConstraint *data = (con) ? (bFollowPathConstraint *)con->data : NULL;
|
||||
|
||||
bAction *act = NULL;
|
||||
@ -1103,7 +1102,7 @@ static int objectsolver_set_inverse_exec(bContext *C, wmOperator *op)
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
bConstraint *con = edit_constraint_property_get(&eval_ctx, op, ob, CONSTRAINT_TYPE_OBJECTSOLVER);
|
||||
bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_OBJECTSOLVER);
|
||||
bObjectSolverConstraint *data = (con) ? (bObjectSolverConstraint *)con->data : NULL;
|
||||
const int owner = RNA_enum_get(op->ptr, "owner");
|
||||
|
||||
@ -1153,7 +1152,7 @@ static int objectsolver_clear_inverse_exec(bContext *C, wmOperator *op)
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
bConstraint *con = edit_constraint_property_get(&eval_ctx, op, ob, CONSTRAINT_TYPE_OBJECTSOLVER);
|
||||
bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_OBJECTSOLVER);
|
||||
bObjectSolverConstraint *data = (con) ? (bObjectSolverConstraint *)con->data : NULL;
|
||||
|
||||
if (data == NULL) {
|
||||
@ -1324,7 +1323,7 @@ static int constraint_move_down_exec(bContext *C, wmOperator *op)
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
bConstraint *con = edit_constraint_property_get(&eval_ctx, op, ob, 0);
|
||||
bConstraint *con = edit_constraint_property_get(op, ob, 0);
|
||||
|
||||
if (con && con->next) {
|
||||
ListBase *conlist = get_constraint_lb(ob, con, NULL);
|
||||
@ -1375,7 +1374,7 @@ static int constraint_move_up_exec(bContext *C, wmOperator *op)
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
bConstraint *con = edit_constraint_property_get(&eval_ctx, op, ob, 0);
|
||||
bConstraint *con = edit_constraint_property_get(op, ob, 0);
|
||||
|
||||
if (con && con->prev) {
|
||||
ListBase *conlist = get_constraint_lb(ob, con, NULL);
|
||||
@ -1892,8 +1891,6 @@ static int object_constraint_add_exec(bContext *C, wmOperator *op)
|
||||
/* dummy operator callback */
|
||||
static int pose_constraint_add_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Object *ob = BKE_object_pose_armature_get(ED_object_active_context(C));
|
||||
int type = RNA_enum_get(op->ptr, "type");
|
||||
short with_targets = 0;
|
||||
@ -1909,7 +1906,7 @@ static int pose_constraint_add_exec(bContext *C, wmOperator *op)
|
||||
if (strstr(op->idname, "with_targets"))
|
||||
with_targets = 1;
|
||||
|
||||
return constraint_add_exec(C, op, ob, get_active_constraints(&eval_ctx, ob), type, with_targets);
|
||||
return constraint_add_exec(C, op, ob, get_active_constraints(ob), type, with_targets);
|
||||
}
|
||||
|
||||
/* ------------------ */
|
||||
@ -2050,13 +2047,11 @@ static int pose_ik_add_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED
|
||||
/* call constraint_add_exec() to add the IK constraint */
|
||||
static int pose_ik_add_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Object *ob = CTX_data_active_object(C);
|
||||
const bool with_targets = RNA_boolean_get(op->ptr, "with_targets");
|
||||
|
||||
/* add the constraint - all necessary checks should have been done by the invoke() callback already... */
|
||||
return constraint_add_exec(C, op, ob, get_active_constraints(&eval_ctx, ob), CONSTRAINT_TYPE_KINEMATIC, with_targets);
|
||||
return constraint_add_exec(C, op, ob, get_active_constraints(ob), CONSTRAINT_TYPE_KINEMATIC, with_targets);
|
||||
}
|
||||
|
||||
void POSE_OT_ik_add(wmOperatorType *ot)
|
||||
|
@ -274,9 +274,12 @@ bool ED_object_editmode_load(Object *obedit)
|
||||
* - Only in exceptional cases should #EM_DO_UNDO NOT be in the flag.
|
||||
* - If #EM_FREEDATA isn't in the flag, use ED_object_editmode_load directly.
|
||||
*/
|
||||
void ED_object_editmode_exit_ex(bContext *C, WorkSpace *workspace, Scene *scene, Object *obedit, int flag)
|
||||
void ED_object_editmode_exit_ex(bContext *C, Scene *scene, Object *obedit, int flag)
|
||||
{
|
||||
BLI_assert(C || !(flag & EM_DO_UNDO));
|
||||
/* 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 */
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
const bool freedata = (flag & EM_FREEDATA) != 0;
|
||||
|
||||
if (flag & EM_WAITCURSOR) waitcursor(1);
|
||||
@ -284,7 +287,9 @@ void ED_object_editmode_exit_ex(bContext *C, WorkSpace *workspace, Scene *scene,
|
||||
if (ED_object_editmode_load_ex(G.main, obedit, freedata) == false) {
|
||||
/* in rare cases (background mode) its possible active object
|
||||
* is flagged for editmode, without 'obedit' being set [#35489] */
|
||||
workspace->object_mode &= ~OB_MODE_EDIT;
|
||||
if (UNLIKELY(view_layer->basact && (view_layer->basact->object->mode & OB_MODE_EDIT))) {
|
||||
view_layer->basact->object->mode &= ~OB_MODE_EDIT;
|
||||
}
|
||||
if (flag & EM_WAITCURSOR) waitcursor(0);
|
||||
return;
|
||||
}
|
||||
@ -306,21 +311,14 @@ void ED_object_editmode_exit_ex(bContext *C, WorkSpace *workspace, Scene *scene,
|
||||
|
||||
/* also flush ob recalc, doesn't take much overhead, but used for particles */
|
||||
DEG_id_tag_update(&obedit->id, OB_RECALC_OB | OB_RECALC_DATA);
|
||||
|
||||
workspace->object_mode &= ~OB_MODE_EDIT;
|
||||
|
||||
if (flag & EM_DO_UNDO)
|
||||
ED_undo_push(C, "Editmode");
|
||||
|
||||
if (C != NULL) {
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene);
|
||||
}
|
||||
else {
|
||||
WM_main_add_notifier(NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene);
|
||||
}
|
||||
}
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene);
|
||||
|
||||
ED_workspace_object_mode_sync_from_object(G.main->wm.first, workspace, obedit);
|
||||
obedit->mode &= ~OB_MODE_EDIT;
|
||||
}
|
||||
|
||||
if (flag & EM_WAITCURSOR) waitcursor(0);
|
||||
|
||||
@ -330,15 +328,13 @@ void ED_object_editmode_exit_ex(bContext *C, WorkSpace *workspace, Scene *scene,
|
||||
|
||||
void ED_object_editmode_exit(bContext *C, int flag)
|
||||
{
|
||||
WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *obedit = CTX_data_edit_object(C);
|
||||
ED_object_editmode_exit_ex(C, workspace, scene, obedit, flag);
|
||||
ED_object_editmode_exit_ex(C, scene, obedit, 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;
|
||||
@ -368,14 +364,14 @@ void ED_object_editmode_enter(bContext *C, int flag)
|
||||
|
||||
if (flag & EM_WAITCURSOR) waitcursor(1);
|
||||
|
||||
workspace->object_mode_restore = workspace->object_mode;
|
||||
ob->restore_mode = ob->mode;
|
||||
|
||||
/* note, when switching scenes the object can have editmode data but
|
||||
* not be scene->obedit: bug 22954, this avoids calling self eternally */
|
||||
if ((workspace->object_mode_restore & OB_MODE_EDIT) == 0)
|
||||
ED_object_mode_toggle(C, workspace->object_mode);
|
||||
if ((ob->restore_mode & OB_MODE_EDIT) == 0)
|
||||
ED_object_mode_toggle(C, ob->mode);
|
||||
|
||||
workspace->object_mode = OB_MODE_EDIT;
|
||||
ob->mode = OB_MODE_EDIT;
|
||||
|
||||
if (ob->type == OB_MESH) {
|
||||
BMEditMesh *em;
|
||||
@ -446,25 +442,23 @@ void ED_object_editmode_enter(bContext *C, int flag)
|
||||
DEG_id_tag_update(&scene->id, 0);
|
||||
}
|
||||
else {
|
||||
workspace->object_mode &= ~OB_MODE_EDIT;
|
||||
ob->mode &= ~OB_MODE_EDIT;
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene);
|
||||
}
|
||||
|
||||
ED_workspace_object_mode_sync_from_object(G.main->wm.first, workspace, ob);
|
||||
|
||||
if (flag & EM_DO_UNDO) ED_undo_push(C, "Enter Editmode");
|
||||
if (flag & EM_WAITCURSOR) waitcursor(0);
|
||||
}
|
||||
|
||||
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) {
|
||||
if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) {
|
||||
Object *ob = CTX_data_active_object(C);
|
||||
if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
}
|
||||
@ -487,10 +481,8 @@ static int editmode_toggle_poll(bContext *C)
|
||||
if (ELEM(NULL, ob, ob->data) || ID_IS_LINKED(ob->data))
|
||||
return 0;
|
||||
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
|
||||
/* if hidden but in edit mode, we still display */
|
||||
if ((ob->restrictflag & OB_RESTRICT_VIEW) && !(workspace->object_mode & OB_MODE_EDIT)) {
|
||||
if ((ob->restrictflag & OB_RESTRICT_VIEW) && !(ob->mode & OB_MODE_EDIT)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -517,15 +509,13 @@ void OBJECT_OT_editmode_toggle(wmOperatorType *ot)
|
||||
|
||||
static int posemode_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
wmWindowManager *wm = CTX_wm_manager(C);
|
||||
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 = (workspace->object_mode & mode_flag) != 0;
|
||||
|
||||
const bool is_mode_set = (ob->mode & mode_flag) != 0;
|
||||
|
||||
if (!is_mode_set) {
|
||||
if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) {
|
||||
if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
}
|
||||
@ -540,8 +530,6 @@ static int posemode_exec(bContext *C, wmOperator *op)
|
||||
else
|
||||
ED_armature_enter_posemode(C, base);
|
||||
|
||||
ED_workspace_object_mode_sync_from_object(wm, workspace, ob);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
@ -1020,7 +1008,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, eObjectMode object_mode)
|
||||
void ED_object_check_force_modifiers(Main *bmain, Scene *scene, Object *object)
|
||||
{
|
||||
PartDeflect *pd = object->pd;
|
||||
ModifierData *md = modifiers_findByType(object, eModifierType_Surface);
|
||||
@ -1029,7 +1017,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, object_mode, NULL, eModifierType_Surface);
|
||||
ED_object_modifier_add(NULL, bmain, scene, object, NULL, eModifierType_Surface);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1051,8 +1039,7 @@ static int forcefield_toggle_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
else
|
||||
ob->pd->forcefield = 0;
|
||||
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
ED_object_check_force_modifiers(CTX_data_main(C), CTX_data_scene(C), ob, workspace->object_mode);
|
||||
ED_object_check_force_modifiers(CTX_data_main(C), CTX_data_scene(C), ob);
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
|
||||
|
||||
@ -1513,11 +1500,10 @@ 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 = workspace->object_mode;
|
||||
eObjectMode restore_mode = (ob) ? ob->mode : OB_MODE_OBJECT;
|
||||
const bool toggle = RNA_boolean_get(op->ptr, "toggle");
|
||||
|
||||
if (gpd) {
|
||||
@ -1541,31 +1527,28 @@ static int object_mode_set_exec(bContext *C, wmOperator *op)
|
||||
if (!ob || !ED_object_mode_compat_test(ob, mode))
|
||||
return OPERATOR_PASS_THROUGH;
|
||||
|
||||
if (workspace->object_mode != mode) {
|
||||
if (ob->mode != mode) {
|
||||
/* we should be able to remove this call, each operator calls */
|
||||
ED_object_mode_compat_set(C, workspace, mode, op->reports);
|
||||
ED_object_mode_compat_set(C, ob, mode, op->reports);
|
||||
}
|
||||
|
||||
/* Exit current mode if it's not the mode we're setting */
|
||||
if (mode != OB_MODE_OBJECT && (workspace->object_mode != mode || toggle)) {
|
||||
if (mode != OB_MODE_OBJECT && (ob->mode != mode || toggle)) {
|
||||
/* Enter new mode */
|
||||
ED_object_mode_toggle(C, mode);
|
||||
}
|
||||
|
||||
if (toggle) {
|
||||
/* Special case for Object mode! */
|
||||
if ((mode == OB_MODE_OBJECT) &&
|
||||
(restore_mode == OB_MODE_OBJECT) &&
|
||||
(workspace->object_mode_restore != OB_MODE_OBJECT))
|
||||
{
|
||||
ED_object_mode_toggle(C, workspace->object_mode_restore);
|
||||
if (mode == OB_MODE_OBJECT && restore_mode == OB_MODE_OBJECT && ob->restore_mode != OB_MODE_OBJECT) {
|
||||
ED_object_mode_toggle(C, ob->restore_mode);
|
||||
}
|
||||
else if (workspace->object_mode == mode) {
|
||||
else if (ob->mode == mode) {
|
||||
/* For toggling, store old mode so we know what to go back to */
|
||||
workspace->object_mode_restore = restore_mode;
|
||||
ob->restore_mode = restore_mode;
|
||||
}
|
||||
else if (!ELEM(workspace->object_mode_restore, mode, OB_MODE_OBJECT)) {
|
||||
ED_object_mode_toggle(C, workspace->object_mode_restore);
|
||||
else if (ob->restore_mode != OB_MODE_OBJECT && ob->restore_mode != mode) {
|
||||
ED_object_mode_toggle(C, ob->restore_mode);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -175,8 +175,7 @@ static int face_map_supported_edit_mode_poll(bContext *C)
|
||||
Object *ob = ED_object_context(C);
|
||||
ID *data = (ob) ? ob->data : NULL;
|
||||
if (ob && !ob->id.lib && ob->type == OB_MESH && data && !data->lib) {
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
if (workspace->object_mode == OB_MODE_EDIT) {
|
||||
if (ob->mode == OB_MODE_EDIT) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -121,14 +121,14 @@ bool ED_object_mode_compat_test(const Object *ob, eObjectMode mode)
|
||||
*
|
||||
* This is so each mode's exec function can call
|
||||
*/
|
||||
bool ED_object_mode_compat_set(bContext *C, WorkSpace *workspace, eObjectMode mode, ReportList *reports)
|
||||
bool ED_object_mode_compat_set(bContext *C, Object *ob, eObjectMode mode, ReportList *reports)
|
||||
{
|
||||
bool ok;
|
||||
if (!ELEM(workspace->object_mode, mode, OB_MODE_OBJECT)) {
|
||||
const char *opstring = object_mode_op_string(workspace->object_mode);
|
||||
if (!ELEM(ob->mode, mode, OB_MODE_OBJECT)) {
|
||||
const char *opstring = object_mode_op_string(ob->mode);
|
||||
|
||||
WM_operator_name_call(C, opstring, WM_OP_EXEC_REGION_WIN, NULL);
|
||||
ok = ELEM(workspace->object_mode, mode, OB_MODE_OBJECT);
|
||||
ok = ELEM(ob->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);
|
||||
@ -176,8 +176,8 @@ void ED_object_mode_set(bContext *C, eObjectMode mode)
|
||||
bool ED_object_mode_generic_enter(
|
||||
struct bContext *C, eObjectMode object_mode)
|
||||
{
|
||||
WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
if (workspace->object_mode == object_mode) {
|
||||
Object *ob = CTX_data_active_object(C);
|
||||
if (ob->mode == object_mode) {
|
||||
return true;
|
||||
}
|
||||
wmOperatorType *ot = WM_operatortype_find("OBJECT_OT_mode_set", false);
|
||||
@ -186,7 +186,7 @@ bool ED_object_mode_generic_enter(
|
||||
RNA_enum_set(&ptr, "mode", object_mode);
|
||||
WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &ptr);
|
||||
WM_operator_properties_free(&ptr);
|
||||
return (workspace->object_mode == object_mode);
|
||||
return (ob->mode == object_mode);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -195,46 +195,46 @@ bool ED_object_mode_generic_enter(
|
||||
*/
|
||||
static bool ed_object_mode_generic_exit_ex(
|
||||
const struct EvaluationContext *eval_ctx,
|
||||
struct WorkSpace *workspace, struct Scene *scene, struct Object *ob,
|
||||
struct Scene *scene, struct Object *ob,
|
||||
bool only_test)
|
||||
{
|
||||
if (eval_ctx->object_mode & OB_MODE_EDIT) {
|
||||
if (ob->mode & OB_MODE_EDIT) {
|
||||
if (BKE_object_is_in_editmode(ob)) {
|
||||
if (only_test) {
|
||||
return true;
|
||||
}
|
||||
ED_object_editmode_exit_ex(NULL, workspace, scene, ob, EM_FREEDATA);
|
||||
ED_object_editmode_exit_ex(NULL, scene, ob, EM_FREEDATA);
|
||||
}
|
||||
}
|
||||
else if (eval_ctx->object_mode & OB_MODE_VERTEX_PAINT) {
|
||||
else if (ob->mode & OB_MODE_VERTEX_PAINT) {
|
||||
if (ob->sculpt && (ob->sculpt->mode_type == OB_MODE_VERTEX_PAINT)) {
|
||||
if (only_test) {
|
||||
return true;
|
||||
}
|
||||
ED_object_vpaintmode_exit_ex(workspace, ob);
|
||||
ED_object_vpaintmode_exit_ex(ob);
|
||||
}
|
||||
}
|
||||
else if (eval_ctx->object_mode & OB_MODE_WEIGHT_PAINT) {
|
||||
else if (ob->mode & OB_MODE_WEIGHT_PAINT) {
|
||||
if (ob->sculpt && (ob->sculpt->mode_type == OB_MODE_WEIGHT_PAINT)) {
|
||||
if (only_test) {
|
||||
return true;
|
||||
}
|
||||
ED_object_wpaintmode_exit_ex(workspace, ob);
|
||||
ED_object_wpaintmode_exit_ex(ob);
|
||||
}
|
||||
}
|
||||
else if (eval_ctx->object_mode & OB_MODE_SCULPT) {
|
||||
else if (ob->mode & OB_MODE_SCULPT) {
|
||||
if (ob->sculpt && (ob->sculpt->mode_type == OB_MODE_SCULPT)) {
|
||||
if (only_test) {
|
||||
return true;
|
||||
}
|
||||
ED_object_sculptmode_exit_ex(eval_ctx, workspace, scene, ob);
|
||||
ED_object_sculptmode_exit_ex(eval_ctx, scene, ob);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (only_test) {
|
||||
return false;
|
||||
}
|
||||
BLI_assert((eval_ctx->object_mode & OB_MODE_ALL_MODE_DATA) == 0);
|
||||
BLI_assert((ob->mode & OB_MODE_ALL_MODE_DATA) == 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -242,88 +242,16 @@ static bool ed_object_mode_generic_exit_ex(
|
||||
|
||||
void ED_object_mode_generic_exit(
|
||||
const struct EvaluationContext *eval_ctx,
|
||||
struct WorkSpace *workspace, struct Scene *scene, struct Object *ob)
|
||||
struct Scene *scene, struct Object *ob)
|
||||
{
|
||||
ed_object_mode_generic_exit_ex(eval_ctx, workspace, scene, ob, false);
|
||||
ed_object_mode_generic_exit_ex(eval_ctx, scene, ob, false);
|
||||
}
|
||||
|
||||
bool ED_object_mode_generic_has_data(
|
||||
const struct EvaluationContext *eval_ctx,
|
||||
struct Object *ob)
|
||||
{
|
||||
return ed_object_mode_generic_exit_ex(eval_ctx, NULL, NULL, ob, true);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Mode Syncing Utils
|
||||
*
|
||||
* \{ */
|
||||
|
||||
/**
|
||||
* A version of #ED_object_mode_generic_enter that checks if the object
|
||||
* has an active mode mode in another window we need to use another window first.
|
||||
*/
|
||||
bool ED_object_mode_generic_enter_or_other_window(
|
||||
struct bContext *C, const wmWindow *win_compare, eObjectMode object_mode)
|
||||
{
|
||||
WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Base *basact = view_layer->basact;
|
||||
if (basact == NULL) {
|
||||
workspace->object_mode = OB_MODE_OBJECT;
|
||||
return (workspace->object_mode == object_mode);
|
||||
}
|
||||
|
||||
wmWindowManager *wm = CTX_wm_manager(C);
|
||||
eObjectMode object_mode_set = OB_MODE_OBJECT;
|
||||
bool use_object_mode = ED_workspace_object_mode_in_other_window(wm, win_compare, basact->object, &object_mode_set);
|
||||
|
||||
if (use_object_mode) {
|
||||
workspace->object_mode = object_mode_set;
|
||||
return (workspace->object_mode == object_mode);
|
||||
}
|
||||
else {
|
||||
workspace->object_mode = OB_MODE_OBJECT;
|
||||
return ED_object_mode_generic_enter(C, object_mode);
|
||||
}
|
||||
}
|
||||
|
||||
void ED_object_mode_generic_exit_or_other_window(
|
||||
const struct EvaluationContext *eval_ctx, wmWindowManager *wm,
|
||||
struct WorkSpace *workspace, struct Scene *scene, struct Object *ob)
|
||||
{
|
||||
if (ob == NULL) {
|
||||
return;
|
||||
}
|
||||
bool is_active = ED_workspace_object_mode_in_other_window(wm, NULL, ob, NULL);
|
||||
if (is_active == false) {
|
||||
ED_object_mode_generic_exit(eval_ctx, workspace, scene, ob);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Use to find if we need to create the mode-data.
|
||||
*
|
||||
* When the mode 'exists' it means we have a windowing showing an object with this mode.
|
||||
* So it's data is already created.
|
||||
* Used to check if we need to perform mode switching.
|
||||
*/
|
||||
bool ED_object_mode_generic_exists(
|
||||
wmWindowManager *wm, struct Object *ob,
|
||||
eObjectMode object_mode)
|
||||
{
|
||||
if (ob == NULL) {
|
||||
return false;
|
||||
}
|
||||
eObjectMode object_mode_test;
|
||||
if (ED_workspace_object_mode_in_other_window(wm, NULL, ob, &object_mode_test)) {
|
||||
if (object_mode == object_mode_test) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return ed_object_mode_generic_exit_ex(eval_ctx, NULL, ob, true);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
@ -95,10 +95,7 @@ static void modifier_skin_customdata_delete(struct Object *ob);
|
||||
|
||||
/******************************** API ****************************/
|
||||
|
||||
ModifierData *ED_object_modifier_add(
|
||||
ReportList *reports,
|
||||
Main *bmain, Scene *scene,
|
||||
Object *ob, eObjectMode object_mode, const char *name, int type)
|
||||
ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type)
|
||||
{
|
||||
ModifierData *md = NULL, *new_md = NULL;
|
||||
const ModifierTypeInfo *mti = modifierType_getInfo(type);
|
||||
@ -165,7 +162,7 @@ ModifierData *ED_object_modifier_add(
|
||||
/* set totlvl from existing MDISPS layer if object already had it */
|
||||
multiresModifier_set_levels_from_disps((MultiresModifierData *)new_md, ob);
|
||||
|
||||
if (object_mode & OB_MODE_SCULPT) {
|
||||
if (ob->mode & OB_MODE_SCULPT) {
|
||||
/* ensure that grid paint mask layer is created */
|
||||
BKE_sculpt_mask_layers_ensure(ob, (MultiresModifierData *)new_md);
|
||||
}
|
||||
@ -205,11 +202,9 @@ static bool object_has_modifier(const Object *ob, const ModifierData *exclude,
|
||||
* If the callback ever returns true, iteration will stop and the
|
||||
* function value will be true. Otherwise the function returns false.
|
||||
*/
|
||||
bool ED_object_iter_other(
|
||||
const EvaluationContext *eval_ctx,
|
||||
Main *bmain, Object *orig_ob, const bool include_orig,
|
||||
bool (*callback)(const EvaluationContext *eval_ctx, Object *ob, void *callback_data),
|
||||
void *callback_data)
|
||||
bool ED_object_iter_other(Main *bmain, Object *orig_ob, const bool include_orig,
|
||||
bool (*callback)(Object *ob, void *callback_data),
|
||||
void *callback_data)
|
||||
{
|
||||
ID *ob_data_id = orig_ob->data;
|
||||
int users = ob_data_id->us;
|
||||
@ -228,7 +223,7 @@ bool ED_object_iter_other(
|
||||
if (((ob != orig_ob) || include_orig) &&
|
||||
(ob->data == orig_ob->data))
|
||||
{
|
||||
if (callback(eval_ctx, ob, callback_data))
|
||||
if (callback(ob, callback_data))
|
||||
return true;
|
||||
|
||||
totfound++;
|
||||
@ -236,15 +231,13 @@ bool ED_object_iter_other(
|
||||
}
|
||||
}
|
||||
else if (include_orig) {
|
||||
return callback(eval_ctx, orig_ob, callback_data);
|
||||
return callback(orig_ob, callback_data);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool object_has_modifier_cb(
|
||||
const EvaluationContext *UNUSED(eval_ctx),
|
||||
Object *ob, void *data)
|
||||
static bool object_has_modifier_cb(Object *ob, void *data)
|
||||
{
|
||||
ModifierType type = *((ModifierType *)data);
|
||||
|
||||
@ -254,16 +247,14 @@ static bool object_has_modifier_cb(
|
||||
/* Use with ED_object_iter_other(). Sets the total number of levels
|
||||
* 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 *eval_ctx,
|
||||
Object *ob, void *totlevel_v)
|
||||
bool ED_object_multires_update_totlevels_cb(Object *ob, void *totlevel_v)
|
||||
{
|
||||
ModifierData *md;
|
||||
int totlevel = *((char *)totlevel_v);
|
||||
|
||||
for (md = ob->modifiers.first; md; md = md->next) {
|
||||
if (md->type == eModifierType_Multires) {
|
||||
multires_set_tot_level((MultiresModifierData *)md, totlevel, eval_ctx->object_mode);
|
||||
multires_set_tot_level(ob, (MultiresModifierData *)md, totlevel);
|
||||
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
|
||||
}
|
||||
}
|
||||
@ -276,7 +267,7 @@ static bool object_modifier_safe_to_delete(Main *bmain, Object *ob,
|
||||
ModifierType type)
|
||||
{
|
||||
return (!object_has_modifier(ob, exclude, type) &&
|
||||
!ED_object_iter_other(NULL, bmain, ob, false,
|
||||
!ED_object_iter_other(bmain, ob, false,
|
||||
object_has_modifier_cb, &type));
|
||||
}
|
||||
|
||||
@ -325,13 +316,11 @@ 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);
|
||||
|
||||
@ -424,9 +413,7 @@ 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 *UNUSED(ob), eObjectMode object_mode, ModifierData *md)
|
||||
int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene *scene, ViewLayer *view_layer, Object *ob, ModifierData *md)
|
||||
{
|
||||
Object *obn;
|
||||
ParticleSystem *psys;
|
||||
@ -440,7 +427,7 @@ int ED_object_modifier_convert(
|
||||
int totpart = 0, totchild = 0;
|
||||
|
||||
if (md->type != eModifierType_ParticleSystem) return 0;
|
||||
if (object_mode & OB_MODE_PARTICLE_EDIT) return 0;
|
||||
if (ob && ob->mode & OB_MODE_PARTICLE_EDIT) return 0;
|
||||
|
||||
psys = ((ParticleSystemModifierData *)md)->psys;
|
||||
part = psys->part;
|
||||
@ -535,12 +522,9 @@ int ED_object_modifier_convert(
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int modifier_apply_shape(ReportList *reports, const bContext *C, Scene *scene, Object *ob, ModifierData *md)
|
||||
static int modifier_apply_shape(ReportList *reports, const EvaluationContext *eval_ctx, Scene *scene, Object *ob, ModifierData *md)
|
||||
{
|
||||
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
||||
EvaluationContext eval_ctx;
|
||||
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
md->scene = scene;
|
||||
|
||||
@ -571,7 +555,7 @@ static int modifier_apply_shape(ReportList *reports, const bContext *C, Scene *s
|
||||
return 0;
|
||||
}
|
||||
|
||||
dm = mesh_create_derived_for_modifier(&eval_ctx, scene, ob, md, 0);
|
||||
dm = mesh_create_derived_for_modifier(eval_ctx, scene, ob, md, 0);
|
||||
if (!dm) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier is disabled or returned error, skipping apply");
|
||||
return 0;
|
||||
@ -598,12 +582,9 @@ static int modifier_apply_shape(ReportList *reports, const bContext *C, Scene *s
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int modifier_apply_obdata(ReportList *reports, const bContext *C, Scene *scene, Object *ob, ModifierData *md)
|
||||
static int modifier_apply_obdata(ReportList *reports, const EvaluationContext *eval_ctx, Scene *scene, Object *ob, ModifierData *md)
|
||||
{
|
||||
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
|
||||
EvaluationContext eval_ctx;
|
||||
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
md->scene = scene;
|
||||
|
||||
@ -627,13 +608,13 @@ static int modifier_apply_obdata(ReportList *reports, const bContext *C, Scene *
|
||||
multires_force_update(ob);
|
||||
|
||||
if (mmd && mmd->totlvl && mti->type == eModifierTypeType_OnlyDeform) {
|
||||
if (!multiresModifier_reshapeFromDeformMod(&eval_ctx, scene, mmd, ob, md)) {
|
||||
if (!multiresModifier_reshapeFromDeformMod(eval_ctx, scene, mmd, ob, md)) {
|
||||
BKE_report(reports, RPT_ERROR, "Multires modifier returned error, skipping apply");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
dm = mesh_create_derived_for_modifier(&eval_ctx, scene, ob, md, 1);
|
||||
dm = mesh_create_derived_for_modifier(eval_ctx, scene, ob, md, 1);
|
||||
if (!dm) {
|
||||
BKE_report(reports, RPT_ERROR, "Modifier returned error, skipping apply");
|
||||
return 0;
|
||||
@ -659,7 +640,7 @@ static int modifier_apply_obdata(ReportList *reports, const bContext *C, Scene *
|
||||
BKE_report(reports, RPT_INFO, "Applied modifier only changed CV points, not tessellated/bevel vertices");
|
||||
|
||||
vertexCos = BKE_curve_nurbs_vertexCos_get(&cu->nurb, &numVerts);
|
||||
mti->deformVerts(md, &eval_ctx, ob, NULL, vertexCos, numVerts, 0);
|
||||
mti->deformVerts(md, eval_ctx, ob, NULL, vertexCos, numVerts, 0);
|
||||
BK_curve_nurbs_vertexCos_apply(&cu->nurb, vertexCos);
|
||||
|
||||
MEM_freeN(vertexCos);
|
||||
@ -681,16 +662,17 @@ static int modifier_apply_obdata(ReportList *reports, const bContext *C, Scene *
|
||||
if (psys->part->type != PART_HAIR)
|
||||
continue;
|
||||
|
||||
psys_apply_hair_lattice(&eval_ctx, scene, ob, psys);
|
||||
psys_apply_hair_lattice(eval_ctx, scene, ob, psys);
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ED_object_modifier_apply(ReportList *reports, const bContext *C, Scene *scene, Object *ob, ModifierData *md, int mode)
|
||||
int ED_object_modifier_apply(
|
||||
ReportList *reports, const EvaluationContext *eval_ctx,
|
||||
Scene *scene, Object *ob, ModifierData *md, int mode)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
int prev_mode;
|
||||
|
||||
if (BKE_object_is_in_editmode(ob)) {
|
||||
@ -701,7 +683,7 @@ int ED_object_modifier_apply(ReportList *reports, const bContext *C, Scene *scen
|
||||
BKE_report(reports, RPT_ERROR, "Modifiers cannot be applied to multi-user data");
|
||||
return 0;
|
||||
}
|
||||
else if ((workspace->object_mode & OB_MODE_SCULPT) &&
|
||||
else if ((ob->mode & OB_MODE_SCULPT) &&
|
||||
(find_multires_modifier_before(scene, md)) &&
|
||||
(modifier_isSameTopology(md) == false))
|
||||
{
|
||||
@ -717,13 +699,13 @@ int ED_object_modifier_apply(ReportList *reports, const bContext *C, Scene *scen
|
||||
md->mode |= eModifierMode_Realtime;
|
||||
|
||||
if (mode == MODIFIER_APPLY_SHAPE) {
|
||||
if (!modifier_apply_shape(reports, C, scene, ob, md)) {
|
||||
if (!modifier_apply_shape(reports, eval_ctx, scene, ob, md)) {
|
||||
md->mode = prev_mode;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!modifier_apply_obdata(reports, C, scene, ob, md)) {
|
||||
if (!modifier_apply_obdata(reports, eval_ctx, scene, ob, md)) {
|
||||
md->mode = prev_mode;
|
||||
return 0;
|
||||
}
|
||||
@ -753,13 +735,12 @@ int ED_object_modifier_copy(ReportList *UNUSED(reports), Object *ob, ModifierDat
|
||||
|
||||
static int modifier_add_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
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, workspace->object_mode, NULL, type))
|
||||
if (!ED_object_modifier_add(op->reports, bmain, scene, ob, NULL, type))
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
|
||||
@ -896,12 +877,11 @@ ModifierData *edit_modifier_property_get(wmOperator *op, Object *ob, int type)
|
||||
|
||||
static int modifier_remove_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Main *bmain = CTX_data_main(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);
|
||||
int mode_orig = workspace->object_mode;
|
||||
int mode_orig = ob->mode;
|
||||
|
||||
if (!md || !ED_object_modifier_remove(op->reports, bmain, ob, md))
|
||||
return OPERATOR_CANCELLED;
|
||||
@ -910,8 +890,8 @@ static int modifier_remove_exec(bContext *C, wmOperator *op)
|
||||
|
||||
/* if cloth/softbody was removed, particle mode could be cleared */
|
||||
if (mode_orig & OB_MODE_PARTICLE_EDIT) {
|
||||
if ((workspace->object_mode & OB_MODE_PARTICLE_EDIT) == 0) {
|
||||
if (view_layer->basact && view_layer->basact->object == ob) {
|
||||
if ((ob->mode & OB_MODE_PARTICLE_EDIT) == 0) {
|
||||
if (ob == OBACT(view_layer)) {
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, NULL);
|
||||
}
|
||||
}
|
||||
@ -1029,7 +1009,10 @@ static int modifier_apply_exec(bContext *C, wmOperator *op)
|
||||
ModifierData *md = edit_modifier_property_get(op, ob, 0);
|
||||
int apply_as = RNA_enum_get(op->ptr, "apply_as");
|
||||
|
||||
if (!md || !ED_object_modifier_apply(op->reports, C, scene, ob, md, apply_as)) {
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
if (!md || !ED_object_modifier_apply(op->reports, &eval_ctx, scene, ob, md, apply_as)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
@ -1074,16 +1057,14 @@ void OBJECT_OT_modifier_apply(wmOperatorType *ot)
|
||||
|
||||
static int modifier_convert_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
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);
|
||||
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, workspace->object_mode, md)) {
|
||||
|
||||
if (!md || !ED_object_modifier_convert(op->reports, bmain, scene, view_layer, ob, md))
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
|
||||
@ -1167,13 +1148,10 @@ static int multires_higher_levels_delete_exec(bContext *C, wmOperator *op)
|
||||
|
||||
if (!mmd)
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
multiresModifier_del_levels(mmd, ob, 1);
|
||||
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
multiresModifier_del_levels(mmd, ob, 1, eval_ctx.object_mode);
|
||||
|
||||
ED_object_iter_other(&eval_ctx, CTX_data_main(C), ob, true,
|
||||
ED_object_iter_other(CTX_data_main(C), ob, true,
|
||||
ED_object_multires_update_totlevels_cb,
|
||||
&mmd->totlvl);
|
||||
|
||||
@ -1214,20 +1192,17 @@ static int multires_subdivide_exec(bContext *C, wmOperator *op)
|
||||
|
||||
if (!mmd)
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
multiresModifier_subdivide(mmd, ob, 0, mmd->simple);
|
||||
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
multiresModifier_subdivide(mmd, ob, 0, mmd->simple, eval_ctx.object_mode);
|
||||
|
||||
ED_object_iter_other(
|
||||
&eval_ctx, CTX_data_main(C), ob, true,
|
||||
ED_object_multires_update_totlevels_cb,
|
||||
&mmd->totlvl);
|
||||
ED_object_iter_other(CTX_data_main(C), ob, true,
|
||||
ED_object_multires_update_totlevels_cb,
|
||||
&mmd->totlvl);
|
||||
|
||||
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
|
||||
|
||||
if (eval_ctx.mode & OB_MODE_SCULPT) {
|
||||
if (ob->mode & OB_MODE_SCULPT) {
|
||||
/* ensure that grid paint mask layer is created */
|
||||
BKE_sculpt_mask_layers_ensure(ob, mmd);
|
||||
}
|
||||
@ -1264,11 +1239,8 @@ static int multires_reshape_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Object *ob = ED_object_active_context(C), *secondob = NULL;
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
EvaluationContext eval_ctx;
|
||||
MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
|
||||
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
if (!mmd)
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
@ -1291,6 +1263,9 @@ static int multires_reshape_exec(bContext *C, wmOperator *op)
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
if (!multiresModifier_reshape(&eval_ctx, scene, mmd, ob, secondob)) {
|
||||
BKE_report(op->reports, RPT_ERROR, "Objects do not have the same number of vertices");
|
||||
return OPERATOR_CANCELLED;
|
||||
@ -1441,9 +1416,8 @@ static int multires_base_apply_exec(bContext *C, wmOperator *op)
|
||||
|
||||
if (!mmd)
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
multiresModifier_base_apply(mmd, ob, workspace->object_mode);
|
||||
|
||||
multiresModifier_base_apply(mmd, ob);
|
||||
|
||||
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
|
||||
@ -1725,10 +1699,8 @@ static void skin_armature_bone_create(Object *skin_ob,
|
||||
}
|
||||
}
|
||||
|
||||
static Object *modifier_skin_armature_create(const bContext *C, Scene *scene, ViewLayer *view_layer, Object *skin_ob)
|
||||
static Object *modifier_skin_armature_create(const EvaluationContext *eval_ctx, Main *bmain, Scene *scene, Object *skin_ob)
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
EvaluationContext eval_ctx;
|
||||
BLI_bitmap *edges_visited;
|
||||
DerivedMesh *deform_dm;
|
||||
MVert *mvert;
|
||||
@ -1740,9 +1712,7 @@ static Object *modifier_skin_armature_create(const bContext *C, Scene *scene, Vi
|
||||
int *emap_mem;
|
||||
int v;
|
||||
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
deform_dm = mesh_get_derived_deform(&eval_ctx, scene, skin_ob, CD_MASK_BAREMESH);
|
||||
deform_dm = mesh_get_derived_deform(eval_ctx, scene, skin_ob, CD_MASK_BAREMESH);
|
||||
mvert = deform_dm->getVertArray(deform_dm);
|
||||
|
||||
/* add vertex weights to original mesh */
|
||||
@ -1752,7 +1722,7 @@ static Object *modifier_skin_armature_create(const bContext *C, Scene *scene, Vi
|
||||
NULL,
|
||||
me->totvert);
|
||||
|
||||
arm_ob = BKE_object_add(bmain, scene, view_layer, OB_ARMATURE, NULL);
|
||||
arm_ob = BKE_object_add(bmain, scene, eval_ctx->view_layer, OB_ARMATURE, NULL);
|
||||
BKE_object_transform_copy(arm_ob, skin_ob);
|
||||
arm = arm_ob->data;
|
||||
arm->layer = 1;
|
||||
@ -1811,7 +1781,6 @@ static int skin_armature_create_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Object *ob = CTX_data_active_object(C), *arm_ob;
|
||||
Mesh *me = ob->data;
|
||||
ModifierData *skin_md;
|
||||
@ -1822,8 +1791,11 @@ static int skin_armature_create_exec(bContext *C, wmOperator *op)
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
/* create new armature */
|
||||
arm_ob = modifier_skin_armature_create(C, scene, view_layer, ob);
|
||||
arm_ob = modifier_skin_armature_create(&eval_ctx, bmain, scene, ob);
|
||||
|
||||
/* add a modifier to connect the new armature to the mesh */
|
||||
arm_md = (ArmatureModifierData *)modifier_new(eModifierType_Armature);
|
||||
|
@ -286,9 +286,8 @@ void ED_operatormacros_object(void)
|
||||
|
||||
static int object_mode_poll(bContext *C)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = CTX_data_active_object(C);
|
||||
return (!ob || workspace->object_mode == OB_MODE_OBJECT);
|
||||
return (!ob || ob->mode == OB_MODE_OBJECT);
|
||||
}
|
||||
|
||||
void ED_keymap_object(wmKeyConfig *keyconf)
|
||||
|
@ -717,8 +717,7 @@ 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, eval_ctx.object_mode, NULL, eModifierType_Curve);
|
||||
md = ED_object_modifier_add(reports, bmain, scene, ob, NULL, eModifierType_Curve);
|
||||
if (md) {
|
||||
((CurveModifierData *)md)->object = par;
|
||||
}
|
||||
@ -729,8 +728,7 @@ 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, eval_ctx.object_mode, NULL, eModifierType_Lattice);
|
||||
md = ED_object_modifier_add(reports, bmain, scene, ob, NULL, eModifierType_Lattice);
|
||||
if (md) {
|
||||
((LatticeModifierData *)md)->object = par;
|
||||
}
|
||||
@ -738,8 +736,7 @@ 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, eval_ctx.object_mode, NULL, eModifierType_Armature);
|
||||
md = ED_object_modifier_add(reports, bmain, scene, ob, NULL, eModifierType_Armature);
|
||||
if (md) {
|
||||
((ArmatureModifierData *)md)->object = par;
|
||||
}
|
||||
@ -1428,7 +1425,6 @@ 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)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Main *bmain = CTX_data_main(C);
|
||||
const int type = RNA_enum_get(op->ptr, "type");
|
||||
Object *ob_src;
|
||||
@ -1513,7 +1509,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
|
||||
}
|
||||
break;
|
||||
case MAKE_LINKS_MODIFIERS:
|
||||
BKE_object_link_modifiers(ob_dst, ob_src, workspace->object_mode);
|
||||
BKE_object_link_modifiers(ob_dst, ob_src);
|
||||
DEG_id_tag_update(&ob_dst->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
|
||||
break;
|
||||
case MAKE_LINKS_FONTS:
|
||||
|
@ -123,51 +123,7 @@ 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);
|
||||
|
||||
wmWindowManager *wm = CTX_wm_manager(C);
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
|
||||
eObjectMode object_mode = workspace->object_mode;
|
||||
eObjectMode object_mode_set = OB_MODE_OBJECT;
|
||||
|
||||
if (base && ED_workspace_object_mode_in_other_window(
|
||||
wm, win, base->object,
|
||||
&object_mode_set))
|
||||
{
|
||||
/* Sync existing object mode with workspace. */
|
||||
workspace->object_mode = object_mode_set;
|
||||
view_layer->basact = base;
|
||||
}
|
||||
else {
|
||||
/* Apply the workspaces mode to the object (when possible). */
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *obact = base ? base->object : NULL;
|
||||
/* We don't know the previous active object in update.
|
||||
*
|
||||
* Not correct because it's possible other work-spaces use these.
|
||||
* although that's a corner case. */
|
||||
if (workspace->object_mode & OB_MODE_ALL_MODE_DATA) {
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
FOREACH_OBJECT_BEGIN(view_layer, ob) {
|
||||
if (ob != obact) {
|
||||
if (ED_object_mode_generic_has_data(&eval_ctx, ob) &&
|
||||
ED_workspace_object_mode_in_other_window(wm, win, ob, NULL) == false)
|
||||
{
|
||||
ED_object_mode_generic_exit(&eval_ctx, workspace, scene, ob);
|
||||
}
|
||||
}
|
||||
}
|
||||
FOREACH_OBJECT_END;
|
||||
}
|
||||
|
||||
workspace->object_mode = OB_MODE_OBJECT;
|
||||
|
||||
view_layer->basact = base;
|
||||
|
||||
ED_object_mode_generic_enter(C, object_mode);
|
||||
}
|
||||
view_layer->basact = base;
|
||||
|
||||
if (base) {
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, view_layer);
|
||||
@ -183,14 +139,13 @@ static int objects_selectable_poll(bContext *C)
|
||||
{
|
||||
/* we don't check for linked scenes here, selection is
|
||||
* still allowed then for inspection of scene */
|
||||
if (CTX_data_edit_object(C)) {
|
||||
return 0;
|
||||
}
|
||||
Object *obact = CTX_data_active_object(C);
|
||||
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
if (workspace->object_mode != OB_MODE_OBJECT) {
|
||||
if (CTX_data_edit_object(C))
|
||||
return 0;
|
||||
}
|
||||
if (obact && obact->mode)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,6 @@
|
||||
#include "DNA_mesh_types.h"
|
||||
#include "DNA_meshdata_types.h"
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_workspace_types.h"
|
||||
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_key.h"
|
||||
@ -226,20 +225,18 @@ static bool object_shape_key_mirror(bContext *C, Object *ob,
|
||||
|
||||
static int shape_key_mode_poll(bContext *C)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = ED_object_context(C);
|
||||
ID *data = (ob) ? ob->data : NULL;
|
||||
return (ob && !ID_IS_LINKED(ob) && data && !ID_IS_LINKED(data) && (workspace->object_mode != OB_MODE_EDIT));
|
||||
return (ob && !ID_IS_LINKED(ob) && data && !ID_IS_LINKED(data) && ob->mode != OB_MODE_EDIT);
|
||||
}
|
||||
|
||||
static int shape_key_mode_exists_poll(bContext *C)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = ED_object_context(C);
|
||||
ID *data = (ob) ? ob->data : NULL;
|
||||
|
||||
/* same as shape_key_mode_poll */
|
||||
return (ob && !ID_IS_LINKED(ob) && data && !ID_IS_LINKED(data) && (workspace->object_mode != OB_MODE_EDIT)) &&
|
||||
return (ob && !ID_IS_LINKED(ob) && data && !ID_IS_LINKED(data) && ob->mode != OB_MODE_EDIT) &&
|
||||
/* check a keyblock exists */
|
||||
(BKE_keyblock_from_object(ob) != NULL);
|
||||
}
|
||||
@ -247,13 +244,12 @@ static int shape_key_mode_exists_poll(bContext *C)
|
||||
static int shape_key_move_poll(bContext *C)
|
||||
{
|
||||
/* Same as shape_key_mode_exists_poll above, but ensure we have at least two shapes! */
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = ED_object_context(C);
|
||||
ID *data = (ob) ? ob->data : NULL;
|
||||
Key *key = BKE_key_from_object(ob);
|
||||
|
||||
return (ob && !ID_IS_LINKED(ob) && data && !ID_IS_LINKED(data) &&
|
||||
(workspace->object_mode != OB_MODE_EDIT) && key && key->totkey > 1);
|
||||
ob->mode != OB_MODE_EDIT && key && key->totkey > 1);
|
||||
}
|
||||
|
||||
static int shape_key_poll(bContext *C)
|
||||
|
@ -245,7 +245,6 @@ static int object_clear_transform_generic_exec(bContext *C, wmOperator *op,
|
||||
void (*clear_func)(Object *, const bool),
|
||||
const char default_ksName[])
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
KeyingSet *ks;
|
||||
const bool clear_delta = RNA_boolean_get(op->ptr, "clear_delta");
|
||||
@ -264,7 +263,7 @@ static int object_clear_transform_generic_exec(bContext *C, wmOperator *op,
|
||||
*/
|
||||
CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
|
||||
{
|
||||
if (!(workspace->object_mode & OB_MODE_WEIGHT_PAINT)) {
|
||||
if (!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
|
||||
/* run provided clearing function */
|
||||
clear_func(ob, clear_delta);
|
||||
|
||||
|
@ -85,9 +85,9 @@
|
||||
#include "object_intern.h"
|
||||
|
||||
/************************ Exported Functions **********************/
|
||||
static bool vertex_group_use_vert_sel(const Object *ob)
|
||||
static bool vertex_group_use_vert_sel(Object *ob)
|
||||
{
|
||||
if (BKE_object_is_in_editmode(ob)) {
|
||||
if (ob->mode == OB_MODE_EDIT) {
|
||||
return true;
|
||||
}
|
||||
else if (ob->type == OB_MESH && ((Mesh *)ob->data)->editflag & ME_EDIT_PAINT_VERT_SEL) {
|
||||
@ -108,15 +108,13 @@ static Lattice *vgroup_edit_lattice(Object *ob)
|
||||
bool ED_vgroup_sync_from_pose(Object *ob)
|
||||
{
|
||||
Object *armobj = BKE_object_pose_armature_get(ob);
|
||||
if (armobj) {
|
||||
if (armobj && (armobj->mode & OB_MODE_POSE)) {
|
||||
struct bArmature *arm = armobj->data;
|
||||
if (arm->flag & ARM_POSEMODE) {
|
||||
if (arm->act_bone) {
|
||||
int def_num = defgroup_name_index(ob, arm->act_bone->name);
|
||||
if (def_num != -1) {
|
||||
ob->actdef = def_num + 1;
|
||||
return true;
|
||||
}
|
||||
if (arm->act_bone) {
|
||||
int def_num = defgroup_name_index(ob, arm->act_bone->name);
|
||||
if (def_num != -1) {
|
||||
ob->actdef = def_num + 1;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2550,13 +2548,12 @@ static int vertex_group_vert_poll_ex(bContext *C, const bool needs_select, const
|
||||
return false;
|
||||
}
|
||||
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
if (BKE_object_is_in_editmode_vgroup(ob)) {
|
||||
return true;
|
||||
}
|
||||
else if (workspace->object_mode & OB_MODE_WEIGHT_PAINT) {
|
||||
else if (ob->mode & OB_MODE_WEIGHT_PAINT) {
|
||||
if (needs_select) {
|
||||
if (BKE_object_is_in_wpaint_select_vert(ob, workspace->object_mode)) {
|
||||
if (BKE_object_is_in_wpaint_select_vert(ob)) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
@ -2608,9 +2605,8 @@ static int vertex_group_vert_select_unlocked_poll(bContext *C)
|
||||
if (!(ob && !ID_IS_LINKED(ob) && data && !ID_IS_LINKED(data)))
|
||||
return 0;
|
||||
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
if (!(BKE_object_is_in_editmode_vgroup(ob) ||
|
||||
BKE_object_is_in_wpaint_select_vert(ob, workspace->object_mode)))
|
||||
BKE_object_is_in_wpaint_select_vert(ob)))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@ -2636,9 +2632,8 @@ static int vertex_group_vert_select_mesh_poll(bContext *C)
|
||||
if (ob->type != OB_MESH)
|
||||
return 0;
|
||||
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
return (BKE_object_is_in_editmode_vgroup(ob) ||
|
||||
BKE_object_is_in_wpaint_select_vert(ob, workspace->object_mode));
|
||||
BKE_object_is_in_wpaint_select_vert(ob));
|
||||
}
|
||||
|
||||
static int vertex_group_add_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
@ -3522,8 +3517,7 @@ static char *vgroup_init_remap(Object *ob)
|
||||
return name_array;
|
||||
}
|
||||
|
||||
static int vgroup_do_remap(
|
||||
const EvaluationContext *eval_ctx, Object *ob, const char *name_array, wmOperator *op)
|
||||
static int vgroup_do_remap(Object *ob, const char *name_array, wmOperator *op)
|
||||
{
|
||||
MDeformVert *dvert = NULL;
|
||||
bDeformGroup *def;
|
||||
@ -3544,7 +3538,7 @@ static int vgroup_do_remap(
|
||||
BLI_assert(sort_map[i] != -1);
|
||||
}
|
||||
|
||||
if (eval_ctx->object_mode == OB_MODE_EDIT) {
|
||||
if (ob->mode == OB_MODE_EDIT) {
|
||||
if (ob->type == OB_MESH) {
|
||||
BMEditMesh *em = BKE_editmesh_from_object(ob);
|
||||
const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
|
||||
@ -3642,8 +3636,6 @@ enum {
|
||||
|
||||
static int vertex_group_sort_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Object *ob = ED_object_context(C);
|
||||
char *name_array;
|
||||
int ret;
|
||||
@ -3663,7 +3655,7 @@ static int vertex_group_sort_exec(bContext *C, wmOperator *op)
|
||||
}
|
||||
|
||||
/*remap vgroup data to map to correct names*/
|
||||
ret = vgroup_do_remap(&eval_ctx, ob, name_array, op);
|
||||
ret = vgroup_do_remap(ob, name_array, op);
|
||||
|
||||
if (ret != OPERATOR_CANCELLED) {
|
||||
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
|
||||
@ -3699,8 +3691,6 @@ void OBJECT_OT_vertex_group_sort(wmOperatorType *ot)
|
||||
|
||||
static int vgroup_move_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
Object *ob = ED_object_context(C);
|
||||
bDeformGroup *def;
|
||||
char *name_array;
|
||||
@ -3715,7 +3705,7 @@ static int vgroup_move_exec(bContext *C, wmOperator *op)
|
||||
name_array = vgroup_init_remap(ob);
|
||||
|
||||
if (BLI_listbase_link_move(&ob->defbase, def, dir)) {
|
||||
ret = vgroup_do_remap(&eval_ctx, ob, name_array, op);
|
||||
ret = vgroup_do_remap(ob, name_array, op);
|
||||
|
||||
if (ret != OPERATOR_CANCELLED) {
|
||||
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
|
||||
|
@ -42,7 +42,6 @@
|
||||
#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_2d.h"
|
||||
@ -93,12 +92,10 @@
|
||||
|
||||
int PE_poll(bContext *C)
|
||||
{
|
||||
const 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);
|
||||
|
||||
if (!scene || !view_layer || !ob || !(workspace->object_mode & OB_MODE_PARTICLE_EDIT)) {
|
||||
if (!scene || !ob || !(ob->mode & OB_MODE_PARTICLE_EDIT)) {
|
||||
return 0;
|
||||
}
|
||||
return (PE_get_current(scene, ob) != NULL);
|
||||
@ -106,12 +103,11 @@ int PE_poll(bContext *C)
|
||||
|
||||
int PE_hair_poll(bContext *C)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
Object *ob= CTX_data_active_object(C);
|
||||
PTCacheEdit *edit;
|
||||
|
||||
if (!scene || !ob || !(workspace->object_mode & OB_MODE_PARTICLE_EDIT)) {
|
||||
if (!scene || !ob || !(ob->mode & OB_MODE_PARTICLE_EDIT)) {
|
||||
return 0;
|
||||
}
|
||||
edit= PE_get_current(scene, ob);
|
||||
@ -295,7 +291,7 @@ PTCacheEdit *PE_create_current(const EvaluationContext *eval_ctx, Scene *scene,
|
||||
|
||||
void PE_current_changed(const EvaluationContext *eval_ctx, Scene *scene, Object *ob)
|
||||
{
|
||||
if (eval_ctx->object_mode == OB_MODE_PARTICLE_EDIT) {
|
||||
if (ob->mode == OB_MODE_PARTICLE_EDIT) {
|
||||
PE_create_current(eval_ctx, scene, ob);
|
||||
}
|
||||
}
|
||||
@ -4459,25 +4455,23 @@ static int particle_edit_toggle_poll(bContext *C)
|
||||
|
||||
static int particle_edit_toggle_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
wmWindowManager *wm = CTX_wm_manager(C);
|
||||
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 = (eval_ctx.object_mode & mode_flag) != 0;
|
||||
const bool is_mode_set = (ob->mode & mode_flag) != 0;
|
||||
|
||||
if (!is_mode_set) {
|
||||
if (!ED_object_mode_compat_set(C, workspace, mode_flag, op->reports)) {
|
||||
if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_mode_set) {
|
||||
PTCacheEdit *edit;
|
||||
EvaluationContext eval_ctx;
|
||||
CTX_data_eval_ctx(C, &eval_ctx);
|
||||
|
||||
workspace->object_mode |= mode_flag;
|
||||
ob->mode |= mode_flag;
|
||||
edit= PE_create_current(&eval_ctx, scene, ob);
|
||||
|
||||
/* mesh may have changed since last entering editmode.
|
||||
@ -4489,12 +4483,12 @@ static int particle_edit_toggle_exec(bContext *C, wmOperator *op)
|
||||
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_PARTICLE, NULL);
|
||||
}
|
||||
else {
|
||||
workspace->object_mode &= ~mode_flag;
|
||||
ob->mode &= ~mode_flag;
|
||||
toggle_particle_cursor(C, 0);
|
||||
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL);
|
||||
}
|
||||
|
||||
ED_workspace_object_mode_sync_from_object(wm, workspace, ob);
|
||||
// ED_workspace_object_mode_sync_from_object(wm, workspace, ob);
|
||||
|
||||
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
|
||||
|
||||
|
@ -110,25 +110,23 @@ 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);
|
||||
eObjectMode mode_orig;
|
||||
int mode_orig;
|
||||
|
||||
if (!scene || !ob)
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
mode_orig = workspace->object_mode;
|
||||
mode_orig = ob->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 ((workspace->object_mode & OB_MODE_PARTICLE_EDIT) == 0) {
|
||||
if ((ob->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);
|
||||
}
|
||||
}
|
||||
|
@ -99,7 +99,6 @@
|
||||
|
||||
static int material_slot_add_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = ED_object_context(C);
|
||||
|
||||
if (!ob)
|
||||
@ -107,7 +106,7 @@ static int material_slot_add_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
|
||||
BKE_object_material_slot_add(ob);
|
||||
|
||||
if (workspace->object_mode & OB_MODE_TEXTURE_PAINT) {
|
||||
if (ob->mode & OB_MODE_TEXTURE_PAINT) {
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_TOOLSETTINGS, NULL);
|
||||
@ -137,7 +136,6 @@ void OBJECT_OT_material_slot_add(wmOperatorType *ot)
|
||||
|
||||
static int material_slot_remove_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = ED_object_context(C);
|
||||
|
||||
if (!ob)
|
||||
@ -151,7 +149,7 @@ static int material_slot_remove_exec(bContext *C, wmOperator *op)
|
||||
|
||||
BKE_object_material_slot_remove(ob);
|
||||
|
||||
if (workspace->object_mode & OB_MODE_TEXTURE_PAINT) {
|
||||
if (ob->mode & OB_MODE_TEXTURE_PAINT) {
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_TOOLSETTINGS, NULL);
|
||||
|
@ -401,12 +401,10 @@ 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, object_mode);
|
||||
BKE_paint_invalidate_overlay_tex(scene, view_layer, tex);
|
||||
}
|
||||
}
|
||||
|
||||
@ -526,23 +524,11 @@ 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->type == OB_MESH) {
|
||||
BKE_texpaint_slots_refresh_object(scene, ob);
|
||||
BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
|
||||
GPU_drawobject_free(ob->derivedFinal);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -572,10 +558,8 @@ 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);
|
||||
|
@ -122,21 +122,23 @@ static ViewLayer *scene_change_get_new_view_layer(const WorkSpace *workspace, co
|
||||
|
||||
void ED_scene_change_update(
|
||||
Main *bmain, bContext *C,
|
||||
wmWindow *win, const bScreen *screen, Scene *scene_old, Scene *scene_new)
|
||||
wmWindow *win, const bScreen *screen, Scene *UNUSED(scene_old), Scene *scene_new)
|
||||
{
|
||||
WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
ViewLayer *layer_new = scene_change_get_new_view_layer(workspace, scene_new);
|
||||
Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene_new, layer_new, true);
|
||||
Object *obact_new = OBACT(layer_new);
|
||||
UNUSED_VARS(obact_new);
|
||||
|
||||
#if 0
|
||||
/* mode syncing */
|
||||
EvaluationContext eval_ctx_old;
|
||||
CTX_data_eval_ctx(C, &eval_ctx_old);
|
||||
eObjectMode object_mode_old = workspace->object_mode;
|
||||
ViewLayer *layer_old = BKE_view_layer_from_workspace_get(scene_old, workspace);
|
||||
Object *obact_old = OBACT(layer_old);
|
||||
bool obact_new_mode_exists = ED_object_mode_generic_exists(bmain->wm.first, obact_new, workspace->object_mode);
|
||||
|
||||
UNUSED_VARS(obact_old, object_mode_old);
|
||||
#endif
|
||||
|
||||
win->scene = scene_new;
|
||||
CTX_data_scene_set(C, scene_new);
|
||||
@ -145,19 +147,6 @@ void ED_scene_change_update(
|
||||
DEG_graph_relations_update(depsgraph, bmain, scene_new, layer_new);
|
||||
DEG_on_visible_update(bmain, false);
|
||||
|
||||
if (obact_new == obact_old) {
|
||||
/* pass */
|
||||
}
|
||||
else {
|
||||
ED_object_mode_generic_exit_or_other_window(&eval_ctx_old, bmain->wm.first, workspace, scene_old, obact_old);
|
||||
if (obact_new_mode_exists) {
|
||||
workspace->object_mode = object_mode_old;
|
||||
}
|
||||
else {
|
||||
ED_object_mode_generic_enter_or_other_window(C, win, object_mode_old);
|
||||
}
|
||||
}
|
||||
|
||||
ED_screen_update_after_scene_change(screen, scene_new, layer_new);
|
||||
ED_render_engine_changed(bmain);
|
||||
ED_update_for_newframe(bmain, scene_new, layer_new, depsgraph);
|
||||
|
@ -93,6 +93,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
|
||||
WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook);
|
||||
ViewLayer *view_layer = BKE_view_layer_from_workspace_get(scene, workspace);
|
||||
Object *obact = (view_layer && view_layer->basact) ? view_layer->basact->object : NULL;
|
||||
Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
|
||||
|
||||
if (CTX_data_dir(member)) {
|
||||
CTX_data_dir_set(result, screen_context_dir);
|
||||
@ -203,7 +204,6 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
|
||||
return 1;
|
||||
}
|
||||
else if (CTX_data_equals(member, "visible_bones") || CTX_data_equals(member, "editable_bones")) {
|
||||
Object *obedit = BKE_workspace_edit_object(workspace, scene);
|
||||
bArmature *arm = (obedit && obedit->type == OB_ARMATURE) ? obedit->data : NULL;
|
||||
EditBone *ebone, *flipbone = NULL;
|
||||
const bool editable_bones = CTX_data_equals(member, "editable_bones");
|
||||
@ -246,7 +246,6 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
|
||||
}
|
||||
}
|
||||
else if (CTX_data_equals(member, "selected_bones") || CTX_data_equals(member, "selected_editable_bones")) {
|
||||
Object *obedit = BKE_workspace_edit_object(workspace, scene);
|
||||
bArmature *arm = (obedit && obedit->type == OB_ARMATURE) ? obedit->data : NULL;
|
||||
EditBone *ebone, *flipbone = NULL;
|
||||
const bool selected_editable_bones = CTX_data_equals(member, "selected_editable_bones");
|
||||
@ -368,38 +367,37 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
|
||||
}
|
||||
else if (CTX_data_equals(member, "edit_object")) {
|
||||
/* convenience for now, 1 object per scene in editmode */
|
||||
Object *obedit = BKE_workspace_edit_object(workspace, scene);
|
||||
if (obedit)
|
||||
CTX_data_id_pointer_set(result, &obedit->id);
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if (CTX_data_equals(member, "sculpt_object")) {
|
||||
if (obact && (workspace->object_mode & OB_MODE_SCULPT)) {
|
||||
if (obact && (obact->mode & OB_MODE_SCULPT))
|
||||
CTX_data_id_pointer_set(result, &obact->id);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if (CTX_data_equals(member, "vertex_paint_object")) {
|
||||
if (obact && (workspace->object_mode & OB_MODE_VERTEX_PAINT))
|
||||
if (obact && (obact->mode & OB_MODE_VERTEX_PAINT))
|
||||
CTX_data_id_pointer_set(result, &obact->id);
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if (CTX_data_equals(member, "weight_paint_object")) {
|
||||
if (obact && (workspace->object_mode & OB_MODE_WEIGHT_PAINT))
|
||||
if (obact && (obact->mode & OB_MODE_WEIGHT_PAINT))
|
||||
CTX_data_id_pointer_set(result, &obact->id);
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if (CTX_data_equals(member, "image_paint_object")) {
|
||||
if (obact && (workspace->object_mode & OB_MODE_TEXTURE_PAINT))
|
||||
if (obact && (obact->mode & OB_MODE_TEXTURE_PAINT))
|
||||
CTX_data_id_pointer_set(result, &obact->id);
|
||||
|
||||
return 1;
|
||||
}
|
||||
else if (CTX_data_equals(member, "particle_edit_object")) {
|
||||
if (obact && (workspace->object_mode & OB_MODE_PARTICLE_EDIT))
|
||||
if (obact && (obact->mode & OB_MODE_PARTICLE_EDIT))
|
||||
CTX_data_id_pointer_set(result, &obact->id);
|
||||
|
||||
return 1;
|
||||
|
@ -153,7 +153,6 @@ int ED_operator_scene_editable(bContext *C)
|
||||
|
||||
int ED_operator_objectmode(bContext *C)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Object *obact = CTX_data_active_object(C);
|
||||
|
||||
@ -163,7 +162,7 @@ int ED_operator_objectmode(bContext *C)
|
||||
return 0;
|
||||
|
||||
/* add a check for ob->mode too? */
|
||||
if (obact && (workspace->object_mode != OB_MODE_OBJECT))
|
||||
if (obact && (obact->mode != OB_MODE_OBJECT))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
@ -305,39 +304,35 @@ int ED_operator_console_active(bContext *C)
|
||||
return ed_spacetype_test(C, SPACE_CONSOLE);
|
||||
}
|
||||
|
||||
static int ed_object_hidden(Object *ob, eObjectMode object_mode)
|
||||
static int ed_object_hidden(Object *ob)
|
||||
{
|
||||
/* if hidden but in edit mode, we still display, can happen with animation */
|
||||
return ((ob->restrictflag & OB_RESTRICT_VIEW) && !(object_mode & OB_MODE_EDIT));
|
||||
return ((ob->restrictflag & OB_RESTRICT_VIEW) && !(ob->mode & OB_MODE_EDIT));
|
||||
}
|
||||
|
||||
int ED_operator_object_active(bContext *C)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
return ((ob != NULL) && !ed_object_hidden(ob, workspace->object_mode));
|
||||
return ((ob != NULL) && !ed_object_hidden(ob));
|
||||
}
|
||||
|
||||
int ED_operator_object_active_editable(bContext *C)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
return ((ob != NULL) && !ID_IS_LINKED(ob) && !ed_object_hidden(ob, workspace->object_mode));
|
||||
return ((ob != NULL) && !ID_IS_LINKED(ob) && !ed_object_hidden(ob));
|
||||
}
|
||||
|
||||
int ED_operator_object_active_editable_mesh(bContext *C)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
return ((ob != NULL) && !ID_IS_LINKED(ob) && !ed_object_hidden(ob, workspace->object_mode) &&
|
||||
return ((ob != NULL) && !ID_IS_LINKED(ob) && !ed_object_hidden(ob) &&
|
||||
(ob->type == OB_MESH) && !ID_IS_LINKED(ob->data));
|
||||
}
|
||||
|
||||
int ED_operator_object_active_editable_font(bContext *C)
|
||||
{
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
Object *ob = ED_object_active_context(C);
|
||||
return ((ob != NULL) && !ID_IS_LINKED(ob) && !ed_object_hidden(ob, workspace->object_mode) &&
|
||||
return ((ob != NULL) && !ID_IS_LINKED(ob) && !ed_object_hidden(ob) &&
|
||||
(ob->type == OB_FONT));
|
||||
}
|
||||
|
||||
@ -382,14 +377,11 @@ int ED_operator_posemode_exclusive(bContext *C)
|
||||
{
|
||||
Object *obact = CTX_data_active_object(C);
|
||||
|
||||
if (obact) {
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
if ((workspace->object_mode & OB_MODE_EDIT) == 0) {
|
||||
Object *obpose;
|
||||
if ((obpose = BKE_object_pose_armature_get(obact))) {
|
||||
if (obact == obpose) {
|
||||
return 1;
|
||||
}
|
||||
if (obact && !(obact->mode & OB_MODE_EDIT)) {
|
||||
Object *obpose;
|
||||
if ((obpose = BKE_object_pose_armature_get(obact))) {
|
||||
if (obact == obpose) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -403,15 +395,9 @@ int ED_operator_posemode_context(bContext *C)
|
||||
{
|
||||
Object *obpose = ED_pose_object_from_context(C);
|
||||
|
||||
if (obpose) {
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
/* TODO, should we allow this out of pose mode? */
|
||||
if (workspace->object_mode & OB_MODE_POSE) {
|
||||
// if ((workspace->object_mode & OB_MODE_EDIT) == 0) {
|
||||
if (BKE_object_pose_context_check(obpose)) {
|
||||
return 1;
|
||||
}
|
||||
// }
|
||||
if (obpose && !(obpose->mode & OB_MODE_EDIT)) {
|
||||
if (BKE_object_pose_context_check(obpose)) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -422,17 +408,11 @@ int ED_operator_posemode(bContext *C)
|
||||
{
|
||||
Object *obact = CTX_data_active_object(C);
|
||||
|
||||
|
||||
if (obact) {
|
||||
const WorkSpace *workspace = CTX_wm_workspace(C);
|
||||
if ((workspace->object_mode & OB_MODE_EDIT) == 0) {
|
||||
Object *obpose;
|
||||
if ((obpose = BKE_object_pose_armature_get(obact))) {
|
||||
if (((workspace->object_mode & OB_MODE_POSE) && (obact == obpose)) ||
|
||||
(workspace->object_mode & OB_MODE_WEIGHT_PAINT))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if (obact && !(obact->mode & OB_MODE_EDIT)) {
|
||||
Object *obpose;
|
||||
if ((obpose = BKE_object_pose_armature_get(obact))) {
|
||||
if ((obact == obpose) || (obact->mode & OB_MODE_WEIGHT_PAINT)) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -568,10 +548,9 @@ 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, workspace, view_layer);
|
||||
return ED_space_image_check_show_maskedit(sima, view_layer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -85,6 +85,26 @@ WorkSpace *ED_workspace_add(
|
||||
return workspace;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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)
|
||||
{
|
||||
UNUSED_VARS(workspace_old, workspace_new, C, ob_act, reports);
|
||||
#if 0
|
||||
eObjectMode mode_old = workspace_old->object_mode;
|
||||
eObjectMode mode_new = workspace_new->object_mode;
|
||||
|
||||
if (mode_old != mode_new) {
|
||||
ED_object_mode_compat_set(C, ob_act, mode_new, reports);
|
||||
ED_object_mode_toggle(C, mode_new);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void workspace_change_update_view_layer(
|
||||
WorkSpace *workspace_new, const WorkSpace *workspace_old,
|
||||
Scene *scene)
|
||||
@ -96,10 +116,11 @@ static void workspace_change_update_view_layer(
|
||||
|
||||
static void workspace_change_update(
|
||||
WorkSpace *workspace_new, const WorkSpace *workspace_old,
|
||||
bContext *C)
|
||||
bContext *C, wmWindowManager *wm)
|
||||
{
|
||||
/* needs to be done before changing mode! (to ensure right context) */
|
||||
workspace_change_update_view_layer(workspace_new, workspace_old, CTX_data_scene(C));
|
||||
workspace_change_update_mode(workspace_old, workspace_new, C, CTX_data_active_object(C), &wm->reports);
|
||||
}
|
||||
|
||||
static bool workspace_change_find_new_layout_cb(const WorkSpaceLayout *layout, void *UNUSED(arg))
|
||||
@ -151,7 +172,7 @@ static WorkSpaceLayout *workspace_change_get_new_layout(
|
||||
* \returns if workspace changing was successful.
|
||||
*/
|
||||
bool ED_workspace_change(
|
||||
WorkSpace *workspace_new, bContext *C, wmWindow *win)
|
||||
WorkSpace *workspace_new, bContext *C, wmWindowManager *wm, wmWindow *win)
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
WorkSpace *workspace_old = WM_window_get_active_workspace(win);
|
||||
@ -169,20 +190,11 @@ bool ED_workspace_change(
|
||||
BLI_assert(BKE_workspace_layout_screen_get(layout_new) == screen_new);
|
||||
|
||||
if (screen_new) {
|
||||
Scene *scene = WM_window_get_active_scene(win);
|
||||
bool use_object_mode = false;
|
||||
|
||||
/* Store old context for exiting edit-mode. */
|
||||
EvaluationContext eval_ctx_old;
|
||||
CTX_data_eval_ctx(C, &eval_ctx_old);
|
||||
|
||||
|
||||
WM_window_set_active_layout(win, workspace_new, layout_new);
|
||||
WM_window_set_active_workspace(win, workspace_new);
|
||||
|
||||
/* update screen *after* changing workspace - which also causes the actual screen change */
|
||||
screen_change_update(C, win, screen_new);
|
||||
workspace_change_update(workspace_new, workspace_old, C);
|
||||
workspace_change_update(workspace_new, workspace_old, C, wm);
|
||||
|
||||
BLI_assert(BKE_workspace_view_layer_get(workspace_new, CTX_data_scene(C)) != NULL);
|
||||
BLI_assert(CTX_wm_workspace(C) == workspace_new);
|
||||
@ -190,40 +202,6 @@ bool ED_workspace_change(
|
||||
WM_toolsystem_unlink(C, workspace_old);
|
||||
WM_toolsystem_link(C, workspace_new);
|
||||
|
||||
ViewLayer *view_layer_old = BKE_workspace_view_layer_get(workspace_old, scene);
|
||||
Object *obact_old = OBACT(view_layer_old);
|
||||
|
||||
ViewLayer *view_layer_new = BKE_workspace_view_layer_get(workspace_new, scene);
|
||||
Object *obact_new = OBACT(view_layer_new);
|
||||
|
||||
/* Handle object mode switching */
|
||||
if ((workspace_old->object_mode != OB_MODE_OBJECT) ||
|
||||
(workspace_new->object_mode != OB_MODE_OBJECT))
|
||||
{
|
||||
if ((workspace_old->object_mode == workspace_new->object_mode) &&
|
||||
(obact_old == obact_new))
|
||||
{
|
||||
/* pass */
|
||||
}
|
||||
else {
|
||||
use_object_mode = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (use_object_mode) {
|
||||
/* weak, set it back so it's used when activating again. */
|
||||
eObjectMode object_mode = workspace_old->object_mode;
|
||||
ED_object_mode_generic_exit_or_other_window(&eval_ctx_old, bmain->wm.first, workspace_old, scene, obact_old);
|
||||
workspace_old->object_mode = object_mode;
|
||||
ED_workspace_object_mode_sync_from_object(bmain->wm.first, workspace_old, obact_old);
|
||||
ED_object_mode_generic_enter_or_other_window(C, NULL, workspace_new->object_mode);
|
||||
}
|
||||
else {
|
||||
if (obact_new == NULL) {
|
||||
workspace_new->object_mode = OB_MODE_OBJECT;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -250,7 +228,6 @@ WorkSpace *ED_workspace_duplicate(
|
||||
BLI_duplicatelist(transform_orientations_new, transform_orientations_old);
|
||||
|
||||
workspace_new->tool = workspace_old->tool;
|
||||
workspace_new->object_mode = workspace_old->object_mode;
|
||||
|
||||
for (WorkSpaceLayout *layout_old = layouts_old->first; layout_old; layout_old = layout_old->next) {
|
||||
WorkSpaceLayout *layout_new = ED_workspace_layout_duplicate(workspace_new, layout_old, win);
|
||||
@ -278,7 +255,7 @@ bool ED_workspace_delete(
|
||||
WorkSpace *prev = workspace_id->prev;
|
||||
WorkSpace *next = workspace_id->next;
|
||||
|
||||
ED_workspace_change((prev != NULL) ? prev : next, C, win);
|
||||
ED_workspace_change((prev != NULL) ? prev : next, C, wm, win);
|
||||
}
|
||||
BKE_libblock_free(bmain, workspace_id);
|
||||
|
||||
@ -307,63 +284,6 @@ void ED_workspace_view_layer_unset(
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* When a work-space mode has changed,
|
||||
* flush it to all other visible work-spaces using the same object
|
||||
* since we don't support one object being in two different modes at once.
|
||||
* \note We could support this but it's more trouble than it's worth.
|
||||
*/
|
||||
|
||||
void ED_workspace_object_mode_sync_from_object(wmWindowManager *wm, WorkSpace *workspace, Object *obact)
|
||||
{
|
||||
if (obact == NULL) {
|
||||
return;
|
||||
}
|
||||
for (wmWindow *win = wm->windows.first; win; win = win->next) {
|
||||
WorkSpace *workspace_iter = BKE_workspace_active_get(win->workspace_hook);
|
||||
if ((workspace != workspace_iter) && (workspace->object_mode != workspace_iter->object_mode)) {
|
||||
Scene *scene_iter = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = BKE_view_layer_from_workspace_get(scene_iter, workspace_iter);
|
||||
if (obact == OBACT(view_layer)) {
|
||||
workspace_iter->object_mode = workspace->object_mode;
|
||||
/* TODO(campbell), use msgbus */
|
||||
WM_main_add_notifier(NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene_iter);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ED_workspace_object_mode_sync_from_scene(wmWindowManager *wm, WorkSpace *workspace, Scene *scene)
|
||||
{
|
||||
ViewLayer *view_layer = BKE_workspace_view_layer_get(workspace, scene);
|
||||
if (view_layer) {
|
||||
Object *obact = OBACT(view_layer);
|
||||
ED_workspace_object_mode_sync_from_object(wm, workspace, obact);
|
||||
}
|
||||
}
|
||||
|
||||
bool ED_workspace_object_mode_in_other_window(
|
||||
struct wmWindowManager *wm, const wmWindow *win_compare, Object *obact,
|
||||
eObjectMode *r_object_mode)
|
||||
{
|
||||
for (wmWindow *win_iter = wm->windows.first; win_iter; win_iter = win_iter->next) {
|
||||
if (win_compare != win_iter) {
|
||||
WorkSpace *workspace_iter = BKE_workspace_active_get(win_iter->workspace_hook);
|
||||
Scene *scene_iter = WM_window_get_active_scene(win_iter);
|
||||
ViewLayer *view_layer_iter = BKE_view_layer_from_workspace_get(scene_iter, workspace_iter);
|
||||
Object *obact_iter = OBACT(view_layer_iter);
|
||||
if (obact == obact_iter) {
|
||||
if (r_object_mode) {
|
||||
*r_object_mode = workspace_iter->object_mode;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/** \} Workspace API */
|
||||
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user