svn merge -r40034:40051 https://svn.blender.org/svnroot/bf-blender/trunk/blender
authorCampbell Barton <ideasman42@gmail.com>
Fri, 9 Sep 2011 02:29:44 +0000 (02:29 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 9 Sep 2011 02:29:44 +0000 (02:29 +0000)
1  2 
release/scripts/modules/bpy_types.py
release/scripts/startup/bl_ui/properties_data_modifier.py
source/blender/blenlib/BLI_utildefines.h
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/RNA_access.h
source/blender/makesrna/intern/rna_modifier.c
source/blender/modifiers/intern/MOD_weightvgedit.c
source/blender/modifiers/intern/MOD_weightvgmix.c
source/blender/modifiers/intern/MOD_weightvgproximity.c

index 1446e45e5f0cfeed6c67cbf77dfcde108e8ad5ef,b3127733c1eb8d8da655f510b31722a139c0a96a..6ab2cfd25bc30457ff87a3bbf83beff8d892d7b3
@@@ -183,7 -183,7 +183,7 @@@ class _GenericBone
      @property
      def center(self):
          """The midpoint between the head and the tail."""
 -        return (self.head + self.tail) * 0.5
 +        return self.head.lerp(self.tail, 0.5)
  
      @property
      def length(self):
@@@ -330,8 -330,7 +330,8 @@@ class Mesh(bpy_types.ID)
          """
          self.vertices.add(len(vertices))
          self.edges.add(len(edges))
 -        self.faces.add(len(faces))
 +        self.loops.add(sum((len(f) for f in faces)))
 +        self.polygons.add(len(faces))
  
          vertices_flat = [f for v in vertices for f in v]
          self.vertices.foreach_set("co", vertices_flat)
          self.edges.foreach_set("vertices", edges_flat)
          del edges_flat
  
 -        def treat_face(f):
 -            if len(f) == 3:
 -                if f[2] == 0:
 -                    return f[2], f[0], f[1], 0
 -                else:
 -                    return f[0], f[1], f[2], 0
 -            elif f[2] == 0 or f[3] == 0:
 -                return f[2], f[3], f[0], f[1]
 -            return f
 -
 -        faces_flat = [v for f in faces for v in treat_face(f)]
 -        self.faces.foreach_set("vertices_raw", faces_flat)
 -        del faces_flat
 +        # this is different in bmesh
 +        loop_index = 0
 +        for i, p in enumerate(self.polygons):
 +            f = faces[i]
 +            loop_len = len(f)
 +            p.loop_start = loop_index
 +            p.loop_total = loop_len
 +            p.vertices = f
 +            loop_index += loop_len
  
      @property
      def edge_keys(self):
-         return list({edge_key
-                      for face in self.faces
-                      for edge_key in face.edge_keys
-                      })
+         return [ed.key for ed in self.edges]
  
  
  class MeshEdge(StructRNA):
@@@ -585,7 -585,7 +582,7 @@@ class _GenericUI
          draw_funcs = cls._dyn_ui_initialize()
          try:
              draw_funcs.remove(draw_func)
 -        except:
 +        except ValueError:
              pass
  
  
index c600debe93566b88390a872790919faa15397e5a,8d4e3f153b1f4abc36ac93a9fc781230cddddb95..b49f9adc4cf501ad0c09805fefd83ab08229c332
@@@ -46,11 -46,7 +46,11 @@@ class DATA_PT_modifiers(ModifierButtons
      # the mt.type enum is (ab)used for a lookup on function names
      # ...to avoid lengthy if statements
      # so each type must have a function here.
 -
 +      
 +    def NGONINTERP(self, layout, ob, md):
 +        split = layout.split()
 +        split.prop(md, "resolution")
 +        
      def ARMATURE(self, layout, ob, md):
          split = layout.split()
  
          layout.label(text="Settings can be found inside the Physics context")
  
      def UV_PROJECT(self, layout, ob, md):
-         if ob.type == 'MESH':
-             split = layout.split()
+         split = layout.split()
  
-             col = split.column()
-             col.label(text="Image:")
-             col.prop(md, "image", text="")
+         col = split.column()
+         col.label(text="Image:")
+         col.prop(md, "image", text="")
  
-             col = split.column()
-             col.label(text="UV Layer:")
-             col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
+         col = split.column()
+         col.label(text="UV Layer:")
+         col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
  
-             split = layout.split()
-             col = split.column()
-             col.prop(md, "use_image_override")
-             col.prop(md, "projector_count", text="Projectors")
-             for proj in md.projectors:
-                 col.prop(proj, "object", text="")
+         split = layout.split()
+         col = split.column()
+         col.prop(md, "use_image_override")
+         col.prop(md, "projector_count", text="Projectors")
+         for proj in md.projectors:
+             col.prop(proj, "object", text="")
  
-             col = split.column()
-             sub = col.column(align=True)
-             sub.prop(md, "aspect_x", text="Aspect X")
-             sub.prop(md, "aspect_y", text="Aspect Y")
+         col = split.column()
+         sub = col.column(align=True)
+         sub.prop(md, "aspect_x", text="Aspect X")
+         sub.prop(md, "aspect_y", text="Aspect Y")
  
-             sub = col.column(align=True)
-             sub.prop(md, "scale_x", text="Scale X")
-             sub.prop(md, "scale_y", text="Scale Y")
+         sub = col.column(align=True)
+         sub.prop(md, "scale_x", text="Scale X")
+         sub.prop(md, "scale_y", text="Scale Y")
  
      def WARP(self, layout, ob, md):
          use_falloff = (md.falloff_type != 'NONE')
      @staticmethod
      def vertex_weight_mask(layout, ob, md):
          layout.label(text="Influence/Mask Options:")
-         row = layout.row()
  
          split = layout.split(percentage=0.4)
          split.label(text="Global Influence:")
              split.template_ID(md, "mask_texture", new="texture.new")
              if md.mask_texture:
                  split = layout.split()
+                 
                  col = split.column()
                  col.label(text="Texture Coordinates:")
                  col.prop(md, "mask_tex_mapping", text="")
+                 
                  col = split.column()
                  col.label(text="Use Channel:")
                  col.prop(md, "mask_tex_use_channel", text="")
                      layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures")
  
      def VERTEX_WEIGHT_EDIT(self, layout, ob, md):
-         if ob.type == 'MESH':
-             split = layout.split()
-             col = split.column()
-             col.label(text="Vertex Group:")
-             col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+         split = layout.split()
+         col = split.column()
+         col.label(text="Vertex Group:")
+         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
  
-             col = split.column()
-             col.label(text="Default Weight:")
-             col.prop(md, "default_weight", text="")
+         col = split.column()
+         col.label(text="Default Weight:")
+         col.prop(md, "default_weight", text="")
  
-             layout.prop(md, "falloff_type")
-             if md.falloff_type == 'CURVE':
-                 col = layout.column()
-                 col.template_curve_mapping(md, "map_curve")
+         layout.prop(md, "falloff_type")
+         if md.falloff_type == 'CURVE':
+             col = layout.column()
+             col.template_curve_mapping(md, "map_curve")
  
-             split = layout.split(percentage=0.4)
-             split.prop(md, "use_add")
-             row = split.row()
-             row.active = md.use_add
-             row.prop(md, "add_threshold")
+         split = layout.split(percentage=0.4)
+         split.prop(md, "use_add")
+         row = split.row()
+         row.active = md.use_add
+         row.prop(md, "add_threshold")
  
-             split = layout.split(percentage=0.4)
-             split.prop(md, "use_remove")
-             row = split.row()
-             row.active = md.use_remove
-             row.prop(md, "remove_threshold")
+         split = layout.split(percentage=0.4)
+         split.prop(md, "use_remove")
+         row = split.row()
+         row.active = md.use_remove
+         row.prop(md, "remove_threshold")
  
-             # Common mask options…
-             layout.separator()
-             self.vertex_weight_mask(layout, ob, md)
+         # Common mask options
+         layout.separator()
+         self.vertex_weight_mask(layout, ob, md)
  
      def VERTEX_WEIGHT_MIX(self, layout, ob, md):
-         if ob.type == 'MESH':
-             split = layout.split()
-             col = split.column()
-             col.label(text="Vertex Group A:")
-             col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
-             col.label(text="Default Weight A:")
-             col.prop(md, "default_weight_a", text="")
+         split = layout.split()
+         
+         col = split.column()
+         col.label(text="Vertex Group A:")
+         col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
+         col.label(text="Default Weight A:")
+         col.prop(md, "default_weight_a", text="")
  
-             col.label(text="Mix Mode:")
-             col.prop(md, "mix_mode", text="")
+         col.label(text="Mix Mode:")
+         col.prop(md, "mix_mode", text="")
  
-             col = split.column()
-             col.label(text="Vertex Group B:")
-             col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
-             col.label(text="Default Weight B:")
-             col.prop(md, "default_weight_b", text="")
+         col = split.column()
+         col.label(text="Vertex Group B:")
+         col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
+         col.label(text="Default Weight B:")
+         col.prop(md, "default_weight_b", text="")
  
-             col.label(text="Mix Set:")
-             col.prop(md, "mix_set", text="")
+         col.label(text="Mix Set:")
+         col.prop(md, "mix_set", text="")
  
-             # Common mask options…
-             layout.separator()
-             self.vertex_weight_mask(layout, ob, md)
+         # Common mask options
+         layout.separator()
+         self.vertex_weight_mask(layout, ob, md)
  
      def VERTEX_WEIGHT_PROXIMITY(self, layout, ob, md):
-         if ob.type == 'MESH':
-             split = layout.split()
-             col = split.column()
-             col.label(text="Vertex Group:")
-             col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+         split = layout.split()
+         
+         col = split.column()
+         col.label(text="Vertex Group:")
+         col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
  
-             col = split.column()
-             col.label(text="Target Object:")
-             col.prop(md, "target", text="")
+         col = split.column()
+         col.label(text="Target Object:")
+         col.prop(md, "target", text="")
  
-             row = layout.row()
-             row.prop(md, "proximity_mode", expand=True)
-             if md.proximity_mode == 'GEOMETRY':
-                 row = layout.row()
-                 row.prop(md, "proximity_geometry", expand=True)
+         layout.row().prop(md, "proximity_mode", expand=True)
+         if md.proximity_mode == 'GEOMETRY':
+             layout.row().prop(md, "proximity_geometry", expand=True)
  
-             row = layout.split()
-             row.prop(md, "min_dist")
-             row.prop(md, "max_dist")
+         row = layout.row()
+         row.prop(md, "min_dist")
+         row.prop(md, "max_dist")
  
-             layout.prop(md, "falloff_type")
+         layout.prop(md, "falloff_type")
  
-             # Common mask options…
-             layout.separator()
-             self.vertex_weight_mask(layout, ob, md)
+         # Common mask options
+         layout.separator()
+         self.vertex_weight_mask(layout, ob, md)
  
  if __name__ == "__main__":  # only for live edit.
      bpy.utils.register_module(__name__)
index 985400493eec5660f06d82e987d11040bfbe1379,9a3b81e577666286bea03a5c4c57d692ff14fa42..2e420414fcd17d4b7f96a43d0bf1b9c4c3879e0b
  #define VECADD(v1,v2,v3)      {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
  #define VECSUB(v1,v2,v3)      {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
  #define VECSUB2D(v1,v2,v3)    {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1);}
 +#define VECINTERP(v1,v2,v3, fac) {*(v1) = *(v2) + (*(v3)-*(v2))*(fac); *(v1+1) = *(v2+1) + (*(v3+1)-*(v2+1))*(fac); *(v1+2) = *(v2+2) + (*(v3+2)-*(v2+2))*(fac);}
  #define VECADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac);}
  #define VECSUBFAC(v1,v2,v3,fac) {*(v1)= *(v2) - *(v3)*(fac); *(v1+1)= *(v2+1) - *(v3+1)*(fac); *(v1+2)= *(v2+2) - *(v3+2)*(fac);}
  #define QUATADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac); *(v1+3)= *(v2+3) + *(v3+3)*(fac);}
  /* useful for debugging */
  #define AT __FILE__ ":" STRINGIFY(__LINE__)
  
+ /* so we can use __func__ everywhere */
+ #if defined(_MSC_VER)
+ #  define __func__ __FUNCTION__
+ #endif
  /* UNUSED macro, for function argument */
  #ifdef __GNUC__
  #  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
@@@ -241,6 -246,4 +247,6 @@@ do { 
  #  define BLI_assert(a) (void)0
  #endif
  
 +#define BMEMSET(mem, val, size) {unsigned int _i; char *_c = (char*) mem; for (_i=0; _i<size; _i++) *_c++ = val;}
 +
  #endif // BLI_UTILDEFINES_H
index 5d75f8215acaf432bedc79a47b3377fc1eda13f9,d09e56a5708cc1d1941b1d5d4b46d6dd4260c92d..2a4eb3d4045827c9fa481ceb31d98526c90e42df
@@@ -74,7 -74,6 +74,7 @@@ typedef enum ModifierType 
        eModifierType_WeightVGEdit,
        eModifierType_WeightVGMix,
        eModifierType_WeightVGProximity,
 +      eModifierType_NgonInterp,
        NUM_MODIFIER_TYPES
  } ModifierType;
  
@@@ -679,7 -678,6 +679,7 @@@ typedef struct ShrinkwrapModifierData 
  #define MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS            (1<<2)
  #define MOD_SHRINKWRAP_PROJECT_OVER_NORMAL                    0       /* projection over normal is used if no axis is selected */
  
 +
  typedef struct SimpleDeformModifierData {
        ModifierData modifier;
  
@@@ -751,13 -749,9 +751,13 @@@ typedef struct ScrewModifierData 
  #define MOD_SCREW_OBJECT_OFFSET       (1<<2)
  // #define MOD_SCREW_OBJECT_ANGLE     (1<<4)
  
 -typedef struct WarpModifierData {
 +typedef struct NgonInterpModifierData {
        ModifierData modifier;
 +      int             resolution, pad0;
 +} NgonInterpModifierData;
  
 +typedef struct WarpModifierData {
 +      ModifierData modifier;
        /* keep in sync with MappingInfoModifierData */
        struct Tex *texture;
        struct Object *map_object;
@@@ -824,7 -818,7 +824,7 @@@ typedef struct WeightVGEditModifierDat
        int             mask_tex_mapping;
        char    mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
  
-       /* Padding */
+       /* Padding... */
        int pad_i1;
  } WeightVGEditModifierData;
  
@@@ -869,7 -863,7 +869,7 @@@ typedef struct WeightVGMixModifierData 
        int             mask_tex_mapping;          /* How to map the texture! */
        char    mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
  
-       /* Padding */
+       /* Padding... */
        int pad_i1;
  } WeightVGMixModifierData;
  
index e80e33e78392b9a957b32750da7dbb1cd0b9b26b,7d013d01e72deba733ae2712ec0b13be146a2b81..f2f2426e5312c86cd4e85983e6d97167895983e3
@@@ -299,8 -299,6 +299,8 @@@ extern StructRNA RNA_MeshColorLayer
  extern StructRNA RNA_MeshDeformModifier;
  extern StructRNA RNA_MeshEdge;
  extern StructRNA RNA_MeshFace;
 +extern StructRNA RNA_MeshPolygon;
 +extern StructRNA RNA_MeshLoop;
  extern StructRNA RNA_MeshFloatProperty;
  extern StructRNA RNA_MeshFloatPropertyLayer;
  extern StructRNA RNA_MeshIntProperty;
@@@ -976,7 -974,11 +976,11 @@@ int RNA_function_call_direct_va_lookup(
  short RNA_type_to_ID_code(StructRNA *type);
  StructRNA *ID_code_to_RNA_type(short idcode);
  
- void RNA_warning(const char *format, ...)
+ /* macro which inserts the function name */
+ #define RNA_warning(format, args...) _RNA_warning("%s: " format "\n", __func__, ##args)
+ void _RNA_warning(const char *format, ...)
  #ifdef __GNUC__
  __attribute__ ((format (printf, 1, 2)))
  #endif
index bfe2c7ffaac94eb1158a7e4cde4475878082b441,07967103a403bd5c6a0a9908b69921bd437a38b8..ef67b0e684e3bd0fe04a22b20ab1b61ca33dc6b5
@@@ -68,6 -68,7 +68,7 @@@ EnumPropertyItem modifier_type_items[] 
        {eModifierType_Screw, "SCREW", ICON_MOD_SCREW, "Screw", ""},
        {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""},
        {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
+       {0, "", 0, "Modify", ""},
        {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
        {eModifierType_WeightVGEdit, "VERTEX_WEIGHT_EDIT", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Edit", ""},
        {eModifierType_WeightVGMix, "VERTEX_WEIGHT_MIX", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Mix", ""},
@@@ -95,7 -96,6 +96,7 @@@
        {eModifierType_Smoke, "SMOKE", ICON_MOD_SMOKE, "Smoke", ""},
        {eModifierType_Softbody, "SOFT_BODY", ICON_MOD_SOFT, "Soft Body", ""},
        {eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""},
 +      {eModifierType_NgonInterp, "NGONINTERP", ICON_MOD_LATTICE, "Precision UV Interpolation", ""},
        {0, NULL, 0, NULL, NULL}};
  
  #ifdef RNA_RUNTIME
@@@ -180,8 -180,6 +181,8 @@@ static StructRNA* rna_Modifier_refine(s
                        return &RNA_MultiresModifier;
                case eModifierType_Surface:
                        return &RNA_SurfaceModifier;
 +              case eModifierType_NgonInterp:
 +                      return &RNA_NgonInterpModifier;
                case eModifierType_Smoke:
                        return &RNA_SmokeModifier;
                case eModifierType_Solidify:
@@@ -483,7 -481,7 +484,7 @@@ static int rna_MultiresModifier_externa
        Object *ob= (Object*)ptr->id.data;
        Mesh *me= ob->data;
  
 -      return CustomData_external_test(&me->fdata, CD_MDISPS);
 +      return CustomData_external_test(&me->ldata, CD_MDISPS);
  }
  
  static void rna_MultiresModifier_filepath_get(PointerRNA *ptr, char *value)
@@@ -2783,25 -2781,6 +2784,25 @@@ static void rna_def_modifier_weightvgpr
        rna_def_modifier_weightvg_mask(brna, srna);
  }
  
 +
 +
 +static void rna_def_modifier_ngoninterp(BlenderRNA *brna)
 +{
 +      StructRNA *srna;
 +      PropertyRNA *prop;
 +
 +      srna= RNA_def_struct(brna, "NgonInterpModifier", "Modifier");
 +      RNA_def_struct_ui_text(srna, "Precision UV Modifier", "Precision UV interpolation");
 +      RNA_def_struct_sdna(srna, "NgonInterpModifierData");
 +      RNA_def_struct_ui_icon(srna, ICON_MOD_SCREW);
 +
 +      prop= RNA_def_property(srna, "resolution", PROP_INT, PROP_UNSIGNED);
 +      RNA_def_property_range(prop, 1, 10000);
 +      RNA_def_property_ui_range(prop, 1, 100, 1, 0);
 +      RNA_def_property_ui_text(prop, "Resolution", "Size of interpolation grids");
 +      RNA_def_property_update(prop, 0, "rna_Modifier_update");
 +
 +}
  void RNA_def_modifier(BlenderRNA *brna)
  {
        StructRNA *srna;
        rna_def_modifier_weightvgedit(brna);
        rna_def_modifier_weightvgmix(brna);
        rna_def_modifier_weightvgproximity(brna);
 +      rna_def_modifier_ngoninterp(brna);
  }
  
  #endif
index b8bbf2a4b6c98bfec6b0b49f4b27288d675afe91,fb6d4dc10e6c18be92e67998b1e38874af21c2be..fffb3c6de2f41f25d6d5b4b3fd0aa3ed8a36a718
@@@ -28,7 -28,7 +28,7 @@@
  
  /*
   * XXX I'd like to make modified weights visible in WeightPaint mode,
-  *     but couldn't figure a way to do this
+  *     but couldn't figure a way to do this...
   *     Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
   *     Or the WeightPaint mode code itself?
   */
@@@ -211,13 -211,13 +211,13 @@@ static DerivedMesh *applyModifier(Modif
        if (defgrp_idx < 0)
                return dm;
  
-       /* XXX All this to avoid copying dm when not needed However, it nearly doubles compute
-        *     time! See scene 5 of the WeighVG test file
+       /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
+        *     time! See scene 5 of the WeighVG test file...
         */
  #if 0
        /* Get actual dverts (ie vertex group data). */
        dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
-       /* If no dverts, return unmodified data */
+       /* If no dverts, return unmodified data... */
        if (dvert == NULL)
                return dm;
  
        /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
        if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
                /* XXX Seems to create problems with weightpaint mode???
-                *     I'm missing something here, I guess
+                *     I'm missing something here, I guess...
                 */
  //            DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
                ret = CDDM_copy(dm);
        else
                ret = dm;
  #else
 -      ret = CDDM_copy(dm);
 +      ret = CDDM_copy(dm, 0);
        rel_ret = 1;
        dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
        if (dvert == NULL) {
  }
  
  static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
 -                                    struct EditMesh *UNUSED(editData),
 +                                    struct BMEditMesh *UNUSED(editData),
                                      DerivedMesh *derivedData)
  {
        return applyModifier(md, ob, derivedData, 0, 1);
index 8139adc5910245402aa5ef800cf19ecc5fc9d58e,f1422a342ebf6a4c7746575a2fcc63ab06d5374a..8093683a098ef4a8d7d8459a29180e654444e8a8
@@@ -28,7 -28,7 +28,7 @@@
  
  /*
   * XXX I'd like to make modified weights visible in WeightPaint mode,
-  *     but couldn't figure a way to do this
+  *     but couldn't figure a way to do this...
   *     Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
   *     Or the WeightPaint mode code itself?
   */
@@@ -62,7 -62,7 +62,7 @@@ static float mix_weight(float weight, f
  #if 0
        /*
         * XXX Don't know why, but the switch version takes many CPU time,
-        *     and produces lag in realtime playback
+        *     and produces lag in realtime playback...
         */
        switch (mix_mode)
        {
@@@ -258,13 -258,13 +258,13 @@@ static DerivedMesh *applyModifier(Modif
                        return dm;
        }
  
-       /* XXX All this to avoid copying dm when not needed However, it nearly doubles compute
-        *     time! See scene 5 of the WeighVG test file
+       /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
+        *     time! See scene 5 of the WeighVG test file...
         */
  #if 0
        /* Get actual dverts (ie vertex group data). */
        dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
-       /* If no dverts, return unmodified data */
+       /* If no dverts, return unmodified data... */
        if (dvert == NULL)
                return dm;
  
        /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
        if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
                /* XXX Seems to create problems with weightpaint mode???
-                *     I'm missing something here, I guess
+                *     I'm missing something here, I guess...
                 */
  //            DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
                ret = CDDM_copy(dm);
        else
                ret = dm;
  #else
 -      ret = CDDM_copy(dm);
 +      ret = CDDM_copy(dm, 0);
        rel_ret = 1;
        dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
        if (dvert == NULL) {
  }
  
  static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
 -                                    struct EditMesh *UNUSED(editData),
 +                                    struct BMEditMesh *UNUSED(editData),
                                      DerivedMesh *derivedData)
  {
        return applyModifier(md, ob, derivedData, 0, 1);
index b0be02c5b2777f32b5ce66e0521de698f1a8d73e,af3f71d609978aea3ccdf709667d78a1cbb23a6a..717f2b7001b9ce2ceeb9ed4373bd55213af0d2ff
@@@ -28,7 -28,7 +28,7 @@@
  
  /*
   * XXX I'd like to make modified weights visible in WeightPaint mode,
-  *     but couldn't figure a way to do this
+  *     but couldn't figure a way to do this...
   *     Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
   *     Or the WeightPaint mode code itself?
   */
@@@ -385,13 -385,13 +385,13 @@@ static DerivedMesh *applyModifier(Modif
        if (defgrp_idx < 0)
                return dm;
  
-       /* XXX All this to avoid copying dm when not needed However, it nearly doubles compute
-        *     time! See scene 5 of the WeighVG test file
+       /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
+        *     time! See scene 5 of the WeighVG test file...
         */
  #if 0
        /* Get actual dverts (ie vertex group data). */
        dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
-       /* If no dverts, return unmodified data */
+       /* If no dverts, return unmodified data... */
        if (dvert == NULL)
                return dm;
  
        /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
        if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
                /* XXX Seems to create problems with weightpaint mode???
-                *     I'm missing something here, I guess
+                *     I'm missing something here, I guess...
                 */
  //            DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
                ret = CDDM_copy(dm);
        else
                ret = dm;
  #else
 -      ret = CDDM_copy(dm);
 +      ret = CDDM_copy(dm, 0);
        rel_ret = 1;
        dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
        if (dvert == NULL) {
                                        target_dm = CDDM_from_curve(obr);
                                else if (obr->type == OB_MESH) {
                                        Mesh *me = (Mesh*)obr->data;
 -                                      if (me->edit_mesh)
 -                                              target_dm = CDDM_from_editmesh((EditMesh*)me->edit_mesh, me);
 +                                      if (me->edit_btmesh)
 +                                              target_dm = CDDM_from_BMEditMesh(me->edit_btmesh, me, 0);
                                        else
                                                target_dm = CDDM_from_mesh(me, obr);
                                }
  }
  
  static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
 -                                    struct EditMesh *UNUSED(editData),
 +                                    struct BMEditMesh *UNUSED(editData),
                                      DerivedMesh *derivedData)
  {
        return applyModifier(md, ob, derivedData, 0, 1);