-- Load tool's main utility-functions: filein (::RsConfigGetWildwestDir() + "script/3dsmax/characters/rigging/skindatatransfer_Funcs.ms") unregisterRedrawViewsCallback RStransferSkinDataDrawCallback fn RStransferSkinDataDrawCallback = (gRsSkinDataTransfer.viewportDraw()) struct RStransferSkinDataDrawDataStruct (obj, elemStartVerts = #(), chooseVert) try (destroyDialog RsSkinDataTransferRoll) catch () -- Version-phrase generated via: (filein (RsConfigGetWildWestDir() + "script/3dsmax/_config_files/wildwest_header.ms"); print (RsRandomPhrase count:100)) rollout RsSkinDataTransferRoll "Transfer Skin Data [v1.01:Thirsty Frog]" width:300 ( dotNetControl rsBannerPanel "Panel" pos:[0,0] height:32 width:RsSkinDataTransferRoll.width local banner = makeRsBanner dn_Panel:rsBannerPanel wiki:"SkinDataXFer_Prep" filename:(getThisScriptFilename()) local skinVertDataStore local sourceObj, targetObj local objsWere = #() local objVertSelData = #(RStransferSkinDataDrawDataStruct(), RStransferSkinDataDrawDataStruct()) -- Used to communicate with vert-picker tool local pickObjNum local pickElemNum fn sourceFilter obj = (obj != targetObj) and (isKindOf obj.baseObject Editable_Poly) --(obj.modifiers[#skin] != undefined) fn targetFilter obj = (obj != sourceObj) and (isKindOf obj.baseObject Editable_Poly) label getSourceLbl "Transfer from:" across:2 label getTargetLbl "Transfer to:" pickbutton getSourceObjBtn "[pick object]" filter:sourceFilter autoDisplay:true width:130 across:2 pickbutton getTargetObjBtn "[pick object]" filter:targetFilter autoDisplay:true width:130 local objBtns = #(getSourceObjBtn, getTargetObjBtn) local vertPickBtnWidth = 100 local defaultVertPickText = "[pick vertex]" button vertPickBtnA01 "" across:3 width:vertPickBtnWidth offset:[9,-3] enabled:false -- label vertPickLbl1 "Element 01" across:3 label vertPickLbl1 "Head" across:3 button vertPickBtnB01 "" across:3 width:vertPickBtnWidth offset:[-6,-3] enabled:false button vertPickBtnA02 "" across:3 width:vertPickBtnWidth offset:[9,-3] enabled:false label vertPickLbl2 "Upper Teeth" across:3 offset:[2,0] button vertPickBtnB02 "" across:3 width:vertPickBtnWidth offset:[-6,-3] enabled:false button vertPickBtnA03 "" across:3 width:vertPickBtnWidth offset:[9,-3] enabled:false label vertPickLbl3 "Lower Teeth" across:3 offset:[2,0] button vertPickBtnB03 "" across:3 width:vertPickBtnWidth offset:[-6,-3] enabled:false button vertPickBtnA04 "" across:3 width:vertPickBtnWidth offset:[9,-3] enabled:false label vertPickLbl4 "Tongue" across:3 offset:[2,0] button vertPickBtnB04 "" across:3 width:vertPickBtnWidth offset:[-6,-3] enabled:false button vertPickBtnA05 "" across:3 width:vertPickBtnWidth offset:[9,-3] enabled:false label vertPickLbl5 "Right Eyeball" across:3 offset:[2,0] button vertPickBtnB05 "" across:3 width:vertPickBtnWidth offset:[-6,-3] enabled:false button vertPickBtnA06 "" across:3 width:vertPickBtnWidth offset:[9,-3] enabled:false label vertPickLbl6 "Left Eyeball" across:3 offset:[2,0] button vertPickBtnB06 "" across:3 width:vertPickBtnWidth offset:[-6,-3] enabled:false button vertPickBtnA07 "" across:3 width:vertPickBtnWidth offset:[9,-3] enabled:false label vertPickLbl7 "Right Hand" across:3 offset:[2,0] button vertPickBtnB07 "" across:3 width:vertPickBtnWidth offset:[-6,-3] enabled:false button vertPickBtnA08 "" across:3 width:vertPickBtnWidth offset:[9,-3] enabled:false label vertPickLbl8 "Left Hand" across:3 offset:[2,0] button vertPickBtnB08 "" across:3 width:vertPickBtnWidth offset:[-6,-3] enabled:false button vertPickBtnA09 "" across:3 width:vertPickBtnWidth offset:[9,-3] enabled:false label vertPickLbl9 "Element 09" across:3 offset:[2,0] button vertPickBtnB09 "" across:3 width:vertPickBtnWidth offset:[-6,-3] enabled:false button vertPickBtnA10 "" across:3 width:vertPickBtnWidth offset:[9,-3] enabled:false label vertPickLbl10 "Element 10" across:3 offset:[2,0] button vertPickBtnB10 "" across:3 width:vertPickBtnWidth offset:[-6,-3] enabled:false -- Lists generated on open, from rollout's controls: local vertPickBtnsA = #() local vertPickBtnsB = #() local elemNames = #() local vertPickBtns = #(vertPickBtnsA, vertPickBtnsB) checkBox hideElementsChk "Hide picked elements" align:#center checked:false button copyBtn "Copy from sel." across:3 offset:[2,6] enabled:false button transferBtn "Transfer Data" offset:[4,6] button pasteBtn "Paste to sel." enabled:false offset:[5,6] button debugMoveBtn "[debug vert-pos copy]" height:18 tooltip:"Moves verts on Target to positions of matching verts on Source, used to spot matching-errors\n\n(is undoable)" fn pickedObj obj objNum = ( if obj != undefined do ( print ("Triggered pickedObj with "+obj.name)) -- Stop hiding faces on previous object: local objWas = objsWere[objNum] if hideElementsChk.checked and (isValidNode objWas) do ( print objWas objWas.unhideAll #Face ) objsWere = #(sourceObj, targetObj) if (obj == undefined) then ( objBtns[objNum].object = undefined objVertSelData[objNum] = RStransferSkinDataDrawDataStruct() vertPickBtns[objNum].enabled = false vertPickBtns[objNum].text = defaultVertPickText ) else ( objVertSelData[objNum] = RStransferSkinDataDrawDataStruct obj:obj vertPickBtns[objNum].enabled = true vertPickBtns[objNum].text = defaultVertPickText -- If object has a single vert selected, make that the first element's start-vert: local baseObj = if (isProperty obj #baseObject) then obj.baseObject else obj local vertSel = (polyop.getVertsByFlag baseObj 1) as array if (vertSel.count == 1) do ( local vertSel = vertSel[1] objVertSelData[objNum].elemStartVerts[1] = vertSel vertPickBtns[objNum][1].text = vertSel as string ) if hideElementsChk.checked do ( gRsSkinDataTransfer.hideTheseElements obj objVertSelData[objNum].elemStartVerts ) ) ) fn hideElementFaces hideThem = ( local objNum = 0 for obj in #(sourceObj, targetObj) do ( objNum += 1 if hideThem then ( gRsSkinDataTransfer.hideTheseElements obj objVertSelData[objNum].elemStartVerts ) else ( if isValidNode obj do ( obj.unhideAll #Face ) ) ) ) on hideElementsChk changed hideThem do ( --print ("hideElementsChk: "+(hideElementsChk.checked as string)) hideElementFaces hideThem ) on getSourceObjBtn picked obj do ( sourceObj = obj pickedObj obj 1 ) on getTargetObjBtn picked obj do ( targetObj = obj pickedObj obj 2 ) on getSourceObjBtn rightclick do ( sourceObj = undefined pickedObj undefined 1 ) on getTargetObjBtn rightclick do ( targetObj = undefined pickedObj undefined 2 ) tool RStransferSkinMouseTool ( local objNum = RsSkinDataTransferRoll.pickObjNum local drawData = RsSkinDataTransferRoll.objVertSelData[objNum] local obj = drawData.obj local objBase on start do ( objBase = if isProperty obj #baseObject then obj.baseObject else obj polyOp.collapseDeadStructs objBase ) fn getObjVert = ( if (isValidNode obj) then ( local drawVertNum local vertDist = 10 local mouseDist, vertPos local vertNums = (polyop.getVertsByFlag objBase 0 mask:8) - (polyop.getHiddenVerts objBase) for n = vertNums do ( vertPos = polyop.getvert obj n node:obj mouseDist = distance viewPoint (gw.wtranspoint vertPos) if mouseDist < vertDist do ( drawVertNum = n vertDist = mouseDist ) ) drawData.chooseVert = drawVertNum completeRedraw() ) else #stop ) on freeMove do (getObjVert()) on mouseMove clickNum do (getObjVert()) on mousePoint clickNum do ( if (clickNum > 1) and (drawData.chooseVert != undefined) do ( #stop ) ) on mouseAbort clickNum do ( drawData.chooseVert = undefined completeRedraw() ) ) fn getVertBtn ctrl = ( -- Work out which object/element this control works for, and set variables for picker-tool to find: pickObjNum = undefined for listNum = #{1..2} while (pickObjNum == undefined) do ( pickElemNum = findItem vertPickBtns[listNum] ctrl if (pickElemNum != 0) do ( pickObjNum = listNum ) ) ) fn clearVertBtn ctrl = ( print ("Clearing vert for "+(ctrl as string)) getVertBtn ctrl objVertSelData[pickObjNum].elemStartVerts[pickElemNum] = undefined objVertSelData[pickObjNum].chooseVert = undefined ctrl.text = defaultVertPickText if hideElementsChk.checked do ( gRsSkinDataTransfer.hideTheseElements objBtns[pickObjNum] objVertSelData[pickObjNum].elemStartVerts ) completeRedraw() ) fn pickObjVert ctrl = ( getVertBtn ctrl startTool RStransferSkinMouseTool local objData = objVertSelData[pickObjNum] local selVert = objData.chooseVert if (selVert == undefined) then ( print "chooseVert undefined!" ) else ( local selElemVerts = gRsSkinDataTransfer.getConnectedVerts objData.obj selVert local elemStartVerts = objData.elemStartVerts for n = 1 to elemStartVerts.count where (n != selVert) and (elemStartVerts[n] != undefined) do ( -- Clear any other start-verts that are in the same mesh-element as the new vert: if selElemVerts[elemStartVerts[n]] do ( elemStartVerts[n] = undefined vertPickBtns[pickObjNum][n].text = defaultVertPickText ) ) elemStartVerts[pickElemNum] = selVert ctrl.text = selVert as string completeRedraw() ) hideElementsChkState = hideElementsChk.checked --print ("hideElementsChkState : "+(hideElementsChkState as string)) RsSkinDataTransferRoll.hideElementsChk.state = false hideThem = RsSkinDataTransferRoll.hideElementsChk.state hideElementFaces hideThem RsSkinDataTransferRoll.hideElementsChk.state = hideElementsChkState hideThem = RsSkinDataTransferRoll.hideElementsChk.state hideElementFaces hideThem if hideElementsChk.checked do ( gRsSkinDataTransfer.hideTheseElements objBtns[pickObjNum].object objVertSelData[pickObjNum].elemStartVerts ) ) on vertPickBtnA01 pressed do (pickObjVert vertPickBtnA01) on vertPickBtnA02 pressed do (pickObjVert vertPickBtnA02) on vertPickBtnA03 pressed do (pickObjVert vertPickBtnA03) on vertPickBtnA04 pressed do (pickObjVert vertPickBtnA04) on vertPickBtnA05 pressed do (pickObjVert vertPickBtnA05) on vertPickBtnA06 pressed do (pickObjVert vertPickBtnA06) on vertPickBtnA07 pressed do (pickObjVert vertPickBtnA07) on vertPickBtnA08 pressed do (pickObjVert vertPickBtnA08) on vertPickBtnA09 pressed do (pickObjVert vertPickBtnA09) on vertPickBtnA10 pressed do (pickObjVert vertPickBtnA10) on vertPickBtnB01 pressed do (pickObjVert vertPickBtnB01) on vertPickBtnB02 pressed do (pickObjVert vertPickBtnB02) on vertPickBtnB03 pressed do (pickObjVert vertPickBtnB03) on vertPickBtnB04 pressed do (pickObjVert vertPickBtnB04) on vertPickBtnB05 pressed do (pickObjVert vertPickBtnB05) on vertPickBtnB06 pressed do (pickObjVert vertPickBtnB06) on vertPickBtnB07 pressed do (pickObjVert vertPickBtnB07) on vertPickBtnB08 pressed do (pickObjVert vertPickBtnB08) on vertPickBtnB09 pressed do (pickObjVert vertPickBtnB09) on vertPickBtnB10 pressed do (pickObjVert vertPickBtnB10) on vertPickBtnA01 rightclick do (clearVertBtn vertPickBtnA01) on vertPickBtnA02 rightclick do (clearVertBtn vertPickBtnA02) on vertPickBtnA03 rightclick do (clearVertBtn vertPickBtnA03) on vertPickBtnA04 rightclick do (clearVertBtn vertPickBtnA04) on vertPickBtnA05 rightclick do (clearVertBtn vertPickBtnA05) on vertPickBtnA06 rightclick do (clearVertBtn vertPickBtnA06) on vertPickBtnA07 rightclick do (clearVertBtn vertPickBtnA07) on vertPickBtnA08 rightclick do (clearVertBtn vertPickBtnA08) on vertPickBtnA09 rightclick do (clearVertBtn vertPickBtnA09) on vertPickBtnA10 rightclick do (clearVertBtn vertPickBtnA10) on vertPickBtnB01 rightclick do (clearVertBtn vertPickBtnB01) on vertPickBtnB02 rightclick do (clearVertBtn vertPickBtnB02) on vertPickBtnB03 rightclick do (clearVertBtn vertPickBtnB03) on vertPickBtnB04 rightclick do (clearVertBtn vertPickBtnB04) on vertPickBtnB05 rightclick do (clearVertBtn vertPickBtnB05) on vertPickBtnB06 rightclick do (clearVertBtn vertPickBtnB06) on vertPickBtnB07 rightclick do (clearVertBtn vertPickBtnB07) on vertPickBtnB08 rightclick do (clearVertBtn vertPickBtnB08) on vertPickBtnB09 rightclick do (clearVertBtn vertPickBtnB09) on vertPickBtnB10 rightclick do (clearVertBtn vertPickBtnB10) on copyBtn pressed do ( local sourceObj = undefined if (selection.count == 1) do (sourceObj = selection[1]) if (sourceFilter sourceObj) and (sourceObj.modifiers[#skin] != undefined) then ( undo off ( local startTime = TimeStamp() skinVertDataStore = gRsSkinDataTransfer.getVertTransferData sourceObj format "\nCopy took % seconds\n\n" ((timeStamp() - startTime) / 1000.0) ) pasteBtn.enabled = true ) else ( messageBox "Invalid copy-node!" ) ) fn pasteVerts targetObj = ( local sourceStartVerts = objVertSelData[1].elemStartVerts local targetStartVerts = objVertSelData[2].elemStartVerts local useStartVerts = for n = 1 to sourceStartVerts.count where (sourceStartVerts[n] != undefined) and (targetStartVerts[n] != undefined) collect n local failVerts = #{} for n in useStartVerts do ( if not (gRsSkinDataTransfer.pasteVertTransferData targetObj skinVertDataStore sourceStartVerts[n] targetStartVerts[n]) do ( failVerts[n] = True ) ) if (failVerts.numberSet == 0) then return True else ( local msg = stringStream "" format "Pattern-match% not found on %, failed to transfer data for these elements:\n\n" (if (failVerts.numberSet == 1) then "" else "es") targetObj.name to:msg for n = failVerts do ( format "% (% -> %)\n" elemNames[n] sourceStartVerts[n] targetStartVerts[n] to:msg ) messageBox (msg as string) title:"Pattern-match failure" return False ) ) on pasteBtn pressed do ( local targetObj = undefined if (selection.count == 1) do (targetObj = selection[1]) if (skinVertDataStore != undefined) and (targetFilter targetObj) then ( undo off ( local startTime = TimeStamp() pasteVerts targetObj format "\nPaste took % seconds\n\n" ((timeStamp() - startTime) / 1000.0) ) ) else ( messageBox "Invalid paste-node!" ) ) on transferBtn pressed do ( if (sourceObj != targetObj) and (isValidNode sourceObj) and (isValidNode targetObj) do ( undo "transfer skin data" on ( local StartTime = TimeStamp() skinVertDataStore = gRsSkinDataTransfer.getVertTransferData sourceObj if (skinVertDataStore != undefined) do ( pasteVerts targetObj skinXFerComplete = true if (::RsPreserveHandSkin == true) do ( print ("Attempting hand shit") inputHandSkinData targetObj ) format "\nTransfer took % seconds\n\n" ((TimeStamp() - StartTime) / 1000.0) --now if we're called from the prep tool we need to delete the template data if mjrTarget != undefined do --for if calling via the prep tool ( local tempNode = getNodeByName "templateMesh" if (tempNode != undefined) do ( local tempNodeParent = getNodeByName "templateHead" delete tempNode if (tempNodeParent != undefined) do ( delete tempNodeParent ) ) ) ) ) ) ) on debugMoveBtn pressed do ( if (sourceObj != targetObj) and (isValidNode sourceObj) and (isValidNode targetObj) do ( undo "transfer vertex positions" on ( local StartTime = TimeStamp() local objA = objVertSelData[1].obj local objB = objVertSelData[2].obj local sourceStartVerts = objVertSelData[1].elemStartVerts local targetStartVerts = objVertSelData[2].elemStartVerts local useStartVerts = for n = 1 to sourceStartVerts.count where (sourceStartVerts[n] != undefined) and (targetStartVerts[n] != undefined) collect n for startVertNum in useStartVerts do ( polyOp.collapseDeadStructs objA polyOp.collapseDeadStructs objB local objAstartVert = sourceStartVerts[startVertNum] local objBstartVert = targetStartVerts[startVertNum] local patternHash = gRsSkinDataTransfer.getUniquePatternHashLevel objA objAstartVert local startEdgeNum = gRsSkinDataTransfer.findPatternTreeMatch objB objBstartVert patternHash if (startEdgeNum == undefined) do ( messageBox ("Topology-match not found!") title:"Edges around selected verts are too different" return false ) local matchVerts = gRsSkinDataTransfer.matchObjVerts objA objB objAstartVert objBstartVert targetStartEdge:startEdgeNum debugVertMove:true local vertNumsA = matchVerts[1] local vertNumsB = matchVerts[2] format "Matched: %\n" vertNumsA.count for n = 1 to matchVerts[1].count do ( -- polyop.setVert objB vertNumsB[n] (polyop.getVert objA vertNumsA[n]) ) pasteBtn.enabled = true ) redrawViews() format "\nTransfer took % seconds\n\n" ((TimeStamp() - StartTime) / 1000.0) ) ) ) on RsSkinDataTransferRoll open do ( banner.setup() -- Build control-lists: for ctrl in RsSkinDataTransferRoll.controls do ( case of ( (matchPattern ctrl.name pattern:"vertPickBtnA*"):(append vertPickBtnsA ctrl) (matchPattern ctrl.name pattern:"vertPickBtnB*"):(append vertPickBtnsB ctrl) (matchPattern ctrl.name pattern:"vertPickLbl*"):(append elemNames ctrl.text) ) ) vertPickBtnsA.text = defaultVertPickText vertPickBtnsB.text = defaultVertPickText -- RsSkinDataTransferRoll.hideElementsChk.state = false -- hideThem = RsSkinDataTransferRoll.hideElementsChk.state -- hideElementFaces hideThem -- RsSkinDataTransferRoll.hideElementsChk.state = true -- hideThem = RsSkinDataTransferRoll.hideElementsChk.state -- hideElementFaces hideThem if (isValidNode mjrTarget) do --for if calling via the prep tool ( --messagebox "BING!" local templateObj = getNodeByName "templateMesh" if (isValidNode templateObj) do ( sourceObj = templateObj pickedObj sourceObj 1 getSourceObjBtn.text = sourceObj.name targetObj = mjrTarget pickedObj targetObj 2 getTargetObjBtn.text = targetObj.name --now clear any misc selected verts clearVertBtn vertPickBtnA01 clearVertBtn vertPickBtnB01 ) ) registerRedrawViewsCallback RStransferSkinDataDrawCallback completeRedraw() ) on RsSkinDataTransferRoll close do ( hideElementFaces false -- Remove temporary template-mesh: local tempNode = getNodeByName "templateMesh" if (tempNode != undefined) do ( print ("Deleting "+tempNode.name) delete tempNode skinXFerComplete = true ) unregisterRedrawViewsCallback RStransferSkinDataDrawCallback completeRedraw() ) ) -------------- -- TESTY -- -------------- createDialog RsSkinDataTransferRoll --clearListener() --blah = gRsSkinDataTransfer.copyVerts()