Welcome to mirror list, hosted at ThFree Co, Russian Federation.

mesh_boneweight_copy.py « scripts « release - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 5e9ec4ed2354b00ef21c3ecd781aeb0770951188 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!BPY
"""
Name: 'Bone Weight Copy'
Blender: 241
Group: 'Object'
Tooltip: 'Copy Bone Weights from 1 weighted mesh, to other unweighted meshes.'
"""
import Blender
from Blender import Armature, Object, Mathutils, Window, Mesh
Vector= Mathutils.Vector

def copy_bone_influences(_from, _to):
	ob_from, me_from, world_verts_from, from_groups=  _from
	ob_to, me_to, world_verts_to, dummy=  _to	
	del dummy
	
	def getSnapIdx(vec, vecs):
		'''
		Returns the closest vec to snap_points
		'''
		close_dist= 1<<30
		close_idx= None
		
		x,y,z= tuple(vec)
		for i, v in enumerate(vecs):
			# quick length cmp before a full length comparison.
			if\
			abs(x-v[0]) < close_dist and\
			abs(y-v[1]) < close_dist and\
			abs(z-v[2]) < close_dist:
				l= (v-vec).length
				if l<close_dist:
					close_dist= l
					close_idx= i
		return close_idx
	
	from_groups= me_from.getVertGroupNames()
	for group in from_groups:
		me_to.addVertGroup(group)
	
	add_ = Mesh.AssignModes.ADD
	
	for i, co in enumerate(world_verts_to):
		
		from_idx= getSnapIdx(co, world_verts_from)
		from_infs= me_from.getVertexInfluences(from_idx)
		
		for group, weight in from_infs:
			me_to.assignVertsToGroup(group, [from_idx], weight, add_)
	
	me_to.update()
	

def worldspace_verts(me, ob):
	mat= ob.matrixWorld
	def worldvert(v):
		vec= Vector(v)
		vec.resize4D()
		vec= vec*mat
		vec.resize3D()
		return vec
	
	return [ worldvert(v.co) for v in me.verts ]

def main():
	sel=[]
	from_data= None
	for ob in Object.GetSelected():
		if ob.getType()=='Mesh':
			me= ob.getData(mesh=1)
			groups= me.getVertGroupNames()
			
			data= (ob, me, worldspace_verts(me, ob), groups)
			if groups:
				if from_data:
					Blender.Draw.PupMenu('More then 1 mesh has vertex weights, only select 1 mesh with weights. aborting.')
					return
				else:
					from_data= data
			else:
				sel.append(data)
	
	if not sel or from_data==None:
		Blender.Draw.PupMenu('Select 2 or more mesh objects, aborting.')
		return
	
	Window.WaitCursor(1)
	# Now do the copy.
	for data in sel:
		copy_bone_influences(from_data, data)
	Window.WaitCursor(0)

if __name__ == '__main__':
	main()