[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43232] trunk/blender/source/tests/ bl_mesh_modifiers.py: WIP script to check results of different modifier combinations and display modes , useful for validating bmesh changes don' t break specific modifier combinations.
Campbell Barton
ideasman42 at gmail.com
Mon Jan 9 11:30:42 CET 2012
Revision: 43232
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43232
Author: campbellbarton
Date: 2012-01-09 10:30:27 +0000 (Mon, 09 Jan 2012)
Log Message:
-----------
WIP script to check results of different modifier combinations and display modes, useful for validating bmesh changes don't break specific modifier combinations.
Added Paths:
-----------
trunk/blender/source/tests/bl_mesh_modifiers.py
Added: trunk/blender/source/tests/bl_mesh_modifiers.py
===================================================================
--- trunk/blender/source/tests/bl_mesh_modifiers.py (rev 0)
+++ trunk/blender/source/tests/bl_mesh_modifiers.py 2012-01-09 10:30:27 UTC (rev 43232)
@@ -0,0 +1,698 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+# Currently this script only generates images from different modifier
+# combinations and does not validate they work correctly,
+# this is because we dont get 1:1 match with bmesh.
+#
+# Later, we may have a way to check the results are valid.
+
+
+# ./blender.bin --factory-startup --python bl_mesh_modifiers.py
+
+
+# -----------------------------------------------------------------------------
+# utility funcs
+
+def render_gl(context, filepath, shade):
+
+ def ctx_viewport_shade(context, shade):
+ for area in context.window.screen.areas:
+ if area.type == 'VIEW_3D':
+ space = area.spaces.active
+ # rv3d = space.region_3d
+ space.viewport_shade = shade
+
+ import bpy
+ scene = context.scene
+ render = scene.render
+ render.filepath = filepath
+ render.image_settings.file_format = 'PNG'
+ render.use_file_extension = True
+ render.use_antialiasing = False
+
+ # render size
+ render.resolution_percentage = 100
+ render.resolution_x = 512
+ render.resolution_y = 512
+
+ ctx_viewport_shade(context, shade)
+
+ bpy.ops.render.opengl(write_still=True,
+ view_context=True)
+
+
+ # stop to inspect!
+ # if filepath == "test_cube_shell_solidify_subsurf_ob_textured":
+ # assert(0)
+
+
+def render_gl_all_modes(context, obj, filepath=""):
+
+ assert(obj != None)
+ assert(filepath != "")
+
+ scene = context.scene
+
+ # avoid drawing outline/center dot
+ bpy.ops.object.select_all(action='DESELECT')
+ scene.objects.active = None
+
+ # editmode
+ scene.tool_settings.mesh_select_mode = False, True, False
+
+ # render
+ render_gl(context, filepath + "_ob_wire", shade='WIREFRAME')
+ render_gl(context, filepath + "_ob_solid", shade='SOLID')
+ render_gl(context, filepath + "_ob_textured", shade='TEXTURED')
+
+ # -------------------------------------------------------------------------
+ # not just draw modes, but object modes!
+ scene.objects.active = obj
+
+ bpy.ops.object.mode_set(mode='EDIT', toggle=False)
+ bpy.ops.mesh.select_all(action='DESELECT')
+ render_gl(context, filepath + "_edit_wire", shade='WIREFRAME')
+ render_gl(context, filepath + "_edit_solid", shade='SOLID')
+ render_gl(context, filepath + "_edit_textured", shade='TEXTURED')
+ bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+
+ bpy.ops.object.mode_set(mode='WEIGHT_PAINT', toggle=False)
+
+ render_gl(context, filepath + "_wp_wire", shade='WIREFRAME')
+
+ assert(1)
+
+ bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+
+ scene.objects.active = None
+
+
+def ctx_clear_scene(): # copied from batch_import.py
+ import bpy
+ unique_obs = set()
+ for scene in bpy.data.scenes:
+ for obj in scene.objects[:]:
+ scene.objects.unlink(obj)
+ unique_obs.add(obj)
+
+ # remove obdata, for now only worry about the startup scene
+ for bpy_data_iter in (bpy.data.objects,
+ bpy.data.meshes,
+ bpy.data.lamps,
+ bpy.data.cameras,
+ ):
+
+ for id_data in bpy_data_iter:
+ bpy_data_iter.remove(id_data)
+
+
+def ctx_viewport_camera(context):
+ # because gl render without view_context has no shading option.
+ for area in context.window.screen.areas:
+ if area.type == 'VIEW_3D':
+ space = area.spaces.active
+ space.region_3d.view_perspective = 'CAMERA'
+
+
+def ctx_camera_setup(context,
+ location=(0.0, 0.0, 0.0),
+ lookat=(0.0, 0.0, 0.0),
+ # most likely the followuing vars can be left as defaults
+ up=(0.0, 0.0, 1.0),
+ lookat_axis='-Z',
+ up_axis='Y',
+ ):
+
+ camera = bpy.data.cameras.new(whoami())
+ obj = bpy.data.objects.new(whoami(), camera)
+
+ scene = context.scene
+ scene.objects.link(obj)
+ scene.camera = obj
+
+ from mathutils import Vector, Matrix
+
+ # setup transform
+ view_vec = Vector(lookat) - Vector(location)
+ rot_mat = view_vec.to_track_quat(lookat_axis, up_axis).to_matrix().to_4x4()
+ tra_mat = Matrix.Translation(location)
+
+ obj.matrix_world = tra_mat * rot_mat
+
+ ctx_viewport_camera(context)
+
+ return obj
+
+
+# -----------------------------------------------------------------------------
+# inspect functions
+
+import inspect
+
+
+# functions
+
+def whoami():
+ return inspect.stack()[1][3]
+
+
+def whosdaddy():
+ return inspect.stack()[2][3]
+
+
+# -----------------------------------------------------------------------------
+# models (defaults)
+
+def defaults_object(obj):
+ obj.show_wire = True
+
+ if obj.type == 'MESH':
+ mesh = obj.data
+ mesh.show_all_edges = True
+
+ mesh.show_normal_vertex = True
+
+ # lame!
+ for face in mesh.faces:
+ face.use_smooth = True
+
+
+# -----------------------------------------------------------------------------
+# models (utils)
+
+def mesh_bounds(mesh):
+ xmin = ymin = zmin = +100000000.0
+ xmax = ymax = zmax = -100000000.0
+
+ for v in mesh.vertices:
+ x, y, z = v.co
+ xmax = max(x, xmax)
+ ymax = max(y, ymax)
+ zmax = max(z, zmax)
+
+ xmin = min(x, xmin)
+ ymin = min(y, ymin)
+ zmin = min(z, zmin)
+
+ return (xmin, ymin, zmin), (xmax, ymax, zmax)
+
+
+def mesh_uv_add(obj):
+ uv_lay = obj.data.uv_textures.new()
+ for uv in uv_lay.data:
+ uv.uv1 = 0.0, 0.0
+ uv.uv2 = 0.0, 1.0
+ uv.uv3 = 1.0, 1.0
+ uv.uv4 = 1.0, 0.0
+
+ return uv_lay
+
+
+def mesh_vcol_add(obj, mode=0):
+ vcol_lay = obj.data.vertex_colors.new()
+ for col in vcol_lay.data:
+ col.color1 = 1.0, 0.0, 0.0
+ col.color2 = 0.0, 1.0, 0.0
+ col.color3 = 0.0, 0.0, 1.0
+ col.color4 = 0.0, 0.0, 0.0
+
+ return vcol_lay
+
+
+def mesh_vgroup_add(obj, name="Group", axis=0, invert=False, mode=0):
+ mesh = obj.data
+ vgroup = obj.vertex_groups.new(name=name)
+ vgroup.add(list(range(len(mesh.vertices))), 1.0, 'REPLACE')
+ group_index = len(obj.vertex_groups) - 1
+
+ min_bb, max_bb = mesh_bounds(mesh)
+
+ range_axis = max_bb[axis] - min_bb[axis]
+
+ # gradient
+ for v in mesh.vertices:
+ for vg in v.groups:
+ if vg.group == group_index:
+ f = (v.co[axis] - min_bb[axis]) / range_axis
+ vg.weight = 1.0 - f if invert else f
+
+ return vgroup
+
+
+def mesh_shape_add(obj, mode=0):
+ pass
+
+
+def mesh_armature_add(obj, mode=0):
+ pass
+
+
+# -----------------------------------------------------------------------------
+# modifiers
+
+def modifier_subsurf_add(obj, levels=2):
+ mod = obj.modifiers.new(name=whoami(), type='SUBSURF')
+ mod.show_in_editmode = True
+
+ mod.levels = levels
+ mod.render_levels = levels
+ return mod
+
+
+def modifier_armature_add(obj):
+ mod = obj.modifiers.new(name=whoami(), type='ARMATURE')
+ mod.show_in_editmode = True
+
+ arm_data = bpy.data.armatures.new(whoami())
+ arm_ob = bpy.data.objects.new(whoami(), arm_data)
+
+ scene = bpy.context.scene
+ scene.objects.link(arm_ob)
+
+ arm_ob.select = True
+ scene.objects.active = arm_ob
+
+ bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+ bpy.ops.object.mode_set(mode='EDIT', toggle=False)
+
+ # XXX, annoying, remove bone.
+ while arm_data.edit_bones:
+ arm_ob.edit_bones.remove(arm_data.edit_bones[-1])
+
+ bone_a = arm_data.edit_bones.new("Bone.A")
+ bone_b = arm_data.edit_bones.new("Bone.B")
+ bone_b.parent = bone_a
+
+ bone_a.head = -1, 0, 0
+ bone_a.tail = 0, 0, 0
+ bone_b.head = 0, 0, 0
+ bone_b.tail = 1, 0, 0
+
+ # Get armature animation data
+ bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+
+ # 45d armature
+ arm_ob.pose.bones["Bone.B"].rotation_quaternion = 1, -0.5, 0, 0
+
+ # set back to the original
+ scene.objects.active = obj
+
+ # display options
+ arm_ob.show_x_ray = True
+ arm_data.draw_type = 'STICK'
+
+ # apply to modifier
+ mod.object = arm_ob
+
+ mesh_vgroup_add(obj, name="Bone.A", axis=0, invert=True)
+ mesh_vgroup_add(obj, name="Bone.B", axis=0, invert=False)
+
+ return mod
+
+
+def modifier_mirror_add(obj):
+ mod = obj.modifiers.new(name=whoami(), type='MIRROR')
+ mod.show_in_editmode = True
+
+ return mod
+
+
+def modifier_solidify_add(obj, thickness=0.25):
+ mod = obj.modifiers.new(name=whoami(), type='SOLIDIFY')
+ mod.show_in_editmode = True
+
+ mod.thickness = thickness
+
+ return mod
+
+
+# -----------------------------------------------------------------------------
+# models
+
+# useful since its solid boxy shape but simple enough to debug errors
+cube_like_vertices = (
+ (1, 1, -1),
+ (1, -1, -1),
+ (-1, -1, -1),
+ (-1, 1, -1),
+ (1, 1, 1),
+ (1, -1, 1),
+ (-1, -1, 1),
+ (-1, 1, 1),
+ (0, -1, -1),
+ (1, 0, -1),
+ (0, 1, -1),
+ (-1, 0, -1),
+ (1, 0, 1),
+ (0, -1, 1),
+ (-1, 0, 1),
+ (0, 1, 1),
+ (1, -1, 0),
+ (1, 1, 0),
+ (-1, -1, 0),
+ (-1, 1, 0),
+ (0, 0, -1),
+ (0, 0, 1),
+ (1, 0, 0),
+ (0, -1, 0),
+ (-1, 0, 0),
+ (2, 0, 0),
+ (2, 0, -1),
+ (2, 1, 0),
+ (2, 1, -1),
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list