Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/DerivedMesh.cc
| Show First 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | |||||
| #include "DEG_depsgraph_query.h" | #include "DEG_depsgraph_query.h" | ||||
| #include "CLG_log.h" | #include "CLG_log.h" | ||||
| #ifdef WITH_OPENSUBDIV | #ifdef WITH_OPENSUBDIV | ||||
| # include "DNA_userdef_types.h" | # include "DNA_userdef_types.h" | ||||
| #endif | #endif | ||||
| using blender::float3; | |||||
| using blender::IndexRange; | |||||
| /* 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_MESH(mesh) \ | # define ASSERT_IS_VALID_MESH(mesh) \ | ||||
| (BLI_assert((mesh == nullptr) || (BKE_mesh_is_valid(mesh) == true))) | (BLI_assert((mesh == nullptr) || (BKE_mesh_is_valid(mesh) == true))) | ||||
| #else | #else | ||||
| # define ASSERT_IS_VALID_MESH(mesh) | # define ASSERT_IS_VALID_MESH(mesh) | ||||
| ▲ Show 20 Lines • Show All 732 Lines • ▼ Show 20 Lines | CDMaskLink *datamasks = BKE_modifier_calc_data_masks( | ||||
| scene, ob, md, &final_datamask, required_mode, previewmd, &previewmask); | scene, ob, md, &final_datamask, required_mode, previewmd, &previewmask); | ||||
| CDMaskLink *md_datamask = datamasks; | CDMaskLink *md_datamask = datamasks; | ||||
| /* XXX Always copying POLYINDEX, else tessellated data are no more valid! */ | /* XXX Always copying POLYINDEX, else tessellated data are no more valid! */ | ||||
| CustomData_MeshMasks append_mask = CD_MASK_BAREMESH_ORIGINDEX; | CustomData_MeshMasks append_mask = CD_MASK_BAREMESH_ORIGINDEX; | ||||
| /* Clear errors before evaluation. */ | /* Clear errors before evaluation. */ | ||||
| BKE_modifiers_clear_errors(ob); | BKE_modifiers_clear_errors(ob); | ||||
| if (ob->modifier_flag & OB_MODIFIER_FLAG_ADD_REST_POSITION) { | |||||
| if (mesh_final == nullptr) { | |||||
| mesh_final = BKE_mesh_copy_for_eval(mesh_input, true); | |||||
| ASSERT_IS_VALID_MESH(mesh_final); | |||||
| } | |||||
| float3 *rest_positions = static_cast<float3 *>(CustomData_add_layer_named(&mesh_final->vdata, | |||||
| CD_PROP_FLOAT3, | |||||
| CD_DEFAULT, | |||||
| nullptr, | |||||
| mesh_final->totvert, | |||||
| "rest_position")); | |||||
| blender::threading::parallel_for( | |||||
| IndexRange(mesh_final->totvert), 1024, [&](const IndexRange range) { | |||||
| for (const int i : range) { | |||||
| rest_positions[i] = mesh_final->mvert[i].co; | |||||
| } | |||||
| }); | |||||
| } | |||||
| /* Apply all leading deform modifiers. */ | /* Apply all leading deform modifiers. */ | ||||
| if (use_deform) { | if (use_deform) { | ||||
| for (; md; md = md->next, md_datamask = md_datamask->next) { | for (; md; md = md->next, md_datamask = md_datamask->next) { | ||||
| const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md->type); | const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md->type); | ||||
| if (!BKE_modifier_is_enabled(scene, md, required_mode)) { | if (!BKE_modifier_is_enabled(scene, md, required_mode)) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 1,230 Lines • Show Last 20 Lines | |||||