Patch #21267 by Sergey Sharybin
authorTon Roosendaal <ton@blender.org>
Sat, 27 Feb 2010 16:06:33 +0000 (16:06 +0000)
committerTon Roosendaal <ton@blender.org>
Sat, 27 Feb 2010 16:06:33 +0000 (16:06 +0000)
His log:
There is a small typo in copy_curve(): there will be serious troubles
if this functions is called for OB_FONT in edit mode (for my cases
it is segmentation fault).
I think we should set editfont to NULL for cloned curves (as it is made
for edit nurb).

This bug was found by trying to edit text with applied Cast modifier
and while I was searching what's wrong, I've found that in
castModifier_deformVerts() DerivedMesh is creating for all objects,
but in castModifier_*_do() derived mesh is used only for OB_MESH
objects. Maybe this place could be optimized a bit by skipping DM
creation for non-meshes?

source/blender/blenkernel/intern/curve.c
source/blender/blenkernel/intern/modifier.c

index 9d33bc5ae11b743b98f63ae85c6dd914c81c1340..fb27327c3befb4af0988958db54f15b81926debb 100644 (file)
@@ -191,6 +191,7 @@ Curve *copy_curve(Curve *cu)
        cun->path= 0;
 
        cun->editnurb= NULL;
+       cun->editfont= NULL;
 
 #if 0  // XXX old animation system
        /* single user ipo too */
index 65843c28402133e55e81be2277aa2ac90d0ba212..146701f2976d03f77cd48e961ba148cf5bb3e245 100644 (file)
@@ -4825,9 +4825,15 @@ static void castModifier_deformVerts(
                                     ModifierData *md, Object *ob, DerivedMesh *derivedData,
         float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
-       DerivedMesh *dm = get_dm(md->scene, ob, NULL, derivedData, NULL, 0);
+       DerivedMesh *dm = NULL;
        CastModifierData *cmd = (CastModifierData *)md;
 
+       if (ob->type == OB_MESH) {
+               /* DerivedMesh is used only in case object is MESH */
+               /* so we could optimize modifier applying by skipping DM creation */
+               dm = get_dm(md->scene, ob, NULL, derivedData, NULL, 0);
+       }
+
        if (cmd->type == MOD_CAST_TYPE_CUBOID) {
                castModifier_cuboid_do(cmd, ob, dm, vertexCos, numVerts);
        } else { /* MOD_CAST_TYPE_SPHERE or MOD_CAST_TYPE_CYLINDER */