Skip to content
This repository was archived by the owner on Jul 28, 2020. It is now read-only.

Commit 4d7b660

Browse files
authored
Fix glTF loading in with Filament gltfio in Sceneform 1.16 (#1029)
* Fix support for standard glTF which was broken (only glb worked). * Use correct Resource Loader for Filament gltf loads.
1 parent d591694 commit 4d7b660

File tree

3 files changed

+13
-21
lines changed

3 files changed

+13
-21
lines changed

sceneformsrc/sceneform/src/main/java/com/google/ar/sceneform/rendering/LoadRenderableFromFilamentGltfTask.java

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,20 @@ public CompletableFuture<T> downloadAndProcessRenderable(
4949
// Download byte buffer via thread pool
5050
() -> {
5151
try {
52-
byte[] gltfByteBuffer =
53-
SceneformBufferUtils.inputStreamCallableToByteArray(inputStreamCreator);
54-
return ByteBuffer.wrap(gltfByteBuffer);
52+
return SceneformBufferUtils.inputStreamCallableToByteArray(inputStreamCreator);
5553
} catch (Exception e) {
5654
throw new CompletionException(e);
5755
}
5856
},
5957
ThreadPools.getThreadPoolExecutor())
6058
.thenApplyAsync(
6159
gltfByteBuffer -> {
62-
this.renderableData.gltfByteBuffer = gltfByteBuffer;
60+
// Check for glb header
61+
this.renderableData.isGltfBinary = gltfByteBuffer[0] == 0x67
62+
&& gltfByteBuffer[1] == 0x6C
63+
&& gltfByteBuffer[2] == 0x54
64+
&& gltfByteBuffer[3] == 0x46;
65+
this.renderableData.gltfByteBuffer = ByteBuffer.wrap(gltfByteBuffer);
6366
return renderable;
6467
},
6568
ThreadPools.getMainExecutor());
@@ -92,19 +95,7 @@ static Uri getUriFromMissingResource(
9295
// Build uri to missing resource.
9396
String decodedMissingResPath = Preconditions.checkNotNull(decodedMissingResUri.getPath());
9497
Uri decodedParentUri = Uri.parse(Uri.decode(parentUri.toString()));
95-
String scheme = Preconditions.checkNotNull(decodedParentUri.getScheme());
96-
String authority = Preconditions.checkNotNull(decodedParentUri.getAuthority());
97-
String path = Preconditions.checkNotNull(decodedParentUri.getPath());
98-
// Remove root file
99-
path = path.replace(Preconditions.checkNotNull(decodedParentUri.getLastPathSegment()), "");
100-
101-
Uri uri =
102-
new Uri.Builder()
103-
.scheme(scheme)
104-
.authority(authority)
105-
.path(path)
106-
.appendPath(decodedMissingResPath)
107-
.build();
98+
Uri uri = decodedParentUri.buildUpon().appendPath("..").appendPath(decodedMissingResPath).build();
10899
// Normalize and return Uri.
109100
return Uri.parse(Uri.decode(URI.create(uri.toString()).normalize().toString()));
110101
}

sceneformsrc/sceneform/src/main/java/com/google/ar/sceneform/rendering/RenderableInstance.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.nio.ByteBuffer;
3030
import java.nio.FloatBuffer;
3131

32+
import java.nio.IntBuffer;
3233
import java.util.concurrent.Callable;
3334
import java.util.function.Function;
3435

@@ -122,7 +123,8 @@ void createFilamentAssetModelInstance() {
122123
RenderableInternalFilamentAssetData.getMaterialProvider(),
123124
EntityManager.get());
124125

125-
FilamentAsset createdAsset = loader.createAssetFromBinary(renderableData.gltfByteBuffer);
126+
FilamentAsset createdAsset = renderableData.isGltfBinary ? loader.createAssetFromBinary(renderableData.gltfByteBuffer)
127+
: loader.createAssetFromJson(renderableData.gltfByteBuffer);
126128

127129
if (createdAsset == null) {
128130
throw new IllegalStateException("Failed to load gltf");
@@ -138,8 +140,6 @@ void createFilamentAssetModelInstance() {
138140
new Vector3(center[0], center[1], center[2]));
139141
}
140142

141-
ResourceLoader resourceLoader = new ResourceLoader(engine);
142-
Preconditions.checkState(createdAsset.getResourceUris().length == 0);
143143
Function<String, Uri> urlResolver = renderableData.urlResolver;
144144
for (String uri : createdAsset.getResourceUris()) {
145145
if (urlResolver == null) {
@@ -149,7 +149,7 @@ void createFilamentAssetModelInstance() {
149149
Uri dataUri = urlResolver.apply(uri);
150150
try {
151151
Callable<InputStream> callable = LoadHelper.fromUri(renderableData.context, dataUri);
152-
resourceLoader.addResourceData(
152+
renderableData.resourceLoader.addResourceData(
153153
uri, ByteBuffer.wrap(SceneformBufferUtils.inputStreamCallableToByteArray(callable)));
154154
} catch (Exception e) {
155155
Log.e(TAG, "Failed to download data uri " + dataUri, e);

sceneformsrc/sceneform/src/main/java/com/google/ar/sceneform/rendering/RenderableInternalFilamentAssetData.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public class RenderableInternalFilamentAssetData implements IRenderableInternalD
2727

2828
Context context;
2929
Buffer gltfByteBuffer;
30+
boolean isGltfBinary;
3031
ResourceLoader resourceLoader;
3132
@Nullable Function<String, Uri> urlResolver;
3233
static MaterialProvider materialProvider;

0 commit comments

Comments
 (0)