A proper 3d & HDR Viewer plugin for Directory Opus - need testers

Hello, everyone!

I've been building a 3D and HDR viewer plugin for Directory Opus. It's called Heimdall3D, and everything in the pictures below was rendered by it from the files on disk:

Download Heimdall3D (version 1.0.13, Windows 10 and 11)

It is completely integrated into Directory Opus:

Every 3D file and HDR image in a folder draws its own thumbnail, rendered from the file. Select a model and it opens in the preview pane, where you can orbit it and play its animation. HDR images keep their full floating point range, with exposure controls and the pixel value under the pointer.

This started as an Opus plugin and it still is one first. It has grown into a substantial codebase since I first posted here, and it now has a second half as well.

Windows Explorer and the Microsoft Store

Heimdall3D also works on a plain Windows install with no Directory Opus on it. There it gives Windows Explorer the same thumbnails and preview pane, and a viewer window opens when you double-click a file. The installer asks which hosts you want it in, and both are ticked.

The Explorer half is also on the Microsoft Store, so it installs and updates like any other Store app. The Opus plugin isn't in that package. A packaged app may not write into another program's folder, and the plugin lives in the Opus one, so it comes from the installer on heimdall3d.com. The pricing page explains the split.

Independent decoding and rendering

Heimdall3D decodes and renders every file itself. It does not use Microsoft's Mixed Reality Viewer, which is what Directory Opus otherwise goes through for 3D previews.

Anyone who owned a Microsoft VR headset probably remembers the frustration when support was dropped. I have two headsets sitting beside me that are now essentially bricked.

Heimdall3D's format support does not depend on what Microsoft installs, removes, or changes. Mixed Reality Viewer is no longer preinstalled on Windows 11, and animation that once worked through it stopped after a Windows update.

The whole pipeline runs through Vulkan on whatever GPU is already in your machine: materials, textures, skinning, shadows, environment lighting and tone mapping. I wrote most of the decoders myself. glTF comes in through cgltf, FBX through ufbx, EXR through OpenEXR and KTX2 through Basis Universal, each pinned at a version and compiled into the binary. Everything ships in one binary with no runtime dependencies.

Supported formats

I only list a model format when its materials, textures, skeleton and animation load too, where the format has them.

Models and motion capture: glTF and GLB, including meshes compressed with Draco or meshopt and textures stored as WebP or Basis. FBX. VRM, read as the glTF it is. OBJ with its .mtl. PLY, ASCII and both binary byte orders. 3DS. 3MF. STL. BVH.

COLLADA opens with its geometry, materials, textures and scene graph. Its animation and skin controllers aren't read yet, so a rigged .dae opens in bind pose. That's the next format work.

HDR images and textures: EXR, Radiance .hdr and .pic, PFM, DDS down to BC7, KTX2 and Basis, and TIFF in both spellings.

PNG, JPEG, WebP and TGA are decoded as the textures inside a model. As files of their own I leave them to Opus, which handles them well already.

Every listed format gets thumbnails, the preview pane and the viewer window, in Opus and in Explorer. If a format you use is missing, tell me which one. Requests decide what gets added next.

More than a basic preview

In the preview pane and the viewer window you can:

  • Orbit and inspect models
  • Change the lighting and the environment map
  • Add up to three point lights, each with its own colour or Kelvin temperature
  • Place models on a floor
  • Enable depth of field, outlines and cartoon shading, while a clip keeps playing
  • Swap every material for a UV checker, to find stretched or overlapping UVs
  • Play and inspect animations

These are purely viewing options and never modify the original file.

The ratified glTF material extensions all render, on opaque surfaces and on glass: sheen, anisotropy, clearcoat, iridescence, specular, transmission and IOR. Velvet gets its pale rim, brushed metal stretches its highlight along the grain, and a cut stone with dispersion splits the light into colour.

Motion capture is supported too. If a BVH or FBX file contains a skeleton and animation but no visible mesh, Heimdall3D retargets it onto a mannequin. You can watch the motion instead of staring at an empty preview.

There are also tools for creating images. For example, you can load a motion capture animation and render it from eight directions to create a sprite atlas for a 2D game, or record a model as a turntable. I intend to keep adding tools like this, so please keep the requests coming.

Thumbnails come from a useful camera angle, and a motion capture file shows the mannequin in a representative pose. On my machine a model with 350,000 triangles takes about 1.2 seconds to render, and the result is cached, so opening the folder again costs nothing. HDR, EXR and DDS files show their pixel dimensions in the file list.

The renderer also runs in a separate process. If a particularly hostile file manages to crash it, Directory Opus stays alive.

What is free and what a licence buys

Looking is free and does not expire. Thumbnails, the preview pane and the viewer window need no key and no account, on every supported format, in Opus and in Explorer. Install it, run it on your own files, and you'll know it works on your machine before you pay anything.

A licence buys the four actions that get a picture out of the viewer: saving an image, copying a frame to the clipboard, rendering a sprite sheet, and recording a turntable or animation clip. The key is checked on your own machine with no activation and no network, and one key covers both hosts. Details are on the pricing page.

What you need

Windows 10 or 11, 64-bit, and Directory Opus 13 for the plugin. The renderer wants a graphics card with Vulkan 1.2 or newer, on NVIDIA, AMD or Intel. A machine without one still gets thumbnails and an orbitable preview.

Where I'd still like your help

It works well on my machines, but I can't see how it runs on yours.

I deliberately do not have an NVIDIA card in my development machine right now. After my RTX 3090 died, I replaced it with an Intel Arc B580. That serves the project quite well, since it keeps me honest about the middle of the range, but it does mean I see fewer NVIDIA and AMD systems than you do.

So try it, run it, and complain if a feature that "obviously" belongs there is missing. =)

I'm particularly interested in:

  • Files that fail to open or render incorrectly. I genuinely want to see them.
  • Unusual FBX and BVH files, since exporters tend to disagree most about these formats.
  • Large EXR files, especially those with alpha channels or layers you depend on.
  • NVIDIA and AMD systems, and laptops with switchable graphics.

I'm not affiliated with GPSoftware, and Heimdall3D is not endorsed by them. But I like them a lot!

I will always support Directory Opus, as it has supported us.

Take care,
give it a try, let me know what you think!

5 Likes

A new update is out, making material coverage complete!:

0.23.0

The second beta. All six ratified glTF material extensions now render on both opaque surfaces and glass.

Installing a newer beta starts a fresh 21-day trial. Installing an older build does not. From version 1.0, the trial period will run only once.

Added

  • Fabric renders as fabric. KHR_materials_sheen draws its Charlie lobe, giving velvet the pale rim along its silhouette characteristic of a woven surface.
  • Brushed metal is brushed. KHR_materials_anisotropy stretches highlights along the grain. Reflections are oriented correctly and retain their anisotropic shape.
  • Car paint gets its coat. KHR_materials_clearcoat layers a polished film over the base, with its own normal map, allowing it to remain smooth over a flaked surface.
  • Abalone and pearl paint shift with the angle. KHR_materials_iridescence completes the six extensions. It is integrated in RGB, approximating a spectral render.
  • Tinted and weighted reflections. KHR_materials_specular controls the colour and strength of a non-metal's reflections. Shot silk turns orange where the light catches it.
  • A model can carry several material sets. KHR_materials_variants names each set and adds a picker to the pane. Switching takes effect without reloading the file.
  • WebP textures in glTF. Files using EXT_texture_webp now load instead of being refused. The decoder is ours, and animated WebP textures display their first frame.

Changed

  • A clearcoat reflects what stands beside it. A coated car body now reflects the wheel next to it. This costs 0.2 ms per frame, and anything the screen cannot see comes from the environment.
  • Sheen and anisotropy take the environment's own shape. The environment is prefiltered a second time with the Charlie lobe, so a fabric's rim carries the room instead of its average, while a brushed disc reflects a streak instead of a blob. The second chain costs 4.0 MiB of video memory and adds no measurable load time.
  • Glass carries its material extensions. All five lobes now render on transmitting surfaces, allowing sunglass lenses to shift from purple to blue.
  • Index of refraction sets reflectance. KHR_materials_ior now applies to opaque and transmissive surfaces alike. Amber at 1.55 reflects 4.6% rather than 4%.
  • A glass shadow keeps more of its colour. The tint map now stores optical depth at 10 bits per channel rather than transmittance at 8 bits. Under green glass, 43 pixels in a 320-pixel frame change.
  • The forward pass is compiled per material. Lobes not declared by a material are removed from its shader. The pass runs 0.15 to 0.24 ms per sample faster.
  • The GPU renderer now requires fragment stores and atomics. Devices without fragmentStoresAndAtomics fall back to the CPU rasteriser. Every desktop GPU released since 2012 supports it.

Fixed

  • Transparent models now render deterministically. The tint map and transparency accumulator now use integer addition. All thirteen models that previously drifted between runs are stable.
  • Texture indices are bounds-checked on every path. Three of the eight maps were unchecked in one code path. There is no known way to reach it from a valid file.

Under the hood

  • The wire protocol has moved from version 6 to 7. This is a breaking change that carries the six material extensions. The plugin and render helper are installed together, so a mismatched pair cannot normally be assembled.

0.12.0

The first open beta.

Heimdall3D has gone from beta to release since the last update here. 1.0.11 is the
current version
, at heimdall3d.com. Thank you to everyone who
pointed their files and machines at the beta. Here is what changed.

More formats. Five model formats arrived, and compressed glTF opens: a file packed
with Draco or meshopt reads the same as its uncompressed twin. A format is listed as fully
supported only when it carries both its textures and its animation; where a format defines
no animation, that is the format, and the list says so.

  • PLY. ASCII and both binary byte orders, per-vertex or per-face texture coordinates,
    and the image the file names. The format defines no animation.
  • 3DS. Diffuse and bump maps, with materials bound per face. Its keyframe block is a
    scene animation rather than a rig, and is not read.
  • 3MF. Colour, materials, texture coordinates and units, the four things STL does not
    carry. The format defines no animation.
  • DAE (COLLADA). Geometry, materials, the scene graph and the declared up axis. Its
    animation and skin controllers are not read yet, so a rigged file opens in bind pose.
  • VRM. It is glTF underneath: the same reader, the same maps, the same clips. Its
    avatar-specific extension data is not interpreted.
  • On the image side, KTX2, Basis, TIFF and WebP join EXR, HDR, PIC, DDS and PFM.

Materials. The ratified glTF material extensions draw, on opaque surfaces and on glass
alike. Velvet takes the pale rim a woven surface has along its silhouette, brushed metal
stretches its highlight along the grain, car paint layers a polished film with its own
normal map over a flaked base, and abalone and pearl shift colour with the angle
(KHR_materials_sheen, _anisotropy, _clearcoat, _iridescence, _specular,
_transmission, _ior).

Glass refracts, and a material carrying dispersion refracts across the spectrum, so a cut
stone splits light into colour the way a real one does. A diamond authored for WebGI is
read for its refractive index, dispersion and colour; without that reading, a diamond ring
draws as white plastic, which is what every other glTF viewer shows.

Looking is free and does not expire. Nothing counts down any more. Thumbnails, the
preview pane and the viewer window need no key and no account, on every format. Install
it, run it on your own files, and know that it works on your machine before you pay
anything.

A licence is 49 EUR including VAT, one payment, no subscription. It covers the whole
1.x line, updates included, on every computer you personally work on, and it buys the four
actions that get a picture out of the viewer: save an image, copy the frame to the
clipboard, save a sprite sheet from a playing clip, and record a turntable or the clip
itself. The key is checked on your own machine, with no activation and no network, so it
works offline. More tools for people working on 2d games will come. Allowing them to build the views for any object. Generating atlases / sprite-sheets from any view on any object.

Reports are still wanted. Files that fail to open or render incorrectly are the most
useful thing you can send me, and unusual FBX and BVH files most of all. Give it a try,
and let me know what you think!

1 Like

Heimdall3D is released. It is on sale at heimdall3d.com and in the Microsoft Store, and 1.0.13 is the current version. The full entries are on the changelog.

The Microsoft Store listing is the Windows Explorer half: thumbnails, preview pane and viewer, updated through the Store. The Directory Opus plugin comes from the installer on the site. Setup 1.0.13 installs it, and where the Store version is present it leaves Explorer to the Store version and says so. One licence covers both.

Since 1.0.11. An FBX normal map renders at the strength written in the file. The viewer opens a demo scene when started with no file, and opens a file from its own toolbar or by drop. Both are in the standalone viewer. In the Opus pane, Opus chooses the file. A comparison page puts Heimdall3D beside six other viewers with the full format table.

1 Like

Another update. Improving the quality of the rendering further!

Heimdall3D 1.0.15

Heimdall3D 1.0.15 is out. Three changes you will see in the viewer pane, and one thing that is coming.

Detail keeps its highlights

Fine detail now shows as detail: brushed metal, leather grain and an engraving keep their highlights steady as the view moves. Before pixels flickered, that is now fixed. The roughness is widened by the variation a pixel actually contains, taken from the normal map's own detail and from how fast the surface turns across the pixel, so detail finer than a pixel shades as the average of what it holds.

Several models in one scene

You can now build a scene from several models and move each on its own. A scene graph lists them, and an entry can be grouped, hidden and renamed. Edit mode is one button at the head of the toolbar. In it, clicking an object puts a manipulator on it: arms to move it along an axis, rings to turn it, a centre handle to size it. Reset puts an object back where its file placed it. A drag is drawn in place, so it costs about 17 ms a frame on a 94,722-triangle model at 1200x900, against 6 ms for an orbit. A scene saves to one file where you choose and loads back. It also autosaves every thirty seconds and appears in Recently opened, so a scene you replaced is recoverable.

This is the first step towards composing whole scenes in the pane. Objects are placed by eye in this release; snapping is still to come.

Turntables write a movie

A turntable writes a movie as well as, or instead of, numbered stills, and the frame count and length are settable. Every shot template states its destination's own requirements with the page they were read from. Nothing is clamped: a value outside a stated band is allowed, and the card stops calling it that destination's rule. A new Frame control sets the room around the subject in a shot. Its default is 25%, chosen by looking at produced shots across the range.

Coming

Trailer shots, flybys and camera motion written out for the web and for media. We are also looking into a sequence: several camera moves set up in one go and rendered together, so a presentation or a flyby is one job to set up. The scene work above is the foundation for it.

The changelog on heimdall3d.com lists every change in 1.0.15.