Commit: 04049a208014d6a6dbff805f06524c51fa3e13e1
Author: calra123
Date: Fri Aug 7 02:42:47 2020 +0530
Branches: soc-2020-testing-frameworks
https://developer.blender.org/rB04049a208014d6a6dbff805f06524c51fa3e13e1
WIP: Merged Dynamic paint and Physics Spec into ModifierSpec
===================================================================
M tests/python/modules/mesh_test.py
===================================================================
diff --git a/tests/python/modules/mesh_test.py
b/tests/python/modules/mesh_test.py
index c181b76c492..c008588f424 100644
--- a/tests/python/modules/mesh_test.py
+++ b/tests/python/modules/mesh_test.py
@@ -57,16 +57,18 @@ class ModifierSpec:
Holds one modifier and its parameters.
"""
- def __init__(self, modifier_name: str, modifier_type: str,
modifier_parameters: dict):
+ def __init__(self, modifier_name: str, modifier_type: str,
modifier_parameters: dict, frame_end=0):
"""
Constructs a modifier spec.
:param modifier_name: str - name of object modifier, e.g.
"myFirstSubsurfModif"
:param modifier_type: str - type of object modifier, e.g. "SUBSURF"
:param modifier_parameters: dict - {name : val} dictionary giving
modifier parameters, e.g. {"quality" : 4}
+ :param frame_end:int - frame at which simulation needs to be baked or
modifier needs to be applied.
"""
self.modifier_name = modifier_name
self.modifier_type = modifier_type
self.modifier_parameters = modifier_parameters
+ self.frame_end = frame_end
def __str__(self):
return "Modifier: " + self.modifier_name + " of type " +
self.modifier_type + \
@@ -323,34 +325,43 @@ class MeshTest:
"""
return self._test_updated
- def _set_parameters_util(self, modifier, modifier_parameters, settings):
+ def _set_parameters_util(self, modifier, modifier_parameters,
nested_settings_path, modifier_name):
"""
Doing a depth first traversal of the modifier parameters and setting
their values.
+ :param: modifier: Of type modifier, its altered to become a setting in
recursion
+ :param: modifier_parameters : dict, a simple/nested dictionary of
modifier parameters.
+ :param: nested_settings_path : list(stack): helps in tracing path to
each node.
"""
if not isinstance(modifier_parameters, dict):
param_setting = None
- for i, setting in enumerate(settings):
- if i == len(settings)-1:
+ for i, setting in enumerate(nested_settings_path):
+ # We want to set the attribute only when we have reached the
last setting
+ # Applying of intermediate settings is meaningless.
+ if i == len(nested_settings_path)-1:
setattr(modifier, setting, modifier_parameters)
else:
try:
param_setting = getattr(modifier, setting)
- modifier = param_setting
+ if setting == "canvas_surfaces":
+ modifier = param_setting.active
+ else:
+ modifier = param_setting
except AttributeError:
# Clean up first
bpy.ops.object.delete()
raise AttributeError("Modifier '{}' has no parameter
named '{}'".
- format(modifier.name, setting))
+ format(modifier_name, setting))
- settings.pop()
- return
+ # It pops the current node before moving on to its sibling.
+ nested_settings_path.pop()
+ return
for key in modifier_parameters:
- settings.append(key)
- self._set_parameters_util(modifier, modifier_parameters[key],
settings)
+ nested_settings_path.append(key)
+ self._set_parameters_util(modifier, modifier_parameters[key],
nested_settings_path, modifier_name)
- if len(settings) != 0:
- settings.pop()
+ if len(nested_settings_path) != 0:
+ nested_settings_path.pop()
def set_parameters(self, modifier, modifier_parameters):
"""
@@ -358,7 +369,8 @@ class MeshTest:
"""
settings = []
modifier_copy = modifier
- self._set_parameters_util(modifier_copy, modifier_parameters, settings)
+ modifier_name = modifier.name
+ self._set_parameters_util(modifier_copy, modifier_parameters,
settings, modifier_name)
def _add_modifier(self, test_object, modifier_spec: ModifierSpec):
"""
@@ -366,35 +378,58 @@ class MeshTest:
:param test_object: bpy.types.Object - Blender object to apply
modifier on.
:param modifier_spec: ModifierSpec - ModifierSpec object with
parameters
"""
+ bakers_list = ['CLOTH', 'SOFT_BODY', 'DYNAMIC_PAINT', 'FLUID']
+ scene = bpy.context.scene
+ scene.frame_set(0)
modifier = test_object.modifiers.new(modifier_spec.modifier_name,
modifier_spec.modifier_type)
if self.verbose:
print("Created modifier '{}' of type '{}'.".
format(modifier_spec.modifier_name,
modifier_spec.modifier_type))
- self.set_parameters(test_object.modifiers[modifier_spec.modifier_name],
- modifier_spec.modifier_parameters)
+ # Special case for Dynamic Paint, need to toggle Canvas on.
+ if modifier.type == "DYNAMIC_PAINT":
+ bpy.ops.dpaint.type_toggle(type='CANVAS')
+
+ self.set_parameters(modifier, modifier_spec.modifier_parameters)
+
+ if modifier.type in bakers_list:
+ self._bake_current_simulation(test_object, modifier.type,
modifier.name, modifier_spec.frame_end)
+
+ scene.frame_set(modifier_spec.frame_end)
def _apply_modifier(self, test_object, modifier_name):
# Modifier automatically gets applied when converting from Curve to
Mesh.
if test_object.type == 'CURVE':
bpy.ops.object.convert(target='MESH')
-
elif test_object.type == 'MESH':
bpy.ops.object.modifier_apply(modifier=modifier_name)
-
else:
raise Exception("This object type is not yet supported!")
def _bake_current_simulation(self, obj, test_mod_type, test_mod_name,
frame_end):
+ override_setting = None
for scene in bpy.data.scenes:
for modifier in obj.modifiers:
- if modifier.type == test_mod_type:
+ if modifier.type == 'FLUID':
+ bpy.ops.fluid.bake_all()
+ break
+
+ elif modifier.type == 'CLOTH' or modifier.type == 'SOFT_BODY':
obj.modifiers[test_mod_name].point_cache.frame_end =
frame_end
- override = {'scene': scene, 'active_object': obj,
'point_cache': modifier.point_cache}
+ override_setting = modifier.point_cache
+ override = {'scene': scene, 'active_object': obj,
'point_cache': override_setting}
+ bpy.ops.ptcache.bake(override, bake=True)
+ break
+
+ elif modifier.type == 'DYNAMIC_PAINT':
+ dp_setting =
modifier.canvas_settings.canvas_surfaces.active
+ override_setting = dp_setting.point_cache
+ override = {'scene': scene, 'active_object': obj,
'point_cache': override_setting}
bpy.ops.ptcache.bake(override, bake=True)
break
+
def _apply_physics_settings(self, test_object, physics_spec: PhysicsSpec):
"""
Apply Physics settings to test objects.
@@ -785,6 +820,7 @@ class OperatorTest:
if self.verbose:
print()
print("Running test {}...".format(index))
+ print("Test name {}\n".format(test_name))
success = self.run_test(test_name)
if not success:
@@ -904,7 +940,8 @@ class ModifierTest:
test_name = self.modifier_tests[index][0]
if self.verbose:
print()
- print("Running test {}...\n".format(index))
+ print("Running test {}...".format(index))
+ print("Test name {}\n".format(test_name))
success = self.run_test(test_name)
if not success:
@@ -1006,7 +1043,8 @@ class DeformModifierTest:
test_name = self.deform_tests[index].test_name
if self.verbose:
print()
- print("Running test {}...\n".format(index))
+ print("Running test {}...".format(index))
+ print("Test name {}\n".format(test_name))
success = self.run_test(test_name)
if not success:
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs