diff options
Diffstat (limited to 'source/blender/modifiers/intern/MOD_explode.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_explode.c | 42 |
1 files changed, 14 insertions, 28 deletions
diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c index b0806fed91c..7d2bf5f65bb 100644 --- a/source/blender/modifiers/intern/MOD_explode.c +++ b/source/blender/modifiers/intern/MOD_explode.c @@ -91,7 +91,6 @@ static void createFacepa(ExplodeModifierData *emd, ParticleSystemModifierData *p { ParticleSystem *psys = psmd->psys; MFace *fa = NULL, *mface = NULL; - MVert *mvert = NULL; ParticleData *pa; KDTree_3d *tree; RNG *rng; @@ -100,7 +99,7 @@ static void createFacepa(ExplodeModifierData *emd, ParticleSystemModifierData *p int i, p, v1, v2, v3, v4 = 0; const bool invert_vgroup = (emd->flag & eExplodeFlag_INVERT_VGROUP) != 0; - mvert = BKE_mesh_verts_for_write(mesh); + float(*positions)[3] = BKE_mesh_positions_for_write(mesh); mface = (MFace *)CustomData_get_layer(&mesh->fdata, CD_MFACE); totvert = mesh->totvert; totface = mesh->totface; @@ -160,10 +159,10 @@ static void createFacepa(ExplodeModifierData *emd, ParticleSystemModifierData *p /* set face-particle-indexes to nearest particle to face center */ for (i = 0, fa = mface; i < totface; i++, fa++) { - add_v3_v3v3(center, mvert[fa->v1].co, mvert[fa->v2].co); - add_v3_v3(center, mvert[fa->v3].co); + add_v3_v3v3(center, positions[fa->v1], positions[fa->v2]); + add_v3_v3(center, positions[fa->v3]); if (fa->v4) { - add_v3_v3(center, mvert[fa->v4].co); + add_v3_v3(center, positions[fa->v4]); mul_v3_fl(center, 0.25); } else { @@ -641,7 +640,7 @@ static Mesh *cutEdges(ExplodeModifierData *emd, Mesh *mesh) Mesh *split_m; MFace *mf = NULL, *df1 = NULL; MFace *mface = CustomData_get_layer(&mesh->fdata, CD_MFACE); - MVert *dupve, *mv; + float *dupve; EdgeHash *edgehash; EdgeHashIterator *ehi; int totvert = mesh->totvert; @@ -730,18 +729,11 @@ static Mesh *cutEdges(ExplodeModifierData *emd, Mesh *mesh) layers_num = CustomData_number_of_layers(&split_m->fdata, CD_MTFACE); - const MVert *mesh_verts = BKE_mesh_verts(mesh); - MVert *split_m_verts = BKE_mesh_verts_for_write(split_m); + float(*split_m_positions)[3] = BKE_mesh_positions_for_write(split_m); /* copy new faces & verts (is it really this painful with custom data??) */ for (i = 0; i < totvert; i++) { - MVert source; - MVert *dest; - source = mesh_verts[i]; - dest = &split_m_verts[i]; - CustomData_copy_data(&mesh->vdata, &split_m->vdata, i, i, 1); - *dest = source; } /* override original facepa (original pointer is saved in caller function) */ @@ -759,16 +751,13 @@ static Mesh *cutEdges(ExplodeModifierData *emd, Mesh *mesh) for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { BLI_edgehashIterator_getKey(ehi, &ed_v1, &ed_v2); esplit = POINTER_AS_INT(BLI_edgehashIterator_getValue(ehi)); - mv = &split_m_verts[ed_v2]; - dupve = &split_m_verts[esplit]; CustomData_copy_data(&split_m->vdata, &split_m->vdata, ed_v2, esplit, 1); - *dupve = *mv; - - mv = &split_m_verts[ed_v1]; + dupve = split_m_positions[esplit]; + copy_v3_v3(dupve, split_m_positions[ed_v2]); - mid_v3_v3v3(dupve->co, dupve->co, mv->co); + mid_v3_v3v3(dupve, dupve, split_m_positions[ed_v1]); } BLI_edgehashIterator_free(ehi); @@ -989,26 +978,23 @@ static Mesh *explodeMesh(ExplodeModifierData *emd, psys_sim_data_init(&sim); - const MVert *mesh_verts = BKE_mesh_verts(mesh); - MVert *explode_verts = BKE_mesh_verts_for_write(explode); + const float(*positions)[3] = BKE_mesh_positions(mesh); + float(*explode_positions)[3] = BKE_mesh_positions_for_write(explode); /* duplicate & displace vertices */ ehi = BLI_edgehashIterator_new(vertpahash); for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { - MVert source; - MVert *dest; /* get particle + vertex from hash */ BLI_edgehashIterator_getKey(ehi, &ed_v1, &ed_v2); ed_v2 -= totvert; v = POINTER_AS_INT(BLI_edgehashIterator_getValue(ehi)); - source = mesh_verts[ed_v1]; - dest = &explode_verts[v]; + copy_v3_v3(explode_positions[v], positions[ed_v1]); CustomData_copy_data(&mesh->vdata, &explode->vdata, ed_v1, v, 1); - *dest = source; + copy_v3_v3(explode_positions[v], positions[ed_v1]); if (ed_v2 != totpart) { /* get particle */ @@ -1019,7 +1005,7 @@ static Mesh *explodeMesh(ExplodeModifierData *emd, state.time = ctime; psys_get_particle_state(&sim, ed_v2, &state, 1); - vertco = explode_verts[v].co; + vertco = explode_positions[v]; mul_m4_v3(ctx->object->object_to_world, vertco); sub_v3_v3(vertco, birth.co); |