- added copy_mesh_data C function which, unlike copy_mesh, copies data
authorChingiz Dyussenov <chingiz.ds@gmail.com>
Wed, 10 Jun 2009 09:56:22 +0000 (09:56 +0000)
committerChingiz Dyussenov <chingiz.ds@gmail.com>
Wed, 10 Jun 2009 09:56:22 +0000 (09:56 +0000)
between two existing meshes.
- API's Mesh.copy reflects copy_mesh_data.

source/blender/editors/mesh/editmesh.c
source/blender/makesrna/intern/rna_internal.h
source/blender/makesrna/intern/rna_mesh.c

index 96348972f4fa798c5cf2e1cd7e5de79b0efe9ddb..a1b6bc567425415909039d703751d860e02edc64 100644 (file)
@@ -2029,15 +2029,62 @@ void em_setup_viewcontext(bContext *C, ViewContext *vc)
 }
 
 /* Python API */
+void copy_mesh_data(Mesh *dest, Mesh *src);
+
 Mesh *RNA_api_add_mesh(Main *main, char *name)
 {
        return add_mesh(name);
 }
 
-Mesh *RNA_api_mesh_copy(Mesh *me)
+void RNA_api_mesh_copy(Mesh *me, Mesh *from)
+{
+       copy_mesh_data(me, from);
+}
+
+void RNA_api_mesh_copy_transformed()
+{
+}
+
+/*
+ * This version of copy_mesh doesn't allocate a new mesh,
+ * instead it copies data between two existing meshes.
+ */
+void copy_mesh_data(Mesh *dest, Mesh *src)
+{
+       int totvert, totedge, totface;
+       int has_layer;
+
+       CustomData_free(&dest->vdata, dest->totvert);
+       CustomData_free(&dest->edata, dest->totedge);
+       CustomData_free(&dest->fdata, dest->totface);
+
+       memset(&dest->vdata, 0, sizeof(dest->vdata));
+       memset(&dest->edata, 0, sizeof(dest->edata));
+       memset(&dest->fdata, 0, sizeof(dest->fdata));
+
+       totvert = dest->totvert = src->totvert;
+       totedge = dest->totedge = src->totedge;
+       totface = dest->totface = src->totface;
+
+       CustomData_copy(&src->vdata, &dest->vdata, CD_MASK_MESH, CD_DUPLICATE, totvert);
+       CustomData_copy(&src->edata, &dest->edata, CD_MASK_MESH, CD_DUPLICATE, totedge);
+       CustomData_copy(&src->fdata, &dest->fdata, CD_MASK_MESH, CD_DUPLICATE, totface);
+
+       CustomData_has_layer(&dest->vdata, CD_MVERT);
+
+       CustomData_add_layer(&dest->vdata, CD_MVERT, CD_ASSIGN, src->mvert, totvert);
+       CustomData_add_layer(&dest->edata, CD_MEDGE, CD_ASSIGN, src->medge, totedge);
+       CustomData_add_layer(&dest->fdata, CD_MFACE, CD_ASSIGN, src->mface, totface);
+
+       mesh_update_customdata_pointers(dest);
+}
+
+/*
+void RNA_api_mesh_apply_transform(Mesh *me)
 {
-       return copy_mesh(me);
+       
 }
+*/
 
 /*
 void RNA_api_mesh_copy_(Mesh *me, Object *ob, int apply_transform)
index ee08465f544d6a20c727ca5091d6f2809432c41f..d93c296ca934201194b75e92e64f2d96c1ee5ba7 100644 (file)
@@ -190,7 +190,7 @@ void rna_object_vcollayer_name_set(struct PointerRNA *ptr, const char *value, ch
 
 void RNA_api_ui_layout(struct StructRNA *srna);
 struct Mesh *RNA_api_add_mesh(struct Main *main, char *name);
-struct Mesh *RNA_api_mesh_copy(struct Mesh *me);
+void RNA_api_mesh_copy(struct Mesh *me, struct Mesh *from);
 
 /* ID Properties */
 
index a15e36f947ffb0fd01d89da55559f3b4eb46f244..b330bf277d10f125245cce8ed319db03e924724f 100644 (file)
@@ -1129,9 +1129,13 @@ static void rna_def_mesh(BlenderRNA *brna)
        rna_def_texmat_common(srna, "rna_Mesh_texspace_editable");
 
        func= RNA_def_function(srna, "copy", "RNA_api_mesh_copy");
-       RNA_def_function_ui_description(func, "Create a copy of this mesh.");
+       RNA_def_function_ui_description(func, "Copy mesh data.");
+       prop= RNA_def_pointer(func, "src", "Mesh", "", "A mesh to copy data from.");
+       RNA_def_property_flag(prop, PROP_REQUIRED);
+       /*
        prop= RNA_def_pointer(func, "mesh", "Mesh", "", "A new mesh.");
        RNA_def_function_return(func, prop);
+       */
 }
 
 void RNA_def_mesh(BlenderRNA *brna)