Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2019-07-07 19:58:11 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-07-08 19:09:52 +0300
commit226c6f086aa255bb71e554c860545bb435c06756 (patch)
tree4c60367f561d5ecc08bb912049f937034b76e21d /source/blender/blenkernel/intern/mesh_iterators.c
parent0a16519f5df0fa74623d48b7786f1db22651110a (diff)
Fix T62941 Subdivision Modifier Showing all face dots
Previously in 2.79 we were using a specialized drawing using derivedMesh. Now the subsurf modifier tag each center vertex as facedot and let the DRWManager pick it up. Some modifiers (deforming ones) do not clear the tag so we can use this technique even if there is deforming modifiers after subsurf modifiers.
Diffstat (limited to 'source/blender/blenkernel/intern/mesh_iterators.c')
-rw-r--r--source/blender/blenkernel/intern/mesh_iterators.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/mesh_iterators.c b/source/blender/blenkernel/intern/mesh_iterators.c
index df6517066b8..f2ed9456b11 100644
--- a/source/blender/blenkernel/intern/mesh_iterators.c
+++ b/source/blender/blenkernel/intern/mesh_iterators.c
@@ -180,6 +180,54 @@ void BKE_mesh_foreach_mapped_face_center(
}
}
+/* Copied from cdDM_foreachMappedFaceCenter */
+void BKE_mesh_foreach_mapped_subdiv_face_center(
+ Mesh *mesh,
+ void (*func)(void *userData, int index, const float cent[3], const float no[3]),
+ void *userData,
+ MeshForeachFlag flag)
+{
+ const MPoly *mp = mesh->mpoly;
+ const MLoop *ml;
+ const MVert *mv;
+ float _no_buf[3];
+ float *no = (flag & MESH_FOREACH_USE_NORMAL) ? _no_buf : NULL;
+ const int *index = CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX);
+
+ if (index) {
+ for (int i = 0; i < mesh->totpoly; i++, mp++) {
+ const int orig = *index++;
+ if (orig == ORIGINDEX_NONE) {
+ continue;
+ }
+ ml = &mesh->mloop[mp->loopstart];
+ for (int j = 0; j < mp->totloop; j++, ml++) {
+ mv = &mesh->mvert[ml->v];
+ if (mv->flag & ME_VERT_FACEDOT) {
+ if (flag & MESH_FOREACH_USE_NORMAL) {
+ normal_short_to_float_v3(no, mv->no);
+ }
+ func(userData, orig, mv->co, no);
+ }
+ }
+ }
+ }
+ else {
+ for (int i = 0; i < mesh->totpoly; i++, mp++) {
+ ml = &mesh->mloop[mp->loopstart];
+ for (int j = 0; j < mp->totloop; j++, ml++) {
+ mv = &mesh->mvert[ml->v];
+ if (mv->flag & ME_VERT_FACEDOT) {
+ if (flag & MESH_FOREACH_USE_NORMAL) {
+ normal_short_to_float_v3(no, mv->no);
+ }
+ func(userData, i, mv->co, no);
+ }
+ }
+ }
+ }
+}
+
/* Helpers based on above foreach loopers> */
typedef struct MappedVCosData {