From 085588de6e5637c74d22e3f5487d60b2465cc42f Mon Sep 17 00:00:00 2001 From: ThomasGorisse Date: Fri, 30 Apr 2021 15:56:27 +0200 Subject: [PATCH] Added ModelRenderable.builder().setAsyncLoadEnabled() to enable or disable textures async loading after first rendering --- build.gradle | 6 +++--- .../google/ar/sceneform/rendering/Renderable.java | 14 ++++++++++++++ .../ar/sceneform/rendering/RenderableInstance.java | 6 +++++- .../ar/sceneform/samples/gltf/MainActivity.java | 1 + 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 4af0d5e1..6a4360ea 100644 --- a/build.gradle +++ b/build.gradle @@ -9,9 +9,9 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:4.1.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" -// if (project.hasProperty('mavenCentralRepositoryUsername') && project.hasProperty('mavenCentralRepositoryPassword')) { - //classpath 'com.vanniktech:gradle-maven-publish-plugin:0.14.2' -// } + if (project.hasProperty('mavenCentralRepositoryUsername') && project.hasProperty('mavenCentralRepositoryPassword')) { + classpath 'com.vanniktech:gradle-maven-publish-plugin:0.14.2' + } } } diff --git a/core/src/main/java/com/google/ar/sceneform/rendering/Renderable.java b/core/src/main/java/com/google/ar/sceneform/rendering/Renderable.java index a77f41a4..ce87f277 100644 --- a/core/src/main/java/com/google/ar/sceneform/rendering/Renderable.java +++ b/core/src/main/java/com/google/ar/sceneform/rendering/Renderable.java @@ -35,6 +35,8 @@ public abstract class Renderable { // Data that can be shared between Renderables with makeCopy() private final IRenderableInternalData renderableData; + protected boolean asyncLoadEnabled; + // Data that is unique per-Renderable. private final ArrayList materialBindings = new ArrayList<>(); private final ArrayList materialNames = new ArrayList<>(); @@ -72,6 +74,7 @@ protected Renderable(Renderable.Builder> { private RenderableDefinition definition = null; private boolean isGltf = false; private boolean isFilamentAsset = false; + private boolean asyncLoadEnabled = false; @Nullable private LoadGltfListener loadGltfListener; @Nullable @@ -413,6 +418,15 @@ public B setIsFilamentGltf(boolean isFilamentGltf) { return getSelf(); } + /** + * Enable textures async loading after first rendering. + * Default is false. + */ + public B setAsyncLoadEnabled(boolean asyncLoadEnabled) { + this.asyncLoadEnabled = asyncLoadEnabled; + return getSelf(); + } + /** * Sets the number of frames per seconds defined in the asset. * diff --git a/core/src/main/java/com/google/ar/sceneform/rendering/RenderableInstance.java b/core/src/main/java/com/google/ar/sceneform/rendering/RenderableInstance.java index 42ddfa8a..62dafbc3 100644 --- a/core/src/main/java/com/google/ar/sceneform/rendering/RenderableInstance.java +++ b/core/src/main/java/com/google/ar/sceneform/rendering/RenderableInstance.java @@ -142,7 +142,11 @@ void createFilamentAssetModelInstance() { FilamentAsset createdAsset = renderableData.isGltfBinary ? loader.createAssetFromBinary(renderableData.gltfByteBuffer) : loader.createAssetFromJson(renderableData.gltfByteBuffer); - renderableData.resourceLoader.asyncBeginLoad(createdAsset); + if(renderable.asyncLoadEnabled) { + renderableData.resourceLoader.asyncBeginLoad(createdAsset); + } else { + renderableData.resourceLoader.loadResources(createdAsset); + } if (createdAsset == null) { throw new IllegalStateException("Failed to load gltf"); diff --git a/samples/gltf/src/main/java/com/google/ar/sceneform/samples/gltf/MainActivity.java b/samples/gltf/src/main/java/com/google/ar/sceneform/samples/gltf/MainActivity.java index 4e2cc5ba..e98c8558 100644 --- a/samples/gltf/src/main/java/com/google/ar/sceneform/samples/gltf/MainActivity.java +++ b/samples/gltf/src/main/java/com/google/ar/sceneform/samples/gltf/MainActivity.java @@ -57,6 +57,7 @@ public void loadModels() { ModelRenderable.builder() .setSource(this, Uri.parse("https://storage.googleapis.com/ar-answers-in-search-models/static/Tiger/model.glb")) .setIsFilamentGltf(true) + .setAsyncLoadEnabled(true) .build() .thenAccept(model -> { MainActivity activity = weakActivity.get();