renderStacks is a maxscript which means I do whatever I do with Macscript. That also means you can do, too!
This is some examples of how you can control renderStacks with Maxscript.
Make sure to run renderStacks once to get a rstck instance.
rstck.reset()
-- Clear renderStacks data from the scene. "rstck" is the instance of renderStacks struct.
rstck.addPass "Bty"
-- Adding "Bty" pass.
campmod = (rstck.addPmodifier "Bty" "Camera" returnguid:true pmodname:"MainCam" type:#pass)
-- Adding "Camera" pmodifier to "Bty" pass.
-- "Camera" is a pmodifier type. You can set name with "pmodname" optional argument.
-- Make sure to use the exactly same case for pmodifier type as you are seeing in the UI.
-- If you want to see the exact name of all pmodifiers. You can use...
-- print( rstck.pmodifierTypes)
-- To get the guid of newly added pmodifier, returnguid need to be "true".
-- "type" defines if "Bty" is #pass or #passgroup. The default is #pass
rstck.setPmodProp campmod "camObj__" (Freecamera name:"MainCam") update:false
-- campmod is the guid which was returned by the above code.
-- "camObj__" is the property name to set.
-- (Freecamera name:"MainCam") is the value. In this case, we are making a new Free Camera.
-- update is for the pmodifier that dynamically changes properties like ObjParams. For non-dynamic property pmodifiers just set as "false"
resmod = (rstck.addPmodifier "Bty" "Resolution" returnguid:true pmodname:"HDRes" type:#pass)
-- Adding a Resolution pmodifier to "Bty" pass
rstck.getPmodDataValNames "Resolution"
-- Returns propery names of a pmodifier type.
rstck.getPmodDataVal resmod "width" classObj:undefined default:undefined autodefault:false
-- Returns the current value of the property
rstck.setPmodProp resmod "width" 1920 update:false
rstck.setPmodProp resmod "height" 1080 update:false
rstck.setPmodProp resmod "scale" true update:false
rstck.setPmodProp resmod "scalePercent" 50.0 update:false
-- Setting resolution properties. Make sure to use the correct value class.
-- If you want to change the value of properties in a exissing pmodifier, you need to know the guid of the pmodifier. You can use collectPmodDataForPass function for that.
-- To collect the same pmodifiers which used by pass activation. You need to use the following arguments.
-- includeBase:true means it will include base pmodifiers to the collection.
-- includePassgroup:true means it will include pmodifiers in passgroup to the collection.
-- activeOnly:true means it will include only to-be-activated pmodifiers to the collection
-- vpfilter:false means viewport actication filter will be ignored.
-- isPassgroup:false means the given fullpassname is passname. If you want to collect pmodifiers in a passgroup, you need to set this to true.
pmoddata = (rstck.collectPmodDataForPass "Camera001/ivory" includeBase:true includePassgroup:true activeOnly:true vpfilter:false isPassgroup:false)
-- This will return an array of data of modifiers in the pass like this.
#("baseDepot", "{37E33B85-CB2D-4654-9DC5-2B246F0EE62F}", "Exposure", "Base_Exposure", true, #(), false, false)
#("passgroup", "{7EF12325-83ED-4D0C-8859-B858382732AF}", "ObjParams:invis", "ObjParams:invis_001", true, #(), false, false)
#("pass", "{177A5167-FFC6-4110-81BA-540F72C42A64}", "Material", "Material_002", true, #(), false, false)
#("pass", "{1530089B-5199-4E39-A01C-BDA175E65E1C}", "Camera", "Camera_001", true, #(), false, false)
-- In each itemn, the first element "pass" means, it is under pass.
-- If a pmodifier is in ::base, it will be "baseDepot". If a pmodifier is under a passsgroup, it will be "passgroup".
-- The 2nd element is pmodifier guid. You need to use this to do any opration for pmodifier.
-- The 3rd element is pmodifier type.
-- The 4th element is pmodifier name.
-- Other elements are internal use only.
-- Then you can filter pmod you want like this
passpmoddata = (rstck.collectPmodDataForPass "Camera001/ivory" includeBase:true includePassgroup:true activeOnly:true vpfilter:false isPassgroup:false)
campmods = (for pmoddata in passpmoddata where pmoddata[3] == "Camera" collect pmoddata)
campmod_guid = campmods[1][2]
-- Now we can get the value of a prop
rstck.getPmodDataVal campmod_guid "apertureWidth" classObj:undefined default:undefined autodefault:false
-- Or set the value of a prop
rstck.setPmodProp campmod_guid "apertureWidth" 24.0 update:false
-- Usually it is a good idea to modity while UI is closed.
-- But, if you really want to keep open UI, this command will refresh the treeview.
renderStackRol.defaultFillTV()
rstck.removePmodifier "Bty" resmod type:#pass
-- remove a pmodifier with given guid from #pass "Bty"
rstck.removePass "Bty"
-- remove pass "Bty"
apple_pass_elem = (rstck.addPass "Apple" returnguid:true)
-- Make a "Apple" pass. It returns xmlElement.
apple_pass_guid = (rstck.rsXml.getAttr apple_pass_elem "guid" default:undefined)
-- get pass guid from xmlElemement
rstck.addPassgroup "Fruits" passguids:#(apple_pass_guid)
-- add a "Fruits" passgroup with "Apple" pass.
rstck.addPass "Orange" returnguid:true
rstck.add2Passgroup "Fruits" #("Orange") byguid:false
-- Make another "Orange" pass and adde to "Fruits" passgroup.
rstck.renamePass "Fruits/Apple" "Fruits/Banana" dosave:true
-- rename "Apple" pass to "Banana". Remember all passname argument means full pass name(passgroup/pass).
renderStackRol.defaultFillTV()
-- How to make layer set / pathname / objset and add to Viability pmodifier
-- setPmodObjData <pmodguid> <settype> <setname> <inexclude>
vismod2guid = (rstck.addPmodifier pass2_name "Visibility" returnguid:true pmodname:"")
rstck.addPathnames "T*" dosave:true
rstck.setPmodObjData vismod2guid "pathname" "T*" true
vismod3guid = (rstck.addPmodifier pass3_name "Visibility" returnguid:true pmodname:"")
rstck.setLayerSet "Ts" #("Teapot", "Torus", "Tube")
rstck.setPmodObjData vismod3guid "layerset" "Ts" true
vismod4guid = (rstck.addPmodifier pass4_name "Visibility" returnguid:true pmodname:"")
rstck.setLayerSet "HasRadius" #("Teapot", "Sphere")
local itemdata = #()
append itemdata #(true, #add, "HasRadius", #layerset)
append itemdata #(true, #add, "GEOS", #layer)
rstck.setObjSet "BallOnPlane" itemdata msg:false apply:true
rstck.setPmodObjData vismod4guid "objset" "BallOnPlane" true
rstck.reset()
-- Clear renderStacks data from the scene. "rstck" is the instance of renderStacks struct.
rstck.addPass "Bty"
-- Adding "Bty" pass.
campmod = (rstck.addPmodifier "Bty" "Camera" returnguid:true pmodname:"MainCam" type:#pass)
-- Adding "Camera" pmodifier to "Bty" pass.
-- "Camera" is a pmodifier type. You can set name with "pmodname" optional argument.
-- Make sure to use the exactly same case for pmodifier type as you are seeing in the UI.
-- If you want to see the exact name of all pmodifiers. You can use...
-- print( rstck.pmodifierTypes)
-- To get the guid of newly added pmodifier, returnguid need to be "true".
-- "type" defines if "Bty" is #pass or #passgroup. The default is #pass
rstck.setPmodProp campmod "camObj__" (Freecamera name:"MainCam") update:false
-- campmod is the guid which was returned by the above code.
-- "camObj__" is the property name to set.
-- (Freecamera name:"MainCam") is the value. In this case, we are making a new Free Camera.
-- update is for the pmodifier that dynamically changes properties like ObjParams. For non-dynamic property pmodifiers just set as "false"
resmod = (rstck.addPmodifier "Bty" "Resolution" returnguid:true pmodname:"HDRes" type:#pass)
-- Adding a Resolution pmodifier to "Bty" pass
rstck.getPmodDataValNames "Resolution"
-- Returns propery names of a pmodifier type.
rstck.getPmodDataVal resmod "width" classObj:undefined default:undefined autodefault:false
-- Returns the current value of the property
rstck.setPmodProp resmod "width" 1920 update:false
rstck.setPmodProp resmod "height" 1080 update:false
rstck.setPmodProp resmod "scale" true update:false
rstck.setPmodProp resmod "scalePercent" 50.0 update:false
-- Setting resolution properties. Make sure to use the correct value class.
-- If you want to change the value of properties in a exissing pmodifier, you need to know the guid of the pmodifier. You can use collectPmodDataForPass function for that.
-- To collect the same pmodifiers which used by pass activation. You need to use the following arguments.
-- includeBase:true means it will include base pmodifiers to the collection.
-- includePassgroup:true means it will include pmodifiers in passgroup to the collection.
-- activeOnly:true means it will include only to-be-activated pmodifiers to the collection
-- vpfilter:false means viewport actication filter will be ignored.
-- isPassgroup:false means the given fullpassname is passname. If you want to collect pmodifiers in a passgroup, you need to set this to true.
pmoddata = (rstck.collectPmodDataForPass "Camera001/ivory" includeBase:true includePassgroup:true activeOnly:true vpfilter:false isPassgroup:false)
-- This will return an array of data of modifiers in the pass like this.
#("baseDepot", "{37E33B85-CB2D-4654-9DC5-2B246F0EE62F}", "Exposure", "Base_Exposure", true, #(), false, false)
#("passgroup", "{7EF12325-83ED-4D0C-8859-B858382732AF}", "ObjParams:invis", "ObjParams:invis_001", true, #(), false, false)
#("pass", "{177A5167-FFC6-4110-81BA-540F72C42A64}", "Material", "Material_002", true, #(), false, false)
#("pass", "{1530089B-5199-4E39-A01C-BDA175E65E1C}", "Camera", "Camera_001", true, #(), false, false)
-- In each itemn, the first element "pass" means, it is under pass.
-- If a pmodifier is in ::base, it will be "baseDepot". If a pmodifier is under a passsgroup, it will be "passgroup".
-- The 2nd element is pmodifier guid. You need to use this to do any opration for pmodifier.
-- The 3rd element is pmodifier type.
-- The 4th element is pmodifier name.
-- Other elements are internal use only.
-- Then you can filter pmod you want like this
passpmoddata = (rstck.collectPmodDataForPass "Camera001/ivory" includeBase:true includePassgroup:true activeOnly:true vpfilter:false isPassgroup:false)
campmods = (for pmoddata in passpmoddata where pmoddata[3] == "Camera" collect pmoddata)
campmod_guid = campmods[1][2]
-- Now we can get the value of a prop
rstck.getPmodDataVal campmod_guid "apertureWidth" classObj:undefined default:undefined autodefault:false
-- Or set the value of a prop
rstck.setPmodProp campmod_guid "apertureWidth" 24.0 update:false
-- Usually it is a good idea to modity while UI is closed.
-- But, if you really want to keep open UI, this command will refresh the treeview.
renderStackRol.defaultFillTV()
rstck.removePmodifier "Bty" resmod type:#pass
-- remove a pmodifier with given guid from #pass "Bty"
rstck.removePass "Bty"
-- remove pass "Bty"
apple_pass_elem = (rstck.addPass "Apple" returnguid:true)
-- Make a "Apple" pass. It returns xmlElement.
apple_pass_guid = (rstck.rsXml.getAttr apple_pass_elem "guid" default:undefined)
-- get pass guid from xmlElemement
rstck.addPassgroup "Fruits" passguids:#(apple_pass_guid)
-- add a "Fruits" passgroup with "Apple" pass.
rstck.addPass "Orange" returnguid:true
rstck.add2Passgroup "Fruits" #("Orange") byguid:false
-- Make another "Orange" pass and adde to "Fruits" passgroup.
rstck.renamePass "Fruits/Apple" "Fruits/Banana" dosave:true
-- rename "Apple" pass to "Banana". Remember all passname argument means full pass name(passgroup/pass).
renderStackRol.defaultFillTV()
-- How to make layer set / pathname / objset and add to Viability pmodifier
-- setPmodObjData <pmodguid> <settype> <setname> <inexclude>
vismod2guid = (rstck.addPmodifier pass2_name "Visibility" returnguid:true pmodname:"")
rstck.addPathnames "T*" dosave:true
rstck.setPmodObjData vismod2guid "pathname" "T*" true
vismod3guid = (rstck.addPmodifier pass3_name "Visibility" returnguid:true pmodname:"")
rstck.setLayerSet "Ts" #("Teapot", "Torus", "Tube")
rstck.setPmodObjData vismod3guid "layerset" "Ts" true
vismod4guid = (rstck.addPmodifier pass4_name "Visibility" returnguid:true pmodname:"")
rstck.setLayerSet "HasRadius" #("Teapot", "Sphere")
local itemdata = #()
append itemdata #(true, #add, "HasRadius", #layerset)
append itemdata #(true, #add, "GEOS", #layer)
rstck.setObjSet "BallOnPlane" itemdata msg:false apply:true
rstck.setPmodObjData vismod4guid "objset" "BallOnPlane" true
rstck.reset() -- Clear renderStacks data from the scene. "rstck" is the instance of renderStacks struct. rstck.addPass "Bty" -- Adding "Bty" pass. campmod = (rstck.addPmodifier "Bty" "Camera" returnguid:true pmodname:"MainCam" type:#pass) -- Adding "Camera" pmodifier to "Bty" pass. -- "Camera" is a pmodifier type. You can set name with "pmodname" optional argument. -- Make sure to use the exactly same case for pmodifier type as you are seeing in the UI. -- If you want to see the exact name of all pmodifiers. You can use... -- print( rstck.pmodifierTypes) -- To get the guid of newly added pmodifier, returnguid need to be "true". -- "type" defines if "Bty" is #pass or #passgroup. The default is #pass rstck.setPmodProp campmod "camObj__" (Freecamera name:"MainCam") update:false -- campmod is the guid which was returned by the above code. -- "camObj__" is the property name to set. -- (Freecamera name:"MainCam") is the value. In this case, we are making a new Free Camera. -- update is for the pmodifier that dynamically changes properties like ObjParams. For non-dynamic property pmodifiers just set as "false" resmod = (rstck.addPmodifier "Bty" "Resolution" returnguid:true pmodname:"HDRes" type:#pass) -- Adding a Resolution pmodifier to "Bty" pass rstck.getPmodDataValNames "Resolution" -- Returns propery names of a pmodifier type. rstck.getPmodDataVal resmod "width" classObj:undefined default:undefined autodefault:false -- Returns the current value of the property rstck.setPmodProp resmod "width" 1920 update:false rstck.setPmodProp resmod "height" 1080 update:false rstck.setPmodProp resmod "scale" true update:false rstck.setPmodProp resmod "scalePercent" 50.0 update:false -- Setting resolution properties. Make sure to use the correct value class. -- If you want to change the value of properties in a exissing pmodifier, you need to know the guid of the pmodifier. You can use collectPmodDataForPass function for that. -- To collect the same pmodifiers which used by pass activation. You need to use the following arguments. -- includeBase:true means it will include base pmodifiers to the collection. -- includePassgroup:true means it will include pmodifiers in passgroup to the collection. -- activeOnly:true means it will include only to-be-activated pmodifiers to the collection -- vpfilter:false means viewport actication filter will be ignored. -- isPassgroup:false means the given fullpassname is passname. If you want to collect pmodifiers in a passgroup, you need to set this to true. pmoddata = (rstck.collectPmodDataForPass "Camera001/ivory" includeBase:true includePassgroup:true activeOnly:true vpfilter:false isPassgroup:false) -- This will return an array of data of modifiers in the pass like this. #("baseDepot", "{37E33B85-CB2D-4654-9DC5-2B246F0EE62F}", "Exposure", "Base_Exposure", true, #(), false, false) #("passgroup", "{7EF12325-83ED-4D0C-8859-B858382732AF}", "ObjParams:invis", "ObjParams:invis_001", true, #(), false, false) #("pass", "{177A5167-FFC6-4110-81BA-540F72C42A64}", "Material", "Material_002", true, #(), false, false) #("pass", "{1530089B-5199-4E39-A01C-BDA175E65E1C}", "Camera", "Camera_001", true, #(), false, false) -- In each itemn, the first element "pass" means, it is under pass. -- If a pmodifier is in ::base, it will be "baseDepot". If a pmodifier is under a passsgroup, it will be "passgroup". -- The 2nd element is pmodifier guid. You need to use this to do any opration for pmodifier. -- The 3rd element is pmodifier type. -- The 4th element is pmodifier name. -- Other elements are internal use only. -- Then you can filter pmod you want like this passpmoddata = (rstck.collectPmodDataForPass "Camera001/ivory" includeBase:true includePassgroup:true activeOnly:true vpfilter:false isPassgroup:false) campmods = (for pmoddata in passpmoddata where pmoddata[3] == "Camera" collect pmoddata) campmod_guid = campmods[1][2] -- Now we can get the value of a prop rstck.getPmodDataVal campmod_guid "apertureWidth" classObj:undefined default:undefined autodefault:false -- Or set the value of a prop rstck.setPmodProp campmod_guid "apertureWidth" 24.0 update:false -- Usually it is a good idea to modity while UI is closed. -- But, if you really want to keep open UI, this command will refresh the treeview. renderStackRol.defaultFillTV() rstck.removePmodifier "Bty" resmod type:#pass -- remove a pmodifier with given guid from #pass "Bty" rstck.removePass "Bty" -- remove pass "Bty" apple_pass_elem = (rstck.addPass "Apple" returnguid:true) -- Make a "Apple" pass. It returns xmlElement. apple_pass_guid = (rstck.rsXml.getAttr apple_pass_elem "guid" default:undefined) -- get pass guid from xmlElemement rstck.addPassgroup "Fruits" passguids:#(apple_pass_guid) -- add a "Fruits" passgroup with "Apple" pass. rstck.addPass "Orange" returnguid:true rstck.add2Passgroup "Fruits" #("Orange") byguid:false -- Make another "Orange" pass and adde to "Fruits" passgroup. rstck.renamePass "Fruits/Apple" "Fruits/Banana" dosave:true -- rename "Apple" pass to "Banana". Remember all passname argument means full pass name(passgroup/pass). renderStackRol.defaultFillTV() -- How to make layer set / pathname / objset and add to Viability pmodifier -- setPmodObjData <pmodguid> <settype> <setname> <inexclude> vismod2guid = (rstck.addPmodifier pass2_name "Visibility" returnguid:true pmodname:"") rstck.addPathnames "T*" dosave:true rstck.setPmodObjData vismod2guid "pathname" "T*" true vismod3guid = (rstck.addPmodifier pass3_name "Visibility" returnguid:true pmodname:"") rstck.setLayerSet "Ts" #("Teapot", "Torus", "Tube") rstck.setPmodObjData vismod3guid "layerset" "Ts" true vismod4guid = (rstck.addPmodifier pass4_name "Visibility" returnguid:true pmodname:"") rstck.setLayerSet "HasRadius" #("Teapot", "Sphere") local itemdata = #() append itemdata #(true, #add, "HasRadius", #layerset) append itemdata #(true, #add, "GEOS", #layer) rstck.setObjSet "BallOnPlane" itemdata msg:false apply:true rstck.setPmodObjData vismod4guid "objset" "BallOnPlane" true
Samples
I collected some of MXS samples that I have made for users.
-- How to add Maxscript pmodifier script.
pmodData = rstck.getPmodifierData [pmoidifier guid] full:true
rstck.curMXS = "print \"Hello\""
rstck.capturePmod pmodData doapply:false
-- How to add Maxscript pmodifier script.
pmodData = rstck.getPmodifierData [pmoidifier guid] full:true
rstck.curMXS = "print \"Hello\""
rstck.capturePmod pmodData doapply:false
-- How to add Maxscript pmodifier script. pmodData = rstck.getPmodifierData [pmoidifier guid] full:true rstck.curMXS = "print \"Hello\"" rstck.capturePmod pmodData doapply:false
-- I would like to create a lot of passes. Every next pass should have pmodifier [FrameRange] frame 1, second pass frame 2 etc....
(
rstck.reset() -- if you want to reset before add the new setup.
local passnames2add = #("Apple", "Banana", "Orange","Pineapple")
for i = 1 to passnames2add.count do (
local pn = passnames2add[i]
rstck.addPass pn
frsmod = (rstck.addPmodifier pn "FrameRange" returnguid:true pmodname:"FrameRange" type:#pass)
rstck.setPmodProp frsmod "type" 4 update:false
rstck.setPmodProp frsmod "frames" (i as string) update:false
)
-- How to capture all properties from Scene for custom object/property pmodifier
(
passname = <your pass fullname>
pmodname = "pmodifier name"
-- search the pmod
passpmoddata = (rstck.collectPmodDataForPass passname includeBase:true includePassgroup:true activeOnly:true vpfilter:false isPassgroup:false)
search_pmod = (for pmoddata in passpmoddata where pmoddata[4] == pmodname collect pmoddata)
-- assume you have only 1 in the result. Choose the first pmoddata
pmoddata_u_want = search_pmod[1]
-- get "full pmoddata" using guid.
pmodData = rstck.getPmodifierData pmoddata_u_want[2] full:true
pmodPropNames = (for data in pmodData[6] collect data[1])
objParamsParam = pmodData[10]
rstck.capturePropVal pmodData pmodPropNames objparam:objParamsParam
)
-- I would like to create a lot of passes. Every next pass should have pmodifier [FrameRange] frame 1, second pass frame 2 etc....
(
rstck.reset() -- if you want to reset before add the new setup.
local passnames2add = #("Apple", "Banana", "Orange","Pineapple")
for i = 1 to passnames2add.count do (
local pn = passnames2add[i]
rstck.addPass pn
frsmod = (rstck.addPmodifier pn "FrameRange" returnguid:true pmodname:"FrameRange" type:#pass)
rstck.setPmodProp frsmod "type" 4 update:false
rstck.setPmodProp frsmod "frames" (i as string) update:false
)
-- How to capture all properties from Scene for custom object/property pmodifier
(
passname = <your pass fullname>
pmodname = "pmodifier name"
-- search the pmod
passpmoddata = (rstck.collectPmodDataForPass passname includeBase:true includePassgroup:true activeOnly:true vpfilter:false isPassgroup:false)
search_pmod = (for pmoddata in passpmoddata where pmoddata[4] == pmodname collect pmoddata)
-- assume you have only 1 in the result. Choose the first pmoddata
pmoddata_u_want = search_pmod[1]
-- get "full pmoddata" using guid.
pmodData = rstck.getPmodifierData pmoddata_u_want[2] full:true
pmodPropNames = (for data in pmodData[6] collect data[1])
objParamsParam = pmodData[10]
rstck.capturePropVal pmodData pmodPropNames objparam:objParamsParam
)
-- I would like to create a lot of passes. Every next pass should have pmodifier [FrameRange] frame 1, second pass frame 2 etc.... ( rstck.reset() -- if you want to reset before add the new setup. local passnames2add = #("Apple", "Banana", "Orange","Pineapple") for i = 1 to passnames2add.count do ( local pn = passnames2add[i] rstck.addPass pn frsmod = (rstck.addPmodifier pn "FrameRange" returnguid:true pmodname:"FrameRange" type:#pass) rstck.setPmodProp frsmod "type" 4 update:false rstck.setPmodProp frsmod "frames" (i as string) update:false ) -- How to capture all properties from Scene for custom object/property pmodifier ( passname = <your pass fullname> pmodname = "pmodifier name" -- search the pmod passpmoddata = (rstck.collectPmodDataForPass passname includeBase:true includePassgroup:true activeOnly:true vpfilter:false isPassgroup:false) search_pmod = (for pmoddata in passpmoddata where pmoddata[4] == pmodname collect pmoddata) -- assume you have only 1 in the result. Choose the first pmoddata pmoddata_u_want = search_pmod[1] -- get "full pmoddata" using guid. pmodData = rstck.getPmodifierData pmoddata_u_want[2] full:true pmodPropNames = (for data in pmodData[6] collect data[1]) objParamsParam = pmodData[10] rstck.capturePropVal pmodData pmodPropNames objparam:objParamsParam )