Maxscript No Put Function For Undefined

  суббота 25 апреля
      81
Maxscript No Put Function For Undefined 10,0/10 7161 votes

Memory Leak Example #1 seems to be not valid. There is no memory leak there. Each time function replaceThing is executed priorThing set to undefined first and then get ref to theThing so it take 1mb of memory each time and no mem leaks. I've already sent it to our developers to look into, but I don't have a solution for you right now (I mean, for the case where you put the V-Ray macroscripts in other toolbars different from the V-Ray one). Best regards, Vlado.

In a previous tutorial, we looked at the submission of regular 3ds Max Render Jobs to Deadline using a custom submission script written in MAXScript.

However, Deadline allows a 3ds Max Job to run in a special MAXScript Job mode where instead of rendering images using any supported production renderer, a MAXScript file is run on each frame instead. The MAXScript file can contain code that performs any operations supported by 3ds Max and MAXScript, and this means a lot of power. For example, a MAXScript could perform file import, scene creation and manipulatiion, file export, file caching, physical simulations and other functions that do not involve rendering.

Notable examples from the world of Thinkbox Software's own 3ds Max plugins are the Krakatoa Partitioning on Deadline feature which employs (optionally) MAXScript Jobs to save particles with modified random seeds using several tasks within a single job, or the XMesh Saver caching on Deadline which also uses a MAXScript Job to run the XMesh caching functions under MAXScript control on one or more render machines.

Note that there are some limitations imposed on MAXScript when 3ds Max is run in license-free network rendering mode (the default mode of 3ds Max when run by Deadline). In this mode, the UI is not created, so any operations that depend on UI and Viewport interaction would fail. Also, the saving of .MAX files is disabled in this mode. To work around this, Deadline can launch 3ds Max in full Workstation mode, but this will require a 3ds Max license, so 3ds Max must be licensed on the machine running the Deadline Slave - either via a floating license, or by using a node-locked license (for example if an artist workstation is also used to run Deadline jobs).

In this tutorial, we will discuss the basics of MAXScript Jobs, and then we will see how a MAXScript Job can be submitted by a custom MAXScript submitter by slightly modifying the code developed in the previous tutorial. Dragon quest monsters joker 2 anti-piracy patch.

SUBMITTING A MAXSCRIPT JOB MANUALLY USING SMTD

A MAXScript Job can be submitted using the Integrated 3ds Max Submitter (SubmitMaxToDeadline, a.k.a. SMTD). In the SMTD user interface, the 'Scripts' tab contains the following relevant controls in the 'Run MAXScript Scripts' rollout > 'MAXScript Scene Processing Job - No Rendering' group of controls:

Submit Script Job

  • This checkbox must be checked to switch the submission from a regular Render Job to a MAXScript Job.
  • In this mode, the renderer will not be called, instead, the script specified in the text field below will be sent to the Slaves to execute on each frame.

Single Task

  • When checked, the job will be sent as a single task, one frame Job to ensure the script will be run only once.
  • This is useful when the script does not need to run once per frame under Deadline's control.
  • However, the script itself could contain one or more FOR loops that perform multiple operations within the Task, for example the Krakatoa Partitioning job (Task as Partition option) runs a FOR loop through all frames in the range to save within the script, thus outputting multiple files from a single Task.

Workstation Mode

  • When checked, 3ds Max will be launched in full UI licensed workstation mode.
  • This is only needed when the script in question requires access to the UI, Viewports, or the .MAX file saving system of 3ds Max.
  • Possible examples include

New Script From Template

  • Pressing this button will generate a new MAXScript Job containing the base 'boilerplate' code with empty space for the custom MAXScript functionality.
  • The new script will be saved automatically under the user's Scripts
  • The script can be modified, saved and reused in future sessions.

Pick Script..

  • Pressing this button lets you pick a previously saved script to submit as the Job's script.
  • Note that Jon Scripts have a specific syntax, so you cannot pick any script, only a script that was specifically written to be run on Deadline. We will discuss this in a bit.

