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.
2509 lines
65 KiB
Plaintext
2509 lines
65 KiB
Plaintext
-------------------------------------------------------------------------------
|
|
-- AddCryTools.ms
|
|
-- Version 2.0
|
|
-- Adds the current CryTools menu
|
|
-------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
try (cryTools.cryAnim.base.killCryAnim() ) catch()
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Set the cTools struct
|
|
-------------------------------------------------------------------------------
|
|
|
|
struct cTools
|
|
(
|
|
|
|
--global storage arrays
|
|
_fnStore, _fnStoreIndex, _varStore, _varStoreIndex,
|
|
|
|
localBuildNumber, BuildPathFull, perforcePath, maxDirTxt, editorPath, cryINI, maxVersionNum, project_name,
|
|
latest_build, latestbuildnumber, cryExportPresent, cbaPath, rollback_status, DOMAIN,
|
|
|
|
cryTemp = (sysInfo.tempDir + "cry_temp\\"),
|
|
|
|
--INI read in
|
|
showSplash, reparenttwist, checkbeforeexport, suppresswarnings, warnmats, nounparentw, texturesOK, updateCollections,
|
|
syncCollections, udpObj, loadoldanimtools, generateMenu, -- added new menu generating function
|
|
|
|
--Check For Export Variables
|
|
CheckSceneForExport, PreExportWarnings, CheckBnScale, ReparentTwistBns, CheckObjMat, WpnBnUnlink,
|
|
CheckNodeTm, CheckNonZeroMorphs, CheckVerts,
|
|
|
|
--functions
|
|
scmd, getPerforcePath, existFile, existDir, storeFn, retrieveFn, getDNS, outToINI, inFromINI, md5, alienBrain, MirrorObjs,
|
|
matchPivot, findRoot, getBindPoseVertexTarget, CreateBindPoseMorph, getChildren, getBips, inFromUDP, outToUDP, storeVar, retrieveVar,
|
|
local2unc, forceLowerCase, getUDP, plusR, minusR, objTrajectoryToSpline, cutString, vertDistance, copyPasteController,
|
|
sliderMan, rotBind, polyStats, closestPoint, nodes2bones, readIN, writeOUT, distDiff, lookAtPos, threePlaneInter, avgArray, generateMenu, setupMacros, setupVars, setupCallbacks,
|
|
setupPlugins, setupTools, cryAnim, LookAndWrite, LookAndDelete, sortRootChildren
|
|
|
|
)
|
|
|
|
|
|
-- create instance of ctools struct
|
|
cryTools = cTools()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- Silent command
|
|
cryTools.scmd = fn scmd command wait =
|
|
(
|
|
csexport.export.execute_command_line ("cmd /c \"" + command + "\"") wait
|
|
)
|
|
scmd = undefined
|
|
|
|
|
|
|
|
--// retrieves perforce path of the project if perforce is available
|
|
cryTools.getPerforcePath = fn getPerforcePath =
|
|
(
|
|
perforceString = ""
|
|
tempFile = ((getDir #maxroot) + "perforceDir.ct")
|
|
|
|
local buildFilter = filterString buildPathFull_crytools "\\"
|
|
for i = 1 to buildFilter.count do
|
|
perforceString += buildFilter[i] + (if i < buildFilter.count then "\\" else "")
|
|
|
|
|
|
if cryTools.scmd != undefined then
|
|
(
|
|
cryTools.scmd ("p4 where " + perforceString + " > \"" + tempFile + "\"") true
|
|
|
|
tempString = ""
|
|
while tempString == "" do
|
|
(
|
|
escapeEnable = true
|
|
|
|
--// checks if the file is generated
|
|
while tempStream == undefined do
|
|
(
|
|
escapeEnable = true
|
|
tempStream = openFile tempFile mode:"r"
|
|
)
|
|
|
|
if getFileSize tempFile == 0 then
|
|
(
|
|
print "Perforce not found..."
|
|
return undefined
|
|
)
|
|
|
|
while eof tempStream != true do
|
|
tempString += (readLine tempStream) + "\n"
|
|
|
|
close tempStream
|
|
--// delete file
|
|
deleteFile tempFile
|
|
)
|
|
|
|
try ( return (filterString tempString " ")[1] ) catch (return undefined)
|
|
)
|
|
)
|
|
getPerforcePath = undefined
|
|
|
|
|
|
-- File/Dir exist functions
|
|
cryTools.existFile = fn existFile fname = return ((getfiles fname).count != 0)
|
|
existFile = undefined
|
|
|
|
|
|
cryTools.existDir = fn existDir fname = return ((getdirectories fname).count != 0)
|
|
existDir = undefined
|
|
|
|
|
|
--reading and writing to the crytools.fnStore array
|
|
cryTools.storeFn = fn storeFn storeMe overWrite =
|
|
(
|
|
if (finditem cryTools._fnStoreIndex (storeMe as string)) == 0 then
|
|
(
|
|
--print ("Cannot find " + storeme as string + " in " + crytools.fnstore as string)
|
|
append cryTools._fnStore storeMe
|
|
append cryTools._fnStoreIndex (storeMe as string)
|
|
)
|
|
else
|
|
(
|
|
if overWrite == true then
|
|
(
|
|
itemIndex = (finditem cryTools._fnStoreIndex (storeMe as string))
|
|
cryTools._fnStore[itemIndex] = storeMe
|
|
cryTools._fnStoreIndex[itemIndex] = (storeMe as string)
|
|
)
|
|
else
|
|
(
|
|
print "function exists"
|
|
)
|
|
)
|
|
)
|
|
storeFn = undefined
|
|
|
|
|
|
cryTools.retrieveFn = fn retrieveFn name =
|
|
(
|
|
index = finditem crytools._fnStoreIndex name
|
|
if index == 0 then
|
|
return undefined
|
|
else
|
|
return crytools._fnStore[index]
|
|
)
|
|
retrieveFn = undefined
|
|
|
|
--reading and writing to the crytools.fvarStore array
|
|
cryTools.storeVar = fn storeVar storeMe alias overWrite =
|
|
(
|
|
if (finditem crytools._varStoreIndex alias) == 0 then
|
|
(
|
|
append crytools._varStore storeMe
|
|
append crytools._varStoreIndex alias
|
|
)
|
|
else
|
|
(
|
|
if overWrite == true then
|
|
(
|
|
itemIndex = finditem crytools._varStoreIndex alias
|
|
crytools._varStore[itemIndex] = storeMe
|
|
crytools._varStoreIndex[itemIndex] = alias
|
|
print "overwritten"
|
|
)
|
|
else
|
|
(
|
|
print "alias exists"
|
|
)
|
|
)
|
|
)
|
|
storeVar = undefined
|
|
|
|
|
|
|
|
cryTools.retrieveVar = fn retrieveVar name =
|
|
(
|
|
index = finditem crytools._varStoreIndex name
|
|
if index == 0 then
|
|
return undefined
|
|
else
|
|
return crytools._varStore[index]
|
|
)
|
|
retrieveVar = undefined
|
|
|
|
|
|
|
|
-- Get DNS info
|
|
cryTools.getDNS = fn getDNS =
|
|
(
|
|
try
|
|
(
|
|
cryTools.scmd ("ipconfig /all > " + crytools.cryTemp + "ipconfig.txt") true
|
|
in_text = openfile (crytools.cryTemp + "ipconfig.txt")
|
|
skipToString in_text "Primary Dns Suffix . . . . . . . : "
|
|
line = readline in_text
|
|
close in_text
|
|
deleteFile (crytools.cryTemp + "ipconfig.txt")
|
|
return line
|
|
)
|
|
catch ( return "UNDEFINED" )
|
|
)
|
|
getDNS = undefined
|
|
|
|
|
|
|
|
cryTools.outToINI = fn outToINI subject key data =
|
|
(
|
|
csexport.set_value key data
|
|
)
|
|
outToINI = undefined
|
|
|
|
|
|
|
|
cryTools.writeOUT = fn writeOUT data path echo:undefined =
|
|
(
|
|
if doesfileexist path == false then
|
|
(
|
|
INIFile = createFile path
|
|
for i = 1 to data.count do
|
|
(
|
|
if echo == true then
|
|
(
|
|
print data[i]
|
|
)
|
|
format (data[i] + "\n") to:INIFile
|
|
)
|
|
close INIfile
|
|
)
|
|
else
|
|
(
|
|
try
|
|
(
|
|
INIfile = openfile path mode:"w"
|
|
)
|
|
catch
|
|
(
|
|
cryTools.minusR path
|
|
)
|
|
INIfile = openfile path mode:"w"
|
|
for i = 1 to data.count do
|
|
(
|
|
if echo == true then
|
|
(
|
|
print data[i]
|
|
)
|
|
format (data[i] + "\n") to:INIFile
|
|
)
|
|
close INIfile
|
|
)
|
|
)
|
|
writeOUT = undefined
|
|
|
|
|
|
|
|
cryTools.inFromINI = fn inFromINI subject key =
|
|
(
|
|
return (csexport.get_value key)
|
|
)
|
|
inFromINI = undefined
|
|
|
|
|
|
|
|
cryTools.readIN = fn readIN path echo:undefined =
|
|
(
|
|
if doesfileexist path == false then
|
|
(
|
|
print ("file " + path + " does not exist!")
|
|
return undefined
|
|
)
|
|
INIfile = openfile path mode:"r"
|
|
fileContents = #()
|
|
while not EOF INIfile do
|
|
(
|
|
append fileContents (readline INIfile)
|
|
)
|
|
close INIfile
|
|
if echo == true then
|
|
(
|
|
print fileContents
|
|
)
|
|
return fileContents
|
|
)
|
|
readIN = undefined
|
|
|
|
--// for old ini version
|
|
try ( csexport.set_value )
|
|
catch
|
|
(
|
|
cryTools.outToINI = fn outToINI subject key data =
|
|
(
|
|
setINISetting (sysInfo.tempDir + "cry_temp\\cryTools.ini") subject key data
|
|
)
|
|
outToINI = undefined
|
|
|
|
|
|
cryTools.inFromINI = fn inFromINI subject key =
|
|
(
|
|
return (getINISetting (sysInfo.tempDir + "cry_temp\\crytools.ini") subject key)
|
|
)
|
|
inFromINI = undefined
|
|
)
|
|
|
|
|
|
|
|
|
|
-- MD5 hash return
|
|
cryTools.md5 = fn md5 md5path =
|
|
(
|
|
cryTools.scmd ("\"" + cryTools.BuildPathFull + "Tools\\maxscript\\md5\" \"" + md5path + "\" > " + ("\"" + sysInfo.tempDir + "cry_temp\\hash.txt\"")) true
|
|
if doesfileexist md5path == false then
|
|
(
|
|
print ( md5path + " does not exist.")
|
|
return undefined
|
|
)
|
|
md5hashfile = openFile (sysInfo.tempDir + "cry_temp\\hash.txt")
|
|
while not eof md5hashfile do
|
|
(
|
|
md5hashline = (readline md5hashfile)
|
|
)
|
|
try
|
|
(
|
|
md5hashArray = (filterstring md5hashline " ")
|
|
)
|
|
catch
|
|
(
|
|
return ("INVALID PATH: " + md5path)
|
|
)
|
|
close md5hashfile
|
|
deleteFile (sysInfo.tempDir + "cry_temp\\hash.txt")
|
|
return md5hashArray[1]
|
|
)
|
|
md5 = undefined
|
|
|
|
-- AlienBrain interface via command line execution
|
|
cryTools.alienBrain = fn alienBrain abcommand =
|
|
(
|
|
crytools.scmd abcommand true
|
|
)
|
|
alienBrain = undefined
|
|
|
|
|
|
|
|
|
|
-- For mirroring joint orientations over an arbitrary axis
|
|
cryTools.MirrorObjs = fn MirrorObjs Obj1 Obj2 MObj MAxis OAxis =
|
|
(
|
|
T = Obj2.Transform * inverse MObj.Transform --- the offset transform Matrix
|
|
Case MAxis of --- Mirror T in one axis of MObj
|
|
(
|
|
#x:( for i = 1 to 4 do T[i] = [ -T[i].x , T[i].y , T[i].z ] )
|
|
#y:( for i = 1 to 4 do T[i] = [ T[i].x , -T[i].y , T[i].z ] )
|
|
#z:( for i = 1 to 4 do T[i] = [ T[i].x , T[i].y , -T[i].z ] )
|
|
)
|
|
case OAxis of --- But the axis has been flipped ...so flip it back.
|
|
(
|
|
#x:( T[1] = - T[1] )
|
|
#y:( T[2] = - T[2] )
|
|
#z:( T[3] = - T[3] )
|
|
)
|
|
|
|
TM = T * MObj.Transform
|
|
Obj1.rotation = Conjugate TM.rotation
|
|
Obj1.pos = TM.pos
|
|
)
|
|
MirrorObjs = undefined
|
|
|
|
|
|
|
|
-- Aligning the pivot of an object to that of another
|
|
cryTools.matchPivot = fn matchPivot obj1 obj2 =
|
|
(
|
|
obj2.pivot = obj1.pivot
|
|
pivrot = obj1.rotation
|
|
in coordsys local obj2.rotation*=pivrot
|
|
obj2.objectoffsetrot*=pivrot
|
|
obj2.objectoffsetpos*=pivrot
|
|
)
|
|
matchPivot = undefined
|
|
|
|
|
|
|
|
-- Gets the root of the hierarchy, when you give it an object of said hierarchy.
|
|
cryTools.findRoot = fn findRoot obj =
|
|
(
|
|
try
|
|
(
|
|
if obj.parent == undefined then
|
|
(
|
|
return obj
|
|
)
|
|
local p1 = obj
|
|
for i = 1 to 10000 do
|
|
(
|
|
p2 = p1.parent
|
|
if p2 == undefined then return p1 else p1 = p2
|
|
)
|
|
)
|
|
catch( return obj)
|
|
)
|
|
findRoot = undefined
|
|
|
|
|
|
|
|
|
|
-- Smithy's badassed morph extraction
|
|
cryTools.getBindPoseVertexTarget = fn getBindPoseVertexTarget targetNode sourceNode vertexID =
|
|
(
|
|
-- Find the skin modifier.
|
|
skin = sourceNode.skin
|
|
|
|
-- Loop through all the bones influencing this vertex.
|
|
-- For now just use one of the bones.
|
|
skinTransform = Matrix3 0
|
|
for link = 1 to skinOps.getVertexWeightCount skin vertexID do
|
|
(
|
|
-- Get the bone that the vertex is linked to.
|
|
boneID = skinOps.getVertexWeightBoneID skin vertexID link
|
|
boneName = skinOps.GetBoneName skin boneID 0
|
|
bone = getNodeByName boneName
|
|
|
|
-- Find the bind pose transform of the bone.
|
|
in coordsys world bindPoseTM = skinUtils.GetBoneBindTM sourceNode bone
|
|
|
|
-- Find the current transform of the bone.
|
|
in coordsys world currentTM = bone.transform
|
|
|
|
-- Find the relative transform.
|
|
bindPoseToCurrentTM = (inverse bindPoseTM) * currentTM
|
|
|
|
-- Get the weight assigned to this bone.
|
|
weight = skinOps.GetVertexWeight skin vertexID link
|
|
scale bindPoseToCurrentTM [weight, weight, weight] true
|
|
|
|
-- Compute the weighted sum of the transform matrix.
|
|
skinTransform = skinTransform + bindPoseToCurrentTM
|
|
)
|
|
|
|
-- Apply the inverse of this transform to the vertex, to return to bind pose.
|
|
bindPoseVertex = (getVert targetNode vertexID) * (inverse skinTransform)
|
|
|
|
return bindPoseVertex
|
|
)
|
|
getBindPoseVertexTarget = undefined
|
|
|
|
|
|
|
|
|
|
-- CreateBindPoseMorph
|
|
cryTools.CreateBindPoseMorph = fn CreateBindPoseMorph targetNode sourceNode deleteYN addMorphYN channelNum extractedNode =
|
|
(
|
|
-- Make sure the user has selected the skinned character.
|
|
if targetNode != undefined then
|
|
(
|
|
targetCopy = copy targetNode name:extractedNode
|
|
convertToMesh targetCopy
|
|
|
|
targetCopy.transform = sourceNode.transform
|
|
|
|
-- Transform all vertices to the bind pose.
|
|
for vertex = 1 to (getNumVerts targetCopy) do
|
|
(
|
|
bindPosePosition = getBindPoseVertexTarget targetCopy sourceNode vertex
|
|
meshOp.setVert targetCopy vertex bindPosePosition
|
|
)
|
|
|
|
-- Add the morph channel.
|
|
if addMorphYN == 1 then
|
|
(
|
|
WM3_MC_Delete sourceNode.morpher channelNum
|
|
wm3_mc_buildfromnode sourceNode.morpher channelNum targetCopy
|
|
)
|
|
|
|
-- Delete the cloned morph target.
|
|
if deleteYN == 1 then
|
|
(
|
|
delete targetCopy
|
|
)
|
|
)
|
|
)
|
|
CreateBindPoseMorph = undefined
|
|
|
|
|
|
|
|
|
|
-- Get children
|
|
cryTools.getChildren = fn getChildren theNode =
|
|
(
|
|
nodeArray = #()
|
|
for obj in theNode.children do
|
|
(
|
|
append nodeArray obj
|
|
join nodeArray (cryTools.getChildren obj)
|
|
)
|
|
return nodeArray
|
|
)
|
|
getChildren = undefined
|
|
|
|
|
|
|
|
--function to get all bip roots
|
|
cryTools.getBips = fn getBips =
|
|
(
|
|
Bips = #()
|
|
for obj in geometry do
|
|
(
|
|
if classof obj.controller == Vertical_Horizontal_Turn then
|
|
(
|
|
append Bips obj
|
|
)
|
|
)
|
|
return Bips
|
|
)
|
|
getBips = undefined
|
|
|
|
|
|
|
|
|
|
--functions for reading and writing to user defined properties
|
|
cryTools.inFromUDP = fn inFromUDP obj =
|
|
(
|
|
if obj == undefined then
|
|
(
|
|
print "No Object is Selected!"
|
|
return undefined
|
|
)
|
|
UDPin = stringstream (getUserPropBuffer obj)
|
|
udpContents = #()
|
|
while not eof UDPin do
|
|
(
|
|
append udpContents (readline (UDPin))
|
|
)
|
|
for i = 1 to udpContents.count do
|
|
(
|
|
if udpContents[i] == "" then
|
|
(
|
|
deleteItem udpContents i
|
|
)
|
|
)
|
|
return udpContents
|
|
)
|
|
inFromUDP = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.outToUDP = fn outToUDP data obj echo =
|
|
(
|
|
text = ""
|
|
|
|
if obj == undefined then
|
|
(
|
|
print ("outToUDP: " + obj.name + " does not exist!")
|
|
return undefined
|
|
)
|
|
|
|
|
|
for i = 1 to data.count do
|
|
text += data[i] + "\r\n"
|
|
|
|
|
|
if echo == true then
|
|
print text
|
|
|
|
setUserPropBuffer obj text
|
|
)
|
|
outToUDP = undefined
|
|
|
|
|
|
|
|
cryTools.LookAndDelete = fn LookAndDelete obj word=
|
|
(
|
|
local ObjUDP = crytools.inFromUDP obj
|
|
local index = 0
|
|
|
|
if ObjUDP.count > 0 then
|
|
(
|
|
--// goes through udp entries
|
|
for i = 1 to ObjUDP.count do
|
|
(
|
|
--// if the word is found in the entry
|
|
if word == ((filterstring ObjUDP[i] " =")[1]) then
|
|
(
|
|
--// exit loop
|
|
index = i
|
|
exit
|
|
)
|
|
)
|
|
|
|
if index != 0 then
|
|
--// delete entry
|
|
deleteItem ObjUDP index
|
|
|
|
--// set new udp entries
|
|
crytools.outtoudp ObjUDP obj false
|
|
)
|
|
)
|
|
LookAndDelete = undefined
|
|
|
|
|
|
|
|
cryTools.LookAndWrite = fn LookAndWrite obj data =
|
|
(
|
|
local ObjUDP = crytools.inFromUDP obj
|
|
local TestArr = #()
|
|
local wordLocation = 0
|
|
|
|
for i = 1 to ObjUDP.count do
|
|
(
|
|
--// adds the entries name to the test array
|
|
append TestArr (filterstring ObjUDP[i] " =")[1]
|
|
--// if the entry is the same as data
|
|
if TestArr[i] == (filterString data " =")[1] then
|
|
--// set new location in the array
|
|
wordLocation = i
|
|
)
|
|
|
|
--// tries to find the word in the entries list, if it can't find it, set location to the next of the last entry
|
|
if wordLocation == 0 then wordLocation = ObjUDP.count + 1
|
|
|
|
--// write new entry
|
|
ObjUDP[wordLocation] = data
|
|
crytools.OutToUDP ObjUDP obj false
|
|
)
|
|
LookAndWrite = undefined
|
|
|
|
|
|
|
|
cryTools.local2unc = fn local2unc letter =
|
|
(
|
|
cmd = ("net use " + letter + ": > " + crytools.cryTemp + "local_unc.txt")
|
|
crytools.scmd cmd true
|
|
loadIn = openfile (crytools.cryTemp + "local_unc.txt")
|
|
skipToString loadIn "Remote"
|
|
loadInARR = (filterString (readline loadIn) " ")
|
|
close loadIn
|
|
cmd = ("del " + crytools.cryTemp + "local_unc.txt")
|
|
crytools.scmd cmd true
|
|
return loadInARR[2]
|
|
)
|
|
local2unc = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.forceLowerCase = fn forceLowerCase inputString =
|
|
(
|
|
charCache = #()
|
|
outputString = ""
|
|
inputStream = (inputString as stringStream)
|
|
while not eof inputStream do
|
|
(
|
|
append charCache (readChar inputStream)
|
|
)
|
|
for i = 1 to charCache.count do
|
|
(
|
|
case charCache[i] of
|
|
(
|
|
"A": charCache[i] = "a"
|
|
"B": charCache[i] = "b"
|
|
"C": charCache[i] = "c"
|
|
"D": charCache[i] = "d"
|
|
"E": charCache[i] = "e"
|
|
"F": charCache[i] = "f"
|
|
"G": charCache[i] = "g"
|
|
"H": charCache[i] = "h"
|
|
"I": charCache[i] = "i"
|
|
"J": charCache[i] = "j"
|
|
"K": charCache[i] = "k"
|
|
"L": charCache[i] = "l"
|
|
"M": charCache[i] = "m"
|
|
"N": charCache[i] = "n"
|
|
"O": charCache[i] = "o"
|
|
"P": charCache[i] = "p"
|
|
"Q": charCache[i] = "q"
|
|
"R": charCache[i] = "r"
|
|
"S": charCache[i] = "s"
|
|
"T": charCache[i] = "t"
|
|
"U": charCache[i] = "u"
|
|
"V": charCache[i] = "v"
|
|
"W": charCache[i] = "w"
|
|
"X": charCache[i] = "x"
|
|
"Y": charCache[i] = "y"
|
|
"Z": charCache[i] = "z"
|
|
)
|
|
)
|
|
for i = 1 to charCache.count do
|
|
(
|
|
append outputString charCache[i]
|
|
)
|
|
return outputString
|
|
)
|
|
forceLowerCase = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.getUDP = fn getUDP obj attrib =
|
|
(
|
|
--// init vars
|
|
returnVal = ""
|
|
udpInARR = crytools.inFromUDP obj
|
|
|
|
--// go through every udp entry
|
|
for i = 1 to udpInARR.count do
|
|
(
|
|
--// get's name
|
|
local testFor = (cryTools.forceLowerCase (filterString udpInArr[i] " =")[1])
|
|
--// get's value
|
|
local testValue
|
|
if (filterString udpInArr[i] " =")[2] != undefined then
|
|
(
|
|
testValue = ((filterString udpInArr[i] " =")[2] as float)
|
|
)
|
|
else
|
|
(
|
|
testValue = true
|
|
)
|
|
--// returns value, if entry is the same as attrib
|
|
if testFor == attrib then
|
|
return testValue
|
|
)
|
|
return undefined
|
|
)
|
|
getUDP = undefined
|
|
|
|
|
|
|
|
|
|
-- file attrib +/-r in explorer
|
|
cryTools.plusR = fn plusR path =
|
|
(
|
|
if doesfileexist path == true then
|
|
(
|
|
crytools.scmd ("attrib +r \"" + path + "\"") true
|
|
)
|
|
else
|
|
(
|
|
print (path + " does not exist")
|
|
)
|
|
)
|
|
plusR = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.minusR = fn minusR path =
|
|
(
|
|
if doesfileexist path == true then
|
|
(
|
|
cryTools.scmd ("attrib -r \"" + path + "\"") true
|
|
)
|
|
else
|
|
(
|
|
print (path + " does not exist")
|
|
)
|
|
)
|
|
minusR = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.objTrajectoryToSpline = fn objTrajectoryToSpline =
|
|
(
|
|
for obj in selection do
|
|
(
|
|
ss = SplineShape pos:(obj.position.keys[1].value) name:("traj_" + obj.name)
|
|
addNewSpline ss
|
|
for i = 2 to obj.position.keys.count do
|
|
(
|
|
addKnot ss 1 #corner #line obj.position.keys[i].value
|
|
)
|
|
updateShape ss
|
|
ss.transform = obj.transform
|
|
)
|
|
)
|
|
objTrajectoryToSpline = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.cutString = fn cutString stringIn cut =
|
|
(
|
|
startCut = (findString stringIn cut)
|
|
if startCut == undefined then
|
|
(
|
|
print ("error: '" + stringIn + "' '" + cut +"'")
|
|
return stringIn
|
|
)
|
|
return (replace stringIn startCut cut.count "")
|
|
)
|
|
cutString = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.vertDistance = fn vertDistance pos1 pos2 =
|
|
(
|
|
distX = (pos1.x - pos2.x) * (pos1.x - pos2.x)
|
|
distY = (pos1.y - pos2.y) * (pos1.y - pos2.y)
|
|
distZ = (pos1.z - pos2.z) * (pos1.z - pos2.z)
|
|
|
|
hypotDistXYZ = sqrt(distX + distY + distZ) as float
|
|
|
|
return hypotDistXYZ
|
|
)
|
|
vertDistance = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.copyPasteController = fn copyPasteController parentObj selOrChild what =
|
|
(
|
|
if selOrChild == "children" then
|
|
(
|
|
for obj in parentObj.children do
|
|
(
|
|
obj.parent = undefined
|
|
|
|
--// if p exists
|
|
if (findString what "p") != undefined then
|
|
obj.position.controller = parentObj.position.controller
|
|
--// if r exists
|
|
if (findString what "r") != undefined then
|
|
obj.rotation.controller = parentObj.rotation.controller
|
|
)
|
|
)
|
|
)
|
|
copyPasteController = undefined
|
|
|
|
|
|
|
|
|
|
--old test, just puts in manip mode if slider is selected (needs callback)
|
|
cryTools.sliderMan = fn sliderMan =
|
|
(
|
|
if selection != undefined then
|
|
(
|
|
if classof $ == sliderManipulator then
|
|
(
|
|
manipulateMode = true
|
|
)
|
|
else
|
|
(
|
|
manipulateMode = false
|
|
)
|
|
)
|
|
)
|
|
sliderMan = undefined
|
|
|
|
cryTools.rotBind = fn rotBind mesh root x y z leaveSkel =
|
|
(
|
|
select mesh
|
|
|
|
--place bip into fig mode
|
|
if root.name == "Bip01" then
|
|
(
|
|
$Bip01.controller.figureMode = true
|
|
)
|
|
|
|
--save out weights
|
|
max modify mode
|
|
try
|
|
(
|
|
modPanel.setCurrentObject mesh.modifiers[#Skin]
|
|
)
|
|
catch
|
|
(
|
|
print (mesh.name + " does not appear to have a Skin modifier.")
|
|
return undefined
|
|
)
|
|
skinOps.SaveEnvelope mesh.modifiers[#Skin] (crytools.cryTemp + "tests.env")
|
|
local boneXfer = #()
|
|
for i=1 to (skinOps.getNumberBones mesh.skin) do
|
|
(
|
|
append boneXfer (skinOps.GetBoneName mesh.skin i 0)
|
|
)
|
|
|
|
--flip the character mesh
|
|
collapseStack mesh
|
|
mesh.transform[4] = root.transform[4]
|
|
in coordsys world rotate mesh (eulerangles x y z)
|
|
ResetXForm mesh
|
|
collapseStack mesh
|
|
|
|
--flip the skeleton
|
|
in coordsys world rotate root (eulerangles x y z)
|
|
|
|
--readd skin to the mesh
|
|
addModifier mesh (Skin ())
|
|
modPanel.setCurrentObject mesh.modifiers[#Skin]
|
|
for i = 1 to (boneXfer.count - 1) do
|
|
(
|
|
skinOps.addbone mesh.modifiers[#Skin] (getnodebyname (bonexfer[i])) 0
|
|
)
|
|
skinOps.addbone mesh.modifiers[#Skin] (getnodebyname (bonexfer[bonexfer.count])) 1
|
|
--don't ask me why you have to do this twise to get it to work
|
|
skinOps.LoadEnvelope mesh.modifiers[#Skin] (crytools.cryTemp + "tests.env")
|
|
skinOps.LoadEnvelope mesh.modifiers[#Skin] (crytools.cryTemp + "tests.env")
|
|
|
|
--flip the skeleton back
|
|
if leaveSkel == false then
|
|
(
|
|
in coordsys world rotate root (eulerangles -x -y -z)
|
|
)
|
|
)
|
|
rotBind = undefined
|
|
|
|
crytools.polyStats = fn polyStats =
|
|
(
|
|
try
|
|
(
|
|
if selection.count == 0 then
|
|
(
|
|
return #(0,0,0)
|
|
)
|
|
|
|
totalFace = 0
|
|
totalEdge = 0
|
|
totalVert = 0
|
|
|
|
for obj in selection do
|
|
(
|
|
totalFace += obj.mesh.numfaces
|
|
totalEdge += obj.mesh.edges.count
|
|
totalVert += obj.mesh.numverts
|
|
)
|
|
|
|
return #(totalFace,totalEdge,totalVert)
|
|
)
|
|
catch(return #(0,0,0))
|
|
)
|
|
polystats = undefined
|
|
|
|
crytools.closestpoint = fn closestpoint point1 obj =
|
|
(
|
|
try
|
|
(
|
|
local posArr = #()
|
|
for i = 1 to (polyOp.getNumVerts obj) do
|
|
(
|
|
local vPos = polyOp.getVert obj i
|
|
append posArr vPos
|
|
)
|
|
local sPosArr = #()
|
|
for i in posArr do
|
|
(
|
|
local distX = distance point1 i
|
|
append sPosArr distX
|
|
)
|
|
local minDistance = amin sPosArr
|
|
local minVert = findItem sPosArr (minDistance)
|
|
return minVert
|
|
)
|
|
catch()
|
|
)
|
|
closestpoint = undefined
|
|
|
|
crytools.nodes2bones = fn nodes2bones node =
|
|
(
|
|
try
|
|
(
|
|
if node.children != undefined then
|
|
(
|
|
newBones = #()
|
|
|
|
for obj in (append (crytools.getchildren node) node) do
|
|
(
|
|
for child in obj.children do
|
|
(
|
|
if child.children != undefined then
|
|
(
|
|
test = BoneSys.createBone obj.transform.pos child.transform.pos obj.transform[3]
|
|
test.name = (obj.name + "_bone")
|
|
append newBones test
|
|
)
|
|
)
|
|
)
|
|
for obj in newBones do
|
|
(
|
|
try (obj.parent = (getnodebyname (((getnodebyname (crytools.cutstring obj.name "_bone")).parent).name + "_bone"))) catch()
|
|
)
|
|
)
|
|
)
|
|
catch()
|
|
)
|
|
nodes2bones = undefined
|
|
|
|
|
|
--###############################################################################
|
|
--// goes through the timeline and returns the distance largest distance two points move relative to start distance
|
|
--// used for looking at mocap stabilization markers
|
|
--###############################################################################
|
|
crytools.distDiff = fn distDiff pos1 pos2 detail: logOut: =
|
|
(
|
|
distMax = 0
|
|
distMin = 100000
|
|
local minF
|
|
local maxF
|
|
local stabLog = ""
|
|
local origDist = at time animationrange.start (distance pos1 pos2)
|
|
|
|
for i=animationrange.start to animationrange.end do
|
|
(
|
|
at time i
|
|
(
|
|
dist = (distance pos1 pos2)
|
|
stabLog += (i as string+ "_" + (origDist - dist) as string + "\n")
|
|
if dist < distMin then
|
|
(
|
|
distMin = dist
|
|
minF = i
|
|
)
|
|
if dist > distMax then
|
|
(
|
|
distMax = dist
|
|
maxF = i
|
|
)
|
|
)
|
|
)
|
|
print (distmax as string + " " + distmin as string)
|
|
if logOut == true and detail == true then
|
|
(
|
|
return #((distmax-distmin),minF,maxF, stabLog)
|
|
)
|
|
else if detail = true then
|
|
(
|
|
return #((distmax-distmin),minF,maxF)
|
|
)
|
|
else
|
|
(
|
|
return (distmax-distmin)
|
|
)
|
|
)
|
|
distDiff = undefined
|
|
|
|
cryTools.lookatPos = fn lookAtObj obj1 pos obj1axis =
|
|
(
|
|
local objDir
|
|
case obj1axis of
|
|
(
|
|
1: objDir = obj1.transform[1]
|
|
2: objDir = obj1.transform[2]
|
|
3: objDir = obj1.transform[3]
|
|
)
|
|
theAngle = (acos(dot (normalize objDir) (normalize (pos - obj1.pos))))
|
|
theAxis = (cross (normalize objdir) (normalize (pos - obj1.pos)))
|
|
rotAngle = angleAxis theAngle theAxis
|
|
rotate obj1 rotAngle
|
|
)
|
|
lookAtObj = undefined
|
|
|
|
--###############################################################################
|
|
--// finds the intersection of three planes, returns undefined if any 2 or all 3 are parallel
|
|
--###############################################################################
|
|
crytools.threePlaneInter = fn threePlaneInter p1 p2 p3 selectPlanes: =
|
|
(
|
|
local d1 = (dot p1.dir p1.pos )
|
|
local d2 = (dot p2.dir p2.pos )
|
|
local d3 = (dot p3.dir p3.pos )
|
|
|
|
local num = ((d1 * (cross p2.dir p3.dir)) + (d2 * (cross p3.dir p1.dir)) + (d3 * (cross p1.dir p2.dir)))
|
|
local denom = (dot p1.dir (cross p2.dir p3.dir))
|
|
|
|
print ("num " + num as string)
|
|
print ("denom " + denom as string)
|
|
if (abs denom) < 0.0001 then (return undefined)
|
|
|
|
if selectPlanes == true then
|
|
(
|
|
selectMe = #(p1,p2,p3)
|
|
select selectMe
|
|
)
|
|
return (num / denom)
|
|
)
|
|
threePlaneInter = undefined
|
|
|
|
|
|
--###############################################################################
|
|
--// returns an average of elements in an array
|
|
--###############################################################################
|
|
crytools.avgArray = fn avgArray arrayIn nodePos: =
|
|
(
|
|
try (arrayIn.count)catch(return undefined)
|
|
|
|
if arrayIn.count == 1 then
|
|
(
|
|
if nodePos == true then (return arrayIn[1].pos)else(return arrayIn[1])
|
|
)
|
|
|
|
if nodePos == true then
|
|
(
|
|
n = arrayIn[1].pos
|
|
for i = 2 to arrayIn.count do
|
|
(
|
|
n += arrayIn[i].pos
|
|
)
|
|
return (n/arrayIn.count)
|
|
)
|
|
else
|
|
(
|
|
n = arrayIn[1]
|
|
|
|
for i = 2 to arrayIn.count do
|
|
(
|
|
n += arrayIn[i]
|
|
)
|
|
return (n/arrayIn.count)
|
|
)
|
|
)
|
|
avgArray = undefined
|
|
|
|
|
|
--###############################################################################
|
|
--// sorts the array depending the hierarchy
|
|
--###############################################################################
|
|
cryTools.sortRootChildren = function sortRootChildren nodeArray =
|
|
(
|
|
try local tempParent = getNodeByName nodeArray[1].name
|
|
catch local tempParent = getNodeByName nodeArray[1]
|
|
|
|
while tempParent.parent != undefined do
|
|
(
|
|
enableEscape = true
|
|
tempParent = tempParent.parent
|
|
)
|
|
|
|
local root = tempParent
|
|
|
|
nodeAllArray = #(root)
|
|
join nodeAllArray (cryTools.getChildren root)
|
|
|
|
try
|
|
(
|
|
for i = 1 to nodeArray.count do
|
|
nodeArray[i] = nodeArray[i].name
|
|
)catch()
|
|
|
|
|
|
|
|
for i = 1 to nodeAllArray.count do
|
|
nodeAllArray[i] = nodeAllArray[i].name
|
|
|
|
local notParentedArray = #()
|
|
|
|
|
|
for i = 1 to nodeAllArray.count do
|
|
(
|
|
if findItem nodeArray nodeAllArray[i] == 0 then
|
|
nodeAllArray[i] = undefined
|
|
)
|
|
|
|
for i = 1 to nodeArray.count do
|
|
if findItem nodeAllArray nodeArray[i] == 0 then
|
|
append notParentedArray nodeArray[i]
|
|
|
|
local resultArray = #()
|
|
|
|
for i = 1 to nodeAllArray.count do
|
|
if nodeAllArray[i] != undefined then
|
|
append resultArray nodeAllArray[i]
|
|
|
|
join resultArray notParentedArray
|
|
|
|
return resultArray
|
|
|
|
)
|
|
sortRootChildren = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.generateMenu = fn generateMenu =
|
|
(
|
|
try (menuMan.unRegisterMenu (menuMan.findMenu "CryTools") ) catch()
|
|
|
|
local mainMenuBar = menuMan.getMainMenuBar()
|
|
local subMenu = menuMan.createMenu "CryTools"
|
|
local subMenuItem = menuMan.createSubMenuItem "CryTools" subMenu
|
|
|
|
mainMenuBar.addItem subMenuItem (mainMenuBar.numItems() - 1)
|
|
menuMan.updateMenuBar()
|
|
|
|
local mainMenuBar = menuMan.getMainMenuBar()
|
|
local subMenu = menuMan.findMenu "CryTools"
|
|
|
|
local addBar = menuMan.createActionItem "CryAnimation" "CryTools"
|
|
subMenu.addItem addBar -1
|
|
|
|
|
|
local addBar = menuMan.createActionItem "CryArtistTools" "CryTools"
|
|
subMenu.addItem addBar -1
|
|
local addBar = menuMan.createActionItem "CryMorphManager" "CryTools"
|
|
subMenu.addItem addBar -1
|
|
local addBar = menuMan.createActionItem "CryRigging" "CryTools"
|
|
subMenu.addItem addBar -1
|
|
local addBar = menuMan.createActionItem "CryInfo" "CryTools"
|
|
subMenu.addItem addBar -1
|
|
local addBar = menuMan.createActionItem "SceneBrowser" "CryTools"
|
|
subMenu.addItem addBar -1
|
|
|
|
seperator = menuMan.createSeparatorItem()
|
|
subMenu.addItem seperator -1
|
|
|
|
--local addBar = menuMan.createActionItem "UpdateTools" "CryTools"
|
|
--subMenu.addItem addBar -1
|
|
local addBar = menuMan.createActionItem "ControlPanel" "CryTools"
|
|
subMenu.addItem addBar -1
|
|
local addBar = menuMan.createActionItem "CrytoolsDocs" "CryTools"
|
|
subMenu.addItem addBar -1
|
|
local addBar = menuMan.createActionItem "OnlineDocumentation" "CryTools"
|
|
subMenu.additem addBar -1
|
|
|
|
menuMan.updateMenuBar()
|
|
)
|
|
generateMenu = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.setupMacros = fn setupMacros =
|
|
(
|
|
MacroScript UpdateTools category:"CryTools" tooltip:"Reload/Update Cry Tools"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\UpdateTools.ms")
|
|
)
|
|
MacroScript CryAnimation category:"CryTools" tooltip:"Animation Tools"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
(
|
|
try
|
|
(
|
|
if cryTools.loadoldanimtools == false then
|
|
(
|
|
if cryTools.cryAnim != undefined then
|
|
(
|
|
undo off
|
|
cryTools.cryAnim.UI.main._f.callDialog()
|
|
)
|
|
)
|
|
else
|
|
(
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryAnimationTools.ms")
|
|
)
|
|
)catch( messageBox "Error loading cryAnimation" )
|
|
)
|
|
)
|
|
MacroScript CryArtistTools category:"CryTools" tooltip:"Artist Tools"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryArtistTools.ms")
|
|
)
|
|
MacroScript CryMorphManager category:"CryTools" tooltip:"Facial Morph Tool"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryMorphTools.ms")
|
|
)
|
|
MacroScript CryRigging category:"CryTools" tooltip:"Riging Tools"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryRiggingTools.ms")
|
|
)
|
|
MacroScript SceneBrowser category:"CryTools" tooltip:"Scene Browser"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\SceneBrowser.ms")
|
|
)
|
|
MacroScript CryInfo category:"CryTools" tooltip:"Add File Info"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryInfo.ms")
|
|
)
|
|
MacroScript CryInfoLoader category:"CryTools" tooltip:"Auto-loads cryInfo"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryInfoLoader.ms")
|
|
)
|
|
MacroScript ControlPanel category:"CryTools" tooltip:"Diagnostics//Preferences"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\Diagnostics.ms")
|
|
)
|
|
MacroScript CrytoolsDocs category:"CryTools" tooltip:"Launch Help"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
shellLaunch (crytools.BuildPathFull + "Tools\\maxscript\\docs\\index.html") "" --Changed by Ruben "rubenst" Steinbacher, from Crytek internal path to the docs delivered with SDK
|
|
)
|
|
--Added by Ruben "rubenst" Steinbacher
|
|
MacroScript OnlineDocumentation category:"CryTools" tooltip:"Launch Official CryENGINE2 Docu - Asset Creation Manual (Online)"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
shellLaunch "http://doc.crymod.com/AssetCreation/" ""
|
|
)
|
|
--Added by Glen Schulz:
|
|
MacroScript CryMakeBlendShader category:"CryTools" tooltip:"Make DirectX Blend Shader from Max material"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryMakeBlendShader.ms")
|
|
)
|
|
|
|
-- Keybindings
|
|
MacroScript preserveUV category:"CryKeys" tooltip:"preserveUV"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\preserveUVs.ms")
|
|
)
|
|
MacroScript centerPivot category:"CryKeys" tooltip:"centerPivot"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\centerPivot.ms")
|
|
)
|
|
MacroScript resetXformCollapse category:"CryKeys" tooltip:"resetXformCollapse"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\resetXformCollapse.ms")
|
|
)
|
|
MacroScript exportNodes category:"CryKeys" tooltip:"exportNodes"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\exportNodes.ms")
|
|
)
|
|
MacroScript exportAnim category:"CryKeys" tooltip:"exportAnim"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\exportAnim.ms")
|
|
)
|
|
MacroScript AddToExportList category:"CryKeys" tooltip:"AddToExportList"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\AddToExportList.ms")
|
|
)
|
|
MacroScript UVcollapseVertical category:"CryKeys" tooltip:"UV Collapse Vertical"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\UVcollapseVertical.ms")
|
|
)
|
|
MacroScript UVcollapseHorizontal category:"CryKeys" tooltip:"UV Collapse Horizontal"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\UVcollapseHorizontal.ms")
|
|
)
|
|
MacroScript UVscaleUniform category:"CryKeys" tooltip:"UV Scale Uniform"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\UVscaleUniform.ms")
|
|
)
|
|
MacroScript changeRefCoordSys category:"CryKeys" tooltip:"Change Reference Coordinate System"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\changeRefCoordsys.ms")
|
|
)
|
|
MacroScript showVertexColors category:"CryKeys" tooltip:"Show/Hide Vertex Colors"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\showVertexColors.ms")
|
|
)
|
|
MacroScript showVertexAlpha category:"CryKeys" tooltip:"Show/Hide Vertex Alpha"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\showVertexAlpha.ms")
|
|
)
|
|
MacroScript collapseByLoc category:"CryKeys" tooltip:"MorphTools: Collapse"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\collapseByLoc.ms")
|
|
)
|
|
MacroScript LimERing category:"CryKeys" tooltip:"Limited Edge/Vert Ring"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\LimERing.ms")
|
|
)
|
|
MacroScript LimELoop category:"CryKeys" tooltip:"Limited Edge/Vert/Poly Loop"
|
|
(
|
|
on isVisible do
|
|
(
|
|
if cryTools != undefined then
|
|
return true
|
|
else
|
|
return false
|
|
)
|
|
|
|
on execute do
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\CryKey\\LimELoop.ms")
|
|
)
|
|
)
|
|
setupMacros = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.setupVars = fn setucpVars =
|
|
(
|
|
crytools.maxDirTxt = maxDirTxt_crytools
|
|
cryTools.cryINI = cryINI_crytools
|
|
cryTools.editorPath = editorPath_crytools
|
|
cryTools.BuildPathFull = BuildPathFull_crytools
|
|
cryTools.perforcePath = cryTools.getPerforcePath()
|
|
cryTools._fnStore = #()
|
|
cryTools._fnStoreIndex = #()
|
|
cryTools._varStore = #()
|
|
cryTools._varStoreIndex = #()
|
|
crytools.cryExportPresent = false
|
|
|
|
cryTools.PreExportWarnings = #()
|
|
|
|
--set vars because, well, yeah
|
|
crytools.reparenttwist = false
|
|
crytools.suppresswarnings = false
|
|
crytools.warnmats = false
|
|
crytools.nounparentw = false
|
|
crytools.texturesOK = true
|
|
|
|
if (cryTools.existDir (sysInfo.tempDir + "cry_temp")) == false then
|
|
cryTools.scmd ("MKDIR \"" + sysInfo.tempDir + "cry_temp\"") true
|
|
|
|
buildpatharray = filterstring crytools.BuildPathFull "\\"
|
|
crytools.project_name = buildpatharray[buildPathArray.count]
|
|
print (crytools.project_name + " is set as current project.")
|
|
|
|
print "Retrieving list of latest builds from \\\\Storage\\builds"
|
|
|
|
if doesfileexist "\\\\storage\\builds\\procedurally_generated_builds" == true then
|
|
(
|
|
if doesfileexist (crytools.BuildPathFull + "tools\maxscript\scmd.exe") != false then
|
|
crytools.scmd ("DIR \\\\storage\\builds\\procedurally_generated_builds\\ /B /O-D > \"" + sysInfo.tempDir + "cry_temp\\crytools.latest_builds.txt\"") true
|
|
|
|
sleep .7
|
|
)
|
|
else
|
|
(
|
|
crytools.latestbuildnumber = "NET_ERROR"
|
|
crytools.latest_build = "NET_ERROR"
|
|
)
|
|
|
|
if crytools.latestbuildnumber != "NET_ERROR" then
|
|
(
|
|
if doesfileexist (sysInfo.tempDir + "cry_temp\\crytools.latest_builds.txt") == true then
|
|
(
|
|
if doesfileexist "\\\\storage\\builds\\procedurally_generated_builds" != true then
|
|
(
|
|
print "Cannot find \\\\storage\\builds\\procedurally_generated_builds\\"
|
|
return undefined
|
|
)
|
|
latest_build_list = openFile (sysInfo.tempDir + "cry_temp\\crytools.latest_builds.txt")
|
|
crytools.latest_build = (readline latest_build_list)
|
|
if crytools.latest_build == "TempBuildCopy" then
|
|
(
|
|
skipToNextLine latest_build_list
|
|
crytools.latest_build = (readline latest_build_list)
|
|
)
|
|
if crytools.latest_build == "MP" then
|
|
(
|
|
skipToNextLine latest_build_list
|
|
crytools.latest_build = (readline latest_build_list)
|
|
)
|
|
if crytools.latest_build == "TempBuildCopy" then
|
|
(
|
|
skipToNextLine latest_build_list
|
|
crytools.latest_build = (readline latest_build_list)
|
|
)
|
|
buildnumberArray = filterstring crytools.latest_build "()"
|
|
crytools.latestbuildnumber = buildnumberArray[2]
|
|
close latest_build_list
|
|
)
|
|
)
|
|
|
|
|
|
|
|
if (doesfileexist (sysInfo.tempDir + "cry_temp\\hash.txt")) == true then
|
|
(
|
|
deleteFile (sysInfo.tempDir + "cry_temp\\hash.txt")
|
|
)
|
|
|
|
|
|
print crytools.BuildPathFull
|
|
if doesfileexist ((crytools.BuildPathFull + "Code_Changes.txt")) == false then
|
|
(
|
|
print "Code_Changes.txt cannot be found in your build directory"
|
|
)
|
|
else
|
|
(
|
|
perf_path = (crytools.BuildPathFull + "Code_Changes.txt")
|
|
perf_changes = openFile perf_path
|
|
skipToString perf_changes "in Build "
|
|
local_build_line = (readLine perf_changes)
|
|
local_buildArray = (filterString local_build_line "-")
|
|
crytools.localBuildNumber = local_buildArray[1]
|
|
)
|
|
|
|
cryTools.cbapath = cryTools.buildpathfull + "Game\\Animations\Animations.cba"
|
|
|
|
--get the crytools.DOMAIN
|
|
cryTools.DOMAIN = cryTools.inFromINI "CryTools" "domain"
|
|
if cryTools.DOMAIN == "" then (cryTools.outToINI "CryTools" "DOMAIN" (cryTools.getDNS()) ; cryTools.DOMAIN = cryTools.getDNS())
|
|
|
|
--get crytools.warnmats
|
|
cryTools.warnmats = cryTools.inFromINI "CryTools" "warnmats"
|
|
if cryTools.warnmats == "" then (cryTools.outToINI "CryTools" "warnmats" "true" ; cryTools.warnmats = true)
|
|
else if cryTools.warnmats == "true" then cryTools.warnmats = true else cryTools.warnmats = false
|
|
|
|
--get crytools.reparenttwist
|
|
cryTools.reparenttwist = cryTools.inFromINI "CryTools" "reparent"
|
|
if cryTools.reparenttwist == "" then (cryTools.outToINI "CryTools" "reparent" "true" ; cryTools.reparenttwist = true)
|
|
else if cryTools.reparenttwist == "true" then cryTools.reparenttwist = true else cryTools.reparenttwist = false
|
|
|
|
--get crytools.suppresswarnings
|
|
cryTools.suppresswarnings = cryTools.inFromINI "CryTools" "suppress"
|
|
if cryTools.suppresswarnings == "" then (cryTools.outToINI "CryTools" "suppress" "false" ; cryTools.suppresswarnings = false)
|
|
else if cryTools.suppresswarnings == "true" then cryTools.suppresswarnings = true else cryTools.suppresswarnings = false
|
|
|
|
--get unParentW
|
|
cryTools.nounparentw = cryTools.inFromINI "CryTools" "no_unparent_weapons"
|
|
if cryTools.nounparentw == "" then (cryTools.outToINI "CryTools" "no_unparent_weapons" "true" ; cryTools.nounparentw = true)
|
|
else if cryTools.nounparentw == "true" then cryTools.nounparentw = true else cryTools.nounparentw = false
|
|
|
|
--get crytools.showSplash
|
|
cryTools.showSplash = cryTools.inFromINI "CryTools" "splash"
|
|
if cryTools.showSplash == "" then (cryTools.outToINI "CryTools" "splash" "true" ; cryTools.showSplash = true)
|
|
else if cryTools.showSplash == "true" then cryTools.showSplash = true else cryTools.showSplash = false
|
|
|
|
--get ActivateAnimTools
|
|
cryTools.loadOldAnimTools = cryTools.inFromINI "CryTools" "loadOld_animTools"
|
|
if cryTools.loadOldAnimTools == "" then (cryTools.outToINI "CryTools" "loadOld_animTools" "false" ; cryTools.loadOldAnimTools = false)
|
|
else if cryTools.loadOldAnimTools == "true" then cryTools.loadOldAnimTools = true else cryTools.loadOldAnimTools = false
|
|
|
|
--get crytools.checkbeforeexport
|
|
cryTools.checkbeforeexport = cryTools.inFromINI "CryTools" "checkExport"
|
|
if cryTools.checkbeforeexport == "" then (cryTools.outToINI "CryTools" "checkExport" "true" ; cryTools.checkbeforeexport = true)
|
|
else if cryTools.checkbeforeexport == "true" then cryTools.checkbeforeexport = true else cryTools.checkbeforeexport = false
|
|
)
|
|
setupVars = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.setupCallbacks = fn setupCallbacks =
|
|
(
|
|
--cryinfo callback
|
|
callbacks.removescripts id:#setMacros
|
|
callbacks.addscript #filePostOpen ("macros.run \"CryTools\" \"CryInfoLoader\"") id:#setMacros
|
|
--sliderMan callback
|
|
callbacks.removescripts id:#sliderManCall
|
|
callbacks.addScript #selectionSetChanged "crytools.sliderMan()" id:#sliderManCall
|
|
--update menu
|
|
callbacks.removescripts id:#updateMenu
|
|
callbacks.addscript #preSystemShutdown ("try (menuMan.unRegisterMenu (menuMan.findMenu \"CryTools\") ) catch()") id:#updateMenu
|
|
|
|
|
|
)
|
|
setupCallbacks = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.setupPlugins = fn setupPlugins =
|
|
(
|
|
cryTools.maxVersionNum = (maxVersion())[1] / 1000
|
|
print ("Loading CryTools for Max" + cryTools.maxVersionNum as String)
|
|
|
|
-- See if cryExport is in the plugins folder
|
|
case crytools.maxVersionNum of
|
|
(
|
|
7: if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport7.dlu") == true then ( crytools.cryExportPresent = true )
|
|
8: if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport8.dlu") == true then ( crytools.cryExportPresent = true )
|
|
9: if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport9.dlu") == true or doesfileexist (crytools.maxDirTxt + "plugins\\CryExport9_64.dlu") then ( crytools.cryExportPresent = true )
|
|
10: if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport10.dlu") == true or doesfileexist (crytools.maxDirTxt + "plugins\\CryExport10_64.dlu") then ( crytools.cryExportPresent = true )
|
|
)
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
--update the loader
|
|
-------------------------------------------------------------------------------
|
|
if doesfileexist (crytools.BuildPathFull + "Tools\\maxscript\\LoadCryTools.ms") != false then
|
|
(
|
|
newLoader = (crytools.md5 (crytools.BuildPathFull + "Tools\\maxscript\\LoadCryTools.ms"))
|
|
oldLoader = (crytools.md5 (crytools.maxDirTxt + "scripts\\startup\\LoadCryTools.ms"))
|
|
if newLoader != oldLoader then
|
|
(
|
|
crytools.minusR (getDir #maxroot + "Scripts\\Startup\\LoadCryTools.ms")
|
|
if (queryBox "Different CryLoader found in the Build.\n\nDo you want to update the Loader?" title:"CryTools") == true then
|
|
(
|
|
cryTools.scmd ("move /Y " + ("\"" + crytools.maxDirTxt + "sctipts\\startup\\LoadCryTools.ms\"") + " " + ("\"" + sysInfo.tempDir + "cry_temp\\\"")) true
|
|
cryTools.scmd ("copy /Y " + ("\"" + crytools.BuildPathFull + "Tools\\maxscript\\LoadCryTools.ms\"") + " " + ("\"" + crytools.maxDirTxt + "scripts\\startup\\\"")) true
|
|
--messagebox "The cryTools loader has been updated, cryTools will now reload with the updated loader."
|
|
print "Updated cryTools loader."
|
|
|
|
return true
|
|
)
|
|
--return undefined
|
|
)
|
|
)
|
|
|
|
|
|
if crytools.maxVersionNum == 7 then
|
|
(
|
|
messageBox "Max Version is unsupported for CryTools." title:"Error loading CryTools"
|
|
return undefined
|
|
)
|
|
|
|
-- Check/Install CryExport8.dlu using the MD5 hash
|
|
if crytools.maxVersionNum == 8 then
|
|
(
|
|
if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport7.dlu") == true then
|
|
(
|
|
messageBox "You have CryExport7.dlu installed when you are running Max 8.\nPlease remove CryExport7 and reinstall cryTools or drop CryExport8 in it's place."
|
|
return undefined
|
|
)
|
|
|
|
-- check for location of the exporter
|
|
if crytools.existfile (crytools.maxDirTxt + "plugins\\CryExport8.dlu") == false then
|
|
(
|
|
crytools.scmd ("move /Y " + ("\"" + crytools.BuildPathFull + "Tools\\CryExport8.dlu\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true
|
|
if crytools.existfile (crytools.maxDirTxt + "plugins\\CryExport8.dlu") == false then
|
|
(
|
|
messageBox "I cannot find your CryExport8.dlu.\nIt isn't in your build directory, and it isn't in your plugins folder; what have you done with it?" title: "Error!"
|
|
return undefined
|
|
)
|
|
)
|
|
|
|
if doesfileexist (crytools.BuildPathFull + "Tools\\CryExport8.dlu") == false then
|
|
(
|
|
print ((crytools.BuildPathFull + "Tools\\CryExport8.dlu") + " does not exist!")
|
|
)
|
|
else
|
|
(
|
|
--check for +r on old cryExport
|
|
if doesfileexist (sysInfo.tempDir + "cry_temp\\cryExport8.dlu") == true then
|
|
(
|
|
cryTools.scmd ("attrib -r \"" + sysInfo.tempDir + "cry_temp\\cryExport8.dlu\"") true
|
|
)
|
|
newCryExport = (crytools.md5 (crytools.BuildPathFull + "Tools\\CryExport8.dlu"))
|
|
if crytools.md5 (crytools.maxDirTxt + "plugins\\CryExport8.dlu") != newCryExport then
|
|
(
|
|
if crytools.rollback_status == "false" then
|
|
(
|
|
if (queryBox "A new version of CryExport8.dlu is available, do you want to synch it?" title:"Update CryExport") == true then
|
|
(
|
|
print ("Installing latest CryExport plugin to " + (crytools.maxDirTxt + "plugins\\CryExport8.dlu"))
|
|
scmd ("move /Y " + ("\"" + crytools.maxDirTxt + "plugins\\CryExport8.dlu\"") + " " + ("\"" + sysInfo.tempDir + "cry_temp\\\""))true
|
|
scmd ("move /Y " + ("\"" + crytools.BuildPathFull + "Tools\\CryExport8.dlu\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true
|
|
output_rollbackINI = createfile (sysInfo.tempDir + "\\cry_temp\\crytools.rollback_status.ini")
|
|
format crytools.rollback_status to: output_rollbackINI
|
|
close output_rollbackINI
|
|
print ("Installed newer version of CryExport (" + (newCryExport as string) + ") plugin to " + (crytools.maxDirTxt + "plugins\\" + cryExportName) + " please restart save your work and restart Max.")
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
-- Check/Install CryExport9.dlu using the MD5 hash
|
|
if crytools.maxVersionNum == 9 then
|
|
(
|
|
if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport8.dlu") == true then
|
|
(
|
|
messageBox "You have CryExport8.dlu installed when you are running Max 9.\nPlease remove CryExport8 and reinstall cryTools or drop CryExport9 in it's place."
|
|
return undefined
|
|
)
|
|
|
|
cryExportName = "CryExport9.dlu"
|
|
-- check for location of the exporter
|
|
if is64bitApplication != undefined then
|
|
(
|
|
if is64bitApplication() == true then
|
|
cryExportName = "CryExport9_64.dlu"
|
|
)
|
|
|
|
|
|
if crytools.existfile (crytools.maxDirTxt + "plugins\\" + cryExportName) == false then
|
|
(
|
|
cryTools.scmd ("move /Y " + ("\"" + crytools.BuildPathFull + "Tools\\" + cryExportName + "\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true
|
|
if crytools.existfile (crytools.maxDirTxt + "plugins\\" + cryExportName) == false then
|
|
(
|
|
--messageBox "I cannot find your CryExport9.dlu.\nIt isn't in your build directory, and it isn't in your plugins folder; what have you done with it?" title: "Error!"
|
|
print ("Cannot find " + cryExportName)
|
|
return undefined
|
|
)
|
|
)
|
|
|
|
if doesfileexist (crytools.BuildPathFull + "Tools\\" + cryExportName) == false then
|
|
(
|
|
print ((crytools.BuildPathFull + "Tools\\" + cryExportName) + " does not exist!")
|
|
--return undefined
|
|
)
|
|
else
|
|
(
|
|
--check for +r on old cryExport
|
|
if doesfileexist (sysInfo.tempDir + "cry_temp\\" + cryExportName) == true then
|
|
(
|
|
cryTools.scmd ("attrib -r \"" + sysInfo.tempDir + "cry_temp\\" + cryExportName + "\"") true
|
|
)
|
|
newCryExport = (crytools.md5 (crytools.BuildPathFull + "Tools\\" + cryExportName))
|
|
if crytools.md5 (crytools.maxDirTxt + "plugins\\" + cryExportName) != newCryExport then
|
|
(
|
|
if crytools.rollback_status == "false" then
|
|
(
|
|
print ("Installing latest CryExport plugin to " + (crytools.maxDirTxt + "plugins\\" + cryExportName))
|
|
cryTools.scmd ("move /Y " + ("\"" + crytools.maxDirTxt + "plugins\\" + cryExportName +"\"") + " " + ("\"" + sysInfo.tempDir + "cry_temp\\\"")) true
|
|
cryTools.scmd ("move /Y " + ("\"" + crytools.BuildPathFull + "Tools\\" + cryExportName + "\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true
|
|
output_rollbackINI = createfile (sysInfo.tempDir + "\\cry_temp\\crytools.rollback_status.ini")
|
|
format crytools.rollback_status to: output_rollbackINI
|
|
close output_rollbackINI
|
|
)
|
|
--messageBox ("Installed newer version of CryExport (" + (newCryExport as string) + ") plugin to " + (crytools.maxDirTxt + "plugins\\" + cryExportName) + " please restart save your work and restart Max.") title: ((crytools.maxDirTxt + "plugins\\" + cryExportName) + " installed!")
|
|
print ("Installed newer version of CryExport (" + (newCryExport as string) + ") plugin to " + (crytools.maxDirTxt + "plugins\\" + cryExportName) + " please restart save your work and restart Max.")
|
|
)
|
|
)
|
|
)
|
|
|
|
|
|
|
|
-- Check/Install CryExport9.dlu using the MD5 hash
|
|
if crytools.maxVersionNum == 10 then
|
|
(
|
|
if doesfileexist (crytools.maxDirTxt + "plugins\\CryExport9.dlu") == true then
|
|
(
|
|
messageBox "You have CryExport9.dlu installed when you are running Max 10.\nPlease remove CryExport9 and reinstall cryTools or drop CryExport10 in it's place."
|
|
return undefined
|
|
)
|
|
|
|
cryExportName = "CryExport10.dlu"
|
|
-- check for location of the exporter
|
|
if is64bitApplication != undefined then
|
|
(
|
|
if is64bitApplication() == true then
|
|
cryExportName = "CryExport10_64.dlu"
|
|
)
|
|
|
|
|
|
if crytools.existfile (crytools.maxDirTxt + "plugins\\" + cryExportName) == false then
|
|
(
|
|
cryTools.scmd ("move /Y " + ("\"" + crytools.BuildPathFull + "Tools\\" + cryExportName + "\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true
|
|
if crytools.existfile (crytools.maxDirTxt + "plugins\\" + cryExportName) == false then
|
|
(
|
|
--messageBox "I cannot find your CryExport9.dlu.\nIt isn't in your build directory, and it isn't in your plugins folder; what have you done with it?" title: "Error!"
|
|
print ("Cannot find " + cryExportName)
|
|
return undefined
|
|
)
|
|
)
|
|
|
|
if doesfileexist (crytools.BuildPathFull + "Tools\\" + cryExportName) == false then
|
|
(
|
|
print ((crytools.BuildPathFull + "Tools\\" + cryExportName) + " does not exist!")
|
|
--return undefined
|
|
)
|
|
else
|
|
(
|
|
--check for +r on old cryExport
|
|
if doesfileexist (sysInfo.tempDir + "cry_temp\\" + cryExportName) == true then
|
|
(
|
|
cryTools.scmd ("attrib -r \"" + sysInfo.tempDir + "cry_temp\\" + cryExportName + "\"") true
|
|
)
|
|
newCryExport = (crytools.md5 (crytools.BuildPathFull + "Tools\\" + cryExportName))
|
|
if crytools.md5 (crytools.maxDirTxt + "plugins\\" + cryExportName) != newCryExport then
|
|
(
|
|
if crytools.rollback_status == "false" then
|
|
(
|
|
print ("Installing latest CryExport plugin to " + (crytools.maxDirTxt + "plugins\\" + cryExportName))
|
|
cryTools.scmd ("move /Y " + ("\"" + crytools.maxDirTxt + "plugins\\" + cryExportName +"\"") + " " + ("\"" + sysInfo.tempDir+ "cry_temp\\\"")) true
|
|
cryTools.scmd ("move /Y " + ("\"" + crytools.BuildPathFull + "Tools\\" + cryExportName + "\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true
|
|
output_rollbackINI = createfile (sysInfo.tempDir + "\\cry_temp\\crytools.rollback_status.ini")
|
|
format crytools.rollback_status to: output_rollbackINI
|
|
close output_rollbackINI
|
|
)
|
|
--messageBox ("Installed newer version of CryExport (" + (newCryExport as string) + ") plugin to " + (crytools.maxDirTxt + "plugins\\CryExport9.dlu") + " please restart save your work and restart Max.") title: ((crytools.maxDirTxt + "plugins\\" + cryExportName) + " installed!")
|
|
print ("Installed newer version of CryExport (" + (newCryExport as string) + ") plugin to " + (crytools.maxDirTxt + "plugins\\" + cryExportName) + " please restart save your work and restart Max.")
|
|
)
|
|
)
|
|
)
|
|
|
|
|
|
|
|
-- Check/Install AutoDesk Physique Maxscript Exposure
|
|
if is64bitApplication == undefined then
|
|
(
|
|
if getFileSize (crytools.maxDirTxt + "plugins\\IPhysique.gup") != 25088 then
|
|
(
|
|
--messageBox ("Installing latest AutoDesk Physique Exposure plugin to "+ (crytools.maxDirTxt + "plugins\\IPhysique.gup") + " please restart save your work and restart Max.") title: ((crytools.maxDirTxt + "plugins\\IPhysique.gup") + " installed!")
|
|
print ("Installing latest AutoDesk Physique Exposure plugin to "+ (crytools.maxDirTxt + "plugins\\IPhysique.gup") + " please restart save your work and restart Max.")
|
|
cryTools.scmd ("copy /Y \"" + (crytools.BuildPathFull + "Tools\\maxscript\\autoinstall\\IPhysique.gup\"") + " " + ("\"" + crytools.maxDirTxt + "plugins\\\"")) true
|
|
)
|
|
else
|
|
(
|
|
print "no new cryexport"
|
|
)
|
|
)
|
|
|
|
|
|
return false
|
|
)
|
|
setupPlugins = undefined
|
|
|
|
|
|
|
|
|
|
cryTools.setupTools = fn setupTools =
|
|
(
|
|
cryTools.setupVars()
|
|
|
|
|
|
if perforcePath_crytools != undefined then
|
|
(
|
|
if doesfileexist (BuildPathFull_crytools + "tools\\maxscript\\md5.exe") == false then
|
|
(
|
|
cryTools.scmd ("p4 sync \"" + BuildPathFull_crytools + "Tools\\...\"") true
|
|
|
|
print "syncing p4 to get md5.exe"
|
|
)
|
|
)
|
|
|
|
|
|
if crytools.showSplash == true then
|
|
(
|
|
global crysplash
|
|
rollout crySplash ""
|
|
(
|
|
label version "Version 2.0" pos:[9,108]
|
|
label build "" pos:[160,108] text:"TOOLS LOADING"
|
|
|
|
on crySplash lbuttonup position do (destroyDialog crysplash)
|
|
)
|
|
bm = (openBitmap (crytools.BuildPathFull + "Tools\\maxscript\\icons\\splash.png"))
|
|
createDialog crysplash style:#(#style_border) modal:false bitmap:bm width:bm.width height:bm.height fgcolor:white
|
|
|
|
)
|
|
|
|
|
|
|
|
if crytools.showSplash == true then
|
|
crysplash.build.text = "ENV CHECK"
|
|
|
|
|
|
global loadingResult = cryTools.setupPlugins()
|
|
if loadingResult == undefined or loadingResult == true then
|
|
return undefined
|
|
|
|
cryTools.setupCallbacks()
|
|
cryTools.generateMenu()
|
|
cryTools.setupMacros()
|
|
|
|
if cryTools.loadOldAnimTools == false then
|
|
(
|
|
try
|
|
(
|
|
filein (crytools.BuildPathFull + "Tools\\maxscript\\cryAnim\\load.ms")
|
|
)
|
|
catch ( print "Error loading cryAnim Tools." )
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
if crytools.showSplash == true then
|
|
(
|
|
crysplash.build.text = ("BUILD: " + (crytools.localBuildNumber as string) + "/" + (crytools.latestbuildnumber as string))
|
|
sleep .5
|
|
destroydialog crysplash
|
|
)
|
|
)
|
|
setupTools = undefined
|
|
|
|
|
|
-----------------------------------------------------------------------------------------
|
|
--------------------------CHECKING SCENE FOR EXPORT--------------------------
|
|
-----------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
crytools.CheckObjMat = fn CheckObjMat =
|
|
(
|
|
--crytools.ObjMatOk = true
|
|
for obj in csexport.export.get_node_list() do
|
|
(
|
|
if crytools.warnmats == true then
|
|
(
|
|
if obj.children.count != 0 then
|
|
(
|
|
for obj1 in (crytools.getChildren obj) do
|
|
(
|
|
if obj1.material == undefined then
|
|
(
|
|
if (classof obj1) != Dummy then
|
|
(
|
|
append crytools.PreExportWarnings ("There is no defined shader for this object! " + obj1.name)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
else
|
|
(
|
|
if obj.material == undefined then
|
|
(
|
|
if (classof obj) != Dummy then
|
|
(
|
|
append crytools.PreExportWarnings ("There is no defined shader for this object! " + obj.name)
|
|
)
|
|
)
|
|
)
|
|
|
|
try
|
|
(
|
|
if crytools.texturesOK == true then
|
|
(
|
|
if obj.children.count != 0 then
|
|
(
|
|
for obj1 in (crytools.getChildren obj) do
|
|
(
|
|
if (classof obj1) != Dummy then
|
|
(
|
|
if obj1.material != undefined then
|
|
(
|
|
materials = obj1.material.materialIDlist
|
|
for i = 1 to materials.count do
|
|
(
|
|
checkme = obj1.material.material[i].shadername
|
|
if checkme != "Crytek Shader" then
|
|
(
|
|
append crytools.PreExportWarnings ("The following material is not set to the Crytek Shader: " + obj1.material.material[i].name)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
else
|
|
(
|
|
if (classof obj) != Dummy then
|
|
(
|
|
if obj.material != undefined then
|
|
(
|
|
materials = obj.material.materialIDlist
|
|
for i = 1 to materials.count do
|
|
(
|
|
checkme = obj.material.material[i].shadername
|
|
if checkme != "Crytek Shader" then
|
|
(
|
|
append crytools.PreExportWarnings ("The following material is not set to the Crytek Shader: " + obj.material.material[i].name)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
catch
|
|
(
|
|
if (classof obj) != Dummy then
|
|
(
|
|
if obj.material != undefined then
|
|
(
|
|
if (classof obj.material) == MultiMaterial then
|
|
(
|
|
materials = obj.material.materialList
|
|
if materials.count > 0 then
|
|
(
|
|
if materials.count > 32 then
|
|
(
|
|
append crytools.PreExportWarnings ("material '" + obj.material.name + " has '" + materials.count as string + "' number of submaterials, you may wish to clean the multimaterial using max, its on the utilities menu in the material editor")
|
|
)
|
|
|
|
for i = 1 to materials.count do
|
|
(
|
|
if i <= 32 then
|
|
(
|
|
checkme = obj.material.material[i].shadername
|
|
if checkme != "Crytek Shader" then
|
|
(
|
|
append crytools.PreExportWarnings ("The following material is not set to the Crytek Shader: " + obj.material.material[i].name)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
else
|
|
(
|
|
checkme = obj.material.shadername
|
|
if checkme != "Crytek Shader" then
|
|
(
|
|
append crytools.PreExportWarnings ("The following material is not set to the Crytek Shader: " + obj.material.name)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
crytools.ReparentTwistBns = fn ReparentTwistBns =
|
|
(
|
|
if $'Bip01 R ForeTwist' != undefined then
|
|
(
|
|
if $'Bip01 R ForeTwist'.parent.name != "Bip01 R Forearm" then
|
|
(
|
|
$'Bip01 R ForeTwist'.parent = $'Bip01 R Forearm'
|
|
if crytools.suppresswarnings == true then
|
|
(
|
|
print "Biped lower arm twist bones reparented."
|
|
)
|
|
else
|
|
(
|
|
messageBox "Biped lower arm twist bones reparented."
|
|
)
|
|
)
|
|
if $'Bip01 L ForeTwist'.parent.name != "Bip01 L Forearm" then
|
|
(
|
|
$'Bip01 L ForeTwist'.parent = $'Bip01 L Forearm'
|
|
)
|
|
)
|
|
|
|
if $'Bip01 LUpArmTwist' != undefined then
|
|
(
|
|
if $'Bip01 LUpArmTwist'.parent.name != "Bip01 L UpperArm" then
|
|
(
|
|
$'Bip01 LUpArmTwist'.parent = $'Bip01 L UpperArm'
|
|
if crytools.suppresswarnings == true then
|
|
(
|
|
print "Biped upper arm twist bones reparented."
|
|
)
|
|
else
|
|
(
|
|
messageBox "Biped upper arm twist bones reparented."
|
|
)
|
|
)
|
|
if $'Bip01 RUpArmTwist'.parent.name != "Bip01 R UpperArm" then
|
|
(
|
|
$'Bip01 RUpArmTwist'.parent = $'Bip01 R UpperArm'
|
|
)
|
|
)
|
|
)
|
|
|
|
crytools.WpnBnUnlink = fn WpnBnUnlink =
|
|
(
|
|
if $weapon_bone != undefined then
|
|
(
|
|
if $weapon_bone.children.count != 0 then
|
|
(
|
|
undo "unlinking $weapon_bone children" on
|
|
(
|
|
for obj in $weapon_bone.children do
|
|
(
|
|
obj.parent = undefined
|
|
if crytools.suppresswarnings == true then
|
|
(
|
|
print "unlinking $weapon_bone children"
|
|
)
|
|
else
|
|
(
|
|
messagebox "unlinking $weapon_bone children"
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
crytools.CheckNodeTm = fn CheckNodeTm =
|
|
(
|
|
for obj in csexport.export.get_node_list() do
|
|
(
|
|
---check rotation---
|
|
t = obj.rotation
|
|
if (t.x*t.x + t.y*t.y + t.z*t.z) > 0.0001 then
|
|
(
|
|
append crytools.PreExportWarnings ("The object '" + obj.name + "' has a rotation applied to it " + ((obj.rotation as eulerangles) as string) + "\nPlease Reset Xform the object before exporting.")
|
|
)
|
|
---check scale---
|
|
t = obj.scale - [1,1,1]
|
|
if (t.x*t.x + t.y*t.y + t.z*t.z) > 0.0001 then
|
|
(
|
|
append crytools.PreExportWarnings ("The object '" + obj.name + "' has an abnormal scale " + ((obj.scale) as string) + "\nPlease Reset Xform the object before exporting.\nScale should be [1,1,1]")
|
|
)
|
|
)
|
|
)
|
|
|
|
crytools.CheckNonZeroMorphs = fn CheckNonZeroMorphs =
|
|
(
|
|
for obj in csexport.export.get_node_list() do
|
|
(
|
|
try
|
|
(
|
|
for i = 1 to 1000 do
|
|
(
|
|
test = obj.morpher[i].name
|
|
if test == "- empty -" then
|
|
(
|
|
exit loop
|
|
)
|
|
if obj.morpher[i].value != 0.0 then
|
|
(
|
|
append crytools.PreExportWarnings (test + " has a non zero value! " + "(" + (obj.morpher[i].value as string) + ")")
|
|
)
|
|
)
|
|
)
|
|
catch()
|
|
)
|
|
)
|
|
|
|
crytools.CheckBnScale = fn CheckBnScale =
|
|
(
|
|
for obj in csexport.export.get_bone_list() do
|
|
(
|
|
try
|
|
(
|
|
if obj.children.count != 0 then
|
|
(
|
|
for obj1 in (crytools.getChildren obj) do
|
|
(
|
|
t = obj1.scale - [1,1,1]
|
|
if (t.x*t.x + t.y*t.y + t.z*t.z) > 0.0001 then
|
|
(
|
|
append crytools.PreExportWarnings (obj1.name + " has a scale applied: " + (obj1.scale as string) + "\nPlease reset it's scale before exporting.")
|
|
)
|
|
)
|
|
)
|
|
else
|
|
(
|
|
t = obj.scale - [1,1,1]
|
|
if (t.x*t.x + t.y*t.y + t.z*t.z) > 0.0001 then
|
|
(
|
|
append crytools.PreExportWarnings (obj.name + " has a non zero scale (" + (obj.scale as string) + ")\nPlease reset it's scale before exporting.")
|
|
)
|
|
)
|
|
)
|
|
catch()
|
|
)
|
|
)
|
|
|
|
crytools.CheckVerts = fn CheckVerts =
|
|
(
|
|
for obj in csexport.export.get_node_list() do
|
|
(
|
|
try
|
|
(
|
|
ClsVrts = #()
|
|
VertsArr = #()
|
|
for x in obj.verts do
|
|
(
|
|
Vrts = #(x.index, x.pos.x, x.pos.y, x.pos.z)
|
|
append VertsArr Vrts
|
|
)
|
|
|
|
fn CompareFN v1 v2 =
|
|
(
|
|
local d = (length [v1[2],v1[3],v1[4]]) - (length [v2[2],v2[3],v2[4]])
|
|
case of
|
|
(
|
|
(d < 0) : -1
|
|
(d > 0) : 1
|
|
default: 0
|
|
)
|
|
)
|
|
|
|
qsort VertsArr CompareFN
|
|
|
|
for x = 1 to VertsArr.count do
|
|
(
|
|
if VertsArr[x+1] != undefined then
|
|
(
|
|
DiffX = (VertsArr[x+1][2] - VertsArr[x][2])
|
|
if DiffX == 0 then DiffX = 0.001
|
|
if DiffX < 0.08 and DiffX > -0.08 then
|
|
(
|
|
DiffY = (VertsArr[x+1][3] - VertsArr[x][3])
|
|
if DiffY == 0 then DiffY = 0.001
|
|
if DiffY < 0.08 and DiffY > -0.08 then
|
|
(
|
|
DiffZ = (VertsArr[x+1][4] - VertsArr[x][4])
|
|
if DiffZ == 0 then DiffZ = 0.001
|
|
if DiffZ < 0.08 and DiffZ > -0.08 then
|
|
(
|
|
if (distance [VertsArr[x+1][2],VertsArr[x+1][3],VertsArr[x+1][4]] [VertsArr[x][2],VertsArr[x][3],VertsArr[x][4]]) < 0.08 then
|
|
(
|
|
Tmp = #()
|
|
append Tmp VertsArr[x+1][1]
|
|
append Tmp VertsArr[x][1]
|
|
append ClsVrts Tmp
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
if ClsVrts.count != 0 then
|
|
(
|
|
SelVerts = #{}
|
|
Txt = ""
|
|
for x in ClsVrts do
|
|
(
|
|
if (FindItem ClsVrts x) == ClsVrts.count then
|
|
(
|
|
Txt += (x as string) + ". "
|
|
)
|
|
else
|
|
(
|
|
Txt += (x as string) + ", "
|
|
)
|
|
for num in x do
|
|
(
|
|
append SelVerts num
|
|
)
|
|
)
|
|
append crytools.PreExportWarnings (obj.name + " has these verts too close to each other: " + Txt + "Please move them further appart.")
|
|
if ($.baseobject as string) == "Editable Poly" then
|
|
(
|
|
polyop.setVertSelection obj SelVerts
|
|
)
|
|
else
|
|
(
|
|
SetVertSelection obj SelVerts
|
|
)
|
|
)
|
|
)
|
|
catch (print "Object is not a mesh/poly!")
|
|
)
|
|
)
|
|
|
|
-- check scene for export
|
|
crytools.CheckSceneForExport = fn CheckSceneForExport =
|
|
(
|
|
--try
|
|
--(
|
|
if crytools.checkbeforeexport == false then return true
|
|
|
|
crytools.texturesOK = true
|
|
crytools.PreExportWarnings = #()
|
|
----------------------Material Check-----------------------------------------------
|
|
crytools.CheckObjMat ()
|
|
----------------------Vertex Check-------------------------------------------------
|
|
crytools.CheckVerts ()
|
|
-------------------------Reparent---------------------------------------------------
|
|
if crytools.reparenttwist == true then ReparentTwistBns ()
|
|
------------------Weapon Bone Unlinking-------------------------------------------
|
|
-- check for children of the weapon bone
|
|
if crytools.nounparentw == false then WpnBnUnlink ()
|
|
-----------------check for non zero morphs-----------------------------------------
|
|
crytools.CheckNonZeroMorphs ()
|
|
---------------check if reset transform needed------------------------------------
|
|
crytools.CheckNodeTm ()
|
|
----------------------check bone scale----------------------------------------------
|
|
crytools.CheckBnScale ()
|
|
--------------------------------------------------------------------------------------
|
|
|
|
if crytools.PreExportWarnings.count != 0 then crytools.texturesOK = false
|
|
|
|
if crytools.suppresswarnings == false then
|
|
(
|
|
strng = "-------------------ERROR----------------\n"
|
|
For x = 1 to (crytools.PreExportWarnings.count-1) do
|
|
(
|
|
strng = strng + crytools.PreExportWarnings[x] as string +"\n\n-------------------ERROR----------------\n"
|
|
)
|
|
|
|
if cryTools.PreExportWarnings.count > 0 then
|
|
messagebox (Strng + crytools.PreExportWarnings[crytools.PreExportWarnings.count] as string) title:"Problem Found!"
|
|
)
|
|
|
|
if crytools.texturesOK == false then
|
|
(
|
|
return false
|
|
--print "bad"
|
|
)
|
|
else
|
|
(
|
|
return true
|
|
--print "good"
|
|
)
|
|
--)
|
|
--catch (undefined)
|
|
)
|
|
|
|
|
|
|
|
-- register export callback
|
|
csexport.export.register_export_callback crytools.CheckSceneForExport
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cryTools.setupTools()
|
|
|
|
if loadingResult == true then
|
|
(
|
|
try ( destroyDialog crysplash ) catch()
|
|
filein (crytools.maxDirTxt + "scripts\\startup\\LoadCryTools.ms")
|
|
print "Updated CryLoader"
|
|
)
|
|
|
|
loadingResult = undefined
|