Incredible! I found it!!
Thanks mcbeth!
Heres the code:
[xml]
TLW_LimitBoneCount.py, python script for Blender 2.49b
Normalizes bone vertex weights and removes bone weights when the influence count exceeds
MAX_BONESPERVERTEX (i.e. most game engines have a limit of 4 bones per vertex)
Vertices that belong to groups which aren’t bones are left untouched.
# HOW TO USE:
# Select an object that has an active armature modifier. Load this script in the text editor
# from Blender, and press Alt+P to turn the script. Modify MAX_BONESPERVERTEX below to change
# the threshold
MAX_BONESPERVERTEX = 4
# TLW_LimitBoneCount.py, python script for Blender 2.49b
# Copyright (C) 2011 Matias N. Goldberg ("dark_sylinc")
#
# 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 3 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, see <http://www.gnu.org/licenses/>.
import Blender
from Blender import *
from bpy import *
editmode = Window.EditMode() # are we in edit mode? If not so ...
if editmode: Window.EditMode(0) # leave edit mode before getting the mesh
#Iterates through the modifier stack to get the armature. Assumes it has
#only one armature modifier (otherwise the first seen is taken)
def getArmature( obj ):
mods = obj.modifiers
for mod in mods:
if mod.type == Modifier.Types.ARMATURE:
return mod[Modifier.Settings.OBJECT].getData()
return 0
class GroupData:
def __init__( self, weight, groupName ):
self.weight = weight
self.groupName = groupName
#Helper container to organize those objects without parent but are instanced.
for obj in Object.GetSelected():
armature = getArmature( obj )
md = obj.getData( False, True )
for vertex in md.verts:
vertexGroup = []
for groupName in md.getVertGroupNames():
try:
weight = md.getVertsFromGroup( groupName, True, [vertex.index] )[0][1]
except IndexError:
# vertex not in group groupName
pass
else:
#print type( armature.bones.keys() )
try:
armature.bones[ groupName ]
except KeyError:
# Group name doesn't refer to a bone in the armature
pass
else:
vertexGroup.append( GroupData( weight, groupName ) )
if( len( vertexGroup ) > MAX_BONESPERVERTEX ):
print 'Vertex with more than ', MAX_BONESPERVERTEX, ' bones found, collapsing bones with lowest weights'
#Sort it, lower weights first
vertexGroup = sorted( vertexGroup, key=lambda groupData: groupData.weight )
for groupData in vertexGroup:
#Remove the extra bones
md.removeVertsFromGroup( groupData.groupName, [vertex.index] )
vertexGroup.pop(0)
if( len( vertexGroup ) < MAX_BONESPERVERTEX ):
break
#Normalize weights for ALL vertices (not just the ones that have more bones than usual)
weightSum = 0
for groupData in vertexGroup: weightSum += groupData.weight
for groupData in vertexGroup:
groupData.weight /= weightSum
md.assignVertsToGroup( groupData.groupName, [vertex.index], groupData.weight, Mesh.AssignModes.REPLACE )
#Enter and leave edit mode to refresh the changes
Window.EditMode(1)
Window.EditMode(0)
print 'Normalizing vertex weights and removing extra bone influences finished.'
[/xml]
Found here:
http://www.ogre3d.org/forums/viewtopic.php?f=8&t=64887
THERE!
Now I will never forget this again :P