Supported 3ds Max Versions: 2020-2026
 last update 29.03.2025

 MeshLink can be found in "Create-Panel --> Geometry --> Guruware"
 or use the "X-Key"

 A procedural object for loading single files or file-sequences using supported importers (for now OBJ and PLY, see gw::PlyImp).
 To support your custom importers, they need to use an ImporterExtension Interface - contact me if you want to know more about it.

 You can also load an "Object-File-List" (*.ofl), this files are similar to Image File Lists (*.ifl)
   format: filename|rot|scale
   rot: any +/- combinations, how many times to rotate about x-axis by 90 degree
   scale : scale multiplier
     eq.
     some.obj | +++    --> rotates 270° clockwise about x-axis
     some.obj | -          --> rotates 90° counter-clockwise about x-axis
     some.ply | +-        --> doesnt rotate at all

 Included is a slightly improved obj-importer.
 This is the same importer which comes with 3dsmax, but with some minor bug-fixes, speed-improvements, thread-safe,
 vetexcolor-import and a redesigned importer-dialog.
 The Importer is only used in combination with this procedural object, and will NOT show up in the default importer-list.

 Importers have a "Auto-Update"-checkbox, for live updates on config change.

 Imported materials are Physical Materials.

 Tooltips show MXS-property names and data-type.

 scripting-props:
 - importers [int]
 - enabled [bool]
 - filename [string] - eq. for sequence filename=d:/some_path/afile534.obj
                               takes all files named afile with exact 3 digits at end (files with 4 digits are ignored)
                               afile534.obj doesnt have to exist
 - singleFile [bool]
 - useSequenceMaterial [bool]
 - showVertexColors [bool]
 - scale [float] animatable
 - usecache [bool]
 - freeMem [int]
 - playbackType [int]
 - playbackStart [int]
 - playbackEnd [int]
 - playbackRate [float]
 - playbackFrame [float] animatable
 - playbackSnapFrames [bool]
 - outOfRangeType [int]

 scripting-methods:
   string GetCurrentFile()
   int GetNumSequenceFiles()
   void Reload()
   void CacheMeshes()
   void ClearCache()
   int GetCacheSize()
   bool LoadCache(string) - filename
   bool SaveCache(string) - filename
   void Verbose(int) - set to 1 to print some info to mxs-listener while caching

 Main Params, here a single file or a file-sequence can be loaded using supported importers.
 Supported importers can be configured here.
 Importer configurations are stored per object instance, and saved with a max-file.



list of supported importers -

configure selected importer -

  enable/disable the whole object -

load a file or filesequence -

 if ON only the choosen file is used -

 use material from loaded file/sequence -

 show imported vertexcolors in viewport -

 auto-reload file on change -
(only for single files)  

 reload current file/sequence -
 CTRL+Reload reloads current frame only  

- show/hide tooltips of all controls

- shows numer of files in loaded sequence

- shows currently used file for current frame 

- additional scale for imports (animatable)

- auto-reload material-file on change,
   if there is (only for single files)


 Cache Params define if loaded meshes are cached for faster playback.
 Caches can be loaded/saved for later use.


use caching feature (or not) -

caching will stop when this limit is reached -

shows amount of used/free memory-
 the button toggles between used/free memory  

load a previously save cache file -



- cache the whole meshsequence,
   multithreaded, can be canceled

- delete currently cached meshes 

- save current cache to a file

 Playback Params define how the loaded sequence is played back.
 Playback works like in PointCache-Modifier.
 Sub-Frame meshes are calculated if possible (frameA and frameB have same number of vertices/normals/uvs/...).
 Out-of-Range types can be set as needed.


 playback type - 

 the frame at which playback will start - 
 eq. a value of -5 will use file#5   
from the sequence at frame '0'   

multiplier for playback speed - 

 snaps to nearest frame if framenum is float - 
 if OFF, a "sub-frame" is calculted if possible   

 loops over loded sequence - 

 plays ping-pong with loaded sequence - 



  • original range
  • custom start
  • custom range
  • playback graph

    - the frame at which playback will stop
       eq. a value of 50 for a 100 frame sequence
       will show file#100 at frame 50

    - frame of sequence to use (animatable),
       when playback-type is set to "playback graph" 

    - shows if interpolation between frames is possible 

    - shows start/endframe

    - shows an empty mesh

  •  Icon Params define how the viewport-icon is show in the viewports.
     The Axis-Tripod shows the orientation and scale of imported file/file-sequence.


    shows icon-text (ML) -

    shows axis-tripod of imported file -

    shows out-of-range type -

    shows current sequence number -



    - show/hide view icon

    - size of viewport icon






    Sample OBJ-Sequence

    Script to convert OBJ-Sequence to Alembic