Skip to content

FBX import throws OutOfMemoryError #1928

Closed
@stephengold

Description

@stephengold

I'm testing current "master" branch with FBX assets downloaded from CGtrader, Mixamo, and Sketchfab.
Attempting to load any file with version > 7400 results in an OutOfMemoryError.
For example:

SEVERE: Uncaught exception thrown in Thread[jME3 Main,5,main]
java.lang.OutOfMemoryError: Java heap space
	at java.base/java.util.ArrayList.<init>(ArrayList.java:156)
	at com.jme3.scene.plugins.fbx.file.FbxElement.<init>(FbxElement.java:61)
	at com.jme3.scene.plugins.fbx.file.FbxReader.readFBXElement(FbxReader.java:92)
	at com.jme3.scene.plugins.fbx.file.FbxReader.readFBXElement(FbxReader.java:102)
	at com.jme3.scene.plugins.fbx.file.FbxReader.readFBX(FbxReader.java:77)
	at com.jme3.scene.plugins.fbx.FbxLoader.loadData(FbxLoader.java:149)
	at com.jme3.scene.plugins.fbx.FbxLoader.load(FbxLoader.java:110)
	at com.jme3.asset.DesktopAssetManager.loadLocatedAsset(DesktopAssetManager.java:272)
	at com.jme3.asset.DesktopAssetManager.loadAsset(DesktopAssetManager.java:388)
	at com.jme3.asset.DesktopAssetManager.loadModel(DesktopAssetManager.java:439)
	at com.jme3.asset.DesktopAssetManager.loadModel(DesktopAssetManager.java:444)
	at jme3test.helloworld.HelloJME3.loadModel(HelloJME3.java:83)
	at jme3test.helloworld.HelloJME3.simpleInitApp(HelloJME3.java:57)
	at com.jme3.app.SimpleApplication.initialize(SimpleApplication.java:240)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.initInThread(LwjglAbstractDisplay.java:139)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:221)
	at java.base/java.lang.Thread.run(Thread.java:833)

The proximate cause of the crash is that the importer reads a huge number of properties (propCount) for an element --- as in more than 10^9 properties!

Apparently there were fundamental changes to how FBX elements are written between file versions 7400 and 7500.
In particular:

  • the "endOffset", "propCount", and "propsLength" fields were extended from 4 bytes to 8 bytes each and
  • the length of the block sentinel was reduced from 13 bytes to 9 bytes.

FbxReader was probably designed for file versions in the range of 7100 to 7400, so it's reading garbage for propCount.

There are countless other issues with the FBX importer. This one, at least, looks like a simple fix.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething that is supposed to work, but doesn't. More severe than a "defect".

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions