Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/DerivedMesh.c
| Show First 20 Lines • Show All 71 Lines • ▼ Show 20 Lines | |||||
| #include "BKE_deform.h" | #include "BKE_deform.h" | ||||
| #include "BLI_sys_types.h" /* for intptr_t support */ | #include "BLI_sys_types.h" /* for intptr_t support */ | ||||
| #include "DEG_depsgraph.h" | #include "DEG_depsgraph.h" | ||||
| #include "DEG_depsgraph_query.h" | #include "DEG_depsgraph_query.h" | ||||
| #include "BKE_shrinkwrap.h" | #include "BKE_shrinkwrap.h" | ||||
| #include "CLG_log.h" | |||||
| #ifdef WITH_OPENSUBDIV | #ifdef WITH_OPENSUBDIV | ||||
| # include "DNA_userdef_types.h" | # include "DNA_userdef_types.h" | ||||
| #endif | #endif | ||||
| /* very slow! enable for testing only! */ | /* very slow! enable for testing only! */ | ||||
| //#define USE_MODIFIER_VALIDATE | //#define USE_MODIFIER_VALIDATE | ||||
| #ifdef USE_MODIFIER_VALIDATE | #ifdef USE_MODIFIER_VALIDATE | ||||
| # define ASSERT_IS_VALID_DM(dm) (BLI_assert((dm == NULL) || (DM_is_valid(dm) == true))) | # define ASSERT_IS_VALID_DM(dm) (BLI_assert((dm == NULL) || (DM_is_valid(dm) == true))) | ||||
| # define ASSERT_IS_VALID_MESH(mesh) (BLI_assert((mesh == NULL) || (BKE_mesh_is_valid(mesh) == true))) | # define ASSERT_IS_VALID_MESH(mesh) (BLI_assert((mesh == NULL) || (BKE_mesh_is_valid(mesh) == true))) | ||||
| #else | #else | ||||
| # define ASSERT_IS_VALID_DM(dm) | # define ASSERT_IS_VALID_DM(dm) | ||||
| # define ASSERT_IS_VALID_MESH(mesh) | # define ASSERT_IS_VALID_MESH(mesh) | ||||
| #endif | #endif | ||||
| static CLG_LogRef LOG = {"bke.derivedmesh"}; | |||||
| static ThreadRWMutex loops_cache_lock = PTHREAD_RWLOCK_INITIALIZER; | static ThreadRWMutex loops_cache_lock = PTHREAD_RWLOCK_INITIALIZER; | ||||
| static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape_uid); | static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape_uid); | ||||
| static void mesh_init_origspace(Mesh *mesh); | static void mesh_init_origspace(Mesh *mesh); | ||||
| ▲ Show 20 Lines • Show All 440 Lines • ▼ Show 20 Lines | if (CustomData_has_layer(&dm->vertData, CD_SHAPEKEY)) { | ||||
| int uid; | int uid; | ||||
| if (ob) { | if (ob) { | ||||
| kb = BLI_findlink(&me->key->block, ob->shapenr - 1); | kb = BLI_findlink(&me->key->block, ob->shapenr - 1); | ||||
| if (kb) { | if (kb) { | ||||
| uid = kb->uid; | uid = kb->uid; | ||||
| } | } | ||||
| else { | else { | ||||
| printf("%s: error - could not find active shapekey %d!\n", | CLOG_ERROR(&LOG, "could not find active shapekey %d!", ob->shapenr - 1); | ||||
| __func__, ob->shapenr - 1); | |||||
| uid = INT_MAX; | uid = INT_MAX; | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| /* if no object, set to INT_MAX so we don't mess up any shapekey layers */ | /* if no object, set to INT_MAX so we don't mess up any shapekey layers */ | ||||
| uid = INT_MAX; | uid = INT_MAX; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob, CustomDataMask mask, bool take_ownership) | ||||
| CustomData_free(&me->fdata, me->totface); | CustomData_free(&me->fdata, me->totface); | ||||
| CustomData_free(&me->ldata, me->totloop); | CustomData_free(&me->ldata, me->totloop); | ||||
| CustomData_free(&me->pdata, me->totpoly); | CustomData_free(&me->pdata, me->totpoly); | ||||
| /* ok, this should now use new CD shapekey data, | /* ok, this should now use new CD shapekey data, | ||||
| * which should be fed through the modifier | * which should be fed through the modifier | ||||
| * stack */ | * stack */ | ||||
| if (tmp.totvert != me->totvert && !did_shapekeys && me->key) { | if (tmp.totvert != me->totvert && !did_shapekeys && me->key) { | ||||
| printf("%s: YEEK! this should be recoded! Shape key loss!: ID '%s'\n", __func__, tmp.id.name); | CLOG_WARN(&LOG, "YEEK! this should be recoded! Shape key loss!: ID '%s'", tmp.id.name); | ||||
| if (tmp.key && !(tmp.id.tag & LIB_TAG_NO_MAIN)) { | if (tmp.key && !(tmp.id.tag & LIB_TAG_NO_MAIN)) { | ||||
| id_us_min(&tmp.key->id); | id_us_min(&tmp.key->id); | ||||
| } | } | ||||
| tmp.key = NULL; | tmp.key = NULL; | ||||
| } | } | ||||
| /* Clear selection history */ | /* Clear selection history */ | ||||
| MEM_SAFE_FREE(tmp.mselect); | MEM_SAFE_FREE(tmp.mselect); | ||||
| ▲ Show 20 Lines • Show All 476 Lines • ▼ Show 20 Lines | static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape_uid) | ||||
| for (kb = me->key->block.first; kb; kb = kb->next) { | for (kb = me->key->block.first; kb; kb = kb->next) { | ||||
| if (kb->totelem != dm->numVertData) { | if (kb->totelem != dm->numVertData) { | ||||
| if (kb->data) | if (kb->data) | ||||
| MEM_freeN(kb->data); | MEM_freeN(kb->data); | ||||
| kb->totelem = dm->numVertData; | kb->totelem = dm->numVertData; | ||||
| kb->data = MEM_calloc_arrayN(kb->totelem, 3 * sizeof(float), "kb->data derivedmesh.c"); | kb->data = MEM_calloc_arrayN(kb->totelem, 3 * sizeof(float), "kb->data derivedmesh.c"); | ||||
| fprintf(stderr, "%s: lost a shapekey layer: '%s'! (bmesh internal error)\n", __func__, kb->name); | CLOG_ERROR(&LOG, "lost a shapekey layer: '%s'! (bmesh internal error)", kb->name); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void add_shapekey_layers(Mesh *me_dst, Mesh *me_src, Object *UNUSED(ob)) | static void add_shapekey_layers(Mesh *me_dst, Mesh *me_src, Object *UNUSED(ob)) | ||||
| { | { | ||||
| KeyBlock *kb; | KeyBlock *kb; | ||||
| Key *key = me_src->key; | Key *key = me_src->key; | ||||
| int i; | int i; | ||||
| if (!me_src->key) | if (!me_src->key) | ||||
| return; | return; | ||||
| /* ensure we can use mesh vertex count for derived mesh custom data */ | /* ensure we can use mesh vertex count for derived mesh custom data */ | ||||
| if (me_src->totvert != me_dst->totvert) { | if (me_src->totvert != me_dst->totvert) { | ||||
| fprintf(stderr, | CLOG_WARN(&LOG, "vertex size mismatch (mesh/eval) '%s' (%d != %d)", | ||||
| "%s: vertex size mismatch (mesh/eval) '%s' (%d != %d)\n", | me_src->id.name + 2, me_src->totvert, me_dst->totvert); | ||||
| __func__, me_src->id.name + 2, me_src->totvert, me_dst->totvert); | |||||
| return; | return; | ||||
| } | } | ||||
| for (i = 0, kb = key->block.first; kb; kb = kb->next, i++) { | for (i = 0, kb = key->block.first; kb; kb = kb->next, i++) { | ||||
| int ci; | int ci; | ||||
| float *array; | float *array; | ||||
| if (me_src->totvert != kb->totelem) { | if (me_src->totvert != kb->totelem) { | ||||
| fprintf(stderr, | CLOG_WARN(&LOG, "vertex size mismatch (Mesh '%s':%d != KeyBlock '%s':%d)", | ||||
| "%s: vertex size mismatch (Mesh '%s':%d != KeyBlock '%s':%d)\n", | me_src->id.name + 2, me_src->totvert, kb->name, kb->totelem); | ||||
| __func__, me_src->id.name + 2, me_src->totvert, kb->name, kb->totelem); | |||||
| array = MEM_calloc_arrayN((size_t)me_src->totvert, sizeof(float[3]), __func__); | array = MEM_calloc_arrayN((size_t)me_src->totvert, sizeof(float[3]), __func__); | ||||
| } | } | ||||
| else { | else { | ||||
| array = MEM_malloc_arrayN((size_t)me_src->totvert, sizeof(float[3]), __func__); | array = MEM_malloc_arrayN((size_t)me_src->totvert, sizeof(float[3]), __func__); | ||||
| memcpy(array, kb->data, (size_t)me_src->totvert * sizeof(float[3])); | memcpy(array, kb->data, (size_t)me_src->totvert * sizeof(float[3])); | ||||
| } | } | ||||
| CustomData_add_layer_named(&me_dst->vdata, CD_SHAPEKEY, CD_ASSIGN, array, me_dst->totvert, kb->name); | CustomData_add_layer_named(&me_dst->vdata, CD_SHAPEKEY, CD_ASSIGN, array, me_dst->totvert, kb->name); | ||||
| ▲ Show 20 Lines • Show All 1,705 Lines • Show Last 20 Lines | |||||