From 6f277d835c4382c0f4acefc19f57df3844d8838f Mon Sep 17 00:00:00 2001 From: Noel Victor Date: Thu, 27 Sep 2018 18:30:10 -0400 Subject: [PATCH] SceneForm SDK v1.5.0 --- augmentedimage/settings.gradle | 1 - chromakeyvideo/settings.gradle | 1 - hellosceneform/settings.gradle | 1 - .../augmentedimage}/.gitignore | 0 .../augmentedimage}/app/.gitignore | 0 .../augmentedimage}/app/build.gradle | 11 +- .../augmentedimage}/app/proguard-rules.pro | 0 .../app/sampledata/models/frame_base.png | Bin .../sampledata/models/frame_lower_left.mtl | 0 .../sampledata/models/frame_lower_left.obj | 0 .../sampledata/models/frame_lower_right.mtl | 0 .../sampledata/models/frame_lower_right.obj | 0 .../sampledata/models/frame_upper_left.mtl | 0 .../sampledata/models/frame_upper_left.obj | 0 .../sampledata/models/frame_upper_right.mtl | 0 .../sampledata/models/frame_upper_right.obj | 0 .../app/src/main/AndroidManifest.xml | 0 .../app/src/main/assets/default.jpg | Bin .../app/src/main/assets/sample_database.imgdb | Bin .../AugmentedImageActivity.java | 0 .../AugmentedImageFragment.java | 0 .../augmentedimage/AugmentedImageNode.java | 0 .../common/helpers/SnackbarHelper.java | 0 .../main/res/drawable-xxhdpi/fit_to_scan.png | Bin .../main/res/drawable-xxhdpi/ic_launcher.png | Bin .../app/src/main/res/layout/activity_main.xml | 0 .../app/src/main/res/values/strings.xml | 2 +- .../app/src/main/res/values/styles.xml | 0 .../augmentedimage}/build.gradle | 4 +- .../augmentedimage}/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../augmentedimage}/gradlew | 0 .../augmentedimage}/gradlew.bat | 0 samples/augmentedimage/settings.gradle | 5 + .../chromakeyvideo}/.gitignore | 0 .../chromakeyvideo}/app/.gitignore | 0 .../chromakeyvideo}/app/build.gradle | 10 +- .../chromakeyvideo}/app/proguard-rules.pro | 0 .../sampledata/models/chroma_key_video.obj | 0 .../models/chroma_key_video_material.mat | 0 .../app/src/main/AndroidManifest.xml | 0 .../ChromaKeyVideoActivity.java | 0 .../main/res/drawable-xxhdpi/ic_launcher.png | Bin .../src/main/res/layout/activity_video.xml | 0 .../app/src/main/res/raw/lion_chroma.mp4 | Bin .../app/src/main/res/values/strings.xml | 2 +- .../app/src/main/res/values/styles.xml | 0 .../chromakeyvideo}/build.gradle | 4 +- .../chromakeyvideo}/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../chromakeyvideo}/gradlew | 0 .../chromakeyvideo}/gradlew.bat | 0 samples/chromakeyvideo/settings.gradle | 5 + .../hellosceneform}/.gitignore | 0 .../hellosceneform}/app/.gitignore | 0 samples/hellosceneform/app/build.gradle | 80 +++ .../hellosceneform}/app/proguard-rules.pro | 0 .../app/sampledata/models/andy.mtl | 0 .../app/sampledata/models/andy.obj | 0 .../app/sampledata/models/andy.png | Bin .../app/sampledata/models/andy.sfa | 0 .../app/src/main/AndroidManifest.xml | 0 .../HelloSceneformActivity.java | 0 .../main/res/drawable-xxhdpi/ic_launcher.png | Bin .../app/src/main/res/layout/activity_ux.xml | 0 .../app/src/main/res/values/strings.xml | 2 +- .../app/src/main/res/values/styles.xml | 0 .../hellosceneform}/build.gradle | 4 +- .../hellosceneform}/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../hellosceneform}/gradlew | 0 .../hellosceneform}/gradlew.bat | 0 samples/hellosceneform/settings.gradle | 5 + .../solarsystem}/.gitignore | 0 .../solarsystem}/app/.gitignore | 0 .../solarsystem}/app/build.gradle | 4 +- .../solarsystem}/app/proguard-rules.pro | 0 .../app/sampledata/models/Earth/Earth.bin | Bin .../app/sampledata/models/Earth/Earth.gltf | 0 .../app/sampledata/models/Earth/Earth.sfa | 179 ++++++ .../Earth/Earth_Clouds_mat_baseColor.png | Bin .../models/Earth/Earth_Mat_baseColor.png | Bin .../models/Earth/Earth_Mat_normal.png | Bin .../Earth_Mat_occlusionRoughnessMetallic.png | Bin .../app/sampledata/models/Jupiter/Jupiter.bin | Bin .../sampledata/models/Jupiter/Jupiter.gltf | 0 .../app/sampledata/models/Jupiter/Jupiter.sfa | 163 +++++ .../Jupiter/JupiterClouds_Mat_baseColor.png | Bin .../models/Jupiter/Jupiter_Mat_baseColor.png | Bin .../app/sampledata/models/Luna/Luna.bin | Bin .../app/sampledata/models/Luna/Luna.gltf | 0 .../app/sampledata/models/Luna/Luna.sfa | 107 ++++ .../models/Luna/Luna_Mat_baseColor.png | Bin .../models/Luna/Luna_Mat_normal.png | Bin .../Luna_Mat_occlusionRoughnessMetallic.png | Bin .../app/sampledata/models/Mars/Mars.bin | Bin .../app/sampledata/models/Mars/Mars.gltf | 0 .../app/sampledata/models/Mars/Mars.sfa | 173 ++++++ .../Mars/Mars_Atmosphere_Mat_baseColor.png | Bin .../models/Mars/Mars_mat_baseColor.png | Bin .../models/Mars/Mars_mat_normal.png | Bin .../app/sampledata/models/Mercury/Mercury.bin | Bin .../sampledata/models/Mercury/Mercury.gltf | 0 .../app/sampledata/models/Mercury/Mercury.sfa | 109 ++++ .../models/Mercury/Mercury_Mat_baseColor.png | Bin .../models/Mercury/Mercury_Mat_normal.png | Bin ...Mercury_Mat_occlusionRoughnessMetallic.png | Bin .../app/sampledata/models/Neptune/Neptune.bin | Bin .../sampledata/models/Neptune/Neptune.gltf | 0 .../app/sampledata/models/Neptune/Neptune.sfa | 163 +++++ .../Neptune/NeptuneGlobe_Mat_baseColor.png | Bin .../Neptune/Neptune_Clouds_Mat_baseColor.png | Bin .../app/sampledata/models/Saturn/Saturn.bin | Bin .../app/sampledata/models/Saturn/Saturn.gltf | 0 .../app/sampledata/models/Saturn/Saturn.sfa | 243 ++++++++ .../SaturnPlanet_Opaque_Mat_baseColor.png | Bin .../Saturn/SaturnRings_Mat_baseColor.png | Bin ...rnRings_Mat_occlusionRoughnessMetallic.png | Bin .../Saturn/Saturn_Clouds_mat_baseColor.png | Bin .../app/sampledata/models/Sol/Sol.bin | Bin .../app/sampledata/models/Sol/Sol.gltf | 0 .../app/sampledata/models/Sol/Sol.sfa | 250 ++++++++ .../models/Sol/Sol_Opaque_Mat_baseColor.png | Bin .../models/Sol/Sol_Opaque_Mat_emissive.png | Bin .../Sol/Sol_Transparent_Mat_baseColor.png | Bin .../Sol/Sol_Transparent_Mat_emissive.png | Bin .../SolarFlare_Transparent_Mat_baseColor.png | Bin .../SolarFlare_Transparent_Mat_emissive.png | Bin .../app/sampledata/models/Uranus/Uranus.bin | Bin .../app/sampledata/models/Uranus/Uranus.gltf | 0 .../app/sampledata/models/Uranus/Uranus.sfa | 235 +++++++ .../Uranus/UranusGlobe_Mat_baseColor.png | Bin .../UranusRings_Stingray_Mat_baseColor.png | Bin .../Uranus/Uranus_Clouds_Mat_baseColor.png | Bin .../app/sampledata/models/Venus/Venus.bin | Bin .../app/sampledata/models/Venus/Venus.gltf | 0 .../app/sampledata/models/Venus/Venus.sfa | 179 ++++++ .../Venus/Venus_Atmosphere_Mat_baseColor.png | Bin ...osphere_Mat_occlusionRoughnessMetallic.png | Bin .../Venus/Venus_Terrain_Mat_baseColor.png | Bin .../models/Venus/Venus_Terrain_Mat_normal.png | Bin .../app/src/main/AndroidManifest.xml | 0 .../samples/solarsystem/DemoUtils.java | 0 .../sceneform/samples/solarsystem/Planet.java | 0 .../samples/solarsystem/RotatingNode.java | 0 .../samples/solarsystem/SolarActivity.java | 0 .../samples/solarsystem/SolarSettings.java | 0 .../main/res/drawable-xxhdpi/ic_launcher.png | Bin .../app/src/main/res/drawable/rounded_bg.xml | 0 .../src/main/res/layout/activity_solar.xml | 0 .../src/main/res/layout/planet_card_view.xml | 0 .../src/main/res/layout/solar_controls.xml | 0 .../app/src/main/res/values/color.xml | 0 .../app/src/main/res/values/strings.xml | 0 .../app/src/main/res/values/styles.xml | 0 .../solarsystem}/build.gradle | 4 +- .../solarsystem}/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 {solarsystem => samples/solarsystem}/gradlew | 0 .../solarsystem}/gradlew.bat | 0 samples/solarsystem/settings.gradle | 5 + sceneformux/.gitignore | 13 + sceneformux/build.gradle | 42 ++ sceneformux/gradle.properties | 17 + sceneformux/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54417 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + sceneformux/gradlew | 172 +++++ sceneformux/gradlew.bat | 84 +++ sceneformux/settings.gradle | 1 + .../app => sceneformux/ux}/build.gradle | 30 +- .../ux/sampledata/sceneform_footprint.mtl | 6 + .../ux/sampledata/sceneform_footprint.obj | 585 ++++++++++++++++++ sceneformux/ux/src/main/AndroidManifest.xml | 20 + .../google/ar/sceneform/ux/ArFragment.java | 68 ++ .../ar/sceneform/ux/BaseArFragment.java | 499 +++++++++++++++ .../google/ar/sceneform/ux/BaseGesture.java | 142 +++++ .../sceneform/ux/BaseGestureRecognizer.java | 94 +++ .../sceneform/ux/BaseTransformableNode.java | 82 +++ .../ux/BaseTransformationController.java | 163 +++++ .../google/ar/sceneform/ux/DragGesture.java | 154 +++++ .../sceneform/ux/DragGestureRecognizer.java | 42 ++ .../ux/FootprintSelectionVisualizer.java | 55 ++ .../sceneform/ux/GesturePointersUtility.java | 65 ++ .../ar/sceneform/ux/HandMotionAnimation.java | 58 ++ .../ar/sceneform/ux/HandMotionView.java | 53 ++ .../google/ar/sceneform/ux/PinchGesture.java | 200 ++++++ .../sceneform/ux/PinchGestureRecognizer.java | 61 ++ .../ux/PlaneDiscoveryController.java | 54 ++ .../ar/sceneform/ux/RotationController.java | 59 ++ .../ar/sceneform/ux/ScaleController.java | 155 +++++ .../ar/sceneform/ux/SelectionVisualizer.java | 28 + .../ar/sceneform/ux/TransformableNode.java | 56 ++ .../ux/TransformationGestureDetector.java | 36 ++ .../ar/sceneform/ux/TransformationSystem.java | 197 ++++++ .../sceneform/ux/TranslationController.java | 277 +++++++++ .../google/ar/sceneform/ux/TwistGesture.java | 182 ++++++ .../sceneform/ux/TwistGestureRecognizer.java | 61 ++ .../res/drawable/sceneform_hand_phone.png | Bin 0 -> 3544 bytes .../sceneform_plane_discovery_layout.xml | 32 + .../layout/sceneform_ux_fragment_layout.xml | 27 + sceneformux/wrapper/gradle-wrapper.properties | 6 + .../app/sampledata/models/Earth/Earth.sfa | 155 ----- .../app/sampledata/models/Jupiter/Jupiter.sfa | 139 ----- .../app/sampledata/models/Luna/Luna.sfa | 101 --- .../app/sampledata/models/Mars/Mars.sfa | 148 ----- .../app/sampledata/models/Mercury/Mercury.sfa | 102 --- .../app/sampledata/models/Neptune/Neptune.sfa | 139 ----- .../app/sampledata/models/Saturn/Saturn.sfa | 201 ------ solarsystem/app/sampledata/models/Sol/Sol.sfa | 208 ------- .../app/sampledata/models/Uranus/Uranus.sfa | 193 ------ .../app/sampledata/models/Venus/Venus.sfa | 155 ----- solarsystem/settings.gradle | 1 - 216 files changed, 5796 insertions(+), 1578 deletions(-) delete mode 100644 augmentedimage/settings.gradle delete mode 100644 chromakeyvideo/settings.gradle delete mode 100644 hellosceneform/settings.gradle rename {augmentedimage => samples/augmentedimage}/.gitignore (100%) rename {augmentedimage => samples/augmentedimage}/app/.gitignore (100%) rename {augmentedimage => samples/augmentedimage}/app/build.gradle (90%) rename {augmentedimage => samples/augmentedimage}/app/proguard-rules.pro (100%) rename {augmentedimage => samples/augmentedimage}/app/sampledata/models/frame_base.png (100%) rename {augmentedimage => samples/augmentedimage}/app/sampledata/models/frame_lower_left.mtl (100%) rename {augmentedimage => samples/augmentedimage}/app/sampledata/models/frame_lower_left.obj (100%) rename {augmentedimage => samples/augmentedimage}/app/sampledata/models/frame_lower_right.mtl (100%) rename {augmentedimage => samples/augmentedimage}/app/sampledata/models/frame_lower_right.obj (100%) rename {augmentedimage => samples/augmentedimage}/app/sampledata/models/frame_upper_left.mtl (100%) rename {augmentedimage => samples/augmentedimage}/app/sampledata/models/frame_upper_left.obj (100%) rename {augmentedimage => samples/augmentedimage}/app/sampledata/models/frame_upper_right.mtl (100%) rename {augmentedimage => samples/augmentedimage}/app/sampledata/models/frame_upper_right.obj (100%) rename {augmentedimage => samples/augmentedimage}/app/src/main/AndroidManifest.xml (100%) rename {augmentedimage => samples/augmentedimage}/app/src/main/assets/default.jpg (100%) rename {augmentedimage => samples/augmentedimage}/app/src/main/assets/sample_database.imgdb (100%) rename {augmentedimage => samples/augmentedimage}/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageActivity.java (100%) rename {augmentedimage => samples/augmentedimage}/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageFragment.java (100%) rename {augmentedimage => samples/augmentedimage}/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageNode.java (100%) rename {augmentedimage => samples/augmentedimage}/app/src/main/java/com/google/ar/sceneform/samples/common/helpers/SnackbarHelper.java (100%) rename {augmentedimage => samples/augmentedimage}/app/src/main/res/drawable-xxhdpi/fit_to_scan.png (100%) rename {augmentedimage => samples/augmentedimage}/app/src/main/res/drawable-xxhdpi/ic_launcher.png (100%) rename {augmentedimage => samples/augmentedimage}/app/src/main/res/layout/activity_main.xml (100%) rename {augmentedimage => samples/augmentedimage}/app/src/main/res/values/strings.xml (92%) rename {augmentedimage => samples/augmentedimage}/app/src/main/res/values/styles.xml (100%) rename {chromakeyvideo => samples/augmentedimage}/build.gradle (90%) rename {augmentedimage => samples/augmentedimage}/gradle.properties (100%) rename {augmentedimage => samples/augmentedimage}/gradle/wrapper/gradle-wrapper.jar (100%) rename {augmentedimage => samples/augmentedimage}/gradle/wrapper/gradle-wrapper.properties (100%) rename {augmentedimage => samples/augmentedimage}/gradlew (100%) rename {augmentedimage => samples/augmentedimage}/gradlew.bat (100%) create mode 100644 samples/augmentedimage/settings.gradle rename {chromakeyvideo => samples/chromakeyvideo}/.gitignore (100%) rename {chromakeyvideo => samples/chromakeyvideo}/app/.gitignore (100%) rename {chromakeyvideo => samples/chromakeyvideo}/app/build.gradle (88%) rename {chromakeyvideo => samples/chromakeyvideo}/app/proguard-rules.pro (100%) rename {chromakeyvideo => samples/chromakeyvideo}/app/sampledata/models/chroma_key_video.obj (100%) rename {chromakeyvideo => samples/chromakeyvideo}/app/sampledata/models/chroma_key_video_material.mat (100%) rename {chromakeyvideo => samples/chromakeyvideo}/app/src/main/AndroidManifest.xml (100%) rename {chromakeyvideo => samples/chromakeyvideo}/app/src/main/java/com/google/ar/sceneform/samples/chromakeyvideo/ChromaKeyVideoActivity.java (100%) rename {chromakeyvideo => samples/chromakeyvideo}/app/src/main/res/drawable-xxhdpi/ic_launcher.png (100%) rename {chromakeyvideo => samples/chromakeyvideo}/app/src/main/res/layout/activity_video.xml (100%) rename {chromakeyvideo => samples/chromakeyvideo}/app/src/main/res/raw/lion_chroma.mp4 (100%) rename {hellosceneform => samples/chromakeyvideo}/app/src/main/res/values/strings.xml (92%) rename {chromakeyvideo => samples/chromakeyvideo}/app/src/main/res/values/styles.xml (100%) rename {solarsystem => samples/chromakeyvideo}/build.gradle (90%) rename {chromakeyvideo => samples/chromakeyvideo}/gradle.properties (100%) rename {chromakeyvideo => samples/chromakeyvideo}/gradle/wrapper/gradle-wrapper.jar (100%) rename {chromakeyvideo => samples/chromakeyvideo}/gradle/wrapper/gradle-wrapper.properties (100%) rename {chromakeyvideo => samples/chromakeyvideo}/gradlew (100%) rename {chromakeyvideo => samples/chromakeyvideo}/gradlew.bat (100%) create mode 100644 samples/chromakeyvideo/settings.gradle rename {hellosceneform => samples/hellosceneform}/.gitignore (100%) rename {hellosceneform => samples/hellosceneform}/app/.gitignore (100%) create mode 100644 samples/hellosceneform/app/build.gradle rename {hellosceneform => samples/hellosceneform}/app/proguard-rules.pro (100%) rename {hellosceneform => samples/hellosceneform}/app/sampledata/models/andy.mtl (100%) rename {hellosceneform => samples/hellosceneform}/app/sampledata/models/andy.obj (100%) rename {hellosceneform => samples/hellosceneform}/app/sampledata/models/andy.png (100%) rename {hellosceneform => samples/hellosceneform}/app/sampledata/models/andy.sfa (100%) rename {hellosceneform => samples/hellosceneform}/app/src/main/AndroidManifest.xml (100%) rename {hellosceneform => samples/hellosceneform}/app/src/main/java/com/google/ar/sceneform/samples/hellosceneform/HelloSceneformActivity.java (100%) rename {hellosceneform => samples/hellosceneform}/app/src/main/res/drawable-xxhdpi/ic_launcher.png (100%) rename {hellosceneform => samples/hellosceneform}/app/src/main/res/layout/activity_ux.xml (100%) rename {chromakeyvideo => samples/hellosceneform}/app/src/main/res/values/strings.xml (92%) rename {hellosceneform => samples/hellosceneform}/app/src/main/res/values/styles.xml (100%) rename {augmentedimage => samples/hellosceneform}/build.gradle (90%) rename {hellosceneform => samples/hellosceneform}/gradle.properties (100%) rename {hellosceneform => samples/hellosceneform}/gradle/wrapper/gradle-wrapper.jar (100%) rename {hellosceneform => samples/hellosceneform}/gradle/wrapper/gradle-wrapper.properties (100%) rename {hellosceneform => samples/hellosceneform}/gradlew (100%) rename {hellosceneform => samples/hellosceneform}/gradlew.bat (100%) create mode 100644 samples/hellosceneform/settings.gradle rename {solarsystem => samples/solarsystem}/.gitignore (100%) rename {solarsystem => samples/solarsystem}/app/.gitignore (100%) rename {solarsystem => samples/solarsystem}/app/build.gradle (97%) rename {solarsystem => samples/solarsystem}/app/proguard-rules.pro (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Earth/Earth.bin (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Earth/Earth.gltf (100%) create mode 100644 samples/solarsystem/app/sampledata/models/Earth/Earth.sfa rename {solarsystem => samples/solarsystem}/app/sampledata/models/Earth/Earth_Clouds_mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Earth/Earth_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Earth/Earth_Mat_normal.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Earth/Earth_Mat_occlusionRoughnessMetallic.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Jupiter/Jupiter.bin (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Jupiter/Jupiter.gltf (100%) create mode 100644 samples/solarsystem/app/sampledata/models/Jupiter/Jupiter.sfa rename {solarsystem => samples/solarsystem}/app/sampledata/models/Jupiter/JupiterClouds_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Jupiter/Jupiter_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Luna/Luna.bin (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Luna/Luna.gltf (100%) create mode 100644 samples/solarsystem/app/sampledata/models/Luna/Luna.sfa rename {solarsystem => samples/solarsystem}/app/sampledata/models/Luna/Luna_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Luna/Luna_Mat_normal.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Luna/Luna_Mat_occlusionRoughnessMetallic.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Mars/Mars.bin (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Mars/Mars.gltf (100%) create mode 100644 samples/solarsystem/app/sampledata/models/Mars/Mars.sfa rename {solarsystem => samples/solarsystem}/app/sampledata/models/Mars/Mars_Atmosphere_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Mars/Mars_mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Mars/Mars_mat_normal.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Mercury/Mercury.bin (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Mercury/Mercury.gltf (100%) create mode 100644 samples/solarsystem/app/sampledata/models/Mercury/Mercury.sfa rename {solarsystem => samples/solarsystem}/app/sampledata/models/Mercury/Mercury_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Mercury/Mercury_Mat_normal.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Mercury/Mercury_Mat_occlusionRoughnessMetallic.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Neptune/Neptune.bin (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Neptune/Neptune.gltf (100%) create mode 100644 samples/solarsystem/app/sampledata/models/Neptune/Neptune.sfa rename {solarsystem => samples/solarsystem}/app/sampledata/models/Neptune/NeptuneGlobe_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Neptune/Neptune_Clouds_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Saturn/Saturn.bin (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Saturn/Saturn.gltf (100%) create mode 100644 samples/solarsystem/app/sampledata/models/Saturn/Saturn.sfa rename {solarsystem => samples/solarsystem}/app/sampledata/models/Saturn/SaturnPlanet_Opaque_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Saturn/SaturnRings_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Saturn/SaturnRings_Mat_occlusionRoughnessMetallic.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Saturn/Saturn_Clouds_mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Sol/Sol.bin (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Sol/Sol.gltf (100%) create mode 100644 samples/solarsystem/app/sampledata/models/Sol/Sol.sfa rename {solarsystem => samples/solarsystem}/app/sampledata/models/Sol/Sol_Opaque_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Sol/Sol_Opaque_Mat_emissive.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Sol/Sol_Transparent_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Sol/Sol_Transparent_Mat_emissive.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Sol/SolarFlare_Transparent_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Sol/SolarFlare_Transparent_Mat_emissive.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Uranus/Uranus.bin (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Uranus/Uranus.gltf (100%) create mode 100644 samples/solarsystem/app/sampledata/models/Uranus/Uranus.sfa rename {solarsystem => samples/solarsystem}/app/sampledata/models/Uranus/UranusGlobe_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Uranus/UranusRings_Stingray_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Uranus/Uranus_Clouds_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Venus/Venus.bin (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Venus/Venus.gltf (100%) create mode 100644 samples/solarsystem/app/sampledata/models/Venus/Venus.sfa rename {solarsystem => samples/solarsystem}/app/sampledata/models/Venus/Venus_Atmosphere_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Venus/Venus_Atmosphere_Mat_occlusionRoughnessMetallic.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Venus/Venus_Terrain_Mat_baseColor.png (100%) rename {solarsystem => samples/solarsystem}/app/sampledata/models/Venus/Venus_Terrain_Mat_normal.png (100%) rename {solarsystem => samples/solarsystem}/app/src/main/AndroidManifest.xml (100%) rename {solarsystem => samples/solarsystem}/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/DemoUtils.java (100%) rename {solarsystem => samples/solarsystem}/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/Planet.java (100%) rename {solarsystem => samples/solarsystem}/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/RotatingNode.java (100%) rename {solarsystem => samples/solarsystem}/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/SolarActivity.java (100%) rename {solarsystem => samples/solarsystem}/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/SolarSettings.java (100%) rename {solarsystem => samples/solarsystem}/app/src/main/res/drawable-xxhdpi/ic_launcher.png (100%) rename {solarsystem => samples/solarsystem}/app/src/main/res/drawable/rounded_bg.xml (100%) rename {solarsystem => samples/solarsystem}/app/src/main/res/layout/activity_solar.xml (100%) rename {solarsystem => samples/solarsystem}/app/src/main/res/layout/planet_card_view.xml (100%) rename {solarsystem => samples/solarsystem}/app/src/main/res/layout/solar_controls.xml (100%) rename {solarsystem => samples/solarsystem}/app/src/main/res/values/color.xml (100%) rename {solarsystem => samples/solarsystem}/app/src/main/res/values/strings.xml (100%) rename {solarsystem => samples/solarsystem}/app/src/main/res/values/styles.xml (100%) rename {hellosceneform => samples/solarsystem}/build.gradle (90%) rename {solarsystem => samples/solarsystem}/gradle.properties (100%) rename {solarsystem => samples/solarsystem}/gradle/wrapper/gradle-wrapper.jar (100%) rename {solarsystem => samples/solarsystem}/gradle/wrapper/gradle-wrapper.properties (100%) rename {solarsystem => samples/solarsystem}/gradlew (100%) rename {solarsystem => samples/solarsystem}/gradlew.bat (100%) create mode 100644 samples/solarsystem/settings.gradle create mode 100644 sceneformux/.gitignore create mode 100644 sceneformux/build.gradle create mode 100644 sceneformux/gradle.properties create mode 100644 sceneformux/gradle/wrapper/gradle-wrapper.jar create mode 100644 sceneformux/gradle/wrapper/gradle-wrapper.properties create mode 100755 sceneformux/gradlew create mode 100644 sceneformux/gradlew.bat create mode 100644 sceneformux/settings.gradle rename {hellosceneform/app => sceneformux/ux}/build.gradle (72%) create mode 100644 sceneformux/ux/sampledata/sceneform_footprint.mtl create mode 100644 sceneformux/ux/sampledata/sceneform_footprint.obj create mode 100644 sceneformux/ux/src/main/AndroidManifest.xml create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/ArFragment.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseArFragment.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseGesture.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseGestureRecognizer.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseTransformableNode.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseTransformationController.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/DragGesture.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/DragGestureRecognizer.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/FootprintSelectionVisualizer.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/GesturePointersUtility.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/HandMotionAnimation.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/HandMotionView.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/PinchGesture.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/PinchGestureRecognizer.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/PlaneDiscoveryController.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/RotationController.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/ScaleController.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/SelectionVisualizer.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TransformableNode.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TransformationGestureDetector.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TransformationSystem.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TranslationController.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TwistGesture.java create mode 100644 sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TwistGestureRecognizer.java create mode 100644 sceneformux/ux/src/main/res/drawable/sceneform_hand_phone.png create mode 100644 sceneformux/ux/src/main/res/layout/sceneform_plane_discovery_layout.xml create mode 100644 sceneformux/ux/src/main/res/layout/sceneform_ux_fragment_layout.xml create mode 100644 sceneformux/wrapper/gradle-wrapper.properties delete mode 100644 solarsystem/app/sampledata/models/Earth/Earth.sfa delete mode 100644 solarsystem/app/sampledata/models/Jupiter/Jupiter.sfa delete mode 100644 solarsystem/app/sampledata/models/Luna/Luna.sfa delete mode 100644 solarsystem/app/sampledata/models/Mars/Mars.sfa delete mode 100644 solarsystem/app/sampledata/models/Mercury/Mercury.sfa delete mode 100644 solarsystem/app/sampledata/models/Neptune/Neptune.sfa delete mode 100644 solarsystem/app/sampledata/models/Saturn/Saturn.sfa delete mode 100644 solarsystem/app/sampledata/models/Sol/Sol.sfa delete mode 100644 solarsystem/app/sampledata/models/Uranus/Uranus.sfa delete mode 100644 solarsystem/app/sampledata/models/Venus/Venus.sfa delete mode 100644 solarsystem/settings.gradle diff --git a/augmentedimage/settings.gradle b/augmentedimage/settings.gradle deleted file mode 100644 index e7b4def4..00000000 --- a/augmentedimage/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app' diff --git a/chromakeyvideo/settings.gradle b/chromakeyvideo/settings.gradle deleted file mode 100644 index e7b4def4..00000000 --- a/chromakeyvideo/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app' diff --git a/hellosceneform/settings.gradle b/hellosceneform/settings.gradle deleted file mode 100644 index e7b4def4..00000000 --- a/hellosceneform/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app' diff --git a/augmentedimage/.gitignore b/samples/augmentedimage/.gitignore similarity index 100% rename from augmentedimage/.gitignore rename to samples/augmentedimage/.gitignore diff --git a/augmentedimage/app/.gitignore b/samples/augmentedimage/app/.gitignore similarity index 100% rename from augmentedimage/app/.gitignore rename to samples/augmentedimage/app/.gitignore diff --git a/augmentedimage/app/build.gradle b/samples/augmentedimage/app/build.gradle similarity index 90% rename from augmentedimage/app/build.gradle rename to samples/augmentedimage/app/build.gradle index b98ba0c5..a556e9fe 100644 --- a/augmentedimage/app/build.gradle +++ b/samples/augmentedimage/app/build.gradle @@ -27,7 +27,7 @@ android { ndk { /* - * Sceneform is available for the following ABIs: arm64-v8a, armv7a, + * Sceneform is available for the following ABIs: arm64-v8a, armeabi-v7a, * x86_64 and x86. This sample app enables arm64-v8a to run on * devices and x86 to run on the emulator. Your application should * list the ABIs most appropriate to minimize APK size (arm64-v8a recommended). @@ -49,11 +49,14 @@ android { } dependencies { - implementation "com.google.ar.sceneform:core:1.4.0" - implementation "com.google.ar.sceneform.ux:sceneform-ux:1.4.0" - implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:design:27.1.1' + + // Use the Sceneform Ux Package pre-built from Maven. + implementation "com.google.ar.sceneform.ux:sceneform-ux:1.5.0" + + // Use the Sceneform Ux Package built from the source files included in the sceneformux folder. + //api project(":sceneformux") } apply plugin: 'com.google.ar.sceneform.plugin' diff --git a/augmentedimage/app/proguard-rules.pro b/samples/augmentedimage/app/proguard-rules.pro similarity index 100% rename from augmentedimage/app/proguard-rules.pro rename to samples/augmentedimage/app/proguard-rules.pro diff --git a/augmentedimage/app/sampledata/models/frame_base.png b/samples/augmentedimage/app/sampledata/models/frame_base.png similarity index 100% rename from augmentedimage/app/sampledata/models/frame_base.png rename to samples/augmentedimage/app/sampledata/models/frame_base.png diff --git a/augmentedimage/app/sampledata/models/frame_lower_left.mtl b/samples/augmentedimage/app/sampledata/models/frame_lower_left.mtl similarity index 100% rename from augmentedimage/app/sampledata/models/frame_lower_left.mtl rename to samples/augmentedimage/app/sampledata/models/frame_lower_left.mtl diff --git a/augmentedimage/app/sampledata/models/frame_lower_left.obj b/samples/augmentedimage/app/sampledata/models/frame_lower_left.obj similarity index 100% rename from augmentedimage/app/sampledata/models/frame_lower_left.obj rename to samples/augmentedimage/app/sampledata/models/frame_lower_left.obj diff --git a/augmentedimage/app/sampledata/models/frame_lower_right.mtl b/samples/augmentedimage/app/sampledata/models/frame_lower_right.mtl similarity index 100% rename from augmentedimage/app/sampledata/models/frame_lower_right.mtl rename to samples/augmentedimage/app/sampledata/models/frame_lower_right.mtl diff --git a/augmentedimage/app/sampledata/models/frame_lower_right.obj b/samples/augmentedimage/app/sampledata/models/frame_lower_right.obj similarity index 100% rename from augmentedimage/app/sampledata/models/frame_lower_right.obj rename to samples/augmentedimage/app/sampledata/models/frame_lower_right.obj diff --git a/augmentedimage/app/sampledata/models/frame_upper_left.mtl b/samples/augmentedimage/app/sampledata/models/frame_upper_left.mtl similarity index 100% rename from augmentedimage/app/sampledata/models/frame_upper_left.mtl rename to samples/augmentedimage/app/sampledata/models/frame_upper_left.mtl diff --git a/augmentedimage/app/sampledata/models/frame_upper_left.obj b/samples/augmentedimage/app/sampledata/models/frame_upper_left.obj similarity index 100% rename from augmentedimage/app/sampledata/models/frame_upper_left.obj rename to samples/augmentedimage/app/sampledata/models/frame_upper_left.obj diff --git a/augmentedimage/app/sampledata/models/frame_upper_right.mtl b/samples/augmentedimage/app/sampledata/models/frame_upper_right.mtl similarity index 100% rename from augmentedimage/app/sampledata/models/frame_upper_right.mtl rename to samples/augmentedimage/app/sampledata/models/frame_upper_right.mtl diff --git a/augmentedimage/app/sampledata/models/frame_upper_right.obj b/samples/augmentedimage/app/sampledata/models/frame_upper_right.obj similarity index 100% rename from augmentedimage/app/sampledata/models/frame_upper_right.obj rename to samples/augmentedimage/app/sampledata/models/frame_upper_right.obj diff --git a/augmentedimage/app/src/main/AndroidManifest.xml b/samples/augmentedimage/app/src/main/AndroidManifest.xml similarity index 100% rename from augmentedimage/app/src/main/AndroidManifest.xml rename to samples/augmentedimage/app/src/main/AndroidManifest.xml diff --git a/augmentedimage/app/src/main/assets/default.jpg b/samples/augmentedimage/app/src/main/assets/default.jpg similarity index 100% rename from augmentedimage/app/src/main/assets/default.jpg rename to samples/augmentedimage/app/src/main/assets/default.jpg diff --git a/augmentedimage/app/src/main/assets/sample_database.imgdb b/samples/augmentedimage/app/src/main/assets/sample_database.imgdb similarity index 100% rename from augmentedimage/app/src/main/assets/sample_database.imgdb rename to samples/augmentedimage/app/src/main/assets/sample_database.imgdb diff --git a/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageActivity.java b/samples/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageActivity.java similarity index 100% rename from augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageActivity.java rename to samples/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageActivity.java diff --git a/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageFragment.java b/samples/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageFragment.java similarity index 100% rename from augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageFragment.java rename to samples/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageFragment.java diff --git a/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageNode.java b/samples/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageNode.java similarity index 100% rename from augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageNode.java rename to samples/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/augmentedimage/AugmentedImageNode.java diff --git a/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/common/helpers/SnackbarHelper.java b/samples/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/common/helpers/SnackbarHelper.java similarity index 100% rename from augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/common/helpers/SnackbarHelper.java rename to samples/augmentedimage/app/src/main/java/com/google/ar/sceneform/samples/common/helpers/SnackbarHelper.java diff --git a/augmentedimage/app/src/main/res/drawable-xxhdpi/fit_to_scan.png b/samples/augmentedimage/app/src/main/res/drawable-xxhdpi/fit_to_scan.png similarity index 100% rename from augmentedimage/app/src/main/res/drawable-xxhdpi/fit_to_scan.png rename to samples/augmentedimage/app/src/main/res/drawable-xxhdpi/fit_to_scan.png diff --git a/augmentedimage/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/samples/augmentedimage/app/src/main/res/drawable-xxhdpi/ic_launcher.png similarity index 100% rename from augmentedimage/app/src/main/res/drawable-xxhdpi/ic_launcher.png rename to samples/augmentedimage/app/src/main/res/drawable-xxhdpi/ic_launcher.png diff --git a/augmentedimage/app/src/main/res/layout/activity_main.xml b/samples/augmentedimage/app/src/main/res/layout/activity_main.xml similarity index 100% rename from augmentedimage/app/src/main/res/layout/activity_main.xml rename to samples/augmentedimage/app/src/main/res/layout/activity_main.xml diff --git a/augmentedimage/app/src/main/res/values/strings.xml b/samples/augmentedimage/app/src/main/res/values/strings.xml similarity index 92% rename from augmentedimage/app/src/main/res/values/strings.xml rename to samples/augmentedimage/app/src/main/res/values/strings.xml index 5be2b3b6..b7ec353e 100644 --- a/augmentedimage/app/src/main/res/values/strings.xml +++ b/samples/augmentedimage/app/src/main/res/values/strings.xml @@ -15,6 +15,6 @@ limitations under the License. --> - AugmentedImage Sample + Augmented Images Fit image to scan diff --git a/augmentedimage/app/src/main/res/values/styles.xml b/samples/augmentedimage/app/src/main/res/values/styles.xml similarity index 100% rename from augmentedimage/app/src/main/res/values/styles.xml rename to samples/augmentedimage/app/src/main/res/values/styles.xml diff --git a/chromakeyvideo/build.gradle b/samples/augmentedimage/build.gradle similarity index 90% rename from chromakeyvideo/build.gradle rename to samples/augmentedimage/build.gradle index d629aaad..4f99af89 100644 --- a/chromakeyvideo/build.gradle +++ b/samples/augmentedimage/build.gradle @@ -22,8 +22,8 @@ buildscript { mavenLocal() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' - classpath 'com.google.ar.sceneform:plugin:1.4.0' + classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.google.ar.sceneform:plugin:1.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/augmentedimage/gradle.properties b/samples/augmentedimage/gradle.properties similarity index 100% rename from augmentedimage/gradle.properties rename to samples/augmentedimage/gradle.properties diff --git a/augmentedimage/gradle/wrapper/gradle-wrapper.jar b/samples/augmentedimage/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from augmentedimage/gradle/wrapper/gradle-wrapper.jar rename to samples/augmentedimage/gradle/wrapper/gradle-wrapper.jar diff --git a/augmentedimage/gradle/wrapper/gradle-wrapper.properties b/samples/augmentedimage/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from augmentedimage/gradle/wrapper/gradle-wrapper.properties rename to samples/augmentedimage/gradle/wrapper/gradle-wrapper.properties diff --git a/augmentedimage/gradlew b/samples/augmentedimage/gradlew similarity index 100% rename from augmentedimage/gradlew rename to samples/augmentedimage/gradlew diff --git a/augmentedimage/gradlew.bat b/samples/augmentedimage/gradlew.bat similarity index 100% rename from augmentedimage/gradlew.bat rename to samples/augmentedimage/gradlew.bat diff --git a/samples/augmentedimage/settings.gradle b/samples/augmentedimage/settings.gradle new file mode 100644 index 00000000..c81913ae --- /dev/null +++ b/samples/augmentedimage/settings.gradle @@ -0,0 +1,5 @@ +include ':app' + +// Uncomment to include the source version of the ux package in your project. +//include ':sceneformux' +//project(':sceneformux').projectDir=new File('../../sceneformux/ux') diff --git a/chromakeyvideo/.gitignore b/samples/chromakeyvideo/.gitignore similarity index 100% rename from chromakeyvideo/.gitignore rename to samples/chromakeyvideo/.gitignore diff --git a/chromakeyvideo/app/.gitignore b/samples/chromakeyvideo/app/.gitignore similarity index 100% rename from chromakeyvideo/app/.gitignore rename to samples/chromakeyvideo/app/.gitignore diff --git a/chromakeyvideo/app/build.gradle b/samples/chromakeyvideo/app/build.gradle similarity index 88% rename from chromakeyvideo/app/build.gradle rename to samples/chromakeyvideo/app/build.gradle index 77634622..c8b49e4a 100644 --- a/chromakeyvideo/app/build.gradle +++ b/samples/chromakeyvideo/app/build.gradle @@ -26,7 +26,7 @@ android { versionName "1.0" ndk { /* - * Sceneform is available for the following ABIs: arm64-v8a, armv7a, + * Sceneform is available for the following ABIs: arm64-v8a, armeabi-v7a, * x86_64 and x86. This sample app enables arm64-v8a to run on * devices and x86 to run on the emulator. Your application should * list the ABIs most appropriate to minimize APK size (arm64-v8a recommended). @@ -51,10 +51,14 @@ android { } dependencies { - implementation "com.google.ar.sceneform:core:1.4.0" - implementation "com.google.ar.sceneform.ux:sceneform-ux:1.4.0" implementation "com.android.support:appcompat-v7:27.1.1" implementation "com.android.support:design:27.1.1" + + // Use the Sceneform Ux Package pre-built from Maven. + implementation "com.google.ar.sceneform.ux:sceneform-ux:1.5.0" + + // Use the Sceneform Ux Package built from the source files included in the sceneformux folder. + //api project(":sceneformux") } apply plugin: 'com.google.ar.sceneform.plugin' diff --git a/chromakeyvideo/app/proguard-rules.pro b/samples/chromakeyvideo/app/proguard-rules.pro similarity index 100% rename from chromakeyvideo/app/proguard-rules.pro rename to samples/chromakeyvideo/app/proguard-rules.pro diff --git a/chromakeyvideo/app/sampledata/models/chroma_key_video.obj b/samples/chromakeyvideo/app/sampledata/models/chroma_key_video.obj similarity index 100% rename from chromakeyvideo/app/sampledata/models/chroma_key_video.obj rename to samples/chromakeyvideo/app/sampledata/models/chroma_key_video.obj diff --git a/chromakeyvideo/app/sampledata/models/chroma_key_video_material.mat b/samples/chromakeyvideo/app/sampledata/models/chroma_key_video_material.mat similarity index 100% rename from chromakeyvideo/app/sampledata/models/chroma_key_video_material.mat rename to samples/chromakeyvideo/app/sampledata/models/chroma_key_video_material.mat diff --git a/chromakeyvideo/app/src/main/AndroidManifest.xml b/samples/chromakeyvideo/app/src/main/AndroidManifest.xml similarity index 100% rename from chromakeyvideo/app/src/main/AndroidManifest.xml rename to samples/chromakeyvideo/app/src/main/AndroidManifest.xml diff --git a/chromakeyvideo/app/src/main/java/com/google/ar/sceneform/samples/chromakeyvideo/ChromaKeyVideoActivity.java b/samples/chromakeyvideo/app/src/main/java/com/google/ar/sceneform/samples/chromakeyvideo/ChromaKeyVideoActivity.java similarity index 100% rename from chromakeyvideo/app/src/main/java/com/google/ar/sceneform/samples/chromakeyvideo/ChromaKeyVideoActivity.java rename to samples/chromakeyvideo/app/src/main/java/com/google/ar/sceneform/samples/chromakeyvideo/ChromaKeyVideoActivity.java diff --git a/chromakeyvideo/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/samples/chromakeyvideo/app/src/main/res/drawable-xxhdpi/ic_launcher.png similarity index 100% rename from chromakeyvideo/app/src/main/res/drawable-xxhdpi/ic_launcher.png rename to samples/chromakeyvideo/app/src/main/res/drawable-xxhdpi/ic_launcher.png diff --git a/chromakeyvideo/app/src/main/res/layout/activity_video.xml b/samples/chromakeyvideo/app/src/main/res/layout/activity_video.xml similarity index 100% rename from chromakeyvideo/app/src/main/res/layout/activity_video.xml rename to samples/chromakeyvideo/app/src/main/res/layout/activity_video.xml diff --git a/chromakeyvideo/app/src/main/res/raw/lion_chroma.mp4 b/samples/chromakeyvideo/app/src/main/res/raw/lion_chroma.mp4 similarity index 100% rename from chromakeyvideo/app/src/main/res/raw/lion_chroma.mp4 rename to samples/chromakeyvideo/app/src/main/res/raw/lion_chroma.mp4 diff --git a/hellosceneform/app/src/main/res/values/strings.xml b/samples/chromakeyvideo/app/src/main/res/values/strings.xml similarity index 92% rename from hellosceneform/app/src/main/res/values/strings.xml rename to samples/chromakeyvideo/app/src/main/res/values/strings.xml index 03ae9c17..8fad842c 100644 --- a/hellosceneform/app/src/main/res/values/strings.xml +++ b/samples/chromakeyvideo/app/src/main/res/values/strings.xml @@ -15,5 +15,5 @@ limitations under the License. --> - Hello Sceneform + ChromaKey Video diff --git a/chromakeyvideo/app/src/main/res/values/styles.xml b/samples/chromakeyvideo/app/src/main/res/values/styles.xml similarity index 100% rename from chromakeyvideo/app/src/main/res/values/styles.xml rename to samples/chromakeyvideo/app/src/main/res/values/styles.xml diff --git a/solarsystem/build.gradle b/samples/chromakeyvideo/build.gradle similarity index 90% rename from solarsystem/build.gradle rename to samples/chromakeyvideo/build.gradle index d629aaad..4f99af89 100644 --- a/solarsystem/build.gradle +++ b/samples/chromakeyvideo/build.gradle @@ -22,8 +22,8 @@ buildscript { mavenLocal() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' - classpath 'com.google.ar.sceneform:plugin:1.4.0' + classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.google.ar.sceneform:plugin:1.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/chromakeyvideo/gradle.properties b/samples/chromakeyvideo/gradle.properties similarity index 100% rename from chromakeyvideo/gradle.properties rename to samples/chromakeyvideo/gradle.properties diff --git a/chromakeyvideo/gradle/wrapper/gradle-wrapper.jar b/samples/chromakeyvideo/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from chromakeyvideo/gradle/wrapper/gradle-wrapper.jar rename to samples/chromakeyvideo/gradle/wrapper/gradle-wrapper.jar diff --git a/chromakeyvideo/gradle/wrapper/gradle-wrapper.properties b/samples/chromakeyvideo/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from chromakeyvideo/gradle/wrapper/gradle-wrapper.properties rename to samples/chromakeyvideo/gradle/wrapper/gradle-wrapper.properties diff --git a/chromakeyvideo/gradlew b/samples/chromakeyvideo/gradlew similarity index 100% rename from chromakeyvideo/gradlew rename to samples/chromakeyvideo/gradlew diff --git a/chromakeyvideo/gradlew.bat b/samples/chromakeyvideo/gradlew.bat similarity index 100% rename from chromakeyvideo/gradlew.bat rename to samples/chromakeyvideo/gradlew.bat diff --git a/samples/chromakeyvideo/settings.gradle b/samples/chromakeyvideo/settings.gradle new file mode 100644 index 00000000..c81913ae --- /dev/null +++ b/samples/chromakeyvideo/settings.gradle @@ -0,0 +1,5 @@ +include ':app' + +// Uncomment to include the source version of the ux package in your project. +//include ':sceneformux' +//project(':sceneformux').projectDir=new File('../../sceneformux/ux') diff --git a/hellosceneform/.gitignore b/samples/hellosceneform/.gitignore similarity index 100% rename from hellosceneform/.gitignore rename to samples/hellosceneform/.gitignore diff --git a/hellosceneform/app/.gitignore b/samples/hellosceneform/app/.gitignore similarity index 100% rename from hellosceneform/app/.gitignore rename to samples/hellosceneform/app/.gitignore diff --git a/samples/hellosceneform/app/build.gradle b/samples/hellosceneform/app/build.gradle new file mode 100644 index 00000000..71d45f1d --- /dev/null +++ b/samples/hellosceneform/app/build.gradle @@ -0,0 +1,80 @@ +/* + * Copyright 2018 Google LLC + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 27 + defaultConfig { + applicationId "com.google.ar.sceneform.samples.hellosceneform" + + // AR Optional apps must declare minSdkVersion >= 14. + // AR Required apps must declare minSdkVersion >= 24. + minSdkVersion 24 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + ndk { + /* + * Sceneform is available for the following ABIs: + * 'arm64-v8a', 'armeabi-v7a', 'x86_64' and 'x86'. + * Your application should include the ABIs most appropriate to + * minimize APK size. Listing 'arm64-v8a' is recommended. + * + * This sample app includes two ABIs: + * 1. 'arm64-v8a' to run on devices + * 2. 'x86' to run in the Android emulator + */ + abiFilters 'arm64-v8a', 'x86' + } + } + // Sceneform libraries use language constructs from Java 8. + // Add these compile options if targeting minSdkVersion < 26. + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + lintOptions { + abortOnError false + } +} + +dependencies { + + // Provides ArFragment, and other Sceneform UX resources: + implementation "com.google.ar.sceneform.ux:sceneform-ux:1.5.0" + + // Use the Sceneform Ux Package built from the source files included in the sceneformux folder. + //api project(":sceneformux") + + // Alternatively, use ArSceneView without the UX dependency. + //implementation "com.google.ar.sceneform:core:1.5.0" + + implementation "com.android.support:appcompat-v7:27.1.1" +} + +apply plugin: 'com.google.ar.sceneform.plugin' + +sceneform.asset('sampledata/models/andy.obj', + 'default', + 'sampledata/models/andy.sfa', + 'src/main/res/raw/andy') + diff --git a/hellosceneform/app/proguard-rules.pro b/samples/hellosceneform/app/proguard-rules.pro similarity index 100% rename from hellosceneform/app/proguard-rules.pro rename to samples/hellosceneform/app/proguard-rules.pro diff --git a/hellosceneform/app/sampledata/models/andy.mtl b/samples/hellosceneform/app/sampledata/models/andy.mtl similarity index 100% rename from hellosceneform/app/sampledata/models/andy.mtl rename to samples/hellosceneform/app/sampledata/models/andy.mtl diff --git a/hellosceneform/app/sampledata/models/andy.obj b/samples/hellosceneform/app/sampledata/models/andy.obj similarity index 100% rename from hellosceneform/app/sampledata/models/andy.obj rename to samples/hellosceneform/app/sampledata/models/andy.obj diff --git a/hellosceneform/app/sampledata/models/andy.png b/samples/hellosceneform/app/sampledata/models/andy.png similarity index 100% rename from hellosceneform/app/sampledata/models/andy.png rename to samples/hellosceneform/app/sampledata/models/andy.png diff --git a/hellosceneform/app/sampledata/models/andy.sfa b/samples/hellosceneform/app/sampledata/models/andy.sfa similarity index 100% rename from hellosceneform/app/sampledata/models/andy.sfa rename to samples/hellosceneform/app/sampledata/models/andy.sfa diff --git a/hellosceneform/app/src/main/AndroidManifest.xml b/samples/hellosceneform/app/src/main/AndroidManifest.xml similarity index 100% rename from hellosceneform/app/src/main/AndroidManifest.xml rename to samples/hellosceneform/app/src/main/AndroidManifest.xml diff --git a/hellosceneform/app/src/main/java/com/google/ar/sceneform/samples/hellosceneform/HelloSceneformActivity.java b/samples/hellosceneform/app/src/main/java/com/google/ar/sceneform/samples/hellosceneform/HelloSceneformActivity.java similarity index 100% rename from hellosceneform/app/src/main/java/com/google/ar/sceneform/samples/hellosceneform/HelloSceneformActivity.java rename to samples/hellosceneform/app/src/main/java/com/google/ar/sceneform/samples/hellosceneform/HelloSceneformActivity.java diff --git a/hellosceneform/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/samples/hellosceneform/app/src/main/res/drawable-xxhdpi/ic_launcher.png similarity index 100% rename from hellosceneform/app/src/main/res/drawable-xxhdpi/ic_launcher.png rename to samples/hellosceneform/app/src/main/res/drawable-xxhdpi/ic_launcher.png diff --git a/hellosceneform/app/src/main/res/layout/activity_ux.xml b/samples/hellosceneform/app/src/main/res/layout/activity_ux.xml similarity index 100% rename from hellosceneform/app/src/main/res/layout/activity_ux.xml rename to samples/hellosceneform/app/src/main/res/layout/activity_ux.xml diff --git a/chromakeyvideo/app/src/main/res/values/strings.xml b/samples/hellosceneform/app/src/main/res/values/strings.xml similarity index 92% rename from chromakeyvideo/app/src/main/res/values/strings.xml rename to samples/hellosceneform/app/src/main/res/values/strings.xml index 4c7afe3a..84ac7087 100644 --- a/chromakeyvideo/app/src/main/res/values/strings.xml +++ b/samples/hellosceneform/app/src/main/res/values/strings.xml @@ -15,5 +15,5 @@ limitations under the License. --> - Chroma Key Video + HelloSceneform diff --git a/hellosceneform/app/src/main/res/values/styles.xml b/samples/hellosceneform/app/src/main/res/values/styles.xml similarity index 100% rename from hellosceneform/app/src/main/res/values/styles.xml rename to samples/hellosceneform/app/src/main/res/values/styles.xml diff --git a/augmentedimage/build.gradle b/samples/hellosceneform/build.gradle similarity index 90% rename from augmentedimage/build.gradle rename to samples/hellosceneform/build.gradle index d629aaad..4f99af89 100644 --- a/augmentedimage/build.gradle +++ b/samples/hellosceneform/build.gradle @@ -22,8 +22,8 @@ buildscript { mavenLocal() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' - classpath 'com.google.ar.sceneform:plugin:1.4.0' + classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.google.ar.sceneform:plugin:1.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/hellosceneform/gradle.properties b/samples/hellosceneform/gradle.properties similarity index 100% rename from hellosceneform/gradle.properties rename to samples/hellosceneform/gradle.properties diff --git a/hellosceneform/gradle/wrapper/gradle-wrapper.jar b/samples/hellosceneform/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from hellosceneform/gradle/wrapper/gradle-wrapper.jar rename to samples/hellosceneform/gradle/wrapper/gradle-wrapper.jar diff --git a/hellosceneform/gradle/wrapper/gradle-wrapper.properties b/samples/hellosceneform/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from hellosceneform/gradle/wrapper/gradle-wrapper.properties rename to samples/hellosceneform/gradle/wrapper/gradle-wrapper.properties diff --git a/hellosceneform/gradlew b/samples/hellosceneform/gradlew similarity index 100% rename from hellosceneform/gradlew rename to samples/hellosceneform/gradlew diff --git a/hellosceneform/gradlew.bat b/samples/hellosceneform/gradlew.bat similarity index 100% rename from hellosceneform/gradlew.bat rename to samples/hellosceneform/gradlew.bat diff --git a/samples/hellosceneform/settings.gradle b/samples/hellosceneform/settings.gradle new file mode 100644 index 00000000..c81913ae --- /dev/null +++ b/samples/hellosceneform/settings.gradle @@ -0,0 +1,5 @@ +include ':app' + +// Uncomment to include the source version of the ux package in your project. +//include ':sceneformux' +//project(':sceneformux').projectDir=new File('../../sceneformux/ux') diff --git a/solarsystem/.gitignore b/samples/solarsystem/.gitignore similarity index 100% rename from solarsystem/.gitignore rename to samples/solarsystem/.gitignore diff --git a/solarsystem/app/.gitignore b/samples/solarsystem/app/.gitignore similarity index 100% rename from solarsystem/app/.gitignore rename to samples/solarsystem/app/.gitignore diff --git a/solarsystem/app/build.gradle b/samples/solarsystem/app/build.gradle similarity index 97% rename from solarsystem/app/build.gradle rename to samples/solarsystem/app/build.gradle index dbc52249..fe08d320 100644 --- a/solarsystem/app/build.gradle +++ b/samples/solarsystem/app/build.gradle @@ -26,7 +26,7 @@ android { versionName "1.0" ndk { /* - * Sceneform is available for the following ABIs: arm64-v8a, armv7a, + * Sceneform is available for the following ABIs: arm64-v8a, armeabi-v7a, * x86_64 and x86. This sample app enables arm64-v8a to run on * devices and x86 to run on the emulator. Your application should * list the ABIs most appropriate to minimize APK size (arm64-v8a recommended). @@ -51,7 +51,7 @@ android { } dependencies { - implementation "com.google.ar.sceneform:core:1.4.0" + implementation "com.google.ar.sceneform:core:1.5.0" implementation "com.android.support:appcompat-v7:27.1.1" implementation "com.android.support:design:27.1.1" } diff --git a/solarsystem/app/proguard-rules.pro b/samples/solarsystem/app/proguard-rules.pro similarity index 100% rename from solarsystem/app/proguard-rules.pro rename to samples/solarsystem/app/proguard-rules.pro diff --git a/solarsystem/app/sampledata/models/Earth/Earth.bin b/samples/solarsystem/app/sampledata/models/Earth/Earth.bin similarity index 100% rename from solarsystem/app/sampledata/models/Earth/Earth.bin rename to samples/solarsystem/app/sampledata/models/Earth/Earth.bin diff --git a/solarsystem/app/sampledata/models/Earth/Earth.gltf b/samples/solarsystem/app/sampledata/models/Earth/Earth.gltf similarity index 100% rename from solarsystem/app/sampledata/models/Earth/Earth.gltf rename to samples/solarsystem/app/sampledata/models/Earth/Earth.gltf diff --git a/samples/solarsystem/app/sampledata/models/Earth/Earth.sfa b/samples/solarsystem/app/sampledata/models/Earth/Earth.sfa new file mode 100644 index 00000000..a05827ed --- /dev/null +++ b/samples/solarsystem/app/sampledata/models/Earth/Earth.sfa @@ -0,0 +1,179 @@ +{ + materials: [ + { + name: 'Earth_Clouds_mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Earth_Clouds_mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 1, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + { + name: 'Earth_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Earth_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: 'Earth_Mat_normal', + }, + { + metallicFactor: 1, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: 'Earth_Mat_occlusionRoughnessMetallic', + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + ], + model: { + attributes: [ + 'Position', + 'TexCoord', + 'Orientation', + ], + collision: {}, + file: 'sampledata/models/Earth/Earth.gltf', + name: 'Earth', + recenter: true, + scale: 0.5, + }, + samplers: [ + { + file: 'sampledata/models/Earth/Earth_Mat_occlusionRoughnessMetallic.png', + name: 'Earth_Mat_occlusionRoughnessMetallic', + params: { + usage_type: 'Data', + }, + pipeline_name: 'Earth_Mat_occlusionRoughnessMetallic.png', + }, + { + file: 'sampledata/models/Earth/Earth_Mat_normal.png', + name: 'Earth_Mat_normal', + params: { + usage_type: 'Normal', + }, + pipeline_name: 'Earth_Mat_normal.png', + }, + { + file: 'sampledata/models/Earth/Earth_Mat_baseColor.png', + name: 'Earth_Mat_baseColor', + pipeline_name: 'Earth_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Earth/Earth_Clouds_mat_baseColor.png', + name: 'Earth_Clouds_mat_baseColor', + pipeline_name: 'Earth_Clouds_mat_baseColor.png', + }, + ], + version: '0.51:1', +} diff --git a/solarsystem/app/sampledata/models/Earth/Earth_Clouds_mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Earth/Earth_Clouds_mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Earth/Earth_Clouds_mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Earth/Earth_Clouds_mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Earth/Earth_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Earth/Earth_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Earth/Earth_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Earth/Earth_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Earth/Earth_Mat_normal.png b/samples/solarsystem/app/sampledata/models/Earth/Earth_Mat_normal.png similarity index 100% rename from solarsystem/app/sampledata/models/Earth/Earth_Mat_normal.png rename to samples/solarsystem/app/sampledata/models/Earth/Earth_Mat_normal.png diff --git a/solarsystem/app/sampledata/models/Earth/Earth_Mat_occlusionRoughnessMetallic.png b/samples/solarsystem/app/sampledata/models/Earth/Earth_Mat_occlusionRoughnessMetallic.png similarity index 100% rename from solarsystem/app/sampledata/models/Earth/Earth_Mat_occlusionRoughnessMetallic.png rename to samples/solarsystem/app/sampledata/models/Earth/Earth_Mat_occlusionRoughnessMetallic.png diff --git a/solarsystem/app/sampledata/models/Jupiter/Jupiter.bin b/samples/solarsystem/app/sampledata/models/Jupiter/Jupiter.bin similarity index 100% rename from solarsystem/app/sampledata/models/Jupiter/Jupiter.bin rename to samples/solarsystem/app/sampledata/models/Jupiter/Jupiter.bin diff --git a/solarsystem/app/sampledata/models/Jupiter/Jupiter.gltf b/samples/solarsystem/app/sampledata/models/Jupiter/Jupiter.gltf similarity index 100% rename from solarsystem/app/sampledata/models/Jupiter/Jupiter.gltf rename to samples/solarsystem/app/sampledata/models/Jupiter/Jupiter.gltf diff --git a/samples/solarsystem/app/sampledata/models/Jupiter/Jupiter.sfa b/samples/solarsystem/app/sampledata/models/Jupiter/Jupiter.sfa new file mode 100644 index 00000000..8d754575 --- /dev/null +++ b/samples/solarsystem/app/sampledata/models/Jupiter/Jupiter.sfa @@ -0,0 +1,163 @@ +{ + materials: [ + { + name: 'Jupiter_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Jupiter_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 0, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + { + name: 'JupiterClouds_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'JupiterClouds_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 0, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + ], + model: { + attributes: [ + 'Position', + 'TexCoord', + 'Orientation', + ], + collision: {}, + file: 'sampledata/models/Jupiter/Jupiter.gltf', + name: 'Jupiter', + recenter: true, + scale: 0.5, + }, + samplers: [ + { + file: 'sampledata/models/Jupiter/JupiterClouds_Mat_baseColor.png', + name: 'JupiterClouds_Mat_baseColor', + pipeline_name: 'JupiterClouds_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Jupiter/Jupiter_Mat_baseColor.png', + name: 'Jupiter_Mat_baseColor', + pipeline_name: 'Jupiter_Mat_baseColor.png', + }, + ], + version: '0.51:1', +} diff --git a/solarsystem/app/sampledata/models/Jupiter/JupiterClouds_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Jupiter/JupiterClouds_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Jupiter/JupiterClouds_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Jupiter/JupiterClouds_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Jupiter/Jupiter_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Jupiter/Jupiter_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Jupiter/Jupiter_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Jupiter/Jupiter_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Luna/Luna.bin b/samples/solarsystem/app/sampledata/models/Luna/Luna.bin similarity index 100% rename from solarsystem/app/sampledata/models/Luna/Luna.bin rename to samples/solarsystem/app/sampledata/models/Luna/Luna.bin diff --git a/solarsystem/app/sampledata/models/Luna/Luna.gltf b/samples/solarsystem/app/sampledata/models/Luna/Luna.gltf similarity index 100% rename from solarsystem/app/sampledata/models/Luna/Luna.gltf rename to samples/solarsystem/app/sampledata/models/Luna/Luna.gltf diff --git a/samples/solarsystem/app/sampledata/models/Luna/Luna.sfa b/samples/solarsystem/app/sampledata/models/Luna/Luna.sfa new file mode 100644 index 00000000..2876383c --- /dev/null +++ b/samples/solarsystem/app/sampledata/models/Luna/Luna.sfa @@ -0,0 +1,107 @@ +{ + materials: [ + { + name: 'Luna_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Luna_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: 'Luna_Mat_normal', + }, + { + metallicFactor: 1, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: 'Luna_Mat_occlusionRoughnessMetallic', + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + ], + model: { + attributes: [ + 'Position', + 'TexCoord', + 'Orientation', + ], + collision: {}, + file: 'sampledata/models/Luna/Luna.gltf', + name: 'Luna', + recenter: true, + scale: 0.5, + }, + samplers: [ + { + file: 'sampledata/models/Luna/Luna_Mat_baseColor.png', + name: 'Luna_Mat_baseColor', + pipeline_name: 'Luna_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Luna/Luna_Mat_occlusionRoughnessMetallic.png', + name: 'Luna_Mat_occlusionRoughnessMetallic', + params: { + usage_type: 'Data', + }, + pipeline_name: 'Luna_Mat_occlusionRoughnessMetallic.png', + }, + { + file: 'sampledata/models/Luna/Luna_Mat_normal.png', + name: 'Luna_Mat_normal', + params: { + usage_type: 'Normal', + }, + pipeline_name: 'Luna_Mat_normal.png', + }, + ], + version: '0.51:1', +} diff --git a/solarsystem/app/sampledata/models/Luna/Luna_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Luna/Luna_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Luna/Luna_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Luna/Luna_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Luna/Luna_Mat_normal.png b/samples/solarsystem/app/sampledata/models/Luna/Luna_Mat_normal.png similarity index 100% rename from solarsystem/app/sampledata/models/Luna/Luna_Mat_normal.png rename to samples/solarsystem/app/sampledata/models/Luna/Luna_Mat_normal.png diff --git a/solarsystem/app/sampledata/models/Luna/Luna_Mat_occlusionRoughnessMetallic.png b/samples/solarsystem/app/sampledata/models/Luna/Luna_Mat_occlusionRoughnessMetallic.png similarity index 100% rename from solarsystem/app/sampledata/models/Luna/Luna_Mat_occlusionRoughnessMetallic.png rename to samples/solarsystem/app/sampledata/models/Luna/Luna_Mat_occlusionRoughnessMetallic.png diff --git a/solarsystem/app/sampledata/models/Mars/Mars.bin b/samples/solarsystem/app/sampledata/models/Mars/Mars.bin similarity index 100% rename from solarsystem/app/sampledata/models/Mars/Mars.bin rename to samples/solarsystem/app/sampledata/models/Mars/Mars.bin diff --git a/solarsystem/app/sampledata/models/Mars/Mars.gltf b/samples/solarsystem/app/sampledata/models/Mars/Mars.gltf similarity index 100% rename from solarsystem/app/sampledata/models/Mars/Mars.gltf rename to samples/solarsystem/app/sampledata/models/Mars/Mars.gltf diff --git a/samples/solarsystem/app/sampledata/models/Mars/Mars.sfa b/samples/solarsystem/app/sampledata/models/Mars/Mars.sfa new file mode 100644 index 00000000..8a150e44 --- /dev/null +++ b/samples/solarsystem/app/sampledata/models/Mars/Mars.sfa @@ -0,0 +1,173 @@ +{ + materials: [ + { + name: 'Mars_Atmosphere_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Mars_Atmosphere_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 1, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + { + name: 'Mars_mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Mars_mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: 'Mars_mat_normal', + }, + { + metallicFactor: 0.33000000000000002, + }, + { + roughnessFactor: 0.85999999999999999, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + ], + model: { + attributes: [ + 'Position', + 'TexCoord', + 'Orientation', + ], + collision: { + skin_width: 0.75, + }, + file: 'sampledata/models/Mars/Mars.gltf', + name: 'Mars', + recenter: true, + scale: 0.5, + }, + samplers: [ + { + file: 'sampledata/models/Mars/Mars_mat_baseColor.png', + name: 'Mars_mat_baseColor', + pipeline_name: 'Mars_mat_baseColor.png', + }, + { + file: 'sampledata/models/Mars/Mars_mat_normal.png', + name: 'Mars_mat_normal', + params: { + usage_type: 'Normal', + }, + pipeline_name: 'Mars_mat_normal.png', + }, + { + file: 'sampledata/models/Mars/Mars_Atmosphere_Mat_baseColor.png', + name: 'Mars_Atmosphere_Mat_baseColor', + pipeline_name: 'Mars_Atmosphere_Mat_baseColor.png', + }, + ], + version: '0.51:1', +} diff --git a/solarsystem/app/sampledata/models/Mars/Mars_Atmosphere_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Mars/Mars_Atmosphere_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Mars/Mars_Atmosphere_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Mars/Mars_Atmosphere_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Mars/Mars_mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Mars/Mars_mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Mars/Mars_mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Mars/Mars_mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Mars/Mars_mat_normal.png b/samples/solarsystem/app/sampledata/models/Mars/Mars_mat_normal.png similarity index 100% rename from solarsystem/app/sampledata/models/Mars/Mars_mat_normal.png rename to samples/solarsystem/app/sampledata/models/Mars/Mars_mat_normal.png diff --git a/solarsystem/app/sampledata/models/Mercury/Mercury.bin b/samples/solarsystem/app/sampledata/models/Mercury/Mercury.bin similarity index 100% rename from solarsystem/app/sampledata/models/Mercury/Mercury.bin rename to samples/solarsystem/app/sampledata/models/Mercury/Mercury.bin diff --git a/solarsystem/app/sampledata/models/Mercury/Mercury.gltf b/samples/solarsystem/app/sampledata/models/Mercury/Mercury.gltf similarity index 100% rename from solarsystem/app/sampledata/models/Mercury/Mercury.gltf rename to samples/solarsystem/app/sampledata/models/Mercury/Mercury.gltf diff --git a/samples/solarsystem/app/sampledata/models/Mercury/Mercury.sfa b/samples/solarsystem/app/sampledata/models/Mercury/Mercury.sfa new file mode 100644 index 00000000..b3e71bc7 --- /dev/null +++ b/samples/solarsystem/app/sampledata/models/Mercury/Mercury.sfa @@ -0,0 +1,109 @@ +{ + materials: [ + { + name: 'Mercury_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Mercury_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: 'Mercury_Mat_normal', + }, + { + metallicFactor: 1, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: 'Mercury_Mat_occlusionRoughnessMetallic', + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + ], + model: { + attributes: [ + 'Position', + 'TexCoord', + 'Orientation', + ], + collision: { + skin_width: 0.75, + }, + file: 'sampledata/models/Mercury/Mercury.gltf', + name: 'Mercury', + recenter: true, + scale: 0.5, + }, + samplers: [ + { + file: 'sampledata/models/Mercury/Mercury_Mat_baseColor.png', + name: 'Mercury_Mat_baseColor', + pipeline_name: 'Mercury_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Mercury/Mercury_Mat_occlusionRoughnessMetallic.png', + name: 'Mercury_Mat_occlusionRoughnessMetallic', + params: { + usage_type: 'Data', + }, + pipeline_name: 'Mercury_Mat_occlusionRoughnessMetallic.png', + }, + { + file: 'sampledata/models/Mercury/Mercury_Mat_normal.png', + name: 'Mercury_Mat_normal', + params: { + usage_type: 'Normal', + }, + pipeline_name: 'Mercury_Mat_normal.png', + }, + ], + version: '0.51:1', +} diff --git a/solarsystem/app/sampledata/models/Mercury/Mercury_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Mercury/Mercury_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Mercury/Mercury_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Mercury/Mercury_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Mercury/Mercury_Mat_normal.png b/samples/solarsystem/app/sampledata/models/Mercury/Mercury_Mat_normal.png similarity index 100% rename from solarsystem/app/sampledata/models/Mercury/Mercury_Mat_normal.png rename to samples/solarsystem/app/sampledata/models/Mercury/Mercury_Mat_normal.png diff --git a/solarsystem/app/sampledata/models/Mercury/Mercury_Mat_occlusionRoughnessMetallic.png b/samples/solarsystem/app/sampledata/models/Mercury/Mercury_Mat_occlusionRoughnessMetallic.png similarity index 100% rename from solarsystem/app/sampledata/models/Mercury/Mercury_Mat_occlusionRoughnessMetallic.png rename to samples/solarsystem/app/sampledata/models/Mercury/Mercury_Mat_occlusionRoughnessMetallic.png diff --git a/solarsystem/app/sampledata/models/Neptune/Neptune.bin b/samples/solarsystem/app/sampledata/models/Neptune/Neptune.bin similarity index 100% rename from solarsystem/app/sampledata/models/Neptune/Neptune.bin rename to samples/solarsystem/app/sampledata/models/Neptune/Neptune.bin diff --git a/solarsystem/app/sampledata/models/Neptune/Neptune.gltf b/samples/solarsystem/app/sampledata/models/Neptune/Neptune.gltf similarity index 100% rename from solarsystem/app/sampledata/models/Neptune/Neptune.gltf rename to samples/solarsystem/app/sampledata/models/Neptune/Neptune.gltf diff --git a/samples/solarsystem/app/sampledata/models/Neptune/Neptune.sfa b/samples/solarsystem/app/sampledata/models/Neptune/Neptune.sfa new file mode 100644 index 00000000..2b2f10e9 --- /dev/null +++ b/samples/solarsystem/app/sampledata/models/Neptune/Neptune.sfa @@ -0,0 +1,163 @@ +{ + materials: [ + { + name: 'NeptuneGlobe_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'NeptuneGlobe_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 0, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + { + name: 'Neptune_Clouds_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Neptune_Clouds_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 1, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + ], + model: { + attributes: [ + 'Position', + 'TexCoord', + 'Orientation', + ], + collision: {}, + file: 'sampledata/models/Neptune/Neptune.gltf', + name: 'Neptune', + recenter: true, + scale: 0.5, + }, + samplers: [ + { + file: 'sampledata/models/Neptune/Neptune_Clouds_Mat_baseColor.png', + name: 'Neptune_Clouds_Mat_baseColor', + pipeline_name: 'Neptune_Clouds_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Neptune/NeptuneGlobe_Mat_baseColor.png', + name: 'NeptuneGlobe_Mat_baseColor', + pipeline_name: 'NeptuneGlobe_Mat_baseColor.png', + }, + ], + version: '0.51:1', +} diff --git a/solarsystem/app/sampledata/models/Neptune/NeptuneGlobe_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Neptune/NeptuneGlobe_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Neptune/NeptuneGlobe_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Neptune/NeptuneGlobe_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Neptune/Neptune_Clouds_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Neptune/Neptune_Clouds_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Neptune/Neptune_Clouds_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Neptune/Neptune_Clouds_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Saturn/Saturn.bin b/samples/solarsystem/app/sampledata/models/Saturn/Saturn.bin similarity index 100% rename from solarsystem/app/sampledata/models/Saturn/Saturn.bin rename to samples/solarsystem/app/sampledata/models/Saturn/Saturn.bin diff --git a/solarsystem/app/sampledata/models/Saturn/Saturn.gltf b/samples/solarsystem/app/sampledata/models/Saturn/Saturn.gltf similarity index 100% rename from solarsystem/app/sampledata/models/Saturn/Saturn.gltf rename to samples/solarsystem/app/sampledata/models/Saturn/Saturn.gltf diff --git a/samples/solarsystem/app/sampledata/models/Saturn/Saturn.sfa b/samples/solarsystem/app/sampledata/models/Saturn/Saturn.sfa new file mode 100644 index 00000000..66c18786 --- /dev/null +++ b/samples/solarsystem/app/sampledata/models/Saturn/Saturn.sfa @@ -0,0 +1,243 @@ +{ + materials: [ + { + name: 'SaturnPlanet_Opaque_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'SaturnPlanet_Opaque_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 0, + }, + { + roughnessFactor: 0.66000000000000003, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + { + name: 'Saturn_Clouds_mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Saturn_Clouds_mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 1, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + { + name: 'SaturnRings_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'SaturnRings_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 1, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: 'SaturnRings_Mat_occlusionRoughnessMetallic', + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + ], + model: { + attributes: [ + 'Position', + 'TexCoord', + 'Orientation', + ], + collision: {}, + file: 'sampledata/models/Saturn/Saturn.gltf', + name: 'Saturn', + recenter: true, + scale: 0.5, + }, + samplers: [ + { + file: 'sampledata/models/Saturn/SaturnRings_Mat_occlusionRoughnessMetallic.png', + name: 'SaturnRings_Mat_occlusionRoughnessMetallic', + params: { + usage_type: 'Data', + }, + pipeline_name: 'SaturnRings_Mat_occlusionRoughnessMetallic.png', + }, + { + file: 'sampledata/models/Saturn/SaturnRings_Mat_baseColor.png', + name: 'SaturnRings_Mat_baseColor', + pipeline_name: 'SaturnRings_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Saturn/Saturn_Clouds_mat_baseColor.png', + name: 'Saturn_Clouds_mat_baseColor', + pipeline_name: 'Saturn_Clouds_mat_baseColor.png', + }, + { + file: 'sampledata/models/Saturn/SaturnPlanet_Opaque_Mat_baseColor.png', + name: 'SaturnPlanet_Opaque_Mat_baseColor', + pipeline_name: 'SaturnPlanet_Opaque_Mat_baseColor.png', + }, + ], + version: '0.51:1', +} diff --git a/solarsystem/app/sampledata/models/Saturn/SaturnPlanet_Opaque_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Saturn/SaturnPlanet_Opaque_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Saturn/SaturnPlanet_Opaque_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Saturn/SaturnPlanet_Opaque_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Saturn/SaturnRings_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Saturn/SaturnRings_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Saturn/SaturnRings_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Saturn/SaturnRings_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Saturn/SaturnRings_Mat_occlusionRoughnessMetallic.png b/samples/solarsystem/app/sampledata/models/Saturn/SaturnRings_Mat_occlusionRoughnessMetallic.png similarity index 100% rename from solarsystem/app/sampledata/models/Saturn/SaturnRings_Mat_occlusionRoughnessMetallic.png rename to samples/solarsystem/app/sampledata/models/Saturn/SaturnRings_Mat_occlusionRoughnessMetallic.png diff --git a/solarsystem/app/sampledata/models/Saturn/Saturn_Clouds_mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Saturn/Saturn_Clouds_mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Saturn/Saturn_Clouds_mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Saturn/Saturn_Clouds_mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Sol/Sol.bin b/samples/solarsystem/app/sampledata/models/Sol/Sol.bin similarity index 100% rename from solarsystem/app/sampledata/models/Sol/Sol.bin rename to samples/solarsystem/app/sampledata/models/Sol/Sol.bin diff --git a/solarsystem/app/sampledata/models/Sol/Sol.gltf b/samples/solarsystem/app/sampledata/models/Sol/Sol.gltf similarity index 100% rename from solarsystem/app/sampledata/models/Sol/Sol.gltf rename to samples/solarsystem/app/sampledata/models/Sol/Sol.gltf diff --git a/samples/solarsystem/app/sampledata/models/Sol/Sol.sfa b/samples/solarsystem/app/sampledata/models/Sol/Sol.sfa new file mode 100644 index 00000000..096d9231 --- /dev/null +++ b/samples/solarsystem/app/sampledata/models/Sol/Sol.sfa @@ -0,0 +1,250 @@ +{ + materials: [ + { + name: 'Sol_Opaque_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Sol_Opaque_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 0, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + emissive: 'Sol_Opaque_Mat_emissive', + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + { + name: 'SolarFlare_Transparent_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'SolarFlare_Transparent_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 0, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + emissive: 'SolarFlare_Transparent_Mat_emissive', + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + { + name: 'Sol_Transparent_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Sol_Transparent_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 0, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + emissive: 'Sol_Transparent_Mat_emissive', + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + ], + model: { + attributes: [ + 'Position', + 'TexCoord', + 'Orientation', + ], + collision: {}, + file: 'sampledata/models/Sol/Sol.gltf', + name: 'Sol', + recenter: true, + scale: 0.5, + }, + samplers: [ + { + file: 'sampledata/models/Sol/Sol_Transparent_Mat_baseColor.png', + name: 'Sol_Transparent_Mat_baseColor', + pipeline_name: 'Sol_Transparent_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Sol/SolarFlare_Transparent_Mat_baseColor.png', + name: 'SolarFlare_Transparent_Mat_baseColor', + pipeline_name: 'SolarFlare_Transparent_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Sol/SolarFlare_Transparent_Mat_emissive.png', + name: 'SolarFlare_Transparent_Mat_emissive', + pipeline_name: 'SolarFlare_Transparent_Mat_emissive.png', + }, + { + file: 'sampledata/models/Sol/Sol_Opaque_Mat_baseColor.png', + name: 'Sol_Opaque_Mat_baseColor', + pipeline_name: 'Sol_Opaque_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Sol/Sol_Transparent_Mat_emissive.png', + name: 'Sol_Transparent_Mat_emissive', + pipeline_name: 'Sol_Transparent_Mat_emissive.png', + }, + { + file: 'sampledata/models/Sol/Sol_Opaque_Mat_emissive.png', + name: 'Sol_Opaque_Mat_emissive', + pipeline_name: 'Sol_Opaque_Mat_emissive.png', + }, + ], + version: '0.51:1', +} diff --git a/solarsystem/app/sampledata/models/Sol/Sol_Opaque_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Sol/Sol_Opaque_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Sol/Sol_Opaque_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Sol/Sol_Opaque_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Sol/Sol_Opaque_Mat_emissive.png b/samples/solarsystem/app/sampledata/models/Sol/Sol_Opaque_Mat_emissive.png similarity index 100% rename from solarsystem/app/sampledata/models/Sol/Sol_Opaque_Mat_emissive.png rename to samples/solarsystem/app/sampledata/models/Sol/Sol_Opaque_Mat_emissive.png diff --git a/solarsystem/app/sampledata/models/Sol/Sol_Transparent_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Sol/Sol_Transparent_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Sol/Sol_Transparent_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Sol/Sol_Transparent_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Sol/Sol_Transparent_Mat_emissive.png b/samples/solarsystem/app/sampledata/models/Sol/Sol_Transparent_Mat_emissive.png similarity index 100% rename from solarsystem/app/sampledata/models/Sol/Sol_Transparent_Mat_emissive.png rename to samples/solarsystem/app/sampledata/models/Sol/Sol_Transparent_Mat_emissive.png diff --git a/solarsystem/app/sampledata/models/Sol/SolarFlare_Transparent_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Sol/SolarFlare_Transparent_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Sol/SolarFlare_Transparent_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Sol/SolarFlare_Transparent_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Sol/SolarFlare_Transparent_Mat_emissive.png b/samples/solarsystem/app/sampledata/models/Sol/SolarFlare_Transparent_Mat_emissive.png similarity index 100% rename from solarsystem/app/sampledata/models/Sol/SolarFlare_Transparent_Mat_emissive.png rename to samples/solarsystem/app/sampledata/models/Sol/SolarFlare_Transparent_Mat_emissive.png diff --git a/solarsystem/app/sampledata/models/Uranus/Uranus.bin b/samples/solarsystem/app/sampledata/models/Uranus/Uranus.bin similarity index 100% rename from solarsystem/app/sampledata/models/Uranus/Uranus.bin rename to samples/solarsystem/app/sampledata/models/Uranus/Uranus.bin diff --git a/solarsystem/app/sampledata/models/Uranus/Uranus.gltf b/samples/solarsystem/app/sampledata/models/Uranus/Uranus.gltf similarity index 100% rename from solarsystem/app/sampledata/models/Uranus/Uranus.gltf rename to samples/solarsystem/app/sampledata/models/Uranus/Uranus.gltf diff --git a/samples/solarsystem/app/sampledata/models/Uranus/Uranus.sfa b/samples/solarsystem/app/sampledata/models/Uranus/Uranus.sfa new file mode 100644 index 00000000..0873e540 --- /dev/null +++ b/samples/solarsystem/app/sampledata/models/Uranus/Uranus.sfa @@ -0,0 +1,235 @@ +{ + materials: [ + { + name: 'UranusGlobe_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'UranusGlobe_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 0, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + { + name: 'UranusRings_Stingray_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'UranusRings_Stingray_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 0, + }, + { + roughnessFactor: 0.29999999999999999, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + { + name: 'Uranus_Clouds_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Uranus_Clouds_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 1, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + ], + model: { + attributes: [ + 'Position', + 'TexCoord', + 'Orientation', + ], + collision: {}, + file: 'sampledata/models/Uranus/Uranus.gltf', + name: 'Uranus', + recenter: true, + scale: 0.5, + }, + samplers: [ + { + file: 'sampledata/models/Uranus/Uranus_Clouds_Mat_baseColor.png', + name: 'Uranus_Clouds_Mat_baseColor', + pipeline_name: 'Uranus_Clouds_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Uranus/UranusRings_Stingray_Mat_baseColor.png', + name: 'UranusRings_Stingray_Mat_baseColor', + pipeline_name: 'UranusRings_Stingray_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Uranus/UranusGlobe_Mat_baseColor.png', + name: 'UranusGlobe_Mat_baseColor', + pipeline_name: 'UranusGlobe_Mat_baseColor.png', + }, + ], + version: '0.51:1', +} diff --git a/solarsystem/app/sampledata/models/Uranus/UranusGlobe_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Uranus/UranusGlobe_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Uranus/UranusGlobe_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Uranus/UranusGlobe_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Uranus/UranusRings_Stingray_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Uranus/UranusRings_Stingray_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Uranus/UranusRings_Stingray_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Uranus/UranusRings_Stingray_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Uranus/Uranus_Clouds_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Uranus/Uranus_Clouds_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Uranus/Uranus_Clouds_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Uranus/Uranus_Clouds_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Venus/Venus.bin b/samples/solarsystem/app/sampledata/models/Venus/Venus.bin similarity index 100% rename from solarsystem/app/sampledata/models/Venus/Venus.bin rename to samples/solarsystem/app/sampledata/models/Venus/Venus.bin diff --git a/solarsystem/app/sampledata/models/Venus/Venus.gltf b/samples/solarsystem/app/sampledata/models/Venus/Venus.gltf similarity index 100% rename from solarsystem/app/sampledata/models/Venus/Venus.gltf rename to samples/solarsystem/app/sampledata/models/Venus/Venus.gltf diff --git a/samples/solarsystem/app/sampledata/models/Venus/Venus.sfa b/samples/solarsystem/app/sampledata/models/Venus/Venus.sfa new file mode 100644 index 00000000..357edb26 --- /dev/null +++ b/samples/solarsystem/app/sampledata/models/Venus/Venus.sfa @@ -0,0 +1,179 @@ +{ + materials: [ + { + name: 'Venus_Atmosphere_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Venus_Atmosphere_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: null, + }, + { + metallicFactor: 1, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: 'Venus_Atmosphere_Mat_occlusionRoughnessMetallic', + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + { + name: 'Venus_Terrain_Mat', + parameters: [ + { + baseColorFactor: [ + 1, + 1, + 1, + 1, + ], + }, + { + baseColor: 'Venus_Terrain_Mat_baseColor', + }, + { + diffuseColorFactor: null, + }, + { + diffuseColor: null, + }, + { + normal: 'Venus_Terrain_Mat_normal', + }, + { + metallicFactor: 0, + }, + { + roughnessFactor: 1, + }, + { + specularFactor: null, + }, + { + glossinessFactor: null, + }, + { + specularGlossiness: null, + }, + { + specularGlossinessCalculation: null, + }, + { + metallicRoughness: null, + }, + { + occlusion: null, + }, + { + emissiveFactor: [ + 0, + 0, + 0, + 1, + ], + }, + { + emissive: null, + }, + { + reflectance: null, + }, + { + opacity: null, + }, + ], + source: 'build/sceneform_sdk/default_materials/gltf_material.sfm', + }, + ], + model: { + attributes: [ + 'Position', + 'TexCoord', + 'Orientation', + ], + collision: {}, + file: 'sampledata/models/Venus/Venus.gltf', + name: 'Venus', + recenter: true, + scale: 0.5, + }, + samplers: [ + { + file: 'sampledata/models/Venus/Venus_Terrain_Mat_baseColor.png', + name: 'Venus_Terrain_Mat_baseColor', + pipeline_name: 'Venus_Terrain_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Venus/Venus_Terrain_Mat_normal.png', + name: 'Venus_Terrain_Mat_normal', + params: { + usage_type: 'Normal', + }, + pipeline_name: 'Venus_Terrain_Mat_normal.png', + }, + { + file: 'sampledata/models/Venus/Venus_Atmosphere_Mat_baseColor.png', + name: 'Venus_Atmosphere_Mat_baseColor', + pipeline_name: 'Venus_Atmosphere_Mat_baseColor.png', + }, + { + file: 'sampledata/models/Venus/Venus_Atmosphere_Mat_occlusionRoughnessMetallic.png', + name: 'Venus_Atmosphere_Mat_occlusionRoughnessMetallic', + params: { + usage_type: 'Data', + }, + pipeline_name: 'Venus_Atmosphere_Mat_occlusionRoughnessMetallic.png', + }, + ], + version: '0.51:1', +} diff --git a/solarsystem/app/sampledata/models/Venus/Venus_Atmosphere_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Venus/Venus_Atmosphere_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Venus/Venus_Atmosphere_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Venus/Venus_Atmosphere_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Venus/Venus_Atmosphere_Mat_occlusionRoughnessMetallic.png b/samples/solarsystem/app/sampledata/models/Venus/Venus_Atmosphere_Mat_occlusionRoughnessMetallic.png similarity index 100% rename from solarsystem/app/sampledata/models/Venus/Venus_Atmosphere_Mat_occlusionRoughnessMetallic.png rename to samples/solarsystem/app/sampledata/models/Venus/Venus_Atmosphere_Mat_occlusionRoughnessMetallic.png diff --git a/solarsystem/app/sampledata/models/Venus/Venus_Terrain_Mat_baseColor.png b/samples/solarsystem/app/sampledata/models/Venus/Venus_Terrain_Mat_baseColor.png similarity index 100% rename from solarsystem/app/sampledata/models/Venus/Venus_Terrain_Mat_baseColor.png rename to samples/solarsystem/app/sampledata/models/Venus/Venus_Terrain_Mat_baseColor.png diff --git a/solarsystem/app/sampledata/models/Venus/Venus_Terrain_Mat_normal.png b/samples/solarsystem/app/sampledata/models/Venus/Venus_Terrain_Mat_normal.png similarity index 100% rename from solarsystem/app/sampledata/models/Venus/Venus_Terrain_Mat_normal.png rename to samples/solarsystem/app/sampledata/models/Venus/Venus_Terrain_Mat_normal.png diff --git a/solarsystem/app/src/main/AndroidManifest.xml b/samples/solarsystem/app/src/main/AndroidManifest.xml similarity index 100% rename from solarsystem/app/src/main/AndroidManifest.xml rename to samples/solarsystem/app/src/main/AndroidManifest.xml diff --git a/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/DemoUtils.java b/samples/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/DemoUtils.java similarity index 100% rename from solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/DemoUtils.java rename to samples/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/DemoUtils.java diff --git a/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/Planet.java b/samples/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/Planet.java similarity index 100% rename from solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/Planet.java rename to samples/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/Planet.java diff --git a/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/RotatingNode.java b/samples/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/RotatingNode.java similarity index 100% rename from solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/RotatingNode.java rename to samples/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/RotatingNode.java diff --git a/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/SolarActivity.java b/samples/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/SolarActivity.java similarity index 100% rename from solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/SolarActivity.java rename to samples/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/SolarActivity.java diff --git a/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/SolarSettings.java b/samples/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/SolarSettings.java similarity index 100% rename from solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/SolarSettings.java rename to samples/solarsystem/app/src/main/java/com/google/ar/sceneform/samples/solarsystem/SolarSettings.java diff --git a/solarsystem/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/samples/solarsystem/app/src/main/res/drawable-xxhdpi/ic_launcher.png similarity index 100% rename from solarsystem/app/src/main/res/drawable-xxhdpi/ic_launcher.png rename to samples/solarsystem/app/src/main/res/drawable-xxhdpi/ic_launcher.png diff --git a/solarsystem/app/src/main/res/drawable/rounded_bg.xml b/samples/solarsystem/app/src/main/res/drawable/rounded_bg.xml similarity index 100% rename from solarsystem/app/src/main/res/drawable/rounded_bg.xml rename to samples/solarsystem/app/src/main/res/drawable/rounded_bg.xml diff --git a/solarsystem/app/src/main/res/layout/activity_solar.xml b/samples/solarsystem/app/src/main/res/layout/activity_solar.xml similarity index 100% rename from solarsystem/app/src/main/res/layout/activity_solar.xml rename to samples/solarsystem/app/src/main/res/layout/activity_solar.xml diff --git a/solarsystem/app/src/main/res/layout/planet_card_view.xml b/samples/solarsystem/app/src/main/res/layout/planet_card_view.xml similarity index 100% rename from solarsystem/app/src/main/res/layout/planet_card_view.xml rename to samples/solarsystem/app/src/main/res/layout/planet_card_view.xml diff --git a/solarsystem/app/src/main/res/layout/solar_controls.xml b/samples/solarsystem/app/src/main/res/layout/solar_controls.xml similarity index 100% rename from solarsystem/app/src/main/res/layout/solar_controls.xml rename to samples/solarsystem/app/src/main/res/layout/solar_controls.xml diff --git a/solarsystem/app/src/main/res/values/color.xml b/samples/solarsystem/app/src/main/res/values/color.xml similarity index 100% rename from solarsystem/app/src/main/res/values/color.xml rename to samples/solarsystem/app/src/main/res/values/color.xml diff --git a/solarsystem/app/src/main/res/values/strings.xml b/samples/solarsystem/app/src/main/res/values/strings.xml similarity index 100% rename from solarsystem/app/src/main/res/values/strings.xml rename to samples/solarsystem/app/src/main/res/values/strings.xml diff --git a/solarsystem/app/src/main/res/values/styles.xml b/samples/solarsystem/app/src/main/res/values/styles.xml similarity index 100% rename from solarsystem/app/src/main/res/values/styles.xml rename to samples/solarsystem/app/src/main/res/values/styles.xml diff --git a/hellosceneform/build.gradle b/samples/solarsystem/build.gradle similarity index 90% rename from hellosceneform/build.gradle rename to samples/solarsystem/build.gradle index d629aaad..4f99af89 100644 --- a/hellosceneform/build.gradle +++ b/samples/solarsystem/build.gradle @@ -22,8 +22,8 @@ buildscript { mavenLocal() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' - classpath 'com.google.ar.sceneform:plugin:1.4.0' + classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.google.ar.sceneform:plugin:1.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/solarsystem/gradle.properties b/samples/solarsystem/gradle.properties similarity index 100% rename from solarsystem/gradle.properties rename to samples/solarsystem/gradle.properties diff --git a/solarsystem/gradle/wrapper/gradle-wrapper.jar b/samples/solarsystem/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from solarsystem/gradle/wrapper/gradle-wrapper.jar rename to samples/solarsystem/gradle/wrapper/gradle-wrapper.jar diff --git a/solarsystem/gradle/wrapper/gradle-wrapper.properties b/samples/solarsystem/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from solarsystem/gradle/wrapper/gradle-wrapper.properties rename to samples/solarsystem/gradle/wrapper/gradle-wrapper.properties diff --git a/solarsystem/gradlew b/samples/solarsystem/gradlew similarity index 100% rename from solarsystem/gradlew rename to samples/solarsystem/gradlew diff --git a/solarsystem/gradlew.bat b/samples/solarsystem/gradlew.bat similarity index 100% rename from solarsystem/gradlew.bat rename to samples/solarsystem/gradlew.bat diff --git a/samples/solarsystem/settings.gradle b/samples/solarsystem/settings.gradle new file mode 100644 index 00000000..c81913ae --- /dev/null +++ b/samples/solarsystem/settings.gradle @@ -0,0 +1,5 @@ +include ':app' + +// Uncomment to include the source version of the ux package in your project. +//include ':sceneformux' +//project(':sceneformux').projectDir=new File('../../sceneformux/ux') diff --git a/sceneformux/.gitignore b/sceneformux/.gitignore new file mode 100644 index 00000000..863f89cd --- /dev/null +++ b/sceneformux/.gitignore @@ -0,0 +1,13 @@ +# Android Studio configuration. +*.iml +.idea/ +# +# # Gradle configuration. +.gradle/ +build/ +# +# # User configuration. +local.properties +# +# # OS configurations. +.DS_Store diff --git a/sceneformux/build.gradle b/sceneformux/build.gradle new file mode 100644 index 00000000..4f99af89 --- /dev/null +++ b/sceneformux/build.gradle @@ -0,0 +1,42 @@ +/* + * Copyright 2018 Google LLC + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// Top-level build file where you can add configuration options common to +// all sub-projects/modules. + +buildscript { + repositories { + google() + jcenter() + mavenLocal() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.google.ar.sceneform:plugin:1.5.0' + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + mavenLocal() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/sceneformux/gradle.properties b/sceneformux/gradle.properties new file mode 100644 index 00000000..aac7c9b4 --- /dev/null +++ b/sceneformux/gradle.properties @@ -0,0 +1,17 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/sceneformux/gradle/wrapper/gradle-wrapper.jar b/sceneformux/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..758de960ec7947253b058ff79c88ce51f3abe08a GIT binary patch literal 54417 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 literal 0 HcmV?d00001 diff --git a/sceneformux/gradle/wrapper/gradle-wrapper.properties b/sceneformux/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..2d80b69a --- /dev/null +++ b/sceneformux/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/sceneformux/gradlew b/sceneformux/gradlew new file mode 100755 index 00000000..cccdd3d5 --- /dev/null +++ b/sceneformux/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/sceneformux/gradlew.bat b/sceneformux/gradlew.bat new file mode 100644 index 00000000..e95643d6 --- /dev/null +++ b/sceneformux/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/sceneformux/settings.gradle b/sceneformux/settings.gradle new file mode 100644 index 00000000..1d42a73a --- /dev/null +++ b/sceneformux/settings.gradle @@ -0,0 +1 @@ +include ':ux' diff --git a/hellosceneform/app/build.gradle b/sceneformux/ux/build.gradle similarity index 72% rename from hellosceneform/app/build.gradle rename to sceneformux/ux/build.gradle index f8da6404..18837144 100644 --- a/hellosceneform/app/build.gradle +++ b/sceneformux/ux/build.gradle @@ -12,13 +12,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -apply plugin: 'com.android.application' +apply plugin: 'com.android.library' android { compileSdkVersion 27 defaultConfig { - applicationId "com.google.ar.sceneform.samples.hellosceneform" - // 24 is the minimum since ARCore only works with 24 and higher. minSdkVersion 24 targetSdkVersion 27 @@ -26,7 +24,7 @@ android { versionName "1.0" ndk { /* - * Sceneform is available for the following ABIs: arm64-v8a, armv7a, + * Sceneform is available for the following ABIs: arm64-v8a, armeabi-v7a, * x86_64 and x86. This sample app enables arm64-v8a to run on * devices and x86 to run on the emulator. Your application should * list the ABIs most appropriate to minimize APK size (arm64-v8a recommended). @@ -41,25 +39,31 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } - lintOptions { - abortOnError false - } } dependencies { - implementation "com.google.ar.sceneform:core:1.4.0" - implementation "com.google.ar.sceneform.ux:sceneform-ux:1.4.0" + api "com.google.ar.sceneform:core:1.5.0" implementation "com.android.support:appcompat-v7:27.1.1" + implementation "com.android.support:design:27.1.1" } +task compileUxAssets { +} + +preBuild.dependsOn compileUxAssets + apply plugin: 'com.google.ar.sceneform.plugin' -sceneform.asset('sampledata/models/andy.obj', +sceneform.asset('sampledata/sceneform_footprint.obj', 'default', - 'sampledata/models/andy.sfa', - 'src/main/res/raw/andy') + 'sampledata/sceneform_footprint.sfa', + 'src/main/res/raw/sceneform_footprint') +// This ensures that sceneform assets are compiled at the right point +// of the build process, which is necessary when using sceneform +// in a library instead of an application. +sceneform.before('compileUxAssets') diff --git a/sceneformux/ux/sampledata/sceneform_footprint.mtl b/sceneformux/ux/sampledata/sceneform_footprint.mtl new file mode 100644 index 00000000..820b7341 --- /dev/null +++ b/sceneformux/ux/sampledata/sceneform_footprint.mtl @@ -0,0 +1,6 @@ +newmtl default +illum 2 +Kd 0.00 0.00 0.00 +Ka 0.00 0.00 0.00 +Tf 1.00 1.00 1.00 +Ni 1.00 diff --git a/sceneformux/ux/sampledata/sceneform_footprint.obj b/sceneformux/ux/sampledata/sceneform_footprint.obj new file mode 100644 index 00000000..663a5bb1 --- /dev/null +++ b/sceneformux/ux/sampledata/sceneform_footprint.obj @@ -0,0 +1,585 @@ +# This file uses centimeters as units for non-parametric coordinates. + +mtllib sceneform_footprint.mtl +g default +v 0.000000 0.000200 -0.098708 +v 0.000000 0.000200 -0.087741 +v 0.008599 0.000200 -0.087318 +v 0.009673 0.000200 -0.098231 +v 0.017115 0.000200 -0.086057 +v 0.019259 0.000200 -0.096811 +v 0.025472 0.000200 -0.083962 +v 0.028653 0.000200 -0.094458 +v 0.033577 0.000200 -0.081061 +v 0.037772 0.000200 -0.091195 +v 0.041359 0.000200 -0.077382 +v 0.046530 0.000200 -0.087055 +v 0.048745 0.000200 -0.072956 +v 0.054838 0.000200 -0.082070 +v 0.055660 0.000200 -0.067823 +v 0.062619 0.000200 -0.076301 +v 0.062044 0.000200 -0.062044 +v 0.069798 0.000200 -0.069798 +v 0.067823 0.000200 -0.055660 +v 0.076301 0.000200 -0.062619 +v 0.072956 0.000200 -0.048745 +v 0.082070 0.000200 -0.054838 +v 0.077382 0.000200 -0.041359 +v 0.087055 0.000200 -0.046530 +v 0.081061 0.000200 -0.033577 +v 0.091195 0.000200 -0.037772 +v 0.083962 0.000200 -0.025472 +v 0.094458 0.000200 -0.028653 +v 0.086057 0.000200 -0.017115 +v 0.096811 0.000200 -0.019259 +v 0.087318 0.000200 -0.008599 +v 0.098231 0.000200 -0.009673 +v 0.087741 0.000200 0.000000 +v 0.098708 0.000200 0.000000 +v 0.087318 0.000200 0.008599 +v 0.098231 0.000200 0.009673 +v 0.086057 0.000200 0.017115 +v 0.096811 0.000200 0.019259 +v 0.083962 0.000200 0.025472 +v 0.094458 0.000200 0.028653 +v 0.081061 0.000200 0.033577 +v 0.091195 0.000200 0.037772 +v 0.077382 0.000200 0.041359 +v 0.087055 0.000200 0.046530 +v 0.072956 0.000200 0.048745 +v 0.082070 0.000200 0.054838 +v 0.067823 0.000200 0.055660 +v 0.076301 0.000200 0.062619 +v 0.062044 0.000200 0.062044 +v 0.069798 0.000200 0.069798 +v 0.055660 0.000200 0.067823 +v 0.062619 0.000200 0.076301 +v 0.048745 0.000200 0.072956 +v 0.054838 0.000200 0.082070 +v 0.041359 0.000200 0.077382 +v 0.046530 0.000200 0.087055 +v 0.033577 0.000200 0.081061 +v 0.037772 0.000200 0.091195 +v 0.025472 0.000200 0.083962 +v 0.028653 0.000200 0.094458 +v 0.017115 0.000200 0.086057 +v 0.019259 0.000200 0.096811 +v 0.008599 0.000200 0.087318 +v 0.009673 0.000200 0.098231 +v 0.000000 0.000200 0.087741 +v 0.000000 0.000200 0.098708 +v -0.008599 0.000200 0.087318 +v -0.009673 0.000200 0.098231 +v -0.017115 0.000200 0.086057 +v -0.019259 0.000200 0.096811 +v -0.025472 0.000200 0.083962 +v -0.028653 0.000200 0.094458 +v -0.033577 0.000200 0.081061 +v -0.037772 0.000200 0.091195 +v -0.041359 0.000200 0.077382 +v -0.046530 0.000200 0.087055 +v -0.048745 0.000200 0.072956 +v -0.054838 0.000200 0.082070 +v -0.055660 0.000200 0.067823 +v -0.062619 0.000200 0.076301 +v -0.062044 0.000200 0.062044 +v -0.069798 0.000200 0.069798 +v -0.067823 0.000200 0.055660 +v -0.076301 0.000200 0.062619 +v -0.072956 0.000200 0.048745 +v -0.082070 0.000200 0.054838 +v -0.077382 0.000200 0.041359 +v -0.087055 0.000200 0.046530 +v -0.081061 0.000200 0.033577 +v -0.091195 0.000200 0.037772 +v -0.083962 0.000200 0.025472 +v -0.094458 0.000200 0.028653 +v -0.086057 0.000200 0.017115 +v -0.096811 0.000200 0.019259 +v -0.087318 0.000200 0.008599 +v -0.098231 0.000200 0.009673 +v -0.087741 0.000200 0.000000 +v -0.098708 0.000200 0.000000 +v -0.087318 0.000200 -0.008599 +v -0.098231 0.000200 -0.009673 +v -0.086057 0.000200 -0.017115 +v -0.096811 0.000200 -0.019259 +v -0.083962 0.000200 -0.025472 +v -0.094458 0.000200 -0.028653 +v -0.081061 0.000200 -0.033577 +v -0.091195 0.000200 -0.037772 +v -0.077382 0.000200 -0.041359 +v -0.087055 0.000200 -0.046530 +v -0.072956 0.000200 -0.048745 +v -0.082070 0.000200 -0.054838 +v -0.067823 0.000200 -0.055660 +v -0.076301 0.000200 -0.062619 +v -0.062044 0.000200 -0.062044 +v -0.069798 0.000200 -0.069798 +v -0.055660 0.000200 -0.067823 +v -0.062619 0.000200 -0.076301 +v -0.048745 0.000200 -0.072956 +v -0.054838 0.000200 -0.082070 +v -0.041359 0.000200 -0.077382 +v -0.046530 0.000200 -0.087055 +v -0.033577 0.000200 -0.081061 +v -0.037772 0.000200 -0.091195 +v -0.025472 0.000200 -0.083962 +v -0.028653 0.000200 -0.094458 +v -0.017115 0.000200 -0.086057 +v -0.019259 0.000200 -0.096811 +v -0.008599 0.000200 -0.087318 +v -0.009673 0.000200 -0.098231 +vt 0.750000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.015600 +vt 0.750000 0.015600 +vt 1.000000 0.031300 +vt 0.750000 0.031300 +vt 1.000000 0.046900 +vt 0.750000 0.046900 +vt 1.000000 0.062500 +vt 0.750000 0.062500 +vt 1.000000 0.078100 +vt 0.750000 0.078100 +vt 1.000000 0.093800 +vt 0.750000 0.093800 +vt 1.000000 0.109400 +vt 0.750000 0.109400 +vt 1.000000 0.125000 +vt 0.750000 0.125000 +vt 1.000000 0.140600 +vt 0.750000 0.140600 +vt 1.000000 0.156300 +vt 0.750000 0.156300 +vt 1.000000 0.171900 +vt 0.750000 0.171900 +vt 1.000000 0.187500 +vt 0.750000 0.187500 +vt 1.000000 0.203100 +vt 0.750000 0.203100 +vt 1.000000 0.218800 +vt 0.750000 0.218800 +vt 1.000000 0.234400 +vt 0.750000 0.234400 +vt 1.000000 0.250000 +vt 0.750000 0.250000 +vt 1.000000 0.265600 +vt 0.750000 0.265600 +vt 1.000000 0.281300 +vt 0.750000 0.281300 +vt 1.000000 0.296900 +vt 0.750000 0.296900 +vt 1.000000 0.312500 +vt 0.750000 0.312500 +vt 1.000000 0.328100 +vt 0.750000 0.328100 +vt 1.000000 0.343800 +vt 0.750000 0.343800 +vt 1.000000 0.359400 +vt 0.750000 0.359400 +vt 1.000000 0.375000 +vt 0.750000 0.375000 +vt 1.000000 0.390600 +vt 0.750000 0.390600 +vt 1.000000 0.406300 +vt 0.750000 0.406300 +vt 1.000000 0.421900 +vt 0.750000 0.421900 +vt 1.000000 0.437500 +vt 0.750000 0.437500 +vt 1.000000 0.453100 +vt 0.750000 0.453100 +vt 1.000000 0.468800 +vt 0.750000 0.468800 +vt 1.000000 0.484400 +vt 0.750000 0.484400 +vt 1.000000 0.500000 +vt 0.750000 0.500000 +vt 1.000000 0.515600 +vt 0.750000 0.515600 +vt 1.000000 0.531300 +vt 0.750000 0.531300 +vt 1.000000 0.546900 +vt 0.750000 0.546900 +vt 1.000000 0.562500 +vt 0.750000 0.562500 +vt 1.000000 0.578100 +vt 0.750000 0.578100 +vt 1.000000 0.593800 +vt 0.750000 0.593800 +vt 1.000000 0.609400 +vt 0.750000 0.609400 +vt 1.000000 0.625000 +vt 0.750000 0.625000 +vt 1.000000 0.640600 +vt 0.750000 0.640600 +vt 1.000000 0.656300 +vt 0.750000 0.656300 +vt 1.000000 0.671900 +vt 0.750000 0.671900 +vt 1.000000 0.687500 +vt 0.750000 0.687500 +vt 1.000000 0.703100 +vt 0.750000 0.703100 +vt 1.000000 0.718800 +vt 0.750000 0.718800 +vt 1.000000 0.734400 +vt 0.750000 0.734400 +vt 1.000000 0.750000 +vt 0.750000 0.750000 +vt 1.000000 0.765600 +vt 0.750000 0.765600 +vt 1.000000 0.781300 +vt 0.750000 0.781300 +vt 1.000000 0.796900 +vt 0.750000 0.796900 +vt 1.000000 0.812500 +vt 0.750000 0.812500 +vt 1.000000 0.828100 +vt 0.750000 0.828100 +vt 1.000000 0.843800 +vt 0.750000 0.843800 +vt 1.000000 0.859400 +vt 0.750000 0.859400 +vt 1.000000 0.875000 +vt 0.750000 0.875000 +vt 1.000000 0.890600 +vt 0.750000 0.890600 +vt 1.000000 0.906300 +vt 0.750000 0.906300 +vt 1.000000 0.921900 +vt 0.750000 0.921900 +vt 1.000000 0.937500 +vt 0.750000 0.937500 +vt 1.000000 0.953100 +vt 0.750000 0.953100 +vt 1.000000 0.968800 +vt 0.750000 0.968800 +vt 1.000000 0.984400 +vt 0.750000 0.984400 +vt 1.000000 1.000000 +vt 0.750000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +s off +g select_ring02:Tube003 +usemtl lambert2SG +f 1/1/1 2/2/2 3/3/3 4/4/4 +f 4/4/5 3/3/6 5/5/7 6/6/8 +f 6/6/9 5/5/10 7/7/11 8/8/12 +f 8/8/13 7/7/14 9/9/15 10/10/16 +f 10/10/17 9/9/18 11/11/19 12/12/20 +f 12/12/21 11/11/22 13/13/23 14/14/24 +f 14/14/25 13/13/26 15/15/27 16/16/28 +f 16/16/29 15/15/30 17/17/31 18/18/32 +f 18/18/33 17/17/34 19/19/35 20/20/36 +f 20/20/37 19/19/38 21/21/39 22/22/40 +f 22/22/41 21/21/42 23/23/43 24/24/44 +f 24/24/45 23/23/46 25/25/47 26/26/48 +f 26/26/49 25/25/50 27/27/51 28/28/52 +f 28/28/53 27/27/54 29/29/55 30/30/56 +f 30/30/57 29/29/58 31/31/59 32/32/60 +f 32/32/61 31/31/62 33/33/63 34/34/64 +f 34/34/65 33/33/66 35/35/67 36/36/68 +f 36/36/69 35/35/70 37/37/71 38/38/72 +f 38/38/73 37/37/74 39/39/75 40/40/76 +f 40/40/77 39/39/78 41/41/79 42/42/80 +f 42/42/81 41/41/82 43/43/83 44/44/84 +f 44/44/85 43/43/86 45/45/87 46/46/88 +f 46/46/89 45/45/90 47/47/91 48/48/92 +f 48/48/93 47/47/94 49/49/95 50/50/96 +f 50/50/97 49/49/98 51/51/99 52/52/100 +f 52/52/101 51/51/102 53/53/103 54/54/104 +f 54/54/105 53/53/106 55/55/107 56/56/108 +f 56/56/109 55/55/110 57/57/111 58/58/112 +f 58/58/113 57/57/114 59/59/115 60/60/116 +f 60/60/117 59/59/118 61/61/119 62/62/120 +f 62/62/121 61/61/122 63/63/123 64/64/124 +f 64/64/125 63/63/126 65/65/127 66/66/128 +f 66/66/129 65/65/130 67/67/131 68/68/132 +f 68/68/133 67/67/134 69/69/135 70/70/136 +f 70/70/137 69/69/138 71/71/139 72/72/140 +f 72/72/141 71/71/142 73/73/143 74/74/144 +f 74/74/145 73/73/146 75/75/147 76/76/148 +f 76/76/149 75/75/150 77/77/151 78/78/152 +f 78/78/153 77/77/154 79/79/155 80/80/156 +f 80/80/157 79/79/158 81/81/159 82/82/160 +f 82/82/161 81/81/162 83/83/163 84/84/164 +f 84/84/165 83/83/166 85/85/167 86/86/168 +f 86/86/169 85/85/170 87/87/171 88/88/172 +f 88/88/173 87/87/174 89/89/175 90/90/176 +f 90/90/177 89/89/178 91/91/179 92/92/180 +f 92/92/181 91/91/182 93/93/183 94/94/184 +f 94/94/185 93/93/186 95/95/187 96/96/188 +f 96/96/189 95/95/190 97/97/191 98/98/192 +f 98/98/193 97/97/194 99/99/195 100/100/196 +f 100/100/197 99/99/198 101/101/199 102/102/200 +f 102/102/201 101/101/202 103/103/203 104/104/204 +f 104/104/205 103/103/206 105/105/207 106/106/208 +f 106/106/209 105/105/210 107/107/211 108/108/212 +f 108/108/213 107/107/214 109/109/215 110/110/216 +f 110/110/217 109/109/218 111/111/219 112/112/220 +f 112/112/221 111/111/222 113/113/223 114/114/224 +f 114/114/225 113/113/226 115/115/227 116/116/228 +f 116/116/229 115/115/230 117/117/231 118/118/232 +f 118/118/233 117/117/234 119/119/235 120/120/236 +f 120/120/237 119/119/238 121/121/239 122/122/240 +f 122/122/241 121/121/242 123/123/243 124/124/244 +f 124/124/245 123/123/246 125/125/247 126/126/248 +f 126/126/249 125/125/250 127/127/251 128/128/252 +f 128/128/253 127/127/254 2/129/255 1/130/256 diff --git a/sceneformux/ux/src/main/AndroidManifest.xml b/sceneformux/ux/src/main/AndroidManifest.xml new file mode 100644 index 00000000..3aad7b81 --- /dev/null +++ b/sceneformux/ux/src/main/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/ArFragment.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/ArFragment.java new file mode 100644 index 00000000..fba11def --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/ArFragment.java @@ -0,0 +1,68 @@ +/* + * Copyright 2018 Google LLC. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.util.Log; +import android.widget.Toast; +import com.google.ar.core.Config; +import com.google.ar.core.Session; +import com.google.ar.core.exceptions.UnavailableApkTooOldException; +import com.google.ar.core.exceptions.UnavailableArcoreNotInstalledException; +import com.google.ar.core.exceptions.UnavailableDeviceNotCompatibleException; +import com.google.ar.core.exceptions.UnavailableException; +import com.google.ar.core.exceptions.UnavailableSdkTooOldException; + +/** + * Implements AR Required ArFragment. Does not require additional permissions and uses the default + * configuration for ARCore. + */ +public class ArFragment extends BaseArFragment { + private static final String TAG = "StandardArFragment"; + + @Override + public boolean isArRequired() { + return true; + } + + @Override + public String[] getAdditionalPermissions() { + return new String[0]; + } + + @Override + protected void handleSessionException(UnavailableException sessionException) { + + String message; + if (sessionException instanceof UnavailableArcoreNotInstalledException) { + message = "Please install ARCore"; + } else if (sessionException instanceof UnavailableApkTooOldException) { + message = "Please update ARCore"; + } else if (sessionException instanceof UnavailableSdkTooOldException) { + message = "Please update this app"; + } else if (sessionException instanceof UnavailableDeviceNotCompatibleException) { + message = "This device does not support AR"; + } else { + message = "Failed to create AR session"; + } + Log.e(TAG, "Error: " + message, sessionException); + Toast.makeText(requireActivity(), message, Toast.LENGTH_LONG).show(); + } + + @Override + protected Config getSessionConfiguration(Session session) { + return new Config(session); + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseArFragment.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseArFragment.java new file mode 100644 index 00000000..94db6a0e --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseArFragment.java @@ -0,0 +1,499 @@ +/* + * Copyright 2018 Google LLC. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + */ +package com.google.ar.sceneform.ux; + +import android.Manifest; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.DialogInterface.OnDismissListener; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.os.Build.VERSION_CODES; +import android.os.Bundle; +import android.provider.Settings; +import android.support.annotation.Nullable; +import android.support.v4.app.ActivityCompat; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.content.ContextCompat; +import android.view.GestureDetector; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.FrameLayout; +import android.widget.Toast; +import com.google.ar.core.ArCoreApk; +import com.google.ar.core.Config; +import com.google.ar.core.Frame; +import com.google.ar.core.HitResult; +import com.google.ar.core.Plane; +import com.google.ar.core.Session; +import com.google.ar.core.Trackable; +import com.google.ar.core.TrackingState; +import com.google.ar.core.exceptions.CameraNotAvailableException; +import com.google.ar.core.exceptions.UnavailableException; +import com.google.ar.sceneform.ArSceneView; +import com.google.ar.sceneform.FrameTime; +import com.google.ar.sceneform.HitTestResult; +import com.google.ar.sceneform.Scene; +import com.google.ar.sceneform.rendering.ModelRenderable; +import java.util.ArrayList; +import java.util.List; + +/** The AR fragment brings in the required view layout and controllers for common AR features. */ +public abstract class BaseArFragment extends Fragment + implements Scene.OnPeekTouchListener, Scene.OnUpdateListener { + private static final String TAG = BaseArFragment.class.getSimpleName(); + /** Invoked when an ARCore plane is tapped. */ + public interface OnTapArPlaneListener { + /** + * Called when an ARCore plane is tapped. The callback will only be invoked if no {@link + * com.google.ar.sceneform.Node} was tapped. + * + * @see #setOnTapArPlaneListener(OnTapArPlaneListener) + * @param hitResult The ARCore hit result that occurred when tapping the plane + * @param plane The ARCore Plane that was tapped + * @param motionEvent the motion event that triggered the tap + */ + void onTapPlane(HitResult hitResult, Plane plane, MotionEvent motionEvent); + } + + private static final int RC_PERMISSIONS = 1010; + private boolean installRequested; + private boolean sessionInitializationFailed = false; + private ArSceneView arSceneView; + private PlaneDiscoveryController planeDiscoveryController; + private TransformationSystem transformationSystem; + private GestureDetector gestureDetector; + private FrameLayout frameLayout; + private boolean isStarted; + private boolean canRequestDangerousPermissions = true; + @Nullable private OnTapArPlaneListener onTapArPlaneListener; + + /** Gets the ArSceneView for this fragment. */ + public ArSceneView getArSceneView() { + return arSceneView; + } + + /** + * Gets the plane discovery controller, which displays instructions for how to scan for planes. + */ + public PlaneDiscoveryController getPlaneDiscoveryController() { + return planeDiscoveryController; + } + + /** + * Gets the transformation system, which is used by {@link TransformableNode} for detecting + * gestures and coordinating which node is selected. + */ + public TransformationSystem getTransformationSystem() { + return transformationSystem; + } + + /** + * Registers a callback to be invoked when an ARCore Plane is tapped. The callback will only be + * invoked if no {@link com.google.ar.sceneform.Node} was tapped. + * + * @param onTapArPlaneListener the {@link OnTapArPlaneListener} to attach + */ + public void setOnTapArPlaneListener(@Nullable OnTapArPlaneListener onTapArPlaneListener) { + this.onTapArPlaneListener = onTapArPlaneListener; + } + + @Override + @SuppressWarnings({"initialization"}) + // Suppress @UnderInitialization warning. + public View onCreateView( + LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + frameLayout = + (FrameLayout) inflater.inflate(R.layout.sceneform_ux_fragment_layout, container, false); + arSceneView = (ArSceneView) frameLayout.findViewById(R.id.sceneform_ar_scene_view); + + // Setup the instructions view. + View instructionsView = loadPlaneDiscoveryView(inflater, container); + frameLayout.addView(instructionsView); + planeDiscoveryController = new PlaneDiscoveryController(instructionsView); + + if (Build.VERSION.SDK_INT < VERSION_CODES.N) { + // Enforce API level 24 + return frameLayout; + } + + transformationSystem = makeTransformationSystem(); + + gestureDetector = + new GestureDetector( + getContext(), + new GestureDetector.SimpleOnGestureListener() { + @Override + public boolean onSingleTapUp(MotionEvent e) { + onSingleTap(e); + return true; + } + + @Override + public boolean onDown(MotionEvent e) { + return true; + } + }); + + arSceneView.getScene().addOnPeekTouchListener(this); + arSceneView.getScene().addOnUpdateListener(this); + + if (isArRequired()) { + // Request permissions + requestDangerousPermissions(); + } + + // Make the app immersive and don't turn off the display. + arSceneView + .getViewTreeObserver() + .addOnWindowFocusChangeListener(hasFocus -> onWindowFocusChanged(hasFocus)); + + return frameLayout; + } + + /** + * Returns true if this application is AR Required, false if AR Optional. This is called when + * initializing the application and the session. + */ + public abstract boolean isArRequired(); + + /** + * Returns an array of dangerous permissions that are required by the app in addition to + * Manifest.permission.CAMERA, which is needed by ARCore. If no additional permissions are needed, + * an empty array should be returned. + */ + public abstract String[] getAdditionalPermissions(); + + /** + * Starts the process of requesting dangerous permissions. This combines the CAMERA permission + * required of ARCore and any permissions returned from getAdditionalPermissions(). There is no + * specific processing on the result of the request, subclasses can override + * onRequestPermissionsResult() if additional processing is needed. + * + *

{@link #setCanRequestDangerousPermissions(Boolean)} can stop this function from doing + * anything. + */ + protected void requestDangerousPermissions() { + if (!canRequestDangerousPermissions) { + // If this is in progress, don't do it again. + return; + } + canRequestDangerousPermissions = false; + + List permissions = new ArrayList(); + String[] additionalPermissions = getAdditionalPermissions(); + int permissionLength = additionalPermissions != null ? additionalPermissions.length : 0; + for (int i = 0; i < permissionLength; ++i) { + if (ActivityCompat.checkSelfPermission(requireActivity(), additionalPermissions[i]) + != PackageManager.PERMISSION_GRANTED) { + permissions.add(additionalPermissions[i]); + } + } + + // Always check for camera permission + if (ActivityCompat.checkSelfPermission(requireActivity(), Manifest.permission.CAMERA) + != PackageManager.PERMISSION_GRANTED) { + permissions.add(Manifest.permission.CAMERA); + } + + if (!permissions.isEmpty()) { + // Request the permissions + requestPermissions(permissions.toArray(new String[permissions.size()]), RC_PERMISSIONS); + } + } + + /** + * Receives the results for permission requests. + * + *

Brings up a dialog to request permissions. The dialog can send the user to the Settings app, + * or finish the activity. + */ + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] results) { + if (ActivityCompat.checkSelfPermission(requireActivity(), Manifest.permission.CAMERA) + == PackageManager.PERMISSION_GRANTED) { + return; + } + AlertDialog.Builder builder; + builder = + new AlertDialog.Builder(requireActivity(), android.R.style.Theme_Material_Dialog_Alert); + + builder + .setTitle("Camera permission required") + .setMessage("Add camera permission via Settings?") + .setPositiveButton( + android.R.string.ok, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // If Ok was hit, bring up the Settings app. + Intent intent = new Intent(); + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setData(Uri.fromParts("package", requireActivity().getPackageName(), null)); + requireActivity().startActivity(intent); + // When the user closes the Settings app, allow the app to resume. + // Allow the app to ask for permissions again now. + setCanRequestDangerousPermissions(true); + } + }) + .setNegativeButton(android.R.string.cancel, null) + .setIcon(android.R.drawable.ic_dialog_alert) + .setOnDismissListener( + new OnDismissListener() { + @Override + public void onDismiss(final DialogInterface arg0) { + // canRequestDangerousPermissions will be true if "OK" was selected from the dialog, + // false otherwise. If "OK" was selected do nothing on dismiss, the app will + // continue and may ask for permission again if needed. + // If anything else happened, finish the activity when this dialog is + // dismissed. + if (!getCanRequestDangerousPermissions()) { + requireActivity().finish(); + } + } + }) + .show(); + } + + /** + * If true, {@link #requestDangerousPermissions()} returns without doing anything, if false + * permissions will be requested + */ + protected Boolean getCanRequestDangerousPermissions() { + return canRequestDangerousPermissions; + } + + /** + * If true, {@link #requestDangerousPermissions()} returns without doing anything, if false + * permissions will be requested + */ + protected void setCanRequestDangerousPermissions(Boolean canRequestDangerousPermissions) { + this.canRequestDangerousPermissions = canRequestDangerousPermissions; + } + + @Override + public void onResume() { + super.onResume(); + if (isArRequired() && arSceneView.getSession() == null) { + initializeSession(); + } + start(); + } + + /** + * Initializes the ARCore session. The CAMERA permission is checked before checking the + * installation state of ARCore. Once the permissions and installation are OK, the method + * #getSessionConfiguration(Session session) is called to get the session configuration to use. + * Sceneform requires that the ARCore session be updated using LATEST_CAMERA_IMAGE to avoid + * blocking while drawing. This mode is set on the configuration object returned from the + * subclass. + */ + protected final void initializeSession() { + + // Only try once + if (sessionInitializationFailed) { + return; + } + // if we have the camera permission, create the session + if (ContextCompat.checkSelfPermission(requireActivity(), "android.permission.CAMERA") + == PackageManager.PERMISSION_GRANTED) { + + UnavailableException sessionException = null; + try { + switch (ArCoreApk.getInstance().requestInstall(requireActivity(), !installRequested)) { + case INSTALL_REQUESTED: + installRequested = true; + return; + case INSTALLED: + break; + } + Session session = new Session(requireActivity()); + + Config config = getSessionConfiguration(session); + // Force the non-blocking mode for the session. + + config.setUpdateMode(Config.UpdateMode.LATEST_CAMERA_IMAGE); + session.configure(config); + getArSceneView().setupSession(session); + return; + } catch (UnavailableException e) { + sessionException = e; + } catch (Exception e) { + sessionException = new UnavailableException(); + sessionException.initCause(e); + } + sessionInitializationFailed = true; + handleSessionException(sessionException); + + } else { + requestDangerousPermissions(); + } + } + + /** + * Creates the transformation system used by this fragment. Can be overridden to create a custom + * transformation system. + */ + @SuppressWarnings({"AndroidApiChecker", "FutureReturnValueIgnored"}) + protected TransformationSystem makeTransformationSystem() { + FootprintSelectionVisualizer selectionVisualizer = new FootprintSelectionVisualizer(); + + TransformationSystem transformationSystem = + new TransformationSystem(getResources().getDisplayMetrics(), selectionVisualizer); + + ModelRenderable.builder() + .setSource(getActivity(), R.raw.sceneform_footprint) + .build() + .thenAccept( + renderable -> { + // If the selection visualizer already has a footprint renderable, then it was set to + // something custom. Don't override the custom visual. + if (selectionVisualizer.getFootprintRenderable() == null) { + selectionVisualizer.setFootprintRenderable(renderable); + } + }) + .exceptionally( + throwable -> { + Toast toast = + Toast.makeText( + getContext(), "Unable to load footprint renderable", Toast.LENGTH_LONG); + toast.setGravity(Gravity.CENTER, 0, 0); + toast.show(); + return null; + }); + + return transformationSystem; + } + + protected abstract void handleSessionException(UnavailableException sessionException); + + protected abstract Config getSessionConfiguration(Session session); + + protected void onWindowFocusChanged(boolean hasFocus) { + FragmentActivity activity = getActivity(); + if (hasFocus && activity != null) { + // Standard Android full-screen functionality. + activity + .getWindow() + .getDecorView() + .setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + } + + @Override + public void onPause() { + super.onPause(); + stop(); + } + + @Override + public void onDestroy() { + stop(); + arSceneView.destroy(); + super.onDestroy(); + } + + @Override + public void onPeekTouch(HitTestResult hitTestResult, MotionEvent motionEvent) { + transformationSystem.onTouch(hitTestResult, motionEvent); + + if (hitTestResult.getNode() == null) { + gestureDetector.onTouchEvent(motionEvent); + } + } + + @Override + public void onUpdate(FrameTime frameTime) { + Frame frame = arSceneView.getArFrame(); + if (frame == null) { + return; + } + + for (Plane plane : frame.getUpdatedTrackables(Plane.class)) { + if (plane.getTrackingState() == TrackingState.TRACKING) { + planeDiscoveryController.hide(); + } + } + } + + private void start() { + if (isStarted) { + return; + } + + if (getActivity() != null) { + isStarted = true; + try { + arSceneView.resume(); + } catch (CameraNotAvailableException ex) { + sessionInitializationFailed = true; + } + if (!sessionInitializationFailed) { + planeDiscoveryController.show(); + } + } + } + + private void stop() { + if (!isStarted) { + return; + } + + isStarted = false; + planeDiscoveryController.hide(); + arSceneView.pause(); + } + + // Load the default view we use for the plane discovery instructions. + private View loadPlaneDiscoveryView(LayoutInflater inflater, @Nullable ViewGroup container) { + return inflater.inflate(R.layout.sceneform_plane_discovery_layout, container, false); + } + + private void onSingleTap(MotionEvent motionEvent) { + Frame frame = arSceneView.getArFrame(); + + transformationSystem.selectNode(null); + + // Local variable for nullness static-analysis. + OnTapArPlaneListener onTapArPlaneListener = this.onTapArPlaneListener; + + if (frame != null && onTapArPlaneListener != null) { + if (motionEvent != null && frame.getCamera().getTrackingState() == TrackingState.TRACKING) { + for (HitResult hit : frame.hitTest(motionEvent)) { + Trackable trackable = hit.getTrackable(); + if (trackable instanceof Plane && ((Plane) trackable).isPoseInPolygon(hit.getHitPose())) { + Plane plane = (Plane) trackable; + onTapArPlaneListener.onTapPlane(hit, plane, motionEvent); + break; + } + } + } + } + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseGesture.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseGesture.java new file mode 100644 index 00000000..fed13125 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseGesture.java @@ -0,0 +1,142 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.support.annotation.Nullable; +import android.view.MotionEvent; +import com.google.ar.sceneform.HitTestResult; +import com.google.ar.sceneform.Node; + +/** + * Base class for a gesture. + * + *

A gesture represents a sequence of touch events that are detected to represent a particular + * type of motion (i.e. Dragging, Pinching). + * + *

Gestures are created and updated by BaseGestureRecognizer's. + */ +public abstract class BaseGesture> { + /** Interface definition for callbacks to be invoked by a {@link BaseGesture}. */ + public interface OnGestureEventListener> { + void onUpdated(T gesture); + + void onFinished(T gesture); + } + + protected final GesturePointersUtility gesturePointersUtility; + + private boolean hasStarted; + private boolean justStarted; + private boolean hasFinished; + private boolean wasCancelled; + + @Nullable protected Node targetNode; + @Nullable private OnGestureEventListener eventListener; + + public BaseGesture(GesturePointersUtility gesturePointersUtility) { + this.gesturePointersUtility = gesturePointersUtility; + } + + public boolean hasStarted() { + return hasStarted; + } + + public boolean justStarted() { + return justStarted; + } + + public boolean hasFinished() { + return hasFinished; + } + + public boolean wasCancelled() { + return wasCancelled; + } + + public @Nullable Node getTargetNode() { + return targetNode; + } + + public float inchesToPixels(float inches) { + return gesturePointersUtility.inchesToPixels(inches); + } + + public float pixelsToInches(float pixels) { + return gesturePointersUtility.pixelsToInches(pixels); + } + + public void setGestureEventListener(@Nullable OnGestureEventListener listener) { + eventListener = listener; + } + + public void onTouch(HitTestResult hitTestResult, MotionEvent motionEvent) { + if (!hasStarted && canStart(hitTestResult, motionEvent)) { + start(hitTestResult, motionEvent); + return; + } + justStarted = false; + if (hasStarted) { + if (updateGesture(hitTestResult, motionEvent)) { + dispatchUpdateEvent(); + } + } + } + + protected abstract boolean canStart(HitTestResult hitTestResult, MotionEvent motionEvent); + + protected abstract void onStart(HitTestResult hitTestResult, MotionEvent motionEvent); + + protected abstract boolean updateGesture(HitTestResult hitTestResult, MotionEvent motionEvent); + + protected abstract void onCancel(); + + protected abstract void onFinish(); + + protected void cancel() { + wasCancelled = true; + onCancel(); + complete(); + } + + protected void complete() { + hasFinished = true; + if (hasStarted) { + onFinish(); + dispatchFinishedEvent(); + } + } + + private void start(HitTestResult hitTestResult, MotionEvent motionEvent) { + hasStarted = true; + justStarted = true; + onStart(hitTestResult, motionEvent); + } + + private void dispatchUpdateEvent() { + if (eventListener != null) { + eventListener.onUpdated(getSelf()); + } + } + + private void dispatchFinishedEvent() { + if (eventListener != null) { + eventListener.onFinished(getSelf()); + } + } + + // For compile-time safety so we don't need to cast when dispatching events. + protected abstract T getSelf(); +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseGestureRecognizer.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseGestureRecognizer.java new file mode 100644 index 00000000..41c8b4b0 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseGestureRecognizer.java @@ -0,0 +1,94 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.view.MotionEvent; +import com.google.ar.sceneform.HitTestResult; +import java.util.ArrayList; + +/** + * Base class for all Gesture Recognizers (i.e. DragGestureRecognizer). + * + *

A Gesture recognizer processes touch input to determine if a gesture should start and fires an + * event when the gesture is started. + * + *

To determine when an gesture is finished/updated, listen to the events on the gesture object. + */ +public abstract class BaseGestureRecognizer> { + /** Interface definition for a callbacks to be invoked when a {@link BaseGesture} starts. */ + public interface OnGestureStartedListener> { + void onGestureStarted(T gesture); + } + + protected final GesturePointersUtility gesturePointersUtility; + protected final ArrayList gestures = new ArrayList<>(); + + private final ArrayList> gestureStartedListeners; + + @SuppressWarnings("initialization") // Suppress @UnderInitialization warning. + public BaseGestureRecognizer(GesturePointersUtility gesturePointersUtility) { + this.gesturePointersUtility = gesturePointersUtility; + gestureStartedListeners = new ArrayList<>(); + } + + public void addOnGestureStartedListener(OnGestureStartedListener listener) { + if (!gestureStartedListeners.contains(listener)) { + gestureStartedListeners.add(listener); + } + } + + public void removeOnGestureStartedListener(OnGestureStartedListener listener) { + gestureStartedListeners.remove(listener); + } + + public void onTouch(HitTestResult hitTestResult, MotionEvent motionEvent) { + // Instantiate gestures based on touch input. + // Just because a gesture was created, doesn't mean that it is started. + // For example, a DragGesture is created when the user touch's down, + // but doesn't actually start until the touch has moved beyond a threshold. + tryCreateGestures(hitTestResult, motionEvent); + + // Propagate event to gestures and determine if they should start. + for (int i = 0; i < gestures.size(); i++) { + T gesture = gestures.get(i); + gesture.onTouch(hitTestResult, motionEvent); + + if (gesture.justStarted()) { + dispatchGestureStarted(gesture); + } + } + + removeFinishedGestures(); + } + + protected abstract void tryCreateGestures(HitTestResult hitTestResult, MotionEvent motionEvent); + + private void dispatchGestureStarted(T gesture) { + for (int i = 0; i < gestureStartedListeners.size(); i++) { + OnGestureStartedListener listener = gestureStartedListeners.get(i); + listener.onGestureStarted(gesture); + } + } + + private void removeFinishedGestures() { + for (int i = gestures.size() - 1; i >= 0; i--) { + T gesture = gestures.get(i); + if (gesture.hasFinished()) { + gestures.remove(i); + } + } + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseTransformableNode.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseTransformableNode.java new file mode 100644 index 00000000..33e34f3b --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseTransformableNode.java @@ -0,0 +1,82 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.view.MotionEvent; +import com.google.ar.sceneform.HitTestResult; +import com.google.ar.sceneform.Node; +import java.util.ArrayList; + +/** + * Base class for nodes that can be transformed using gestures from {@link TransformationSystem}. + */ +public abstract class BaseTransformableNode extends Node implements Node.OnTapListener { + private final TransformationSystem transformationSystem; + private final ArrayList> controllers = new ArrayList<>(); + + @SuppressWarnings("initialization") + public BaseTransformableNode(TransformationSystem transformationSystem) { + this.transformationSystem = transformationSystem; + + setOnTapListener(this); + } + + public TransformationSystem getTransformationSystem() { + return transformationSystem; + } + + /** Returns true if any of the transformation controllers are actively transforming this node. */ + public boolean isTransforming() { + for (int i = 0; i < controllers.size(); i++) { + if (controllers.get(i).isTransforming()) { + return true; + } + } + + return false; + } + + /** Returns true if this node is currently selected by the TransformationSystem. */ + public boolean isSelected() { + return transformationSystem.getSelectedNode() == this; + } + + /** + * Sets this as the selected node in the TransformationSystem if there is no currently selected + * node or if the currently selected node is not actively being transformed. + * + * @see TransformableNode#isTransforming + * @return true if the node was successfully selected + */ + public boolean select() { + return transformationSystem.selectNode(this); + } + + @Override + public void onTap(HitTestResult hitTestResult, MotionEvent motionEvent) { + select(); + } + + protected void addTransformationController( + BaseTransformationController transformationController) { + controllers.add(transformationController); + } + + protected void removeTransformationController( + BaseTransformationController transformationController) { + controllers.remove(transformationController); + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseTransformationController.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseTransformationController.java new file mode 100644 index 00000000..991c3e78 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/BaseTransformationController.java @@ -0,0 +1,163 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.support.annotation.CallSuper; +import android.support.annotation.Nullable; +import com.google.ar.sceneform.FrameTime; +import com.google.ar.sceneform.Node; + +/** + * Manipulates the transform properties (i.e. scale/rotation/translation) of a {@link + * BaseTransformableNode} by responding to Gestures via a {@link BaseGestureRecognizer}. + * + *

Example's include, changing the {@link TransformableNode}'s Scale based on a Pinch Gesture. + */ +public abstract class BaseTransformationController> + implements BaseGestureRecognizer.OnGestureStartedListener, + BaseGesture.OnGestureEventListener, + Node.LifecycleListener { + private final BaseTransformableNode transformableNode; + private final BaseGestureRecognizer gestureRecognizer; + + @Nullable private T activeGesture; + private boolean enabled; + private boolean activeAndEnabled; + + @SuppressWarnings("initialization") // Suppress @UnderInitialization warning. + public BaseTransformationController( + BaseTransformableNode transformableNode, BaseGestureRecognizer gestureRecognizer) { + this.transformableNode = transformableNode; + this.transformableNode.addLifecycleListener(this); + this.gestureRecognizer = gestureRecognizer; + setEnabled(true); + } + + public boolean isEnabled() { + return enabled; + } + + @Nullable + public T getActiveGesture() { + return activeGesture; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + updateActiveAndEnabled(); + } + + public boolean isTransforming() { + return activeGesture != null; + } + + public BaseTransformableNode getTransformableNode() { + return transformableNode; + } + + // --------------------------------------------------------------------------------------- + // Implementation of interface Node.LifecycleListener + // --------------------------------------------------------------------------------------- + + @Override + @CallSuper + public void onActivated(Node node) { + updateActiveAndEnabled(); + } + + @Override + public void onUpdated(Node node, FrameTime frameTime) {} + + @Override + @CallSuper + public void onDeactivated(Node node) { + updateActiveAndEnabled(); + } + + // --------------------------------------------------------------------------------------- + // Implementation of interface BaseGestureRecognizer.OnGestureStartedListener + // --------------------------------------------------------------------------------------- + + @Override + public void onGestureStarted(T gesture) { + if (isTransforming()) { + return; + } + + if (canStartTransformation(gesture)) { + setActiveGesture(gesture); + } + } + + // --------------------------------------------------------------------------------------- + // Implementation of interface BaseGesture.OnGestureEventListener + // --------------------------------------------------------------------------------------- + + @Override + public void onUpdated(T gesture) { + onContinueTransformation(gesture); + } + + @Override + public void onFinished(T gesture) { + onEndTransformation(gesture); + setActiveGesture(null); + } + + protected abstract boolean canStartTransformation(T gesture); + + protected abstract void onContinueTransformation(T gesture); + + protected abstract void onEndTransformation(T gesture); + + private void setActiveGesture(@Nullable T gesture) { + if (activeGesture != null) { + activeGesture.setGestureEventListener(null); + } + + activeGesture = gesture; + + if (activeGesture != null) { + activeGesture.setGestureEventListener(this); + } + } + + private void updateActiveAndEnabled() { + boolean newActiveAndEnabled = getTransformableNode().isActive() && enabled; + if (newActiveAndEnabled == activeAndEnabled) { + return; + } + + activeAndEnabled = newActiveAndEnabled; + + if (activeAndEnabled) { + connectToRecognizer(); + } else { + disconnectFromRecognizer(); + if (activeGesture != null) { + activeGesture.cancel(); + } + } + } + + private void connectToRecognizer() { + gestureRecognizer.addOnGestureStartedListener(this); + } + + private void disconnectFromRecognizer() { + gestureRecognizer.removeOnGestureStartedListener(this); + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/DragGesture.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/DragGesture.java new file mode 100644 index 00000000..4037cc3b --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/DragGesture.java @@ -0,0 +1,154 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.util.Log; +import android.view.MotionEvent; +import com.google.ar.sceneform.HitTestResult; +import com.google.ar.sceneform.math.Vector3; + +/** Gesture for when the user performs a drag motion on the touch screen. */ +public class DragGesture extends BaseGesture { + private static final String TAG = DragGesture.class.getSimpleName(); + + /** Interface definition for callbacks to be invoked by a {@link DragGesture}. */ + public interface OnGestureEventListener extends BaseGesture.OnGestureEventListener {} + + private final Vector3 startPosition; + private final Vector3 position; + private final Vector3 delta; + private final int pointerId; + + private static final float SLOP_INCHES = 0.1f; + private static final boolean DRAG_GESTURE_DEBUG = false; + + public DragGesture( + GesturePointersUtility gesturePointersUtility, + HitTestResult hitTestResult, + MotionEvent motionEvent) { + super(gesturePointersUtility); + + pointerId = motionEvent.getPointerId(motionEvent.getActionIndex()); + startPosition = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId); + position = new Vector3(startPosition); + delta = Vector3.zero(); + targetNode = hitTestResult.getNode(); + debugLog("Created: " + pointerId); + } + + public Vector3 getPosition() { + return new Vector3(position); + } + + public Vector3 getDelta() { + return new Vector3(delta); + } + + @Override + protected boolean canStart(HitTestResult hitTestResult, MotionEvent motionEvent) { + int actionId = motionEvent.getPointerId(motionEvent.getActionIndex()); + int action = motionEvent.getActionMasked(); + + if (gesturePointersUtility.isPointerIdRetained(pointerId)) { + cancel(); + return false; + } + + if (actionId == pointerId + && (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP)) { + cancel(); + return false; + } else if (action == MotionEvent.ACTION_CANCEL) { + cancel(); + return false; + } + + if (action != MotionEvent.ACTION_MOVE) { + return false; + } + + if (motionEvent.getPointerCount() > 1) { + for (int i = 0; i < motionEvent.getPointerCount(); i++) { + int id = motionEvent.getPointerId(i); + if (id != pointerId && !gesturePointersUtility.isPointerIdRetained(id)) { + return false; + } + } + } + + Vector3 newPosition = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId); + float diff = Vector3.subtract(newPosition, startPosition).length(); + float slopPixels = gesturePointersUtility.inchesToPixels(SLOP_INCHES); + if (diff >= slopPixels) { + return true; + } + + return false; + } + + @Override + protected void onStart(HitTestResult hitTestResult, MotionEvent motionEvent) { + debugLog("Started: " + pointerId); + + position.set(GesturePointersUtility.motionEventToPosition(motionEvent, pointerId)); + gesturePointersUtility.retainPointerId(pointerId); + } + + @Override + protected boolean updateGesture(HitTestResult hitTestResult, MotionEvent motionEvent) { + int actionId = motionEvent.getPointerId(motionEvent.getActionIndex()); + int action = motionEvent.getActionMasked(); + + if (action == MotionEvent.ACTION_MOVE) { + Vector3 newPosition = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId); + if (!Vector3.equals(newPosition, position)) { + delta.set(Vector3.subtract(newPosition, position)); + position.set(newPosition); + debugLog("Updated: " + pointerId + " : " + position); + return true; + } + } else if (actionId == pointerId + && (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP)) { + complete(); + } else if (action == MotionEvent.ACTION_CANCEL) { + cancel(); + } + + return false; + } + + @Override + protected void onCancel() { + debugLog("Cancelled: " + pointerId); + } + + @Override + protected void onFinish() { + debugLog("Finished: " + pointerId); + gesturePointersUtility.releasePointerId(pointerId); + } + + @Override + protected DragGesture getSelf() { + return this; + } + + private static void debugLog(String log) { + if (DRAG_GESTURE_DEBUG) { + Log.d(TAG, "DragGesture:[" + log + "]"); + } + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/DragGestureRecognizer.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/DragGestureRecognizer.java new file mode 100644 index 00000000..ad06dc0d --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/DragGestureRecognizer.java @@ -0,0 +1,42 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.view.MotionEvent; +import com.google.ar.sceneform.HitTestResult; + +/** Gesture Recognizer for when the user performs a drag motion on the touch screen. */ +public class DragGestureRecognizer extends BaseGestureRecognizer { + /** Interface definition for a callbacks to be invoked when a {@link DragGesture} starts. */ + public interface OnGestureStartedListener + extends BaseGestureRecognizer.OnGestureStartedListener {} + + public DragGestureRecognizer(GesturePointersUtility gesturePointersUtility) { + super(gesturePointersUtility); + } + + @Override + protected void tryCreateGestures(HitTestResult hitTestResult, MotionEvent motionEvent) { + int action = motionEvent.getActionMasked(); + int actionId = motionEvent.getPointerId(motionEvent.getActionIndex()); + boolean touchBegan = + action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_DOWN; + + if (touchBegan && !gesturePointersUtility.isPointerIdRetained(actionId)) { + gestures.add(new DragGesture(gesturePointersUtility, hitTestResult, motionEvent)); + } + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/FootprintSelectionVisualizer.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/FootprintSelectionVisualizer.java new file mode 100644 index 00000000..c811fd24 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/FootprintSelectionVisualizer.java @@ -0,0 +1,55 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.support.annotation.Nullable; +import com.google.ar.sceneform.Node; +import com.google.ar.sceneform.rendering.ModelRenderable; + +/** + * Visualizes that a {@link BaseTransformableNode} is selected by rendering a footprint for the + * selected node. + */ +public class FootprintSelectionVisualizer implements SelectionVisualizer { + private final Node footprintNode; + @Nullable private ModelRenderable footprintRenderable; + + public FootprintSelectionVisualizer() { + footprintNode = new Node(); + } + + public void setFootprintRenderable(ModelRenderable renderable) { + ModelRenderable copyRenderable = renderable.makeCopy(); + footprintNode.setRenderable(copyRenderable); + copyRenderable.setCollisionShape(null); + footprintRenderable = copyRenderable; + } + + @Nullable + public ModelRenderable getFootprintRenderable() { + return footprintRenderable; + } + + @Override + public void applySelectionVisual(BaseTransformableNode node) { + footprintNode.setParent(node); + } + + @Override + public void removeSelectionVisual(BaseTransformableNode node) { + footprintNode.setParent(null); + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/GesturePointersUtility.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/GesturePointersUtility.java new file mode 100644 index 00000000..b464724d --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/GesturePointersUtility.java @@ -0,0 +1,65 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.util.DisplayMetrics; +import android.util.TypedValue; +import android.view.MotionEvent; +import com.google.ar.sceneform.math.Vector3; +import java.util.HashSet; + +/** + * Retains/Releases pointer Ids so that each pointer can only be used in one gesture at a time. + * Provides helper functions for converting touch coordinates between pixels and inches. + */ +public class GesturePointersUtility { + private final DisplayMetrics displayMetrics; + private final HashSet retainedPointerIds; + + public GesturePointersUtility(DisplayMetrics displayMetrics) { + this.displayMetrics = displayMetrics; + retainedPointerIds = new HashSet<>(); + } + + public void retainPointerId(int pointerId) { + if (!isPointerIdRetained(pointerId)) { + retainedPointerIds.add(pointerId); + } + } + + public void releasePointerId(int pointerId) { + retainedPointerIds.remove(Integer.valueOf(pointerId)); + } + + public boolean isPointerIdRetained(int pointerId) { + return retainedPointerIds.contains(pointerId); + } + + public float inchesToPixels(float inches) { + return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, inches, displayMetrics); + } + + public float pixelsToInches(float pixels) { + float inchOfPixels = + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, 1.0f, displayMetrics); + return pixels / inchOfPixels; + } + + public static Vector3 motionEventToPosition(MotionEvent me, int pointerId) { + int index = me.findPointerIndex(pointerId); + return new Vector3(me.getX(index), me.getY(index), 0.0f); + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/HandMotionAnimation.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/HandMotionAnimation.java new file mode 100644 index 00000000..c81e15c4 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/HandMotionAnimation.java @@ -0,0 +1,58 @@ +/* + * Copyright 2018 Google LLC. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + */ +package com.google.ar.sceneform.ux; + +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.Transformation; + +/** This drives the AR hand motion animation. */ +public class HandMotionAnimation extends Animation { + private final View handImageView; + private final View containerView; + private static final float TWO_PI = (float) Math.PI * 2.0f; + private static final float HALF_PI = (float) Math.PI / 2.0f; + + public HandMotionAnimation(View containerView, View handImageView) { + this.handImageView = handImageView; + this.containerView = containerView; + + } + + @Override + protected void applyTransformation(float interpolatedTime, Transformation transformation) { + float startAngle = HALF_PI; + float progressAngle = TWO_PI * interpolatedTime; + float currentAngle = startAngle + progressAngle; + + float handWidth = handImageView.getWidth(); + float radius = handImageView.getResources().getDisplayMetrics().density * 25.0f; + + float xPos = radius * 2.0f * (float) Math.cos(currentAngle); + float yPos = radius * (float) Math.sin(currentAngle); + + xPos += containerView.getWidth() / 2.0f; + yPos += containerView.getHeight() / 2.0f; + + xPos -= handWidth / 2.0f; + yPos -= handImageView.getHeight() / 2.0f; + + // Position the hand. + handImageView.setX(xPos); + handImageView.setY(yPos); + + handImageView.invalidate(); + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/HandMotionView.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/HandMotionView.java new file mode 100644 index 00000000..fbb773ae --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/HandMotionView.java @@ -0,0 +1,53 @@ +/* + * Copyright 2018 Google LLC. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + */ +package com.google.ar.sceneform.ux; + +import android.app.Activity; +import android.content.Context; +import android.support.v7.widget.AppCompatImageView; +import android.util.AttributeSet; +import android.view.animation.Animation; +import android.widget.FrameLayout; + +/** This view contains the hand motion instructions with animation. */ +public class HandMotionView extends AppCompatImageView { + private HandMotionAnimation animation; + private static final long ANIMATION_SPEED_MS = 2500; + + public HandMotionView(Context context) { + super(context); + } + + public HandMotionView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + + clearAnimation(); + + FrameLayout container = + (FrameLayout) ((Activity) getContext()).findViewById(R.id.sceneform_hand_layout); + + animation = new HandMotionAnimation(container, this); + animation.setRepeatCount(Animation.INFINITE); + animation.setDuration(ANIMATION_SPEED_MS); + animation.setStartOffset(1000); + + startAnimation(animation); + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/PinchGesture.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/PinchGesture.java new file mode 100644 index 00000000..8061023b --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/PinchGesture.java @@ -0,0 +1,200 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.util.Log; +import android.view.MotionEvent; +import com.google.ar.sceneform.HitTestResult; +import com.google.ar.sceneform.math.Vector3; + +/** Gesture for when the user performs a two-finger pinch motion on the touch screen. */ +public class PinchGesture extends BaseGesture { + private static final String TAG = PinchGesture.class.getSimpleName(); + + /** Interface definition for callbacks to be invoked by a {@link PinchGesture}. */ + public interface OnGestureEventListener + extends BaseGesture.OnGestureEventListener {} + + private final int pointerId1; + private final int pointerId2; + private final Vector3 startPosition1; + private final Vector3 startPosition2; + private final Vector3 previousPosition1; + private final Vector3 previousPosition2; + private float gap; + private float gapDelta; + + private static final float SLOP_INCHES = 0.05f; + private static final float SLOP_MOTION_DIRECTION_DEGREES = 30.0f; + + private static final boolean PINCH_GESTURE_DEBUG = false; + + public PinchGesture( + GesturePointersUtility gesturePointersUtility, MotionEvent motionEvent, int pointerId2) { + super(gesturePointersUtility); + + pointerId1 = motionEvent.getPointerId(motionEvent.getActionIndex()); + this.pointerId2 = pointerId2; + startPosition1 = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId1); + startPosition2 = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId2); + previousPosition1 = new Vector3(startPosition1); + previousPosition2 = new Vector3(startPosition2); + debugLog("Created"); + } + + public float getGap() { + return gap; + } + + public float gapInches() { + return gesturePointersUtility.pixelsToInches(getGap()); + } + + public float getGapDelta() { + return gapDelta; + } + + public float gapDeltaInches() { + return gesturePointersUtility.pixelsToInches(getGapDelta()); + } + + @Override + protected boolean canStart(HitTestResult hitTestResult, MotionEvent motionEvent) { + if (gesturePointersUtility.isPointerIdRetained(pointerId1) + || gesturePointersUtility.isPointerIdRetained(pointerId2)) { + cancel(); + return false; + } + + int actionId = motionEvent.getPointerId(motionEvent.getActionIndex()); + int action = motionEvent.getActionMasked(); + + if (action == MotionEvent.ACTION_CANCEL) { + cancel(); + return false; + } + + boolean touchEnded = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP; + + if (touchEnded && (actionId == pointerId1 || actionId == pointerId2)) { + cancel(); + return false; + } + + if (action != MotionEvent.ACTION_MOVE) { + return false; + } + + Vector3 firstToSecond = Vector3.subtract(startPosition1, startPosition2); + Vector3 firstToSecondDirection = firstToSecond.normalized(); + + Vector3 newPosition1 = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId1); + Vector3 newPosition2 = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId2); + Vector3 deltaPosition1 = Vector3.subtract(newPosition1, previousPosition1); + Vector3 deltaPosition2 = Vector3.subtract(newPosition2, previousPosition2); + previousPosition1.set(newPosition1); + previousPosition2.set(newPosition2); + + float dot1 = Vector3.dot(deltaPosition1.normalized(), firstToSecondDirection.negated()); + float dot2 = Vector3.dot(deltaPosition2.normalized(), firstToSecondDirection); + float dotThreshold = (float) Math.cos(Math.toRadians(SLOP_MOTION_DIRECTION_DEGREES)); + + // Check angle of motion for the first touch. + if (!Vector3.equals(deltaPosition1, Vector3.zero()) && Math.abs(dot1) < dotThreshold) { + return false; + } + + // Check angle of motion for the second touch. + if (!Vector3.equals(deltaPosition2, Vector3.zero()) && Math.abs(dot2) < dotThreshold) { + return false; + } + + float startGap = firstToSecond.length(); + gap = Vector3.subtract(newPosition1, newPosition2).length(); + float separation = Math.abs(gap - startGap); + float slopPixels = gesturePointersUtility.inchesToPixels(SLOP_INCHES); + if (separation < slopPixels) { + return false; + } + + return true; + } + + @Override + protected void onStart(HitTestResult hitTestResult, MotionEvent motionEvent) { + debugLog("Started"); + gesturePointersUtility.retainPointerId(pointerId1); + gesturePointersUtility.retainPointerId(pointerId2); + } + + @Override + protected boolean updateGesture(HitTestResult hitTestResult, MotionEvent motionEvent) { + int actionId = motionEvent.getPointerId(motionEvent.getActionIndex()); + int action = motionEvent.getActionMasked(); + + if (action == MotionEvent.ACTION_CANCEL) { + cancel(); + return false; + } + + boolean touchEnded = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP; + + if (touchEnded && (actionId == pointerId1 || actionId == pointerId2)) { + complete(); + return false; + } + + if (action != MotionEvent.ACTION_MOVE) { + return false; + } + + Vector3 newPosition1 = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId1); + Vector3 newPosition2 = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId2); + float newGap = Vector3.subtract(newPosition1, newPosition2).length(); + + if (newGap == gap) { + return false; + } + + gapDelta = newGap - gap; + gap = newGap; + debugLog("Update: " + gapDelta); + return true; + } + + @Override + protected void onCancel() { + debugLog("Cancelled"); + } + + @Override + protected void onFinish() { + debugLog("Finished"); + gesturePointersUtility.releasePointerId(pointerId1); + gesturePointersUtility.releasePointerId(pointerId2); + } + + @Override + protected PinchGesture getSelf() { + return this; + } + + private static void debugLog(String log) { + if (PINCH_GESTURE_DEBUG) { + Log.d(TAG, "PinchGesture:[" + log + "]"); + } + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/PinchGestureRecognizer.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/PinchGestureRecognizer.java new file mode 100644 index 00000000..d7da3107 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/PinchGestureRecognizer.java @@ -0,0 +1,61 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.view.MotionEvent; +import com.google.ar.sceneform.HitTestResult; + +/** Gesture Recognizer for when the user performs a two-finger pinch motion on the touch screen. */ +public class PinchGestureRecognizer extends BaseGestureRecognizer { + /** Interface definition for a callbacks to be invoked when a {@link PinchGesture} starts. */ + public interface OnGestureStartedListener + extends BaseGestureRecognizer.OnGestureStartedListener {} + + public PinchGestureRecognizer(GesturePointersUtility gesturePointersUtility) { + super(gesturePointersUtility); + } + + @Override + protected void tryCreateGestures(HitTestResult hitTestResult, MotionEvent motionEvent) { + // Pinch gestures require at least two fingers to be touching. + if (motionEvent.getPointerCount() < 2) { + return; + } + + int actionId = motionEvent.getPointerId(motionEvent.getActionIndex()); + int action = motionEvent.getActionMasked(); + boolean touchBegan = + action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_DOWN; + + if (!touchBegan || gesturePointersUtility.isPointerIdRetained(actionId)) { + return; + } + + // Determine if there is another pointer Id that has not yet been retained. + for (int i = 0; i < motionEvent.getPointerCount(); i++) { + int pointerId = motionEvent.getPointerId(i); + if (pointerId == actionId) { + continue; + } + + if (gesturePointersUtility.isPointerIdRetained(pointerId)) { + continue; + } + + gestures.add(new PinchGesture(gesturePointersUtility, motionEvent, pointerId)); + } + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/PlaneDiscoveryController.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/PlaneDiscoveryController.java new file mode 100644 index 00000000..7a24a1e6 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/PlaneDiscoveryController.java @@ -0,0 +1,54 @@ +/* + * Copyright 2018 Google LLC. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.support.annotation.Nullable; +import android.view.View; + +/** + * This view manages showing the plane discovery instructions view. You can assign into the + * planeDiscoveryView to override the default visual, or assign null to remove it. + */ +public class PlaneDiscoveryController { + private @Nullable View planeDiscoveryView; + + public PlaneDiscoveryController(@Nullable View planeDiscoveryView) { + this.planeDiscoveryView = planeDiscoveryView; + } + + /** Set the instructions view to present over the Sceneform view. */ + public void setInstructionView(View view) { + planeDiscoveryView = view; + } + + /** Show the plane discovery UX instructions for finding a plane. */ + public void show() { + if (planeDiscoveryView == null) { + return; + } + + planeDiscoveryView.setVisibility(View.VISIBLE); + } + + /** Hide the plane discovery UX instructions. */ + public void hide() { + if (planeDiscoveryView == null) { + return; + } + + planeDiscoveryView.setVisibility(View.GONE); + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/RotationController.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/RotationController.java new file mode 100644 index 00000000..a7761cd6 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/RotationController.java @@ -0,0 +1,59 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import com.google.ar.sceneform.math.Quaternion; +import com.google.ar.sceneform.math.Vector3; + +/** + * Manipulates the rotation of a {@link BaseTransformableNode} using a {@link + * TwistGestureRecognizer}. + */ +public class RotationController extends BaseTransformationController { + + // Rate that the node rotates in degrees per degree of twisting. + private float rotationRateDegrees = 2.5f; + + public RotationController( + BaseTransformableNode transformableNode, TwistGestureRecognizer gestureRecognizer) { + super(transformableNode, gestureRecognizer); + } + + public void setRotationRateDegrees(float rotationRateDegrees) { + this.rotationRateDegrees = rotationRateDegrees; + } + + public float getRotationRateDegrees() { + return rotationRateDegrees; + } + + @Override + public boolean canStartTransformation(TwistGesture gesture) { + return getTransformableNode().isSelected(); + } + + @Override + public void onContinueTransformation(TwistGesture gesture) { + float rotationAmount = -gesture.getDeltaRotationDegrees() * rotationRateDegrees; + Quaternion rotationDelta = new Quaternion(Vector3.up(), rotationAmount); + Quaternion localrotation = getTransformableNode().getLocalRotation(); + localrotation = Quaternion.multiply(localrotation, rotationDelta); + getTransformableNode().setLocalRotation(localrotation); + } + + @Override + public void onEndTransformation(TwistGesture gesture) {} +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/ScaleController.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/ScaleController.java new file mode 100644 index 00000000..cf2d2af5 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/ScaleController.java @@ -0,0 +1,155 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import com.google.ar.sceneform.FrameTime; +import com.google.ar.sceneform.Node; +import com.google.ar.sceneform.math.MathHelper; +import com.google.ar.sceneform.math.Vector3; + +/** + * Manipulates the Scale of a {@link BaseTransformableNode} using a Pinch {@link + * PinchGestureRecognizer}. Applies a tunable elastic bounce-back when scaling the {@link + * BaseTransformableNode} beyond the min/max scale. + */ +public class ScaleController extends BaseTransformationController { + public static final float DEFAULT_MIN_SCALE = 0.75f; + public static final float DEFAULT_MAX_SCALE = 1.75f; + public static final float DEFAULT_SENSITIVITY = 0.75f; + public static final float DEFAULT_ELASTICITY = 0.15f; + + private float minScale = DEFAULT_MIN_SCALE; + private float maxScale = DEFAULT_MAX_SCALE; + private float sensitivity = DEFAULT_SENSITIVITY; + private float elasticity = DEFAULT_ELASTICITY; + + private float currentScaleRatio; + + private static final float ELASTIC_RATIO_LIMIT = 0.8f; + private static final float LERP_SPEED = 8.0f; + + public ScaleController( + BaseTransformableNode transformableNode, PinchGestureRecognizer gestureRecognizer) { + super(transformableNode, gestureRecognizer); + } + + public void setMinScale(float minScale) { + this.minScale = minScale; + } + + public float getMinScale() { + return minScale; + } + + public void setMaxScale(float maxScale) { + this.maxScale = maxScale; + } + + public float getMaxScale() { + return maxScale; + } + + public void setSensitivity(float sensitivity) { + this.sensitivity = sensitivity; + } + + public float getSensitivity() { + return sensitivity; + } + + public void setElasticity(float elasticity) { + this.elasticity = elasticity; + } + + public float getElasticity() { + return elasticity; + } + + @Override + public void onActivated(Node node) { + super.onActivated(node); + Vector3 scale = getTransformableNode().getLocalScale(); + currentScaleRatio = (scale.x - minScale) / getScaleDelta(); + } + + @Override + public void onUpdated(Node node, FrameTime frameTime) { + if (isTransforming()) { + return; + } + + float t = MathHelper.clamp(frameTime.getDeltaSeconds() * LERP_SPEED, 0, 1); + currentScaleRatio = MathHelper.lerp(currentScaleRatio, getClampedScaleRatio(), t); + float finalScaleValue = getFinalScale(); + Vector3 finalScale = new Vector3(finalScaleValue, finalScaleValue, finalScaleValue); + getTransformableNode().setLocalScale(finalScale); + } + + @Override + public boolean canStartTransformation(PinchGesture gesture) { + return getTransformableNode().isSelected(); + } + + @Override + public void onContinueTransformation(PinchGesture gesture) { + currentScaleRatio += gesture.gapDeltaInches() * sensitivity; + + float finalScaleValue = getFinalScale(); + Vector3 finalScale = new Vector3(finalScaleValue, finalScaleValue, finalScaleValue); + getTransformableNode().setLocalScale(finalScale); + + if (currentScaleRatio < -ELASTIC_RATIO_LIMIT + || currentScaleRatio > (1.0f + ELASTIC_RATIO_LIMIT)) { + gesture.cancel(); + } + } + + @Override + public void onEndTransformation(PinchGesture gesture) {} + + private float getScaleDelta() { + float scaleDelta = maxScale - minScale; + + if (scaleDelta <= 0.0f) { + throw new IllegalStateException("maxScale must be greater than minScale."); + } + + return scaleDelta; + } + + private float getClampedScaleRatio() { + return Math.min(1.0f, Math.max(0.0f, currentScaleRatio)); + } + + private float getFinalScale() { + float elasticScaleRatio = getClampedScaleRatio() + getElasticDelta(); + float elasticScale = minScale + elasticScaleRatio * getScaleDelta(); + return elasticScale; + } + + private float getElasticDelta() { + float overRatio; + if (currentScaleRatio > 1.0f) { + overRatio = currentScaleRatio - 1.0f; + } else if (currentScaleRatio < 0.0f) { + overRatio = currentScaleRatio; + } else { + return 0.0f; + } + + return (1.0f - (1.0f / ((Math.abs(overRatio) * elasticity) + 1.0f))) * Math.signum(overRatio); + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/SelectionVisualizer.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/SelectionVisualizer.java new file mode 100644 index 00000000..a34acbd7 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/SelectionVisualizer.java @@ -0,0 +1,28 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +/** Interface to visual when a {@link BaseTransformableNode} is selected. */ +public interface SelectionVisualizer { + + /** Adds a visual that indicates a {@link BaseTransformableNode} is currently selected. */ + void applySelectionVisual(BaseTransformableNode node); + + /** + * Removes the visual that was indicating a {@link BaseTransformableNode} is currently selected. + */ + void removeSelectionVisual(BaseTransformableNode node); +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TransformableNode.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TransformableNode.java new file mode 100644 index 00000000..8ff935e8 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TransformableNode.java @@ -0,0 +1,56 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +/** + * Node that can be selected, translated, rotated, and scaled using gestures from {@link + * TransformationSystem}. + */ +public class TransformableNode extends BaseTransformableNode { + private final TranslationController translationController; + private final ScaleController scaleController; + private final RotationController rotationController; + + @SuppressWarnings("initialization") // Suppress @UnderInitialization warning. + public TransformableNode(TransformationSystem transformationSystem) { + super(transformationSystem); + + translationController = + new TranslationController(this, transformationSystem.getDragRecognizer()); + addTransformationController(translationController); + + scaleController = new ScaleController(this, transformationSystem.getPinchRecognizer()); + addTransformationController(scaleController); + + rotationController = new RotationController(this, transformationSystem.getTwistRecognizer()); + addTransformationController(rotationController); + } + + /** Returns the controller that translates this node using a drag gesture. */ + public TranslationController getTranslationController() { + return translationController; + } + + /** Returns the controller that scales this node using a pinch gesture. */ + public ScaleController getScaleController() { + return scaleController; + } + + /** Returns the controller that rotates this node using a twist gesture. */ + public RotationController getRotationController() { + return rotationController; + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TransformationGestureDetector.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TransformationGestureDetector.java new file mode 100644 index 00000000..68dd31ca --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TransformationGestureDetector.java @@ -0,0 +1,36 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.view.MotionEvent; +import com.google.ar.sceneform.HitTestResult; + +/** + * Detects various gestures used for transforming the position, rotation, and scale of Nodes. + * + * @deprecated Will be removed in release 1.6. Functionality has been merged into {@link + * TransformationSystem}. + */ +@Deprecated +public interface TransformationGestureDetector { + DragGestureRecognizer getDragRecognizer(); + + PinchGestureRecognizer getPinchRecognizer(); + + TwistGestureRecognizer getTwistRecognizer(); + + void onTouch(HitTestResult hitTestResult, MotionEvent motionEvent); +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TransformationSystem.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TransformationSystem.java new file mode 100644 index 00000000..e8f385dc --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TransformationSystem.java @@ -0,0 +1,197 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.support.annotation.Nullable; +import android.util.DisplayMetrics; +import android.view.MotionEvent; +import com.google.ar.sceneform.HitTestResult; +import java.util.ArrayList; + +/** + * Coordinates which {@link BaseTransformableNode} is currently selected. Also, detects various + * gestures used by the transformation controls of {@link BaseTransformableNode}. + * + *

{@link #onTouch(HitTestResult, MotionEvent)} must be called for gestures to be detected. By + * default, this is done automatically by {@link ArFragment}. + */ +public class TransformationSystem implements TransformationGestureDetector { + private final GesturePointersUtility gesturePointersUtility; + + private final DragGestureRecognizer dragGestureRecognizer; + private final PinchGestureRecognizer pinchGestureRecognizer; + private final TwistGestureRecognizer twistGestureRecognizer; + + private final ArrayList> recognizers = new ArrayList<>(); + + private SelectionVisualizer selectionVisualizer; + + @Nullable private BaseTransformableNode selectedNode; + + @SuppressWarnings("initialization") + public TransformationSystem( + DisplayMetrics displayMetrics, SelectionVisualizer selectionVisualizer) { + this.selectionVisualizer = selectionVisualizer; + + gesturePointersUtility = new GesturePointersUtility(displayMetrics); + + dragGestureRecognizer = new DragGestureRecognizer(gesturePointersUtility); + addGestureRecognizer(dragGestureRecognizer); + + pinchGestureRecognizer = new PinchGestureRecognizer(gesturePointersUtility); + addGestureRecognizer(pinchGestureRecognizer); + + twistGestureRecognizer = new TwistGestureRecognizer(gesturePointersUtility); + addGestureRecognizer(twistGestureRecognizer); + } + + /** + * Sets the selection visualizer used to visualize which {@link BaseTransformableNode} is + * currently selected. If there is already a selected node, then the old selection visual is + * removed and the new one is applied immediately. + */ + public void setSelectionVisualizer(SelectionVisualizer selectionVisualizer) { + if (selectedNode != null) { + this.selectionVisualizer.removeSelectionVisual(selectedNode); + } + + this.selectionVisualizer = selectionVisualizer; + + if (selectedNode != null) { + this.selectionVisualizer.applySelectionVisual(selectedNode); + } + } + + /** + * Gets the selection visualizer used to visualize which {@link BaseTransformableNode} is + * currently selected. + */ + public SelectionVisualizer getSelectionVisualizer() { + return selectionVisualizer; + } + + /** + * @deprecated Will be removed in release 1.6. Functionality has been merged into {@link + * TransformationSystem}. + */ + @Deprecated + public TransformationGestureDetector getGestureDetector() { + return this; + } + + /** + * Gets the utility used by {@link BaseGestureRecognizer} subclasses to retain/release pointer Ids + * so that each pointer can only be used in one gesture at a time. + */ + public GesturePointersUtility getGesturePointersUtility() { + return gesturePointersUtility; + } + + /** + * Gets the gesture recognizer for determining when the user performs a drag motion on the touch + * screen. + */ + @Override + public DragGestureRecognizer getDragRecognizer() { + return dragGestureRecognizer; + } + + /** + * Gets the gesture recognizer for determining when the user performs a two-finger pinch motion on + * the touch screen. + */ + @Override + public PinchGestureRecognizer getPinchRecognizer() { + return pinchGestureRecognizer; + } + + /** + * Gets the gesture recognizer for determining when the user performs a two-finger twist motion on + * the touch screen. + */ + @Override + public TwistGestureRecognizer getTwistRecognizer() { + return twistGestureRecognizer; + } + + /** + * Adds a gesture recognizer to this transformation system. Touch events will be dispatched to the + * recognizer when {@link #onTouch(HitTestResult, MotionEvent)} is called. + */ + public void addGestureRecognizer(BaseGestureRecognizer gestureRecognizer) { + recognizers.add(gestureRecognizer); + } + + /** + * Gets the currently selected node. Only the currently selected node can be transformed. Nodes + * are selected automatically when they are tapped, or when the user begins to translate the node + * with a drag gesture. + */ + @Nullable + public BaseTransformableNode getSelectedNode() { + return selectedNode; + } + + /** + * Sets a {@link BaseTransformableNode} as the selected node if there is no currently selected + * node or if the currently selected node is not actively being transformed. If null, then + * deselects the currently selected node if the node is not transforming. + * + * @see BaseTransformableNode#isTransforming + * @return true if the node was successfully selected + */ + public boolean selectNode(@Nullable BaseTransformableNode node) { + if (!deselectNode()) { + return false; + } + + if (node != null) { + selectedNode = node; + selectionVisualizer.applySelectionVisual(selectedNode); + } + + return true; + } + + /** Dispatches touch events to the gesture recognizers contained by this transformation system. */ + @Override + public void onTouch(HitTestResult hitTestResult, MotionEvent motionEvent) { + for (int i = 0; i < recognizers.size(); i++) { + recognizers.get(i).onTouch(hitTestResult, motionEvent); + } + } + + /** + * Deselects the currently selected node if the node is not currently transforming. + * + * @see BaseTransformableNode#isTransforming + * @return true if the node was successfully deselected + */ + private boolean deselectNode() { + if (selectedNode == null) { + return true; + } + + if (selectedNode.isTransforming()) { + return false; + } + + selectionVisualizer.removeSelectionVisual(selectedNode); + selectedNode = null; + + return true; + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TranslationController.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TranslationController.java new file mode 100644 index 00000000..9a1e1b7e --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TranslationController.java @@ -0,0 +1,277 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.support.annotation.Nullable; +import com.google.ar.core.Anchor; +import com.google.ar.core.Camera; +import com.google.ar.core.Frame; +import com.google.ar.core.HitResult; +import com.google.ar.core.Plane; +import com.google.ar.core.Pose; +import com.google.ar.core.Trackable; +import com.google.ar.core.TrackingState; +import com.google.ar.sceneform.AnchorNode; +import com.google.ar.sceneform.ArSceneView; +import com.google.ar.sceneform.FrameTime; +import com.google.ar.sceneform.Node; +import com.google.ar.sceneform.Scene; +import com.google.ar.sceneform.math.MathHelper; +import com.google.ar.sceneform.math.Quaternion; +import com.google.ar.sceneform.math.Vector3; +import com.google.ar.sceneform.utilities.Preconditions; +import java.util.EnumSet; +import java.util.List; + +/** + * Manipulates the position of a {@link BaseTransformableNode} using a {@link + * DragGestureRecognizer}. If not selected, the {@link BaseTransformableNode} will become selected + * when the {@link DragGesture} starts. + */ +public class TranslationController extends BaseTransformationController { + @Nullable private HitResult lastArHitResult; + @Nullable private Vector3 desiredLocalPosition; + @Nullable private Quaternion desiredLocalRotation; + + private final Vector3 initialForwardInLocal = new Vector3(); + + private EnumSet allowedPlaneTypes = EnumSet.allOf(Plane.Type.class); + + private static final float LERP_SPEED = 12.0f; + private static final float POSITION_LENGTH_THRESHOLD = 0.01f; + private static final float ROTATION_DOT_THRESHOLD = 0.99f; + + public TranslationController( + BaseTransformableNode transformableNode, DragGestureRecognizer gestureRecognizer) { + super(transformableNode, gestureRecognizer); + } + + /** Sets which types of ArCore Planes this TranslationController is allowed to translate on. */ + public void setAllowedPlaneTypes(EnumSet allowedPlaneTypes) { + this.allowedPlaneTypes = allowedPlaneTypes; + } + + /** + * Gets a reference to the EnumSet that determines which types of ArCore Planes this + * TranslationController is allowed to translate on. + */ + public EnumSet getAllowedPlaneTypes() { + return allowedPlaneTypes; + } + + @Override + public void onUpdated(Node node, FrameTime frameTime) { + updatePosition(frameTime); + updateRotation(frameTime); + } + + @Override + public boolean isTransforming() { + // As long as the transformable node is still interpolating towards the final pose, this + // controller is still transforming. + return super.isTransforming() || desiredLocalRotation != null || desiredLocalPosition != null; + } + + @Override + public boolean canStartTransformation(DragGesture gesture) { + Node targetNode = gesture.getTargetNode(); + if (targetNode == null) { + return false; + } + + BaseTransformableNode transformableNode = getTransformableNode(); + if (targetNode != transformableNode && !targetNode.isDescendantOf(transformableNode)) { + return false; + } + + if (!transformableNode.isSelected() && !transformableNode.select()) { + return false; + } + + Vector3 initialForwardInWorld = transformableNode.getForward(); + Node parent = transformableNode.getParent(); + if (parent != null) { + initialForwardInLocal.set(parent.worldToLocalDirection(initialForwardInWorld)); + } else { + initialForwardInLocal.set(initialForwardInWorld); + } + + return true; + } + + @Override + public void onContinueTransformation(DragGesture gesture) { + Scene scene = getTransformableNode().getScene(); + if (scene == null) { + return; + } + + Frame frame = ((ArSceneView) scene.getView()).getArFrame(); + if (frame == null) { + return; + } + + Camera arCamera = frame.getCamera(); + if (arCamera.getTrackingState() != TrackingState.TRACKING) { + return; + } + + Vector3 position = gesture.getPosition(); + List hitResultList = frame.hitTest(position.x, position.y); + for (int i = 0; i < hitResultList.size(); i++) { + HitResult hit = hitResultList.get(i); + Trackable trackable = hit.getTrackable(); + Pose pose = hit.getHitPose(); + if (trackable instanceof Plane) { + Plane plane = (Plane) trackable; + if (plane.isPoseInPolygon(pose) && allowedPlaneTypes.contains(plane.getType())) { + desiredLocalPosition = new Vector3(pose.tx(), pose.ty(), pose.tz()); + desiredLocalRotation = new Quaternion(pose.qx(), pose.qy(), pose.qz(), pose.qw()); + Node parent = getTransformableNode().getParent(); + if (parent != null && desiredLocalPosition != null && desiredLocalRotation != null) { + desiredLocalPosition = parent.worldToLocalPoint(desiredLocalPosition); + desiredLocalRotation = + Quaternion.multiply( + parent.getWorldRotation().inverted(), + Preconditions.checkNotNull(desiredLocalRotation)); + } + + desiredLocalRotation = + calculateFinalDesiredLocalRotation(Preconditions.checkNotNull(desiredLocalRotation)); + lastArHitResult = hit; + break; + } + } + } + } + + @Override + public void onEndTransformation(DragGesture gesture) { + HitResult hitResult = lastArHitResult; + if (hitResult == null) { + return; + } + + if (hitResult.getTrackable().getTrackingState() == TrackingState.TRACKING) { + AnchorNode anchorNode = getAnchorNodeOrDie(); + + Anchor oldAnchor = anchorNode.getAnchor(); + if (oldAnchor != null) { + oldAnchor.detach(); + } + + Anchor newAnchor = hitResult.createAnchor(); + + Vector3 worldPosition = getTransformableNode().getWorldPosition(); + Quaternion worldRotation = getTransformableNode().getWorldRotation(); + Quaternion finalDesiredWorldRotation = worldRotation; + + // Since we change the anchor, we need to update the initialForwardInLocal into the new + // coordinate space. Local variable for nullness analysis. + Quaternion desiredLocalRotation = this.desiredLocalRotation; + if (desiredLocalRotation != null) { + getTransformableNode().setLocalRotation(desiredLocalRotation); + finalDesiredWorldRotation = getTransformableNode().getWorldRotation(); + } + + anchorNode.setAnchor(newAnchor); + + // Temporarily set the node to the final world rotation so that we can accurately + // determine the initialForwardInLocal in the new coordinate space. + getTransformableNode().setWorldRotation(finalDesiredWorldRotation); + Vector3 initialForwardInWorld = getTransformableNode().getForward(); + initialForwardInLocal.set(anchorNode.worldToLocalDirection(initialForwardInWorld)); + + getTransformableNode().setWorldRotation(worldRotation); + getTransformableNode().setWorldPosition(worldPosition); + } + + desiredLocalPosition = Vector3.zero(); + desiredLocalRotation = calculateFinalDesiredLocalRotation(Quaternion.identity()); + } + + private AnchorNode getAnchorNodeOrDie() { + Node parent = getTransformableNode().getParent(); + if (!(parent instanceof AnchorNode)) { + throw new IllegalStateException("TransformableNode must have an AnchorNode as a parent."); + } + + return (AnchorNode) parent; + } + + private void updatePosition(FrameTime frameTime) { + // Store in local variable for nullness static analysis. + Vector3 desiredLocalPosition = this.desiredLocalPosition; + if (desiredLocalPosition == null) { + return; + } + + Vector3 localPosition = getTransformableNode().getLocalPosition(); + float lerpFactor = MathHelper.clamp(frameTime.getDeltaSeconds() * LERP_SPEED, 0, 1); + localPosition = Vector3.lerp(localPosition, desiredLocalPosition, lerpFactor); + + float lengthDiff = Math.abs(Vector3.subtract(desiredLocalPosition, localPosition).length()); + if (lengthDiff <= POSITION_LENGTH_THRESHOLD) { + localPosition = desiredLocalPosition; + this.desiredLocalPosition = null; + } + + getTransformableNode().setLocalPosition(localPosition); + } + + private void updateRotation(FrameTime frameTime) { + // Store in local variable for nullness static analysis. + Quaternion desiredLocalRotation = this.desiredLocalRotation; + if (desiredLocalRotation == null) { + return; + } + + Quaternion localRotation = getTransformableNode().getLocalRotation(); + float lerpFactor = MathHelper.clamp(frameTime.getDeltaSeconds() * LERP_SPEED, 0, 1); + localRotation = Quaternion.slerp(localRotation, desiredLocalRotation, lerpFactor); + + float dot = Math.abs(dotQuaternion(localRotation, desiredLocalRotation)); + if (dot >= ROTATION_DOT_THRESHOLD) { + localRotation = desiredLocalRotation; + this.desiredLocalRotation = null; + } + + getTransformableNode().setLocalRotation(localRotation); + } + + /** + * When translating, the up direction of the node must match the up direction of the plane from + * the hit result. However, we also need to make sure that the original forward direction of the + * node is respected. + */ + private Quaternion calculateFinalDesiredLocalRotation(Quaternion desiredLocalRotation) { + // Get a rotation just to the up direction. + // Otherwise, the node will spin around as you rotate. + Vector3 rotatedUp = Quaternion.rotateVector(desiredLocalRotation, Vector3.up()); + desiredLocalRotation = Quaternion.rotationBetweenVectors(Vector3.up(), rotatedUp); + + // Adjust the rotation to make sure the node maintains the same forward direction. + Quaternion forwardInLocal = + Quaternion.rotationBetweenVectors(Vector3.forward(), initialForwardInLocal); + desiredLocalRotation = Quaternion.multiply(desiredLocalRotation, forwardInLocal); + + return desiredLocalRotation.normalized(); + } + + private static float dotQuaternion(Quaternion lhs, Quaternion rhs) { + return lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w; + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TwistGesture.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TwistGesture.java new file mode 100644 index 00000000..99d0f3a3 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TwistGesture.java @@ -0,0 +1,182 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.util.Log; +import android.view.MotionEvent; +import com.google.ar.sceneform.HitTestResult; +import com.google.ar.sceneform.math.Vector3; + +/** Gesture for when the user performs a two-finger twist motion on the touch screen. */ +public class TwistGesture extends BaseGesture { + private static final String TAG = TwistGesture.class.getSimpleName(); + + /** Interface definition for callbacks to be invoked by a {@link TwistGesture}. */ + public interface OnGestureEventListener + extends BaseGesture.OnGestureEventListener {} + + private static final boolean TWIST_GESTURE_DEBUG = false; + + private final int pointerId1; + private final int pointerId2; + private final Vector3 startPosition1; + private final Vector3 startPosition2; + private final Vector3 previousPosition1; + private final Vector3 previousPosition2; + private float deltaRotationDegrees; + + private static final float SLOP_ROTATION_DEGREES = 15.0f; + + public TwistGesture( + GesturePointersUtility gesturePointersUtility, MotionEvent motionEvent, int pointerId2) { + super(gesturePointersUtility); + + pointerId1 = motionEvent.getPointerId(motionEvent.getActionIndex()); + this.pointerId2 = pointerId2; + startPosition1 = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId1); + startPosition2 = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId2); + previousPosition1 = new Vector3(startPosition1); + previousPosition2 = new Vector3(startPosition2); + debugLog("Created"); + } + + public float getDeltaRotationDegrees() { + return deltaRotationDegrees; + } + + @Override + protected boolean canStart(HitTestResult hitTestResult, MotionEvent motionEvent) { + if (gesturePointersUtility.isPointerIdRetained(pointerId1) + || gesturePointersUtility.isPointerIdRetained(pointerId2)) { + cancel(); + return false; + } + + int actionId = motionEvent.getPointerId(motionEvent.getActionIndex()); + int action = motionEvent.getActionMasked(); + + if (action == MotionEvent.ACTION_CANCEL) { + cancel(); + return false; + } + + boolean touchEnded = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP; + + if (touchEnded && (actionId == pointerId1 || actionId == pointerId2)) { + cancel(); + return false; + } + + if (action != MotionEvent.ACTION_MOVE) { + return false; + } + + Vector3 newPosition1 = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId1); + Vector3 newPosition2 = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId2); + Vector3 deltaPosition1 = Vector3.subtract(newPosition1, previousPosition1); + Vector3 deltaPosition2 = Vector3.subtract(newPosition2, previousPosition2); + previousPosition1.set(newPosition1); + previousPosition2.set(newPosition2); + + // Check that both fingers are moving. + if (Vector3.equals(deltaPosition1, Vector3.zero()) + || Vector3.equals(deltaPosition2, Vector3.zero())) { + return false; + } + + float rotation = + calculateDeltaRotation(newPosition1, newPosition2, startPosition1, startPosition2); + if (Math.abs(rotation) < SLOP_ROTATION_DEGREES) { + return false; + } + + return true; + } + + @Override + protected void onStart(HitTestResult hitTestResult, MotionEvent motionEvent) { + debugLog("Started"); + gesturePointersUtility.retainPointerId(pointerId1); + gesturePointersUtility.retainPointerId(pointerId2); + } + + @Override + protected boolean updateGesture(HitTestResult hitTestResult, MotionEvent motionEvent) { + int actionId = motionEvent.getPointerId(motionEvent.getActionIndex()); + int action = motionEvent.getActionMasked(); + + if (action == MotionEvent.ACTION_CANCEL) { + cancel(); + return false; + } + + boolean touchEnded = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP; + + if (touchEnded && (actionId == pointerId1 || actionId == pointerId2)) { + complete(); + return false; + } + + if (action != MotionEvent.ACTION_MOVE) { + return false; + } + + Vector3 newPosition1 = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId1); + Vector3 newPosition2 = GesturePointersUtility.motionEventToPosition(motionEvent, pointerId2); + deltaRotationDegrees = + calculateDeltaRotation(newPosition1, newPosition2, previousPosition1, previousPosition2); + previousPosition1.set(newPosition1); + previousPosition2.set(newPosition2); + debugLog("Update: " + deltaRotationDegrees); + return true; + } + + @Override + protected void onCancel() { + debugLog("Cancelled"); + } + + @Override + protected void onFinish() { + debugLog("Finished"); + gesturePointersUtility.releasePointerId(pointerId1); + gesturePointersUtility.releasePointerId(pointerId2); + } + + @Override + protected TwistGesture getSelf() { + return this; + } + + private static void debugLog(String log) { + if (TWIST_GESTURE_DEBUG) { + Log.d(TAG, "TwistGesture:[" + log + "]"); + } + } + + private static float calculateDeltaRotation( + Vector3 currentPosition1, + Vector3 currentPosition2, + Vector3 previousPosition1, + Vector3 previousPosition2) { + Vector3 currentDirection = Vector3.subtract(currentPosition1, currentPosition2).normalized(); + Vector3 previousDirection = Vector3.subtract(previousPosition1, previousPosition2).normalized(); + float sign = + Math.signum( + previousDirection.x * currentDirection.y - previousDirection.y * currentDirection.x); + return Vector3.angleBetweenVectors(currentDirection, previousDirection) * sign; + } +} diff --git a/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TwistGestureRecognizer.java b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TwistGestureRecognizer.java new file mode 100644 index 00000000..ad7a59d2 --- /dev/null +++ b/sceneformux/ux/src/main/java/com/google/ar/sceneform/ux/TwistGestureRecognizer.java @@ -0,0 +1,61 @@ +/* + * Copyright 2018 Google LLC All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.ar.sceneform.ux; + +import android.view.MotionEvent; +import com.google.ar.sceneform.HitTestResult; + +/** Gesture Recognizer for when the user performs a two-finger twist motion on the touch screen. */ +public class TwistGestureRecognizer extends BaseGestureRecognizer { + /** Interface definition for a callbacks to be invoked when a {@link TwistGesture} starts. */ + public interface OnGestureStartedListener + extends BaseGestureRecognizer.OnGestureStartedListener {} + + public TwistGestureRecognizer(GesturePointersUtility gesturePointersUtility) { + super(gesturePointersUtility); + } + + @Override + protected void tryCreateGestures(HitTestResult hitTestResult, MotionEvent motionEvent) { + // Twist gestures require at least two fingers to be touching. + if (motionEvent.getPointerCount() < 2) { + return; + } + + int actionId = motionEvent.getPointerId(motionEvent.getActionIndex()); + int action = motionEvent.getActionMasked(); + boolean touchBegan = + action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_DOWN; + + if (!touchBegan || gesturePointersUtility.isPointerIdRetained(actionId)) { + return; + } + + // Determine if there is another pointer Id that has not yet been retained. + for (int i = 0; i < motionEvent.getPointerCount(); i++) { + int pointerId = motionEvent.getPointerId(i); + if (pointerId == actionId) { + continue; + } + + if (gesturePointersUtility.isPointerIdRetained(pointerId)) { + continue; + } + + gestures.add(new TwistGesture(gesturePointersUtility, motionEvent, pointerId)); + } + } +} diff --git a/sceneformux/ux/src/main/res/drawable/sceneform_hand_phone.png b/sceneformux/ux/src/main/res/drawable/sceneform_hand_phone.png new file mode 100644 index 0000000000000000000000000000000000000000..56087324d4fea634cf82e3b4b304e3181ce71eb3 GIT binary patch literal 3544 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 Qzjw@7-$JiZ$0hE60gwPg3IG5A literal 0 HcmV?d00001 diff --git a/sceneformux/ux/src/main/res/layout/sceneform_plane_discovery_layout.xml b/sceneformux/ux/src/main/res/layout/sceneform_plane_discovery_layout.xml new file mode 100644 index 00000000..1568b35b --- /dev/null +++ b/sceneformux/ux/src/main/res/layout/sceneform_plane_discovery_layout.xml @@ -0,0 +1,32 @@ + + + + + + diff --git a/sceneformux/ux/src/main/res/layout/sceneform_ux_fragment_layout.xml b/sceneformux/ux/src/main/res/layout/sceneform_ux_fragment_layout.xml new file mode 100644 index 00000000..3b8dca73 --- /dev/null +++ b/sceneformux/ux/src/main/res/layout/sceneform_ux_fragment_layout.xml @@ -0,0 +1,27 @@ + + + + + + diff --git a/sceneformux/wrapper/gradle-wrapper.properties b/sceneformux/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..c62161eb --- /dev/null +++ b/sceneformux/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Nov 20 10:27:45 PST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/solarsystem/app/sampledata/models/Earth/Earth.sfa b/solarsystem/app/sampledata/models/Earth/Earth.sfa deleted file mode 100644 index 5addcd23..00000000 --- a/solarsystem/app/sampledata/models/Earth/Earth.sfa +++ /dev/null @@ -1,155 +0,0 @@ -{ - materials: [ - { - name: "Earth_Clouds_mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Earth_Clouds_mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 1, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - { - name: "Earth_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Earth_Mat_baseColor", - }, - { - normal: "Earth_Mat_normal", - }, - { - metallicFactor: 1, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: "Earth_Mat_occlusionRoughnessMetallic", - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - ], - model: { - attributes: [ - "Position", - "TexCoord", - "Orientation", - ], - file: "sampledata/models/Earth/Earth.gltf", - name: "Earth", - scale: 0.5, - recenter: true, - suggested_collision: { - center: { - x: 0, - y: 0, - z: 0, - }, - size: { - x: 1, - y: 1, - z: 1, - }, - type: "Box", - }, - }, - samplers: [ - { - file: "sampledata/models/Earth/Earth_Mat_occlusionRoughnessMetallic.png", - name: "Earth_Mat_occlusionRoughnessMetallic", - params: { - usage_type: "Data", - }, - pipeline_name: "Earth_Mat_occlusionRoughnessMetallic.png", - }, - { - file: "sampledata/models/Earth/Earth_Mat_normal.png", - name: "Earth_Mat_normal", - params: { - usage_type: "Normal", - }, - pipeline_name: "Earth_Mat_normal.png", - }, - { - file: "sampledata/models/Earth/Earth_Mat_baseColor.png", - name: "Earth_Mat_baseColor", - pipeline_name: "Earth_Mat_baseColor.png", - }, - { - file: "sampledata/models/Earth/Earth_Clouds_mat_baseColor.png", - name: "Earth_Clouds_mat_baseColor", - pipeline_name: "Earth_Clouds_mat_baseColor.png", - }, - ], - version: "0.51:1", -} diff --git a/solarsystem/app/sampledata/models/Jupiter/Jupiter.sfa b/solarsystem/app/sampledata/models/Jupiter/Jupiter.sfa deleted file mode 100644 index f42ce82f..00000000 --- a/solarsystem/app/sampledata/models/Jupiter/Jupiter.sfa +++ /dev/null @@ -1,139 +0,0 @@ -{ - materials: [ - { - name: "Jupiter_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Jupiter_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 0, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - { - name: "JupiterClouds_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "JupiterClouds_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 0, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - ], - model: { - attributes: [ - "Position", - "TexCoord", - "Orientation", - ], - file: "sampledata/models/Jupiter/Jupiter.gltf", - name: "Jupiter", - scale: 0.5, - recenter: true, - suggested_collision: { - center: { - x: 0, - y: 0, - z: 0, - }, - size: { - x: 1, - y: 1, - z: 1, - }, - type: "Box", - }, - }, - samplers: [ - { - file: "sampledata/models/Jupiter/JupiterClouds_Mat_baseColor.png", - name: "JupiterClouds_Mat_baseColor", - pipeline_name: "JupiterClouds_Mat_baseColor.png", - }, - { - file: "sampledata/models/Jupiter/Jupiter_Mat_baseColor.png", - name: "Jupiter_Mat_baseColor", - pipeline_name: "Jupiter_Mat_baseColor.png", - }, - ], - version: "0.51:1", -} diff --git a/solarsystem/app/sampledata/models/Luna/Luna.sfa b/solarsystem/app/sampledata/models/Luna/Luna.sfa deleted file mode 100644 index 0a23505f..00000000 --- a/solarsystem/app/sampledata/models/Luna/Luna.sfa +++ /dev/null @@ -1,101 +0,0 @@ -{ - materials: [ - { - name: "Luna_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Luna_Mat_baseColor", - }, - { - normal: "Luna_Mat_normal", - }, - { - metallicFactor: 1, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: "Luna_Mat_occlusionRoughnessMetallic", - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - ], - model: { - attributes: [ - "Position", - "TexCoord", - "Orientation", - ], - file: "sampledata/models/Luna/Luna.gltf", - name: "Luna", - scale: 0.5, - recenter: true, - suggested_collision: { - center: { - x: 0, - y: 0, - z: 0, - }, - size: { - x: 1, - y: 1, - z: 1, - }, - type: "Box", - }, - }, - samplers: [ - { - file: "sampledata/models/Luna/Luna_Mat_baseColor.png", - name: "Luna_Mat_baseColor", - pipeline_name: "Luna_Mat_baseColor.png", - }, - { - file: "sampledata/models/Luna/Luna_Mat_occlusionRoughnessMetallic.png", - name: "Luna_Mat_occlusionRoughnessMetallic", - params: { - usage_type: "Data", - }, - pipeline_name: "Luna_Mat_occlusionRoughnessMetallic.png", - }, - { - file: "sampledata/models/Luna/Luna_Mat_normal.png", - name: "Luna_Mat_normal", - params: { - usage_type: "Normal", - }, - pipeline_name: "Luna_Mat_normal.png", - }, - ], - version: "0.51:1", -} diff --git a/solarsystem/app/sampledata/models/Mars/Mars.sfa b/solarsystem/app/sampledata/models/Mars/Mars.sfa deleted file mode 100644 index f7f302e3..00000000 --- a/solarsystem/app/sampledata/models/Mars/Mars.sfa +++ /dev/null @@ -1,148 +0,0 @@ -{ - materials: [ - { - name: "Mars_Atmosphere_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Mars_Atmosphere_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 1, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - { - name: "Mars_mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Mars_mat_baseColor", - }, - { - normal: "Mars_mat_normal", - }, - { - metallicFactor: 0.33000000000000002, - }, - { - roughnessFactor: 0.85999999999999999, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - ], - model: { - attributes: [ - "Position", - "TexCoord", - "Orientation", - ], - file: "sampledata/models/Mars/Mars.gltf", - name: "Mars", - scale: 0.5, - recenter: true, - suggested_collision: { - skin_width: 0.75, - center: { - x: 0, - y: 0, - z: 0, - }, - size: { - x: 1, - y: 1, - z: 1, - }, - type: "Box", - }, - }, - samplers: [ - { - file: "sampledata/models/Mars/Mars_mat_baseColor.png", - name: "Mars_mat_baseColor", - pipeline_name: "Mars_mat_baseColor.png", - }, - { - file: "sampledata/models/Mars/Mars_mat_normal.png", - name: "Mars_mat_normal", - params: { - usage_type: "Normal", - }, - pipeline_name: "Mars_mat_normal.png", - }, - { - file: "sampledata/models/Mars/Mars_Atmosphere_Mat_baseColor.png", - name: "Mars_Atmosphere_Mat_baseColor", - pipeline_name: "Mars_Atmosphere_Mat_baseColor.png", - }, - ], - version: "0.51:1", -} diff --git a/solarsystem/app/sampledata/models/Mercury/Mercury.sfa b/solarsystem/app/sampledata/models/Mercury/Mercury.sfa deleted file mode 100644 index 6300f02e..00000000 --- a/solarsystem/app/sampledata/models/Mercury/Mercury.sfa +++ /dev/null @@ -1,102 +0,0 @@ -{ - materials: [ - { - name: "Mercury_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Mercury_Mat_baseColor", - }, - { - normal: "Mercury_Mat_normal", - }, - { - metallicFactor: 1, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: "Mercury_Mat_occlusionRoughnessMetallic", - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - ], - model: { - attributes: [ - "Position", - "TexCoord", - "Orientation", - ], - file: "sampledata/models/Mercury/Mercury.gltf", - name: "Mercury", - scale: 0.5, - recenter: true, - suggested_collision: { - skin_width: 0.75, - center: { - x: 0, - y: 0, - z: 0, - }, - size: { - x: 1, - y: 1, - z: 1, - }, - type: "Box", - }, - }, - samplers: [ - { - file: "sampledata/models/Mercury/Mercury_Mat_baseColor.png", - name: "Mercury_Mat_baseColor", - pipeline_name: "Mercury_Mat_baseColor.png", - }, - { - file: "sampledata/models/Mercury/Mercury_Mat_occlusionRoughnessMetallic.png", - name: "Mercury_Mat_occlusionRoughnessMetallic", - params: { - usage_type: "Data", - }, - pipeline_name: "Mercury_Mat_occlusionRoughnessMetallic.png", - }, - { - file: "sampledata/models/Mercury/Mercury_Mat_normal.png", - name: "Mercury_Mat_normal", - params: { - usage_type: "Normal", - }, - pipeline_name: "Mercury_Mat_normal.png", - }, - ], - version: "0.51:1", -} diff --git a/solarsystem/app/sampledata/models/Neptune/Neptune.sfa b/solarsystem/app/sampledata/models/Neptune/Neptune.sfa deleted file mode 100644 index f7e594da..00000000 --- a/solarsystem/app/sampledata/models/Neptune/Neptune.sfa +++ /dev/null @@ -1,139 +0,0 @@ -{ - materials: [ - { - name: "NeptuneGlobe_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "NeptuneGlobe_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 0, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - { - name: "Neptune_Clouds_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Neptune_Clouds_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 1, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - ], - model: { - attributes: [ - "Position", - "TexCoord", - "Orientation", - ], - file: "sampledata/models/Neptune/Neptune.gltf", - name: "Neptune", - scale: 0.5, - recenter: true, - suggested_collision: { - center: { - x: 0, - y: 0, - z: 0, - }, - size: { - x: 1, - y: 1, - z: 1, - }, - type: "Box", - }, - }, - samplers: [ - { - file: "sampledata/models/Neptune/Neptune_Clouds_Mat_baseColor.png", - name: "Neptune_Clouds_Mat_baseColor", - pipeline_name: "Neptune_Clouds_Mat_baseColor.png", - }, - { - file: "sampledata/models/Neptune/NeptuneGlobe_Mat_baseColor.png", - name: "NeptuneGlobe_Mat_baseColor", - pipeline_name: "NeptuneGlobe_Mat_baseColor.png", - }, - ], - version: "0.51:1", -} diff --git a/solarsystem/app/sampledata/models/Saturn/Saturn.sfa b/solarsystem/app/sampledata/models/Saturn/Saturn.sfa deleted file mode 100644 index e2c3536e..00000000 --- a/solarsystem/app/sampledata/models/Saturn/Saturn.sfa +++ /dev/null @@ -1,201 +0,0 @@ -{ - materials: [ - { - name: "SaturnPlanet_Opaque_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "SaturnPlanet_Opaque_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 0, - }, - { - roughnessFactor: 0.66000000000000003, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - { - name: "Saturn_Clouds_mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Saturn_Clouds_mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 1, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - { - name: "SaturnRings_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "SaturnRings_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 1, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: "SaturnRings_Mat_occlusionRoughnessMetallic", - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - ], - model: { - attributes: [ - "Position", - "TexCoord", - "Orientation", - ], - file: "sampledata/models/Saturn/Saturn.gltf", - name: "Saturn", - scale: 0.5, - recenter: true, - suggested_collision: { - center: { - x: 0, - y: 0, - z: 0, - }, - size: { - x: 1, - y: 1, - z: 1, - }, - type: "Box", - }, - }, - samplers: [ - { - file: "sampledata/models/Saturn/SaturnRings_Mat_occlusionRoughnessMetallic.png", - name: "SaturnRings_Mat_occlusionRoughnessMetallic", - params: { - usage_type: "Data", - }, - pipeline_name: "SaturnRings_Mat_occlusionRoughnessMetallic.png", - }, - { - file: "sampledata/models/Saturn/SaturnRings_Mat_baseColor.png", - name: "SaturnRings_Mat_baseColor", - pipeline_name: "SaturnRings_Mat_baseColor.png", - }, - { - file: "sampledata/models/Saturn/Saturn_Clouds_mat_baseColor.png", - name: "Saturn_Clouds_mat_baseColor", - pipeline_name: "Saturn_Clouds_mat_baseColor.png", - }, - { - file: "sampledata/models/Saturn/SaturnPlanet_Opaque_Mat_baseColor.png", - name: "SaturnPlanet_Opaque_Mat_baseColor", - pipeline_name: "SaturnPlanet_Opaque_Mat_baseColor.png", - }, - ], - version: "0.51:1", -} diff --git a/solarsystem/app/sampledata/models/Sol/Sol.sfa b/solarsystem/app/sampledata/models/Sol/Sol.sfa deleted file mode 100644 index a0cdbd4d..00000000 --- a/solarsystem/app/sampledata/models/Sol/Sol.sfa +++ /dev/null @@ -1,208 +0,0 @@ -{ - materials: [ - { - name: "Sol_Opaque_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Sol_Opaque_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 0, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - emissive: "Sol_Opaque_Mat_emissive", - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - { - name: "SolarFlare_Transparent_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "SolarFlare_Transparent_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 0, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - emissive: "SolarFlare_Transparent_Mat_emissive", - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - { - name: "Sol_Transparent_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Sol_Transparent_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 0, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - emissive: "Sol_Transparent_Mat_emissive", - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - ], - model: { - attributes: [ - "Position", - "TexCoord", - "Orientation", - ], - file: "sampledata/models/Sol/Sol.gltf", - name: "Sol", - scale: 0.5, - recenter: true, - suggested_collision: { - center: { - x: 0, - y: 0, - z: 0, - }, - size: { - x: 1, - y: 1, - z: 1, - }, - type: "Box", - }, - }, - samplers: [ - { - file: "sampledata/models/Sol/Sol_Transparent_Mat_baseColor.png", - name: "Sol_Transparent_Mat_baseColor", - pipeline_name: "Sol_Transparent_Mat_baseColor.png", - }, - { - file: "sampledata/models/Sol/SolarFlare_Transparent_Mat_baseColor.png", - name: "SolarFlare_Transparent_Mat_baseColor", - pipeline_name: "SolarFlare_Transparent_Mat_baseColor.png", - }, - { - file: "sampledata/models/Sol/SolarFlare_Transparent_Mat_emissive.png", - name: "SolarFlare_Transparent_Mat_emissive", - pipeline_name: "SolarFlare_Transparent_Mat_emissive.png", - }, - { - file: "sampledata/models/Sol/Sol_Opaque_Mat_baseColor.png", - name: "Sol_Opaque_Mat_baseColor", - pipeline_name: "Sol_Opaque_Mat_baseColor.png", - }, - { - file: "sampledata/models/Sol/Sol_Transparent_Mat_emissive.png", - name: "Sol_Transparent_Mat_emissive", - pipeline_name: "Sol_Transparent_Mat_emissive.png", - }, - { - file: "sampledata/models/Sol/Sol_Opaque_Mat_emissive.png", - name: "Sol_Opaque_Mat_emissive", - pipeline_name: "Sol_Opaque_Mat_emissive.png", - }, - ], - version: "0.51:1", -} diff --git a/solarsystem/app/sampledata/models/Uranus/Uranus.sfa b/solarsystem/app/sampledata/models/Uranus/Uranus.sfa deleted file mode 100644 index 5ae61030..00000000 --- a/solarsystem/app/sampledata/models/Uranus/Uranus.sfa +++ /dev/null @@ -1,193 +0,0 @@ -{ - materials: [ - { - name: "UranusGlobe_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "UranusGlobe_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 0, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - { - name: "UranusRings_Stingray_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "UranusRings_Stingray_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 0, - }, - { - roughnessFactor: 0.29999999999999999, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - { - name: "Uranus_Clouds_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Uranus_Clouds_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 1, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - ], - model: { - attributes: [ - "Position", - "TexCoord", - "Orientation", - ], - file: "sampledata/models/Uranus/Uranus.gltf", - name: "Uranus", - scale: 0.5, - recenter: true, - suggested_collision: { - center: { - x: 0, - y: 0, - z: 0, - }, - size: { - x: 1, - y: 1, - z: 1, - }, - type: "Box", - }, - }, - samplers: [ - { - file: "sampledata/models/Uranus/Uranus_Clouds_Mat_baseColor.png", - name: "Uranus_Clouds_Mat_baseColor", - pipeline_name: "Uranus_Clouds_Mat_baseColor.png", - }, - { - file: "sampledata/models/Uranus/UranusRings_Stingray_Mat_baseColor.png", - name: "UranusRings_Stingray_Mat_baseColor", - pipeline_name: "UranusRings_Stingray_Mat_baseColor.png", - }, - { - file: "sampledata/models/Uranus/UranusGlobe_Mat_baseColor.png", - name: "UranusGlobe_Mat_baseColor", - pipeline_name: "UranusGlobe_Mat_baseColor.png", - }, - ], - version: "0.51:1", -} diff --git a/solarsystem/app/sampledata/models/Venus/Venus.sfa b/solarsystem/app/sampledata/models/Venus/Venus.sfa deleted file mode 100644 index f540e5ee..00000000 --- a/solarsystem/app/sampledata/models/Venus/Venus.sfa +++ /dev/null @@ -1,155 +0,0 @@ -{ - materials: [ - { - name: "Venus_Atmosphere_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Venus_Atmosphere_Mat_baseColor", - }, - { - normal: null, - }, - { - metallicFactor: 1, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: "Venus_Atmosphere_Mat_occlusionRoughnessMetallic", - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - { - name: "Venus_Terrain_Mat", - parameters: [ - { - baseColorFactor: [ - 1, - 1, - 1, - 1, - ], - }, - { - baseColor: "Venus_Terrain_Mat_baseColor", - }, - { - normal: "Venus_Terrain_Mat_normal", - }, - { - metallicFactor: 0, - }, - { - roughnessFactor: 1, - }, - { - metallicRoughness: null, - }, - { - occlusion: null, - }, - { - emissiveFactor: [ - 0, - 0, - 0, - 1, - ], - }, - { - emissive: null, - }, - { - reflectance: 0.5, - }, - { - opacity: null, - }, - ], - source: "build/sceneform_sdk/default_materials/gltf_material.sfm", - }, - ], - model: { - attributes: [ - "Position", - "TexCoord", - "Orientation", - ], - file: "sampledata/models/Venus/Venus.gltf", - name: "Venus", - scale: 0.5, - recenter: true, - suggested_collision: { - center: { - x: 0, - y: 0, - z: 0, - }, - size: { - x: 1, - y: 1, - z: 1, - }, - type: "Box", - }, - }, - samplers: [ - { - file: "sampledata/models/Venus/Venus_Terrain_Mat_baseColor.png", - name: "Venus_Terrain_Mat_baseColor", - pipeline_name: "Venus_Terrain_Mat_baseColor.png", - }, - { - file: "sampledata/models/Venus/Venus_Terrain_Mat_normal.png", - name: "Venus_Terrain_Mat_normal", - params: { - usage_type: "Normal", - }, - pipeline_name: "Venus_Terrain_Mat_normal.png", - }, - { - file: "sampledata/models/Venus/Venus_Atmosphere_Mat_baseColor.png", - name: "Venus_Atmosphere_Mat_baseColor", - pipeline_name: "Venus_Atmosphere_Mat_baseColor.png", - }, - { - file: "sampledata/models/Venus/Venus_Atmosphere_Mat_occlusionRoughnessMetallic.png", - name: "Venus_Atmosphere_Mat_occlusionRoughnessMetallic", - params: { - usage_type: "Data", - }, - pipeline_name: "Venus_Atmosphere_Mat_occlusionRoughnessMetallic.png", - }, - ], - version: "0.51:1", -} diff --git a/solarsystem/settings.gradle b/solarsystem/settings.gradle deleted file mode 100644 index e7b4def4..00000000 --- a/solarsystem/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app'