Edit MAXScript File

  • Pressing this button will open the file picked as the Job Script in the MAXScript Editor for further editing.

THE MAXSCRIPT JOB TEMPLATE

Here is the content of the MAXScript Job template script created when you press the New Script From Template button:

What is DeadlineUtil?

Deadline communicates with 3ds Max via a plugin called Lightning.DLX. DLX files are 3ds Max plugins that extend the MAXScript system. The Lightning.DLX is used by Deadline to talk to 3ds Max when running a Task of a Job, but also to expose some Deadline functionality to MAXScript for your own needs. The MAXScript Interface it provides is called DeadlineUtil.

However, this Interface is only available when the Lightning.DLX plugin has been loaded, which only happens when Deadline Slave launches 3ds Max. This means that you cannot really call ShowInterface DeadlineUtil to see what properties and methods it offers while running 3ds Max on your workstation where development of MAXScript jobs typically happens. For that reason, the script first assigns DeadlineUtil to a local user variable called `du`, then checks to see if it is defined or not. If it is undefined, the script creates a Struct with the same properties and methods and assigns it to the du local variable instead of the real interface. This way, you can test your script AS IF it was running on Deadline without actually sending it to Deadline!

Of course, some of the properties and methods are just dummy placeholders, but the majority perform about the same as the real ones. For example. du.CurrentTime will return the current frame both locally and on Deadline, but the Deadline result will be based on the Frame the Task wants to process, while in the local version it just returns the current SliderTime.

Once that is done, the script uses the calls to du.SetTitle and LogMessage to output some data to the Deadline Log (or to the MAXScript Listener, of not running on a Slave). You can modify these calls to output the data you want, and add more such calls to inform the user of what is going on, or for debugging purposes.

Then the script captures the current system time in a variable in order to provide precise timing info in the Log independent from the Task's own timing managed by Deadline.

The area of --YOUR SCENE PROCESSING CODE GOES HERE is where the actual script would go - without any changes, the script would really Do Nothing.

Once that code is executed, the script would print to the Log the time it took to run that code, and finally return true which tells Deadline that the task finished successfully. Of course, you can return false if some condition in your own script code points at a problem that should make the task fail. In addition, at any point in your code you can call du.FailRender with a message as argument which will fail the job and output the message to the Log.

If the script does not return true in the end, the Task will fail.

SIMPLE EXAMPLE SCRIPT

To see how a MAXScript Job is typically developed, let's create a simple script that will export the geometry objects in the scene to sequences of 3DS files in a network folder.

  • Open 3ds Max
  • Create a default Teapot primitive in the scene
  • Add a Bend modifier to it and keyframe the Angle from 0 to 100 to change from 0 to 90 degrees.
  • Set the Render Setup dialog to Time Output : Active Time Segment 0 to 100.
  • Save the scene to your local Scenes folder under the name 'MeshExportOnDeadlineTest_v001.max'
  • Open SMTD.
  • Switch to the Scripts tab.
  • Press the button 'New Script From Template' - note that
  • Edit the script to modify the job title and message
  • Enter the export code in place of the --YOUR SCENE PROCESSING CODE GOES HERE line:

The script

  • Loops through all geometry objects in the scene (in our case just the Teapot).
  • It builds a padding string with the frame number and leading zeros.
  • It builds a file name using a hard-coded path to a mapped network drive visible to all render nodes that also includes the object name, the padded frame number, and the format extension .3DS.
  • It outputs a message with the object name and the file name.
  • It then selects the object and exports the current selection to the file without a prompt.

Submitting the scene to Deadline will create 101 tasks. A copy of the script file will be sent as Auxiliary file with the Job, and will be run by each Slave. Once the job is processed, 101 .3DS files should appear in the output folder. Each should contain a snapshot of the teapot on the respective frame.

SUBMITTING A MAXSCRIPT JOB WITH A CUSTOM MAXSCRIPT SUBMITTER

