Files
2025-09-29 00:52:08 +02:00

219 lines
6.1 KiB
Plaintext
Executable File

filein (RsConfigGetWildWestDir() + "script/3dsMax/_config_files/Wildwest_header.ms")
dotnet.loadAssembly (RsConfigGetToolsDir() + "techart/dcc/3dsMax/RSG.TechArt.IPExtractor.dll")
--/////////////////////////////////////////
-- UI
--/////////////////////////////////////////
try(destroyDialog IPExtractorUI)catch()
rollout IPExtractorUI "IP Extractor" width:400 height:210
(
--/////////////////////////////////////////
-- VARIABLES
--/////////////////////////////////////////
local selectedImap
local imapPaths = #()
local imapPathsStripped = #()
local imap = dotnetobject "IPExtractor.IPExtractor"
--local iptype = "prop"
--/////////////////////////////////////////
-- CONTROLS
--/////////////////////////////////////////
dotNetControl rsBannerPanel "Panel" pos:[0,0] height:32 width:IPExtractorUI.width
local banner = makeRsBanner dn_Panel:rsBannerPanel wiki:"CHANGEME" versionNum:0.3 versionName:"Advisory Circle" filename:(getThisScriptFilename())
listbox lstImaps height:10
button btnExtract "Extract Selected" width:(IPExtractorUI.width - 30)
--/////////////////////////////////////////
-- FUNCTIONS
--/////////////////////////////////////////
fn createPlaneData pos size =
(
v1 = [(pos.x - size), (pos.y + size), pos.z]
v2 = [(pos.x - size), (pos.y - size), pos.z]
v3 = [(pos.x + size), (pos.y - size), pos.z]
v4 = [(pos.x + size), (pos.y + size), pos.z]
#(v1, v2, v3, v4)
)
fn makeBoundsOffsetPositions positions boundsMin boundsMax &meshVertData &meshFaceData =
(
for x=0 to positions.count-1 do
(
local xPos = boundsMin[1] + (positions.Item[x][1] * ((boundsMax[1] - boundsMin[1]) / 65536))
local yPos = boundsMin[2] + (positions.Item[x][2] * ((boundsMax[2] - boundsMin[2]) / 65536))
local zPos = boundsMin[3] + (positions.Item[x][3] * ((boundsMax[3] - boundsMin[3]) / 65536))
--d = point pos:[xPos, yPos, zPos] constantscreensize:off size:0.5
--d.parent = b
--create mesh
local verts = createPlaneData [xPos, yPos, zPos] 0.25
join meshVertData verts
inPt = meshVertData.count - 3
local face1 = [inPt, inPt+1, inPt+2]
append meshFaceData face1
local face2 = [inPt, inPt+2, inPt+3]
append meshFaceData face2
)
ok
)
fn makeAbsolutePositions positions &meshVertData &meshFaceData =
(
for x=0 to positions.count-1 do
(
local xPos = positions.Item[x][1]
local yPos = positions.Item[x][2]
local zPos = positions.Item[x][3]
--d = point pos:[xPos, yPos, zPos] constantscreensize:off size:0.5
--d.parent = b
--create mesh
local verts = createPlaneData [xPos, yPos, zPos] 0.25
join meshVertData verts
inPt = meshVertData.count - 3
local face1 = [inPt, inPt+1, inPt+2]
append meshFaceData face1
local face2 = [inPt, inPt+2, inPt+3]
append meshFaceData face2
)
)
fn createIPVis imapPath =
(
local data = undefined
try
(
data = imap.ExtractData imapPath
)
catch
(
print "No Elements in source file"
messageBox "This imap has no IP" title:"Empty IMAP"
return false
)
local iptype = imap.IPType
local objectList = #()
for i=0 to (data.Count-1) do
(
local boundsMin = data.Item[i].GetBounds "min"
local boundsMax = data.Item[i].GetBounds "max"
--make bounds vis
local boundsPos = [(boundsMin[1] + (0.5 * (boundsMax[1] - boundsMin[1]))), (boundsMin[2] + (0.5 * (boundsMax[2] - boundsMin[2]))), (boundsMin[3] + (0.5 * (boundsMax[3] - boundsMin[3])))]
--y
local boundsLength = boundsMax[2] - boundsMin[2]
--x
local boundsWidth = boundsMax[1] - boundsMin[1]
--z
local boundsHeight = boundsMax[3] - boundsMin[3]
--get colour from definition lookup
local colourHexValue = imap.colourLookup.item[data.Item[i].archetype]
colourHexValue = substituteString colourHexValue "#" "0x00"
local procColour = RsHexARGBToColor colourHexValue
local bname = (getFilenameFile imapPath) + "_" + data.Item[i].archetype
local b = Box name:bname pos:boundsPos length:boundsLength width:boundsWidth height:boundsHeight wirecolor:procColour
b.pos.z -= (boundsHeight / 2.0)
b.boxmode = on
append objectList b
local meshVertData = #()
local meshFaceData = #()
local positions = undefined
case iptype of
(
"GrassInstanceList":
(
positions = data.Item[i].GetPositions()
makeBoundsOffsetPositions positions boundsMin boundsMax meshVertData meshFaceData
)
"PropInstanceList":
(
positions = data.Item[i].GetPropPositions()
makeAbsolutePositions positions meshVertData meshFaceData
)
)
local proxyMesh = mesh vertices:meshVertData faces:meshFaceData
CenterPivot proxyMesh
--set mesh colour based on def lookup
meshop.setMapSupport proxyMesh 0 true
for i=1 to (getNumCPVVerts proxyMesh) do
(
meshop.setMapVert proxyMesh 0 i procColour
)
proxymesh.showVertexColors = on
--parent mesh to the bounds box
proxyMesh.parent = b
)
select objectList
max zoomext sel all
)
fn discoverLocalImaps =
(
local searchPath = (RsMakeSafeSlashes gRsCoreProject.Cache) + "/instance_placement/" + gRsCoreBranch.name
imaps = getFilesRecursive searchPath "*.imap"
)
--/////////////////////////////////////////
-- EVENTS
--/////////////////////////////////////////
on btnExtract pressed do
(
createIPVis selectedImap
)
on lstImaps selected val do
(
selectedImap = imapPaths[val]
--print selectedImap
)
--/////////////////////////////////////////
--
--/////////////////////////////////////////
on IPExtractorUI open do
(
banner.setup()
imapPaths = discoverLocalImaps()
imapPathsStripped = for item in imapPaths collect getFilenameFile item
lstImaps.items = imapPathsStripped
local imapConfigPath = RsConfigGetToolsDir() + "etc/processors/RSG.Pipeline.InstancePlacementProcessor.xml"
imap.BuildDefinitionColorLookup imapConfigPath
)
)
createDialog IPExtractorUI