Update for Depsgraph API changes

Addresses new behavior of object.to_mesh().

This is corresponding part for D4875.

Reviewers: brecht

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D4876
This commit is contained in:
Sergey Sharybin 2019-05-16 15:01:17 +02:00
parent 2e5b7a4a04
commit 901868a4b2
29 changed files with 152 additions and 61 deletions

View File

@ -439,12 +439,13 @@ def bvhtree_from_object(ob):
bm = bmesh.new()
depsgraph = context.evaluated_depsgraph_get()
mesh = ob.evaluated_get(depsgraph).to_mesh()
ob_eval = ob.evaluated_get(depsgraph)
mesh = ob_eval.to_mesh()
bm.from_mesh(mesh)
bm.transform(ob.matrix_world)
bvhtree = BVHTree.FromBMesh(bm)
bpy.data.meshes.remove(mesh)
ob_eval.to_mesh_clear()
return bvhtree
def check_mesh_faces(ob):

View File

@ -71,7 +71,8 @@ def extract_mapped_coords(ob, shape_verts):
totvert = len(shape_verts)
depsgraph = context.evaluated_depsgraph_get()
mesh = ob.evaluated_get(depsgraph).to_mesh()
ob_eval = ob.evaluated_get(depsgraph)
mesh = ob_eval.to_mesh()
# cheating, the original mapped verts happen
# to be at the end of the vertex array
@ -79,7 +80,7 @@ def extract_mapped_coords(ob, shape_verts):
arr = [verts[i].co.copy() for i in range(len(verts) - totvert, len(verts))]
mesh.user_clear()
bpy.data.meshes.remove(mesh)
ob_eval.to_mesh_clear()
return arr
@ -203,7 +204,7 @@ class add_corrective_pose_shape(bpy.types.Operator):
def func_object_duplicate_flatten_modifiers(context, obj):
depsgraph = context.evaluated_depsgraph_get()
mesh = obj.evaluated_get(depsgraph).to_mesh()
mesh = bpy.data.meshes.new_from_object(obj.evaluated_get(depsgraph))
name = obj.name + "_clean"
new_object = bpy.data.objects.new(name, mesh)
new_object.data = mesh

View File

@ -204,9 +204,11 @@ def check_meshprops(props, obs):
for ob in obs:
if ob.type == 'MESH' or ob.type == 'CURVE':
ob_eval = None
if ob.type == 'CURVE':
depsgraph = bpy.context.evaluated_depsgraph_get()
mesh = ob.evaluated_get(depsgraph).to_mesh()
ob_eval = ob.evaluated_get(depsgraph)
mesh = ob_eval.to_mesh()
else:
mesh = ob.data
fco = len(mesh.polygons)
@ -244,6 +246,9 @@ def check_meshprops(props, obs):
fcor *= m.ratio
fcr += fcor
if ob_eval:
ob_eval.to_mesh_clear()
# write out props
props.face_count = fc
props.face_count_render = fcr

View File

@ -1242,8 +1242,10 @@ class AssetBarOperator(bpy.types.Operator):
target_object = object.name
# create final mesh to extract correct material slot
depsgraph = bpy.context.evaluated_depsgraph_get()
temp_mesh = object.evaluated_get(depsgraph).to_mesh()
object_eval = object.evaluated_get(depsgraph)
temp_mesh = object_eval.to_mesh()
target_slot = temp_mesh.polygons[face_index].material_index
object_eval.to_mesh_clear()
else:
self.report({'WARNING'}, "Invalid or library object as input:")
target_object = ''

View File

