rna api changes
authorCampbell Barton <ideasman42@gmail.com>
Thu, 26 Aug 2010 22:44:05 +0000 (22:44 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 26 Aug 2010 22:44:05 +0000 (22:44 +0000)
- mesh.add_geometry(v, e, f)  --> mesh.vertices.add(tot), mesh.edges.add(tot), mesh.faces.add(tot)
- mesh.add_material(mat) --> mesh.materials.link(mat)

changed material.link so it always adds a material even if it exists in the list, this behavior is good for users but not scripts since it can mess up indicies (some formats may have the same material set twice).

release/scripts/io/import_scene_3ds.py
release/scripts/io/import_scene_obj.py
release/scripts/modules/bpy_types.py
release/scripts/op/add_mesh_torus.py
release/scripts/op/object.py
source/blender/editors/include/ED_mesh.h
source/blender/editors/mesh/mesh_data.c
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_mesh_api.c
source/blender/python/intern/bpy_rna.c

index 95da2637ed59b2f4c12badd60230b019cb80ea9f..d34b5ad0723500ebd073524f103d04957b25eedc 100644 (file)
@@ -334,7 +334,8 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
         bmesh = bpy.data.meshes.new(contextObName)
         if myContextMesh_vertls:
 
-            bmesh.add_geometry(len(myContextMesh_vertls)//3, 0, len(myContextMesh_facels))
+            bmesh.vertices.add(len(myContextMesh_vertls)//3)
+            bmesh.faces.add(len(myContextMesh_facels))
             bmesh.vertices.foreach_set("co", myContextMesh_vertls)
             
             eekadoodle_faces = []
@@ -350,12 +351,13 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
 
             for mat_idx, (matName, faces) in enumerate(myContextMeshMaterials.items()):
                 if matName is None:
-                    bmesh.add_material(None)
+                    bmat = None
                 else:
                     bmat = MATDICT[matName][1]
-                    bmesh.add_material(bmat) # can be None
                     img = TEXTURE_DICT.get(bmat.name)
-                
+
+                bmesh.materials.link(bmat) # can be None
+
                 if uv_faces  and img:
                     for fidx in faces:
                         bmesh.faces[fidx].material_index = mat_idx
index 17ac4c5dee62ededb42841ca490aabf237f4ab04..e31d6c583ad530e3fd690fda10d4bebc0b7e789b 100644 (file)
@@ -673,10 +673,11 @@ def create_mesh(new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_loc, v
 
     # make sure the list isnt too big
     for material in materials:
-        me.add_material(material)
+        me.materials.link(material)
     #me.vertices.extend([(0,0,0)]) # dummy vert
 
-    me.add_geometry(len(verts_loc), 0, len(faces))
+    me.vertices.add(len(verts_loc))
+    me.faces.add(len(faces))
 
     # verts_loc is a list of (x, y, z) tuples
     me.vertices.foreach_set("co", unpack_list(verts_loc))
@@ -768,7 +769,7 @@ def create_mesh(new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_loc, v
 
     if CREATE_EDGES:
 
-        me.add_geometry(0, len(edges), 0)
+        me.edges.add(len(edges))
 
         # edges should be a list of (a, b) tuples
         me.edges.foreach_set("vertices", unpack_list(edges))
index 5030e9f4868abd76458ab5e986b5005efcdc1d36..84d05a7a48db30e4a87de7b9d7a6e5f069ba3330 100644 (file)
@@ -306,7 +306,9 @@ class Mesh(bpy_types.ID):
         Make a mesh from a list of verts/edges/faces
         Until we have a nicer way to make geometry, use this.
         """
-        self.add_geometry(len(verts), len(edges), len(faces))
+        self.vertices.add(len(verts))
+        self.edges.add(len(edges))
+        self.faces.add(len(faces))
 
         verts_flat = [f for v in verts for f in v]
         self.vertices.foreach_set("co", verts_flat)
@@ -318,8 +320,11 @@ class Mesh(bpy_types.ID):
 
         def treat_face(f):
             if len(f) == 3:
-                return f[0], f[1], f[2], 0
-            elif f[3] == 0:
+                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[3], f[0], f[1], f[2]
             return f
 
index e19f2b4e18caa1c6ca929f001b10cbc699e97b2e..217aa8fae83611d1118a2ad1dac32777c801c5ca 100644 (file)
@@ -121,7 +121,9 @@ class AddTorus(bpy.types.Operator):
 
         mesh = bpy.data.meshes.new("Torus")
 
-        mesh.add_geometry(int(len(verts_loc) / 3), 0, int(len(faces) / 4))
+        mesh.vertices.add(len(verts_loc) // 3)
+        mesh.faces.add(len(faces) // 4)
+
         mesh.vertices.foreach_set("co", verts_loc)
         mesh.faces.foreach_set("vertices_raw", faces)
         mesh.update()
index 28f3b226c215aa4a6710aeb8024f954950c1a35f..cb97fb736b9a88366d525ecb90f13a43e7817604 100644 (file)
@@ -499,11 +499,13 @@ class MakeDupliFace(bpy.types.Operator):
 
         for data, objects in linked.items():
             face_verts = [axis for obj in objects for v in matrix_to_quat(obj.matrix_world) for axis in v]
-            faces = list(range(int(len(face_verts) / 3)))
+            faces = list(range(len(face_verts) // 3))
 
             mesh = bpy.data.meshes.new(data.name + "_dupli")
 
-            mesh.add_geometry(int(len(face_verts) / 3), 0, int(len(face_verts) / (4 * 3)))
+            mesh.vertices.add(len(face_verts) // 3)
+            mesh.faces.add(len(face_verts) // 12)
+
             mesh.vertices.foreach_set("co", face_verts)
             mesh.faces.foreach_set("vertices_raw", faces)
             mesh.update() # generates edge data
index bf809d39fe4ba08f87fe7206a4540222192635ce..564fe04ca4d9dddf961a6b500cbfccbd73206ef0 100644 (file)
@@ -209,11 +209,14 @@ int editface_containsEdge(struct EditFace *efa, struct EditEdge *eed);
 short sharesFace(struct EditMesh *em, struct EditEdge *e1, struct EditEdge *e2);
 
 /* mesh_data.c */
+// void ED_mesh_geometry_add(struct Mesh *mesh, struct ReportList *reports, int verts, int edges, int faces);
+void ED_mesh_faces_add(struct Mesh *mesh, struct ReportList *reports, int count);
+void ED_mesh_edges_add(struct Mesh *mesh, struct ReportList *reports, int count);
+void ED_mesh_vertices_add(struct Mesh *mesh, struct ReportList *reports, int count);
 
-void ED_mesh_geometry_add(struct Mesh *mesh, struct ReportList *reports, int verts, int edges, int faces);
 void ED_mesh_transform(struct Mesh *me, float *mat);
 void ED_mesh_calc_normals(struct Mesh *me);
-void ED_mesh_material_add(struct Mesh *me, struct Material *ma);
+void ED_mesh_material_link(struct Mesh *me, struct Material *ma);
 void ED_mesh_update(struct Mesh *mesh, struct bContext *C, int calc_edges);
 
 int ED_mesh_uv_texture_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me, const char *name, int active_set);
index edcdedf2a39d7fa8ab30bb724e4980c499cb3725..35cb9f02b64db8ed145a65ffba47f15a7182af9a 100644 (file)
@@ -721,6 +721,7 @@ static void mesh_add_faces(Mesh *mesh, int len)
        mesh->totface= totface;
 }
 
+/*
 void ED_mesh_geometry_add(Mesh *mesh, ReportList *reports, int verts, int edges, int faces)
 {
        if(mesh->edit_mesh) {
@@ -735,23 +736,50 @@ void ED_mesh_geometry_add(Mesh *mesh, ReportList *reports, int verts, int edges,
        if(faces)
                mesh_add_faces(mesh, faces);
 }
+*/
+
+void ED_mesh_faces_add(Mesh *mesh, ReportList *reports, int count)
+{
+       if(mesh->edit_mesh) {
+               BKE_report(reports, RPT_ERROR, "Can't add faces in edit mode.");
+               return;
+       }
+
+       mesh_add_faces(mesh, count);
+}
+
+void ED_mesh_edges_add(Mesh *mesh, ReportList *reports, int count)
+{
+       if(mesh->edit_mesh) {
+               BKE_report(reports, RPT_ERROR, "Can't add edges in edit mode.");
+               return;
+       }
+
+       mesh_add_edges(mesh, count);
+}
+
+void ED_mesh_vertices_add(Mesh *mesh, ReportList *reports, int count)
+{
+       if(mesh->edit_mesh) {
+               BKE_report(reports, RPT_ERROR, "Can't add vertices in edit mode.");
+               return;
+       }
+
+       mesh_add_verts(mesh, count);
+}
 
 void ED_mesh_calc_normals(Mesh *me)
 {
        mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
 }
 
-void ED_mesh_material_add(Mesh *me, Material *ma)
+/* always adds the material even if its linked alredy
+ * for pradictable material indicies */
+void ED_mesh_material_link(Mesh *me, Material *ma)
 {
-       int i;
        int totcol = me->totcol + 1;
        Material **mat;
 
-       /* don't add if mesh already has it */
-       for(i = 0; i < me->totcol; i++)
-               if(me->mat[i] == ma)
-                       return;
-
        mat= MEM_callocN(sizeof(void*)*totcol, "newmatar");
 
        if(me->totcol) memcpy(mat, me->mat, sizeof(void*) * me->totcol);
index aff6d7d5697492f78e4c738446c1801ee7756aeb..659e08a187855682336c172128106064b7ac007c 100644 (file)
@@ -1630,14 +1630,52 @@ static void rna_def_mproperties(BlenderRNA *brna)
        RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
 }
 
-/* scene.objects */
+/* mesh.vertices */
+static void rna_def_mesh_vertices(BlenderRNA *brna, PropertyRNA *cprop)
+{
+       StructRNA *srna;
+//     PropertyRNA *prop;
+
+       FunctionRNA *func;
+       PropertyRNA *parm;
+
+       RNA_def_property_srna(cprop, "MeshVertices");
+       srna= RNA_def_struct(brna, "MeshVertices", NULL);
+       RNA_def_struct_sdna(srna, "Mesh");
+       RNA_def_struct_ui_text(srna, "Mesh Vertices", "Collection of mesh vertices");
+
+       func= RNA_def_function(srna, "add", "ED_mesh_vertices_add");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
+       parm= RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add.", 0, INT_MAX);
+}
+
+/* mesh.edges */
+static void rna_def_mesh_edges(BlenderRNA *brna, PropertyRNA *cprop)
+{
+       StructRNA *srna;
+//     PropertyRNA *prop;
+
+       FunctionRNA *func;
+       PropertyRNA *parm;
+
+       RNA_def_property_srna(cprop, "MeshEdges");
+       srna= RNA_def_struct(brna, "MeshEdges", NULL);
+       RNA_def_struct_sdna(srna, "Mesh");
+       RNA_def_struct_ui_text(srna, "Mesh Edges", "Collection of mesh edges");
+
+       func= RNA_def_function(srna, "add", "ED_mesh_edges_add");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
+       parm= RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add.", 0, INT_MAX);
+}
+
+/* mesh.faces */
 static void rna_def_mesh_faces(BlenderRNA *brna, PropertyRNA *cprop)
 {
        StructRNA *srna;
        PropertyRNA *prop;
 
-//     FunctionRNA *func;
-//     PropertyRNA *parm;
+       FunctionRNA *func;
+       PropertyRNA *parm;
 
        RNA_def_property_srna(cprop, "MeshFaces");
        srna= RNA_def_struct(brna, "MeshFaces", NULL);
@@ -1653,8 +1691,11 @@ static void rna_def_mesh_faces(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_property_pointer_funcs(prop, "rna_Mesh_active_mtface_get", NULL, NULL, NULL);
        RNA_def_property_ui_text(prop, "Active Texture Face", "Active Texture Face");
        RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-}
 
+       func= RNA_def_function(srna, "add", "ED_mesh_faces_add");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
+       parm= RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of vertices to add.", 0, INT_MAX);
+}
 
 /* mesh.vertex_colors */
 static void rna_def_vertex_colors(BlenderRNA *brna, PropertyRNA *cprop)
@@ -1738,6 +1779,29 @@ static void rna_def_uv_textures(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
 }
 
+/* mesh.materials */
+static void rna_def_mesh_materials(BlenderRNA *brna, PropertyRNA *cprop)
+{
+       StructRNA *srna;
+       // PropertyRNA *prop;
+
+       FunctionRNA *func;
+       PropertyRNA *parm;
+
+       RNA_def_property_srna(cprop, "MeshMaterials");
+       srna= RNA_def_struct(brna, "MeshMaterials", NULL);
+       RNA_def_struct_sdna(srna, "Mesh");
+       RNA_def_struct_ui_text(srna, "Mesh Materials", "Collection of materials");
+       
+       func= RNA_def_function(srna, "link", "ED_mesh_material_link");
+       RNA_def_function_ui_description(func, "Add a new material to Mesh.");
+       parm= RNA_def_pointer(func, "material", "Material", "", "Material to add.");
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+       
+       /* TODO, unlink? */
+}
+
+
 static void rna_def_mesh(BlenderRNA *brna)
 {
        StructRNA *srna;
@@ -1751,11 +1815,13 @@ static void rna_def_mesh(BlenderRNA *brna)
        RNA_def_property_collection_sdna(prop, NULL, "mvert", "totvert");
        RNA_def_property_struct_type(prop, "MeshVertex");
        RNA_def_property_ui_text(prop, "Vertices", "Vertices of the mesh");
+       rna_def_mesh_vertices(brna, prop);
 
        prop= RNA_def_property(srna, "edges", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "medge", "totedge");
        RNA_def_property_struct_type(prop, "MeshEdge");
        RNA_def_property_ui_text(prop, "Edges", "Edges of the mesh");
+       rna_def_mesh_edges(brna, prop);
 
        prop= RNA_def_property(srna, "faces", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "mface", "totface");
@@ -1883,7 +1949,8 @@ static void rna_def_mesh(BlenderRNA *brna)
        RNA_def_property_collection_sdna(prop, NULL, "mat", "totcol");
        RNA_def_property_struct_type(prop, "Material");
        RNA_def_property_ui_text(prop, "Materials", "");
-       
+       rna_def_mesh_materials(brna, prop);
+
        /* Mesh Draw Options for Edit Mode*/
        
        prop= RNA_def_property(srna, "show_edges", PROP_BOOLEAN, PROP_NONE);
index b0d655e611c5c67b877ade7f2daa40a4dc0c8180..eaf18920c8564086b694c90b32400b2ddcab1da2 100644 (file)
@@ -50,28 +50,12 @@ void RNA_api_mesh(StructRNA *srna)
        parm= RNA_def_float_matrix(func, "matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Matrix.", 0.0f, 0.0f);
        RNA_def_property_flag(parm, PROP_REQUIRED);
 
-       func= RNA_def_function(srna, "add_geometry", "ED_mesh_geometry_add");
-       RNA_def_function_flag(func, FUNC_USE_REPORTS);
-       parm= RNA_def_int(func, "vertices", 0, 0, INT_MAX, "Number", "Number of vertices to add.", 0, INT_MAX);
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm= RNA_def_int(func, "edges", 0, 0, INT_MAX, "Number", "Number of edges to add.", 0, INT_MAX);
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm= RNA_def_int(func, "faces", 0, 0, INT_MAX, "Number", "Number of faces to add.", 0, INT_MAX);
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-
        func= RNA_def_function(srna, "calc_normals", "ED_mesh_calc_normals");
        RNA_def_function_ui_description(func, "Calculate vertex normals.");
 
        func= RNA_def_function(srna, "update", "ED_mesh_update");
        RNA_def_boolean(func, "calc_edges", 0, "Calculate Edges", "Force recalculation of edges.");
        RNA_def_function_flag(func, FUNC_USE_CONTEXT);
-
-       func= RNA_def_function(srna, "add_material", "ED_mesh_material_add");
-       RNA_def_function_ui_description(func, "Add a new material to Mesh.");
-       parm= RNA_def_pointer(func, "material", "Material", "", "Material to add.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-
-
 }
 
 #endif
index 60d1f044cb462c15a6543f56ab169ec832f484fe..8e5f70a6f5831300a9a501c54da8a02783c68a95 100644 (file)
@@ -4703,7 +4703,9 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
                fprintf(stderr, "bpy_class_call(): unable to get python class for rna struct '%.200s'\n", RNA_struct_identifier(ptr->type));
                return -1;
        }
-       
+
+       printf("could not find function %s in %s to execute callback.\n", RNA_function_identifier(func), RNA_struct_identifier(ptr->type));
+
        bpy_context_set(C, &gilstate);
 
        if (!is_static) {