diff --git a/runtime-fetching-models/.gitignore b/runtime-fetching-models/.gitignore new file mode 100644 index 0000000..fd45b12 --- /dev/null +++ b/runtime-fetching-models/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea/caches/build_file_checksums.ser +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/runtime-fetching-models/.idea/codeStyles/Project.xml b/runtime-fetching-models/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..34dc27c --- /dev/null +++ b/runtime-fetching-models/.idea/codeStyles/Project.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-fetching-models/.idea/codeStyles/codeStyleConfig.xml b/runtime-fetching-models/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/runtime-fetching-models/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/runtime-fetching-models/.idea/copyright/GPL_v__2_0.xml b/runtime-fetching-models/.idea/copyright/GPL_v__2_0.xml new file mode 100644 index 0000000..6ac8137 --- /dev/null +++ b/runtime-fetching-models/.idea/copyright/GPL_v__2_0.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/runtime-fetching-models/.idea/copyright/profiles_settings.xml b/runtime-fetching-models/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..466f184 --- /dev/null +++ b/runtime-fetching-models/.idea/copyright/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/runtime-fetching-models/.idea/gradle.xml b/runtime-fetching-models/.idea/gradle.xml new file mode 100644 index 0000000..7ac24c7 --- /dev/null +++ b/runtime-fetching-models/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/runtime-fetching-models/.idea/misc.xml b/runtime-fetching-models/.idea/misc.xml new file mode 100644 index 0000000..b0c7b20 --- /dev/null +++ b/runtime-fetching-models/.idea/misc.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-fetching-models/.idea/runConfigurations.xml b/runtime-fetching-models/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/runtime-fetching-models/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/runtime-fetching-models/.idea/vcs.xml b/runtime-fetching-models/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/runtime-fetching-models/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/runtime-fetching-models/app/.gitignore b/runtime-fetching-models/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/runtime-fetching-models/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/runtime-fetching-models/app/build.gradle b/runtime-fetching-models/app/build.gradle new file mode 100644 index 0000000..65bc0c1 --- /dev/null +++ b/runtime-fetching-models/app/build.gradle @@ -0,0 +1,41 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "it.norangeb.runtimefetchingmodels" + minSdkVersion 26 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'com.android.support:design:28.0.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + + implementation "com.google.ar.sceneform.ux:sceneform-ux:1.6.0" + implementation 'com.google.ar.sceneform:assets:1.6.0' +} diff --git a/runtime-fetching-models/app/proguard-rules.pro b/runtime-fetching-models/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/runtime-fetching-models/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/runtime-fetching-models/app/src/androidTest/java/it/norangeb/runtimefetchingmodels/ExampleInstrumentedTest.kt b/runtime-fetching-models/app/src/androidTest/java/it/norangeb/runtimefetchingmodels/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..488c3b6 --- /dev/null +++ b/runtime-fetching-models/app/src/androidTest/java/it/norangeb/runtimefetchingmodels/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package it.norangeb.runtimefetchingmodels + +import android.support.test.InstrumentationRegistry +import android.support.test.runner.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getTargetContext() + assertEquals("it.norangeb.runtimefetchingmodels", appContext.packageName) + } +} diff --git a/runtime-fetching-models/app/src/main/AndroidManifest.xml b/runtime-fetching-models/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..3f74504 --- /dev/null +++ b/runtime-fetching-models/app/src/main/AndroidManifest.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-fetching-models/app/src/main/java/it/norangeb/runtimefetchingmodels/MainActivity.kt b/runtime-fetching-models/app/src/main/java/it/norangeb/runtimefetchingmodels/MainActivity.kt new file mode 100644 index 0000000..e17021e --- /dev/null +++ b/runtime-fetching-models/app/src/main/java/it/norangeb/runtimefetchingmodels/MainActivity.kt @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2019, norangebit + * + * This file is part of augmented-images. + * + * runtime-fetching-models is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * runtime-fetching-models is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with runtime-fetching-models. If not, see + * + */ + +package it.norangeb.runtimefetchingmodels + +import android.net.Uri +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import android.util.Log +import android.view.MotionEvent +import com.google.ar.core.HitResult +import com.google.ar.core.Plane +import com.google.ar.sceneform.ux.ArFragment + +class MainActivity : AppCompatActivity() { + private val TAG = MainActivity::class.java.canonicalName + private val MODEL_SOURCE = "https://poly.googleusercontent.com/downloads/9-bJ2cXrk8S/8ey98BspXsw/Andy.gltf" + private lateinit var arFragment: ArFragment + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + if(!checkIsSupportedDeviceOrFinish(this, TAG)) + return + + setContentView(R.layout.activity_main) + arFragment = supportFragmentManager.findFragmentById(R.id.ar_fragment) as ArFragment + + arFragment.setOnTapArPlaneListener(this::fetchAndPlaceModel) + + } + + private fun fetchAndPlaceModel(hitResult: HitResult, plane: Plane, motionEvent: MotionEvent) { + val modelUri = Uri.parse(MODEL_SOURCE) + val fetchedModel = fetchModel(this, modelUri) + buildRenderable(this, fetchedModel, modelUri) { + addTransformableNodeToScene(arFragment, hitResult.createAnchor(), it) + } + } +} diff --git a/runtime-fetching-models/app/src/main/java/it/norangeb/runtimefetchingmodels/Util.kt b/runtime-fetching-models/app/src/main/java/it/norangeb/runtimefetchingmodels/Util.kt new file mode 100644 index 0000000..e6541f8 --- /dev/null +++ b/runtime-fetching-models/app/src/main/java/it/norangeb/runtimefetchingmodels/Util.kt @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2019, norangebit + * + * This file is part of augmented-images. + * + * runtime-fetching-models is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * runtime-fetching-models is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with runtime-fetching-models. If not, see + * + */ + +package it.norangeb.runtimefetchingmodels + +import android.annotation.SuppressLint +import android.app.Activity +import android.app.ActivityManager +import android.content.Context +import android.net.Uri +import android.os.Build +import android.util.Log +import android.widget.Toast +import com.google.ar.core.Anchor +import com.google.ar.sceneform.AnchorNode +import com.google.ar.sceneform.assets.RenderableSource +import com.google.ar.sceneform.rendering.ModelRenderable +import com.google.ar.sceneform.rendering.Renderable +import com.google.ar.sceneform.ux.ArFragment +import com.google.ar.sceneform.ux.TransformableNode + +private val MIN_OPENGL_VERSION = 3.0 + +@SuppressLint("ObsoleteSdkInt") +fun checkIsSupportedDeviceOrFinish(activity: Activity, tag: String): Boolean { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + Log.e(tag, "Sceneform requires Android N or later") + Toast.makeText(activity, "Sceneform requires Android N or later", Toast.LENGTH_LONG).show() + activity.finish() + return false + } + val openGlVersionString = (activity.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager) + .deviceConfigurationInfo + .glEsVersion + if (java.lang.Double.parseDouble(openGlVersionString) < MIN_OPENGL_VERSION) { + Log.e(tag, "Sceneform requires OpenGL ES 3.0 later") + Toast.makeText(activity, "Sceneform requires OpenGL ES 3.0 or later", Toast.LENGTH_LONG) + .show() + activity.finish() + return false + } + return true +} + +fun buildRenderable( + context: Context, + model: RenderableSource, + modelUri: Uri, + onSuccess: (renderable: Renderable) -> Unit +) { + ModelRenderable.builder() + .setRegistryId(modelUri) + .setSource(context, model) + .build() + .thenAccept(onSuccess) + .exceptionally { + Log.e("SCENEFORM", "unable to load model", it) + return@exceptionally null + } +} + +fun fetchModel( + context: Context, + source: Uri +) : RenderableSource { + return RenderableSource.builder() + .setSource(context, source, RenderableSource.SourceType.GLTF2) + .setRecenterMode(RenderableSource.RecenterMode.ROOT) + .build() +} + +fun addTransformableNodeToScene(arFragment: ArFragment, anchor: Anchor, renderable: Renderable) { + val anchorNode = AnchorNode(anchor) + val transformableNode = TransformableNode(arFragment.transformationSystem) + transformableNode.renderable = renderable + transformableNode.setParent(anchorNode) + arFragment.arSceneView.scene.addChild(anchorNode) + transformableNode.select() +} + diff --git a/runtime-fetching-models/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/runtime-fetching-models/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..6348baa --- /dev/null +++ b/runtime-fetching-models/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/runtime-fetching-models/app/src/main/res/drawable/ic_launcher_background.xml b/runtime-fetching-models/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..a0ad202 --- /dev/null +++ b/runtime-fetching-models/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/runtime-fetching-models/app/src/main/res/layout/activity_main.xml b/runtime-fetching-models/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..1803583 --- /dev/null +++ b/runtime-fetching-models/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file diff --git a/runtime-fetching-models/app/src/main/res/layout/content_main.xml b/runtime-fetching-models/app/src/main/res/layout/content_main.xml new file mode 100644 index 0000000..ff0a1bb --- /dev/null +++ b/runtime-fetching-models/app/src/main/res/layout/content_main.xml @@ -0,0 +1,36 @@ + + + + + + + \ No newline at end of file diff --git a/runtime-fetching-models/app/src/main/res/menu/menu_main.xml b/runtime-fetching-models/app/src/main/res/menu/menu_main.xml new file mode 100644 index 0000000..854ad60 --- /dev/null +++ b/runtime-fetching-models/app/src/main/res/menu/menu_main.xml @@ -0,0 +1,9 @@ + + + diff --git a/runtime-fetching-models/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/runtime-fetching-models/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..bbd3e02 --- /dev/null +++ b/runtime-fetching-models/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/runtime-fetching-models/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/runtime-fetching-models/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..bbd3e02 --- /dev/null +++ b/runtime-fetching-models/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/runtime-fetching-models/app/src/main/res/mipmap-hdpi/ic_launcher.png b/runtime-fetching-models/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..898f3ed Binary files /dev/null and b/runtime-fetching-models/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/runtime-fetching-models/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/runtime-fetching-models/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..dffca36 Binary files /dev/null and b/runtime-fetching-models/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/runtime-fetching-models/app/src/main/res/mipmap-mdpi/ic_launcher.png b/runtime-fetching-models/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..64ba76f Binary files /dev/null and b/runtime-fetching-models/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/runtime-fetching-models/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/runtime-fetching-models/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..dae5e08 Binary files /dev/null and b/runtime-fetching-models/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/runtime-fetching-models/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/runtime-fetching-models/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..e5ed465 Binary files /dev/null and b/runtime-fetching-models/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/runtime-fetching-models/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/runtime-fetching-models/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..14ed0af Binary files /dev/null and b/runtime-fetching-models/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/runtime-fetching-models/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/runtime-fetching-models/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..b0907ca Binary files /dev/null and b/runtime-fetching-models/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/runtime-fetching-models/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/runtime-fetching-models/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..d8ae031 Binary files /dev/null and b/runtime-fetching-models/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/runtime-fetching-models/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/runtime-fetching-models/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..2c18de9 Binary files /dev/null and b/runtime-fetching-models/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/runtime-fetching-models/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/runtime-fetching-models/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..beed3cd Binary files /dev/null and b/runtime-fetching-models/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/runtime-fetching-models/app/src/main/res/values/colors.xml b/runtime-fetching-models/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..69b2233 --- /dev/null +++ b/runtime-fetching-models/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #008577 + #00574B + #D81B60 + diff --git a/runtime-fetching-models/app/src/main/res/values/dimens.xml b/runtime-fetching-models/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..59a0b0c --- /dev/null +++ b/runtime-fetching-models/app/src/main/res/values/dimens.xml @@ -0,0 +1,3 @@ + + 16dp + diff --git a/runtime-fetching-models/app/src/main/res/values/strings.xml b/runtime-fetching-models/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..9b676b0 --- /dev/null +++ b/runtime-fetching-models/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + runtime fetching models + Settings + diff --git a/runtime-fetching-models/app/src/main/res/values/styles.xml b/runtime-fetching-models/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..16dbab3 --- /dev/null +++ b/runtime-fetching-models/app/src/main/res/values/styles.xml @@ -0,0 +1,17 @@ + + + + + +