Skip to content

max.js RC 0.9.0

Latest

Choose a tag to compare

@cl0nazepamm cl0nazepamm released this 17 Aug 01:44
· 1 commit to master since this release

max.js v0.9.0 RC

max.js 0.9.0 RC is the largest release so far.

Visit updated clone.llc to see new examples!

Baseline: v0.6.0.

New Features

Post Effects

  • Full Post Effects can be saved Snapshot builder will build enabled post fx cleanly
  • Speedball and Powershot has been added to max.js stack

Relay Mode (level editor for standalone three.js projects)

  • Stream the DCC scene into your own Three.js project - a RELAY toggle in the viewport menu mirrors the live scene into an ordinary Vite/Three.js app through a supplied plugin and client. Full baseline first, sequence-gap resync, and the Max viewer stops rendering once a consumer takes over so the two do not compete for the GPU.
  • M3 scene format - the binary payload is now scene.m3, with a written contract in docs/M3_FORMAT.md: units descriptor, channel encodings, delta framing and compatibility rules. Hosts that are not in centimetres declare their own scale. Legacy scene.bin is still read.

WebApp Animator (WIP)

  • Live web pages in the scene - a plugin object that places a real web page on a surface, with animatable parameter channels driven by Max curves, depth-occluded CSS3D compositing, pointer forwarding, and 1–8 layer stacks with animatable gap.
  • Composited render capture - orchestrator and VFB renders capture the WebView composite, so DOM panels and layer stacks land in rendered frames.

Runtime layers

  • Layer parameters - declare parameters from a layer and they appear as live controls in the Runtime Layers panel: sliders, floats, colours, booleans and text. Values survive hot reload, persist to the scene-local project settings, and replay in snapshots before the layer factory runs.
  • Property overrides - node.overrides lets a layer own a single Three.js property on a synced Max object while everything else keeps syncing.
  • More scene access - selection, materials, user properties, animation and audio are reachable from layers, with max:selection and max:time:* bus events.
  • GPU deform tier - ctx.deform.simulate with storage-from-birth attributes, named state channels and modifier-stack soft-selection weights arriving as a per-vertex input.

Viewport and workflow

  • FLOW sync mode - a third state on the sync button. Nodes are classified once per epoch by validity interval so playback only walks what can actually animate. Skinned meshes and lights are never parked.
  • Flatten Groups - merge static group members into one mesh per material, baked head-relative, so whole-group moves stay free.
  • Bitmap Output rollout - Max's Output rollout (Invert, Clamp, RGB Level, Offset, Output Amount, Color Map, Bump Amount) now works on standard bitmaps in the viewer.
  • Composition guides - thirds, golden ratio, spiral, diagonals and grid overlays with aspect masks, colour, opacity and line weight.
  • Safe Frame - letterbox the live view to the Max render output aspect.
  • HDRI reflection only - keep HDRI reflections while muting its diffuse contribution.
  • SSR denoiser - recurrent temporal denoise for screen-space reflections, with stochastic rays, radius, temporal strength, history frames and firefly guard.
  • Send Dirty Signal - force a full scene resend without reloading, for Forest Pack / RailClone / tyFlow / Point Instance producers.
  • Right-click any post-FX slider to reset it to its default.

Improved

Materials

