-- ImageTool.ms -- Steve Burke -- www.burkestudios.com -- version 1.1 -- CREATED: 02-23-2011 --3dsmax 2011 -- MODIFIED: 03-16-2011 --3dsmax 2011 ( global automat_ImageTool global Roll_automat_ImageTool local CurrentINI = GetDir #plugcfg + "\\automat_ImageTool.ini" local bool_GetNewImage = true local UserSceneAmbientLightColor = ambientColor local TempBoostAmbientLightColor = undefined local MaxVers = (((MaxVersion())[1] / 1000) as Integer) --13 is max 2011 --CALLBACK!!!! local enableImageToolCallbacks local disableImageToolCallbacks function enableImageToolCallbacks = ( callbacks.removeScripts #postRender id:#automatImageTool callbacks.addScript #postRender "Roll_automat_ImageTool.newRenderCompletedFunction()" id:#automatImageTool ) -- function disableImageToolCallbacks = ( callbacks.removeScripts #postRender id:#automatImageTool ) --INI settings -------------------------------------------------------- struct struct_ImageTools ( imagesource = 1, gridx = 3, gridy = 3, gridcolor = red, posterlevels = 4, size = 2, autocheck = false, dogrid = true, dogray = true, domirror = true, usegamma = false, gammavalue = 2.2, add = true ) -------------------------------------------------------- local LastRender global automat_ImageLove local ImageToolPrefs global automat_roll_ImageLoveDisplay global automat_ImageLovePos local GammaStatusText = "-" --function names -------------------------------------------------------- local getPrefsFromUI local checkLastRender local newRenderCompletedFunction local showImageLove -------------------------------------------------------- function getGammaStatus = ( -- returns GammaStatusText try ( if #gamma == IDisplayGamma.colorCorrectionMode then ttext1 = "ON:" else if #LUT == IDisplayGamma.colorCorrectionMode then return ( GammaStatusText = "LUT" ) else return( GammaStatusText = "OFF" ) ttext2 = IDisplayGamma.gamma as string + " " ttext3 = "in:" + fileInGamma as string + " " ttext4 = "out:" + fileOutGamma as string + " " GammaStatusText = ttext1 + ttext2 + ttext3 + ttext4 ) catch ( ". . . requires max 2008+" ) ) local magy = 115 --UI --///////////////////////////////////////////// -------------------------------------------------------- rollout Roll_automat_ImageTool "Image Tools" ( group "Max Gamma:" ( button but_GamUpdate "i" width:20 pos:[9,25] enabled:false tooltip:"Show current gamma setting info" button but_GamOn "On" width:28 pos:[36,25] enabled:false tooltip:"Enable max gamma correction" button but_GamOff "Off" width:28 pos:[64,25] enabled:false tooltip:"Disable max gamma correction" button but_GamSettings "prefs..." width:48 pos:[98,25] tooltip:"Open max Gamma settings dialog" edittext text_GammaStatus text:GammaStatusText width:144 offset:[-8,0] readonly:true ) -------------- group "Temp Ambient Boost:" ( checkbutton but_Boost "activate" height:20 width:50 across:2 offset:[-4,0] tooltip:"Check to boost ambient scene light, helpful on occassion, such as when painting with Viewport Canvas.\n\nTurns itself off when you close this rollout so you won't later wonder why your scene lighting is all messed up." spinner spin_Ambient "Boost:" width:70 range:[0,100,20] type: #integer offset:[-6,3] ) -------------- group "Image Check:" ( radiobuttons radio_ImageSource "Source:" labels: #("max render FB","VRayRT window","from file") columns:1 --button but_pickImage "pick..." width:60 height:16 pos:[71,73] button but_CheckRender "Check" width:124 height:30 offset:[0,4] tooltip:"Left-click: Create an image check from selected source.\n\nRight-click: Reuse the last image but apply new dialog settings." checkbox check_DoGrid "grid" checked:true offset:[0,6] columns:2 checkbox check_DoGray "value" checked:true checkbox check_DoMirror "mirror" checked:true label label_GridColor "Grid Color" pos:[91,magy+134] colorPicker pick_GridColor "" color:red modal:false pos:[90,magy+150] checkbox check_Add "additive" checked:true pos:[86,magy+172] label label_grid "Grid Sections:" offset:[0,10] spinner spin_GridX "X:" range:[1,100,3] type: #integer width:60 offset:[-12,0] across:2 spinner spin_GridY "Y:" range:[1,100,3] type: #integer width:60 offset:[-10,0] --label label_posterize "Posterize Levels:" spinner spin_poster "Gray Levels:" range:[2,256,4] type: #integer align: #right offset:[4,5] --label label_thumbsize "Size of Thumbnails:" spinner spin_thumbsize "(size=1/x) X:" range:[1,20,2] type: #integer align: #right offset:[4,0] -- checkbox check_UseGamma "Gamma Adj." offset:[-5,4] checked:false across:2 spinner spin_GammaValue "" range:[0,4,2.2] width:60 offset:[-8,4] enabled:false -- checkbox check_autoCheck "auto-check each render?" checked:false align: #right offset:[7,0] tooltip:"" enabled:false label label_maxFB "( max Render FB only )" offset:[0,-4] ) --INI related -------------------------------------------------------- on Roll_automat_ImageTool open do ( if MaxVers >= 10 do ( but_GamOn.enabled = but_GamOff.enabled = but_GamUpdate.enabled = true ) text_GammaStatus.text = getGammaStatus() as string ImageToolPrefs = struct_ImageTools() -- getapref = execute ( getINISetting CurrentINI "Check Last Render" "AmbientBoost" ) if getapref != OK do spin_Ambient.value = getapref getapref = execute ( getINISetting CurrentINI "Check Last Render" "GridX" ) if getapref != OK do spin_GridX.value = getapref getapref = execute ( getINISetting CurrentINI "Check Last Render" "GridY" ) if getapref != OK do spin_GridY.value = getapref getapref = execute ( getINISetting CurrentINI "Check Last Render" "GridColor" ) if getapref != OK do pick_GridColor.color = getapref getapref = execute ( getINISetting CurrentINI "Check Last Render" "PosterLevels" ) if getapref != OK do spin_poster.value = getapref getapref = execute ( getINISetting CurrentINI "Check Last Render" "Size" ) if getapref != OK do spin_thumbsize.value = getapref getapref = execute ( getINISetting CurrentINI "Check Last Render" "AutoCheck" ) if getapref != OK do check_autoCheck.checked = getapref getapref = execute ( getINISetting CurrentINI "Check Last Render" "DoGrid" ) if getapref != OK do check_DoGrid.checked = getapref getapref = execute ( getINISetting CurrentINI "Check Last Render" "DoGray" ) if getapref != OK do check_DoGray.checked = getapref getapref = execute ( getINISetting CurrentINI "Check Last Render" "DoMirror" ) if getapref != OK do check_DoMirror.checked = getapref getapref = execute ( getINISetting CurrentINI "Check Last Render" "Add" ) if getapref != OK do check_add.checked = getapref getapref = execute ( getINISetting CurrentINI "Check Last Render" "UseGamma" ) if getapref != OK do check_UseGamma.checked = spin_GammaValue.enabled = getapref getapref = execute ( getINISetting CurrentINI "Check Last Render" "GammaValue" ) if getapref != OK do spin_GammaValue.value = getapref -- getapref = execute ( getINISetting CurrentINI "Check Last Render" "ImageSource" ) if getapref != OK do ( radio_ImageSource.state = getapref if 1 != getapref then check_autoCheck.enabled = label_maxFB.enabled = false else check_autoCheck.enabled = label_maxFB.enabled = true ) -- if check_autoCheck.checked and 1 == radio_ImageSource.state then ( enableImageToolCallbacks() ) else disableImageToolCallbacks() ) --BUTTONS --///////////////////////////////////////////// -------------------------------------------------------- -------------------------------------------------------- on but_GamUpdate pressed do ( text_GammaStatus.text = getGammaStatus() as string ) on but_GamOn pressed do ( --2008+ only if MaxVers >= 10 do ( IDisplayGamma.colorCorrectionMode = #gamma text_GammaStatus.text = getGammaStatus() as string ) ) on but_GamOff pressed do ( if MaxVers >= 10 do ( IDisplayGamma.colorCorrectionMode = #none text_GammaStatus.text = getGammaStatus() as string ) ) on but_GamSettings pressed do ( --go right to gamma is a 2010+ only feature if maxVers >= 12 then ( execute "max file preferences gamma" ) else ( max file preferences ) ) -------------------------------------------------------- local ColorAdd -------------------------------------------------------- function tweakAmbient = ( ColorAdd = ( color (v=spin_Ambient.value/100.0*255) v v ) if (color 0 0 0 ) == AmbientColor then ( TempBoostAmbientLightColor = AmbientColor = coloradd ) else ( newr = UserSceneAmbientLightColor.r + coloradd.r if newr > 255 do newr = 255 newg = UserSceneAmbientLightColor.g + coloradd.g if newg > 255 do newg = 255 newb = UserSceneAmbientLightColor.b + coloradd.b if newb > 255 do newb = 255 -- TempBoostAmbientLightColor = AmbientColor = ( color newr newg newb ) ) ) -------------------------------------------------------- on but_Boost changed state do with undo off ( if state then ( UserSceneAmbientLightColor = AmbientColor -- tweakAmbient() ) else ( AmbientColor = UserSceneAmbientLightColor ) redrawViews() --ALL ) on spin_Ambient changed SpinVal do with undo off ( if but_Boost.checked do tweakAmbient() redrawViews() setapref = setINISetting CurrentINI "Check Last Render" "AmbientBoost" (SpinVal as string ) ) on but_CheckRender rightclick do ( LastRender = GetLastRenderedImage copy:true if undefined != lastrender then ( display LastRender ) else messagebox "No Last Render image available." ) --INTERACTIVE -------------------------------------------------------- on radio_ImageSource changed state do ( setapref = setINISetting CurrentINI "Check Last Render" "ImageSource" (state as string ) if 1 != state then ( --remove callback disableImageToolCallbacks() check_autoCheck.enabled = label_maxFB.enabled = false ) else ( check_autoCheck.enabled = label_maxFB.enabled = true if true == check_autoCheck.checked do enableImageToolCallbacks() ) ) on spin_GridX changed state do ( setapref = setINISetting CurrentINI "Check Last Render" "GridX" (state as string ) ) -------------- on spin_GridY changed state do ( setapref = setINISetting CurrentINI "Check Last Render" "GridY" (state as string ) ) -------------- on pick_GridColor changed newcolor do ( setapref = setINISetting CurrentINI "Check Last Render" "GridColor" (newcolor as string ) ) -------------- on spin_poster changed state do ( setapref = setINISetting CurrentINI "Check Last Render" "PosterLevels" (state as string ) ) -------------- on spin_thumbsize changed state do ( setapref = setINISetting CurrentINI "Check Last Render" "Size" (state as string ) ) -------------- on check_autoCheck changed state do ( setapref = setINISetting CurrentINI "Check Last Render" "AutoCheck" (state as string ) if state then enableImageToolCallbacks() else disableImageToolCallbacks() ) -------------- on check_DoGrid changed state do ( setapref = setINISetting CurrentINI "Check Last Render" "DoGrid" (state as string ) ) -------------- on check_DoGray changed state do ( setapref = setINISetting CurrentINI "Check Last Render" "DoGray" (state as string ) ) -------------- on check_DoMirror changed state do ( setapref = setINISetting CurrentINI "Check Last Render" "DoMirror" (state as string ) ) -------------- on check_UseGamma changed state do ( setapref = setINISetting CurrentINI "Check Last Render" "UseGamma" (state as string ) if state then spin_GammaValue.enabled = true else spin_GammaValue.enabled = false ) -------------- on spin_GammaValue changed state do ( setapref = setINISetting CurrentINI "Check Last Render" "GammaValue" (state as string ) ) -------------- on check_add changed state do ( setapref = setINISetting CurrentINI "Check Last Render" "Add" (state as string ) ) -------------------------------------------------------- function getPrefsFromUI = ( ImageToolPrefs.imagesource = radio_ImageSource.state ImageToolPrefs.gridx = spin_GridX.value ImageToolPrefs.gridy = spin_GridY.value ImageToolPrefs.gridcolor = pick_GridColor.color ImageToolPrefs.posterlevels = spin_poster.value ImageToolPrefs.size = spin_thumbsize.value ImageToolPrefs.dogrid = check_DoGrid.checked ImageToolPrefs.dogray = check_DoGray.checked ImageToolPrefs.domirror = check_DoMirror.checked ImageToolPrefs.usegamma = check_UseGamma.checked ImageToolPrefs.gammavalue = spin_GammaValue.value ImageToolPrefs.add = check_add.checked ) --///////////////////////////////////////////// -------------------------------------------------------- on but_CheckRender pressed do ( getPrefsFromUI() bool_GetNewImage = true checkLastRender ImageToolPrefs ) on but_CheckRender rightclick do ( getPrefsFromUI() bool_GetNewImage = false --reuse last image checkLastRender ImageToolPrefs ) function newRenderCompletedFunction = ( if check_autoCheck.checked do ( --verify max frame buffer is being used? getPrefsFromUI() checkLastRender ImageToolPrefs ) ) on roll_automat_ImageTool close do ( if undefined != TempBoostAmbientLightColor do ( ambientColor = UserSceneAmbientLightColor redrawViews() ) ) )--END rollout --FUNCTIONS --///////////////////////////////////////////// -------------------------------------------------------- -------------------------------------------------------- function checkLastRender ImageToolPrefs = ( if bool_GetNewImage do ( if 1 == ImageToolPrefs.imagesource then ( NewImage = GetLastRenderedImage copy:true if undefined == NewImage do ( messagebox "No rendered image currently available in max frame buffer. Please render something and try again." return false ) ) else if 2 == ImageToolPrefs.imagesource then ( NewImage = undefined try ( NewImage = vrayGetRTBitmap() )catch() if undefined == NewImage do ( messagebox "Couldn't find an image. Is VRay RT running with an activeshade window open?" return false ) ) else if 3 == ImageToolPrefs.imagesource do ( NewImage = undefined NewImage = selectbitmap() if undefined == NewImage do ( messagebox "Couldn't load that image. Sorry." return false ) ) LastRender = NewImage ) bool_GetNewImage = true if undefined != lastrender do ( local doamount = 0 if ImageToolPrefs.dogrid do doamount += 1 if ImageToolPrefs.dogray do doamount += 1 if ImageToolPrefs.domirror do doamount += 1 if doamount > 0 do ( -- imagewidth = LastRender.width imageheight = LastRender.height newimagewidth = LastRender.width / ImageToolPrefs.size newimageheight = LastRender.height / ImageToolPrefs.size gridxposition = #{} gridyposition = #{} gridxposition.count = newimagewidth gridyposition.count = newimageheight xsections = newimagewidth as float / ImageToolPrefs.gridx ysections = newimageheight as float / ImageToolPrefs.gridy xmax = ImageToolPrefs.gridx - 1 ymax = ImageToolPrefs.gridy - 1 loopcount = if xmax > ymax then xmax else ymax -------------- for loop = 1 to loopcount do ( if loop <= xmax then a = #{ ( floor ( xsections * loop + 0.5 ) ) } else a=#{} --changed to floor with +0.5 add if loop <= ymax then b = #{ ( floor ( ysections * loop + 0.5 ) ) } else b=#{} gridxposition += a gridyposition += b ) local gammamult = 1 if ImageToolPrefs.usegamma then ( automat_ImageLove = bitmap ( newimagewidth * doamount ) newimageheight color:black gamma:ImageToolPrefs.gammavalue --gammamult = 1 ) else ( automat_ImageLove = bitmap ( newimagewidth * doamount ) newimageheight color:black --gammamult = 1 ) for y = 0 to newimageheight - 1 do ( lineofpixels = getPixels LastRender [0,y * ImageToolPrefs.size ] imagewidth pixlineposter=#() pixlineflipx=#() pixlinecolor=#() pixgridcolor=#() assemblearray=#() -- for x = 1 to newimagewidth do ( pixcolor = lineofpixels[ x * ImageToolPrefs.size ] pixvalue = lineofpixels[ x * ImageToolPrefs.size ].value --^ ( gammamult ) --format "pixvalue: %\n" pixvalue -------------- if gridyposition[ y + 1 ] or gridxposition[x] then ( if ImageToolPrefs.add then pixgrid = ( ImageToolPrefs.gridcolor + pixcolor ) else pixgrid = ImageToolPrefs.gridcolor /2 + pixcolor/2 ) else pixgrid = pixcolor pixposter = ( floor ( pixvalue / 255 * ImageToolPrefs.posterlevels ) ) / ( ImageToolPrefs.posterlevels - 1 ) * 255 -------------- pixgridcolor[x] = pixgrid pixlinecolor[x] = pixcolor --color pixcolor[1] pixcolor[2] pixcolor[3] 0 --( lineofpixels[ x * ImageToolPrefs.size ].alpha ) pixlineposter[x] = color pixposter pixposter pixposter pixposter pixlineflipx[newimagewidth - x + 1] = pixcolor ) --sort if ImageToolPrefs.dogrid do append assemblearray pixgridcolor if ImageToolPrefs.dogray do append assemblearray pixlineposter if ImageToolPrefs.domirror do append assemblearray pixlineflipx setPixels automat_ImageLove [0,y] assemblearray[1] --pixgridcolor --pixlinecolor if doamount > 1 do setPixels automat_ImageLove [ newimagewidth, y ] assemblearray[2] --pixlineposter if doamount > 2 do setPixels automat_ImageLove [newimagewidth * 2,y] assemblearray[3] --pixlineflipx ) showImageLove() ) --no options checked. nothing to do ) ) -------------------------------------------------------- function showImageLove = ( try( destroyDialog automat_roll_ImageLoveDisplay ) catch() rollout automat_roll_ImageLoveDisplay "Image Check" ( on automat_roll_ImageLoveDisplay moved NewPos do ( automat_ImageLovePos = NewPos ) on automat_roll_ImageLoveDisplay lbuttondown MousePos do ( display automat_ImageLove ) ) if undefined != automat_ImageLovePos then createDialog automat_roll_ImageLoveDisplay \ automat_ImageLove.width automat_ImageLove.height automat_ImageLovePos.x automat_ImageLovePos.y bitmap:automat_ImageLove -------------- else createDialog automat_roll_ImageLoveDisplay automat_ImageLove.width automat_ImageLove.height bitmap:automat_ImageLove ) if true != automat_OpenScriptAsRollout then ( try (closeRolloutfloater automat_ImageTool ) catch () automat_ImageTool = newRolloutFloater "Image Tool" 170 102 addRollout roll_automat_ImageTool automat_ImageTool automat_ImageTool.size.y = ( roll_automat_ImageTool.height + 30 ) ) else() )