This is an example of my code to rig a simple cloth to some bones. I’m looking for any tip-trick, update-upgrade to speed up or optimize my code:
delete objects
clearlistener()
(
/*############################################*/
/* Functions */
/*############################################*/
fn PrepareModifier TheModifier =
(
Obj = (refs.dependentNodes TheModifier)[1]
if isvalidnode Obj do
(
setCommandPanelTaskMode mode:#modify
classof Obj
select Obj
if modPanel.getCurrentObject() != TheModifier do modPanel.setCurrentObject TheModifier
)
)
fn GetBoneIndex SkinModifier TheBone =
(
if isvalidnode TheBone then
(
findItem (for i =1 to (skinOps.GetNumberBones SkinModifier) collect (skinOps.GetBoneName SkinModifier i 0)) TheBone.name
)
else 0
)
/*############################################*/
/* Localizing SkinOps */
/*############################################*/
local GetNumberVertices = skinOps.GetNumberVertices
local GetVertexWeightCount = skinOps.GetVertexWeightCount
local GetVertexWeight = skinOps.GetVertexWeight
local GetVertexWeightBoneID = skinOps.GetVertexWeightBoneID
local SetVertexWeights = skinOps.SetVertexWeights
local ReplaceVertexWeights = skinOps.ReplaceVertexWeights
local SelectVertices = skinOps.SelectVertices
local SelectBone = skinOps.SelectBone
fn AddBone TheSkin TheBone UpdateInteger = (skinOps.addbone TheSkin TheBone 0 ; classof (refs.dependentnodes TheSkin)[1])
local RemoveBone = skinOps.RemoveBone
local BlendSelectedBone = skinOps.blendSelected
local GetNumberBones = skinOps.GetNumberBones
local GetBoneName = skinOps.GetBoneName
/*############################################*/
/* Default Variables */
/*############################################*/
Width = 100.0
Height = 100.0
WidthSegments = 4
HeightSegments = 4
WidthDistance = Width/WidthSegments
HeightDistance = Height/HeightSegments
/*############################################*/
/* Skin Object */
/*############################################*/
Obj = Rectangle name:"Skin Object" length:Height width:Width transform:(matrix3 [1,0,0] [0,0,1] [0,-1,0] [Width/2,0,Height/2]) wirecolor:blue
GarmentModifier = Garment_Maker autoMesh:true preserve:true relax:true outputType:0 figure:undefined stretchMapping:false showMesh:false showSeams:false
addmodifier Obj GarmentModifier
SkinModifier = skin()
addmodifier Obj SkinModifier
/*############################################*/
/* Bones */
/*############################################*/
BoneArray = #()
for i = 1 to WidthSegments + 1 do
(
for j = 1 to HeightSegments + 1 do
(
append BoneArray (sphere name:("Bone_"+(i as string)+"_"+(j as string)) radius:5 segments:6 pos:[(i-1)*WidthDistance,0,(j-1)*HeightDistance] wirecolor:yellow)
)
)
/*############################################*/
/* Skin */
/*############################################*/
PrepareModifier SkinModifier
for TheBone in BoneArray do AddBone SkinModifier TheBone 0
/*############################################*/
/* Skin Weights */
/*############################################*/
WDis = WidthDistance/2
HDis = HeightDistance/2
NumberVertices = GetNumberVertices SkinModifier
BonesTrueIndexes = for TheBone in BoneArray collect GetBoneIndex SkinModifier TheBone
for i = 1 to NumberVertices do
(
VertexPos = getvert Obj.mesh i * Obj.objecttransform
for BoneId = 1 to BoneArray.count do
(
TheBone = BoneArray[BoneId]
BonePos = TheBone.pos
if BonePos.x >= VertexPos.x - WDis and \
BonePos.x < VertexPos.x + WDis and \
BonePos.z >= VertexPos.z - HDis and \
BonePos.z < VertexPos.z + HDis do ReplaceVertexWeights SkinModifier i BonesTrueIndexes[BoneId] 1
)
)
/*############################################*/
/* Blend Weights */
/*############################################*/
SelectVertices SkinModifier #{1..NumberVertices}
for i = 1 to BoneArray.count do
(
SelectBone SkinModifier i
BlendSelectedBone SkinModifier
)
)