This release fixes several long-standing material bugs. Some of them change how existing scenes look — for the better, but do expect differences.

  • Authored IOR was being destroyed - reflectivity is an alias onto ior in three.js, and it was applied after ior everywhere. Glass at 1.8, water at 1.33 and gems at 2.4 were all forced to 1.5, live and in exported snapshots. Fixed in every consumer.
  • Sheen never reached the viewer - the physical block was gated in both directions, so every SSS material silently lost sheen, clearcoat, specular, transmission, iridescence and anisotropy on the wire.
  • Extractor gaps closed - inverted Glossiness-mode roughness, unread specular lobes, unread dispersion and emission luminance (emissive could never exceed 1, so glow and bloom never fired), V-Ray reflect colour and weight arriving pinned to specular white, transparency maps destroyed by the cutout slot, and unread sheen/fuzz map slots.
  • Normal Bump wrapper ignored - strength, red/green flip and swap were read by nobody, so a normal map at strength 2.0 rendered at 1.0 and DirectX-convention maps lit inverted.
  • EXR/HDR textures never appeared - the loader cached the shared fallback under the slot's own key, so any .exr or .hdr in a material slot rendered white forever.
  • Bitmap Manual Gamma did nothing - it was emitted, normalised, and read by no consumer.
  • Lightmap UV channel - live and snapshot resolved it two different ways, so a lightmap named scene_UV1.png — the naming the bake system itself generates — sampled the wrong channel in every delivered snapshot.
  • Material edits dropped on large scenes - standard materials had no edit hook and the idle crawler could never finish a confirmation pass inside its audit window, so edits were lost until a viewer restart. Edits are now event-driven.
  • Multi/Sub fixes - the ID column is part of the material hash so remaps resync, instanced objects no longer collapse every face onto slot 0, and shared geometry group tables are cloned before rewriting.
  • TSL, MaterialX, SSS and HTML materials on instance groups no longer get downgraded to a lossy standard material on WebGPU.

Sync and performance

  • Fast-sync overhaul - a topology epoch guard drops stale deform caches instead of corrupting geometry on dynamic tessellation, Cut and Connect; live normals stream with zero per-frame allocations; sparse sub-object edits patch only the moved region; AVX2 kernels are used where the CPU supports them.
  • 90 Hz interactive geometry sync - vertex-edit and skinned lanes now poll at 11 ms against a high-resolution clock. The old 16 ms gates actually jittered between roughly 32 and 64 Hz because the system timer only advances every 15.6 ms.
  • **FLOW sync - a candidate for new viewport sync
  • Timeline scrubbing - scrub work moved out of the notification handler into a bounded mailbox with hard per-turn caps. Roughly 700 ms of jank per scrub release became zero long tasks and zero dropped frames.
  • Skinned animation no longer triggers a ~200 ms BVH rebuild per scrub stop or frame step; same-topology motion refits in place.
  • Playback lane double-copy removed - the deform replay gathered into a vector and then copied the same bytes again into the shared buffer, twice per mesh per frame on Max's UI thread.
  • Parented lights follow their parent - a light parented to a camera now rides it, and animated free spot/directional lights re-aim instead of staying frozen.

Stability

  • Post-FX VRAM leak fixed - three separate leak classes, including compiled graphs that kept running after a pipeline swap and resurrecting disposed render targets, and per-target framebuffer clones stranding around 37 MB each on every rebuild.
  • Depth of field render-target leak fixed - an upstream three.js issue creating two full-resolution targets on every setup revisit without disposing the old ones. PR was merged to three.js aswell.
  • Viewer failure forensics - renderer, GPU and browser process deaths are logged with kind, reason and exit code, and non-intentional WebGPU device losses are persisted for read-back on the next boot.
  • Torn frames during retained playback - shared-memory slots are now marked unavailable before overwrite and committed last, so a delayed event can no longer decode a mixture of two frames.
  • SSR and TRAA validation errors at post-FX scale below 1 are gone; the temporal chain sizes from the depth input rather than the drawing buffer.

