220 lines
6.3 KiB
Plaintext
Executable File
220 lines
6.3 KiB
Plaintext
Executable File
--tool to generate arcGui's from an existing facial rig
|
|
|
|
filein "rockstar/export/settings.ms" -- This is fast
|
|
|
|
-- Figure out the project
|
|
theProjectRoot = RsConfigGetProjRootDir()
|
|
theProject = RSConfigGetProjectName()
|
|
theWildWest = RsConfigGetWildWestDir()
|
|
theProjectConfig = RsConfigGetProjBinConfigDir()
|
|
|
|
-- filein (RsConfigGetWildWestDir() + "script\\max\\Rockstar_North\\character\\Includes\\FN_Rigging.ms")
|
|
filein (RsConfigGetWildWestDir() + "script/3dsMax/_config_files/Wildwest_header.ms")
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
defaultGui = (theProjectRoot +("/art/peds/Skeletons/arcGuiLibrary/male_standard.max"))
|
|
|
|
geo = undefined
|
|
|
|
global regenArcGuis = undefined
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
fn addFileToP4 filenameString =
|
|
(
|
|
gRsPerforce.add #(fileNameString) silent:true
|
|
)
|
|
|
|
fn editp4file filenameString =
|
|
(
|
|
gRsPerforce.add_or_edit #( filenameString ) silent:true queueAdd:false
|
|
)
|
|
|
|
fn saveArcGuisLcl geo headRoot =
|
|
(
|
|
clearSelection()
|
|
local arcGuiParentingArray = #(#(),#())
|
|
|
|
headRoot = getNodebyName ("FaceRoot_"+geo.name)
|
|
select headRoot
|
|
|
|
-- for a in shapes do
|
|
-- (
|
|
-- if (substring a.name 1 7 ) == "arcGUI_" do
|
|
-- (
|
|
-- appendIfUnique arcGuiParentingArray[1] a
|
|
-- )
|
|
-- )
|
|
for a in objects do
|
|
(
|
|
if (substring a.name 1 7 ) == "arcGUI_" do
|
|
(
|
|
appendIfUnique arcGuiParentingArray[1] a
|
|
)
|
|
--now add in the vector nodes
|
|
if (substring a.name 1 9 ) == "v_arcGUI_" do
|
|
(
|
|
appendIfUnique arcGuiParentingArray[1] a
|
|
)
|
|
)
|
|
appendIfUnique arcGuiParentingArray[1] headRoot
|
|
|
|
for aIndex = 1 to arcGuiParentingArray[1].count do --this is a way to store the current parent of all gui objects so we can reparent them after save
|
|
(
|
|
arcGuiParentingArray[2][aIndex] = arcGuiParentingArray[1][aIndex].parent
|
|
)
|
|
max unlink
|
|
|
|
if maxFileName != "" do
|
|
(
|
|
for obj in arcGuiParentingArray[1] do
|
|
(
|
|
selectMore obj
|
|
)
|
|
|
|
Print "==WARNING!!!== File is not saved so could not save guis."
|
|
geoName = geo.name
|
|
currentFileName = maxFileName
|
|
maxStr = ".max"
|
|
repMax = ""
|
|
currentFileName = substituteString currentFileName maxStr repMax
|
|
currentPath = maxFilePath
|
|
arcGuiName = (currentPath+currentFileName+"_"+geoName+"_ArcGuis")
|
|
|
|
deselect $SKEL_Head
|
|
saveNodes selection arcGuiName quiet:true
|
|
|
|
--now try to add to perforce
|
|
-- addFileToP4 (arcGuiName+".max")
|
|
editp4file (arcGuiName+".max")
|
|
)
|
|
|
|
for aIndex = 1 to arcGuiParentingArray[1].count do
|
|
(
|
|
arcGuiParentingArray[1][aIndex].parent = arcGuiParentingArray[2][aIndex]
|
|
)
|
|
)
|
|
|
|
fn generateGuis headNode =
|
|
(
|
|
mergeMaxFile defaultGui
|
|
|
|
--now we need to get the facial root node and name it to match the headNode
|
|
|
|
frNode = $FaceRoot_Lib
|
|
|
|
headNodeNo = substring headNode.name 6 3
|
|
|
|
-- newFrName = replace frNode.name 15 3 headNodeNo
|
|
|
|
newFrName = ("FaceRoot_"+headNode.name)
|
|
|
|
frNode.name = newFrName
|
|
|
|
--now we need to find a corresponding match for all of the faceBones with the headNodeNo
|
|
|
|
fbArray = #()
|
|
|
|
for obj in objects do
|
|
(
|
|
if substring obj.name 1 2 == "FB" do
|
|
(
|
|
nameLength = obj.name.count
|
|
|
|
boneNo = (substring obj.name (nameLength - 2) 3 )
|
|
-- print ("boneNo = "+boneNo)
|
|
-- break()
|
|
if substring obj.name (nameLength - 2) 3 == headNodeNo do
|
|
(
|
|
append fbArray obj
|
|
)
|
|
)
|
|
)
|
|
|
|
--now we have all the bones we need to find the arcGui that goes with it
|
|
|
|
for fb in fbArray do
|
|
(
|
|
--ok so we need to strip off the number from the end
|
|
fbName = substring fb.name 1 (fb.name.count - 4)
|
|
|
|
guiObj = getNodeByName ("arcGUI_"+fbName)
|
|
|
|
vectorNode = getNodeByName ("v_arcGUI_"+fbName+"_FwdVect")
|
|
|
|
if guiObj != undefined then
|
|
(
|
|
if vectornode != undefined then
|
|
(
|
|
guiObj.transform = fb.transform
|
|
|
|
in coordsys local rotate guiObj (angleaxis 90.0 [0,0,1])
|
|
|
|
guiObj.scale = [1,1,1]
|
|
|
|
fbLength = fb.length
|
|
|
|
vectorLength = distance guiObj.pos vectorNode.pos
|
|
|
|
factor = fbLength / vectorLength
|
|
|
|
scaleValue = factor * 1--00
|
|
|
|
guiObj.scale = [scaleValue,scaleValue,scaleValue]
|
|
|
|
-- print ("Scale set on "+guiObj.name+" to "+(scaleValue as string))
|
|
)
|
|
else
|
|
(
|
|
print ("Warning couldn't find "+("v_arcGUI_"+fbName+"_FwdVect")+" to go with "+guiObj.name+" for "+fb.name)
|
|
)
|
|
)
|
|
else
|
|
(
|
|
print ("Warning! Couldn't find "+("arcGUI_"+fbName)+" for "+fbName)
|
|
)
|
|
)
|
|
|
|
saveArcGuisLcl geo frNode
|
|
|
|
|
|
destroyDialog regenArcGuis
|
|
)
|
|
|
|
-- headNode = $'head_000_r default'
|
|
|
|
-- generateGuis headNode
|
|
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
rollout regenArcGuis "Bone I/O"
|
|
(
|
|
button btnPickHead "Pick Head" width:110
|
|
|
|
on btnPickHead pressed do
|
|
(
|
|
headNode = pickObject message:"Pick head geo..." prompt:"Pick head geo" select:true
|
|
-- runInput()
|
|
sela = selection as array
|
|
if sela.count >= 1 then
|
|
(
|
|
geo = headNode
|
|
generateGuis headNode
|
|
)
|
|
else
|
|
(
|
|
messagebox "Please select your meshes."
|
|
)
|
|
select sela
|
|
)
|
|
|
|
)
|
|
|
|
|
|
CreateDialog regenArcGuis width:125 pos:[1450, 100] |