Now that we have a clearer idea how a MAXScript Job is submitted using the SMTD UI, let's look at doing the same using a custom scripted submitter.

We can take the intermediate (UI-less) version of the MAXScript Submitter developed in the previous tutorial, and just add a few lines to turn it into a MAXScript Job Submitter:

Besides the updated Name and Comment, we have removed the MachineLimit settings from the original script. We are still going to process in chunks of 10 though, so the 101 frames will create 10 tasks with 10 frames, and frame 101 will be in a separate task. This will allow 10 machines to save in parallel, but each one will run through 10 frames at a time which is generally faster than running 101 tasks with one frame each.

The main change is the setting of the SubmitAsMXSJob property to True which is equivalent to checking the 'Submit Script Job' checkbox.

We define a local variable to hold the name of the MAXScript file we developed in the previous step. Make sure you update the path to the correct filename. In the end, we add this filename to the list of initial arguments, right after the .MAX scene file.

This is all that is needed to turn a scripted submitter from a Render Job submitter into a MAXScript Job submitter!

Try closing 3ds Max, starting it again without opening SMTD, load the file saved in the first part of the tutorial, and then evaluate this script to run it. The result should be another Job in the Monitor that perform the same saving, but in chunks of 10!

LET'S DO THIS AGAIN, BUT WITH FUMEFX!

One of the typical uses of MAXScript Jobs in production is simulating 3rd party plugins like FumeFX on Deadline. FumeFX exposes functions that let you trigger the simulation the same way you can simulate by pressing the respective UI button, so creating a FumeFX simulation script for Deadline is relatively straight-forward. Such a script could go to great lengths to make the process fool-proof, and there are a large number of such scripts available on the Web already. Here, we will look once again at the absolute minimum requirements, and you can expand from there.

Our script is going to simulate multiple FumeFX grids in one Job. Each FumeFX simulation will get its own Task running the same MAXScript. To do this, we will have to pass to the Job the names of the FumeFX objects we want simulated, and resolve the actual object to process in each Task based on the Frame number accessible through the DeadlineUnit interface.

Here is the submission script:

In the above script, we

  • Collect the names of all selected FumeFX Grids. If no grids are selected, we print a message to the Listener.
  • We set the name of the job and the comment to reflect the new functionality.
  • We close the Render Setup dialog if it is open, and then set the time mode to custom range, set the first frame to 1 and the last to the number of selected FumeFX objects. This will cause the necessary number of tasks to be created in the Job, one for each FumeFX object!
  • We set our MAXScript path to a new script that will perform the simulation, see further below.
  • We open the Job Info file for append writing and add a line containing the array of the selected FumeFX objects' names. We will use it to access the object to process in each Task!

And this is the Job Script that will trigger the actual simulation on the Deadline Slave:

In this script, we read the value of the array we wrote to the Job Info file and execute it to convert to a MAXScript Array value again. Then we take the current frame and if it is not in the valid range between 1 and the number of names in the array, we fail the task. This could happen if someone changed the frame list of the job!

Then we take the object name with that index and resolve the actual FumeFX object by name.

We set its Backburner flag to true to enable network simulation, and then call RunSimulation with argument 0 to perform the actual simulation.

