-- -- File:: rockstar/helpers/sceneimage.ms -- Description:: Gta Scene Image -- -- Author:: Greg Smith pos2.x then minpos.x = pos2.x if minpos.x > pos3.x then minpos.x = pos3.x if maxpos.x < pos2.x then maxpos.x = pos2.x if maxpos.x < pos3.x then maxpos.x = pos3.x if minpos.y > pos2.y then minpos.y = pos2.y if minpos.y > pos3.y then minpos.y = pos3.y if maxpos.y < pos2.y then maxpos.y = pos2.y if maxpos.y < pos3.y then maxpos.y = pos3.y for x = minpos.x to maxpos.x do ( for y = minpos.y to maxpos.y do ( screenColList[x * 512 + y] = colVal ) ) ) fn RsSphereBoxCollCheck spherePos sphereRadius blockObj = ( sPos = [spherePos.x,spherePos.y,0.0] -- print ((spherePos as string) + " " + (sphereRadius as string) + " " + (blockObj as string)) minx = (-blockObj.height / 2.0) maxx = (blockObj.height / 2.0) miny = (-blockObj.width / 2.0) maxy = (blockObj.width / 2.0) matRot = rotateZMatrix -blockObj.rotz sphereRelPos = (sPos - [blockObj.posx,blockObj.posy,0.0]) * matRot minx = minx - sphereRelPos.x miny = miny - sphereRelPos.y maxx = maxx - sphereRelPos.x maxy = maxy - sphereRelPos.y Rad2 = sphereRadius * sphereRadius if (maxx < 0) then ( if (maxy < 0) then return ((maxx * maxx + maxy * maxy) < Rad2) else if (miny > 0) then return ((maxx * maxx + miny * miny) < Rad2) else return((abs maxx) < sphereRadius) ) else if (minx > 0) then ( if (maxy < 0) then return ((minx * minx + maxy * maxy) < Rad2) else if (miny > 0) then return ((minx * minx + miny * miny) < Rad2) else return (minx < sphereRadius) ) else ( if (maxy < 0) then return ((abs maxy) < sphereRadius) else if (miny > 0) then return (miny < sphereRadius) else return true ) return false ) ----------------------------------------------------------------------------- -- Rollout ----------------------------------------------------------------------------- rollout RsSceneImageItemRoll "Items" width:260 ( --//////////////////////////////////////////////////////////// -- interface --//////////////////////////////////////////////////////////// button btnShowSelected "Show Selected" align:#left listbox lstSelected width:250 checkbox chkSelectedOnly "Display Selected Only" label lblInstances "0 instances" align:#left listbox lstMaps width:250 --//////////////////////////////////////////////////////////// -- methods --//////////////////////////////////////////////////////////// fn UpdateMaps = ( idxFound = finditem RsObjectNameList lstSelected.selected if idxFound != 0 then ( lstMaps.items = RsObjectMapList[idxFound] ) else ( lstMaps.items = #() ) ) --//////////////////////////////////////////////////////////// -- events --//////////////////////////////////////////////////////////// on chkSelectedOnly changed arg do ( RsSceneImageRoll.UpdateImage() ) on lstSelected selected arg do ( if chkSelectedOnly.checked then ( RsSceneImageRoll.UpdateImage() ) UpdateMaps() ) on btnShowSelected pressed do ( if (getFiles RsTotalIplFilename).count == 0 then ( if querybox "no cache file. do you want to build it?" == false then return 0 RsSceneImageRoll.CreateCacheFile() ) objNameList = #() for obj in selection do ( if obj.parent == undefined then ( objName = RsGetNonFragmentName obj.name append objNameList objName ) ) lstSelected.items = objNameList RsSceneImageRoll.FindObjectData objNameList RsSceneImageRoll.UpdateImage() UpdateMaps() ) ) rollout RsSceneImageBlockRoll "Blocks" width:260 ( --//////////////////////////////////////////////////////////// -- interface --//////////////////////////////////////////////////////////// button btnShowBlocks "Show Blocks" align:#left listbox lstMaps width:250 listbox lstBlocks width:250 checkbox chkSelectedMapOnly "Display Map Only" checkbox chkSelectedBlockOnly "Display Block Only" listbox lstColourise width:250 items:#("White","By Polys/m2","By Coll Polys/m2","By Model/m2","By TXD/m2","By Total/m2","By Lod/m2","By Xref/m2","By Prop/m2","By Interior/m2","By Polys","By Coll Polys","By Model","By TXD","By Total","By Lod","By Xref","By Prop","By Interior") spinner spnMinPolyDensity "Min:" align:#left label lblMaxPolyDensity "Max:" align:#left label lblCurrPolyDensity "Current:" align:#left checkbox chkShowPosition "Show Position" spinner spnXPos "XPos" range:[-3000.0,3000.0,0.0] align:#left spinner spnyPos "YPos" range:[-3000.0,3000.0,0.0] align:#left spinner spnRadius "Radius" range:[0.0,3000.0,0.0] label lblTotalMem "Mem Usage Inside Radius: 0" button btnCalcMem "Calc Memory Usage" --//////////////////////////////////////////////////////////// -- methods --//////////////////////////////////////////////////////////// --//////////////////////////////////////////////////////////// -- events --//////////////////////////////////////////////////////////// on spnMinPolyDensity entered argA argB do ( if argB == false then ( RsSceneImageRoll.UpdateBlockImage() ) ) on chkSelectedMapOnly changed arg do ( RsSceneImageRoll.CreateBlockList() RsSceneImageRoll.UpdateBlockImage() ) on chkSelectedBlockOnly changed arg do ( RsSceneImageRoll.UpdateBlockImage() ) on lstMaps selected arg do ( if chkSelectedMapOnly.checked then ( RsSceneImageRoll.CreateBlockList() RsSceneImageRoll.UpdateBlockImage() ) ) on lstBlocks selected arg do ( blockItem = undefined for i = 1 to RsBlockList.count do ( if RsBlockList[i].name == lstBlocks.selected then ( blockItem = RsBlockList[i] exit ) ) if blockItem != undefined then ( case lstColourise.selection of ( 1: lblCurrPolyDensity.text = "" 2: lblCurrPolyDensity.text = "Curr: " + ((blockItem.polys / blockItem.volume) as string) 3: lblCurrPolyDensity.text = "Curr: " + ((blockItem.collpolys / blockItem.volume) as string) 4: lblCurrPolyDensity.text = "Curr: " + ((blockItem.modelsize / blockItem.volume) as string) 5: lblCurrPolyDensity.text = "Curr: " + ((blockItem.txdsize / blockItem.volume) as string) 6: lblCurrPolyDensity.text = "Curr: " + ((blockItem.totalsize / blockItem.volume) as string) 7: lblCurrPolyDensity.text = "Curr: " + ((blockItem.lodsize / blockItem.volume) as string) 8: lblCurrPolyDensity.text = "Curr: " + ((blockItem.xrefsize / blockItem.volume) as string) 9: lblCurrPolyDensity.text = "Curr: " + ((blockItem.propsize / blockItem.volume) as string) 10: lblCurrPolyDensity.text = "Curr: " + ((blockItem.interiorsize / blockItem.volume) as string) 11: lblCurrPolyDensity.text = "Curr: " + ((blockItem.polys) as string) 12: lblCurrPolyDensity.text = "Curr: " + ((blockItem.collpolys) as string) 13: lblCurrPolyDensity.text = "Curr: " + ((blockItem.modelsize) as string) 14: lblCurrPolyDensity.text = "Curr: " + ((blockItem.txdsize) as string) 15: lblCurrPolyDensity.text = "Curr: " + ((blockItem.totalsize) as string) 16: lblCurrPolyDensity.text = "Curr: " + ((blockItem.lodsize) as string) 17: lblCurrPolyDensity.text = "Curr: " + ((blockItem.xrefsize) as string) 18: lblCurrPolyDensity.text = "Curr: " + ((blockItem.propsize) as string) 19: lblCurrPolyDensity.text = "Curr: " + ((blockItem.interiorsize) as string) ) else ( lblCurrPolyDensity.text = "" ) if chkSelectedBlockOnly.checked then ( RsSceneImageRoll.UpdateBlockImage() ) ) on lstColourise selected arg do ( case lstColourise.selection of ( 1: lblMaxPolyDensity.text = "" 2: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximumsDensity.polys as string) 3: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximumsDensity.collpolys as string) 4: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximumsDensity.modelsize as string) 5: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximumsDensity.txdsize as string) 6: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximumsDensity.totalsize as string) 7: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximumsDensity.lodsize as string) 8: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximumsDensity.xrefsize as string) 9: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximumsDensity.propsize as string) 10: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximumsDensity.interiorsize as string) 11: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximums.polys as string) 12: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximums.collpolys as string) 13: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximums.modelsize as string) 14: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximums.txdsize as string) 15: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximums.totalsize as string) 16: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximums.lodsize as string) 17: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximums.xrefsize as string) 18: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximums.propsize as string) 19: lblMaxPolyDensity.text = "Max: " + (RsBlockMaximums.interiorsize as string) ) --RsSceneImageBlockRoll.lblCurrPolyDensity.text = "Current Poly Density:" RsSceneImageRoll.UpdateBlockImage() ) on chkShowPosition changed newval do ( RsShowPos = newval RsSceneImageRoll.UpdateBlockImage() ) on spnXPos entered inSpin inCancel do ( if RsShowPos then ( RsXPos = spnXPos.value RsSceneImageRoll.UpdateBlockImage() ) ) on spnYPos entered inSpin inCancel do ( if RsShowPos then ( RsYPos = spnYPos.value RsSceneImageRoll.UpdateBlockImage() ) ) on btnShowBlocks pressed do ( RsSceneImageRoll.LoadBlockData() ) on btnCalcMem pressed do ( totalMemUsage = 0 for item in RsBlockList do ( doesCollide = false if item.blockver != 3 then ( for blockSquare in item.blockobjs do ( if RsSphereBoxCollCheck [spnXPos.value,spnYPos.value] spnRadius.value blockSquare then ( doesCollide = true exit ) ) ) if doesCollide then ( totalMemUsage = totalMemUsage + item.totalsize -- totalMemUsage = totalMemUsage + 1 ) ) lblTotalMem.text = "Mem Usage Inside Radius: " + (totalMemUsage as string) ) ) rollout RsSceneImageRoll "Scene Image" width:512 height:512 ( --//////////////////////////////////////////////////////////// -- interface --//////////////////////////////////////////////////////////// hyperlink lnkHelp "Help?" address:"https://devstar.rockstargames.com/wiki/index.php/Scene_Image" align:#right color:(color 0 0 255) hoverColor:(color 0 0 255) visitedColor:(color 0 0 255) progressbar barLoad width:300 align:#left button btnCache "Create Cache" align:#left offset:[429,-20] bitmap bmpImage height:512 width:512 align:#left subRollout subInfo offset:[516,-520] width:300 height:560 --//////////////////////////////////////////////////////////// -- methods --//////////////////////////////////////////////////////////// fn TransformWorldPos2ScreenPos inPos = ( PosX = ((inPos[1] + 3000.0) * 512.0) / 6000.0 PosY = ((6000.0 - (inPos[2] + 3000.0)) * 512.0) / 6000.0 [PosX as integer,PosY as integer] ) fn CreateCacheFile = ( utilityFolder = RsConfigGetProjRootDir() + RsConfigGetProjectName() + "_bin/" + RsConfigGetProjectName() + "_general/utility/" commandLine = RsConfigGetBinDir() + RsConfigGetRagebuilder() + " " + utilityFolder + "generateTotalIpl.rbs -output " + RsTotalIplFilename DOSCommand commandLine ) fn UpdateBlockImage = ( bmpFilename = (getdir #scripts) + "\\rockstar\\data\\wholemap.bmp" bmpSource = openBitMap bmpFilename done = false screenColList = #() screenColList.count = 512 * 512 for i = 1 to RsBlockList.count do ( blockItem = RsBlockList[i] barLoad.value = 100.0 * i / RsBlockList.count if RsSceneImageBlockRoll.chkSelectedMapOnly.checked and RsSceneImageBlockRoll.lstMaps.selected != blockItem.map then continue if RsSceneImageBlockRoll.chkSelectedBlockOnly.checked and RsSceneImageBlockRoll.lstBlocks.selected != blockItem.name then continue maxColVal = 255.0 colVal = 28 spnValue = RsSceneImageBlockRoll.spnMinPolyDensity.value case RsSceneImageBlockRoll.lstColourise.selection of ( 1: colVal = 128.0 2: if(blockItem.volume != 0.0) then colVal = maxColVal * (((blockItem.polys / blockItem.volume) - spnValue) / (RsBlockMaximumsDensity.polys - spnValue)) 3: if(blockItem.volume != 0.0) then colVal = maxColVal * (((blockItem.collpolys / blockItem.volume) - spnValue) / (RsBlockMaximumsDensity.collpolys - spnValue)) 4: if(blockItem.volume != 0.0) then colVal = maxColVal * (((blockItem.modelsize / blockItem.volume) - spnValue) / (RsBlockMaximumsDensity.modelsize - spnValue)) 5: if(blockItem.volume != 0.0) then colVal = maxColVal * (((blockItem.txdsize / blockItem.volume) - spnValue) / (RsBlockMaximumsDensity.txdsize - spnValue)) 6: if(blockItem.volume != 0.0) then colVal = maxColVal * (((blockItem.totalsize / blockItem.volume) - spnValue) / (RsBlockMaximumsDensity.totalsize - spnValue)) 7: if(blockItem.volume != 0.0) then colVal = maxColVal * (((blockItem.lodsize / blockItem.volume) - spnValue) / (RsBlockMaximumsDensity.lodsize - spnValue)) 8: if(blockItem.volume != 0.0) then colVal = maxColVal * (((blockItem.xrefsize / blockItem.volume) - spnValue) / (RsBlockMaximumsDensity.xrefsize - spnValue)) 9: if(blockItem.volume != 0.0) then colVal = maxColVal * (((blockItem.propsize / blockItem.volume) - spnValue) / (RsBlockMaximumsDensity.propsize - spnValue)) 10: if(blockItem.volume != 0.0) then colVal = maxColVal * (((blockItem.interiorsize / blockItem.volume) - spnValue) / (RsBlockMaximumsDensity.interiorsize - spnValue)) 11: colVal = maxColVal * (((blockItem.polys as float) - spnValue) / (RsBlockMaximums.polys - spnValue)) 12: colVal = maxColVal * (((blockItem.collpolys as float) - spnValue) / (RsBlockMaximums.collpolys - spnValue)) 13: colVal = maxColVal * (((blockItem.modelsize as float) - spnValue) / (RsBlockMaximums.modelsize - spnValue)) 14: colVal = maxColVal * (((blockItem.txdsize as float) - spnValue) / (RsBlockMaximums.txdsize - spnValue)) 15: colVal = maxColVal * (((blockItem.totalsize as float) - spnValue) / (RsBlockMaximums.totalsize - spnValue)) 16: colVal = maxColVal * (((blockItem.lodsize as float) - spnValue) / (RsBlockMaximums.lodsize - spnValue)) 17: colVal = maxColVal * (((blockItem.xrefsize as float) - spnValue) / (RsBlockMaximums.xrefsize - spnValue)) 18: colVal = maxColVal * (((blockItem.propsize as float) - spnValue) / (RsBlockMaximums.propsize - spnValue)) 19: colVal = maxColVal * (((blockItem.interiorsize as float) - spnValue) / (RsBlockMaximums.interiorsize - spnValue)) ) for blockItemObject in blockItem.blockobjs do ( if blockItem.blockver == 3 then ( pos1 = TransformWorldPos2ScreenPos [blockItemObject.posx1,blockItemObject.posy1] pos2 = TransformWorldPos2ScreenPos [blockItemObject.posx2,blockItemObject.posy2] pos3 = TransformWorldPos2ScreenPos [blockItemObject.posx3,blockItemObject.posy3] pos4 = TransformWorldPos2ScreenPos [blockItemObject.posx4,blockItemObject.posy4] RsDrawTriangle screenColList pos1 pos2 pos3 colVal RsDrawTriangle screenColList pos2 pos3 pos4 colVal ) else ( matRot = rotateZMatrix -blockItemObject.rotz if blockItemObject.rotz == 0.0 then ( minx = blockItemObject.posx - (blockItemObject.height / 2.0) maxx = blockItemObject.posx + (blockItemObject.height / 2.0) miny = blockItemObject.posy - (blockItemObject.width / 2.0) maxy = blockItemObject.posy + (blockItemObject.width / 2.0) screenMin = TransformWorldPos2ScreenPos [minx,miny] screenMax = TransformWorldPos2ScreenPos [maxx,maxy] for x = screenMin[1] to screenMax[1] do ( for y = screenMax[2] to screenMin[2] do ( newitem = [x,y] if screenColList[newitem.x * 512 + newitem.y] == undefined then ( screenColList[newitem.x * 512 + newitem.y] = colVal ) ) ) ) else ( minx = (-blockItemObject.height / 2.0) as integer maxx = (blockItemObject.height / 2.0) as integer miny = (-blockItemObject.width / 2.0) as integer maxy = (blockItemObject.width / 2.0) as integer for x = minx to maxx do ( for y = miny to maxy do ( actualPos = [x,y,0.0] * matRot newitem = (TransformWorldPos2ScreenPos [blockItemObject.posx + actualPos.x,blockItemObject.posy + actualPos.y]) if screenColList[newitem.x * 512 + newitem.y] == undefined then ( screenColList[newitem.x * 512 + newitem.y] = colVal ) ) ) ) ) ) ) for x = 1 to 512 do ( barLoad.value = 100.0 * x / 512 for y = 1 to 512 do ( colVal = screenColList[x * 512 + y] if colVal != undefined then ( currPixels = getPixels bmpSource [x,y] 1 if RsSceneImageBlockRoll.lstColourise.selected == "White" then ( setColor = composite (color 128 128 128 128) currPixels[1] ) else ( setColor = composite (color colVal (255 - colVal) 0 128) currPixels[1] ) setPixels bmpSource [x,y] #(setColor) ) ) ) if RsShowPos then ( newitem = TransformWorldPos2ScreenPos [RsXPos,RsYPos] setPixels bmpSource [newitem.x,newitem.y] #((color 255 255 255 255)) ) bmpImage.bitmap = bmpSource ) fn CreateBlockList = ( RsBlockNameList = #() for blockItem in RsBlockList do ( if RsSceneImageBlockRoll.chkSelectedMapOnly.checked and RsSceneImageBlockRoll.lstMaps.selected != blockItem.map then continue append RsBlockNameList blockItem.name ) sort RsBlockNameList RsSceneImageBlockRoll.lstBlocks.items = RsBlockNameList ) fn LoadBlockData = ( RsBlockList = #() RsBlockMapList = #() RsBlockMinimums = (blockInfo "Total" "Total" #() 0 0 0 0 0 0 0 0 0 0 0 0 0) RsBlockMaximums = (blockInfo "Total" "Total" #() 0 0 0 0 0 0 0 0 0 0 0 0 0) RsBlockMinimumsDensity = (blockInfo "Total" "Total" #() 0 0 0 0 0 0 0 0 0 0 0 0 0) RsBlockMaximumsDensity = (blockInfo "Total" "Total" #() 0 0 0 0 0 0 0 0 0 0 0 0 0) filenameList = getfiles (RsConfigInfos[RsCurrentConfig].genstreamdir + "mapstats/blockmap/*.csv") firstGo = true for mapFilename in filenameList do ( mapName = RsRemovePathAndExtension mapFilename mapFile = openfile mapFilename mode:"r" if mapFile != undefined then ( mapFileLine = readline mapFile statVersion = 1 if mapFileLine == "VER2" then ( statVersion = 2 ) else if mapFileLine == "VER3" then ( statVersion = 3 ) while eof mapFile == false do ( mapFileLine = readline mapFile mapFileLineTokens = filterstring mapFileLine "," if mapFileLineTokens.count > 1 then ( afterIndex = 0 blockname = mapFileLineTokens[1] blockList = #() if statVersion == 1 then ( minx = mapFileLineTokens[2] as number miny = mapFileLineTokens[3] as number maxx = mapFileLineTokens[4] as number maxy = mapFileLineTokens[5] as number afterIndex = 5 width = maxx - minx height = maxy - miny posx = minx + (width / 2.0) posy = miny + (height / 2.0) blockObj = (blockObject posx posy 0.0 height width) append blockList blockObj ) else if statVersion == 2 then ( blockCount = mapFileLineTokens[2] as number afterIndex = 2 + (5 * blockCount) for i = 1 to blockCount do ( posx = mapFileLineTokens[2 + ((i - 1) * 5) + 1] as number posy = mapFileLineTokens[2 + ((i - 1) * 5) + 2] as number rotz = mapFileLineTokens[2 + ((i - 1) * 5) + 3] as number width = mapFileLineTokens[2 + ((i - 1) * 5) + 4] as number height = mapFileLineTokens[2 + ((i - 1) * 5) + 5] as number blockObj = (blockObject posx posy rotz width height) append blockList blockObj ) ) else ( blockCount = mapFileLineTokens[2] as number afterIndex = 2 + (9 * blockCount) for i = 1 to blockCount do ( numPoints = mapFileLineTokens[2 + ((i - 1) * 9) + 1] as number posx1 = mapFileLineTokens[2 + ((i - 1) * 9) + 2] as number posy1 = mapFileLineTokens[2 + ((i - 1) * 9) + 3] as number posx2 = mapFileLineTokens[2 + ((i - 1) * 9) + 4] as number posy2 = mapFileLineTokens[2 + ((i - 1) * 9) + 5] as number posx3 = mapFileLineTokens[2 + ((i - 1) * 9) + 6] as number posy3 = mapFileLineTokens[2 + ((i - 1) * 9) + 7] as number posx4 = mapFileLineTokens[2 + ((i - 1) * 9) + 8] as number posy4 = mapFileLineTokens[2 + ((i - 1) * 9) + 9] as number blockObj = (blockObject3 posx1 posy1 posx2 posy2 posx3 posy3 posx4 posy4) append blockList blockObj ) ) objects = mapFileLineTokens[(afterIndex + 1)] as number txds = mapFileLineTokens[(afterIndex + 2)] as number polys = mapFileLineTokens[(afterIndex + 3)] as number collpolys = mapFileLineTokens[(afterIndex + 4)] as number modelsize = mapFileLineTokens[(afterIndex + 5)] as number txdsize = mapFileLineTokens[(afterIndex + 6)] as number totalsize = mapFileLineTokens[(afterIndex + 7)] as number lodsize = mapFileLineTokens[(afterIndex + 8)] as number xrefsize = mapFileLineTokens[(afterIndex + 9)] as number propsize = mapFileLineTokens[(afterIndex + 10)] as number interiorsize = mapFileLineTokens[(afterIndex + 11)] as number volume = mapFileLineTokens[(afterIndex + 12)] as number print volume objects_den = 0 txds_den = 0 polys_den = 0 collpolys_den = 0 modelsize_den = 0 txdsize_den = 0 totalsize_den = 0 lodsize_den = 0 xrefsize_den = 0 propsize_den = 0 interiorsize_den = 0 if (volume != 0) then ( objects_den = objects / volume txds_den = txds / volume polys_den = polys / volume collpolys_den = collpolys / volume modelsize_den = modelsize / volume txdsize_den = txdsize / volume totalsize_den = totalsize / volume lodsize_den = lodsize / volume xrefsize_den = xrefsize / volume propsize_den = propsize / volume interiorsize_den = interiorsize / volume ) if firstGo then ( firstGo = false RsBlockMinimums.objects = RsBlockMaximums.objects = objects RsBlockMinimums.txds = RsBlockMaximums.txds = txds RsBlockMinimums.polys = RsBlockMaximums.polys = polys RsBlockMinimums.collpolys = RsBlockMaximums.collpolys = collpolys RsBlockMinimums.modelsize = RsBlockMaximums.modelsize = modelsize RsBlockMinimums.txdsize = RsBlockMaximums.txdsize = txdsize RsBlockMinimums.totalsize = RsBlockMaximums.totalsize = totalsize RsBlockMinimums.lodsize = RsBlockMaximums.lodsize = lodsize RsBlockMinimums.xrefsize = RsBlockMaximums.xrefsize = xrefsize RsBlockMinimums.propsize = RsBlockMaximums.propsize = propsize RsBlockMinimums.interiorsize = RsBlockMaximums.interiorsize = interiorsize RsBlockMinimumsDensity.objects = RsBlockMaximumsDensity.objects = objects_den RsBlockMinimumsDensity.txds = RsBlockMaximumsDensity.txds = txds_den RsBlockMinimumsDensity.polys = RsBlockMaximumsDensity.polys = polys_den RsBlockMinimumsDensity.collpolys = RsBlockMaximumsDensity.collpolys = collpolys_den RsBlockMinimumsDensity.modelsize = RsBlockMaximumsDensity.modelsize = modelsize_den RsBlockMinimumsDensity.txdsize = RsBlockMaximumsDensity.txdsize = txdsize_den RsBlockMinimumsDensity.totalsize = RsBlockMaximumsDensity.totalsize = totalsize_den RsBlockMinimumsDensity.lodsize = RsBlockMaximumsDensity.lodsize = lodsize_den RsBlockMinimumsDensity.xrefsize = RsBlockMaximumsDensity.xrefsize = xrefsize_den RsBlockMinimumsDensity.propsize = RsBlockMaximumsDensity.propsize = propsize_den RsBlockMinimumsDensity.interiorsize = RsBlockMaximumsDensity.interiorsize = interiorsize_den ) else ( if objects > RsBlockMaximums.objects then RsBlockMaximums.objects = objects if txds > RsBlockMaximums.txds then RsBlockMaximums.txds = txds if polys > RsBlockMaximums.polys then RsBlockMaximums.polys = polys if collpolys > RsBlockMaximums.collpolys then RsBlockMaximums.collpolys = collpolys if modelsize > RsBlockMaximums.modelsize then RsBlockMaximums.modelsize = modelsize if txdsize > RsBlockMaximums.txdsize then RsBlockMaximums.txdsize = txdsize if totalsize > RsBlockMaximums.totalsize then RsBlockMaximums.totalsize = totalsize if lodsize > RsBlockMaximums.lodsize then RsBlockMaximums.lodsize = lodsize if xrefsize > RsBlockMaximums.xrefsize then RsBlockMaximums.xrefsize = xrefsize if propsize > RsBlockMaximums.propsize then RsBlockMaximums.propsize = propsize if interiorsize > RsBlockMaximums.interiorsize then RsBlockMaximums.interiorsize = interiorsize if objects_den > RsBlockMaximumsDensity.objects then RsBlockMaximumsDensity.objects = objects_den if txds_den > RsBlockMaximumsDensity.txds then RsBlockMaximumsDensity.txds = txds_den if polys_den > RsBlockMaximumsDensity.polys then RsBlockMaximumsDensity.polys = polys_den if collpolys_den > RsBlockMaximumsDensity.collpolys then RsBlockMaximumsDensity.collpolys = collpolys_den if modelsize_den > RsBlockMaximumsDensity.modelsize then RsBlockMaximumsDensity.modelsize = modelsize_den if txdsize_den > RsBlockMaximumsDensity.txdsize then RsBlockMaximumsDensity.txdsize = txdsize_den if totalsize_den > RsBlockMaximumsDensity.totalsize then RsBlockMaximumsDensity.totalsize = totalsize_den if lodsize_den > RsBlockMaximumsDensity.lodsize then RsBlockMaximumsDensity.lodsize = lodsize_den if xrefsize_den > RsBlockMaximumsDensity.xrefsize then RsBlockMaximumsDensity.xrefsize = xrefsize_den if propsize_den > RsBlockMaximumsDensity.propsize then RsBlockMaximumsDensity.propsize = propsize_den if interiorsize_den > RsBlockMaximumsDensity.interiorsize then RsBlockMaximumsDensity.interiorsize = interiorsize_den if objects < RsBlockMinimums.objects then RsBlockMinimums.objects = objects if txds < RsBlockMinimums.txds then RsBlockMinimums.txds = txds if polys < RsBlockMinimums.polys then RsBlockMinimums.polys = polys if collpolys < RsBlockMinimums.collpolys then RsBlockMinimums.collpolys = collpolys if modelsize < RsBlockMinimums.modelsize then RsBlockMinimums.modelsize = modelsize if txdsize < RsBlockMinimums.txdsize then RsBlockMinimums.txdsize = txdsize if totalsize < RsBlockMinimums.totalsize then RsBlockMinimums.totalsize = totalsize if lodsize < RsBlockMinimums.lodsize then RsBlockMinimums.lodsize = lodsize if xrefsize < RsBlockMinimums.xrefsize then RsBlockMinimums.xrefsize = xrefsize if propsize < RsBlockMinimums.propsize then RsBlockMinimums.propsize = propsize if interiorsize > RsBlockMaximums.interiorsize then RsBlockMaximums.interiorsize = interiorsize if objects_den < RsBlockMinimumsDensity.objects then RsBlockMinimumsDensity.objects = objects_den if txds_den < RsBlockMinimumsDensity.txds then RsBlockMinimumsDensity.txds = txds_den if polys_den < RsBlockMinimumsDensity.polys then RsBlockMinimumsDensity.polys = polys_den if collpolys_den < RsBlockMinimumsDensity.collpolys then RsBlockMinimumsDensity.collpolys = collpolys_den if modelsize_den < RsBlockMinimumsDensity.modelsize then RsBlockMinimumsDensity.modelsize = modelsize_den if txdsize_den < RsBlockMinimumsDensity.txdsize then RsBlockMinimumsDensity.txdsize = txdsize_den if totalsize_den < RsBlockMinimumsDensity.totalsize then RsBlockMinimumsDensity.totalsize = totalsize_den if lodsize_den < RsBlockMinimumsDensity.lodsize then RsBlockMinimumsDensity.lodsize = lodsize_den if xrefsize_den < RsBlockMinimumsDensity.xrefsize then RsBlockMinimumsDensity.xrefsize = xrefsize_den if propsize_den < RsBlockMinimumsDensity.propsize then RsBlockMinimumsDensity.propsize = propsize_den if interiorsize_den < RsBlockMinimumsDensity.interiorsize then RsBlockMinimumsDensity.interiorsize = interiorsize_den ) append RsBlockList (blockInfo blockname mapName blockList objects txds polys collpolys modelsize txdsize totalsize lodsize xrefsize propsize interiorsize volume statVersion) ) ) close mapFile append RsBlockMapList mapName ) ) sort RsBlockMapList RsSceneImageBlockRoll.lstMaps.items = RsBlockMapList CreateBlockList() UpdateBlockImage() ) fn UpdateImage = ( bmpFilename = (getdir #scripts) + "\\rockstar\\data\\wholemap.bmp" bmpSource = openBitMap bmpFilename colourArray = #(color 255 0 0 255,color 0 255 0 255,color 0 0 255 255,color 255 255 0 255,color 255 0 255 255,color 0 255 255 255) totalInstances = 0 for i = 1 to RsObjectPosList.count do ( objectItemList = RsObjectPosList[i] if RsSceneImageItemRoll.chkSelectedOnly.checked == false or (finditem RsObjectNameList RsSceneImageItemRoll.lstSelected.selected) == i then ( totalInstances = totalInstances + objectItemList.count for item in objectItemList do ( screenPos = TransformWorldPos2ScreenPos [item.x,item.y] setCol = colourArray[((mod (i - 1) 6) + 1)] setPixels bmpSource screenPos #(setCol) ) ) ) RsSceneImageItemRoll.lblInstances.text = (totalInstances as string) + " instances" bmpImage.bitmap = bmpSource ) fn FindObjectData objectNameList = ( RsTotalIplFile = openfile RsTotalIplFilename mode:"rb" RsObjectNameList = #() RsObjectPosList = #() RsObjectMapList = #() if RsTotalIplFile != undefined then ( seek RsTotalIplFile #eof maxlen = filepos RsTotalIplFile current = 0 seek RsTotalIplFile 0 while eof RsTotalIplFile == false do ( barLoad.value = 100.0 * current / maxlen RsTotalIplLine = readline RsTotalIplFile current = current + RsTotalIplLine.count RsTotalIplTokens = filterstring RsTotalIplLine "," if RsTotalIplTokens.count > 1 then ( objNameTokens = filterstring RsTotalIplTokens[1] "-" objName = "" instName = "" miloName = "" if objNameTokens.count > 1 then ( if objNameTokens[1] == "milo" then ( objName = objNameTokens[4] instName = objNameTokens[3] miloName = objNameTokens[2] ) else ( objName = objNameTokens[1] instName = objNameTokens[2] ) ) else ( objName = objNameTokens[1] instName = "unknown" ) instName = RsRemovePathAndExtension(instName) if finditem objectNameList objName != 0 then ( itemPos = [RsTotalIplTokens[3] as number,RsTotalIplTokens[4] as number] idxFound = finditem RsObjectNameList objName if idxFound == 0 then ( append RsObjectNameList objName append RsObjectPosList #(itemPos) append RsObjectMapList #(instName) ) else ( append RsObjectPosList[idxFound] itemPos idxInst = finditem RsObjectMapList[idxFound] instName if idxInst == 0 then ( append RsObjectMapList[idxFound] instName ) ) ) ) ) barLoad.value = 0 ) ) --//////////////////////////////////////////////////////////// -- events --//////////////////////////////////////////////////////////// on btnCache pressed do ( CreateCacheFile() ) on RsSceneImageRoll open do ( AddSubRollout subInfo RsSceneImageItemRoll AddSubRollout subInfo RsSceneImageBlockRoll UpdateImage() ) ) CreateDialog RsSceneImageRoll modal:false width:850 height:620