khanat-opennel-code/code/nel/tools/3d/plugin_max/scripts/nel_xref_building.ms
2010-05-06 02:08:41 +02:00

410 lines
11 KiB
Text

-- Constants
NEL3D_APPDATA_IGNAME = 1423062564
NEL3D_APPDATA_LOD_NAME_COUNT = 1423062537
NEL3D_APPDATA_LOD_NAME = 1423062538
NEL3D_APPDATA_LOD_NAME_COUNT_MAX = 10
NEL3D_APPDATA_DONTEXPORT = 1423062565
NEL_OBJET_NAME_DATA = 1970
NEL3D_APPDATA_COLLISION = 1423062613
NEL3D_APPDATA_COLLISION_EXTERIOR = 1423062614
-- Globals
BuildingFilenamePath = ""
VillageFilenamePath = ""
-- Function
fn lowercase instring =
(
local upper, lower, outstring
upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
lower="abcdefghijklmnopqrstuvwxyz"
outstring = copy instring
for iii = 1 to outstring.count do
(
jjj = findString upper outstring[iii]
if (jjj != undefined) then
outstring[iii] = lower[jjj]
else
outstring[iii] = instring[iii]
)
return outstring -- value of outstring will be returned as function result
)
fn isInArray array elm =
(
local ii
for ii in array do
(
if (ii as string) == (elm as string) then
return true
)
return false
)
-- Roll out
rollout xref_rollout "Properties"
(
group "Parameters"
(
Button InputFilename "Building File Name" width:650 align:#left
Button DestinationFilename "Village File Name" width:650 align:#left
Label IgNameLabel "Ig Name" align:#left
EditText IgName "" width:140 align:#left
Label ZoneNameLabel "Zone Name" align:#left
EditText ZoneName "" width:140 align:#left
)
group "Exterior Meshes"
(
listbox ExteriorMesh width:650
Button RemoveFromExteriorMeshList "Remove From Exterior Mesh List" align:#left
)
group "Landscape Lights"
(
listbox LandscapeLight width:650
Button RemoveFromLandscapeLightList "Remove From Landscape Light List" align:#left
)
group "Other Nodes"
(
listbox ImportedNodes width:650
Button PutToExteriorMeshList "Put To Exterior Mesh List" align:#left across:2
Button PutToLandscapeLightList "Put To Landscape Light List" align:#left
)
Label ProgressText width:650 align:#left
ProgressBar Progress width:650 align:#left
Button XRef "XRef!" width:650 align:#left
on InputFilename pressed do
(
-- Choose the max project
BuildingFilenamePath = getOpenFileName caption:"Select the building project to xref" filename:"*.max" types:"3D Studio MAX (*.max)|*.max|All Files (*.*)|*.*||"
-- Ok ?
if (BuildingFilenamePath != undefined) then
(
InputFilename.text = BuildingFilenamePath
-- Get the node names
nodesName = getMAXFileObjectNames BuildingFilenamePath
if (nodesName != undefined) then
(
-- Build the 3 lists
_LandscapeLight = #()
_ExteriorMesh = #()
_ImportedNodes = #()
-- For each node in the max file
for i in nodesName do
(
addItExterior = false
addItLandscape = false
names = filterString (lowercase (i as string)) "_"
for j in names do
(
if j == "ext" then
(
addItExterior = true
exit
)
else if j == "land" then
(
addItLandscape = true
exit
)
)
if addItLandscape == true then
append _LandscapeLight i
else if addItExterior == true then
append _ExteriorMesh i
else
append _ImportedNodes i
)
sort _LandscapeLight
sort _ExteriorMesh
sort _ImportedNodes
LandscapeLight.items = _LandscapeLight
ExteriorMesh.items = _ExteriorMesh
ImportedNodes.items = _ImportedNodes
)
)
)
on DestinationFilename pressed do
(
-- Choose the max project
VillageFilenamePath = getOpenFileName caption:"Select the village project to xref into" filename:"*.max" types:"3D Studio MAX (*.max)|*.max|All Files (*.*)|*.*||"
-- Ok ?
if (VillageFilenamePath != undefined) then
(
DestinationFilename.text = VillageFilenamePath
-- Get the zone name
array_name = filterString (getFilenameFile VillageFilenamePath) "-"
ZoneName.text = ""
for i = 2 to array_name.count do
(
if ZoneName.text != "" then
ZoneName.text = ZoneName.text + "-"
ZoneName.text = ZoneName.text + lowercase (array_name[i])
)
)
)
on PutToExteriorMeshList pressed do
(
if (ImportedNodes.selection != 0) then
(
_exteriorMeshes = ExteriorMesh.items
_importedNodes = ImportedNodes.items
append _exteriorMeshes _importedNodes[ImportedNodes.selection]
deleteItem _importedNodes ImportedNodes.selection
sort _exteriorMeshes
ExteriorMesh.items = _exteriorMeshes
ImportedNodes.items = _importedNodes
)
)
on PutToLandscapeLightList pressed do
(
if (ImportedNodes.selection != 0) then
(
_landscapeLight = LandscapeLight.items
_importedNodes = ImportedNodes.items
append _landscapeLight _importedNodes[ImportedNodes.selection]
deleteItem _importedNodes ImportedNodes.selection
sort _landscapeLight
LandscapeLight.items = _landscapeLight
ImportedNodes.items = _importedNodes
)
)
on RemoveFromExteriorMeshList pressed do
(
if (ExteriorMesh.selection != 0) then
(
_exteriorMeshes = ExteriorMesh.items
_importedNodes = ImportedNodes.items
append _importedNodes _exteriorMeshes[ExteriorMesh.selection]
deleteItem _exteriorMeshes ExteriorMesh.selection
sort _importedNodes
ExteriorMesh.items = _exteriorMeshes
ImportedNodes.items = _importedNodes
)
)
on RemoveFromLandscapeLightList pressed do
(
if (LandscapeLight.selection != 0) then
(
_landscapeLight = LandscapeLight.items
_importedNodes = ImportedNodes.items
append _importedNodes _landscapeLight[LandscapeLight.selection]
deleteItem _landscapeLight LandscapeLight.selection
sort _importedNodes
LandscapeLight.items = _landscapeLight
ImportedNodes.items = _importedNodes
)
)
on XRef pressed do
(
-- Selected ?
if (IgName.text != "") and (BuildingFilenamePath != "") and (VillageFilenamePath != "") then
(
-- Reset max file
resetMAXFile #noprompt
-- Load the building
-- Look for an unique postfix
buildingName = IgName.text
postfix = "_" + buildingName
-- XRef the projects
nodesName = getMAXFileObjectNames BuildingFilenamePath
if nodesName != undefined then
(
-- The lod name array
lodNameArray = #()
-- For each node visible
for iCount = 1 to nodesName.count do
(
-- Garbage collector
gc ()
-- Progress bar
ProgressText.text = "XRef building " + (getFilenameFile BuildingFilenamePath)
Progress.value = iCount*100/nodesName.count
-- Node ref
nodeName = nodesName[iCount]
-- Make an xref
node = xrefs.addNewXRefObject BuildingFilenamePath (nodeName as string)
if node != undefined then
(
-- Rename its lod
countString = getAppData node NEL3D_APPDATA_LOD_NAME_COUNT
if (countString != undefined) then
(
count = countString as integer
for lod = 1 to count do
(
lodName = getAppData node (NEL3D_APPDATA_LOD_NAME+lod-1)
if lodName != undefined then
(
setAppData node (NEL3D_APPDATA_LOD_NAME+lod-1) (lodName + postfix)
append lodNameArray (lodName + postfix)
)
)
)
-- Remove some node properties
deleteAppData node NEL3D_APPDATA_IGNAME
deleteAppData node NEL3D_APPDATA_DONTEXPORT
deleteAppData node NEL_OBJET_NAME_DATA
-- Is it a light ?
if (superclassof node == light) then
(
-- Is it in the landscape ?
arrayToTest = LandscapeLight.items
if (isInArray arrayToTest node.name) == true then
(
if (ZoneName.text != "") then
setAppData node NEL3D_APPDATA_IGNAME ZoneName.text
)
else
(
if (IgName.text != "") then
setAppData node NEL3D_APPDATA_IGNAME IgName.text
)
)
else
(
-- Add ig name
if (IgName.text != "") then
setAppData node NEL3D_APPDATA_IGNAME IgName.text
-- Is a collision shape ?
col = getAppData node NEL3D_APPDATA_COLLISION
if col == undefined then
col = getAppData node NEL3D_APPDATA_COLLISION_EXTERIOR
-- not a collision
if (col == undefined) or (col == "0") then
(
-- Is it exterior ?
arrayToTest = ExteriorMesh.items
if (isInArray arrayToTest node.name) == false then
(
-- Don't export this shape
setAppData node NEL3D_APPDATA_DONTEXPORT "1"
-- This shape is a reference
setAppData node NEL_OBJET_NAME_DATA node.name
)
)
)
-- Rename the node
node.name = node.name + postfix
)
)
-- Erase lod properties
for lod in lodNameArray do
(
-- Select the node by name
node = getnodebyname lod
if (node != undefined) then
(
deleteAppData node NEL3D_APPDATA_IGNAME
deleteAppData node NEL3D_APPDATA_DONTEXPORT
deleteAppData node NEL_OBJET_NAME_DATA
)
)
-- Save a temp file
tempFile = getdir #scene + "\\nel_xref_building_temp.max"
ProgressText.text = "Save temp file"
Progress.value = 50
-- Unhide all
max unfreeze all
max unhide all
if saveMaxFile tempFile == true then
(
-- Load the destination project
ProgressText.text = "Load village " + (getFilenameFile VillageFilenamePath)
Progress.value = 50
-- Load village file
if (loadMaxFile VillageFilenamePath) == true then
(
-- Merge the temp file
ProgressText.text = "Merge building"
Progress.value = 50
-- Hide all
max select all
hide selection
-- Merge the temp file
if (mergeMAXFile tempFile #mergeDups) == true then
(
ProgressText.text = "Finished - OK"
Progress.value = 100
-- Make a selection group
max select all
selectionSets[buildingName] = selection
-- Unhide all
max unhide all
)
else
(
ProgressText.text = "Error : can't merge the temp file nel_xref_building_temp.max"
Progress.value = 100
)
)
else
(
ProgressText.text = ("Error : can't load the village file " + VillageFilenamePath)
Progress.value = 100
)
)
else
(
ProgressText.text = "Error saving temp scene nel_xref_building_temp.max"
Progress.value = 100
)
-- Delete the temp file
deleteFile tempFile
)
)
)
)
-- Go
gc ()
if xref_building_floater != undefined do
(
closerolloutfloater xref_building_floater
)
xref_building_floater = newRolloutFloater "NeL XRef Building" 700 874
addrollout xref_rollout xref_building_floater rolledUp:false