diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2015-10-21 18:30:35 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2015-10-21 18:30:35 +0300 |
commit | 0775680e4d05eda3c495a56dc0b6eafbe96dc586 (patch) | |
tree | 4f3286eef96dec6ababe43467ed2a4f50388b988 /source/blender/blenkernel/intern/mesh.c | |
parent | 4ade467fc6adfc13ce9e21d7e50b366fce70ea5f (diff) | |
parent | 6bc007610263c879f6bb30b844ba9d9a0fb9433c (diff) |
Merge branch 'master' into UI-graphical-redesignUI-graphical-redesign
Conflicts:
source/blender/blenkernel/BKE_blender.h
source/blender/blenloader/intern/versioning_270.c
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_intern.h
source/blender/editors/interface/resources.c
Diffstat (limited to 'source/blender/blenkernel/intern/mesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 3d6481349c5..318040db2be 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -490,12 +490,10 @@ static void mesh_tessface_clear_intern(Mesh *mesh, int free_customdata) mesh->totface = 0; } -Mesh *BKE_mesh_add(Main *bmain, const char *name) +void BKE_mesh_init(Mesh *me) { - Mesh *me; - - me = BKE_libblock_alloc(bmain, ID_ME, name); - + BLI_assert(MEMCMP_STRUCT_OFS_IS_ZERO(me, id)); + me->size[0] = me->size[1] = me->size[2] = 1.0; me->smoothresh = 30; me->texflag = ME_AUTOSPACE; @@ -511,6 +509,15 @@ Mesh *BKE_mesh_add(Main *bmain, const char *name) CustomData_reset(&me->fdata); CustomData_reset(&me->pdata); CustomData_reset(&me->ldata); +} + +Mesh *BKE_mesh_add(Main *bmain, const char *name) +{ + Mesh *me; + + me = BKE_libblock_alloc(bmain, ID_ME, name); + + BKE_mesh_init(me); return me; } @@ -2199,8 +2206,9 @@ void BKE_mesh_calc_normals_split(Mesh *mesh) } else { polynors = MEM_mallocN(sizeof(float[3]) * mesh->totpoly, __func__); - BKE_mesh_calc_normals_poly(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, - polynors, false); + BKE_mesh_calc_normals_poly( + mesh->mvert, NULL, mesh->totvert, + mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, polynors, false); free_polynors = true; } @@ -2237,7 +2245,7 @@ void BKE_mesh_split_faces(Mesh *mesh) BKE_mesh_calc_normals_split(mesh); } lnors = CustomData_get_layer(&mesh->ldata, CD_NORMAL); - /* Count. */ + /* Count number of vertices to be split. */ for (poly = 0; poly < num_polys; poly++) { MPoly *mp = &mpoly[poly]; int loop; @@ -2255,19 +2263,16 @@ void BKE_mesh_split_faces(Mesh *mesh) /* No new vertices are to be added, can do early exit. */ return; } - /* Actual split. */ + /* Reallocate all vert and edge related data. */ mesh->totvert += num_new_verts; mesh->totedge += 2 * num_new_verts; - mvert = mesh->mvert = MEM_reallocN(mesh->mvert, - sizeof(MVert) * mesh->totvert); - medge = mesh->medge = MEM_reallocN(mesh->medge, - sizeof(MEdge) * mesh->totedge); - if (mesh->dvert != NULL) { - mesh->dvert = MEM_reallocN(mesh->dvert, sizeof(MDeformVert) * mesh->totvert); - CustomData_set_layer(&mesh->vdata, CD_MDEFORMVERT, mesh->dvert); - } - CustomData_set_layer(&mesh->vdata, CD_MVERT, mesh->mvert); - CustomData_set_layer(&mesh->edata, CD_MEDGE, mesh->medge); + CustomData_realloc(&mesh->vdata, mesh->totvert); + CustomData_realloc(&mesh->edata, mesh->totedge); + /* Update pointers to a newly allocated memory. */ + BKE_mesh_update_customdata_pointers(mesh, false); + mvert = mesh->mvert; + medge = mesh->medge; + /* Perform actual vertex split. */ num_new_verts = 0; for (poly = 0; poly < num_polys; poly++) { MPoly *mp = &mpoly[poly]; @@ -2343,6 +2348,19 @@ Mesh *BKE_mesh_new_from_object( tmpcu = (Curve *)tmpobj->data; tmpcu->id.us--; + /* Copy cached display list, it might be needed by the stack evaluation. + * Ideally stack should be able to use render-time display list, but doing + * so is quite tricky and not safe so close to the release. + * + * TODO(sergey): Look into more proper solution. + */ + if (ob->curve_cache != NULL) { + if (tmpobj->curve_cache == NULL) { + tmpobj->curve_cache = MEM_callocN(sizeof(CurveCache), "CurveCache for curve types"); + } + BKE_displist_copy(&tmpobj->curve_cache->disp, &ob->curve_cache->disp); + } + /* if getting the original caged mesh, delete object modifiers */ if (cage) BKE_object_free_modifiers(tmpobj); |