-- Trooper Viewport Bookmarks -- V 0.1 Release -- V 0.2 The list box is now 28 rows, two little bugs are fixed -- V 0.3 UI is scalable now, more data is stored: viewport type, fov (courtesy of Simon Bourgeois) -- V 0.4 right click on a bookmark name updates the bookmark with the current viewport -- V 0.5 the bookmark list can now be reordered with the two up and down buttons -- V 0.6 Export Bookmarks to camera -- V 0.7 Added a button to just create a camera for the current bookmark -- V 0.8 Added a Function to create an animation from all perspective bookmarks, starting at the selected bookmark, and undo for camera creation macroScript bookmarks category:"Trooper" tooltip:"Viewport Bookmarks" buttontext:"Bookmarks" ( try(cui.UnRegisterDialogBar ::bookmarkRollout)catch() if bookmarkRollout != undefined then ( destroyDialog bookmarkRollout) ( local bookmarkNames = #() local bookmarkTMs = #() local bookmarkViewTypes = #() local bookmarkFovs = #() local bookmarkStartCoord = #() local bookmarkEndCoord = #() local bookmarkVs = #() local bookmarkFd = #() local nodeB local frameDistance fn minmaxSwap p3min p3max = ( if p3min.x > p3max.x do swap p3min.x p3max.x if p3min.y > p3max.y do swap p3min.y p3max.y if p3min.z > p3max.z do swap p3min.z p3max.z #(p3min, p3max) ) fn updateBookmarkList = ( bookmarkRollout.lbxBookmarks.items = bookmarkNames ) fn saveBookmarks = ( nodeB = getNodeByName "Bookmarks" if nodeB == undefined do ( nodeB = point name:"Bookmarks" pos:[0,0,0] nodeB.isHidden = true ) setUserPropVal nodeB #bookmarkNames bookmarkNames setUserPropVal nodeB #bookmarkTMs bookmarkTMs setUserPropVal nodeB #bookmarkViewTypes bookmarkViewTypes setUserPropVal nodeB #bookmarkStartCoord bookmarkStartCoord setUserPropVal nodeB #bookmarkEndCoord bookmarkEndCoord setUserPropVal nodeB #bookmarkVs bookmarkVs setUserPropVal nodeB #bookmarkFd bookmarkFd setUserPropVal nodeB #bookmarkFovs bookmarkFovs ) fn storeBookmark nameA tm viewtype StartCoord EndCoord vs fov fd = ( append bookmarkNames nameA append bookmarkTMs tm append bookmarkViewTypes viewtype append bookmarkStartCoord StartCoord append bookmarkEndCoord EndCoord append bookmarkVs vs append bookmarkFd fd append bookmarkFovs fov updateBookmarkList() saveBookmarks() ) fn deleteBookmark index = ( if index == 0 then ( print "select item" ) else ( deleteItem bookmarkNames index deleteItem bookmarkTMs index deleteItem bookmarkViewTypes index deleteItem bookmarkStartCoord index deleteItem bookmarkEndCoord index deleteItem bookmarkVs index deleteItem bookmarkFd index deleteItem bookmarkFovs index updateBookmarkList() saveBookmarks() ) ) fn jumpToBookmark index = ( if index > 0 and index <= bookmarkTMs.count then ( viewport.SetType bookmarkViewTypes[index] if bookmarkViewTypes[index] == #view_persp_user or bookmarkViewTypes[index] == #view_iso_user then ( viewport.setTM bookmarkTMs[index] if bookmarkViewTypes[index] == #view_persp_user then (viewport.SetFOV bookmarkFovs[index] ; viewport.SetFocalDistance bookmarkFd[index]) (viewport.ZoomToBounds off bookmarkStartCoord[index] bookmarkEndCoord[index] ; viewport.zoom (bookmarkFovs[index]/(viewport.getFOV()))) ) else (viewport.ZoomToBounds off bookmarkStartCoord[index] bookmarkEndCoord[index] ; viewport.zoom (bookmarkFovs[index]/(viewport.getFOV()))) ) ) fn renameBookmark index newName = ( if index > 0 and index <= bookmarkNames.count then ( bookmarkNames[index] = newName updateBookmarkList() saveBookmarks() ) ) fn loadBookmarks = ( nodeB = getNodeByName "Bookmarks" if nodeB != undefined and (doesUserPropExist nodeB #bookmarkNames) do ( bookmarkNames = getUserPropVal nodeB #bookmarkNames --asString:true bookmarkTMs = getUserPropVal nodeB #bookmarkTMs bookmarkViewTypes = getUserPropVal nodeB #bookmarkViewTypes bookmarkStartCoord = getUserPropVal nodeB #bookmarkStartCoord bookmarkEndCoord = getUserPropVal nodeB #bookmarkEndCoord bookmarkVs = getUserPropVal nodeB #bookmarkVs bookmarkFd = getUserPropVal nodeB #bookmarkFd bookmarkFovs = getUserPropVal nodeB #bookmarkFovs updateBookmarkList() ) ) fn updateBookmark index = ( if index > 0 and index <= bookmarkNames.count then ( tm = viewport.getTM() viewtype = viewport.getType() bounds = minmaxSwap ((MapScreenToView [0,0] 0) * Inverse(getViewTM())) ((MapScreenToView (GetViewSize()) 0) * Inverse(getViewTM())) StartCoord = bounds[1] EndCoord = bounds[2] vs = GetViewSize() fov = viewport.GetFOV() fd = viewport.getFocalDistance() --storeBookmark nameA tm viewtype StartCoord EndCoord vs fov fd nameA = bookmarkNames[index] bookmarkNames[index] = nameA bookmarkTMs[index] = tm bookmarkViewTypes[index] = viewtype bookmarkStartCoord[index] = StartCoord bookmarkEndCoord[index] = EndCoord bookmarkVs[index] = vs bookmarkFd[index] = fd bookmarkFovs[index] = fov updateBookmarkList() saveBookmarks() ) ) fn moveItemUp lb = ( sel = lb.selection if sel > 1 do ( swap bookmarkNames[sel] bookmarkNames[sel-1] swap bookmarkTMs[sel] bookmarkTMs[sel-1] swap bookmarkViewTypes[sel] bookmarkViewTypes[sel-1] swap bookmarkStartCoord[sel] bookmarkStartCoord[sel-1] swap bookmarkEndCoord[sel] bookmarkEndCoord[sel-1] swap bookmarkVs[sel] bookmarkVs[sel-1] swap bookmarkFd[sel] bookmarkFd[sel-1] swap bookmarkFovs[sel] bookmarkFovs[sel-1] saveBookmarks() lb.items = bookmarkNames lb.selection = sel - 1 ) ) fn moveItemDown lb = ( sel = lb.selection if sel < bookmarkNames.count do ( swap bookmarkNames[sel] bookmarkNames[sel+1] swap bookmarkTMs[sel] bookmarkTMs[sel+1] swap bookmarkViewTypes[sel] bookmarkViewTypes[sel+1] swap bookmarkStartCoord[sel] bookmarkStartCoord[sel+1] swap bookmarkEndCoord[sel] bookmarkEndCoord[sel+1] swap bookmarkVs[sel] bookmarkVs[sel+1] swap bookmarkFd[sel] bookmarkFd[sel+1] swap bookmarkFovs[sel] bookmarkFovs[sel+1] saveBookmarks() lb.items = bookmarkNames lb.selection = sel + 1 ) ) fn createCamerasOnBookmarks StarC EndC = ( local rend = getProperty renderers #current undo on ( for i = StarC to EndC do ( if bookmarkViewTypes[i] == #view_persp_user do ( if (classOf rend == Vray) then ( local newcam = VRayPhysicalCamera targeted:off transform:(inverseHighPrecision bookmarkTMs[i]) specify_fov:on fov:bookmarkFovs[i] name:(uniquename (bookmarkRollout.items[i]+"_Cam")) newcam.targeted = on newcam.target_distance = bookmarkFd[i] newcam.wirecolor = color 86 120 203 newcam.target.wirecolor = color 86 120 203 ) else if (classOf rend == corona) then ( local newcam = CoronaCam targeted:off transform:(inverseHighPrecision bookmarkTMs[i]) fovSource:0 fov:bookmarkFovs[i] name:(uniquename (bookmarkRollout.items[i]+"_Cam")) newcam.targeted = on newcam.targetDistance = bookmarkFd[i] ) else ( local newcam = Physical targeted:off transform:(inverseHighPrecision bookmarkTMs[i]) specify_fov:on fov:bookmarkFovs[i] name:(uniquename (bookmarkRollout.lbxBookmarks.items[i]+"_Cam")) newcam.targeted = on newcam.target_distance = bookmarkFd[i] newcam.wirecolor = color 86 120 203 newcam.target.wirecolor = color 86 120 203 ) ) ) ) ) fn animateCameraFromObjects objArray frameStep = ( local rend = getProperty renderers #current undo on ( if bookmarkViewTypes[objArray] == #view_persp_user do ( if (classOf rend == Vray) then ( local newcam = VRayPhysicalCamera targeted:off transform:(inverseHighPrecision bookmarkTMs[objArray]) specify_fov:on fov:bookmarkFovs[objArray] name:(uniquename ("Uber_Cam")) newcam.target_distance = bookmarkFd[i] ) else if (classOf rend == corona) then ( local newcam = CoronaCam targeted:off transform:(inverseHighPrecision bookmarkTMs[objArray]) fovSource:0 fov:bookmarkFovs[objArray] name:(uniquename ("Uber_Cam")) newcam.target_distance = bookmarkFd[i] ) else ( local newcam = Physical targeted:off transform:(inverseHighPrecision bookmarkTMs[objArray]) specify_fov:on fov:bookmarkFovs[objArray] name:(uniquename ("Uber_Cam")) newcam.target_distance = bookmarkFd[objArray] ) ) with animate on ( frameNum = 0 for i = objArray to bookmarkTMs.count do ( if bookmarkViewTypes[i] == #view_persp_user do ( frameDistance = bookmarkRollout.spnFrameDuration.value local objTransform = inverseHighPrecision bookmarkTMs[i] local objFOV = bookmarkFovs[i] frameNum = (((i-1) * frameDistance) + ((i-1) * bookmarkRollout.spnFrameHold.value)) at time frameNum newcam.transform = objTransform at time frameNum newcam.fov = objFOV frameNum = (frameNum + bookmarkRollout.spnFrameHold.value) at time frameNum newcam.transform = objTransform at time frameNum newcam.fov = objFOV ) ) select newcam animationRange = getTimeRange selection[1].controller #allKeys #children viewport.setCamera selection[1] ) ) ) rollout bookmarkRollout "Viewport Bookmarks" width:144 height:502 ( button 'btnFloat' "F" pos:[104,8] width:16 height:14 toolTip:"Float Dialog" align:#left button 'btnDockLeft' "<" pos:[86,8] width:16 height:14 toolTip:"Dock Left" align:#left button 'btnDockRight' ">" pos:[121,8] width:16 height:14 toolTip:"Dock Right" align:#left listbox 'lbxBookmarks' "Bookmarks" pos:[8,10] width:124 height:27 items:#() button 'btnAdd' "Add" pos:[6,405] width:64 height:19 align:#left button 'btnDelete' "Delete" pos:[70,405] width:64 height:19 align:#left edittext 'edtRename' "Rename" pos:[8,430] width:130 height:15 align:#left button btnDown "Move Down" pos:[70,384] width:64 height:14 button btnUp "Move Up" pos:[6,384] width:64 height:14 button btnCamSelected "CreateCam" pos:[6,450] width:64 toolTip:"Create cameras from current Bookmark. Works Only On Perspective Views" button btnCam "CreateCams" pos:[70,450] width:64 toolTip:"Create cameras from all Bookmarks. (Works Only On Perspective Views)" button btnCreateUberCam "Animate" pos:[6,474] width:64 toolTip:"Create an animated Uber Cam between bookmars. (Works Only On Perspective Views)" spinner spnFrameDuration "D " pos:[84,469] width:50 height:16 range:[1,1000,50] type:#integer toolTip:"Key Frame Distance" spinner spnFrameHold "H " pos:[84,483] width:50 height:16 range:[0,1000,25] type:#integer toolTip:"Hold time between bookmarks" on btnUp pressed do ( moveItemUp lbxBookmarks ) on btnDown pressed do ( moveItemDown lbxBookmarks ) on bookmarkRollout open do ( loadBookmarks() ) on btnFloat pressed do ( try(cui.UnRegisterDialogBar bookmarkRollout) catch() createDialog bookmarkRollout SetDialogSize bookmarkRollout [144,456] ) on btnDockLeft pressed do ( try(cui.UnRegisterDialogBar bookmarkRollout) catch() createDialog bookmarkRollout cui.RegisterDialogBar bookmarkRollout cui.DockDialogBar bookmarkRollout #cui_dock_left ) on btnDockRight pressed do ( try(cui.UnRegisterDialogBar bookmarkRollout) catch() createDialog bookmarkRollout cui.RegisterDialogBar bookmarkRollout cui.DockDialogBar bookmarkRollout #cui_dock_right ) on lbxBookmarks selected index do ( jumpToBookmark index ) on btnAdd pressed do ( tm = viewport.getTM() viewtype = viewport.getType() bounds = minmaxSwap ((MapScreenToView [0,0] 0) * Inverse(getViewTM())) ((MapScreenToView (GetViewSize()) 0) * Inverse(getViewTM())) StartCoord = bounds[1] EndCoord = bounds[2] vs = GetViewSize() fov = viewport.GetFOV() fd = viewport.getFocalDistance() storeBookmark ("Bookmark " + (bookmarkNames.count+1) as string) tm viewtype StartCoord EndCoord vs fov fd ) on btnDelete pressed do ( deleteBookmark lbxBookmarks.selection ) on edtRename entered newName do ( renameBookmark lbxBookmarks.selection newName ) on btnCam pressed do ( startCam = 1 endCam = lbxBookmarks.items.count createCamerasOnBookmarks startCam endCam ) on btnCamSelected pressed do ( startCam = lbxBookmarks.selection endCam = lbxBookmarks.selection createCamerasOnBookmarks startCam endCam ) on btnCreateUberCam pressed do ( animateCameraFromObjects lbxBookmarks.selection frameDistance ) on bookmarkRollout resized val do ( lbxBookmarks.height = val.y-142 btnAdd.pos.y = val.y-92 btnDelete.pos.y = val.y-92 edtRename.pos.y = val.y-67 btnUp.pos.y = val.y-113 btnDown.pos.y = val.y-113 btnCam.pos.y = val.y-47 btnCamSelected.pos.y = val.y-47 btnCreateUberCam.pos.y = val.y-24 spnFrameDuration.pos.y = val.y-25 spnFrameHold.pos.y = val.y-13 if val.y<(20*bookmarkNames.count)+92 do bookmarkRollout.height = (20*bookmarkNames.count)+92 ) on lbxBookmarks rightClick indexB do ( updateBookmark indexB ) ) createDialog bookmarkRollout style:#(#style_resizing,#style_titleba,#style_toolwindow,#style_sysmenu)lockHeight:false lockWidth:true SetDialogPos bookmarkRollout [1500,190] ) )