@ -301,7 +301,8 @@ def get_bounds_snappable(obs, use_modifiers=False):
# If to_mesh() works we can use it on curves and any other ob type almost.
# disabled to_mesh for 2.8 by now, not wanting to use dependency graph yet.
depsgraph = bpy.context.evaluated_depsgraph_get()
mesh = ob.evaluated_get(depsgraph).to_mesh()
object_eval = ob.evaluated_get(depsgraph)
mesh = object_eval.to_mesh()
# if self.applyModifiers:
# evaluated_get(depsgraph).to_mesh()
@ -318,7 +319,8 @@ def get_bounds_snappable(obs, use_modifiers=False):
maxx = max(maxx, parent_coord.x)
maxy = max(maxy, parent_coord.y)
maxz = max(maxz, parent_coord.z)
# bpy.data.meshes.remove(mesh)
object_eval.to_mesh_clear()
if obcount == 0:
minx, miny, minz, maxx, maxy, maxz = 0, 0, 0, 0, 0, 0
@ -344,7 +346,8 @@ def get_bounds_worldspace(obs, use_modifiers=False):
mw = ob.matrix_world
if ob.type == 'MESH' or ob.type == 'CURVE':
depsgraph = bpy.context.evaluated_depsgraph_get()
mesh = ob.evaluated_get(depsgraph).to_mesh()
ob_eval = ob.evaluated_get(depsgraph)
mesh = ob_eval.to_mesh()
obcount += 1
for c in mesh.vertices:
coord = c.co
@ -355,6 +358,7 @@ def get_bounds_worldspace(obs, use_modifiers=False):
maxx = max(maxx, world_coord.x)
maxy = max(maxy, world_coord.y)
maxz = max(maxz, world_coord.z)
ob_eval.to_mesh_clear()
if obcount == 0:
minx, miny, minz, maxx, maxy, maxz = 0, 0, 0, 0, 0, 0

View File

@ -42,7 +42,11 @@ class MeshDXFExporter(BasePrimitiveDXFExporter):
entities = self._writeInsert(ob, mx, me.name, **(kwargs))
else: # no other instances, so go the standard way
return self._standard_way(drawing, me, mx, mx_n)
self._standard_way(drawing, me, mx, mx_n)
if obj.modifiers and settings['apply_modifiers']:
depsgraph = ctx.evaluated_depsgraph_get()
obj.evaluated_get(depsgraph).to_mesh_clear()
def _writeInsert(self, drawing, ob, mx, insert_name, **kwargs):
from insert_exporter import InsertDXFExporter

View File

@ -112,7 +112,10 @@ def do_export(context, props, filepath):
float(v.co[2]))
file.write(thisVertex)
bpy.data.meshes.remove(me, do_unlink=True)
if apply_modifiers:
ob.evaluated_get(depsgraph).to_mesh_clear()
else:
me = ob.to_mesh_clear()
file.flush()
file.close()

View File

@ -982,7 +982,7 @@ def triangulate_mesh(object):
me_ob = object.copy()
depsgraph = bpy.context.evaluated_depsgraph_get()
me_ob.data = object.evaluated_get(depsgraph).to_mesh() # write data object
me_ob.data = bpy.data.meshes.new_from_object(object.evaluated_get(depsgraph)) # write data object
bpy.context.collection.objects.link(me_ob)
bpy.context.scene.update()
bpy.ops.object.mode_set(mode='OBJECT')
@ -1007,7 +1007,7 @@ def triangulate_mesh(object):
verbose("Triangulated mesh")
me_ob.data = me_ob.evaluated_get(depsgraph).to_mesh() # write data object
me_ob.data = bpy.data.meshes.new_from_object(me_ob.evaluated_get(depsgraph)) # write data object
bpy.context.scene.update()
return me_ob
@ -2102,7 +2102,8 @@ def rebuildmesh(obj):
uvfaces = []
# print("creating array build mesh...")
depsgraph = bpy.context.evaluated_depsgraph_get()
mmesh = obj.evaluated_get(depsgraph).to_mesh()
obj_eval = obj.evaluated_get(depsgraph)
mmesh = obj_eval.to_mesh()
uv_layer = mmesh.tessface_uv_textures.active
for face in mmesh.tessfaces:
@ -2119,6 +2120,8 @@ def rebuildmesh(obj):
else:
faces.extend([(face.vertices[0], face.vertices[1], face.vertices[2], face.vertices[3])])
obj_eval.to_mesh_clear()
# vertex positions
for vertex in mesh.vertices:
verts.append(vertex.co.to_tuple())

View File

