macroscript gp_FFXRM category:"gp_tools" tooltip:"FFX-RenderManager" ( --strings global versionArr = #("3ds Max 2008","3ds Max 2009","3ds Max 2010") version = ((maxVersion())[1]/1000)-9 global myMaxVersion = versionArr[version] --global arrays global gp_ffxArr=#() global gp_ffxNamesArr=#() global gp_ffxSelection=#() global gp_ffxLightArr=#() global gp_ffxLightNamesArr=#() global gp_fumeLightArr=#() global gp_lightsPerFumeArr =#() global gp_lightsPerFumeNamesArr =#() global gp_elementArr =#() global gp_elementClassArr =#(FumeFX_Fire,FusionWorks_Z_Depth,Shadow,FumeFX_Smoke,VRayShadows) --functions function ffxSelFilter obj = isKindOf obj fumeFX and findItem gp_ffxArr obj ==0 function ffxFilter obj = isKindOf obj fumeFX function lightIncludeFilter obj = superClassOf obj == GeometryClass and classOf obj != fumeFX and classOf obj != targetObject function lightFilter obj = isKindOf obj light and findItem gp_ffxLightArr obj ==0 --variables global gp_ffxShader global displayLights global lightCopy global gp_mainPath global gp_sessionName global gp_fileName global gp_fullPath global showFullPath --utility rollout manageFFX "do your thing!" width:792 height:592 ( multiListBox selectFFX "selctFFX" pos:[16,8] width:240 height:18 checkbutton doEdit "edit selection" pos:[16,264] width:240 height:22 highlightColor:[85,102,120] checked:true button addFFX "addFFX" pos:[16,286] width:120 height:24 button removeFFX "removeFFX" pos:[136,286] width:120 height:24 button selectAll "selectAll" pos:[16,310] width:240 height:24 GroupBox group01 "apply to selected FFX ONLY" pos:[8,340] width:256 height:76 button makeRenderable "set Renderable" pos:[16,358] width:120 height:24 tooltip:"set selected renderable, all other NOT renderable" button clearLights "clear Lights" pos:[136,358] width:120 height:24 tooltip:"clear light lists of selected FFX" button loadShader "load Shader" pos:[16,382] width:120 height:24 pickbutton pickShader "pick Shader" pos:[136,382] width:120 height:24 filter:ffxFilter listbox displayBox "Lights in Fumes " pos:[16,424] width:768 height:10 enabled:true readOnly:true multiListBox referenceLights "referenceLights" pos:[280,8] width:240 height:14 button addLight "addLight" pos:[280,216] width:120 height:24 button removeLight "removeLight" pos:[400,216] width:120 height:24 button getFromFFX "get Lights from FFX" pos:[280,240] width:240 height:24 button lightLayer "create Light Layer" pos:[280,264] width:240 height:24 GroupBox group02 "apply to selected lights ONLY" pos:[528,16] width:257 height:144 button lightsOn "selected ON" pos:[536,32] width:120 height:24 toolTip:"turns selected On" button lightsOff "selected OFF" pos:[656,32] width:120 height:24 toolTip:"turns selected OFF" button includeObjs "include Objects" pos:[536,56] width:120 height:24 toolTip:"each light will have a selectionSet of Objects which it will include" button clearObjects "clear includeList" pos:[656,56] width:120 height:24 button editObjs "edit obj properties" pos:[536,80] width:120 height:24 tooltip:"opens the properties floater for all included objects of the selected lights" button includeNothing "include Nothing" pos:[656,80] width:120 height:24 button intoFume "into selected FFX" pos:[536,104] width:120 height:24 tooltip:"add selected lights to selected FFX" button outOfFume "out of selected FFX" pos:[656,104] width:120 height:24 tooltip:"remove selected lights from selected FFX" checkbutton lightPerFume "Light per fume" pos:[536,128] width:240 height:24 highlightColor:[85,102,120] checked:false tooltip:"selected lights and lights in selected fumes will be turned off.\nFor each FFX separate lights will be created that will light only their FFX" GroupBox group03 "renderElements" pos:[528,168] width:256 height:136 checkbutton ffxFire "ffxFire" pos:[536,184] width:240 height:16 highlightColor:[85,102,120] checkbutton ffxSmoke "ffxSmoke" pos:[536,200] width:240 height:16 highlightColor:[85,102,120] checkbutton zDepth "fusionWorks zDepth" pos:[536,216] width:240 height:16 highlightColor:[85,102,120] checkbutton scanLineShadow "Scanline Shadow" pos:[536,232] width:240 height:16 highlightColor:[85,102,120] checkbutton VRayShadow "Vray Shadow" pos:[536,248] width:240 height:16 highlightColor:[85,102,120]enabled:false checkbutton FRshadow "FR Shadow" pos:[536,264] width:240 height:16 highlightColor:[85,102,120] enabled:false checkButton elementsActive "ELEMENTS ACTIVE" pos:[536,280] width:240 height:20 highlightColor:[85,102,120] GroupBox group04 "folderManagement" pos:[272,304] width:512 height:112 button mainPath "mainPath" pos:[280,320] width:72 height:16 edittext showMainPath "" pos:[360,320] width:416 height:16 readOnly:true label sessionNameLabel "sessionName:" pos:[280,344] width:72 height:16 edittext sessionName "" pos:[360,344] width:416 height:16 label fileNameLabel "fileName.type:" pos:[280,368] width:72 height:16 editText fileName "" pos:[360,368] width:416 height:16 button setFolderPath "set/create Path" pos:[280,392] width:80 height:16 edittext fullPath "" pos:[360,392] width:416 height:16 readOnly:true on manageFFX open do ( fn displayLights =( gp_ffxSelection=#() gp_fumeLightArr =#() for ffx in selectFFX.selection do( theFFX = (getNodeByName selectFFX.items[ffx]) if theFFX.lights.count == 0 then( append gp_ffxSelection (theFFX.name + ": ----------") ) else( lightString = ": " for theLight in theFFX.lights do( if theLight != undefined then( append LightString (theLight.name + " | ") ) else( append LightString "del | " ) ) append gp_ffxSelection (theFFX.name + LightString) ) displayBox.items = gp_ffxSelection ) )----- fn showFullPath main session file =( showMainPath.text = main sessionName.text = session fileName.text = file if session != "" then( gp_fullPath = main + "\\" + session + "\\" + file ) else( gp_fullPath = main + "\\" + file ) fullPath.text = gp_fullPath )----- if gp_mainPath == undefined then( gp_mainPath = pathConfig.getCurrentProjectFolder() ) else() if gp_sessionName == undefined then( gp_sessionName = "session" ) else() if gp_fileName == undefined then( gp_fileName = "fileName.type" ) else() showFullPath gp_mainPath gp_sessionName gp_fileName for ffx in objects where classof ffx == fumeFx do( append gp_ffxArr ffx append gp_ffxNamesArr ffx.name ) selectFFX.items = gp_ffxNamesArr fn activateElements manager =( manager.SetElementsActive true elementsActive.checked = true )----- re = maxOps.GetCurRenderElementMgr() for n = 0 to (re.numrenderelements()- 1) do( theElement = classOf (re.getRenderElement n) if theElement == FumeFX_fire then( ffxFire.state = true append gp_elementArr theElement activateElements re ) else() if theElement == FumeFX_smoke then( ffxSmoke.state = true append gp_elementArr theElement activateElements re ) else() if theElement == FusionWorks_Z_depth then( zDepth.state= true append gp_elementArr theElement activateElements re ) else() if theElement == ShadowRenderElement then( scanLineShadow.state= true append gp_elementArr theElement activateElements re ) else() if theElement == VrayShadows then( VRayShadow.state = true append gp_elementArr theElement activateElements re ) else() if theElement == FR_Shadows then( FRShadow.state = true append gp_elementArr theElement activateElements re ) else() ) )----------------------------------------------------------- on selectFFX selectionEnd do( max modify mode if doEdit.checked == true then( if (selectFFX.selection as array).count == 1 then( gp_ffxArr[(selectFFX.selection as array)[1]].EditUI=on select gp_ffxArr[(selectFFX.selection as array)[1]] ) else( clearSelection() for ffx in (selectFFX.selection as array) do( gp_ffxArr[ffx].EditUI=off selectmore gp_ffxArr[ffx] ) ) ) else( clearSelection() if (selectFFX.selection as array).count == 1 then( gp_ffxArr[(selectFFX.selection as array)[1]].EditUI=off ) ) displayLights() )----------------------------------------------------------- on doEdit changed state do( max modify mode if state == true then( if (selectFFX.selection as array).count == 1 then( gp_ffxArr[(selectFFX.selection as array)[1]].EditUI=on select gp_ffxArr[(selectFFX.selection as array)[1]] ) else( clearSelection() for ffx in (selectFFX.selection as array) do( gp_ffxArr[ffx].EditUI=off selectmore gp_ffxArr[ffx] ) ) ) else( clearSelection() if (selectFFX.selection as array).count == 1 then( gp_ffxArr[(selectFFX.selection as array)[1]].EditUI=off ) ) displayLights() )----------------------------------------------------------- on addFFX pressed do( moreFfxArr = selectByName title:"addFFX" filter:ffxSelFilter if moreFfxArr !=undefined then( for ffx in moreFfxArr do( append gp_ffxArr ffx append gp_ffxNamesArr ffx.name ) selectFFX.items = gp_ffxNamesArr ) else() )----------------------------------------------------------- on removeFFX pressed do( deleteArr = (selectFFX.selection as array) for ffxIndex = deleteArr.count to 1 by -1 do( deleteItem gp_ffxArr deleteArr[ffxIndex] deleteItem gp_ffxNamesArr deleteArr[ffxIndex] ) selectFFX.items = gp_ffxNamesArr displayLights() )----------------------------------------------------------- on selectAll pressed do( select gp_ffxArr selectFFX.selection = #{1..(selectFFX.items.count)} displayLights() )----------------------------------------------------------- on makeRenderable pressed do( if gp_ffxArr.count !=0 then( for ffx = 1 to gp_ffxArr.count do( if findItem (selectFFX.selection as array) ffx !=0 then( gp_ffxArr[ffx].renderable = true ) else( gp_ffxArr[ffx].renderable = false ) ) ) else() )----------------------------------------------------------- on clearLights pressed do( for ffxIndex in (selectFFX.selection as array) do( ffxNode = gp_ffxArr[ffxindex] for lightNode in ffxNode.lights do( ffxNode.removeLight lightNode ) ) displayLights() )----------------------------------------------------------- on loadShader pressed do( gp_ffxshader = getOpenFileName caption:"load a Fume Preset..." fileName:("C:\Program Files\Autodesk\\"+myMaxVersion+"\plugins\AfterWorks\FumeFX\\") types:"FumePreset(*.fxp)|*.fxp|" if gp_ffxShader != undefined then( for ffx in (selectFFX.selection as array) do( gp_ffxArr[ffx].loadPresets (getFileNameFile gp_ffxShader) #(#render_main,#shader) ) ) else() )----------------------------------------------------------- on pickShader picked obj do( if obj != undefined then( obj.SavePresets "temp_gp_FFX-RenderManagerReference" for ffx in (selectFFX.selection as array) do( gp_ffxArr[ffx].loadPresets "temp_gp_FFX-RenderManagerReference" #(#render_main,#shader) ) ) else() )----------------------------------------------------------- on referenceLights selectionEnd do( max modify mode if (referenceLights.selection as array).count == 1 then( select gp_ffxLightArr[(referenceLights.selection as array)[1]] ) else( clearSelection() for ffxLight in (referenceLights.selection as array) do( selectmore gp_ffxLightArr[ffxLight] ) ) )----------------------------------------------------------- on addLight pressed do( moreLightArr = selectByName title:"add reference Lights" filter:lightFilter if moreLightArr !=undefined then( for myLight in moreLightArr do( append gp_ffxLightArr myLight append gp_ffxLightNamesArr myLight.name if (LayerManager.getLayerFromName "gp_FFX_ReferenceLights") != undefined then( (LayerManager.getLayerFromName "gp_FFX_ReferenceLights").addNode myLight if (getNodeByName (myLight.name +".Target")) !=undefined then( (LayerManager.getLayerFromName "gp_FFX_ReferenceLights").addNode (getNodeByName (myLight.name +".Target")) ) else() ) ) referenceLights.items = gp_ffxLightNamesArr ) else() )----------------------------------------------------------- on removeLight pressed do( deleteArr = (referenceLights.selection as array) for lightIndex = deleteArr.count to 1 by -1 do( deleteItem gp_ffxLightArr deleteArr[lightIndex] deleteItem gp_ffxLightNamesArr deleteArr[lightIndex] ) referenceLights.items = gp_ffxLightNamesArr )----------------------------------------------------------- on getFromFFX pressed do( for ffx in (selectFFX.selection as array) do( for ffxLight in gp_ffxArr[ffx].lights do( if ffxLight != undefined then( if findItem gp_ffxLightArr ffxLight == 0 then( append gp_ffxLightArr ffxLight append gp_ffxLightNamesArr ffxLight.name ) else() ) else() ) ) referenceLights.items = gp_ffxLightNamesArr )----------------------------------------------------------- on lightLayer pressed do( if (LayerManager.getLayerFromName "gp_FFX_ReferenceLights") == undefined then( LayerManager.newLayerFromName "gp_FFX_ReferenceLights" ) for ffxLight in referenceLights.items do( (LayerManager.getLayerFromName "gp_FFX_ReferenceLights").addNode (getNodeByName ffxLight) ) if (LayerManager.getLayerFromName "gp_FFX_LightPerFume") == undefined then( LayerManager.newLayerFromName "gp_FFX_LightPerFume" ) )----------------------------------------------------------- on lightsOn pressed do( if gp_ffxLightArr.count != 0 then( for ffxLight = 1 to gp_ffxLightArr.count do( if findItem (referenceLights.selection as array) ffxLight != 0 then( gp_ffxLightArr[ffxLight].enabled = on gp_ffxLightArr[ffxLight].on = on ) else() ) ) else() )----------------------------------------------------------- on lightsOff pressed do( if gp_ffxLightArr.count != 0 then( for ffxLight = 1 to gp_ffxLightArr.count do( if findItem (referenceLights.selection as array) ffxLight != 0 then( gp_ffxLightArr[ffxLight].enabled = off gp_ffxLightArr[ffxLight].on = off ) else() ) ) else() )----------------------------------------------------------- on includeObjs pressed do( lightObjArr = selectByName title:"select Objects to include in Light" filter:lightIncludeFilter if lightObjArr != undefined then( for ffxLight in (referenceLights.selection as array) do( selectionSets ["gp_ffxLight_included_Objects_" + gp_ffxLightArr[ffxLight].name] = lightObjArr gp_ffxLightArr[ffxLight].includeList = lightObjArr ) ) else() )----------------------------------------------------------- on clearObjects pressed do( for ffxLight in (referenceLights.selection as array) do( try( deleteItem selectionSets ("gp_ffxLight_included_Objects_" + gp_ffxLightArr[ffxLight].name) ) catch() gp_ffxLightArr[ffxLight].excludeList = #() ) )----------------------------------------------------------- on editObjs pressed do( clearSelection() for ffxLight in (referenceLights.selection as array) do( if selectionSets["gp_ffxLight_included_Objects_" + gp_ffxLightArr[ffxLight].name] != undefined then( selectmore selectionSets["gp_ffxLight_included_Objects_" + gp_ffxLightArr[ffxLight].name] ) else( select gp_ffxLightArr[ffxLight] ) ) if selection.count != 0 and (superClassOf selection[1]) != light then( actionMan.executeAction 0 "40022" ) else() )----------------------------------------------------------- on includeNothing pressed do( for ffxLight in (referenceLights.selection as array) do( gp_ffxLightArr[ffxLight].includeList = #() try( deleteItem selectionSets ("gp_ffxLight_included_Objects_" + gp_ffxLightArr[ffxLight].name) ) catch() ) )----------------------------------------------------------- on intoFume pressed do( if (LayerManager.getLayerFromName "gp_FFX_ReferenceLights") == undefined then( LayerManager.newLayerFromName "gp_FFX_ReferenceLights" ) else() if (LayerManager.getLayerFromName "gp_FFX_LightPerFume") == undefined then( LayerManager.newLayerFromName "gp_FFX_LightPerFume" ) if lightPerFume.checked == true then( for lightIndex in referenceLights.selection do( lightNode=gp_ffxLightArr[lightIndex] (LayerManager.getLayerFromName "gp_FFX_ReferenceLights").addNode lightNode for ffxIndex in selectFFX.selection do( ffxNode = gp_ffxArr[ffxIndex] ffxName = gp_ffxNamesArr[ffxIndex] lightCopy = copy lightNode if lightNode.target != undefined then( targetCopy = copy lightNode.target lightCopy.target = targetCopy ) else() lightCopy.name = lightNode.name +"_"+ ffxName if finditem gp_lightsPerFumeNamesArr lightCopy.name !=0 then( delete lightCopy ) else( if lightCopy.includeList == undefined then ( lightCopy.includeList = #(ffxNode) ) else( append lightCopy.includeList ffxNode ) ffxNode.addLight lightCopy ffxNode.removeLight lightNode ) ) ) ) else( for ffx in (selectFFX.selection as array) do( for ffxLight in (referenceLights.selection as array) do( if finditem gp_ffxArr[ffx].lights gp_ffxLightArr[ffxLight] == 0 then( gp_ffxArr[ffx].addLight gp_ffxLightArr[ffxLight] ) else() ) ) ) (LayerManager.getLayerFromName "gp_FFX_LightPerFume").nodes &gp_lightsPerFumeArr gp_lightsPerFumeNamesArr = #() for lightNode in gp_lightsPerFumeArr do( append gp_lightsPerFumeNamesArr lightNode.name ) displayLights() )----------------------------------------------------------- on outOfFume pressed do( if lightPerFume.checked == true then( for ffxIndex in selectFFX.selection do( ffxNode = gp_ffxArr[ffxIndex] for refLightIndex in (referenceLights.selection as array) do( for lightIndex = ffxNode.lights.count to 1 by -1 do( lightNode = ffxNode.lights[lightIndex] if lightNode != undefined and (findItem gp_lightsPerFumeArr lightNode) !=0 then( if refLightIndex != undefined then( refLightName = gp_ffxLightNamesArr[refLightIndex] if (matchPattern lightNode.name pattern:(refLightName + "*")) == true then( ffxNode.removeLight lightNode delete lightNode ) else() ) else() ) else() ) ) ) (LayerManager.getLayerFromName "gp_FFX_LightPerFume").nodes &gp_lightsPerFumeArr gp_lightsPerFumeNamesArr = #() for theLightNode in gp_lightsPerFumeArr do( append gp_lightsPerFumeNamesArr theLightNode.name ) ) else( for ffx in (selectFFX.selection as array) do( for ffxLight in (referenceLights.selection as array) do( if finditem gp_ffxArr[ffx].lights gp_ffxLightArr[ffxLight] != 0 then( gp_ffxArr[ffx].removeLight gp_ffxLightArr[ffxLight] ) else() ) ) ) displayLights() )----------------------------------------------------------- on lightPerFume changed state do( if state == true then( if (LayerManager.getLayerFromName "gp_FFX_ReferenceLights") == undefined then( LayerManager.newLayerFromName "gp_FFX_ReferenceLights" ) else() if (LayerManager.getLayerFromName "gp_FFX_LightPerFume") == undefined then( LayerManager.newLayerFromName "gp_FFX_LightPerFume" ) else() (LayerManager.getLayerFromName "gp_FFX_LightPerFume").current = true for lightIndex in referenceLights.selection do( lightNode=gp_ffxLightArr[lightIndex] (LayerManager.getLayerFromName "gp_FFX_ReferenceLights").addNode lightNode for ffxIndex in selectFFX.selection do( ffxNode = gp_ffxArr[ffxIndex] ffxName = gp_ffxNamesArr[ffxIndex] lightCopy = copy lightNode if lightNode.target != undefined then( targetCopy = copy lightNode.target lightCopy.target = targetCopy ) lightCopy.name = lightNode.name +"_"+ ffxName if finditem gp_lightsPerFumeNamesArr lightCopy.name !=0 then( delete lightCopy ) else( if lightCopy.includeList == undefined then ( lightCopy.includeList = #(ffxNode) ) else( append lightCopy.includeList ffxNode ) ffxNode.addLight lightCopy (LayerManager.getLayerFromName "gp_FFX_LightPerFume").addNode lightCopy ffxNode.removeLight lightNode ) ) ) (LayerManager.getLayerFromName "gp_FFX_ReferenceLights").renderable = false ) else( for ffxIndex in selectFFX.selection do( ffxNode = gp_ffxArr[ffxIndex] for refLightIndex in (referenceLights.selection as array) do( for lightIndex = ffxNode.lights.count to 1 by -1 do( lightNode = ffxNode.lights[lightIndex] if lightNode != undefined and (findItem gp_lightsPerFumeArr lightNode) !=0 then( if refLightIndex != undefined then( refLightName = gp_ffxLightNamesArr[refLightIndex] if (matchPattern lightNode.name pattern:(refLightName + "*")) == true then( ffxNode.removeLight lightNode ffxNode.addLight (getNodeByName refLightName) delete lightNode ) else() ) else() ) else() ) ) ) (LayerManager.getLayerFromName "gp_FFX_ReferenceLights").renderable = true ) (LayerManager.getLayerFromName "gp_FFX_LightPerFume").nodes &gp_lightsPerFumeArr gp_lightsPerFumeNamesArr = #() for theLightNode in gp_lightsPerFumeArr do( append gp_lightsPerFumeNamesArr theLightNode.name ) displayLights() )----------------------------------------------------------- on ffxFire changed state do( re = maxOps.GetCurRenderElementMgr() if state == false then( thisRE = getclassinstances FumeFX_Fire re.RemoveRenderElement thisRE[1] ) else( --thisRE = getclassinstances FumeFX_Fire re.AddRenderElement (FumeFX_Fire elementName:"FumeFx Fire") ) )----------------------------------------------------------- on ffxSmoke changed state do( re = maxOps.GetCurRenderElementMgr() if state == false then( thisRE = getclassinstances FumeFX_Smoke re.RemoveRenderElement thisRE[1] ) else( re.AddRenderElement (FumeFX_Smoke elementName:"FumeFx Smoke") ) )----------------------------------------------------------- on zDepth changed state do( re = maxOps.GetCurRenderElementMgr() if state == false then( thisRE = getclassinstances FusionWorks_Z_Depth re.RemoveRenderElement thisRE[1] ) else( re.AddRenderElement (FusionWorks_Z_Depth elementName:"zDepth") ) )----------------------------------------------------------- on scanLineShadow changed state do( re = maxOps.GetCurRenderElementMgr() if state == false then( thisRE = getclassinstances ShadowRenderElement re.RemoveRenderElement thisRE[1] ) else( re.AddRenderElement (ShadowRenderElement elementName:"scanLine Shadow") ) )----------------------------------------------------------- on VRayShadow changed state do( re = maxOps.GetCurRenderElementMgr() if state == false then( thisRE = getclassinstances VrayShadows re.RemoveRenderElement thisRE[1] ) else( re.AddRenderElement (VrayShadows elementName:"Vray Shadows") ) )----------------------------------------------------------- on FRshadow changed state do( re = maxOps.GetCurRenderElementMgr() if state == false then( thisRE = getclassinstances FR_Shadows re.RemoveRenderElement thisRE[1] ) else( re.AddRenderElement (FR_Shadows elementName:"FR Shadows") ) )----------------------------------------------------------- on elementsActive changed state do( re = maxOps.GetCurRenderElementMgr() if state == true then( re.SetElementsActive true ) else( re.SetElementsActive false ) )----------------------------------------------------------- on mainPath pressed do ( oldPath = gp_mainPath gp_mainPath = getSavePath caption:"set main output folder..." initialDir:gp_mainPath if gp_mainPath == undefined then( gp_mainPath = oldPath ) else() showFullPath gp_mainPath gp_sessionName gp_fileName )-------------------------------------------- on sessionName entered text do( gp_sessionName = sessionName.text showFullPath gp_mainPath gp_sessionName gp_fileName )-------------------------------------------- on fileName entered text do( gp_fileName = fileName.text showFullPath gp_mainPath gp_sessionName gp_fileName )-------------------------------------------- on setFolderPath pressed do( if renderSceneDialog.isopen() == true then renderSceneDialog.close() else() if (doesFileExist (gp_mainPath + "\\" + gp_sessionName)) == false then( makeDir (gp_mainPath + "\\" + gp_sessionName) ) else() rendSaveFile = true rendOutputFileName = gp_fullPath renderSceneDialog.open() ) ) FFXrenderManager = newRolloutfloater "FFX-RenderManager" 810 620 addRollout manageFFX FFXrenderManager )