Changeset View
Changeset View
Standalone View
Standalone View
tests/python/modifiers.py
| Show All 20 Lines | |||||
| import math | import math | ||||
| import os | import os | ||||
| import sys | import sys | ||||
| from random import shuffle, seed | from random import shuffle, seed | ||||
| import bpy | import bpy | ||||
| sys.path.append(os.path.dirname(os.path.realpath(__file__))) | sys.path.append(os.path.dirname(os.path.realpath(__file__))) | ||||
| from modules.mesh_test import ModifierTest, ModifierSpec | from modules.mesh_test import RunTest, ModifierSpec, MeshTest | ||||
| seed(0) | seed(0) | ||||
| def get_generate_modifiers_list(test_object_name, randomize=False): | def get_generate_modifiers_list(test_object_name, randomize=False): | ||||
| """ | """ | ||||
| Construct a list of 'Generate' modifiers with default parameters. | Construct a list of 'Generate' modifiers with default parameters. | ||||
| :param test_object_name: str - name of test object. Some modifiers like boolean need an extra parameter beside | :param test_object_name: str - name of test object. Some modifiers like boolean need an extra parameter beside | ||||
| the default one. E.g. boolean needs object, mask needs vertex group etc... | the default one. E.g. boolean needs object, mask needs vertex group etc... | ||||
| The extra parameter name will be <test_object_name>_<modifier_type> | The extra parameter name will be <test_object_name>_<modifier_type> | ||||
| :param randomize: bool - if True shuffle the list of modifiers. | :param randomize: bool - if True shuffle the list of modifiers. | ||||
| :return: list of 'Generate' modifiers with default parameters. | :return: list of 'Generate' modifiers with default parameters. | ||||
| """ | """ | ||||
| boolean_test_object = bpy.data.objects[test_object_name + "_boolean"] | boolean_test_object = bpy.data.objects[test_object_name + "_boolean"] | ||||
| generate_modifiers = [ | generate_modifiers = [ | ||||
| ModifierSpec('array', 'ARRAY', {}), | ModifierSpec('array', 'ARRAY', {}), | ||||
| ModifierSpec('bevel', 'BEVEL', {'width': 0.1}), | ModifierSpec('bevel', 'BEVEL', {'width': 0.1}), | ||||
| ModifierSpec('boolean', 'BOOLEAN', {'object': boolean_test_object, 'solver': 'FAST'}), | ModifierSpec('boolean', 'BOOLEAN', {'object': boolean_test_object, 'solver': 'FAST'}), | ||||
| ModifierSpec('build', 'BUILD', {'frame_start': 0, 'frame_duration': 1}), | ModifierSpec('build', 'BUILD', {'frame_start': 1, 'frame_duration': 1}, 2), | ||||
| ModifierSpec('decimate', 'DECIMATE', {}), | ModifierSpec('decimate', 'DECIMATE', {}), | ||||
| ModifierSpec('edge split', 'EDGE_SPLIT', {}), | ModifierSpec('edge split', 'EDGE_SPLIT', {}), | ||||
| # mask can effectively delete the mesh since the vertex group need to be updated after each | # mask can effectively delete the mesh since the vertex group need to be updated after each | ||||
| # applied modifier. Needs to be tested separately. | # applied modifier. Needs to be tested separately. | ||||
| # ModifierSpec('mask', 'MASK', {'vertex_group': mask_vertex_group}, False), | # ModifierSpec('mask', 'MASK', {'vertex_group': mask_vertex_group}, False), | ||||
| ModifierSpec('mirror', 'MIRROR', {}), | ModifierSpec('mirror', 'MIRROR', {}), | ||||
| ModifierSpec('multires', 'MULTIRES', {}), | ModifierSpec('multires', 'MULTIRES', {}), | ||||
| # remesh can also generate an empty mesh. Skip. | # remesh can also generate an empty mesh. Skip. | ||||
| # ModifierSpec('remesh', 'REMESH', {}), | # ModifierSpec('remesh', 'REMESH', {}), | ||||
| # ModifierSpec('screw', 'SCREW', {}), # screw can make the test very slow. Skipping for now. | # ModifierSpec('screw', 'SCREW', {}), # screw can make the test very slow. Skipping for now. | ||||
| # ModifierSpec('skin', 'SKIN', {}), # skin is not reproducible . | |||||
campbellbarton: Why was this line removed? it seems like useful information to keep. | |||||
Done Inline ActionsThis line was removed because I was able to reproduce it. There is a test for Skin in Line 225-227 in modifiers.py calra: This line was removed because I was able to reproduce it. There is a test for Skin in Line 225… | |||||
| ModifierSpec('solidify', 'SOLIDIFY', {}), | ModifierSpec('solidify', 'SOLIDIFY', {}), | ||||
Done Inline ActionsNo extra empty lines in patches... Especially when they break pep8 standard ;) mont29: No extra empty lines in patches... Especially when they break pep8 standard ;) | |||||
| ModifierSpec('subsurf', 'SUBSURF', {}), | ModifierSpec('subsurf', 'SUBSURF', {}), | ||||
| ModifierSpec('triangulate', 'TRIANGULATE', {}), | ModifierSpec('triangulate', 'TRIANGULATE', {}), | ||||
| ModifierSpec('wireframe', 'WIREFRAME', {}) | ModifierSpec('wireframe', 'WIREFRAME', {}) | ||||
| ] | ] | ||||
| if randomize: | if randomize: | ||||
| shuffle(generate_modifiers) | shuffle(generate_modifiers) | ||||
| return generate_modifiers | return generate_modifiers | ||||
| def main(): | def main(): | ||||
| mask_first_list = get_generate_modifiers_list("testCubeMaskFirst", randomize=True) | mask_first_list = get_generate_modifiers_list("testCubeMaskFirst", randomize=True) | ||||
| mask_vertex_group = "testCubeMaskFirst" + "_mask" | mask_vertex_group = "testCubeMaskFirst" + "_mask" | ||||
| mask_first_list.insert(0, ModifierSpec('mask', 'MASK', {'vertex_group': mask_vertex_group})) | mask_first_list.insert(0, ModifierSpec('mask', 'MASK', {'vertex_group': mask_vertex_group})) | ||||
| tests = [ | tests = [ | ||||
| ############################### | ############################### | ||||
| # List of 'Generate' modifiers on a cube | # List of 'Generate' modifiers on a cube | ||||
| ############################### | ############################### | ||||
| # 0 | # 0 | ||||
| # ["testCube", "expectedCube", get_generate_modifiers_list("testCube")], | # MeshTest("testCube", "expectedCube", get_generate_modifiers_list("testCube")), | ||||
| ["testCubeRandom", "expectedCubeRandom", get_generate_modifiers_list("testCubeRandom", randomize=True)], | MeshTest("CubeRandom", "testCubeRandom", "expectedCubeRandom", | ||||
| ["testCubeMaskFirst", "expectedCubeMaskFirst", mask_first_list], | get_generate_modifiers_list("testCubeRandom", randomize=True)), | ||||
| MeshTest("CubeMaskFirst", "testCubeMaskFirst", "expectedCubeMaskFirst", mask_first_list), | |||||
| ["testCollapseDecimate", "expectedCollapseDecimate", | MeshTest("CollapseDecimate", "testCollapseDecimate", "expectedCollapseDecimate", | ||||
| [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2}), | [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2}), | ||||
| ModifierSpec('decimate', 'DECIMATE', {'decimate_type': 'COLLAPSE', 'ratio': 0.25, 'use_collapse_triangulate': True})]], | ModifierSpec('decimate', 'DECIMATE', | ||||
| ["testPlanarDecimate", "expectedPlanarDecimate", | {'decimate_type': 'COLLAPSE', 'ratio': 0.25, 'use_collapse_triangulate': True})]), | ||||
| MeshTest("PlanarDecimate", "testPlanarDecimate", "expectedPlanarDecimate", | |||||
| [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2}), | [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2}), | ||||
| ModifierSpec('decimate', 'DECIMATE', {'decimate_type': 'DISSOLVE', 'angle_limit': math.radians(30)})]], | ModifierSpec('decimate', 'DECIMATE', | ||||
| ["testUnsubdivideDecimate", "expectedUnsubdivideDecimate", | {'decimate_type': 'DISSOLVE', 'angle_limit': math.radians(30)})]), | ||||
| MeshTest("UnsubdivideDecimate", "testUnsubdivideDecimate", "expectedUnsubdivideDecimate", | |||||
| [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2}), | [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2}), | ||||
| ModifierSpec('decimate', 'DECIMATE', {'decimate_type': 'UNSUBDIV', 'iterations': 2})]], | ModifierSpec('decimate', 'DECIMATE', {'decimate_type': 'UNSUBDIV', 'iterations': 2})]), | ||||
| # 5 | # 5 | ||||
| ["testRadialBisectMirror", "expectedRadialBisectMirror", | MeshTest("RadialBisectMirror", "testRadialBisectMirror", "expectedRadialBisectMirror", | ||||
| [ModifierSpec('mirror1', 'MIRROR', {'use_bisect_axis': (True, False, False)}), | [ModifierSpec('mirror1', 'MIRROR', {'use_bisect_axis': (True, False, False)}), | ||||
| ModifierSpec('mirror2', 'MIRROR', {'use_bisect_axis': (True, False, False), 'mirror_object': bpy.data.objects["testRadialBisectMirrorHelper"]}), | ModifierSpec('mirror2', 'MIRROR', {'use_bisect_axis': (True, False, False), | ||||
| ModifierSpec('mirror3', 'MIRROR', {'use_axis': (False, True, False), 'use_bisect_axis': (False, True, False), 'use_bisect_flip_axis': (False, True, False), 'mirror_object': bpy.data.objects["testRadialBisectMirrorHelper"]})]], | 'mirror_object': bpy.data.objects[ | ||||
| ["regressT58411Mirror", "expectedT58411Mirror", | "testRadialBisectMirrorHelper"]}), | ||||
| ModifierSpec('mirror3', 'MIRROR', | |||||
| {'use_axis': (False, True, False), 'use_bisect_axis': (False, True, False), | |||||
| 'use_bisect_flip_axis': (False, True, False), | |||||
| 'mirror_object': bpy.data.objects["testRadialBisectMirrorHelper"]})]), | |||||
| MeshTest("T58411Mirror", "regressT58411Mirror", "expectedT58411Mirror", | |||||
| [ModifierSpec('mirror', 'MIRROR', {}), | [ModifierSpec('mirror', 'MIRROR', {}), | ||||
| ModifierSpec('bevel', 'BEVEL', {'segments': 2, 'limit_method': 'WEIGHT'}), | ModifierSpec('bevel', 'BEVEL', {'segments': 2, 'limit_method': 'WEIGHT'}), | ||||
| ModifierSpec('subd', 'SUBSURF', {'levels': 1})]], | ModifierSpec('subd', 'SUBSURF', {'levels': 1})]), | ||||
| ["testBasicScrew", "expectedBasicScrew", | MeshTest("BasicScrew", "testBasicScrew", "expectedBasicScrew", | ||||
| [ModifierSpec('mirror', 'MIRROR', {'mirror_object': bpy.data.objects["testBasicScrewHelper"]}), | [ModifierSpec('mirror', 'MIRROR', {'mirror_object': bpy.data.objects["testBasicScrewHelper"]}), | ||||
| ModifierSpec("screw", 'SCREW', {'angle': math.radians(400), 'steps': 20, 'iterations': 2, 'screw_offset': 2, 'use_normal_calculate': True})]], | ModifierSpec("screw", 'SCREW', | ||||
| ["testObjectScrew", "expectedObjectScrew", | {'angle': math.radians(400), 'steps': 20, 'iterations': 2, 'screw_offset': 2, | ||||
| 'use_normal_calculate': True})]), | |||||
| MeshTest("ObjectScrew", "testObjectScrew", "expectedObjectScrew", | |||||
| [ModifierSpec('mirror', 'MIRROR', {'mirror_object': bpy.data.objects["testObjectScrewHelper2"]}), | [ModifierSpec('mirror', 'MIRROR', {'mirror_object': bpy.data.objects["testObjectScrewHelper2"]}), | ||||
| ModifierSpec("screw", 'SCREW', {"angle": math.radians(600), 'steps': 32, 'iterations': 1, 'use_object_screw_offset': True, 'use_normal_calculate': True, 'object': bpy.data.objects["testObjectScrewHelper1"]})]], | ModifierSpec("screw", 'SCREW', | ||||
| {"angle": math.radians(600), 'steps': 32, 'iterations': 1, | |||||
| 'use_object_screw_offset': True, | |||||
| 'use_normal_calculate': True, 'object': bpy.data.objects["testObjectScrewHelper1"]})]), | |||||
| # 9 | # 9 | ||||
| ["testMergedScrewWeld", "expectedMergedScrewWeld", | MeshTest("MergedScrewWeld", "testMergedScrewWeld", "expectedMergedScrewWeld", | ||||
| [ModifierSpec("screw", 'SCREW', {'angle': math.radians(360), 'steps': 12, 'iterations': 1, 'screw_offset': 1, 'use_normal_calculate': True, 'use_merge_vertices': True}), | [ModifierSpec("screw", 'SCREW', | ||||
| ModifierSpec("weld", 'WELD', {"merge_threshold": 0.001})]], | {'angle': math.radians(360), 'steps': 12, 'iterations': 1, 'screw_offset': 1, | ||||
| ["regressT72380Weld", "expectedT72380Weld", | 'use_normal_calculate': True, 'use_merge_vertices': True}), | ||||
| [ModifierSpec('vedit', 'VERTEX_WEIGHT_EDIT', {'vertex_group': 'Group', 'use_remove': True, 'remove_threshold': 1}), | ModifierSpec("weld", 'WELD', {"merge_threshold": 0.001})]), | ||||
| ModifierSpec("weld", 'WELD', {"merge_threshold": 0.2, "vertex_group": "Group"})]], | MeshTest("T72380Weld", "regressT72380Weld", "expectedT72380Weld", | ||||
| ["regressT72792Weld", "expectedT72792Weld", | [ModifierSpec('vedit', 'VERTEX_WEIGHT_EDIT', | ||||
| {'vertex_group': 'Group', 'use_remove': True, 'remove_threshold': 1}), | |||||
| ModifierSpec("weld", 'WELD', {"merge_threshold": 0.2, "vertex_group": "Group"})]), | |||||
| MeshTest("T72792Weld", "regressT72792Weld", "expectedT72792Weld", | |||||
| [ModifierSpec('array', 'ARRAY', {'fit_type': 'FIXED_COUNT', 'count': 2}), | [ModifierSpec('array', 'ARRAY', {'fit_type': 'FIXED_COUNT', 'count': 2}), | ||||
| ModifierSpec("weld", 'WELD', {"merge_threshold": 0.1, "vertex_group": "Group"})]], | ModifierSpec("weld", 'WELD', {"merge_threshold": 0.1, "vertex_group": "Group"})]), | ||||
| ############################################ | ############################################ | ||||
| # One 'Generate' modifier on primitive meshes | # One 'Generate' modifier on primitive meshes | ||||
| ############################################# | ############################################# | ||||
| # 12 | # 12 | ||||
| ["testCubeArray", "expectedCubeArray", [ModifierSpec('array', 'ARRAY', {})]], | MeshTest("CubeArray", "testCubeArray", "expectedCubeArray", | ||||
| ["testCapArray", "expectedCapArray", | [ModifierSpec('array', 'ARRAY', {})]), | ||||
| [ModifierSpec('array', 'ARRAY', {'fit_type': 'FIT_LENGTH', 'fit_length': 2.0, 'start_cap': bpy.data.objects["testCapStart"], 'end_cap': bpy.data.objects["testCapEnd"]})]], | MeshTest("CapArray", "testCapArray", "expectedCapArray", | ||||
| ["testCurveArray", "expectedCurveArray", | [ModifierSpec('array', 'ARRAY', | ||||
| [ModifierSpec('array', 'ARRAY', {'fit_type': 'FIT_CURVE', 'curve': bpy.data.objects["testCurveArrayHelper"], 'use_relative_offset': False, 'use_constant_offset': True, 'constant_offset_displace': (0.5, 0, 0)})]], | {'fit_type': 'FIT_LENGTH', 'fit_length': 2.0, | ||||
| ["testRadialArray", "expectedRadialArray", | 'start_cap': bpy.data.objects["testCapStart"], | ||||
| [ModifierSpec('array', 'ARRAY', {'fit_type': 'FIXED_COUNT', 'count': 3, 'use_merge_vertices': True, 'use_merge_vertices_cap': True, 'use_relative_offset': False, 'use_object_offset': True, 'offset_object': bpy.data.objects["testRadialArrayHelper"]})]], | 'end_cap': bpy.data.objects["testCapEnd"]})]), | ||||
| MeshTest("CurveArray", "testCurveArray", "expectedCurveArray", | |||||
| [ModifierSpec('array', 'ARRAY', | |||||
| {'fit_type': 'FIT_CURVE', 'curve': bpy.data.objects["testCurveArrayHelper"], | |||||
| 'use_relative_offset': False, 'use_constant_offset': True, | |||||
| 'constant_offset_displace': (0.5, 0, 0)})]), | |||||
| MeshTest("RadialArray", "testRadialArray", "expectedRadialArray", | |||||
| [ModifierSpec('array', 'ARRAY', {'fit_type': 'FIXED_COUNT', 'count': 3, 'use_merge_vertices': True, | |||||
| 'use_merge_vertices_cap': True, 'use_relative_offset': False, | |||||
| 'use_object_offset': True, | |||||
| 'offset_object': bpy.data.objects["testRadialArrayHelper"]})]), | |||||
| ["testCylinderBuild", "expectedCylinderBuild", [ModifierSpec('build', 'BUILD', {'frame_start': 0, 'frame_duration': 1})]], | MeshTest("CylinderBuild", "testCylinderBuild", "expectedCylinderBuild", | ||||
| [ModifierSpec('build', 'BUILD', {'frame_start': 1, 'frame_duration': 1}, 2)]), | |||||
| # 17 | # 17 | ||||
| ["testConeDecimate", "expectedConeDecimate", [ModifierSpec('decimate', 'DECIMATE', {'ratio': 0.5})]], | MeshTest("ConeDecimate", "testConeDecimate", "expectedConeDecimate", | ||||
| ["testCubeEdgeSplit", "expectedCubeEdgeSplit", [ModifierSpec('edge split', 'EDGE_SPLIT', {})]], | [ModifierSpec('decimate', 'DECIMATE', {'ratio': 0.5})]), | ||||
| MeshTest("CubeEdgeSplit", "testCubeEdgeSplit", "expectedCubeEdgeSplit", | |||||
| ["testSphereMirror", "expectedSphereMirror", [ModifierSpec('mirror', 'MIRROR', {})]], | [ModifierSpec('edge split', 'EDGE_SPLIT', {})]), | ||||
| ["testLocalMirror", "expectedLocalMirror", | |||||
| [ModifierSpec('mirror', 'MIRROR', {'use_clip': True})]], | MeshTest("SphereMirror", "testSphereMirror", "expectedSphereMirror", | ||||
| ["testObjectOffsetMirror", "expectedObjectOffsetMirror", | [ModifierSpec('mirror', 'MIRROR', {})]), | ||||
| [ModifierSpec('mirror', 'MIRROR', {'mirror_object': bpy.data.objects["testObjectOffsetMirrorHelper"]})]], | MeshTest("LocalMirror", "testLocalMirror", "expectedLocalMirror", | ||||
| [ModifierSpec('mirror', 'MIRROR', {'use_clip': True})]), | |||||
| ["testCylinderMask", "expectedCylinderMask", [ModifierSpec('mask', 'MASK', {'vertex_group': "mask_vertex_group"})]], | MeshTest("ObjectOffsetMirror", "testObjectOffsetMirror", "expectedObjectOffsetMirror", | ||||
| ["testConeMultiRes", "expectedConeMultiRes", [ModifierSpec('multires', 'MULTIRES', {})]], | [ModifierSpec('mirror', 'MIRROR', | ||||
| {'mirror_object': bpy.data.objects["testObjectOffsetMirrorHelper"]})]), | |||||
| MeshTest("CylinderMask", "testCylinderMask", "expectedCylinderMask", | |||||
| [ModifierSpec('mask', 'MASK', {'vertex_group': "mask_vertex_group"})]), | |||||
| MeshTest("ConeMultiRes", "testConeMultiRes", "expectedConeMultiRes", | |||||
| [ModifierSpec('multires', 'MULTIRES', {})]), | |||||
| # 24 | # 24 | ||||
| ["testCubeScrew", "expectedCubeScrew", [ModifierSpec('screw', 'SCREW', {})]], | MeshTest("CubeScrew", "testCubeScrew", "expectedCubeScrew", | ||||
| [ModifierSpec('screw', 'SCREW', {})]), | |||||
| ["testCubeSolidify", "expectedCubeSolidify", [ModifierSpec('solidify', 'SOLIDIFY', {})]], | MeshTest("CubeSolidify", "testCubeSolidify", "expectedCubeSolidify", | ||||
| ["testComplexSolidify", "expectedComplexSolidify", | [ModifierSpec('solidify', 'SOLIDIFY', {})]), | ||||
| [ModifierSpec('solidify', 'SOLIDIFY', {'solidify_mode': 'NON_MANIFOLD', 'thickness': 0.05, 'offset': 0, 'nonmanifold_thickness_mode': 'CONSTRAINTS'})]], | MeshTest("ComplexSolidify", "testComplexSolidify", "expectedComplexSolidify", | ||||
| ["regressT63063Solidify", "expectedT63063Solidify", | [ModifierSpec('solidify', 'SOLIDIFY', {'solidify_mode': 'NON_MANIFOLD', 'thickness': 0.05, 'offset': 0, | ||||
| [ModifierSpec('solid', 'SOLIDIFY', {'thickness': 0.1, 'offset': 0.7})]], | 'nonmanifold_thickness_mode': 'CONSTRAINTS'})]), | ||||
| ["regressT61979Solidify", "expectedT61979Solidify", | MeshTest("T63063Solidify", "regressT63063Solidify", "expectedT63063Solidify", | ||||
| [ModifierSpec('solid', 'SOLIDIFY', {'thickness': -0.25, 'use_even_offset': True, 'use_quality_normals': True})]], | [ModifierSpec('solid', 'SOLIDIFY', {'thickness': 0.1, 'offset': 0.7})]), | ||||
| MeshTest("T61979Solidify", "regressT61979Solidify", "expectedT61979Solidify", | |||||
| ["testMonkeySubsurf", "expectedMonkeySubsurf", [ModifierSpec('subsurf', 'SUBSURF', {})]], | [ModifierSpec('solid', 'SOLIDIFY', | ||||
| ["testCatmullClarkSubdivisionSurface", "expectedCatmullClarkSubdivisionSurface", | {'thickness': -0.25, 'use_even_offset': True, 'use_quality_normals': True})]), | ||||
| [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2})]], | |||||
| ["testSimpleSubdivisionSurface", "expectedSimpleSubdivisionSurface", | MeshTest("MonkeySubsurf", "testMonkeySubsurf", "expectedMonkeySubsurf", | ||||
| [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2, 'subdivision_type': 'SIMPLE'})]], | [ModifierSpec('subsurf', 'SUBSURF', {})]), | ||||
| ["testCrease2dSubdivisionSurface", "expectedCrease2dSubdivisionSurface", | MeshTest("CatmullClarkSubdivisionSurface", "testCatmullClarkSubdivisionSurface", | ||||
| [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2})]], | "expectedCatmullClarkSubdivisionSurface", | ||||
| ["testCrease3dSubdivisionSurface", "expectedCrease3dSubdivisionSurface", | [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2})]), | ||||
| [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2})]], | MeshTest("SimpleSubdivisionSurface", "testSimpleSubdivisionSurface", "expectedSimpleSubdivisionSurface", | ||||
| [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2, 'subdivision_type': 'SIMPLE'})]), | |||||
| MeshTest("Crease2dSubdivisionSurface", "testCrease2dSubdivisionSurface", "expectedCrease2dSubdivisionSurface", | |||||
| [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2})]), | |||||
| MeshTest("Crease3dSubdivisionSurface", "testCrease3dSubdivisionSurface", "expectedCrease3dSubdivisionSurface", | |||||
| [ModifierSpec("subdivision", 'SUBSURF', {"levels": 2})]), | |||||
| # 34 | # 34 | ||||
| ["testSphereTriangulate", "expectedSphereTriangulate", [ModifierSpec('triangulate', 'TRIANGULATE', {})]], | |||||
| ["testMonkeyWireframe", "expectedMonkeyWireframe", [ModifierSpec('wireframe', 'WIREFRAME', {})]], | MeshTest("SphereTriangulate", "testSphereTriangulate", "expectedSphereTriangulate", | ||||
| #ModifierSpec('skin', 'SKIN', {}), # skin is not reproducible . | [ModifierSpec('triangulate', 'TRIANGULATE', {})]), | ||||
| MeshTest("MonkeyWireframe", "testMonkeyWireframe", "expectedMonkeyWireframe", | |||||
| ["testMergedWeld", "expectedMergedWeld", | [ModifierSpec('wireframe', 'WIREFRAME', {})]), | ||||
| [ModifierSpec("weld", 'WELD', {"merge_threshold": 0.021})]], | |||||
| ["testMergedAllWeld", "expectedMergedAllWeld", | # Duplicate the object, test object and expected object have same world coordinates. | ||||
| [ModifierSpec("weld", 'WELD', {"merge_threshold": 1.8})]], | MeshTest("Skin", "testObjPlaneSkin", "expObjPlaneSkin", | ||||
| ["testMergedNoneWeld", "expectedMergedNoneWeld", | [ModifierSpec('skin', 'SKIN', {})]), | ||||
| [ModifierSpec("weld", 'WELD', {"merge_threshold": 0.019})]], | |||||
| MeshTest("MergedWeld", "testMergedWeld", "expectedMergedWeld", | |||||
| [ModifierSpec("weld", 'WELD', {"merge_threshold": 0.021})]), | |||||
| MeshTest("MergedAllWeld", "testMergedAllWeld", "expectedMergedAllWeld", | |||||
| [ModifierSpec("weld", 'WELD', {"merge_threshold": 1.8})]), | |||||
| MeshTest("MergedNoneWeld", "testMergedNoneWeld", "expectedMergedNoneWeld", | |||||
| [ModifierSpec("weld", 'WELD', {"merge_threshold": 0.019})]), | |||||
| ############################################# | ############################################# | ||||
| # One 'Deform' modifier on primitive meshes | # One 'Deform' modifier on primitive meshes | ||||
| ############################################# | ############################################# | ||||
| # 39 | # 39 | ||||
| ["testMonkeyArmature", "expectedMonkeyArmature", | MeshTest("MonkeyArmature", "testMonkeyArmature", "expectedMonkeyArmature", | ||||
| [ModifierSpec('armature', 'ARMATURE', {'object': bpy.data.objects['testArmature'], 'use_vertex_groups': True})]], | [ModifierSpec('armature', 'ARMATURE', | ||||
| ["testTorusCast", "expectedTorusCast", [ModifierSpec('cast', 'CAST', {'factor': 2.64})]], | {'object': bpy.data.objects['testArmature'], 'use_vertex_groups': True})]), | ||||
| ["testCubeCurve", "expectedCubeCurve", | MeshTest("TorusCast", "testTorusCast", "expectedTorusCast", | ||||
| [ModifierSpec('curve', 'CURVE', {'object': bpy.data.objects['testBezierCurve']})]], | [ModifierSpec('cast', 'CAST', {'factor': 2.64})]), | ||||
| ["testMonkeyDisplace", "expectedMonkeyDisplace", [ModifierSpec('displace', "DISPLACE", {})]], | MeshTest("CubeCurve", "testCubeCurve", "expectedCubeCurve", | ||||
| [ModifierSpec('curve', 'CURVE', {'object': bpy.data.objects['testBezierCurve']})]), | |||||
| # Hook modifier requires moving the hook object to get a mesh change, so can't test it with the current framework | MeshTest("MonkeyDisplace", "testMonkeyDisplace", "expectedMonkeyDisplace", | ||||
| # ["testMonkeyHook", "expectedMonkeyHook", | [ModifierSpec('displace', "DISPLACE", {})]), | ||||
| # [ModifierSpec('hook', 'HOOK', {'object': bpy.data.objects["EmptyHook"], 'vertex_group': "HookVertexGroup"})]], | |||||
| # Hook modifier requires moving the hook object to get a mesh change | |||||
| # so can't test it with the current framework | |||||
| # MeshTest("MonkeyHook", "testMonkeyHook", "expectedMonkeyHook", | |||||
| # [ModifierSpec('hook', 'HOOK', {'object': bpy.data.objects["EmptyHook"], 'vertex_group': | |||||
| # "HookVertexGroup"})]), | |||||
| # 43 | # 43 | ||||
| #ModifierSpec('laplacian_deform', 'LAPLACIANDEFORM', {}) Laplacian requires a more complex mesh | # ModifierSpec('laplacian_deform', 'LAPLACIANDEFORM', {}) Laplacian requires a more complex mesh | ||||
| ["testCubeLattice", "expectedCubeLattice", | MeshTest("CubeLattice", "testCubeLattice", "expectedCubeLattice", | ||||
| [ModifierSpec('lattice', 'LATTICE', {'object': bpy.data.objects["testLattice"]})]], | [ModifierSpec('lattice', 'LATTICE', {'object': bpy.data.objects["testLattice"]})]), | ||||
| # ModifierSpec('laplacian_deform', 'LAPLACIANDEFORM', {}) Laplacian requires a more complex mesh | MeshTest("PlaneShrinkWrap", "testPlaneShrinkWrap", "expectedPlaneShrinkWrap", | ||||
| [ModifierSpec('shrinkwrap', 'SHRINKWRAP', | |||||
| {'target': bpy.data.objects["testCubeWrap"], 'offset': 0.5})]), | |||||
| # Mesh Deform Modifier requires user input, so skip. | MeshTest("CylinderSimpleDeform", "testCylinderSimpleDeform", "expectedCylinderSimpleDeform", | ||||
| [ModifierSpec('simple_deform', 'SIMPLE_DEFORM', {'angle': math.radians(180), 'deform_axis': 'Z'})]), | |||||
| # mesh_test = MeshTest("testMonkeyDeform", "expectedMonkeyDeform",[ | MeshTest("PlaneSmooth", "testPlaneSmooth", "expectedPlaneSmooth", | ||||
| # ModifierSpec('mesh_deform', 'MESH_DEFORM', {'object': bpy.data.objects["testDeformStructure"]}), | [ModifierSpec('smooth', 'SMOOTH', {'iterations': 11})]), | ||||
| # OperatorSpec('meshdeform_bind',{'modifier':'MeshDeform'},'FACE',{i for in range(500)}) | |||||
| # ] ,True) | |||||
| ["testPlaneShrinkWrap", "expectedPlaneShrinkWrap", | # Smooth corrective requires a complex mesh. | ||||
| [ModifierSpec('shrinkwrap', 'SHRINKWRAP', {'target': bpy.data.objects["testCubeWrap"], 'offset': 0.5})]], | |||||
| ["testCylinderSimpleDeform", "expectedCylinderSimpleDeform", | MeshTest("BalloonLaplacianSmooth", "testBalloonLaplacianSmooth", "expectedBalloonLaplacianSmooth", | ||||
| [ModifierSpec('simple_deform', 'SIMPLE_DEFORM', {'angle': math.radians(180), 'deform_axis': 'Z'})]], | [ModifierSpec('laplaciansmooth', 'LAPLACIANSMOOTH', {'lambda_factor': 12, 'lambda_border': 12})]), | ||||
| ["testPlaneSmooth", "expectedPlaneSmooth", | # Gets updated often | ||||
| [ModifierSpec('smooth', 'SMOOTH', {'iterations': 11})]], | MeshTest("WavePlane", "testObjPlaneWave", "expObjPlaneWave", | ||||
| [ModifierSpec('wave', 'WAVE', {})]), | |||||
| # Smooth corrective requires a complex mesh. | ############################################# | ||||
| # CURVES Generate Modifiers | |||||
| ############################################# | |||||
| # Caution: Make sure test object has no modifier in "added" state, the test may fail. | |||||
| MeshTest("BezCurveArray", "testObjBezierCurveArray", "expObjBezierCurveArray", | |||||
| [ModifierSpec('array', 'ARRAY', {})]), | |||||
| MeshTest("CurveBevel", "testObjBezierCurveBevel", "expObjBezierCurveBevel", | |||||
| [ModifierSpec('bevel', 'BEVEL', {})]), | |||||
| MeshTest("CurveBuild", "testObjBezierCurveBuild", "expObjBezierCurveBuild", | |||||
| [ModifierSpec('build', 'BUILD', {'frame_start': 1, 'frame_duration': 1}, 2)]), | |||||
| MeshTest("CurveDecimate", "testObjBezierCurveDecimate", "expObjBezierCurveDecimate", | |||||
| [ModifierSpec('decimate', 'DECIMATE', {'ratio': 0.5})]), | |||||
| MeshTest("CurveEdgeSplit", "testObjBezierCurveEdgeSplit", "expObjBezierCurveEdgeSplit", | |||||
| [ModifierSpec('edgeSplit', 'EDGE_SPLIT', {})]), | |||||
| MeshTest("CurveMirror", "testObjBezierCurveMirror", "expObjBezierCurveMirror", | |||||
| [ModifierSpec('mirror', 'MIRROR', {'use_axis': (True, True, False)})]), | |||||
| MeshTest("CurveScrew", "testObjBezierCurveScrew", "expObjBezierCurveScrew", | |||||
| [ModifierSpec('screw', 'SCREW', {})]), | |||||
| MeshTest("CurveSolidify", "testObjBezierCurveSolidify", "expObjBezierCurveSolidify", | |||||
| [ModifierSpec('solidify', 'SOLIDIFY', {'thickness': 1})]), | |||||
| MeshTest("CurveSubSurf", "testObjBezierCurveSubSurf", "expObjBezierCurveSubSurf", | |||||
| [ModifierSpec('subSurf', 'SUBSURF', {})]), | |||||
| MeshTest("CurveTriangulate", "testObjBezierCurveTriangulate", "expObjBezierCurveTriangulate", | |||||
| [ModifierSpec('triangulate', 'TRIANGULATE', {})]), | |||||
| # Test 60 | |||||
| # Caution Weld: if the distance is increased beyond a limit, the object disappears | |||||
| MeshTest("CurveWeld", "testObjBezierCurveWeld", "expObjBezierCurveWeld", | |||||
| [ModifierSpec('weld', 'WELD', {})]), | |||||
| MeshTest("CurveWeld2", "testObjBezierCurveWeld2", "expObjBezierCurveWeld2", | |||||
| [ModifierSpec('weld', 'WELD', {})]), | |||||
| ############################################# | |||||
| # Curves Deform Modifiers | |||||
| ############################################# | |||||
| # Test 62 | |||||
| MeshTest("CurveCast", "testObjBezierCurveCast", "expObjBezierCurveCast", | |||||
| [ModifierSpec('Cast', 'CAST', {'cast_type': 'CYLINDER', 'factor': 10})]), | |||||
| MeshTest("CurveShrinkWrap", "testObjBezierCurveShrinkWrap", "expObjBezierCurveShrinkWrap", | |||||
| [ModifierSpec('ShrinkWrap', 'SHRINKWRAP', | |||||
| {'target': bpy.data.objects['testShrinkWrapHelperSuzanne']})]), | |||||
| MeshTest("CurveSimpleDeform", "testObjBezierCurveSimpleDeform", "expObjBezierCurveSimpleDeform", | |||||
| [ModifierSpec('simple_deform', 'SIMPLE_DEFORM', {'angle': math.radians(90)})]), | |||||
| ["testBalloonLaplacianSmooth", "expectedBalloonLaplacianSmooth", | MeshTest("CurveSmooth", "testObjBezierCurveSmooth", "expObjBezierCurveSmooth", | ||||
| [ModifierSpec('laplaciansmooth', 'LAPLACIANSMOOTH', {'lambda_factor': 12, 'lambda_border': 12})]], | [ModifierSpec('smooth', 'SMOOTH', {'factor': 10})]), | ||||
| # Surface Deform and Warp requires user input, so skip. | MeshTest("CurveWave", "testObjBezierCurveWave", "expObjBezierCurveWave", | ||||
| [ModifierSpec('curve_wave', 'WAVE', {'time_offset': -1.5})]), | |||||
| # Wave - requires complex mesh, so skip. | MeshTest("CurveCurve", "testObjBezierCurveCurve", "expObjBezierCurveCurve", | ||||
| [ModifierSpec('curve_Curve', 'CURVE', {'object': bpy.data.objects['NurbsCurve']})]), | |||||
| ] | ] | ||||
| modifiers_test = ModifierTest(tests) | modifiers_test = RunTest(tests) | ||||
| command = list(sys.argv) | command = list(sys.argv) | ||||
| for i, cmd in enumerate(command): | for i, cmd in enumerate(command): | ||||
| if cmd == "--run-all-tests": | if cmd == "--run-all-tests": | ||||
| modifiers_test.apply_modifiers = True | modifiers_test.apply_modifiers = True | ||||
| modifiers_test.do_compare = True | |||||
| modifiers_test.run_all_tests() | modifiers_test.run_all_tests() | ||||
| break | break | ||||
| elif cmd == "--run-test": | elif cmd == "--run-test": | ||||
| modifiers_test.apply_modifiers = False | modifiers_test.apply_modifiers = False | ||||
| index = int(command[i + 1]) | modifiers_test.do_compare = False | ||||
| modifiers_test.run_test(index) | name = command[i + 1] | ||||
| modifiers_test.run_test(name) | |||||
| break | break | ||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||
| main() | main() | ||||
Why was this line removed? it seems like useful information to keep.