jMonkeyEngine / jmonkeyengine

A complete 3-D game development suite written in Java.
http://jmonkeyengine.org
BSD 3-Clause "New" or "Revised" License
3.74k stars 1.12k forks source link

implement the KHR_mesh_quantization extension #2222

Open stephengold opened 3 months ago

stephengold commented 3 months ago

Khronos has specified an extension to glTF for loading meshes with byte and/or short coordinates.

Currently, attempting to load such a model results in an exception:

com.jme3.asset.AssetLoadException: An error occurred loading AnimatedMorphCube/glTF-Quantized/AnimatedMorphCube.gltf
    at com.jme3.scene.plugins.gltf.GltfLoader.loadFromStream(GltfLoader.java:181)
    at com.jme3.scene.plugins.gltf.GltfLoader.load(GltfLoader.java:107)
    at com.jme3.asset.DesktopAssetManager.loadLocatedAsset(DesktopAssetManager.java:274)
    at com.jme3.asset.DesktopAssetManager.loadAsset(DesktopAssetManager.java:390)
    at com.jme3.asset.DesktopAssetManager.loadModel(DesktopAssetManager.java:441)
    at com.github.stephengold.wrench.test.CompareLoaders.loadModel(CompareLoaders.java:886)
    at com.github.stephengold.wrench.test.CompareLoaders.loadModel(CompareLoaders.java:841)
    at com.github.stephengold.wrench.test.CompareLoaders.onAction(CompareLoaders.java:496)
    at jme3utilities.ui.DefaultInputMode.onAction(DefaultInputMode.java:186)
    at com.jme3.input.InputManager.invokeActions(InputManager.java:174)
    at com.jme3.input.InputManager.onKeyEventQueued(InputManager.java:474)
    at com.jme3.input.InputManager.processQueue(InputManager.java:871)
    at com.jme3.input.InputManager.update(InputManager.java:923)
    at com.jme3.app.LegacyApplication.update(LegacyApplication.java:805)
    at com.jme3.app.SimpleApplication.update(SimpleApplication.java:249)
    at com.jme3.system.lwjgl.LwjglWindow.runLoop(LwjglWindow.java:631)
    at com.jme3.system.lwjgl.LwjglWindow.run(LwjglWindow.java:721)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.ClassCastException: class java.nio.DirectShortBufferU cannot be cast to class java.nio.FloatBuffer (java.nio.DirectShortBufferU and java.nio.FloatBuffer are in module java.base of loader 'bootstrap')
    at com.jme3.scene.plugins.gltf.GltfLoader.readMeshPrimitives(GltfLoader.java:457)
    at com.jme3.scene.plugins.gltf.GltfLoader.readNode(GltfLoader.java:252)
    at com.jme3.scene.plugins.gltf.GltfLoader.readChild(GltfLoader.java:301)
    at com.jme3.scene.plugins.gltf.GltfLoader.readChild(GltfLoader.java:309)
    at com.jme3.scene.plugins.gltf.GltfLoader.readScenes(GltfLoader.java:218)
    at com.jme3.scene.plugins.gltf.GltfLoader.loadFromStream(GltfLoader.java:155)
    ... 17 more

Since the extension may be widely used in the future, it would be nice if jme3-plugins could handle it. I haven't scoped out the changes and don't know whether the core engine supports such meshes.

For examples, see the glTF-Sample-Assets repo at GitHub.