filein (RsConfigGetWildWestDir() + "script/3dsmax/maps/LODBaker_Core.ms") rollout LODBakeMachine "Bake Machine" ( edittext edtMachineName button btnConfirm "Confirm" on btnConfirm pressed do ( local theMachine = edtMachineName.text append ::LODBakerBatchUI.machines theMachine append ::LODBakerBatchUI.jobs (DataPair machine:theMachine jobs:#()) ::LODBakerBatchUI.lbMachines.items = ::LODBakerBatchUI.machines destroyDialog LODBakeMachine ) ) rollout LODBakerBatchUI "Batch Manager" ( --////////////////////////////////////////////////////// -- Vars --////////////////////////////////////////////////////// local machines = #() local jobs = #() local scenePool = #() local assignedJobs = #() --////////////////////////////////////////////////////// -- UI --////////////////////////////////////////////////////// label lblMachines "Machines" align:#left across:3 label lblJobs "Jobs" offset:[-170, 0] label lblPool "Scene Pool" offset:[-75, 0] multilistbox lbMachines items:machines width:100 height:20 across:5 multilistbox mlbJobs items:jobs width:200 height:20 offset:[-10, 0] button btnInPool "-->" offset:[55, 60] button btnOutPool "<--" offset:[-60, 140] multilistbox mlbScenePool items:scenePool width:200 height:20 offset:[-80, 0] button btnAddMachine "Add" across:3 align:#left button btnRemoveMachine "Remove" offset:[-220, 0] button btnShareJobs "Share Jobs" offset:[-70, 0] --button btnAddScene "Add" offset:[35, 0] --button btnRemoveScene "Remove" offset:[-55, 0] button btnSaveIni "Save Config" width:550 --////////////////////////////////////////////////////// -- Functions --////////////////////////////////////////////////////// --////////////////////////////////////////////////////// --Events dear boy --////////////////////////////////////////////////////// on LODBakerBatchUI open do ( --sync the ini file if gRsPerforce.connected() == false then gRsPerforce.Connect() gRsPerforce.run "sync" #(LODBaker.iniPath) --read the ini file local config = getIniSetting LODBaker.iniPath --populate ui arrays with whats there machines = for machine in (getIniSetting LODBaker.iniPath "MACHINEPOOL") collect getIniSetting LODBaker.iniPath "MACHINEPOOL" machine jobs = for machine in machines collect (dataPair machine:machine jobs:(getIniSetting LODBaker.iniPath machine)) --update scenePool with whats in p4 scenePool = for f in (getDepotFiles (RsConfigGetArtDir() + "Models/Handy objects/LODBakes") wildcard:"*.max" walk:true) where f.action != "delete" collect f.depotFile --populate UI fields lbMachines.items = machines mlbScenePool.items = for f in scenePool collect getFileNameFile f /* if lbMachines.selection.count > 0 then ( local selectedMachine = lbMachines.items[(lbMachines.selection as Array)[1]] if selectedMachine != undefined then ( mlbJobs.items = (for item in jobs where item.machine == selectedMachine collect item.jobs)[1] ) ) */ lbMachines.selection = 1 ) --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// fn lbMachines_Selected arg = ( local machineSelection = lbMachines.selection as Array if machineSelection.count == 1 then ( local selectedMachine = lbMachines.items[machineSelection[1]] --format "selectedMachine: % \n" selectedMachine local machineJobs = (for item in jobs where item.machine == selectedMachine collect item.jobs)[1] --format "machineJobs: % \n" machineJobs if machineJobs != undefined then ( mlbJobs.items = for f in machineJobs collect getFileNameFile f ) ) else ( mlbJobs.items = #() ) ) on lbMachines selected arg do lbMachines_Selected arg --////////////////////////////////////////////////////// -- remove jobs from machine --////////////////////////////////////////////////////// on btnInPool pressed do ( --remove them from the machine jobs list local machineSelection = lbMachines.selection as Array local machine = lbMachines.items[machineSelection[1]] local machineJobsIdx = (for i=1 to jobs.count where machine == jobs[i].machine collect i)[1] local machineJobs = jobs[machineJobsIdx].jobs --get assigned jobs selected local selectedJobs = for it in mlbJobs.selection collect machineJobs[it] format "selectedJobs: % \n" selectedJobs --remove selected jobs from machine jobs --local cleanedJobs = #() for sj in selectedJobs do ( local foundIdx = findItem machineJobs sj if foundIdx != 0 then deleteItem machineJobs foundIdx --remove from assigned jobs local foundIdx = findItem assignedJobs sj if foundIdx != 0 then deleteItem assignedJobs foundIdx ) format "machineJobs: % \n" machineJobs jobs[machineJobsIdx].jobs = machineJobs ) --////////////////////////////////////////////////////// -- assign jobs to a machine --////////////////////////////////////////////////////// on btnOutPool pressed do ( --get the selected scenes local scenePoolSelectionIdx = mlbScenePool.selection as Array local scenePoolSelection = for i in scenePoolSelectionIdx collect scenePool[i] --assign them to the jobs array for the machine local machineSelection = lbMachines.selection as Array local machine = lbMachines.items[machineSelection[1]] local machineJobsIdx = (for i=1 to jobs.count where machine == jobs[i].machine collect i)[1] local machineJobs = jobs[machineJobsIdx].jobs --check if tis already assigned local cleanScenePoolSelection = #() for scn=1 to scenePoolSelection.count do ( if findItem assignedJobs scenePoolSelection[scn] == 0 then ( append cleanScenePoolSelection scenePoolSelection[scn] ) ) join machineJobs cleanScenePoolSelection jobs[machineJobsIdx].jobs = machineJobs --add to assigned Jobs join assignedJobs cleanScenePoolSelection mlbJobs.items = for f in machineJobs collect getFileNameFile f ) --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// on btnAddMachine pressed do ( createDialog LODBakeMachine ) --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// on btnRemoveMachine pressed do ( if queryBox "Are you sure you want to delete this machine and any of its jobs?" then ( local Idx = findItem machines lbMachines.selected if Idx != 0 then ( deleteItem machines Idx local jobsClone = deepcopy jobs for i=1 to jobs.count where jobs[i].machine == lbMachines.selected do deleteItem jobsClone i jobs = jobsClone lbMachines.items = machines ) lbMachines.selection = 1 ) ) --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// on btnShareJobs pressed do ( --check we have multi selections for machines and for scenepool items if lbMachines.selection.count < 2 or mlbScenePool.selection.count < 2 then ( messagebox "You need multiple selections for machines and scenepool to share them out" title:"Error" return false ) --how many scene to dish out? local theScenes = for item in (mlbScenePool.selection as Array) collect scenePool[item] local theMachines = for item in (lbMachines.selection as Array) collect lbMachines.items[item] local sceneIdx = theScenes.count --format "sceneIdx: % \n" sceneIdx local machineIdx = 1 while sceneIdx != 0 do ( --assign the scene to the machine local theMachine = theMachines[machineIdx] local machineJobsIdx = (for i=1 to jobs.count where theMachine == jobs[i].machine collect i)[1] local machineJobs = jobs[machineJobsIdx].jobs --append machineJobs theScenes[sceneIdx] append jobs[machineJobsIdx].jobs theScenes[sceneIdx] --inc machineIdx if machineIdx != theMachines.count then machineIdx +=1 else machineIdx = 1 --dec sceneIdx sceneIdx -= 1 ) ) --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// on btnSaveIni pressed do ( for theMachine in machines do ( --delete the current jobs delIniSetting LODBaker.iniPath theMachine --get the jobs local theMachineJobs = (for item in jobs where item.machine == theMachine collect item.jobs)[1] for job in theMachineJobs do ( local formattedJob = (filterString (substituteString job "//depot/gta5/art/Models/Handy objects/LodBakes/" "") ".")[1] setIniSetting LODBaker.iniPath theMachine formattedJob "1024 1024" ) --add any new machines to the machine pool local theINIMachines = getIniSetting LODBaker.iniPath "MACHINEPOOL" --format "theINIMachines: % \n" theINIMachines if machines.count != theINIMachines.count then ( for idx = (theINIMachines.count + 1) to machines.count do ( setIniSetting LODBaker.iniPath "MACHINEPOOL" ("machine"+(idx as String)) machines[idx] ) ) ) ) ) try(DestroyDialog LODBakerUI)catch() rollout LODBakerUI "LOD Baker" ( --////////////////////////////////////////////////////// -- Vars --////////////////////////////////////////////////////// local __DEBUG__ = true --local defaultBackGroundColour = color 255 0 255 --////////////////////////////////////////////////////// -- UI --////////////////////////////////////////////////////// dotNetControl rsBannerPanel "Panel" pos:[0,0] height:32 width:LODBakerUI.width local banner = makeRsBanner dn_Panel:rsBannerPanel wiki:"LODBaker" versionNum:1.01 versionName:"Frightful Heir" filename:(getThisScriptFilename()) group "Settings:" ( label lblTxScale "Scene Texture Scale:" across:2 align:#left offset:[0, 3] dropdownlist ddlTxScale items:#("100%", "75%", "50%", "25%", "12.5%") tooltip:"Texture Scale" label lblBakeRes "Bake Size X: " across:4 offset:[0, 3] dropdownlist ddlMapX items:LODBaker.res tooltip:"Map Width" offset:[5, 0] label lblBakeY "Y:" offset:[0, 3] dropdownlist ddlMapY items:LODBaker.res tooltip:"Map Height" offset:[-20, 0] colorpicker cpSetBackgroundColour "Background Colour: " color:LODBaker.defaultBackGroundColour title:"Choose New BackGround Colour" label lblPath "Path:" across:3 align:#left width:40 edittext edtPath width:160 offset:[-50, 0] tooltip:"Map path" button btnBrowse "..." align:#right tooltip:"Browse path" ) group "" ( button btnBake "Bake!" width:230 tooltip:"Bake the map" button btnShowLast "Show last bake" width:230 tooltip:"Show map set in the path field" button btnBatchSetup "Batch Setup" width:230 tooltip:"Setup multiple bakes" ) --////////////////////////////////////////////////////// --Events dear boy --////////////////////////////////////////////////////// on LODBakerUI open do ( banner.setup() LODBaker.mapRes_X = LODBaker.res[ddlMapX.selection] as Float LODBaker.mapRes_Y = LODBaker.res[ddlMapY.selection] as Float if gRsIsOutSource do btnBatchSetup.enabled = false ) --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// on LODBakerUI close do ( try(DestroyDialog LODBakerBatchUI)catch() ) --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// fn ddlMapResChanged arg dim = ( case dim of ( "x": ( LODBaker.mapRes_X = LODBaker.res[arg] as Float ddlMapY.selection = arg LODBaker.mapRes_Y = LODBaker.res[arg] as Float ) "y":LODBaker.mapRes_Y = LODBaker.res[arg] as Float ) ) --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// on ddlMapX selected arg do ddlMapResChanged arg "x" on ddlMapY selected arg do ddlMapResChanged arg "y" --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// fn ddlTxScaleChanged arg = ( case (arg as String) of ( "1":LODBaker.txScale = "To100pcScene" "2":LODBaker.txScale = "To75pcScene" "3":LODBaker.txScale = "To50pcScene" "4":LODBaker.txScale = "To25pcScene" "5":LODBaker.txScale = "To12pcScene" ) ) --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// on ddlTxScale selected arg do ddlTxScaleChanged arg --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// on btnBrowse pressed do ( local chosenPath = getSaveFileName caption:"LODMap save location" filename:LODBaker.bakePath types:"BMP(*.bmp)|*.bmp" if chosenPath != undefined then ( chosenPath = RsMakeSafeSlashes chosenPath LODBaker.bakePath = chosenPath edtPath.text = chosenPath ) ) --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// on btnBake pressed do ( LODBaker.createBakeLog() LODBaker.doTheBake mode:"manual" closeLog LODBaker.processLog ) --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// on btnBatchSetup pressed do ( if gRsIsOutSource do return false try(DestroyDialog LODBakerBatchUI)catch() createDialog LODBakerBatchUI width:600 height:350 ) --////////////////////////////////////////////////////// -- --////////////////////////////////////////////////////// on btnShowLast pressed do ( last = openbitmap LODBaker.bakePath display last ) --////////////////////////////////////////////////////// -- Set the new backgroundcolour for the -- LOD bake --////////////////////////////////////////////////////// on cpSetBackgroundColour changed col do ( LODBaker.defaultBackGroundColour = col ) ) createDialog LODBakerUI width:250 height:265