Snapshots

  • Skinned characters no longer collapse at the bind origin - bones without animation tracks now take their export-time pose, and imported glTF rigs pick the correct bind basis instead of smearing.
  • GI actually converges - warmup ran a fixed handful of ticks and left the probe field holding about 4% of converged radiance, which read as "GI off". It now warms until the blend converges and re-warms when texture streaming finishes.
  • First-frame stall and missing shadows - shaders precompile with a time budget and one warmup render happens before the effect loop, so passes inherit a shadow-capable lights node. A heavy scene used to stall the GPU process long enough to freeze media in other browser tabs.
  • Post-FX replay - one frame-graph core drives both the editor and the standalone viewer, and a snapshot only downloads the effects it actually enables.
  • Runtime post-FX API - boot() returns a handle for driving depth of field and PowerShot per frame from site code, without a pipeline rebuild.
  • Studio lighting replays - per-mesh light masks, per-material environment intensity, reflection paint and camera-relative light constraints all survive export.
  • Speedball GI ships with the export - the GI runtime and its BVH dependency are copied next to the snapshot shell so a standalone viewer resolves them offline.
  • True Instancing - Binary won't write same data more than once.

Other

  • three.js r185 - the viewer moved from r184, with a vendored copy so nothing depends on the network.
  • Vendored imaging runtimes - the GI and PowerShot runtimes are vendored rather than pulled from a CDN, so the viewer and exported snapshots work offline.
  • Shader Lab - the panel is now generated from Shader Lab's own registry rather than hand-transcribed, so defaults, bounds, dropdown contents and control order match upstream. Its input is tone mapped instead of being fed linear HDR, which was clipping effects into flat white. New blob-tracking and voxel effects, and fluid, magnify-lens and pixel-trail sources.
  • Light Linking works in every node-renderer raster mode, with overflow links past the old 64-light cap instead of silently dropping.

Changed & Removed

  • Gaussian splat support is gone. The Splat Origin object, its create-menu entry, the Performance checkbox and the export option are all removed. Existing .max files containing a Splat Origin will not resolve that object.
  • Fog is no longer a rendering feature.
  • Geospatial sky is removed. The sky rollout loses the Classic/Geospatial selector and the Altitude spinner. The parameters are retired into reserved legacy slots at the same ordinal and type, so old files still resolve their saved parameter IDs. This also drops about 6 MB from snapshot exports.
  • Render modes changed. Advanced/STU/ADV and standalone Path Tracing no longer exist; the modes are Standard and Spectral, and the tracer is a view inside Spectral. Stored preferences are migrated automatically.
  • Standard mode is vanilla. Standard now uses native three.js light probes only — Speedball GI and White Phosphor are Spectral features.
  • The plugin class table changed. The total count is unchanged at 22, but its contents shifted — WebApp Animator and the Probe Grid were added, splats and fog removed. Install the matching maxjs_web/ alongside maxjs.gup; do not mix versions.
  • PowerShot controls consolidated. The per-mode Exposure sliders and PowerShot's own Brightness/Contrast rows are gone, replaced tion** (three.js stock behaviour) instead of the effective full resolution an override was forcing. Bloom will look softer and run faster.
  • "Refresh Point Instances" is now "Send Dirty Signal" in the max.js menu and the viewport menu.
  • The snapshot payload is scene.m3. Legacy scene.bin is still read.
  • Material appearance changes. The IOR, roughness inversion, V-Ray specular, normal-map strength and green-channel fixes above all change how existing scenes render.

Supported 3ds Max versions

  • Built & tested: 2027.
  • 2024, 2025 & 2026: compile and link cleanly against their SDKs.

Install

  1. Copy maxjs.gup and maxjs_web/ into your 3ds Max <ver>\plugins folder.

Always install the two together. The web runtime and the plugin negotiate a versioned contract, and mixing a new maxjs.gup with an old maxjs_web/ will fail in confusing ways.

Known limits

  • Speedball GI requires native WebGPU. On the WebGL2 fallback the probe field is skipped and scenes render as ordinary PBR.
  • Arbitrary 3ds Max procedural texmap baking remains intentionally disabled.
  • Post-FX export is broad but not exhaustive, and may not match the live viewer in every snapshot case.
  • Rapidly toggling post-FX effects on and off still strands a small amount of GPU memory per cycle.

Each archive contains maxjs.gup + maxjs_web/. See Install above.