Note that we assume the user already set the simulation path to a valid network drive accessible to all machines. You could enhance the script to set the path programmatically to a desired network path at submission time.

  1. -- No 'get' function for undefined
  2. -- thread data: threadID:26372
  3. -- ------------------------------------------------------
  4. -- In f loop; filename: E:Program FilesAutodesk3ds Max 2017scriptsJMS_Exporter_v1-0-2.ms; position: 21411; line: 705
  5. -- f: 1
  6. -- f: 1
  7. -- owner: undefined
  8. -- geometry_objects: Global:geometry_objects : #($Editable_Mesh:lr_wheel:default @ [3.400002,0.000000,1.088017], $Editable_Mesh:lf_wheel:default @ [3.400002,0.000000,1.088018], $Editable_Mesh:rr_wheel:default @ [3.400002,0.000000,1.088017], $Editable_Mesh:rf_wheel:default @ [3.400002,0.000000,1.088017], $Editable_Mesh:steering_wheel @ [3.400001,0.000000,0.000000], $Editable_Mesh:rr_fender:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:tailgate:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:windshield:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:lr_fender:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:tailgate:destroyed @ [0.000000,-250.000000,0.000000], $Editable_Mesh:fronthull:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:Box004 @ [3.400000,0.000000,0.000000], $Editable_Mesh:break_lights:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:bumper:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:dash_hull:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:default:default001 @ [3.400000,0.000000,0.000000], $Editable_Mesh:interior_n_stuff @ [3.400000,0.000000,0.000000])
  9. -- face_shader_index: Global:face_shader_index : #(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..)
  10. -- tmesh: Free:tmesh : TriMesh
  11. -- face_tverts: Global:face_tverts : #([10,12,11])
  12. -- face_matID: Global:face_matID : #(2)
  13. -- geom_materials: Global:geom_materials : #(warthog_weels:Standard, warthog_exterior:Standard, warthog_interior:Standard, warthog_glass_default:Standard, undefined, warthog_lights:Standard, warthog_dash:Standard)
  14. -- getFaceSmoothGroupB: Global:getFaceSmoothGroupB : getFaceSmoothGroupB()
  15. -- geom_object_has_tverts: Global:geom_object_has_tverts : #(true, true, true, true, true, true, true, true, true, undefined, true, true)
  16. -- ------------------------------------------------------
  17. -- called from g loop; filename: E:Program FilesAutodesk3ds Max 2017scriptsJMS_Exporter_v1-0-2.ms; position: 21454; line: 707
  18. -- g: 12
  19. -- temp_bone_array: undefined
  20. -- tmesh: TriMesh
  21. -- g: 12
  22. -- theSkin: undefined
  23. -- regionIndex: undefined
  24. -- owner: undefined
  25. -- geometry_objects: Global:geometry_objects : #($Editable_Mesh:lr_wheel:default @ [3.400002,0.000000,1.088017], $Editable_Mesh:lf_wheel:default @ [3.400002,0.000000,1.088018], $Editable_Mesh:rr_wheel:default @ [3.400002,0.000000,1.088017], $Editable_Mesh:rf_wheel:default @ [3.400002,0.000000,1.088017], $Editable_Mesh:steering_wheel @ [3.400001,0.000000,0.000000], $Editable_Mesh:rr_fender:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:tailgate:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:windshield:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:lr_fender:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:tailgate:destroyed @ [0.000000,-250.000000,0.000000], $Editable_Mesh:fronthull:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:Box004 @ [3.400000,0.000000,0.000000], $Editable_Mesh:break_lights:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:bumper:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:dash_hull:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:default:default001 @ [3.400000,0.000000,0.000000], $Editable_Mesh:interior_n_stuff @ [3.400000,0.000000,0.000000])
  26. -- geom_mesh_faces: Global:geom_mesh_faces : #(1092, 1092, 1092, 1092, 233, 335, 714, 140, 335, 0, 2422, 12)
  27. -- geom_regions: Global:geom_regions : #('base', 'rr_fender', 'tailgate', 'windshield', 'lr_fender', 'fronthull')
  28. -- subObjectLevel: SystemGlobal:subObjectLevel : 0
  29. -- geom_parent_index: Global:geom_parent_index : #(15, 16, 17, 18, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
  30. -- face_tverts: Global:face_tverts : #([10,12,11])
  31. -- geom_bone_array: Global:geom_bone_array : #()
  32. -- geom_object_has_skin: Global:geom_object_has_skin : #()
  33. -- geom_object_has_tverts: Global:geom_object_has_tverts : #(true, true, true, true, true, true, true, true, true, undefined, true, true)
  34. -- chk_weight: RolloutControl:chk_weight in rollout:roll : CheckBoxControl:chk_weight
  35. -- ------------------------------------------------------
  36. -- called from go_button.pressed(); filename: E:Program FilesAutodesk3ds Max 2017scriptsJMS_Exporter_v1-0-2.ms; position: 21988; line: 727
  37. -- Locals:
  38. -- V: 25644
  39. -- numverts: undefined
  40. -- objectsInScene: 63
  41. -- end1: undefined
  42. -- start1: undefined
  43. -- deletedName: ' '
  44. -- Externals:
  45. -- marker_rotation: Global:marker_rotation : #((quat -0.173648 0 0 0.984808), (quat 0.173648 0 0 0.984808), (quat 0.153046 0.153046 0.690346 0.690345), (quat 0 0 0 1), (quat 0 0 -0.087156 0.996195), (quat 0 0 0.087156 0.996195), (quat 0 0 0 1), (quat 0 0 0 1), (quat -0.127583 -0.596506 -0.08967 0.787313), (quat -0.266517 -0.690058 0.016896 0.672684), (quat 0 0 1 0), (quat 0 0 1 0), (quat 0.639439 0 0.768842 0), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), ..)
  46. -- all_objects_array: Global:all_objects_array : #($Sphere:frame hull @ [0.000000,0.000000,42.000000], $Sphere:frame gun mount base @ [-50.000000,0.000000,43.863716], $Sphere:frame chain @ [-32.310181,13.480178,74.809677], $Sphere:frame gun @ [-22.030003,0.000005,81.889992], $Sphere:frame barrels @ [-14.113003,0.000005,91.499992], $Sphere:#gunner left hand @ [-42.500000,3.200001,85.000000], $Sphere:#gunner right hand @ [-42.500000,-3.199998,85.000000], $Sphere:#primary ejection @ [-35.084839,-5.105690,92.252304], $Sphere:#primary trigger @ [25.517845,0.000000,93.013397], $Sphere:#gunner left foot @ [-57.687698,8.000000,43.438019], $Sphere:#gunner right foot @ [-57.687698,-7.999999,43.438023], $Sphere:#gunner @ [-62.284023,0.000029,75.556770], $Sphere:#camera gunner @ [-22.351334,-0.000001,81.306366], $Sphere:frame left back suspension @ [-39.301186,16.099968,24.099716], $Sphere:frame left back engine @ [-63.000000,31.604019,20.088018], $Sphere:frame left back tire @ [-63.000000,49.604015,20.088018], $Editable_Mesh:lr_wheel:default @ [3.400002,0.000000,1.088017], $Sphere:frame left front suspension @ [42.825058,16.099968,23.606783], $Sphere:frame left front engine @ [67.000000,31.604019,20.088017], $Sphere:frame left front tire @ [67.000000,49.604015,20.088015], ..)
  47. -- vert_normal: Global:vert_normal : #([-0.680194,-0.677041,0.280983], [-0.815513,-0.35528,0.456852], [-0.861933,-0.318447,0.394542], [-0.388818,-0.902348,0.185979], [-0.051923,-0.955465,0.2905], [-0.764585,-0.422755,0.486506], [-0.745379,-0.353453,0.565227], [-0.905119,-0.245586,-0.347056], [-0.807215,-0.550207,0.21372], [-0.723931,-0.621019,0.300431], [-0.924756,-0.311433,-0.218715], [-0.940086,-0.283725,-0.189048], [0.0913246,-0.986341,-0.13708], [0.207194,-0.741658,-0.637976], [0.207637,-0.526718,-0.824291], [0.386077,-0.406228,-0.828205], [0.206011,-0.741853,-0.638133], [-0.239881,-0.642651,-0.727638], [0.207637,-0.526718,-0.824291], [-0.239881,-0.642651,-0.727638], ..)
  48. -- sceneParent: Global:sceneParent : $Sphere:frame hull @ [0.000000,0.000000,42.000000]
  49. -- node_translation: Global:node_translation : #([0,0,42], [-50,0,1.86372], [-39.3012,16.1,-17.9003], [42.8251,16.1,-18.3932], [-39.3012,-17,-17.9003], [42.8251,-17,-18.3932], [14.7254,16.9564,12.0873], [17.6898,13.4802,30.946], [27.97,5e-06,38.0263], [-23.6988,15.5041,-4.0117], [24.1749,15.5041,-3.51877], [-23.6988,-15.317,-4.0117], [24.1749,-15.317,-3.51877], [7.917,0,9.61], [0,18,0], [0,18,0], [0,-18,0], [0,-18,0])
  50. -- geometry_objects: Global:geometry_objects : #($Editable_Mesh:lr_wheel:default @ [3.400002,0.000000,1.088017], $Editable_Mesh:lf_wheel:default @ [3.400002,0.000000,1.088018], $Editable_Mesh:rr_wheel:default @ [3.400002,0.000000,1.088017], $Editable_Mesh:rf_wheel:default @ [3.400002,0.000000,1.088017], $Editable_Mesh:steering_wheel @ [3.400001,0.000000,0.000000], $Editable_Mesh:rr_fender:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:tailgate:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:windshield:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:lr_fender:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:tailgate:destroyed @ [0.000000,-250.000000,0.000000], $Editable_Mesh:fronthull:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:Box004 @ [3.400000,0.000000,0.000000], $Editable_Mesh:break_lights:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:bumper:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:dash_hull:default @ [3.400000,0.000000,0.000000], $Editable_Mesh:default:default001 @ [3.400000,0.000000,0.000000], $Editable_Mesh:interior_n_stuff @ [3.400000,0.000000,0.000000])
  51. -- chk_jms: RolloutControl:chk_jms in rollout:roll : CheckBoxControl:chk_jms
  52. -- marker_array: Global:marker_array : #($Sphere:#gunner left hand @ [-42.500000,3.200001,85.000000], $Sphere:#gunner right hand @ [-42.500000,-3.199998,85.000000], $Sphere:#primary ejection @ [-35.084839,-5.105690,92.252304], $Sphere:#primary trigger @ [25.517845,0.000000,93.013397], $Sphere:#gunner left foot @ [-57.687698,8.000000,43.438019], $Sphere:#gunner right foot @ [-57.687698,-7.999999,43.438023], $Sphere:#gunner @ [-62.284023,0.000029,75.556770], $Sphere:#camera gunner @ [-22.351334,-0.000001,81.306366], $Sphere:#left hand wheel grip @ [14.178888,23.218164,54.237606], $Sphere:#right hand wheel grip @ [12.979590,12.665519,50.900143], $Sphere:#taillights @ [-93.153450,-19.583317,51.489983], $Sphere:#taillights @ [-93.153450,20.573694,51.489983], $Sphere:#antenna @ [-83.006081,-20.274179,59.989510], $Sphere:#camera driver @ [0.744527,16.808640,62.621651], $Sphere:#camera rider @ [7.150621,-15.864433,80.555222], $Sphere:#passenger @ [-11.619957,-15.864433,57.803413], $Sphere:#driver @ [-2.379451,16.575186,39.075031], $Sphere:#headlights @ [26.638540,-14.241576,73.829880], $Sphere:#headlights @ [26.638540,14.019646,73.829880], $Sphere:#headlights_light @ [60.174793,0.000000,66.728424], ..)
  53. -- face_shader_index: Global:face_shader_index : #(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..)
  54. -- vert_node0index: Global:vert_node0index : #(14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, ..)
  55. -- marker_parent_index: Global:marker_parent_index : #(9, 9, 9, 9, 2, 2, 2, 2, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ..)
  56. -- geom_mesh_faces: Global:geom_mesh_faces : #(1092, 1092, 1092, 1092, 233, 335, 714, 140, 335, 0, 2422, 12)
  57. -- boneAffectWarning: Global:boneAffectWarning : false
  58. -- node_next_sibling_index: Global:node_next_sibling_index : #(0, 3, 4, 5, 6, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
  59. -- geom_regions: Global:geom_regions : #('base', 'rr_fender', 'tailgate', 'windshield', 'lr_fender', 'fronthull')
  60. -- node_array: Global:node_array : #($Sphere:frame hull @ [0.000000,0.000000,42.000000], $Sphere:frame gun mount base @ [-50.000000,0.000000,43.863716], $Sphere:frame left back suspension @ [-39.301186,16.099968,24.099716], $Sphere:frame left front suspension @ [42.825058,16.099968,23.606783], $Sphere:frame right back suspension @ [-39.301186,-17.000000,24.099716], $Sphere:frame right front suspension @ [42.825058,-17.000000,23.606783], $Sphere:frame steering wheel @ [14.725431,16.956419,54.087311], $Sphere:frame chain @ [-32.310181,13.480178,74.809677], $Sphere:frame gun @ [-22.030003,0.000005,81.889992], $Sphere:frame left back engine @ [-63.000000,31.604019,20.088018], $Sphere:frame left front engine @ [67.000000,31.604019,20.088017], $Sphere:frame right back engine @ [-63.000000,-32.317009,20.088018], $Sphere:frame right front engine @ [67.000000,-32.317009,20.088017], $Sphere:frame barrels @ [-14.113003,0.000005,91.499992], $Sphere:frame left back tire @ [-63.000000,49.604015,20.088018], $Sphere:frame left front tire @ [67.000000,49.604015,20.088015], $Sphere:frame right back tire @ [-63.000000,-50.317005,20.088018], $Sphere:frame right front tire @ [67.000000,-50.317005,20.088017])
  61. -- geom_parent_index: Global:geom_parent_index : #(15, 16, 17, 18, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
  62. -- node_first_child_index: Global:node_first_child_index : #(2, 8, 10, 11, 12, 13, 0, 0, 14, 15, 16, 17, 18, 0, 0, 0, 0, 0)
  63. -- face_tverts: Global:face_tverts : #([10,12,11])
  64. -- nodeParent: Global:nodeParent : $Sphere:frame left back tire @ [-63.000000,49.604015,20.088018]
  65. -- node_rotation: Global:node_rotation : #((quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0.642787 0 0.766045), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1), (quat 0 0 0 1))
  66. -- geom_materials: Global:geom_materials : #(warthog_weels:Standard, warthog_exterior:Standard, warthog_interior:Standard, warthog_glass_default:Standard, undefined, warthog_lights:Standard, warthog_dash:Standard)
  67. -- face_matID: Global:face_matID : #(2)
  68. -- vert_node1weight: Global:vert_node1weight : #(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..)
  69. -- vert_node1index: Global:vert_node1index : #(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ..)
  70. -- listener: SystemGlobal:listener : <WindowStream>
  71. -- all_object_names: Global:all_object_names : #('frame hull', 'frame gun mount base', 'frame chain', 'frame gun', 'frame barrels', '#gunner left hand', '#gunner right hand', '#primary ejection', '#primary trigger', '#gunner left foot', '#gunner right foot', '#gunner', '#camera gunner', 'frame left back suspension', 'frame left back engine', 'frame left back tire', 'lr_wheel:default', 'frame left front suspension', 'frame left front engine', 'frame left front tire', ..)
  72. -- roll: Rollout:roll
  73. -- tvert_pos: Global:tvert_pos : #([0.302401,0.146951,0], [0.3235,0.141166,0], [0.293798,0.137834,0], [0.302401,0.146951,0], [0.352462,0.217065,0], [0.3235,0.141166,0], [0.3235,0.141166,0], [0.276787,0.0888376,0], [0.293798,0.137834,0], [0.293798,0.137834,0], [0.276787,0.0888376,0], [0.285935,0.126812,0], [0.266315,0.282919,0], [0.223067,0.210832,0], [0.206601,0.230159,0], [0.206601,0.230159,0], [0.223067,0.210832,0], [0.216761,0.200589,0], [0.206601,0.230159,0], [0.216761,0.200589,0], ..)
  74. -- marker_translation: Global:marker_translation : #([-20.47,3.2,3.11001], [-20.47,-3.2,3.11001], [-13.0548,-5.10569,10.3623], [47.5478,-5e-06,11.1234], [-7.6877,8,-0.425697], [-7.6877,-8,-0.425694], [-12.284,2.9e-05,31.6931], [27.6487,-1e-06,37.4426], [0.0531044,6.26175,0.56434], [-3.44191,-4.2909,1.16587], [-93.1535,-19.5833,9.48998], [-93.1535,20.5737,9.48998], [-83.0061,-20.2742,17.9895], [0.744527,16.8086,20.6217], [7.15062,-15.8644,38.5552], [-11.62,-15.8644,15.8034], [-2.37945,16.5752,-2.92497], [26.6385,-14.2416,31.8299], [26.6385,14.0196,31.8299], [60.1748,0,24.7284], ..)
  75. -- face_region_index: Global:face_region_index : #(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..)
  76. -- geom_object_has_skin: Global:geom_object_has_skin : #()
  77. -- vert_pos: Global:vert_pos : #([-78.8614,30.6303,10.6234], [-78.4193,31.2508,11.1646], [-79.2402,30.8835,10.3379], [-78.8614,30.6303,10.6234], [-75.9757,30.3662,12.3976], [-78.4193,31.2508,11.1646], [-78.4193,31.2508,11.1646], [-79.6033,32.8808,10.057], [-79.2402,30.8835,10.3379], [-79.2402,30.8835,10.3379], [-79.6033,32.8808,10.057], [-79.4644,31.3336,10.141], [-73.5573,30.3662,9.41224], [-76.2535,30.6241,7.30646], [-75.5084,31.3789,7.6081], [-75.5084,31.3789,7.6081], [-76.2535,30.6241,7.30646], [-76.6261,30.8788,7.03935], [-75.5084,31.3789,7.6081], [-76.6261,30.8788,7.03935], ..)
  78. -- node_objects: Global:node_objects : #($Sphere:frame hull @ [0.000000,0.000000,42.000000], $Sphere:frame gun mount base @ [-50.000000,0.000000,43.863716], $Sphere:frame chain @ [-32.310181,13.480178,74.809677], $Sphere:frame gun @ [-22.030003,0.000005,81.889992], $Sphere:frame barrels @ [-14.113003,0.000005,91.499992], $Sphere:frame left back suspension @ [-39.301186,16.099968,24.099716], $Sphere:frame left back engine @ [-63.000000,31.604019,20.088018], $Sphere:frame left back tire @ [-63.000000,49.604015,20.088018], $Sphere:frame left front suspension @ [42.825058,16.099968,23.606783], $Sphere:frame left front engine @ [67.000000,31.604019,20.088017], $Sphere:frame left front tire @ [67.000000,49.604015,20.088015], $Sphere:frame right back suspension @ [-39.301186,-17.000000,24.099716], $Sphere:frame right back engine @ [-63.000000,-32.317009,20.088018], $Sphere:frame right back tire @ [-63.000000,-50.317005,20.088018], $Sphere:frame right front suspension @ [42.825058,-17.000000,23.606783], $Sphere:frame right front engine @ [67.000000,-32.317009,20.088017], $Sphere:frame right front tire @ [67.000000,-50.317005,20.088017], $Sphere:frame steering wheel @ [14.725431,16.956419,54.087311])
  79. -- node_child_indices: Global:node_child_indices : #(#(2, 3, 4, 5, 6, 7), #(8, 9), #(10), #(11), #(12), #(13), #(), #(), #(14), #(15), #(16), #(17), #(18), #(), #(), #(), #(), #())
  80. -- geom_object_has_tverts: Global:geom_object_has_tverts : #(true, true, true, true, true, true, true, true, true, undefined, true, true)
  81. -- ------------------------------------------------------
  82. -- called from top-level