695 lines
29 KiB
Plaintext
Executable File
695 lines
29 KiB
Plaintext
Executable File
-- Load the common maxscript functions
|
|
--include "rockstar/export/settings.ms" -- This is SLOW!
|
|
filein "rockstar/export/settings.ms" -- This is fast
|
|
|
|
-- Figure out the project
|
|
theProjectRoot = RsConfigGetProjRootDir()
|
|
theProject = RSConfigGetProjectName()
|
|
theWildWest = RsConfigGetWildWestDir()
|
|
theProjectConfig = RsConfigGetProjBinConfigDir()
|
|
|
|
|
|
-- Load common functions
|
|
filein (theWildWest + "script/max/Rockstar_North/character/includes/FN_common.ms")
|
|
filein (theWildWest + "script/max/Rockstar_North/character/includes/FN_bone_tagger.ms")
|
|
filein (theWildWest + "script/max/Rockstar_North/character/includes/FN_Rigging.ms")
|
|
filein (theProjectRoot + "tools/dcc/current/max2011/scripts/pipeline/util/xml.ms")
|
|
|
|
global shouldIskinHands = false
|
|
global vIndex = undefined
|
|
|
|
splitVolObjArray = #( --we do an intersection on first element and subtraction on others
|
|
#("splitVol_SKEL_R_Toe0"),
|
|
#("splitVol_SKEL_R_Foot","splitVol_SKEL_R_Toe0", "splitVol_SKEL_R_Calf"),
|
|
#("splitVol_SKEL_R_Calf", "splitVol_SKEL_R_Thigh"),
|
|
#("splitVol_SKEL_R_Thigh","splitVol_SKEL_R_Calf", "splitVol_SKEL_Pelvis", "trimVol_L_ThighBox"),
|
|
#("splitVol_SKEL_L_Toe0"),
|
|
#("splitVol_SKEL_L_Foot","splitVol_SKEL_L_Toe0", "splitVol_SKEL_L_Calf"),
|
|
#("splitVol_SKEL_L_Calf", "splitVol_SKEL_L_Thigh"),
|
|
#("splitVol_SKEL_L_Thigh","splitVol_SKEL_L_Calf", "splitVol_SKEL_Pelvis", "trimVol_R_ThighBox"),
|
|
#("splitVol_SKEL_Pelvis", "splitVol_SKEL_Spine0", "trimVol_Pelvis_Bot"),
|
|
#("splitVol_SKEL_L_Finger02"),
|
|
#("splitVol_SKEL_L_Finger01","splitVol_SKEL_L_Finger02"),
|
|
#("splitVol_SKEL_L_Finger00","splitVol_SKEL_L_Finger01"),
|
|
#("splitVol_SKEL_L_Finger12"),
|
|
#("splitVol_SKEL_L_Finger11","splitVol_SKEL_L_Finger12"),
|
|
#("splitVol_SKEL_L_Finger10","splitVol_SKEL_L_Finger11"),
|
|
#("splitVol_SKEL_L_Finger22"),
|
|
#("splitVol_SKEL_L_Finger21","splitVol_SKEL_L_Finger22"),
|
|
#("splitVol_SKEL_L_Finger20","splitVol_SKEL_L_Finger21"),
|
|
#("splitVol_SKEL_L_Finger32"),
|
|
#("splitVol_SKEL_L_Finger31","splitVol_SKEL_L_Finger32"),
|
|
#("splitVol_SKEL_L_Finger30","splitVol_SKEL_L_Finger31"),
|
|
#("splitVol_SKEL_L_Finger42"),
|
|
#("splitVol_SKEL_L_Finger41","splitVol_SKEL_L_Finger42"),
|
|
#("splitVol_SKEL_L_Finger40","splitVol_SKEL_L_Finger41"),
|
|
#("splitVol_SKEL_L_Hand"),--"splitVol_SKEL_L_Forearm"),
|
|
#("splitVol_SKEL_L_Forearm","splitVol_SKEL_L_Hand","splitVol_SKEL_L_UpperArm"),
|
|
#("splitVol_SKEL_L_UpperArm","splitVol_SKEL_L_Forearm", "splitVol_SKEL_L_Clavicle", "trimBox_L_Shoulder"),
|
|
#("splitVol_SKEL_L_Clavicle","splitVol_SKEL_L_UpperArm", "trimBox_Clavs"),
|
|
#("splitVol_SKEL_R_Finger02"),
|
|
#("splitVol_SKEL_R_Finger01","splitVol_SKEL_R_Finger02"),
|
|
#("splitVol_SKEL_R_Finger00","splitVol_SKEL_R_Finger01"),
|
|
#("splitVol_SKEL_R_Finger12"),
|
|
#("splitVol_SKEL_R_Finger11","splitVol_SKEL_R_Finger12"),
|
|
#("splitVol_SKEL_R_Finger10","splitVol_SKEL_R_Finger11"),
|
|
#("splitVol_SKEL_R_Finger22"),
|
|
#("splitVol_SKEL_R_Finger21","splitVol_SKEL_R_Finger22"),
|
|
#("splitVol_SKEL_R_Finger20","splitVol_SKEL_R_Finger21"),
|
|
#("splitVol_SKEL_R_Finger32"),
|
|
#("splitVol_SKEL_R_Finger31","splitVol_SKEL_R_Finger32"),
|
|
#("splitVol_SKEL_R_Finger30","splitVol_SKEL_R_Finger31"),
|
|
#("splitVol_SKEL_R_Finger42"),
|
|
#("splitVol_SKEL_R_Finger41","splitVol_SKEL_R_Finger42"),
|
|
#("splitVol_SKEL_R_Finger40","splitVol_SKEL_R_Finger41"),
|
|
#("splitVol_SKEL_R_Hand"),
|
|
#("splitVol_SKEL_R_Forearm","splitVol_SKEL_R_Hand","splitVol_SKEL_R_UpperArm"),
|
|
#("splitVol_SKEL_R_UpperArm","splitVol_SKEL_R_Forearm", "splitVol_SKEL_R_Clavicle", "trimBox_R_Shoulder"),
|
|
#("splitVol_SKEL_R_Clavicle","splitVol_SKEL_R_UpperArm", "trimBox_Clavs"),
|
|
#("splitVol_SKEL_Head"),
|
|
#("splitVol_SKEL_Neck_1"),
|
|
#("splitVol_SKEL_Spine3","trimVol_R_ArmBox","trimVol_L_ArmBox", "trimBox_L_Shoulder_ForSpine3", "trimBox_R_Shoulder_ForSpine3"),
|
|
#("splitVol_SKEL_Spine2","splitVol_SKEL_Spine3"),
|
|
#("splitVol_SKEL_Spine1","splitVol_SKEL_Spine2", "splitVol_SKEL_Spine0"),
|
|
#("splitVol_SKEL_Spine0", "splitVol_SKEL_Spine1", "splitVol_SKEL_Pelvis")
|
|
)
|
|
|
|
-- splitVolObjArray = #( --we do an intersection on first element and subtraction on others
|
|
-- #("splitVol_SKEL_R_Foot","splitVol_SKEL_R_Calf")
|
|
-- )
|
|
|
|
rigBoneListStruct = #()
|
|
|
|
struct rigBoneStruct (rb_bone, rb_Radius, rb_Length, rb_Trans)
|
|
|
|
-- global originalMasterMesh = undefined
|
|
|
|
fn cleanVols = --cleans out all the volume shit
|
|
(
|
|
obsToDel = #()
|
|
|
|
for obj in objects do
|
|
(
|
|
if ((substring obj.name 1 9) == "splitVol_") or ((substring obj.name 1 7) == "trimBox") or ((substring obj.name 1 7) == "trimVol") do
|
|
(
|
|
appendIfUnique obsToDel obj
|
|
)
|
|
)
|
|
|
|
delete obsToDel
|
|
|
|
)
|
|
|
|
fn removeIsolatedVerts myMesh =
|
|
(
|
|
select myMesh
|
|
-- modPanel.addModToSelection (Edit_Mesh ()) ui:on
|
|
addmodifier myMesh (Edit_Mesh ())
|
|
collapsestack myMesh
|
|
isoVertArray = meshop.getIsoverts myMesh
|
|
meshop.DeleteVerts myMesh isoVertArray
|
|
)
|
|
|
|
fn boolMesh masterObj volArr vIndex =
|
|
(
|
|
--volObj passedin as an array of volumes. First one used as a intersection boolean and the rest as subtractions
|
|
--first off duplicate the masterObject
|
|
volO = getNodeByName volArr[1]
|
|
newName = ("geo_"+(substring volO.Name 15 30))
|
|
maxOps.cloneNodes masterObj cloneType:#copy actualNodeList:&c newNodes:&nnl
|
|
obToBool = nnl[1]
|
|
obToBool.name = newName
|
|
|
|
-- --disable the command panel for speed purposes
|
|
-- cui.commandPanelOpen = false
|
|
|
|
cleanVolObj = undefined
|
|
|
|
|
|
for vo = 1 to volArr.count do --we need to loop thru the array of vols and cut the obToBool with them
|
|
(
|
|
--now duplicate the volObject as this will disappear uring booleaning
|
|
-- newName = ("CUTTER_"+(substring volArr[vo] 15 30))
|
|
newName = ("CUTTER_"+volArr[vo])
|
|
newVolO = getNodeByName volArr[vo]
|
|
if newVolO == undefined do
|
|
(
|
|
print ("FUUUUCK. Couldn't find "+volArr[vo])
|
|
)
|
|
maxOps.cloneNodes newVolO cloneType:#copy actualNodeList:&c newNodes:&nnl
|
|
cutterObj = nnl[1]
|
|
cutterObj.name = newName
|
|
|
|
-- BEFORE WE DO THE INITIAL TRIM HERE, DUPLICATE THE CUTTERoBJ AND ADD A TINY PUSH TO IT
|
|
--WE WILL AFTER THE BOOLEAN USE THIS AS A VL SELECT AND DELETE ANY NONE SELECTED VERTS
|
|
--THIS IS TO TRY AND RESOLVE THE ODD DIRTY BITS WHICH GET LEFT
|
|
-- currS = selection as array
|
|
-- currO = getNodeByName currS[1].name
|
|
|
|
-- cleanVolName = ("geo_"+(substring volO.Name 15 30))
|
|
-- maxOps.cloneNodes cutterObj cloneType:#copy actualNodeList:&c newNodes:&nnl
|
|
-- cleanVolObj = nnl[1]
|
|
-- cleanVolObj.name = cleanVolName
|
|
-- select cleanVolObj
|
|
-- modPanel.addModToSelection (Push ()) ui:on
|
|
-- cleanVolObj.modifiers[#Push].Push_Value = 0.02
|
|
-- collapseStack cleanVolObj
|
|
|
|
-- select currO
|
|
|
|
|
|
if vo == 1 then --do intersection boolean
|
|
(
|
|
print ("Trimming "+obToBool.name+" with "+cutterObj.name)
|
|
|
|
cleanVolName = ("geo_"+(substring volO.Name 15 30))
|
|
maxOps.cloneNodes cutterObj cloneType:#copy actualNodeList:&c newNodes:&nnl
|
|
cleanVolObj = nnl[1]
|
|
cleanVolObj.name = cleanVolName
|
|
select cleanVolObj
|
|
modPanel.addModToSelection (Push ()) ui:on
|
|
cleanVolObj.modifiers[#Push].Push_Value = 0.02
|
|
-- maxOps.CollapseNodeTo $ 1 off
|
|
collapseStack cleanVolObj
|
|
|
|
boolObj.createBooleanObject obToBool cutterObj 4 5
|
|
boolObj.setBoolOp obToBool 2
|
|
convertTo obToBool PolyMeshObject
|
|
select obToBool
|
|
removeIsolatedVerts obToBool
|
|
|
|
-- modPanel.addModToSelection (Cap_Holes ()) ui:on
|
|
-- addmodifier obToBool (Cap_Holes ())
|
|
-- obToBool.modifiers[#Cap_Holes].Make_All_New_Edges_Visible = 1
|
|
-- convertTo obToBool PolyMeshObject
|
|
-- collapseStack obToBool
|
|
--
|
|
|
|
|
|
)
|
|
else --do a subtraction boolean
|
|
(
|
|
print ("Trimming "+obToBool.name+" with "+cutterObj.name)
|
|
boolObj.createBooleanObject obToBool cutterObj 4 5
|
|
boolObj.setBoolOp obToBool 3
|
|
convertTo obToBool PolyMeshObject
|
|
select obToBool
|
|
removeIsolatedVerts obToBool
|
|
|
|
-- modPanel.addModToSelection (Cap_Holes ()) ui:on
|
|
-- addmodifier obToBool (Cap_Holes ())
|
|
-- obToBool.modifiers[#Cap_Holes].Make_All_New_Edges_Visible = 1
|
|
-- convertTo obToBool PolyMeshObject
|
|
-- collapseStack
|
|
|
|
|
|
)
|
|
)
|
|
|
|
--now do a vol select using cleanVolObj and delete non selected verts
|
|
select obToBool
|
|
|
|
modPanel.addModToSelection (Vol__Select ()) ui:on
|
|
obToBool.modifiers[#Vol__Select].level = 1
|
|
obToBool.modifiers[#Vol__Select].Volume = 3
|
|
obToBool.modifiers[#Vol__Select].node = cleanVolObj
|
|
modPanel.addModToSelection (Edit_Poly ()) ui:on
|
|
obToBool.modifiers[#Vol__Select].invert = on
|
|
subobjectLevel = 1
|
|
obToBool.modifiers[#Edit_Poly].useStackSelection = on
|
|
obToBool.modifiers[#Edit_Poly].ButtonOp #DeleteVertex
|
|
collapseStack obToBool
|
|
delete cleanVolObj
|
|
|
|
--now for ease of debugging set the mat id of this object to be the index number of the volume.
|
|
faceCnt = obToBool.numFaces
|
|
subobjectLevel = 4
|
|
for f = 1 to faceCnt do
|
|
(
|
|
obToBool.EditablePoly.SetSelection #Face #{f}
|
|
obToBool.EditablePoly.setMaterialIndex vIndex 1
|
|
)
|
|
|
|
-- --enable the command panel for speed purposes
|
|
-- cui.commandPanelOpen = true
|
|
)
|
|
|
|
fn generateMiscVols = --this generates the extra cutters used which arent cylinders such as those used to trim edges of arms and trim opposing thighs
|
|
(
|
|
for ob = 1 to splitVolObjArray.count do
|
|
(
|
|
for tr = 1 to splitVolObjArray[ob].count do
|
|
(
|
|
if splitVolObjArray[ob][tr] == "trimVol_R_ArmBox" then
|
|
(
|
|
print ("Generating "+splitVolObjArray[ob][tr])
|
|
nudger = -0.025
|
|
|
|
trimmer = Box lengthsegs:10 widthsegs:10 heightsegs:10 length:2 width:1 height:2 mapcoords:on --transform:(matrix3 [1,0,0] [0,0,1] [0,-1,0] [0.49,1.06454,0.862417]) isSelected:on
|
|
trimmer.name = splitVolObjArray[ob][tr]
|
|
|
|
arm = $SKEL_R_UpperArm
|
|
aPos = arm.position[1]
|
|
bPos = trimmer.position[1]
|
|
|
|
NPos = (trimmer.width /2)
|
|
|
|
-- bocks.position.controller.x_position = ( aPos)
|
|
neg = undefined
|
|
if Apos < 0 do
|
|
(
|
|
Apos = apos * -1
|
|
neg = true
|
|
)
|
|
if nPos < 0 do
|
|
(
|
|
nPos = nPos * -1
|
|
)
|
|
newP = (apos + nPos)
|
|
|
|
if neg == true then
|
|
(
|
|
trimmer.position.controller.x_position = ((newP * -1) + nudger)
|
|
)
|
|
else
|
|
(
|
|
trimmer.position.controller.x_position = (newP + nudger)
|
|
)
|
|
)
|
|
else
|
|
(
|
|
if splitVolObjArray[ob][tr] == "trimVol_L_ArmBox" then
|
|
(
|
|
print ("Generating "+splitVolObjArray[ob][tr])
|
|
nudger = 0.025
|
|
|
|
trimmer = Box lengthsegs:10 widthsegs:10 heightsegs:10 length:2 width:1 height:2 mapcoords:on --transform:(matrix3 [1,0,0] [0,0,1] [0,-1,0] [0.49,1.06454,0.862417]) isSelected:on
|
|
trimmer.name = splitVolObjArray[ob][tr]
|
|
|
|
arm = $SKEL_L_UpperArm
|
|
aPos = arm.position[1]
|
|
bPos = trimmer.position[1]
|
|
|
|
NPos = (trimmer.width /2)
|
|
|
|
-- bocks.position.controller.x_position = ( aPos)
|
|
neg = undefined
|
|
if Apos < 0 do
|
|
(
|
|
Apos = apos * -1
|
|
neg = true
|
|
)
|
|
if nPos < 0 do
|
|
(
|
|
nPos = nPos * -1
|
|
)
|
|
newP = (apos + nPos)
|
|
|
|
if neg == true then
|
|
(
|
|
trimmer.position.controller.x_position = ((newP * -1) + nudger)
|
|
)
|
|
else
|
|
(
|
|
trimmer.position.controller.x_position = (newP + nudger)
|
|
)
|
|
)
|
|
else
|
|
(
|
|
if splitVolObjArray[ob][tr] == "trimVol_L_ThighBox" then
|
|
(
|
|
print ("Generating "+splitVolObjArray[ob][tr])
|
|
nudger = - 0.08
|
|
|
|
|
|
trimmer = Box lengthsegs:10 widthsegs:10 heightsegs:10 length:2 width:1 height:2 mapcoords:on --transform:(matrix3 [1,0,0] [0,0,1] [0,-1,0] [0.49,1.06454,0.862417]) isSelected:on
|
|
trimmer.name = splitVolObjArray[ob][tr]
|
|
|
|
arm = $SKEL_L_Thigh
|
|
aPos = arm.position[1]
|
|
bPos = trimmer.position[1]
|
|
|
|
NPos = (trimmer.width /2)
|
|
|
|
-- bocks.position.controller.x_position = ( aPos)
|
|
neg = undefined
|
|
if Apos < 0 do
|
|
(
|
|
Apos = apos * -1
|
|
neg = true
|
|
)
|
|
if nPos < 0 do
|
|
(
|
|
nPos = nPos * -1
|
|
)
|
|
newP = (apos + nPos)
|
|
|
|
if neg == true then
|
|
(
|
|
-- trimmer.position.controller.x_position = ((newP * -1) + nudger )
|
|
in coordsys world trimmer.position.controller.X_Position = (( 0 - (trimmer.width / 2)))
|
|
)
|
|
else
|
|
(
|
|
-- trimmer.position.controller.x_position = (newP + (nudger * -1))
|
|
in coordsys world trimmer.position.controller.X_Position = (( 0 - (trimmer.width / 2)) * -1)
|
|
)
|
|
)
|
|
else
|
|
(
|
|
if splitVolObjArray[ob][tr] == "trimVol_R_ThighBox" then
|
|
(
|
|
print ("Generating "+splitVolObjArray[ob][tr])
|
|
-- nudger = 0.08
|
|
nudger = 0.12
|
|
|
|
trimmer = Box lengthsegs:10 widthsegs:10 heightsegs:10 length:2 width:1 height:2 mapcoords:on --transform:(matrix3 [1,0,0] [0,0,1] [0,-1,0] [0.49,1.06454,0.862417]) isSelected:on
|
|
trimmer.name = splitVolObjArray[ob][tr]
|
|
|
|
arm = $SKEL_R_Thigh
|
|
aPos = arm.position[1]
|
|
bPos = trimmer.position[1]
|
|
|
|
NPos = (trimmer.width /2)
|
|
|
|
-- bocks.position.controller.x_position = ( aPos)
|
|
neg = undefined
|
|
if Apos < 0 do
|
|
(
|
|
Apos = apos * -1
|
|
neg = true
|
|
)
|
|
if nPos < 0 do
|
|
(
|
|
nPos = nPos * -1
|
|
)
|
|
newP = (apos + nPos)
|
|
|
|
if neg == true then
|
|
(
|
|
-- trimmer.position.controller.x_position = ((newP * -1) + nudger )
|
|
in coordsys world trimmer.position.controller.X_Position = (( 0 - (trimmer.width / 2)))
|
|
)
|
|
else
|
|
(
|
|
-- trimmer.position.controller.x_position = (newP + (nudger * -1))
|
|
in coordsys world trimmer.position.controller.X_Position = (( 0 - (trimmer.width / 2)) * -1)
|
|
)
|
|
)
|
|
else
|
|
(
|
|
if splitVolObjArray[ob][tr] == "trimVol_Pelvis_Bot" then
|
|
(
|
|
trimmer = Box lengthsegs:10 widthsegs:10 heightsegs:10 length:1 width:1 height:0.25 mapcoords:on --transform:(matrix3 [1,0,0] [0,0,1] [0,-1,0] [0.49,1.06454,0.862417]) isSelected:on
|
|
trimmer.name = splitVolObjArray[ob][tr]
|
|
--we will now position the trimbox at the thigh then offset it down by a percentage fo the thigh length
|
|
thighLength = distance $Skel_L_Thigh $Skel_L_Calf
|
|
print ("thighLength = "+(thighlength as string))
|
|
trimmer.parent = $SKEL_L_Thigh
|
|
in coordsys parent trimmer.position = [0,0,0]
|
|
trimmer.parent = undefined
|
|
trimPos = in coordsys world trimmer.position
|
|
--newZ = (trimPos[3]-((thighLength/100) * 30))
|
|
newZ = (trimPos[3] - ((thighLength / 100) * 90))
|
|
trimPosNew = [trimPos[1], trimPos[2], newZ]
|
|
in coordsys world trimmer.position = trimPosNew
|
|
)
|
|
else
|
|
(
|
|
if splitVolObjArray[ob][tr] == "trimBox_R_Shoulder" then
|
|
(
|
|
trimmer = Box lengthsegs:10 widthsegs:10 heightsegs:10 length:1 width:1 height:0.25 mapcoords:on --transform:(matrix3 [1,0,0] [0,0,1] [0,-1,0] [0.49,1.06454,0.862417]) isSelected:on
|
|
trimmer.position = $Skel_R_Upperarm.position
|
|
trimmer.name = splitVolObjArray[ob][tr]
|
|
in coordsys world trimmer.rotation.controller.Y_Rotation = 90
|
|
)
|
|
else
|
|
(
|
|
if splitVolObjArray[ob][tr] == "trimBox_L_Shoulder" then
|
|
(
|
|
trimmer = Box lengthsegs:10 widthsegs:10 heightsegs:10 length:1 width:1 height:0.25 mapcoords:on --transform:(matrix3 [1,0,0] [0,0,1] [0,-1,0] [0.49,1.06454,0.862417]) isSelected:on
|
|
trimmer.position = $Skel_R_Upperarm.position
|
|
trimmer.name = splitVolObjArray[ob][tr]
|
|
in coordsys world trimmer.rotation.controller.Y_Rotation = -90
|
|
)
|
|
else
|
|
(
|
|
if splitVolObjArray[ob][tr] == "trimBox_R_Shoulder_ForSpine3" then
|
|
(
|
|
trimmer = Box lengthsegs:10 widthsegs:10 heightsegs:10 length:1 width:1 height:0.25 mapcoords:on --transform:(matrix3 [1,0,0] [0,0,1] [0,-1,0] [0.49,1.06454,0.862417]) isSelected:on
|
|
trimmer.position = $Skel_R_Upperarm.position
|
|
trimmer.name = splitVolObjArray[ob][tr]
|
|
in coordsys world trimmer.rotation.controller.Y_Rotation = -90
|
|
)
|
|
else
|
|
(
|
|
if splitVolObjArray[ob][tr] == "trimBox_L_Shoulder_ForSpine3" then
|
|
(
|
|
trimmer = Box lengthsegs:10 widthsegs:10 heightsegs:10 length:1 width:1 height:0.25 mapcoords:on --transform:(matrix3 [1,0,0] [0,0,1] [0,-1,0] [0.49,1.06454,0.862417]) isSelected:on
|
|
trimmer.position = $Skel_L_Upperarm.position
|
|
trimmer.name = splitVolObjArray[ob][tr]
|
|
in coordsys world trimmer.rotation.controller.Y_Rotation = 90
|
|
)
|
|
else
|
|
(
|
|
if splitVolObjArray[ob][tr] == "trimBox_Clavs" do
|
|
(
|
|
trimmer = Box lengthsegs:10 widthsegs:10 heightsegs:10 length:1 width:1 height:0.25 mapcoords:on --transform:(matrix3 [1,0,0] [0,0,1] [0,-1,0] [0.49,1.06454,0.862417]) isSelected:on
|
|
trimmer.name = splitVolObjArray[ob][tr]
|
|
--we will now position the trimbox at the thigh then offset it down by a percentage fo the thigh length
|
|
thighLength = distance $Skel_Spine3 $Skel_Neck_1
|
|
print ("thighLength = "+(thighlength as string))
|
|
trimmer.parent = $SKEL_Spine3
|
|
in coordsys parent trimmer.position = [0,0,0]
|
|
trimmer.parent = undefined
|
|
trimPos = in coordsys world trimmer.position
|
|
newZ = (trimPos[3] + ((thighLength / 100) * 30))
|
|
trimPosNew = [trimPos[1], trimPos[2], newZ]
|
|
in coordsys world trimmer.position = trimPosNew
|
|
in coordsys world trimmer.controller.rotation.X_rotation = 180
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
fn createVols =
|
|
(
|
|
|
|
-- splitVolObjArray = #()
|
|
|
|
rigBoneListStruct = #( --array of all skeleton bones which we want to split mesh for
|
|
( rigBoneStruct rb_bone:$SKEL_Pelvis rb_Radius: 0.25 rb_Length:($SKEL_Pelvis.length * 2) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_Spine0 rb_Radius: 0.25 rb_Length:((distance $SKEL_Spine0 $SKEL_Spine1)) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_Spine1 rb_Radius: 0.25 rb_Length:($SKEL_Spine1.length * 1.4) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_Spine2 rb_Radius: 0.22 rb_Length:($SKEL_Spine2.length * 1.4) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_Spine3 rb_Radius: 0.3 rb_Length:($SKEL_Spine3.length * 0.8) rb_Trans:undefined ),
|
|
|
|
|
|
-- ( rigBoneStruct rb_bone:$SKEL_Head rb_Radius: 0.15 rb_Length:($SKEL_Head.length * 2) rb_Trans:(matrix3 [-1,0.000145016,-0.000328264] [-5.81659e-005,-0.96816,-0.250334] [-0.000354256,-0.250334,0.96816] [-0.000112729,0.0139014,1.59917]) ),
|
|
( rigBoneStruct rb_bone:$SKEL_Head rb_Radius: 0.19 rb_Length:($SKEL_Head.length * 2) rb_Trans:undefined),
|
|
( rigBoneStruct rb_bone:$SKEL_Neck_1 rb_Radius: 0.15 rb_Length:($SKEL_Neck_1.length * 0.45) rb_Trans:undefined),
|
|
|
|
( rigBoneStruct rb_bone:$SKEL_L_Thigh rb_Radius: 0.18 rb_Length:$SKEL_L_Thigh.length rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Calf rb_Radius: 0.15 rb_Length:$SKEL_L_Calf.length rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Foot rb_Radius: 0.1 rb_Length:($SKEL_L_Foot.length * 1.5) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Toe0 rb_Radius: 0.1 rb_Length:0.25 rb_Trans:undefined ),
|
|
|
|
( rigBoneStruct rb_bone:$SKEL_R_Thigh rb_Radius: 0.18 rb_Length:$SKEL_R_Thigh.length rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Calf rb_Radius: 0.15 rb_Length:$SKEL_R_Calf.length rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Foot rb_Radius: 0.1 rb_Length:($SKEL_R_Foot.length * 1.5) rb_Trans:(matrix3 [0.999233,0.0391547,3.80804e-005] [-0.00134612,0.0333794,0.999442] [0.0391315,-0.998676,0.0334067] [-0.155,0.145386,0.0342977]) ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Toe0 rb_Radius: 0.1 rb_Length:0.25 rb_Trans:undefined ),
|
|
|
|
( rigBoneStruct rb_bone:$SKEL_L_Clavicle rb_Radius: 0.15 rb_Length:$SKEL_L_Clavicle.length rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_UpperArm rb_Radius: 0.1 rb_Length:$SKEL_L_UpperArm.length rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Forearm rb_Radius: 0.1 rb_Length:($SKEL_L_Forearm.length * 1.1) rb_Trans:undefined ),
|
|
|
|
( rigBoneStruct rb_bone:$SKEL_L_Hand rb_Radius: 0.04 rb_Length:($SKEL_L_Hand.length * 0.9) rb_Trans:undefined ),
|
|
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger00 rb_Radius: 0.018 rb_Length:($SKEL_L_Finger00.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger01 rb_Radius: 0.024 rb_Length:($SKEL_L_Finger01.length * 1.15) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger02 rb_Radius: 0.013 rb_Length:($SKEL_L_Finger02.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger10 rb_Radius: 0.016 rb_Length:($SKEL_L_Finger10.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger11 rb_Radius: 0.013 rb_Length:($SKEL_L_Finger11.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger12 rb_Radius: 0.013 rb_Length:($SKEL_L_Finger12.length * 1.3) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger20 rb_Radius: 0.014 rb_Length:($SKEL_L_Finger20.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger21 rb_Radius: 0.013 rb_Length:($SKEL_L_Finger21.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger22 rb_Radius: 0.013 rb_Length:($SKEL_L_Finger22.length * 1.3) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger30 rb_Radius: 0.014 rb_Length:($SKEL_L_Finger30.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger31 rb_Radius: 0.013 rb_Length:($SKEL_L_Finger31.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger32 rb_Radius: 0.013 rb_Length:($SKEL_L_Finger32.length * 1.3) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger40 rb_Radius: 0.014 rb_Length:($SKEL_L_Finger40.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger41 rb_Radius: 0.013 rb_Length:($SKEL_L_Finger41.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_L_Finger42 rb_Radius: 0.013 rb_Length:($SKEL_L_Finger42.length * 1.3) rb_Trans:undefined ),
|
|
|
|
( rigBoneStruct rb_bone:$SKEL_R_Clavicle rb_Radius: 0.15 rb_Length:$SKEL_R_Clavicle.length rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_UpperArm rb_Radius: 0.1 rb_Length:$SKEL_R_UpperArm.length rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Forearm rb_Radius: 0.1 rb_Length:($SKEL_R_Forearm.length * 1.1) rb_Trans:undefined ),
|
|
|
|
( rigBoneStruct rb_bone:$SKEL_R_Hand rb_Radius: 0.04 rb_Length:($SKEL_R_Hand.length * 0.9) rb_Trans:undefined ),
|
|
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger00 rb_Radius: 0.018 rb_Length:($SKEL_R_Finger00.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger01 rb_Radius: 0.024 rb_Length:($SKEL_R_Finger01.length * 1.15) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger02 rb_Radius: 0.013 rb_Length:($SKEL_R_Finger02.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger10 rb_Radius: 0.016 rb_Length:($SKEL_R_Finger10.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger11 rb_Radius: 0.013 rb_Length:($SKEL_R_Finger11.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger12 rb_Radius: 0.013 rb_Length:($SKEL_R_Finger12.length * 1.3) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger20 rb_Radius: 0.014 rb_Length:($SKEL_R_Finger20.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger21 rb_Radius: 0.013 rb_Length:($SKEL_R_Finger21.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger22 rb_Radius: 0.013 rb_Length:($SKEL_R_Finger22.length * 1.3) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger30 rb_Radius: 0.014 rb_Length:($SKEL_R_Finger30.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger31 rb_Radius: 0.013 rb_Length:($SKEL_R_Finger31.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger32 rb_Radius: 0.013 rb_Length:($SKEL_R_Finger32.length * 1.3) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger40 rb_Radius: 0.014 rb_Length:($SKEL_R_Finger40.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger41 rb_Radius: 0.013 rb_Length:($SKEL_R_Finger41.length * 1.1) rb_Trans:undefined ),
|
|
( rigBoneStruct rb_bone:$SKEL_R_Finger42 rb_Radius: 0.013 rb_Length:($SKEL_R_Finger42.length * 1.3) rb_Trans:undefined )
|
|
)
|
|
|
|
--******************************************************************************************
|
|
--NOW CREATE THE VOLUMES FOR DETACHING THE MESH INTO PIECES
|
|
--******************************************************************************************
|
|
for i = 1 to rigBoneListStruct.count do
|
|
(
|
|
volTrans = undefined
|
|
|
|
currentObj = getNodeByName ("splitVol_"+rigBoneListStruct[i].rb_bone.name)
|
|
if currentObj != undefined do
|
|
(
|
|
delete currentObj
|
|
)
|
|
|
|
--we need to make the feet vols as cubes so this is a bit of a hack
|
|
if (rigBoneListStruct[i].rb_bone.name == "SKEL_L_Foot") then
|
|
(
|
|
splitObj = Box lengthsegs:10 widthsegs:10 heightsegs:10 length:0.4 width:0.3 height:0.125 mapcoords:on pos:[0.141602,0.0458236,0] isSelected:on
|
|
splitObj.name = ("splitVol_"+rigBoneListStruct[i].rb_bone.name)
|
|
splitObj.parent = rigBoneListStruct[i].rb_bone
|
|
)
|
|
else
|
|
(
|
|
if (rigBoneListStruct[i].rb_bone.name == "SKEL_R_Foot") then
|
|
(
|
|
splitObj = Box lengthsegs:10 widthsegs:10 heightsegs:10 length:0.4 width:0.3 height:0.125 mapcoords:on pos:[-0.141602,0.0458236,0] isSelected:on
|
|
splitObj.name = ("splitVol_"+rigBoneListStruct[i].rb_bone.name)
|
|
splitObj.parent = rigBoneListStruct[i].rb_bone
|
|
)
|
|
else
|
|
(
|
|
|
|
|
|
splitObj = Cylinder smooth:on heightsegs:8 capsegs:4 sides:12 height:rigBoneListStruct[i].rb_Length radius:rigBoneListStruct[i].rb_Radius mapcoords:on pos:[0,0,0] isSelected:on
|
|
splitObj.name = ("splitVol_"+rigBoneListStruct[i].rb_bone.name)
|
|
splitObj.parent = rigBoneListStruct[i].rb_bone
|
|
|
|
|
|
--******************************************************************************************
|
|
--NOW SORT OUT THE ALIGNMENT OF THE VOLUME
|
|
--******************************************************************************************
|
|
if rigBoneListStruct[i].rb_Trans == undefined then
|
|
(
|
|
volTrans = rigBoneListStruct[i].rb_bone.transform
|
|
splitObj.transform = ( in coordsys parent volTrans)
|
|
in coordsys parent rotate splitObj (angleaxis 90 [0,1,0])
|
|
if (substring splitObj.name 15 5) == "Spine" do
|
|
(
|
|
in coordsys world splitObj.rotation = (quat 3.65661e-007 0 -1 6.78003e-007)
|
|
)
|
|
)
|
|
else --this allows us to offset the transforms from the bone.
|
|
(
|
|
volTrans = rigBoneListStruct[i].rb_Trans
|
|
splitObj.transform = ( in coordsys parent volTrans)
|
|
)
|
|
if splitObj.name == "splitVol_SKEL_Head" do
|
|
(
|
|
splitObj.position = $RB_Neck_1.position
|
|
)
|
|
|
|
-- append splitVolObjArray splitObj
|
|
)
|
|
)
|
|
)
|
|
|
|
--hacky little offset for the neck
|
|
in coordsys parent $splitVol_SKEL_Neck_1.position.controller.X_position = 0.01
|
|
--now we need to make the custom trimmers
|
|
generateMiscVols()
|
|
)
|
|
|
|
fn runBooleanProc = --this kicks it all off
|
|
(
|
|
--first off create the volumes
|
|
createVols()
|
|
|
|
--need to do a segment on all the geo - hands and body
|
|
-- disableSceneRedraw()
|
|
-- --disable the command panel for speed purposes
|
|
-- cui.commandPanelOpen = false
|
|
|
|
shouldIskinHands = true --flag set to control if we are skinning the hands or segmenting them
|
|
|
|
obToOperateOn = #( --array of objects which will get segmented etc
|
|
$RAWMESH
|
|
-- $Uppr_000_U,
|
|
-- $Lowr_000_U
|
|
)
|
|
finalObNames = #( --array of names to rename the ifnal recombined segmented meshes to based off the index of obToOperateOn
|
|
"head_000_r"
|
|
-- "Uppr_000_U",
|
|
-- "Lowr_000_U"
|
|
)
|
|
|
|
for m = 1 to obToOperateon.count do
|
|
-- for m = 3 to obToOperateon.count do
|
|
(
|
|
disableSceneRedraw()
|
|
--disable the command panel for speed purposes
|
|
cui.commandPanelOpen = false
|
|
|
|
--we need to teselate the hands so booleans work
|
|
if m != 1 do
|
|
(
|
|
addmodifier obToOperateon[m] (TurboSmooth ())
|
|
obToOperateon[m].modifiers[#TurboSmooth].iterations = 2 --trying to put more polies in
|
|
collapsestack obToOperateon[m]
|
|
)
|
|
|
|
masterMesh = obToOperateon[m]
|
|
|
|
("Booleaning a copy of "+masterMesh.name)
|
|
for i = 1 to splitVolObjArray.count do
|
|
(
|
|
vIndex = i
|
|
boolMesh masterMesh splitVolObjArray[i] vIndex
|
|
)
|
|
--ok now we can try and delete
|
|
print ("Deleting "+masterMesh.name)
|
|
delete masterMesh
|
|
|
|
--now need to filein the combine function
|
|
enableSceneRedraw()
|
|
--enable the command panel for speed purposes
|
|
cui.commandPanelOpen = true
|
|
filein (RsConfigGetWildWestDir() + "script/max/Rockstar_North/character/Rigging_tools/giant/combineGeo.ms")
|
|
|
|
--now we can rename
|
|
--** geo_Pelvis will always be the name of the geo as thats the first piece of segmented geo ***
|
|
$geo_Pelvis.name = finalObNames[m]
|
|
)
|
|
|
|
print "trimming complete...."
|
|
print "CLEANING VOLS"
|
|
cleanVols()
|
|
|
|
|
|
)
|
|
|
|
runBooleanProc() |