You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1760 lines
45 KiB
Plaintext
1760 lines
45 KiB
Plaintext
-------------------------------------------------------------------------------
|
|
-- CryRiggingTools.ms
|
|
-- Version 2.6 External
|
|
-- by Christopher Evans
|
|
-------------------------------------------------------------------------------
|
|
|
|
collapsedCache = #()
|
|
global CryMorphTools
|
|
(
|
|
if CryMorphTools != undefined do ( closerolloutfloater CryMorphTools )
|
|
CryMorphTools = newrolloutfloater "CryMorphTools 2.7" 190 800
|
|
|
|
--used for index2loc
|
|
Index2Loc
|
|
obj1 = ""
|
|
obj1_points = #()
|
|
collapsedCache = #()
|
|
getVariations = #()
|
|
hiddenVerts = #{}
|
|
|
|
--used by FacialTools
|
|
numMorphs = ""
|
|
exportedMorphs = #()
|
|
|
|
-------------------------------------------------------------------------------
|
|
--FacialTools
|
|
-------------------------------------------------------------------------------
|
|
rollout FacialTools "Facial Tools"
|
|
(
|
|
group "Auto Generation/Extraction"
|
|
(
|
|
label labelMORPHS "No Head Loaded"
|
|
checkbutton LoadMorphsBTN "Load Morphs From Selected"
|
|
checkbox alignToDummy "Organize (Align to helpers)" offset:[13,0]
|
|
checkbox dirty "Enable dirty output" offset:[13,-4]
|
|
edittext layer_txt "New Layer:" fieldWidth:95
|
|
button doit "Bake Morphs" enabled:false
|
|
progressbar doit_prog color:red
|
|
button compile "Add organized morphs to head" enabled:false
|
|
pickbutton compile2 "Add selected morphs to picked"
|
|
)
|
|
|
|
group "Delete Faces From Targets"
|
|
(
|
|
checkbutton loadSelection "Load Polygon Selection"
|
|
button deletePolys "Remove From Selected" enabled:false
|
|
)
|
|
group "Mirror Eye Animation"
|
|
(
|
|
button mirrorEyesLR "Mirror Left Eye to Right"
|
|
button mirrorEyesRL "Mirror Right Eye to Left"
|
|
)
|
|
group "Morph Transfer"
|
|
(
|
|
button selectOriginal "Load Original head"
|
|
button selectTransfer "Load Target Head"
|
|
button bakeTransfer "Bake Out Transfer"
|
|
checkbox addSuffix "Add obj name suffix"
|
|
checkbox moveAside "Translate right 20 units"
|
|
)
|
|
|
|
|
|
--FacialTools open/close
|
|
-------------------------
|
|
on FacialTools open do
|
|
(
|
|
alignToDummy.checked = true
|
|
if polysSelected != undefined then
|
|
(
|
|
deletepolys.enabled = true
|
|
)
|
|
|
|
local tempVar = cryTools.inFromINI "CryTools" "morph_pos"
|
|
if tempVar == "" then tempVar = [7,7]
|
|
else
|
|
(
|
|
try
|
|
(
|
|
tempVar = execute tempVar
|
|
crymorphtools.pos = tempVar
|
|
)
|
|
catch
|
|
(
|
|
cryTools.outToINI "CryTools" "morph_pos" "[7,7]"
|
|
crymorphtools.pos = [7,7]
|
|
)
|
|
)
|
|
)
|
|
|
|
on FacialTools close do
|
|
(
|
|
cryTools.outToINI "CryTools" "morph_pos" (crymorphtools.pos as String)
|
|
)
|
|
|
|
|
|
--LoadMorphsBTN
|
|
----------------
|
|
on LoadMorphsBTN changed state do
|
|
(
|
|
if state == on then
|
|
(
|
|
try
|
|
(
|
|
testMorph = $.morpher
|
|
)
|
|
catch
|
|
(
|
|
messageBox "Object has no Morpher modifier"
|
|
LoadMorphsBTN.checked = false
|
|
return undefined
|
|
)
|
|
for i = 1 to 100 do
|
|
(
|
|
test = $.morpher[i].name
|
|
print $.morpher[i].name
|
|
if test == "- empty -" then
|
|
(
|
|
numMorphs = (i - 1)
|
|
exit loop
|
|
)
|
|
)
|
|
labelMORPHS.text = ((numMorphs as string) + " Morphs Loaded From:")
|
|
LoadMorphsBTN.text = ($.name)
|
|
doit.enabled = true
|
|
)
|
|
else
|
|
(
|
|
LoadMorphsBTN.text = "No Head Loaded"
|
|
doit.enabled = false
|
|
)
|
|
)
|
|
|
|
|
|
--Align/Dirty Checked
|
|
----------------------
|
|
on alignToDummy changed state do
|
|
(
|
|
if alignToDummy.checked == true then
|
|
(
|
|
dirty.checked = false
|
|
)
|
|
else
|
|
(
|
|
dirty.checked = true
|
|
)
|
|
)
|
|
|
|
on dirty changed state do
|
|
(
|
|
if dirty.checked == true then
|
|
(
|
|
alignToDummy.checked = false
|
|
)
|
|
else
|
|
(
|
|
alignToDummy.checked = true
|
|
)
|
|
)
|
|
|
|
|
|
--BakeMorphs pressed
|
|
---------------------
|
|
on doit pressed do
|
|
(
|
|
if selection[1] == undefined do
|
|
(
|
|
messageBox "Please select a character head." title:"Error"
|
|
return undefined
|
|
)
|
|
|
|
try
|
|
(
|
|
testMorph = $.morpher
|
|
)
|
|
catch
|
|
(
|
|
messageBox "Object has no Morpher modifier"
|
|
return undefined
|
|
)
|
|
|
|
undo "make heads" on
|
|
(
|
|
with redraw off
|
|
(
|
|
max create mode
|
|
--make layer
|
|
layer_name = layer_txt.text
|
|
layer01 = LayerManager.newLayer()
|
|
layer01.setname layer_name
|
|
layer01.current = true
|
|
|
|
channelcount = numMorphs
|
|
exportedMorphs = #()
|
|
for i = 1 to channelcount do
|
|
(
|
|
old = $
|
|
$.morpher[i].value = 100.0
|
|
morph_name = filterString ($.morpher[i].name) " "
|
|
new = snapshot $ name:morph_name[2]
|
|
append exportedMorphs new
|
|
old.morpher[i].value = 0.0
|
|
select old
|
|
doit_prog.value = (i*(100/channelcount))
|
|
)
|
|
max modify mode
|
|
doit_prog.value = 0
|
|
)
|
|
)
|
|
|
|
--arbitrary morph dump
|
|
if dirty.checked == true then
|
|
(
|
|
i=1
|
|
for obj in exportedMorphs do
|
|
(
|
|
move obj [(20*i),0,0]
|
|
i += 1
|
|
)
|
|
)
|
|
|
|
--move and color
|
|
if alignToDummy.checked == true then
|
|
(
|
|
undo "organize" on
|
|
(
|
|
mn = 1
|
|
for obj in exportedMorphs do
|
|
(
|
|
try
|
|
(
|
|
obj.transform = (getNodeByName ("Dummy_" + obj.name)).transform
|
|
)
|
|
catch
|
|
(
|
|
move obj [(20*mn),0,0]
|
|
mn += 1
|
|
)
|
|
)
|
|
)
|
|
)
|
|
compile.enabled = true
|
|
)
|
|
|
|
-- Add morphs to picked
|
|
on compile pressed do
|
|
(
|
|
if selection[1] == undefined then
|
|
(
|
|
messageBox "Please select a character head." title:"Error"
|
|
return undefined
|
|
)
|
|
m = 1
|
|
for obj in exportedMorphs do
|
|
(
|
|
wm3_mc_buildfromnode $.morpher m obj
|
|
m += 1
|
|
)
|
|
)
|
|
|
|
on compile2 picked pick do
|
|
(
|
|
try
|
|
(
|
|
for i=1 to selection.count do
|
|
(
|
|
wm3_mc_buildfromnode pick.morpher i selection[i]
|
|
)
|
|
)
|
|
catch()
|
|
)
|
|
|
|
--Delete Faces From Targets
|
|
on loadSelection changed state do
|
|
(
|
|
if state == on do
|
|
(
|
|
try
|
|
(
|
|
try
|
|
(
|
|
testMorph = $.morpher
|
|
)
|
|
catch
|
|
(
|
|
messageBox "Object has no Morpher modifier"
|
|
return undefined
|
|
)
|
|
if $selection.count > 0 then
|
|
(
|
|
if (getFaceSelection $) == undefined then
|
|
polysSelected = (getFaceSelection $)
|
|
loadSelection.text = ((polysSelected.count as string) + " Polygons Selected")
|
|
deletePolys.enabled = true
|
|
)
|
|
)
|
|
catch(loadSelection.checked = false)
|
|
)
|
|
if state == off do
|
|
(
|
|
loadSelection.text = "Load Polygon Selection"
|
|
deletePolys.enabled = false
|
|
)
|
|
)
|
|
|
|
on deletePolys pressed do
|
|
(
|
|
undo "delete from targets" on
|
|
(
|
|
whatHeadsSelected = ($selection as array)
|
|
for obj in whatHeadsSelected do
|
|
(
|
|
obj.selectedfaces = polysSelected
|
|
max modify mode
|
|
modPanel.setCurrentObject obj
|
|
subObjectLevel = 4
|
|
meshops.delete obj
|
|
obj.selectedfaces = #()
|
|
)
|
|
)
|
|
)
|
|
|
|
|
|
--Mirror Eyes pressed
|
|
---------------------
|
|
on mirrorEyesLR pressed do
|
|
(
|
|
left_eye = #($Eye_lid_L_U_01, $Eye_lid_L_U_02, $Eye_lid_L_U_03, $Eye_lid_L_L_01, $Eye_lid_L_L_02, $Eye_lid_L_L_03)
|
|
right_eye = #($Eye_lid_R_U_01, $Eye_lid_R_U_02, $Eye_lid_R_U_03, $Eye_lid_R_L_01, $Eye_lid_R_L_02, $Eye_lid_R_L_03)
|
|
try
|
|
(
|
|
undo "mirror eye anim L R" on
|
|
(
|
|
for i=1 to right_eye.count do
|
|
(
|
|
deleteKeys right_eye[i].rotation.controller.keys #allkeys
|
|
deleteKeys right_eye[i].position.controller.keys #allkeys
|
|
deleteKeys right_eye[i].scale.controller.keys #allkeys
|
|
right_eye[i].position.controller = copy right_eye[i].position.controller
|
|
right_eye[i].rotation.controller = copy right_eye[i].rotation.controller
|
|
right_eye[i].rotation.controller = tcb_rotation ()
|
|
left_eye[i].rotation.controller = tcb_rotation ()
|
|
)
|
|
for i=1 to right_eye.count do
|
|
(
|
|
for r = 1 to left_eye[i].rotation.controller.keys.count do
|
|
(
|
|
with animate on
|
|
(
|
|
slidertime = left_eye[i].rotation.controller.keys[r].time
|
|
crytools.MirrorObjs right_eye[i] left_eye[i] $bip01 #y #y
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)catch()
|
|
)
|
|
|
|
on mirrorEyesRL pressed do
|
|
(
|
|
left_eye = #($Eye_lid_L_U_01, $Eye_lid_L_U_02, $Eye_lid_L_U_03, $Eye_lid_L_L_01, $Eye_lid_L_L_02, $Eye_lid_L_L_03)
|
|
right_eye = #($Eye_lid_R_U_01, $Eye_lid_R_U_02, $Eye_lid_R_U_03, $Eye_lid_R_L_01, $Eye_lid_R_L_02, $Eye_lid_R_L_03)
|
|
try
|
|
(
|
|
undo "mirror eye anim R L" on
|
|
(
|
|
for i=1 to left_eye.count do
|
|
(
|
|
deleteKeys left_eye[i].rotation.controller.keys #allkeys
|
|
deleteKeys left_eye[i].position.controller.keys #allkeys
|
|
deleteKeys left_eye[i].scale.controller.keys #allkeys
|
|
left_eye[i].position.controller = copy left_eye[i].position.controller
|
|
left_eye[i].rotation.controller = copy left_eye[i].rotation.controller
|
|
left_eye[i].rotation.controller = tcb_rotation ()
|
|
right_eye[i].rotation.controller = tcb_rotation ()
|
|
)
|
|
for i=1 to left_eye.count do
|
|
(
|
|
for r = 1 to right_eye[i].rotation.controller.keys.count do
|
|
(
|
|
with animate on
|
|
(
|
|
slidertime = right_eye[i].rotation.controller.keys[r].time
|
|
crytools.MirrorObjs left_eye[i] right_eye[i] $bip01 #y #y
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)catch()
|
|
)
|
|
|
|
|
|
--Morph Transfer
|
|
-----------------
|
|
on selectOriginal pressed do
|
|
(
|
|
try
|
|
(
|
|
testMorph = $.morpher
|
|
)
|
|
catch
|
|
(
|
|
messageBox "Object has no Morpher modifier"
|
|
return undefined
|
|
)
|
|
global originalHead = $
|
|
selectOriginal.text = $.name
|
|
)
|
|
|
|
on selectTransfer pressed do
|
|
(
|
|
try
|
|
(
|
|
testMorph = $.morpher
|
|
)
|
|
catch
|
|
(
|
|
messageBox "Object has no Morpher modifier"
|
|
return undefined
|
|
)
|
|
if $selection.count > 0 then
|
|
(
|
|
global transferHead = $
|
|
selectTransfer.text = $.name
|
|
)
|
|
else
|
|
messageBox "Select Node before." title:"Error"
|
|
)
|
|
|
|
on bakeTransfer pressed do
|
|
(
|
|
if originalHead == undefined then
|
|
(
|
|
messagebox "No Original Head Loaded"
|
|
return undefined
|
|
)
|
|
|
|
if $selection.count > 0 then
|
|
(
|
|
moveVal = 0
|
|
for i = 1 to 1000 do
|
|
(
|
|
testName = originalHead.morpher[i].name
|
|
if testName == "- empty -" then
|
|
(
|
|
exit loop
|
|
)
|
|
originalHead.morpher[i].value = 100.0
|
|
morph_name = filterString (originalHead.morpher[i].name) " "
|
|
new = morph_name[2]
|
|
if addSuffix.checked == true then
|
|
(
|
|
snapshot transferHead name:(new + "_" + transferHead.name) isSelected:true
|
|
)
|
|
else
|
|
(
|
|
snapshot transferHead name:new isSelected:true
|
|
)
|
|
if moveAside.checked == true then
|
|
(
|
|
moveVal += 20
|
|
$.position.x = moveVal
|
|
)
|
|
originalHead.morpher[i].value = 0.0
|
|
)
|
|
)
|
|
else
|
|
messageBox "Select Node before." title:"Error"
|
|
)
|
|
)
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
--DrivenMorphs
|
|
-------------------------------------------------------------------------------
|
|
rollout DrivenMorphs "Pose Driven Morphs"
|
|
(
|
|
group "Head/Neck"
|
|
(
|
|
pickbutton headSel "Select Character Head"
|
|
dropdownlist headVectors items:#("Select A Pose Vector...","Look_Up","Look_Down","Look_Right", "Look_Left", "Tilt_Left", "Tilt_Right") height:25
|
|
button createHeadshape "Create A Pose Shape"
|
|
button addTarget "Add Pose Shape To Morpher"
|
|
button extractTarget "Extract Relative Pose Shape "
|
|
--button testMapping "Test Pose Space Mapping"
|
|
)
|
|
|
|
group "Fleshy Eyes (Auto-created)"
|
|
(
|
|
dropdownlist eyeVectors items:#("Select An Eye Direction...","Eyelid_left_upper_middle","Eyelid_left_upper_right","Eyelid_left_upper_left","Eyelid_left_lower_middle","Eyelid_left_lower_left","Eyelid_left_lower_right","Eyelid_left_middle_right","Eyelid_left_middle_left","Eyelid_right_upper_middle","Eyelid_right_upper_left","Eyelid_right _upper_right","Eyelid_right_lower_middle","Eyelid_right_lower_right","Eyelid_right_lower_left","Eyelid_right_middle_left","Eyelid_right_middle_right") height:25
|
|
checkbox createEyeLayer ""
|
|
edittext layerEye_txt "+Layer:" fieldWidth:85 enabled:false offset:[18,-20]
|
|
button bakeEyeShapes "Bake Eye Shapes" --enabled:false
|
|
button addEyeTarget "Add Current Shape To Morpher" enabled:false
|
|
button extractEyeTarget "Extract Relative Shape " --enabled:false
|
|
)
|
|
|
|
group "Shoulders"
|
|
(
|
|
dropdownlist armVectors items:#("Select A Pose Vector...","Left Arm Up","Left Arm Down","Left Arm Forward","Left Arm Back","Right Arm Up","Right Arm Down","Right Arm Forward","Right Arm Back") height:25 enabled:false
|
|
button createShoulderShape "Auto-Create All Shapes" enabled:false
|
|
button addShoulderTarget "Add Pose Shape To Morpher" enabled:false
|
|
button extractShoulderTarget "Extract Relative Pose Shape " enabled:false
|
|
)
|
|
|
|
on headSel picked obj do
|
|
(
|
|
global objItem = obj
|
|
headSel.text = (obj.name + " Head Loaded")
|
|
)
|
|
|
|
on headVectors selected i do
|
|
(
|
|
if i == 1 then
|
|
(
|
|
createHeadshape.text = "Create A Pose Shape"
|
|
createHeadshape.enabled = false
|
|
addTarget.enabled = false
|
|
extractTarget.enabled = false
|
|
)
|
|
else
|
|
(
|
|
if i == 2 then
|
|
(
|
|
if $Look_Up_sculpt != undefined then
|
|
(
|
|
createHeadshape.enabled = false
|
|
createHeadshape.text = "Look_Up Pose Shape Exists"
|
|
addTarget.enabled = true
|
|
extractTarget.enabled = true
|
|
return undefined
|
|
)
|
|
)
|
|
if i == 3 then
|
|
(
|
|
if $Look_Down_sculpt != undefined then
|
|
(
|
|
createHeadshape.enabled = false
|
|
addTarget.enabled = true
|
|
extractTarget.enabled = true
|
|
createHeadshape.text = "Look_Down Pose Shape Exists"
|
|
return undefined
|
|
)
|
|
)
|
|
if i == 4 then
|
|
(
|
|
if $Look_Right_sculpt != undefined then
|
|
(
|
|
createHeadshape.enabled = false
|
|
addTarget.enabled = true
|
|
extractTarget.enabled = true
|
|
createHeadshape.text = "Look_Down Pose Shape Exists"
|
|
return undefined
|
|
)
|
|
)
|
|
if i == 5 then
|
|
(
|
|
if $Look_Left_sculpt != undefined then
|
|
(
|
|
createHeadshape.enabled = false
|
|
addTarget.enabled = true
|
|
extractTarget.enabled = true
|
|
createHeadshape.text = "Look_Down Pose Shape Exists"
|
|
return undefined
|
|
)
|
|
)
|
|
if i == 6 then
|
|
(
|
|
if $Tilt_Left_sculpt != undefined then
|
|
(
|
|
createHeadshape.enabled = false
|
|
addTarget.enabled = true
|
|
extractTarget.enabled = true
|
|
createHeadshape.text = "Tilt_Left Pose Shape Exists"
|
|
return undefined
|
|
)
|
|
)
|
|
if i == 7 then
|
|
(
|
|
if $Tilt_Right_sculpt != undefined then
|
|
(
|
|
createHeadshape.enabled = false
|
|
addTarget.enabled = true
|
|
extractTarget.enabled = true
|
|
createHeadshape.text = "Tilt_Right Pose Shape Exists"
|
|
return undefined
|
|
)
|
|
)
|
|
addTarget.enabled = false
|
|
extractTarget.enabled = false
|
|
createHeadshape.enabled = true
|
|
createHeadshape.text = "Create Pose Shape"
|
|
)
|
|
)
|
|
|
|
on DrivenMorphs open do
|
|
(
|
|
createHeadshape.enabled = false
|
|
addTarget.enabled = false
|
|
extractTarget.enabled = false
|
|
if $Eye_lid_L_L_02 == undefined then
|
|
(
|
|
bakeEyeShapes.enabled = false
|
|
addEyeTarget.enabled = false
|
|
extractEyeTarget.enabled = false
|
|
)
|
|
)
|
|
|
|
on createHeadShape pressed do
|
|
undo "create_snapshot" on
|
|
(
|
|
(
|
|
if objItem == undefined then
|
|
(
|
|
messageBox "Please load a character head." title:"Error"
|
|
return undefined
|
|
)
|
|
|
|
newSnap = headVectors.selected
|
|
|
|
if slidertime != 0 then
|
|
(
|
|
slidertime = 0
|
|
)
|
|
|
|
case headVectors.selection of
|
|
(
|
|
2: in coordsys parent rotate $'Bip01 Head' (angleaxis -40 [0,0,1])
|
|
3: in coordsys parent rotate $'Bip01 Head' (angleaxis 40 [0,0,1])
|
|
4: in coordsys parent rotate $'Bip01 Head' (angleaxis -65 [1,0,0])
|
|
5: in coordsys parent rotate $'Bip01 Head' (angleaxis 65 [1,0,0])
|
|
6: in coordsys parent rotate $'Bip01 Head' (angleaxis -30 [0,1,0])
|
|
7: in coordsys parent rotate $'Bip01 Head' (angleaxis 30 [0,1,0])
|
|
)
|
|
|
|
print ("creating " + newSnap)
|
|
snapshot objItem name: (newSnap + "_sculpt") isSelected:true
|
|
convertTo $ PolyMeshObject
|
|
|
|
createHeadshape.text = (newSnap + " Pose Shape Exists")
|
|
createHeadshape.enabled = false
|
|
|
|
case headVectors.selection of
|
|
(
|
|
2: move $ [0,0,60]
|
|
3: move $ [0,0,30]
|
|
4: move $ [-30,0,0]
|
|
5: move $ [30,0,0]
|
|
6: move $ [30,0,30]
|
|
7: move $ [-30,0,30]
|
|
)
|
|
|
|
case headVectors.selection of
|
|
(
|
|
2: in coordsys parent rotate $'Bip01 Head' (angleaxis 40 [0,0,1])
|
|
3: in coordsys parent rotate $'Bip01 Head' (angleaxis -40 [0,0,1])
|
|
4: in coordsys parent rotate $'Bip01 Head' (angleaxis 65 [1,0,0])
|
|
5: in coordsys parent rotate $'Bip01 Head' (angleaxis -65 [1,0,0])
|
|
6: in coordsys parent rotate $'Bip01 Head' (angleaxis 30 [0,1,0])
|
|
7: in coordsys parent rotate $'Bip01 Head' (angleaxis -30 [0,1,0])
|
|
)
|
|
select objItem
|
|
addTarget.enabled = true
|
|
extractTarget.enabled = true
|
|
)
|
|
)
|
|
|
|
on addTarget pressed do
|
|
undo "add_target" on
|
|
(
|
|
for i = 1 to 1000 do
|
|
(
|
|
test = objItem.morpher[i].name
|
|
if test == "- empty -" then
|
|
(
|
|
global numMorphs = (i - 1)
|
|
exit loop
|
|
)
|
|
)
|
|
|
|
select objItem
|
|
max modify mode
|
|
|
|
case headVectors.selection of
|
|
(
|
|
2: in coordsys parent rotate $'Bip01 Head' (angleaxis -40 [0,0,1])
|
|
3: in coordsys parent rotate $'Bip01 Head' (angleaxis 40 [0,0,1])
|
|
4: in coordsys parent rotate $'Bip01 Head' (angleaxis -65 [1,0,0])
|
|
5: in coordsys parent rotate $'Bip01 Head' (angleaxis 65 [1,0,0])
|
|
6: in coordsys parent rotate $'Bip01 Head' (angleaxis -30 [0,1,0])
|
|
7: in coordsys parent rotate $'Bip01 Head' (angleaxis 30 [0,1,0])
|
|
)
|
|
|
|
case headVectors.selection of
|
|
(
|
|
2: crytools.CreateBindPoseMorph $Look_Up_sculpt objItem 1 1 1 "Look_Up"
|
|
3: crytools.CreateBindPoseMorph $Look_Down_sculpt objItem 1 1 2 "Look_Down"
|
|
4: crytools.CreateBindPoseMorph $Look_Right_sculpt objItem 1 1 3 "Look_Right"
|
|
5: crytools.CreateBindPoseMorph $Look_Left_sculpt objItem 1 1 4 "Look_Left"
|
|
6: crytools.CreateBindPoseMorph $Tilt_Left_sculpt objItem 1 1 5 "Tilt_Left"
|
|
7: crytools.CreateBindPoseMorph $Tilt_Right_sculpt objItem 1 1 6 "Tilt_Right"
|
|
)
|
|
|
|
case headVectors.selection of
|
|
(
|
|
2: in coordsys parent rotate $'Bip01 Head' (angleaxis 40 [0,0,1])
|
|
3: in coordsys parent rotate $'Bip01 Head' (angleaxis -40 [0,0,1])
|
|
4: in coordsys parent rotate $'Bip01 Head' (angleaxis 65 [1,0,0])
|
|
5: in coordsys parent rotate $'Bip01 Head' (angleaxis -65 [1,0,0])
|
|
6: in coordsys parent rotate $'Bip01 Head' (angleaxis 30 [0,1,0])
|
|
7: in coordsys parent rotate $'Bip01 Head' (angleaxis -30 [0,1,0])
|
|
)
|
|
)
|
|
|
|
on extractTarget pressed do
|
|
(
|
|
undo "extract_target" on
|
|
(
|
|
select objItem
|
|
max modify mode
|
|
modPanel.setCurrentObject $.modifiers[#Skin]
|
|
|
|
case headVectors.selection of
|
|
(
|
|
2: in coordsys parent rotate $'Bip01 Head' (angleaxis -40 [0,0,1])
|
|
3: in coordsys parent rotate $'Bip01 Head' (angleaxis 40 [0,0,1])
|
|
4: in coordsys parent rotate $'Bip01 Head' (angleaxis -65 [1,0,0])
|
|
5: in coordsys parent rotate $'Bip01 Head' (angleaxis 65 [1,0,0])
|
|
6: in coordsys parent rotate $'Bip01 Head' (angleaxis -30 [0,1,0])
|
|
7: in coordsys parent rotate $'Bip01 Head' (angleaxis 30 [0,1,0])
|
|
)
|
|
|
|
case headVectors.selection of
|
|
(
|
|
2: crytools.CreateBindPoseMorph $Look_Up_sculpt objItem 0 0 0 "Look_Up"
|
|
3: crytools.CreateBindPoseMorph $Look_Down_sculpt objItem 0 0 0 "Look_Down"
|
|
4: crytools.CreateBindPoseMorph $Look_Right_sculpt objItem 0 0 0 "Look_Right"
|
|
5: crytools.CreateBindPoseMorph $Look_Left_sculpt objItem 0 0 0 "Look_Left"
|
|
6: crytools.CreateBindPoseMorph $Tilt_Left_sculpt objItem 0 0 0 "Tilt_Left"
|
|
7: crytools.CreateBindPoseMorph $Tilt_Right_sculpt objItem 0 0 0 "Tilt_Right"
|
|
)
|
|
case headVectors.selection of
|
|
(
|
|
2: in coordsys parent rotate $'Bip01 Head' (angleaxis 40 [0,0,1])
|
|
3: in coordsys parent rotate $'Bip01 Head' (angleaxis -40 [0,0,1])
|
|
4: in coordsys parent rotate $'Bip01 Head' (angleaxis 65 [1,0,0])
|
|
5: in coordsys parent rotate $'Bip01 Head' (angleaxis -65 [1,0,0])
|
|
6: in coordsys parent rotate $'Bip01 Head' (angleaxis 30 [0,1,0])
|
|
7: in coordsys parent rotate $'Bip01 Head' (angleaxis -30 [0,1,0])
|
|
)
|
|
)
|
|
)
|
|
|
|
on eyeVectors selected i do
|
|
(
|
|
case i of
|
|
(
|
|
2: sliderTime = 1f
|
|
3: sliderTime = 2f
|
|
4: sliderTime = 3f
|
|
5: sliderTime = 4f
|
|
6: sliderTime = 5f
|
|
7: sliderTime = 6f
|
|
8: sliderTime = 7f
|
|
9: sliderTime = 8f
|
|
10: sliderTime = 11f
|
|
11: sliderTime = 12f
|
|
12: sliderTime = 13f
|
|
13: sliderTime = 14f
|
|
14: sliderTime = 15f
|
|
15: sliderTime = 16f
|
|
16: sliderTime = 17f
|
|
17: sliderTime = 18f
|
|
18: sliderTime = 19f
|
|
)
|
|
)
|
|
|
|
on bakeEyeShapes pressed do
|
|
(
|
|
undo "bake out eye morphs" on
|
|
(
|
|
if $ == undefined then
|
|
(
|
|
messagebox "Please select a head with the proper bone rig."
|
|
return undefined
|
|
)
|
|
if createEyeLayer.checked == true then
|
|
(
|
|
layer_name = layerEye_txt.text
|
|
layer01 = LayerManager.newLayer()
|
|
layer01.setname layer_name
|
|
layer01.current = true
|
|
)
|
|
sliderTime = 1f
|
|
snapshot $ name:eyeVectors.items[2] --isSelected:true
|
|
sliderTime = 2f
|
|
snapshot $ name:eyeVectors.items[3]
|
|
sliderTime = 3f
|
|
snapshot $ name:eyeVectors.items[4]
|
|
sliderTime = 4f
|
|
snapshot $ name:eyeVectors.items[5]
|
|
sliderTime = 5f
|
|
snapshot $ name:eyeVectors.items[6]
|
|
sliderTime = 6f
|
|
snapshot $ name:eyeVectors.items[7]
|
|
sliderTime = 7f
|
|
snapshot $ name:eyeVectors.items[8]
|
|
sliderTime = 8f
|
|
snapshot $ name:eyeVectors.items[9]
|
|
sliderTime = 11f
|
|
snapshot $ name:eyeVectors.items[10]
|
|
sliderTime = 12f
|
|
snapshot $ name:eyeVectors.items[11]
|
|
sliderTime = 13f
|
|
snapshot $ name:eyeVectors.items[12]
|
|
sliderTime = 14f
|
|
snapshot $ name:eyeVectors.items[13]
|
|
sliderTime = 15f
|
|
snapshot $ name:eyeVectors.items[14]
|
|
sliderTime = 16f
|
|
snapshot $ name:eyeVectors.items[15]
|
|
sliderTime = 17f
|
|
snapshot $ name:eyeVectors.items[16]
|
|
sliderTime = 18f
|
|
snapshot $ name:eyeVectors.items[17]
|
|
sliderTime = 19f
|
|
slidertime = 0f
|
|
)
|
|
)
|
|
|
|
on extractEyeTarget pressed do
|
|
(
|
|
if $ == undefined then
|
|
(
|
|
messagebox "Please select a head with the proper bone rig."
|
|
return undefined
|
|
)
|
|
|
|
undo "create eye target" on
|
|
(
|
|
if createEyeLayer.checked == true then
|
|
(
|
|
layer_name = layerEye_txt.text
|
|
layer01 = LayerManager.newLayer()
|
|
layer01.setname layer_name
|
|
layer01.current = true
|
|
)
|
|
if eyeVectors.selection == 1 then
|
|
(
|
|
messagebox "Please select an eye vector."
|
|
return undefined
|
|
)
|
|
snapshot $ name:eyevectors.items[eyeVectors.selection]
|
|
)
|
|
)
|
|
|
|
on createEyeLayer changed state do
|
|
(
|
|
if createEyeLayer.checked == true then
|
|
(
|
|
layerEye_txt.enabled = true
|
|
layerEye_txt.text = "eyeMorphs"
|
|
)
|
|
else
|
|
(
|
|
layerEye_txt.enabled = false
|
|
)
|
|
)
|
|
)
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
--DiagnosticTools
|
|
-------------------------------------------------------------------------------
|
|
rollout GeneralTools "Diagnostic Tools"
|
|
(
|
|
button openManager "Open morphManager"
|
|
button morphList "Generate morphList"
|
|
checkbox addNum "Include channel numbers" align:#center
|
|
|
|
on openManager pressed do
|
|
(
|
|
if selection[1] == undefined do
|
|
(
|
|
messageBox "Please select a character head." title:"Error"
|
|
return undefined
|
|
)
|
|
|
|
if $.modifiers[#morpher] == undefined then
|
|
(
|
|
messagebox "No morph modifier on selected object." title:"Error"
|
|
return undefined
|
|
)
|
|
|
|
global mf_float, mf_morpher_mod
|
|
(
|
|
mf_morpher_mod = $.modifiers[#morpher]
|
|
used_channels = #()
|
|
txt ="rollout mf_main \"morphManager\" (\n"
|
|
for i = 1 to 65 do
|
|
(
|
|
if WM3_MC_HasData mf_morpher_mod i then
|
|
(
|
|
append used_channels i
|
|
txt +="progressbar mf_slider_"+ i as string
|
|
txt +=" value:"+ (WM3_MC_GetValue mf_morpher_mod i) as string
|
|
txt +=" width:150 height:18 across:4 align:#left\n"
|
|
txt +="edittext mf_label_"+i as string
|
|
txt +=" align:#right text:\""+i as string+": "
|
|
txt +=(WM3_MC_GetName mf_morpher_mod i) +"\"\n"
|
|
txt +="on mf_slider_"+i as string+" clicked val do (\n"
|
|
txt +="WM3_MC_SetValue mf_morpher_mod "
|
|
txt += i as string+" (val as float) \n"
|
|
txt +="SliderTime +=0)\n"
|
|
)
|
|
)--end i loop
|
|
txt +=")\n"
|
|
createDialog (execute txt) 680 800 bgcolor:black fgcolor:white
|
|
txt ="fn mf_update_slider = (\n"
|
|
|
|
for i in used_channels do
|
|
(
|
|
txt +="mf_main.mf_slider_"+i as string
|
|
txt +=".value = WM3_MC_GetValue mf_morpher_mod "+i as string+" \n"
|
|
)--end i loop
|
|
txt +=")\n"
|
|
global mf_update_slider = execute txt
|
|
registertimecallback mf_update_slider
|
|
deleteAllChangeHandlers id:#morpher_floater
|
|
when parameters mf_morpher_mod changes \
|
|
HandleAt:#RedrawViews \
|
|
id:#morpher_floater do mf_update_slider()
|
|
)
|
|
)
|
|
|
|
on morphList pressed do
|
|
(
|
|
try
|
|
(
|
|
if $.modifiers[#morpher] == undefined then
|
|
(
|
|
messagebox "No morph modifier on selected object." title:"Error"
|
|
return undefined
|
|
)
|
|
if $selection.count > 0 then
|
|
(
|
|
for i = 1 to 1000 do
|
|
(
|
|
mname = $.morpher[i].name
|
|
mnameStripped = (filterstring mname " ")
|
|
if addNum.checked == true then
|
|
(
|
|
print (mnameStripped[1] + " - " + mnameStripped[2])
|
|
)
|
|
else
|
|
(
|
|
print mnameStripped[2]
|
|
)
|
|
if mname == "- empty -" then
|
|
(
|
|
global numMorphs = (i - 1)
|
|
exit loop
|
|
)
|
|
)
|
|
)
|
|
else
|
|
messageBox "Select Node before." title:"Error"
|
|
)
|
|
catch()
|
|
)
|
|
)
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
--BakingTools
|
|
-------------------------------------------------------------------------------
|
|
rollout bakeTools "Baking Tools"
|
|
(
|
|
group "Bake Deformation to Morphs"
|
|
(
|
|
button loadBakeObj "Load Selected Object"
|
|
edittext bakeObj_txt "baseName:" fieldWidth:85 enabled:false
|
|
spinner bakeStart "Start " range:[-10000,10000,0] type:#integer scale:1 fieldWidth:40 offset:[-80,0] enabled:false
|
|
spinner bakeEnd "End " range:[-10000,10000,100] type:#integer scale:1 fieldWidth:40 offset:[0,-20] enabled:false
|
|
spinner bakeStep "Number of Morphs " range:[-10000,10000,0] type:#integer scale:1 fieldWidth:40 enabled:false
|
|
button bakeSequence "-EMPTY-" enabled:false
|
|
)
|
|
|
|
on loadBakeObj pressed do
|
|
(
|
|
if $ == undefined then
|
|
(
|
|
messagebox "please select a deforming object"
|
|
return undefined
|
|
)
|
|
global bakeObj = $
|
|
loadBakeObj.text = (bakeObj.name + " Loaded")
|
|
bakeObj_txt.text = (bakeObj.name + "_#")
|
|
bakeObj_txt.enabled = true
|
|
bakeStart.enabled = true
|
|
bakeEnd.enabled = true
|
|
bakeStart.value = animationrange.start
|
|
bakeEnd.value = animationrange.end
|
|
global bakeName = filterstring bakeObj_txt.text "#"
|
|
bakeSequence.text = "Bake " + (bakeObj.name + "_#")
|
|
bakeStep.enabled = true
|
|
bakeStep.value = 10
|
|
bakesequence.enabled = true
|
|
)
|
|
|
|
on bakeSequence pressed do
|
|
(
|
|
numFrames = (bakeEnd.value - bakeStart.value)
|
|
bakeInterval = (numframes / bakestep.value)
|
|
print bakeInterval
|
|
t1 = 0
|
|
nameIter = 1
|
|
while t1 < bakeEnd.value do
|
|
(
|
|
slidertime = t1
|
|
snapshot bakeObj name:(bakeName[1] + (nameIter as string))
|
|
nameIter += 1
|
|
t1 += bakeInterval
|
|
)
|
|
)
|
|
)
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
--Sync-Collapse by Location (Index2Loc)
|
|
-------------------------------------------------------------------------------
|
|
fn getVertByLoc node loc =
|
|
(
|
|
for i = 1 to (polyOp.getNumVerts node) do
|
|
(
|
|
if (polyOp.getVert node i) == loc then
|
|
(
|
|
return i
|
|
)
|
|
)
|
|
)
|
|
|
|
fn collapseVerts =
|
|
(
|
|
try
|
|
(
|
|
undo "collapse by loc" on
|
|
(
|
|
obj1 = (cryTools.retrieveVar "obj1")
|
|
selectedVerts = (getVertSelection obj1 as array)
|
|
|
|
if selectedVerts.count != 2 then
|
|
(
|
|
messagebox "Please select two verts to collapse."
|
|
return undefined
|
|
)
|
|
|
|
selectedVertsWorldLoc = #()
|
|
for i = 1 to selectedVerts.count do
|
|
(
|
|
append selectedVertsWorldLoc (polyOp.getVert obj1 selectedVerts[i])
|
|
)
|
|
|
|
polyOp.collapseVerts obj1 (selectedVerts as bitarray)
|
|
update obj1
|
|
|
|
if (cryTools.retrieveVar "hideCollapsedPass") == true then
|
|
(
|
|
hiddenVerts += getVertSelection obj1
|
|
polyOp.setHiddenVerts obj1 hiddenVerts
|
|
)
|
|
|
|
append collapsedCache #((finditem obj1_points selectedVertsWorldLoc[1]),(finditem obj1_points selectedVertsWorldLoc[2]))
|
|
print ((finditem obj1_points selectedVertsWorldLoc[1]) as string + " " + (finditem obj1_points selectedVertsWorldLoc[2]) as string + " collapsed")
|
|
|
|
if (cryTools.retrieveVar "syncVariationsPass") == true then
|
|
(
|
|
for obj in getVariations do
|
|
(
|
|
execme = ("objPointData = " + obj.name + "_points")
|
|
execute execme
|
|
main_point1 = (findItem obj1_points selectedVertsWorldLoc[1])
|
|
main_point2 = (findItem obj1_points selectedVertsWorldLoc[2])
|
|
pointsInVar = #(main_point1, main_point2) as bitarray
|
|
print pointsinvar
|
|
polyOp.collapseVerts obj pointsInVar
|
|
update obj
|
|
)
|
|
)
|
|
)
|
|
)
|
|
catch(format "*** % ***\n" (getCurrentException()))
|
|
)
|
|
cryTools.storeFn collapseVerts true
|
|
|
|
rollout LocCollapse "Sync-Collapse by Location"
|
|
(
|
|
group "Main Object"
|
|
(
|
|
checkbutton object1 "Select Main Object"
|
|
label numVertsUpperLbl "0000 Vertices"
|
|
)
|
|
group "Apply Collapse to Variations"
|
|
(
|
|
checkbutton object2 "Select Variations"
|
|
label variationNumLbl "Zero Variations Loaded"
|
|
)
|
|
group "Collapse Verts"
|
|
(
|
|
button collapseVerts "Collapse Verts"
|
|
checkbox hideCollapsed "Hide Collapsed"
|
|
button unhideAll "Unhide All" offset:[52,-22]
|
|
checkbox syncVariations "Collapse Variations as I Work" enabled:false
|
|
)
|
|
group "Load/Save Data"
|
|
(
|
|
button saveCollapse "Save Collapse Data"
|
|
label dataReadOut "No Data Loaded."
|
|
button loadCollapse "Load Collapse Data"offset:[-26,0]
|
|
button applyCollapse "Apply" enabled:false offset:[57,-26]
|
|
checkbox markCollapsed "Mark collapsed verts in red"
|
|
)
|
|
Group "Debug Tools"
|
|
(
|
|
edittext indexNum width:35 offset:[-5,0]
|
|
button getIndexNum "Select by Point Index" offset:[20,-23]
|
|
button markVariations "Mark collapsedCache Verts"
|
|
label numVertsLbl "000" offset:[-50,5]
|
|
button numVertsBtn "Number of Verts" offset:[20,-22]
|
|
)
|
|
|
|
on LocCollapse open do
|
|
(
|
|
object2.enabled = false
|
|
collapseVerts.enabled = false
|
|
)
|
|
|
|
--Object1 Button
|
|
----------------
|
|
on object1 changed state do
|
|
(
|
|
if object1.checked == true then
|
|
(
|
|
if $ == undefined then
|
|
(
|
|
messagebox "Select an object."
|
|
return undefined
|
|
)
|
|
|
|
obj1 = $
|
|
cryTools.storeVar $ "obj1" true
|
|
object1.text = obj1.name
|
|
numVertsUpperLbl.text = (obj1.mesh.verts.count as string + " vertices.")
|
|
|
|
for i = 1 to (polyOp.getNumVerts obj1) do
|
|
(
|
|
vertLoc = polyOp.getVert obj1 i
|
|
append obj1_points vertLoc
|
|
print (vertLoc as string + " cached")
|
|
)
|
|
print "All vertices cached"
|
|
object2.enabled = true
|
|
collapseVerts.enabled = true
|
|
syncVariations.enabled = true
|
|
)
|
|
else
|
|
(
|
|
object1.text = "Select Object 1"
|
|
obj1 = undefined
|
|
object2.enabled = false
|
|
collapseVerts.enabled = false
|
|
syncVariations.enabled = false
|
|
numVertsUpperLbl.text = "0000 Vertices"
|
|
)
|
|
)
|
|
|
|
--Object2 Button
|
|
----------------
|
|
on object2 changed state do
|
|
(
|
|
if object2.checked == true then
|
|
(
|
|
if $ == undefined then
|
|
(
|
|
messagebox "Select an object."
|
|
return undefined
|
|
)
|
|
|
|
for i = 1 to selection.count do
|
|
(
|
|
if selection[i] == obj1 then
|
|
(
|
|
messagebox "The original object should not be in the current selection.."
|
|
object2.checked = false
|
|
return undefined
|
|
)
|
|
--ADD: check for same vert count
|
|
|
|
tempPoints = #()
|
|
|
|
append getVariations selection[i]
|
|
|
|
for n = 1 to (polyOp.getNumVerts selection[i]) do
|
|
(
|
|
vertLoc = polyOp.getVert selection[i] n
|
|
append tempPoints vertLoc
|
|
)
|
|
|
|
execme = ("global " + selection[i].name + "_points = tempPoints")
|
|
execute execme
|
|
|
|
object2.text = "Variations Loaded"
|
|
variationNumLbl.text = (selection.count as string + " variations loaded.")
|
|
)
|
|
)
|
|
else
|
|
(
|
|
object2.text = "Select Variations"
|
|
getVariations = #()
|
|
)
|
|
)
|
|
|
|
--Collapse button
|
|
-----------------
|
|
on collapseVerts pressed do
|
|
(
|
|
undo "collapseVert" on
|
|
(
|
|
cryTools.storeVar hideCollapsed.checked "hideCollapsedPass" true
|
|
cryTools.storeVar syncVariations.checked "syncVariationsPass" true
|
|
(crytools.retrieveFn "collapseVerts()")()
|
|
--crytools.fnstore[(crytools.storedFn #collapseVerts)]()
|
|
)
|
|
)
|
|
|
|
on unhideAll pressed do
|
|
(
|
|
try ( polyOp.unHideAllVerts obj1 ) catch()
|
|
)
|
|
|
|
--Save Collapse Data
|
|
---------------------
|
|
on saveCollapse pressed do
|
|
(
|
|
fileSaveLoc = getSaveFileName types:"Index2Loc(*.i2l)|*.i2l" initialDir:"c:\\"
|
|
if fileSaveLoc == undefined do (return undefined)
|
|
outputFile = createFile fileSaveLoc
|
|
outputFile = openFile fileSaveLoc mode:"w"
|
|
|
|
format ("obj1 = " + obj1.name + "+" + ((filterstring numVertsUpperLbl.text " ")[1]) as string +"\n") to: outputFile
|
|
for i = 1 to obj1_points.count do
|
|
(
|
|
format (("obj1_" + obj1_points[i] as string) + "\n") to: outputFile
|
|
)
|
|
format "collapsed verts\n" to: outputFile
|
|
for i = 1 to collapsedCache.count do
|
|
(
|
|
format ((collapsedCache[i] as string) + "\n") to: outputFile
|
|
)
|
|
close outputFile
|
|
|
|
if doesfileexist fileSaveLoc == true then
|
|
(
|
|
dataReadOut.text = ("File saved successfully.")
|
|
)
|
|
else
|
|
(
|
|
dataReadOut.text = ("File was not saved?")
|
|
)
|
|
)
|
|
|
|
--Load Collapse Data
|
|
---------------------
|
|
on loadCollapse pressed do
|
|
(
|
|
fileInLoc = getOpenFileName getSaveFileName types:"Index2Loc(*.i2l)|*.i2l" initialDir:"c:\\"
|
|
if fileInLoc == undefined do (return undefined)
|
|
incData = (crytools.readIN fileInLoc echo:false)
|
|
object1.checked = true
|
|
object1.text = (filterstring (filterstring incData[1] " =")[2] "+")[1]
|
|
obj1PtCount = (filterstring incData[1] "+")[2]
|
|
numVertsUpperLbl.text = ((obj1PtCount as string) + " vertices.")
|
|
obj1_points = #()
|
|
cacheStart = 0
|
|
object2.enabled = true
|
|
|
|
fileInArr = (filterstring fileInLoc "\\")
|
|
dataReadOut.text = (fileInArr[fileInArr.count] + " loaded.")
|
|
|
|
for i = 2 to incData.count do
|
|
(
|
|
if incData[i] == "collapsed verts" then
|
|
(
|
|
cacheStart = i
|
|
exit
|
|
)
|
|
append obj1_points (filterstring incData[i] "_")[2]
|
|
)
|
|
|
|
for i = (cacheStart + 1) to (incData.count - 1) do
|
|
(
|
|
execute ("append collapsedCache " + incData[i])
|
|
)
|
|
|
|
--ADD: check point count against orig main
|
|
applyCollapse.enabled = true
|
|
)
|
|
|
|
|
|
--Apply Collapse Data
|
|
----------------------
|
|
on applyCollapse pressed do
|
|
(
|
|
if getVariations.count == 0 or getVariations == undefined then
|
|
(
|
|
messagebox "Please select a variation."
|
|
return undefined
|
|
)
|
|
|
|
for obj in getVariations do
|
|
(
|
|
if obj.mesh.verts.count != obj1_points.count then
|
|
(
|
|
messagebox ("Variation " + obj.name + " has " + obj.mesh.verts.count as string + " vertices,\n" + "But original model " + object1.text + " had " + obj1_points.count as string)
|
|
return undefined
|
|
)
|
|
)
|
|
|
|
undo "apply_collapse" on
|
|
(
|
|
for obj in getVariations do
|
|
(
|
|
for i = 1 to collapsedcache.count do
|
|
(
|
|
pointGet1 = (getVertByLoc obj (execute (obj.name + "_points"))[collapsedcache[i][1]])
|
|
pointGet2 = (getVertByLoc obj (execute (obj.name + "_points"))[collapsedcache[i][2]])
|
|
selectedVerts = #(pointGet1,pointGet2)
|
|
--print selectedVerts
|
|
locOfNew = ((polyOp.getVert obj pointGet1) + (polyOp.getVert obj pointGet2))/2
|
|
polyOp.collapseVerts obj (selectedVerts as bitarray)
|
|
update obj
|
|
if markCollapsed.checked == true then
|
|
(
|
|
if (layermanager.getLayerFromName "_collapseMarkers") == undefined then
|
|
(
|
|
layer01 = LayerManager.newLayer()
|
|
layer01.setname "_collapseMarkers"
|
|
layer01.current = true
|
|
)
|
|
else
|
|
(
|
|
layer01 = (layermanager.getLayerFromName "_collapseMarkers")
|
|
layer01.current = true
|
|
)
|
|
box name:("collapsed_" + collapsedcache[i][1] as string) length:.1 width:.1 height:.1 position:(locOfNew + [0,0,-.05]) wirecolor:(color 255 0 0)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
--debug group tools
|
|
-------------------
|
|
on getIndexNum pressed do
|
|
(
|
|
try
|
|
(
|
|
if selection.count != 1 then
|
|
(
|
|
messagebox "please select an object"
|
|
return undefined
|
|
)
|
|
polyOp.setVertSelection $ (#(indexNum.text as float) as bitarray)
|
|
)
|
|
catch(print "must be in sub object level (edit poly)")
|
|
)
|
|
|
|
on markVariations pressed do
|
|
(
|
|
if getVariations.count == 0 or getVariations == undefined then
|
|
(
|
|
messagebox "Please select a variation."
|
|
return undefined
|
|
)
|
|
|
|
for obj in getVariations do
|
|
(
|
|
if obj.mesh.verts.count != obj1_points.count then
|
|
(
|
|
messagebox ("Variation " + obj.name + " has " + obj.mesh.verts.count as string + " vertices,\n" + "But original model " + object1.text + " had " + obj1_points.count as string)
|
|
return undefined
|
|
)
|
|
)
|
|
|
|
undo "mark verts" on
|
|
(
|
|
if (layermanager.getLayerFromName "_collapseMarkers") == undefined then
|
|
(
|
|
layer01 = LayerManager.newLayer()
|
|
layer01.setname "_collapseMarkers"
|
|
layer01.current = true
|
|
)
|
|
else
|
|
(
|
|
layer01 = (layermanager.getLayerFromName "_collapseMarkers")
|
|
layer01.current = true
|
|
)
|
|
for obj in getVariations do
|
|
(
|
|
pointGet = ""
|
|
for i = 1 to collapsedcache.count do
|
|
(
|
|
pointGet = (getVertByLoc obj (execute (obj.name + "_points"))[collapsedcache[i][1]])
|
|
dummy name:("marker_" + collapsedcache[i][1] as string) position:(execute (obj.name + "_points"))[pointGet] scale:[.01,.01,.01]
|
|
pointGet = (getVertByLoc obj (execute (obj.name + "_points"))[collapsedcache[i][2]])
|
|
dummy name:("marker_" + collapsedcache[i][2] as string) position:(execute (obj.name + "_points"))[pointGet] scale:[.01,.01,.01]
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
on numVertsBtn pressed do
|
|
(
|
|
if selection.count != 1 then
|
|
(
|
|
messagebox "You have more than one mesh selected"
|
|
return undefined
|
|
)
|
|
numVertsLbl.text = $.mesh.verts.count as string
|
|
)
|
|
|
|
)
|
|
|
|
-------------------------------------------------------------------------------
|
|
--Mirror Deformation (Morphs)
|
|
-------------------------------------------------------------------------------
|
|
rollout mirrorMorphs "Mirror Deformation (Morphs)"
|
|
(
|
|
|
|
local sourceObj = ""
|
|
local vTotalPairs = #()
|
|
|
|
group "Load/Save Data"
|
|
(
|
|
button sourceObjBTN "Select Source Object"
|
|
label sourceName "No Source Object"
|
|
label centDone "" offset:[-65,0]
|
|
button saveData "Save" offset:[-25,-22]
|
|
button loadData "Load" offset:[25,-26]
|
|
)
|
|
group "Mirror"
|
|
(
|
|
button rL "RIGHT ------> LEFT" enabled:false
|
|
button lR "RIGHT <------ LEFT" enabled:false
|
|
checkbox newBox "New Obj" checked:true enabled:false
|
|
checkbox morpherBox "Morpher" offset:[80,-20] enabled:false
|
|
checkBox epolyBox "Edit Poly" enabled:false
|
|
checkBox sameBox "Same Obj" offset:[80,-20] enabled:false
|
|
)
|
|
|
|
on mirrorMorphs open do
|
|
(
|
|
|
|
)
|
|
|
|
on sourceObjBTN pressed do
|
|
(
|
|
if $ == undefined then
|
|
(
|
|
messagebox "Nothing selected!"
|
|
return undefined
|
|
)
|
|
sourceName.text = $.name
|
|
sourceObj = $
|
|
)
|
|
|
|
on saveData pressed do
|
|
(
|
|
saveName = getSaveFileName types:"Data(*.dat)|*.dat|"
|
|
if saveName == undefined then
|
|
(
|
|
return undefined
|
|
)
|
|
outputFile = createFile saveName
|
|
totalVerts = #()
|
|
|
|
numVerts = sourceObj.numVerts
|
|
|
|
for i = 1 to numVerts do
|
|
(
|
|
append totalVerts i
|
|
)
|
|
|
|
selectedVerts = sourceObj.selectedVerts.count
|
|
format "%\n" selectedVerts to:outputFile
|
|
|
|
vertSel = #()
|
|
unSelVerts = #()
|
|
|
|
for i=1 to selectedVerts do
|
|
(
|
|
append vertSel (sourceObj.selectedVerts[i].index)
|
|
)
|
|
|
|
for i=1 to totalVerts.count do
|
|
(
|
|
if (findItem vertSel i) == 0 then
|
|
(
|
|
append unSelVerts i
|
|
)
|
|
)
|
|
|
|
for i = 1 to selectedVerts do
|
|
(
|
|
mVertPos = sourceObj.verts[vertSel[i]].pos
|
|
mVertPos.x = abs(mVertPos.x)
|
|
|
|
dist = crytools.vertDistance mVertPos sourceObj.verts[unSelVerts[1]].pos
|
|
mVertIndex = unSelVerts[1]
|
|
|
|
for m = 2 to unSelVerts.count do
|
|
(
|
|
test = cryTools.vertDistance mVertPos sourceObj.verts[unSelVerts[m]].pos
|
|
|
|
if test < dist then
|
|
(
|
|
dist = test
|
|
mVertIndex = unSelVerts[m]
|
|
)
|
|
)
|
|
|
|
vPair = #()
|
|
append vPair vertSel[i]
|
|
append vPair mVertIndex
|
|
|
|
format "%\n" vPair to:outputFile
|
|
vIndex = findItem unSelVerts mVertIndex
|
|
deleteItem unSelVerts vIndex
|
|
centDone.text = ("%" + (((((i as float) / (selectedVerts as float) ) * 100) as integer) as string))
|
|
)
|
|
subobjectLevel = 0
|
|
close outputFile
|
|
centDone.text = ""
|
|
rL.enabled = true
|
|
lR.enabled = true
|
|
newBox.enabled = true
|
|
--morpherBox.enabled = true
|
|
--epolyBox.enabled = true
|
|
sameBox.enabled = true
|
|
)
|
|
|
|
on loadData pressed do
|
|
(
|
|
vPairs = #()
|
|
vTotalPairs = #()
|
|
loadFile = getOpenFileName types:"Data(*.dat)|*.dat|"
|
|
if loadFile == undefined then
|
|
(
|
|
return undefined
|
|
)
|
|
outputfile = openFile loadFile
|
|
--vPairs = (filterString (readline outputFile) " ")[1] as integer
|
|
vPairs = (readline outputFile) as integer
|
|
vPair
|
|
|
|
for i=1 to vPairs do
|
|
(
|
|
vPair = execute((readline outputFile))
|
|
append vTotalPairs vPair
|
|
)
|
|
close outputfile
|
|
rL.enabled = true
|
|
lR.enabled = true
|
|
newBox.enabled = true
|
|
--morpherBox.enabled = true
|
|
--epolyBox.enabled = true
|
|
sameBox.enabled = true
|
|
)
|
|
|
|
on rL pressed do
|
|
(
|
|
undo "mirror R --> L" on
|
|
(
|
|
for obj in selection do
|
|
(
|
|
local obj2 = ""
|
|
if newBox.checked or morpherBox.checked == true then
|
|
(
|
|
snapshot sourceObj name:(obj.name + "_mirrored")
|
|
obj2 = (execute("$" + obj.name + "_mirrored"))
|
|
obj2.transform = sourceObj.transform
|
|
)
|
|
baseVertPos
|
|
oldPos = obj.transform
|
|
obj.transform = sourceObj.transform
|
|
|
|
if ((classof obj as string) == "Editable_Poly" or (classof obj as string) == "Editable_mesh") then
|
|
(
|
|
for i = 1 to vTotalPairs.count do
|
|
(
|
|
if newBox.checked == true then
|
|
(
|
|
baseVertPos = obj.verts[vTotalPairs[i][2]].pos
|
|
baseVertPos.x = -1 * baseVertPos.x
|
|
if (classof obj2 as string) == "Editable_Poly" then
|
|
(
|
|
polyOp.setVert obj2 vTotalPairs[i][1] baseVertPos
|
|
)
|
|
else
|
|
(
|
|
meshOp.setVert obj2 vTotalPairs[i][1] baseVertPos
|
|
)
|
|
)
|
|
if sameBox.checked == true then
|
|
(
|
|
baseVertPos = obj.verts[vTotalPairs[i][2]].pos
|
|
baseVertPos.x = -1 * baseVertPos.x
|
|
if (classof obj as string) == "Editable_Poly" then
|
|
(
|
|
polyOp.setVert obj vTotalPairs[i][1] baseVertPos
|
|
)
|
|
else
|
|
(
|
|
meshOp.setVert obj vTotalPairs[i][1] baseVertPos
|
|
)
|
|
)
|
|
)
|
|
if samebox.checked == false then
|
|
(
|
|
obj2.transform = oldPos
|
|
)
|
|
if morpherBox.checked == true then
|
|
(
|
|
addModifier obj (morpher())
|
|
wm3_mc_buildfromnode obj.morpher 1 obj2
|
|
delete obj2
|
|
)
|
|
)
|
|
else
|
|
(
|
|
messagebox "Object needs to be edit poly or edit mesh!"
|
|
)
|
|
obj.transform = oldPos
|
|
)
|
|
)
|
|
)
|
|
|
|
on lR pressed do
|
|
(
|
|
undo "mirror R --> L" on
|
|
(
|
|
for obj in selection do
|
|
(
|
|
obj2 = ""
|
|
if newBox.checked or morpherBox.checked == true then
|
|
(
|
|
snapshot sourceObj name:(obj.name + "_mirrored")
|
|
obj2 = (execute("$" + obj.name + "_mirrored"))
|
|
obj2.transform = sourceObj.transform
|
|
)
|
|
|
|
local baseVertPos
|
|
oldPos = obj.transform
|
|
obj.transform = sourceObj.transform
|
|
|
|
if ((classof obj as string) == "Editable_Poly" or (classof obj as string) == "Editable_mesh") then
|
|
(
|
|
for i = 1 to vTotalPairs.count do
|
|
(
|
|
if newBox.checked == true then
|
|
(
|
|
baseVertPos = obj.verts[vTotalPairs[i][1]].pos
|
|
baseVertPos.x = -1 * baseVertPos.x
|
|
if (classof obj2 as string) == "Editable_Poly" then
|
|
(
|
|
polyOp.setVert obj2 vTotalPairs[i][2] baseVertPos
|
|
)
|
|
else
|
|
(
|
|
meshOp.setVert obj2 vTotalPairs[i][2] baseVertPos
|
|
)
|
|
)
|
|
if sameBox.checked == true then
|
|
(
|
|
baseVertPos = obj.verts[vTotalPairs[i][1]].pos
|
|
baseVertPos.x = -1 * baseVertPos.x
|
|
if (classof obj as string) == "Editable_Poly" then
|
|
(
|
|
polyOp.setVert obj vTotalPairs[i][2] baseVertPos
|
|
)
|
|
else
|
|
(
|
|
meshOp.setVert obj vTotalPairs[i][2] baseVertPos
|
|
)
|
|
)
|
|
)
|
|
if newbox.checked == true then
|
|
(
|
|
obj2.transform = oldPos
|
|
)
|
|
if morpherBox.checked == true then
|
|
(
|
|
addModifier obj (morpher())
|
|
wm3_mc_buildfromnode obj.morpher 1 obj2
|
|
delete obj2
|
|
)
|
|
)
|
|
else
|
|
(
|
|
messagebox "Object needs to be edit poly or edit mesh!"
|
|
)
|
|
obj.transform = oldPos
|
|
)
|
|
)
|
|
)
|
|
|
|
on newBox changed state do
|
|
(
|
|
if newBox.checked == true then
|
|
(
|
|
sameBox.checked = false
|
|
morpherBox.checked = false
|
|
epolybox.checked = false
|
|
)
|
|
)
|
|
on sameBox changed state do
|
|
(
|
|
if sameBox.checked == true then
|
|
(
|
|
newBox.checked = false
|
|
morpherBox.checked = false
|
|
epolybox.checked = false
|
|
)
|
|
)
|
|
on morpherBox changed state do
|
|
(
|
|
if morpherBox.checked == true then
|
|
(
|
|
newBox.checked = false
|
|
sameBox.checked = false
|
|
epolybox.checked = false
|
|
)
|
|
)
|
|
on epolyBox changed state do
|
|
(
|
|
if epolyBox.checked == true then
|
|
(
|
|
newBox.checked = false
|
|
morpherBox.checked = false
|
|
samebox.checked = false
|
|
)
|
|
)
|
|
)
|
|
|
|
addRollout FacialTools CryMorphTools
|
|
addRollout LocCollapse CryMorphTools rolledup:true
|
|
addRollout DrivenMorphs CryMorphTools rolledup:true
|
|
addRollout BakeTools CryMorphTools rolledup:true
|
|
addRollout GeneralTools CryMorphTools rolledup:true
|
|
addRollout mirrorMorphs CryMorphTools rolledup:true
|
|
) |