@ -201,12 +201,14 @@ def save(
if bpy.ops.object.mode_set.poll():
bpy.ops.object.mode_set(mode='OBJECT')
mesh_owner_object = None
if use_mesh_modifiers and obj.modifiers:
depsgraph = context.evaluated_depsgraph_get()
mesh = obj.evaluated_get(depsgraph).to_mesh()
mesh_owner_object = obj.evaluated_get(depsgraph)
mesh = mesh_owner_object.to_mesh()
else:
mesh = obj.data.copy()
mesh_owner_object = obj
mesh = mesh_owner_object.to_mesh()
if not mesh:
raise Exception("Error, could not get mesh data from active object")
@ -221,6 +223,6 @@ def save(
use_colors=use_colors,
)
bpy.data.meshes.remove(mesh)
mesh_owner_object.to_mesh_clear()
return ret

View File

@ -68,9 +68,11 @@ def write(filepath,
faces = []
for obj in bpy.context.selected_objects:
obj_eval = None
if applyMods or obj.type != 'MESH':
try:
me = obj.evaluated_get(depsgraph).to_mesh()
obj_eval = obj.evaluated_get(depsgraph)
me = obj_eval.to_mesh()
except:
me = None
is_tmp_mesh = True
@ -90,7 +92,7 @@ def write(filepath,
faces.append(fv)
if is_tmp_mesh:
bpy.data.meshes.remove(me)
obj_eval.to_mesh_clear()
# write the faces to a file
file = open(filepath, "w")

View File

@ -81,12 +81,14 @@ def faces_from_mesh(ob, global_matrix, use_mesh_modifiers=False):
ob.update_from_editmode()
# get the modifiers
if use_mesh_modifiers:
depsgraph = bpy.context.evaluated_depsgraph_get()
mesh_owner = ob.evaluated_get(depsgraph)
else:
mesh_owner = ob
try:
if use_mesh_modifiers:
depsgraph = bpy.context.evaluated_depsgraph_get()
mesh = ob.evaluated_get(depsgraph).to_mesh()
else:
mesh = ob.to_mesh()
mesh = mesh_owner.to_mesh()
except RuntimeError:
return
@ -101,4 +103,4 @@ def faces_from_mesh(ob, global_matrix, use_mesh_modifiers=False):
for tri in mesh.loop_triangles:
yield [vertices[index].co.copy() for index in tri.vertices]
bpy.data.meshes.remove(mesh)
mesh_owner.to_mesh_clear()

View File

@ -1039,8 +1039,9 @@ def save(operator,
if ob.type not in {'MESH', 'CURVE', 'SURFACE', 'FONT', 'META'}:
continue
ob_derived_eval = ob_derived.evaluated_get(depsgraph)
try:
data = ob_derived.evaluated_get(depsgraph).to_mesh()
data = ob_derived_eval.to_mesh()
except:
data = None
@ -1080,6 +1081,8 @@ def save(operator,
if f.material_index >= mat_ls_len:
f.material_index = 0
ob_derived_eval.to_mesh_clear()
if free:
free_derived_objects(ob)

View File

@ -2228,7 +2228,10 @@ def fbx_data_from_scene(scene, depsgraph, settings):
if backup_pose_positions:
depsgraph.update()
ob_to_convert = ob.evaluated_get(depsgraph) if settings.use_mesh_modifiers else ob
tmp_me = ob_to_convert.to_mesh()
# NOTE: The dependency graph might be re-evaluating multiple times, which could
# potentially free the mesh created early on. So we put those meshes to bmain and
# free them afterwards. Not ideal but ensures correct ownerwhip.
tmp_me = bpy.data.meshes.new_from_object(ob_to_convert)
data_meshes[ob_obj] = (get_blenderID_key(tmp_me), tmp_me, True)
# Change armatures back.
for armature, pose_position in backup_pose_positions:

View File

@ -227,7 +227,8 @@ def __gather_mesh(blender_object, export_settings):
modifier.show_viewport = False
depsgraph = bpy.context.evaluated_depsgraph_get()
blender_mesh = blender_object.evaluated_get(depsgraph).to_mesh()
blender_mesh_owner = blender_object.evaluated_get(depsgraph)
blender_mesh = blender_mesh_owner.to_mesh()
for prop in blender_object.data.keys():
blender_mesh[prop] = blender_object.data[prop]
skip_filter = True
@ -247,7 +248,7 @@ def __gather_mesh(blender_object, export_settings):
result = gltf2_blender_gather_mesh.gather_mesh(blender_mesh, vertex_groups, modifiers, skip_filter, export_settings)
if export_settings[gltf2_blender_export_keys.APPLY]:
bpy.data.meshes.remove(blender_mesh)
blender_mesh_owner.to_mesh_clear()
return result
@ -308,6 +309,7 @@ def __gather_skin(blender_object, export_settings):
# check if any vertices in the mesh are part of a vertex group
depsgraph = bpy.context.evaluated_depsgraph_get()
# XXX: ...
blender_mesh = blender_object.evaluated_get(depsgraph).to_mesh()
if not any(vertex.groups is not None and len(vertex.groups) > 0 for vertex in blender_mesh.vertices):
return None

View File

@ -299,12 +299,15 @@ class Ms3dExporter():
# convert to tris by using the triangulate modifier
blender_mesh_object_temp.modifiers.new("temp", 'TRIANGULATE')
blender_mesh_temp = blender_mesh_object_temp.evaluated_get(blender_depsgraph).to_mesh()
blender_mesh_object_temp_eval = blender_mesh_object_temp.evaluated_get(blender_depsgraph)
blender_mesh_temp = blender_mesh_object_temp_eval.to_mesh()
enable_edit_mode(True, blender_context)
bm = bmesh.new()
bm.from_mesh(blender_mesh_temp)
blender_mesh_object_temp_eval.to_mesh_clear()
layer_texture = bm.faces.layers.tex.get(
ms3d_str['OBJECT_LAYER_TEXTURE'])
if layer_texture is None:

View File

@ -639,7 +639,7 @@ def write_file(filepath, objects, depsgraph, scene,
totno += no_unique_count
# clean up
bpy.data.meshes.remove(me)
ob_for_convert.to_mesh_clear()
subprogress1.leave_substeps("Finished writing geometry of '%s'." % ob_main.name)
subprogress1.leave_substeps()

View File

@ -163,9 +163,11 @@ def save_object(fw, global_matrix,
if is_editmode:
bpy.ops.object.editmode_toggle()
me = obj.evaluated_get(depsgraph).to_mesh()
obj_eval = obj.evaluated_get(depsgraph)
me = obj_eval.to_mesh()
bm = bmesh.new()
bm.from_mesh(me)
obj_eval.to_mesh_clear()
if is_editmode:
bpy.ops.object.editmode_toggle()

View File

@ -371,7 +371,7 @@ class MeshExportObject(ExportObject):
for Modifier in DeactivatedModifierList:
Modifier.show_viewport = False
depsgraph = self.Exporter.context.evaluated_depsgraph_get()
depsgraph = self.Exporter.context.evaluated_depsgraph_get()
Mesh = self.BlenderObject.evaluated_get(depsgraph).to_mesh()
# Restore the deactivated modifiers
@ -384,7 +384,11 @@ class MeshExportObject(ExportObject):
self.__WriteMesh(Mesh)
# Cleanup
bpy.data.meshes.remove(Mesh)
if self.Config.ApplyModifiers:
depsgraph = self.Exporter.context.evaluated_depsgraph_get()
self.BlenderObject.evaluated_get(depsgraph).to_mesh_clear()
else:
self.BlenderObject.to_mesh_clear()
self.Exporter.Log("Writing children of {}".format(self))
self._WriteChildren()

View File

@ -1451,7 +1451,7 @@ def export(file,
# free mesh created with create_mesh()
if do_remove:
bpy.data.meshes.remove(me)
obj_for_mesh.to_mesh_clear()
elif obj_type == 'LIGHT':
data = obj.data

View File

@ -68,7 +68,8 @@ def save(context, filepath="", frame_start=1, frame_end=300, fps=25.0, use_rest_
orig_frame = scene.frame_current
scene.frame_set(frame_start)
depsgraph = context.evaluated_depsgraph_get()
me = obj.evaluated_get(depsgraph).to_mesh()
obj_eval = obj.evaluated_get
me = obj_eval.to_mesh()
#Flip y and z
'''
@ -118,4 +119,6 @@ def save(context, filepath="", frame_start=1, frame_end=300, fps=25.0, use_rest_
print('MDD Exported: %r frames:%d\n' % (filepath, numframes - 1))
scene.frame_set(orig_frame)
obj_eval.to_mesh_clear()
return {'FINISHED'}

View File

@ -527,9 +527,10 @@ def get_derived_bmesh(object, bm):
# get derived mesh
bm_mod = bmesh.new()
depsgraph = bpy.context.evaluated_depsgraph_get()
mesh_mod = object.evaluated_get(depsgraph).to_mesh()
object_eval = object.evaluated_get(depsgraph)
mesh_mod = object_eval.to_mesh()
bm_mod.from_mesh(mesh_mod)
bpy.context.blend_data.meshes.remove(mesh_mod)
object_eval.to_mesh_clear()
# re-enable other modifiers
for mod_name in show_viewport:
object.modifiers[mod_name].show_viewport = True

View File

@ -319,9 +319,10 @@ class lattice_along_surface(Operator):
obj = o
o.select_set(False)
break
obj_eval = obj.evaluated_get(depsgraph)
try:
obj_dim = obj.dimensions
obj_me = obj.evaluated_get(depsgraph).to_mesh()
obj_me = obj_eval.to_mesh()
except:
self.report({'ERROR'}, "The object to deform is not valid. Only "
"Mesh, Curve, Surface and Font objects are allowed.")
@ -360,6 +361,8 @@ class lattice_along_surface(Operator):
max[2] = vert[2]
first = False
obj_eval.to_mesh_clear()
bb = max - min
lattice_loc = (max + min) / 2
bpy.ops.object.add(type='LATTICE', align='WORLD',

View File

@ -77,8 +77,10 @@ def tassellate(ob0, ob1, offset, zscale, gen_modifiers, com_modifiers, mode,
else:
depsgraph = None
me0_owner = None
if gen_modifiers: # Apply generator modifiers
me0 = ob0.evaluated_get(depsgraph).to_mesh()
me0_owner = ob0.evaluated_get(depsgraph)
me0 = me0_owner.to_mesh()
else:
me0 = ob0.data
ob0.data = me0
@ -95,8 +97,9 @@ def tassellate(ob0, ob1, offset, zscale, gen_modifiers, com_modifiers, mode,
return 0
# Apply component modifiers
me1_owner = ob1.evaluated_get(depsgraph)
if com_modifiers:
me1 = ob1.evaluated_get(depsgraph).to_mesh()
me1 = me1_owner.to_mesh()
else:
me1 = ob1.data
@ -410,6 +413,13 @@ def tassellate(ob0, ob1, offset, zscale, gen_modifiers, com_modifiers, mode,
new_vertex_group_np[i],
"ADD")
ob0.data = old_me0
if me0_owner:
me0_owner.to_mesh_clear()
if me1_owner:
me1_owner.to_mesh_clear()
return new_ob
@ -675,9 +685,12 @@ class tessellate(Operator):
depsgraph = None
try:
polygons = 0
me_temp_owner = None
if self.gen_modifiers:
me_temp = ob0.evaluated_get(depsgraph).to_mesh()
me_temp_owner = ob0.evaluated_get(depsgraph)
me_temp = me_temp_owner.to_mesh()
else:
me_temp_owner = None
me_temp = ob0.data
for p in me_temp.polygons:
@ -687,11 +700,18 @@ class tessellate(Operator):
else:
polygons += 1
if me_temp_owner:
me_temp_owner.to_mesh_clear()
if self.com_modifiers:
me_temp = bpy.data.objects[self.component].evaluated_get(depsgraph).to_mesh()
me_temp_owner = bpy.data.objects[self.component].evaluated_get(depsgraph)
me_temp = me_temp_owner.to_mesh()
else:
me_temp_owner = None
me_temp = bpy.data.objects[self.component].data
polygons *= len(me_temp.polygons)
if me_temp_owner:
me_temp_owner.to_mesh_clear()
str_polygons = '{:0,.0f}'.format(polygons)
if polygons > 200000:
@ -1239,9 +1259,12 @@ class settings_tessellate(Operator):
# Count number of faces
try:
polygons = 0
me_temp_owner = None
if self.gen_modifiers:
me_temp = bpy.data.objects[self.generator].evaluated_get(depsgraph).to_mesh()
me_temp_owner = bpy.data.objects[self.generator].evaluated_get(depsgraph)
me_temp = me_temp_owner.to_mesh()
else:
me_temp_owner = None
me_temp = bpy.data.objects[self.generator].data
for p in me_temp.polygons:
@ -1251,12 +1274,20 @@ class settings_tessellate(Operator):
else:
polygons += 1
if me_temp_owner:
me_temp_owner.to_mesh_clear()
if self.com_modifiers:
me_temp = bpy.data.objects[self.component].evaluated_get(depsgraph).to_mesh()
me_temp_owner = bpy.data.objects[self.component].evaluated_get(depsgraph)
me_temp = me_temp_owner.to_mesh()
else:
me_temp_owner = None
me_temp = bpy.data.objects[self.component].data
polygons *= len(me_temp.polygons)
if me_temp_owner:
me_temp_owner.to_mesh_clear()
str_polygons = '{:0,.0f}'.format(polygons)
if polygons > 200000:
col.label(text=str_polygons + " polygons will be created!",

View File

@ -87,9 +87,9 @@ class uv_to_mesh(Operator):
if self.apply_modifiers:
depsgraph = context.evaluated_depsgraph_get()
me0 = ob0.evaluated_get(depsgraph).to_mesh()
me0 = bpy.data.meshes.new_from_object(ob0.evaluated_get(depsgraph))
else:
me0 = ob0.to_mesh()
me0 = bpy.data.new_from_meshed(ob0)
area = 0
verts = []

View File

@ -66,15 +66,16 @@ def _points_from_object(obj, source):
points.extend([matrix * v.co for v in mesh.vertices])
else:
depsgraph = bpy.context.evaluated_depsgraph_get()
ob_eval = ob.evaluated_get(depsgraph)
try:
mesh = ob.evaluated_get(depsgraph).to_mesh()
mesh = ob_eval.to_mesh()
except:
mesh = None
if mesh is not None:
matrix = obj.matrix_world.copy()
points.extend([matrix * v.co for v in mesh.vertices])
bpy.data.meshes.remove(mesh)
ob_eval.to_mesh_clear()
def points_from_particles(obj):
points.extend([p.location.copy()
@ -339,7 +340,8 @@ def cell_fracture_boolean(context, obj, objects,
if use_interior_hide:
obj_cell.data.polygons.foreach_set("hide", [True] * len(obj_cell.data.polygons))
mesh_new = obj_cell.evaluated_get(depsgraph).to_mesh()
obj_cell_eval = obj_cell.evaluated_get(depsgraph)
mesh_new = bpy.data.meshes.new_from_object(obj_cell_eval)
mesh_old = obj_cell.data
obj_cell.data = mesh_new
obj_cell.modifiers.remove(mod)

View File

@ -33,10 +33,11 @@ def bmesh_copy_from_object(obj, transform=True, triangulate=True, apply_modifier
if apply_modifiers and obj.modifiers:
import bpy
depsgraph = bpy.context.evaluated_depsgraph_get()
me = obj.evaluated_get(depsgraph).to_mesh()
obj_eval = obj.evaluated_get(depsgraph)
me = obj_eval.to_mesh()
bm = bmesh.new()
bm.from_mesh(me)
bpy.data.meshes.remove(me)
obj_eval.to_mesh_clear()
del bpy
else:
me = obj.data
@ -260,7 +261,8 @@ def object_merge(context, objects):
continue
# convert each to a mesh
mesh_new = obj.evaluated_get(depsgraph).to_mesh()
obj_eval = obj.evaluated_get(depsgraph)
mesh_new = obj_eval.to_mesh()
# remove non-active uvs/vcols
cd_remove_all_but_active(mesh_new.vertex_colors)
@ -282,7 +284,7 @@ def object_merge(context, objects):
# scene_collection.objects.unlink(obj_new)
# bpy.data.objects.remove(obj_new)
bpy.data.meshes.remove(mesh_new)
obj_eval.to_mesh_clear()
scene.update()

View File

@ -461,12 +461,13 @@ def bvhtree_from_object(object):
bm = bmesh.new()
depsgraph = context.evaluated_depsgraph_get()
mesh = object.evaluated_get(depsgraph).to_mesh()
object_eval = object.evaluated_get(depsgraph)
mesh = object_eval.to_mesh()
bm.from_mesh(mesh)
bm.transform(object.matrix_world)
bvhtree = BVHTree.FromBMesh(bm)
bpy.data.meshes.remove(mesh)
object_eval.to_mesh_clear()
return bvhtree
def shoot_region_2d_ray(bvhtree, position_2d):

View File

@ -49,7 +49,8 @@ class ShapeToObjects(Operator):
print(SHAPE.name)
bpy.ops.object.shape_key_clear()
SHAPE.value = 1
mesh = OBJACT.evaluated_get(depsgraph).to_mesh()
OBJACT_eval = OBJACT.evaluated_get(depsgraph)
mesh = bpy.data.meshes.new_from_object(OBJACT_eval)
object = bpy.data.objects.new(SHAPE.name, mesh)
bpy.context.scene.collection.objects.link(object)
else:

View File

@ -2680,8 +2680,9 @@ def write_pov(filename, scene=None, info_callback=None):
# TODO(sergey): PovRay is a render engine, so should be using dependency graph
# which was given to it via render engine API.
depsgraph = bpy.context.evaluated_depsgraph_get()
ob_eval = ob.evaluated_get(depsgraph)
try:
me = ob.evaluated_get(depsgraph).to_mesh()
me = ob_eval.to_mesh()
#XXX Here? identify the specific exception for mesh object with no data
#XXX So that we can write something for the dataname !
@ -3214,7 +3215,7 @@ def write_pov(filename, scene=None, info_callback=None):
bpy.data.meshes.remove(me)
ob_eval.to_mesh_clear()
if csg:
duplidata_ref = []