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:
authorCampbell Barton <ideasman42@gmail.com>2021-11-09 16:38:51 +0300
committerCampbell Barton <ideasman42@gmail.com>2021-11-09 16:38:51 +0300
commit0bcf014bcf36d2917b4ab1b77faa621c6345edc7 (patch)
tree6186c69b2f89f5879d82c2c1f4a27504c6e904bf
parent41b0820dddf90c91d8016806507cbe7838e7b2d1 (diff)
parent65c5ebf5779d07fb92fabd0ff992337f6c980cde (diff)
Merge branch 'blender-v3.0-release'
-rw-r--r--source/blender/blenkernel/BKE_mesh.h1
-rw-r--r--source/blender/blenkernel/intern/mesh_convert.cc51
-rw-r--r--source/blender/editors/object/object_modifier.c9
-rw-r--r--tests/python/CMakeLists.txt36
4 files changed, 79 insertions, 18 deletions
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index f44d35c62a3..be9b84ccd62 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -209,6 +209,7 @@ struct Mesh *BKE_mesh_create_derived_for_modifier(struct Depsgraph *depsgraph,
struct Scene *scene,
struct Object *ob_eval,
struct ModifierData *md_eval,
+ const bool use_virtual_modifiers,
const bool build_shapekey_layers);
/* Copies a nomain-Mesh into an existing Mesh. */
diff --git a/source/blender/blenkernel/intern/mesh_convert.cc b/source/blender/blenkernel/intern/mesh_convert.cc
index adfbe4b8c94..b8fcc10be44 100644
--- a/source/blender/blenkernel/intern/mesh_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_convert.cc
@@ -1277,10 +1277,16 @@ static void add_shapekey_layers(Mesh *mesh_dest, Mesh *mesh_src)
}
}
+/**
+ * \param use_virtual_modifiers: When enabled calculate virtual-modifiers before applying `md_eval`
+ * support this since virtual-modieirs are not modifiers from auser perspective,
+ * allowing shape keys to be included with the modifier being applied, see: T91923.
+ */
Mesh *BKE_mesh_create_derived_for_modifier(struct Depsgraph *depsgraph,
Scene *scene,
Object *ob_eval,
ModifierData *md_eval,
+ const bool use_virtual_modifiers,
const bool build_shapekey_layers)
{
Mesh *me = ob_eval->runtime.data_orig ? (Mesh *)ob_eval->runtime.data_orig :
@@ -1303,22 +1309,49 @@ Mesh *BKE_mesh_create_derived_for_modifier(struct Depsgraph *depsgraph,
BKE_keyblock_convert_to_mesh(kb, me);
}
- if (mti->type == eModifierTypeType_OnlyDeform) {
- int numVerts;
- float(*deformedVerts)[3] = BKE_mesh_vert_coords_alloc(me, &numVerts);
+ Mesh *mesh_temp = (Mesh *)BKE_id_copy_ex(nullptr, &me->id, nullptr, LIB_ID_COPY_LOCALIZE);
+ int numVerts = 0;
+ float(*deformedVerts)[3] = nullptr;
+
+ if (use_virtual_modifiers) {
+ VirtualModifierData virtualModifierData;
+ for (ModifierData *md_eval_virt =
+ BKE_modifiers_get_virtual_modifierlist(ob_eval, &virtualModifierData);
+ md_eval_virt && (md_eval_virt != ob_eval->modifiers.first);
+ md_eval_virt = md_eval_virt->next) {
+ if (!BKE_modifier_is_enabled(scene, md_eval_virt, eModifierMode_Realtime)) {
+ continue;
+ }
+ /* All virtual modifiers are deform modifiers. */
+ const ModifierTypeInfo *mti_virt = BKE_modifier_get_info((ModifierType)md_eval_virt->type);
+ BLI_assert(mti_virt->type == eModifierTypeType_OnlyDeform);
+ if (mti_virt->type != eModifierTypeType_OnlyDeform) {
+ continue;
+ }
+
+ if (deformedVerts == nullptr) {
+ deformedVerts = BKE_mesh_vert_coords_alloc(me, &numVerts);
+ }
+ mti_virt->deformVerts(md_eval_virt, &mectx, mesh_temp, deformedVerts, numVerts);
+ }
+ }
- result = (Mesh *)BKE_id_copy_ex(nullptr, &me->id, nullptr, LIB_ID_COPY_LOCALIZE);
+ if (mti->type == eModifierTypeType_OnlyDeform) {
+ if (deformedVerts == nullptr) {
+ deformedVerts = BKE_mesh_vert_coords_alloc(me, &numVerts);
+ }
+ result = mesh_temp;
mti->deformVerts(md_eval, &mectx, result, deformedVerts, numVerts);
BKE_mesh_vert_coords_apply(result, deformedVerts);
if (build_shapekey_layers) {
add_shapekey_layers(result, me);
}
-
- MEM_freeN(deformedVerts);
}
else {
- Mesh *mesh_temp = (Mesh *)BKE_id_copy_ex(nullptr, &me->id, nullptr, LIB_ID_COPY_LOCALIZE);
+ if (deformedVerts != nullptr) {
+ BKE_mesh_vert_coords_apply(mesh_temp, deformedVerts);
+ }
if (build_shapekey_layers) {
add_shapekey_layers(mesh_temp, me);
@@ -1332,6 +1365,10 @@ Mesh *BKE_mesh_create_derived_for_modifier(struct Depsgraph *depsgraph,
}
}
+ if (deformedVerts != nullptr) {
+ MEM_freeN(deformedVerts);
+ }
+
return result;
}
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index efe19785f31..21b978268d9 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -666,12 +666,13 @@ bool ED_object_modifier_convert(ReportList *UNUSED(reports),
static Mesh *modifier_apply_create_mesh_for_modifier(Depsgraph *depsgraph,
Object *object,
ModifierData *md_eval,
+ bool use_virtual_modifiers,
bool build_shapekey_layers)
{
Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
Object *object_eval = DEG_get_evaluated_object(depsgraph, object);
Mesh *mesh_applied = BKE_mesh_create_derived_for_modifier(
- depsgraph, scene_eval, object_eval, md_eval, build_shapekey_layers);
+ depsgraph, scene_eval, object_eval, md_eval, use_virtual_modifiers, build_shapekey_layers);
return mesh_applied;
}
@@ -708,7 +709,8 @@ static bool modifier_apply_shape(Main *bmain,
return false;
}
- Mesh *mesh_applied = modifier_apply_create_mesh_for_modifier(depsgraph, ob, md_eval, false);
+ Mesh *mesh_applied = modifier_apply_create_mesh_for_modifier(
+ depsgraph, ob, md_eval, true, false);
if (!mesh_applied) {
BKE_report(reports, RPT_ERROR, "Modifier is disabled or returned error, skipping apply");
return false;
@@ -767,7 +769,8 @@ static bool modifier_apply_obdata(
}
}
else {
- Mesh *mesh_applied = modifier_apply_create_mesh_for_modifier(depsgraph, ob, md_eval, true);
+ Mesh *mesh_applied = modifier_apply_create_mesh_for_modifier(
+ depsgraph, ob, md_eval, true, true);
if (!mesh_applied) {
BKE_report(reports, RPT_ERROR, "Modifier returned error, skipping apply");
return false;
diff --git a/tests/python/CMakeLists.txt b/tests/python/CMakeLists.txt
index 92d46eb8d80..1927223cf32 100644
--- a/tests/python/CMakeLists.txt
+++ b/tests/python/CMakeLists.txt
@@ -630,14 +630,16 @@ endif()
if(WITH_CYCLES OR WITH_OPENGL_RENDER_TESTS)
if(NOT OPENIMAGEIO_IDIFF)
- MESSAGE(STATUS "Disabling render tests because OIIO idiff does not exist")
+ MESSAGE(STATUS "Disabling Cycles tests because OIIO idiff does not exist")
elseif(NOT EXISTS "${TEST_SRC_DIR}/render/shader")
- MESSAGE(STATUS "Disabling render tests because tests folder does not exist at ${TEST_SRC_DIR}")
+ MESSAGE(STATUS "Disabling Cycles tests because tests folder does not exist at ${TEST_SRC_DIR}")
+ elseif(NOT WITH_COMPOSITOR)
+ MESSAGE(STATUS "Disabling Cycles tests because WITH_COMPOSITOR is disabled")
+ elseif(NOT WITH_OPENCOLORIO)
+ MESSAGE(STATUS "Disabling Cycles tests because WITH_OPENCOLORIO is disabled")
else()
set(render_tests
bsdf
- denoise
- displacement
hair
image_colorspace
image_data_types
@@ -646,20 +648,38 @@ if(WITH_CYCLES OR WITH_OPENGL_RENDER_TESTS)
integrator
light
mesh
- motion_blur
- openvdb
- render_layer
- reports
shader
shadow_catcher
sss
volume
)
+ if(WITH_OPENSUBDIV)
+ list(APPEND render_tests displacement)
+ endif()
+
+ if(WITH_FREESTYLE)
+ list(APPEND render_tests render_layer)
+ endif()
+
+ if(WITH_MOD_FLUID)
+ list(APPEND render_tests motion_blur reports)
+ endif()
+
+ if(WITH_OPENVDB)
+ list(APPEND render_tests openvdb)
+ endif()
+
+ if(WITH_OPENIMAGEDENOISE)
+ list(APPEND render_tests denoise)
+ endif()
+
if(WITH_OPENGL_RENDER_TESTS)
list(APPEND render_tests grease_pencil)
endif()
+ list(SORT render_tests)
+
# Cycles
if(WITH_CYCLES)
if(NOT WITH_CYCLES_OSL)