| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343 |
- --
- -- Command & Conquer Renegade(tm)
- -- Copyright 2025 Electronic Arts Inc.
- --
- -- This program is free software: you can redistribute it and/or modify
- -- it under the terms of the GNU General Public License as published by
- -- the Free Software Foundation, either version 3 of the License, or
- -- (at your option) any later version.
- --
- -- This program is distributed in the hope that it will be useful,
- -- but WITHOUT ANY WARRANTY; without even the implied warranty of
- -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- -- GNU General Public License for more details.
- --
- -- You should have received a copy of the GNU General Public License
- -- along with this program. If not, see <http://www.gnu.org/licenses/>.
- --
- ------------------------------------------------------------------------
- --
- -- Export.ms - This file contains two batch exporting scripts. The first
- -- "exportDependants" will export the current scene, and any others in
- -- the current directory that depend on it for their skeletons. The
- -- second, "exportDirectoryTree" will export and and all Max files in
- -- a given directory tree. Both of these scripts have equivalent macro
- -- definitions, making it simple to add them as buttons to a toolbar.
- --
- ------------------------------------------------------------------------
- -- EXP_replace_extension is a utility function used by the scripts in this
- -- file to replace the ".max" or ".w3d" of the given filename with a given
- -- extension (including the dot, ie. ".w3d")
- function EXP_replace_extension
- max_filename -- x:\abc\blah.max or blah.max
- extension -- .w3d
- = (
- -- Find the ".max" extension in the filename.
- local dot_index = findString max_filename ".MAX"
- if dot_index == undefined then
- (
- dot_index = findString max_filename ".W3D"
- if dot_index == undefined then
- return max_filename
- )
-
- return (replace max_filename dot_index 4 extension)
- )
- -- USER-CALLABLE: exportW3D exports the current scene as a W3D file.
- -- It takes a flag to determine whether it should display any dialogs
- -- during the export. This makes the function suitable for batch exports.
- function exportW3D
- show_dialogs:true
- w3d_name:undefined
- = (
- if w3d_name == undefined then
- (
- -- Get the name of the current scene as a W3D file.
- w3d_name = EXP_replace_extension (maxFilePath + maxFileName) ".w3d"
- if show_dialogs == true then
- (
- -- Allow the user to possibly choose a different name.
- w3d_name = getSaveFileName caption:"Select File to Export" \
- filename:w3d_name types:"w3d (*.W3D)|*.w3d|"
-
- -- The dialog above will prompt the user to overwrite an
- -- existing file. If the user chooses yes, the exportFile
- -- call below will prompt him once again to overwrite the
- -- file. The solution to this is to delete the w3d file.
- if w3d_name != undefined then
- deleteFile w3d_name
- )
- -- If the user canceled the name selection, or there was some
- -- sort of error, return false.
- if w3d_name == undefined then
- return false
- )
-
- -- Print an exporting message.
- local short_name = filenameFromPath w3d_name
- print("Exporting " + short_name + "...")
-
- -- Export the scene, showing the export options if appropriate.
- if show_dialogs == true then
- exportFile w3d_name
- else
- exportFile w3d_name #noPrompt
-
- return true
- )
- -- The macro script definition for the "Export as W3D" toolbar button.
- macroScript Export_As_W3D
- category:"Westwood Scripts"
- buttonText:"OLD - Export as W3D - OLD"
- toolTip:"This button should not be used anymore"
- icon:#("SchematicView", 1)
- (
- messageBox "This button is being phased out. Please use Export_As instead."
- )
- -- The macro script definition for the "Export" toolbar button.
- macroScript Export
- category:"Westwood Scripts"
- buttonText:"Export"
- toolTip:"Export the current scene as a W3D file without prompting"
- icon:#("GameTools", 2)
- (
- exportW3D show_dialogs:false
- )
- -- The macro script definition for the "Export As..." toolbar button
- macroScript Export_As
- category:"Westwood Scripts"
- buttonText:"Export As..."
- toolTip:"Export the current scene as a W3D file"
- icon:#("GameTools", 3)
- (
- exportW3D()
- )
- -- USER-CALLABLE: exportDependants will export the current scene, and
- -- and other scenes in the same directory that depend on the current
- -- one for their hierarchy.
- function exportDependants
- = (
- local current_scene = undefined
-
- -- Export the current scene.
- if checkForSave() == false then
- (
- -- User aborted the save.
- return ok
- )
- else
- (
- -- The user saved changes (or the scene was unchanged).
- -- Grab the name of the scene file.
- current_scene = maxFilePath + maxFileName
- )
- if current_scene == "" then
- (
- -- This is an empty scene, don't export.
- return ok
- )
-
- -- Export the current scene as a W3D file.
- local export_file = EXP_replace_extension current_scene ".w3d"
- local short_name = filenameFromPath export_file
- exportW3D w3d_name:export_file
-
- -- Get (and sort) the list of all other MAX files
- -- in the same directory as the current scene.
- local pattern = maxFilePath
- pattern = pattern + "*.max"
- local files = getFiles pattern
- sort files
-
- -- Open and export each file in turn.
- local exported_count = 1
- for f in files do
- (
- -- Don't export the original scene again.
- if f != current_scene then
- (
- -- Load the Max scene.
- if (loadMaxFile f) != true then
- (
- print("Unable to load " + f)
- )
- else
- (
- -- Get the name of the hierarchy the scene depends on.
- -- wwGetHierarchyFile returns a relative pathname if it
- -- is available, otherwise it returns an absolute path.
- local htree_file = wwGetHierarchyFile()
- if (htree_file == undefined) or
- ((htree_file as name != short_name as name) and
- (htree_file as name != current_scene as name)) then
- (
- -- The filenames don't match, or the scene doesn't
- -- depend on a hierarchy at all.
- local filename = filenameFromPath f
- print (filename + " does not depend on " + short_name)
- )
- else
- (
- -- This scene gets its hierarchy from the original.
- -- Re-export it (last export settings automatically used).
- local w3d_file = EXP_replace_extension f ".w3d"
- if (exportW3D w3d_name:w3d_file show_dialogs:false) then
- exported_count += 1
- )
- )
- )
- )
-
- -- Load up the original scene again and show how many files were re-exported.
- loadMaxFile current_scene
- print ("Export process finished! " + exported_count as string + " files exported.")
- return ok
- )
- -- The macro script definition for the "Export Dependants" toolbar button.
- macroScript Export_Dependants
- category:"Westwood Scripts"
- buttonText:"Export Dependants"
- toolTip:"Export all dependant scenes"
- icon:#("Maxscript", 3)
- (
- exportDependants()
- )
- -- USER-CALLABLE: exportDirectoryTree exports all MAX scenes in a directory
- -- and all it's subdirectories. All scenes are exported with their last
- -- export settings. Scenes that have never been exported are done so with
- -- default settings as defined in max2w3d (currently exports: hierarchy,
- -- animation, geometry).
- global EXP_exported = #() -- array of exported scenes
- function exportDirectoryTree
- dir:undefined
- = (
- -- If no directory was given, get it from the user using a directory
- -- selection dialog.
- local recursive = true
- if dir == undefined then
- (
- local ar = #(maxFilePath, true)
- local res = wwExportTreeSettings ar
- if res == undefined then
- return 0
- dir = res[1]
- recursive = res[2]
- EXP_exported = #()
- )
-
- -- Append a trailing backslash if the path doesn't have one.
- if dir[dir.count] != "\\" then
- dir = dir + "\\"
-
- -- Export all max files in the current directory.
- local exported_count = 0
- local files = getFiles(dir + "*.max")
- sort files
- for f in files do
- (
- -- Load 'er up.
- if (loadMaxFile f) != true then
- (
- print("Unable to load " + f)
- continue
- )
- -- Check if this scene requires another to be exported first.
- local htree_file = wwGetHierarchyFile()
- if htree_file != undefined then
- (
- -- Convert the relative path to an absolute one.
- local htree_abs = wwGetAbsolutePath htree_file dir
- local max_file = EXP_replace_extension htree_abs ".max"
-
- -- Has the scene been exported yet?
- if (findItem EXP_exported (max_file as Name)) == 0 then
- (
- -- It hasn't been exported. Do so now.
-
- -- Load the max file.
- if (loadMaxFile max_file) != true then
- (
- print("WARNING: " + max_file + " could not be opened, but " + \
- f + " depends on " + htree_abs + "!")
-
- -- Proceed with the export only if a previous W3D file exists.
- if (getFiles htree_abs).count == 0 then
- continue
- )
- else
- (
- -- Export the w3d file
- if (exportW3D w3d_name:w3d_file show_dialogs:false) == true then
- (
- -- Add the scene to the array of exported scenes.
- append EXP_exported (max_file as Name)
- )
- else
- (
- -- Show an error message
- print("ERROR: " + htree_abs + " not exported, but " + \
- f + " depends on it!")
- continue
- )
-
- -- Load the previous scene up again so we can export it.
- loadMaxFile f
- )
- )
- )
-
- -- Export it as a W3D file, if it hasn't been already exported.
- if (findItem EXP_exported (f as Name)) == 0 then
- (
- local w3d_file = EXP_replace_extension f ".w3d"
- if (exportW3D w3d_name:w3d_file show_dialogs:false) then
- (
- -- Add the scene to the array of exported scenes.
- append EXP_exported (f as Name)
- )
- )
- )
-
- -- Recurse through all subdirectories.
- if recursive == true then
- (
- local folders = getDirectories(dir + "*")
- sort folders
- for d in folders do
- (
- print ("Entering " + d)
- exportDirectoryTree dir:d
- )
- )
-
- return EXP_exported.count
- )
- -- The macro script definition for the "Export Directory Tree" toolbar button.
- macroScript Export_Directory_Tree
- category:"Westwood Scripts"
- buttonText:"Export Directory Tree"
- toolTip:"Export all MAX files in a folder and all its sub-folders"
- icon:#("SchematicView", 2)
- (
- local count = exportDirectoryTree()
- print (count as string + " files exported")
- if count > 0 then
- resetMaxFile #noPrompt
- )
|