diff --git a/release/scripts/io/import_scene_3ds.py b/release/scripts/io/import_scene_3ds.py index 95da2637ed5..d34b5ad0723 100644 --- a/release/scripts/io/import_scene_3ds.py +++ b/release/scripts/io/import_scene_3ds.py @@ -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 diff --git a/release/scripts/io/import_scene_obj.py b/release/scripts/io/import_scene_obj.py index 17ac4c5dee6..e31d6c583ad 100644 --- a/release/scripts/io/import_scene_obj.py +++ b/release/scripts/io/import_scene_obj.py @@ -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)) diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index 5030e9f4868..84d05a7a48d 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -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 diff --git a/release/scripts/op/add_mesh_torus.py b/release/scripts/op/add_mesh_torus.py index e19f2b4e18c..217aa8fae83 100644 --- a/release/scripts/op/add_mesh_torus.py +++ b/release/scripts/op/add_mesh_torus.py @@ -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() diff --git a/release/scripts/op/object.py b/release/scripts/op/object.py index 28f3b226c21..cb97fb736b9 100644 --- a/release/scripts/op/object.py +++ b/release/scripts/op/object.py @@ -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 diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index bf809d39fe4..564fe04ca4d 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -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); diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c index edcdedf2a39..35cb9f02b64 100644 --- a/source/blender/editors/mesh/mesh_data.c +++ b/source/blender/editors/mesh/mesh_data.c @@ -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); diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index aff6d7d5697..659e08a1878 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -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); diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c index b0d655e611c..eaf18920c85 100644 --- a/source/blender/makesrna/intern/rna_mesh_api.c +++ b/source/blender/makesrna/intern/rna_mesh_api.c @@ -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 diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 60d1f044cb4..8e5f70a6f58 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -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) {