Advertisement
Guest User

Untitled

a guest
Jun 27th, 2018
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.01 KB | None | 0 0
  1. import bpy
  2. import bmesh
  3. import random
  4.  
  5. ITERATIONS = 3
  6. SELECT_PERCENT = 1
  7. SELECT_MAX = 50
  8. MIN_EDGES = 3
  9. SMOOTHING = 15
  10. EDGE_LOOP_SELECT_PROBABILITY = 0.8
  11.  
  12. C = bpy.context
  13. D = bpy.data
  14.  
  15. obj = C.object
  16. bpy.ops.object.mode_set(mode='OBJECT')
  17. group_id = obj.vertex_groups.find('displace')
  18. if group_id == -1:
  19.     print('creating vertex group')
  20.     group_id = obj.vertex_groups.new('displace').index
  21.  
  22. group = obj.vertex_groups[group_id]
  23.  
  24. group.remove([vert.index for vert in obj.data.vertices])
  25.  
  26. for i in range(0,ITERATIONS):
  27.     print('iteration', i)
  28.     bpy.ops.object.mode_set(mode='EDIT')
  29.     mesh = bmesh.from_edit_mesh(obj.data)
  30.     mesh_total_verts=len(mesh.verts)
  31.     # select_percent=SELECT_VERTS/len(mesh.verts)
  32.     bpy.ops.mesh.select_mode(type='VERT')
  33.     bpy.ops.mesh.select_all(action='DESELECT')
  34.     bpy.ops.mesh.select_random(percent=SELECT_PERCENT, seed=i*random.randint(1,100), action='SELECT')
  35.     layer_weight = 1/ITERATIONS
  36.     selected = [vert for vert in mesh.verts if vert.select==True]
  37.     deselect_probability = (len(selected)-SELECT_MAX)/len(selected)
  38.     for vert in selected:
  39.         if (len(vert.link_edges) >= MIN_EDGES - 1) and (random.random() > deselect_probability):
  40.             edge = vert.link_edges[random.randint(0,len(vert.link_edges)-1)]
  41.             for vert2 in edge.verts:
  42.                 vert2.select = True
  43.         else:
  44.             vert.select = False
  45.     mesh.select_flush(True)
  46.     edge_loop_mode =  random.random() <= EDGE_LOOP_SELECT_PROBABILITY
  47.     if edge_loop_mode:
  48.         bpy.ops.mesh.loop_multi_select(ring=False)
  49.     mesh.select_flush(True)
  50.     for l in range(0,SMOOTHING):
  51.         if (len([vert for vert in bmesh.from_edit_mesh(obj.data).verts if vert.select == True]) < mesh_total_verts/max(2,ITERATIONS)) or (l==0):
  52.             print('select more')
  53.             bpy.ops.mesh.select_more(use_face_step=True)
  54.             mesh.select_flush(True)
  55.         else:
  56.             break
  57.         if l==SMOOTHING-1:
  58.             print('unable to select enough verts')
  59.     for l in range(0,SMOOTHING):
  60.         if (len([vert for vert in bmesh.from_edit_mesh(obj.data).verts if vert.select == True]) >= mesh_total_verts/max(2,ITERATIONS)):
  61.             print('select fewer')
  62.             bpy.ops.mesh.select_less()
  63.             mesh.select_flush(True)
  64.         else:
  65.             break
  66.         if l==SMOOTHING:
  67.             print('unable to deselect enough verts')
  68.     verts = [vert.index for vert in mesh.verts if vert.select == True]
  69.     print(len(verts),' verts selected')
  70.     bpy.ops.object.mode_set(mode='OBJECT')
  71.     group.add(verts, layer_weight, 'ADD')
  72.  
  73. have_modifier = False
  74. for mod in obj.modifiers:
  75.     if mod.type=='DISPLACE':
  76.         if mod.vertex_group=='displace':
  77.             have_modifier = True
  78.  
  79. if not have_modifier:
  80.     mod = obj.modifiers.new(name='Displace', type='DISPLACE')
  81.     mod.vertex_group = 'displace'
  82.     mod.mid_level = 0
  83.     mod.strength = 0.2
  84.    
  85. bpy.ops.object.mode_set(mode='WEIGHT_PAINT')
  86. bpy.ops.object.mode_set(mode='OBJECT')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement