Incorrect Rendering results with Negative Scale When Using Packaged Level Actor / FastGeo ISMTransformer

Environment

  • Unreal Engine: 5.8.3

  • Platform: Windows 11

Description

I encountered an issue where a Static Mesh can produce incorrect normals after being converted to a Packaged Level Actor (BPP) when the actor has a negative scale.

The issue appears to be related to FastGeo / ISMTransformer, and is particularly noticeable when the material is Two-Sided.

Steps to Reproduce

  1. Download a Static Mesh asset from Megascans.

  2. Create eight copies of the Static Mesh Actor and assign different scale combinations to them, covering the permutations of positive and negative scale signs.

    For example:

    • (+, +, +)

    • (-, +, +)

    • (+, -, +)

    • (+, +, -)

    • (-, -, +)

    • (-, +, -)

    • (+, -, -)

    • (-, -, -)

![Simple Material with two-sided option turned on|566x500]
3. Create a simple material using the Static Mesh.

  1. Enable Two Sided on the material.

  2. Assign the material to the Static Mesh.

  3. Select the actors and convert/package them into a Packaged Level Actor (BPP).

7 Observe the resulting rendering and visualize the world-space normals.

Actual Result


After the actors are converted into a Packaged Level Actor, some instances with negative scale produce incorrect normals and therefore incorrect lighting/shading.

The issue can be observed using World Normal Visualization.

The same meshes render correctly before being converted into the Packaged Level Actor.

Incorrect Result

Comparison

When Two Sided is disabled, the problem appears to disappear or behave differently.

Expected Result

The generated Packaged Level Actor should preserve the original mesh orientation, winding/handedness, and normal behavior regardless of whether the source actor uses positive or negative scale.

In particular, the combination of:

  • Static Mesh

  • Negative Actor Scale

  • Two-Sided Material

  • Packaged Level Actor

  • FastGeo / ISMTransformer

should not result in incorrect normals.

Affected Features

  • Packaged Level Actor

  • FastGeo

  • ISMTransformer

  • Static Meshes using negative scale

  • Two-Sided materials

Additional Information

The issue seems to be specifically related to how the negative scale is handled when the actor is transformed/instanced during the Packaged Level Actor conversion.

I would like to know:

  1. Is this a known issue in UE 5.8.3?

  2. Is negative scale currently supported by FastGeo / ISMTransformer?

  3. Is there a known workaround for preserving the correct normal orientation when converting these actors into Packaged Level Actors?

  4. Is there a relevant source-code path or fix that should be investigated?


5. Saw this note in UnrealEngine Code, but could not find that issue descripti on Unreal Engine Issues and Bug Tracker.

The mesh is fine. A negative scale mirrors it, and the vertex normal has to be multiplied by the sign of that scale, the inverse transpose of the instance transform. Before you pack, the actor transform still has the negative component, so the normal is flipped correctly. Two Sided only shows the back faces. It does not fix the normal.

FastGeo’s ISMTransformer bakes those actors into instances, and that path is dropping the negative determinant. The instance is stored without the mirror, or the normal matrix is built from the absolute scale. Two Sided then hides the culled faces, but the world normal stays flipped, which is the world-normal view in your shot. Turning Two Sided off looks “fixed” only because the flipped faces get culled again.

Do not rely on a negative instance scale for anything that goes into a Packaged Level Actor. Duplicate the Megascans mesh, mirror it in the asset itself (scale it by -1 in the DCC, or in the static mesh editor, then flip the faces and the normals so the asset’s own scale is positive), and use that mesh for the mirrored copies. Positive-scale instances survive the transformer.

A material patch is possible but worse. Pass the sign of each axis as per-instance custom data and multiply the world normal by it. You would have to do that on every material, and the two-sided sign still will not match a mirrored instance.

If a positive-scale copy of the same mesh packs correctly and only the negative ones break, this is the transformer, not the Megascans asset. The mirrored mesh is the way to ship it while that stands.

Packaged Level Actor / FastGeo turns those meshes into instances. An instance transform with a negative determinant (one negative axis, or all three) mirrors the mesh. ISM keeps a single index buffer and does not swap in a reversed one per instance, so the mirrored copies keep the original winding and the vertex normal points the wrong way. A normal Static Mesh Component does handle negative scale, which is why the actors look right before you package them. Two Sided only draws the back faces. The normal used for lighting is still flipped, so it looks worse, not better.

Your eight permutations line up with that. Two negative axes have a positive determinant and usually survive. One or three negative axes are the broken ones.

What works:

  • Bake the mirror into the asset and keep the instance scale positive. Modeling Mode, Mirror, or in your DCC scale by -1 on that axis and Apply, then reimport. Use that mesh for the mirrored placements. FastGeo can instance it safely.
  • Or leave the mirrored actors out of the Packaged Level Actor so they stay as regular static mesh components.

There is no project checkbox that makes FastGeo emit a reversed index buffer for negative instances. A material can multiply the normal by a Custom Primitive Data sign, but the transformer will not set that for you, and the winding order is still wrong. Positive scale on a mirrored source mesh is the reliable fix.