diff --git a/collision/.gitignore b/collision/.gitignore new file mode 100644 index 0000000..2b75303 --- /dev/null +++ b/collision/.gitignore @@ -0,0 +1,13 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/collision/.idea/codeStyles/Project.xml b/collision/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..34dc27c --- /dev/null +++ b/collision/.idea/codeStyles/Project.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collision/.idea/codeStyles/codeStyleConfig.xml b/collision/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/collision/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/collision/.idea/copyright/GPL_v__2_0.xml b/collision/.idea/copyright/GPL_v__2_0.xml new file mode 100644 index 0000000..534f537 --- /dev/null +++ b/collision/.idea/copyright/GPL_v__2_0.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/collision/.idea/copyright/profiles_settings.xml b/collision/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..466f184 --- /dev/null +++ b/collision/.idea/copyright/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/collision/.idea/gradle.xml b/collision/.idea/gradle.xml new file mode 100644 index 0000000..7ac24c7 --- /dev/null +++ b/collision/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/collision/.idea/misc.xml b/collision/.idea/misc.xml new file mode 100644 index 0000000..703e5d4 --- /dev/null +++ b/collision/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/collision/.idea/runConfigurations.xml b/collision/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/collision/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/collision/.idea/vcs.xml b/collision/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/collision/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/collision/app/.gitignore b/collision/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/collision/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/collision/app/build.gradle b/collision/app/build.gradle new file mode 100644 index 0000000..a32fde4 --- /dev/null +++ b/collision/app/build.gradle @@ -0,0 +1,40 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "it.norangeb.collision" + minSdkVersion 26 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.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' +} diff --git a/collision/app/proguard-rules.pro b/collision/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/collision/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/collision/app/src/androidTest/java/it/norangeb/collision/ExampleInstrumentedTest.kt b/collision/app/src/androidTest/java/it/norangeb/collision/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..db2de22 --- /dev/null +++ b/collision/app/src/androidTest/java/it/norangeb/collision/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package it.norangeb.collision + +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.collision", appContext.packageName) + } +} diff --git a/collision/app/src/main/AndroidManifest.xml b/collision/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..c86ad79 --- /dev/null +++ b/collision/app/src/main/AndroidManifest.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collision/app/src/main/java/it/norangeb/collision/MainActivity.kt b/collision/app/src/main/java/it/norangeb/collision/MainActivity.kt new file mode 100644 index 0000000..7c122f3 --- /dev/null +++ b/collision/app/src/main/java/it/norangeb/collision/MainActivity.kt @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2019, norangebit + * + * This file is part of collision. + * + * collision 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. + * + * collision 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 collision. If not, see + * + */ + +package it.norangeb.collision + +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import android.view.MotionEvent +import android.widget.Toast +import com.google.ar.core.HitResult +import com.google.ar.core.Plane +import com.google.ar.sceneform.FrameTime +import com.google.ar.sceneform.Node +import com.google.ar.sceneform.Scene +import com.google.ar.sceneform.rendering.Color +import com.google.ar.sceneform.ux.ArFragment + +class MainActivity : AppCompatActivity() { + private val TAG = MainActivity::class.java.canonicalName + + private lateinit var arFragment: ArFragment + private lateinit var arScene: Scene + private var lastNode: Node? = null + + 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 + arScene = arFragment.arSceneView.scene + + arFragment.setOnTapArPlaneListener(this::addShape) + + arScene.addOnUpdateListener(this::onUpdate) + } + + private fun onUpdate(frameTime: FrameTime) { + val node = lastNode ?: return + val overlappedNodes = arScene.overlapTestAll(node) + if (overlappedNodes.isNotEmpty()) + onCollision(overlappedNodes) + } + + private fun onCollision(nodes: List) { + Toast.makeText(this, "collision", Toast.LENGTH_LONG).show() + lastNode?.isEnabled = false + lastNode = null + } + + private fun addShape(hitResult: HitResult, plane: Plane, motionEvent: MotionEvent) { + val red = Color(android.graphics.Color.RED) + + buildMaterial(this, red) { + val cube = buildShape(Shape.CUBE, it) + + lastNode = addNodeToScene(arFragment, hitResult.createAnchor(), cube) + } + } +} diff --git a/collision/app/src/main/java/it/norangeb/collision/Util.kt b/collision/app/src/main/java/it/norangeb/collision/Util.kt new file mode 100644 index 0000000..9bfe1aa --- /dev/null +++ b/collision/app/src/main/java/it/norangeb/collision/Util.kt @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2019, norangebit + * + * This file is part of collision. + * + * collision 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. + * + * collision 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 collision. If not, see + * + */ + +package it.norangeb.collision + +import android.annotation.SuppressLint +import android.app.Activity +import android.app.ActivityManager +import android.content.Context +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.Node +import com.google.ar.sceneform.math.Vector3 +import com.google.ar.sceneform.rendering.* +import com.google.ar.sceneform.ux.ArFragment + +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 buildMaterial( + context: Context, + color: Color, + onSuccess: (material: Material) -> Unit +) { + MaterialFactory + .makeOpaqueWithColor(context, color) + .thenAccept(onSuccess) +} + +fun buildShape( + shape: Shape, + material: Material +): ModelRenderable { + val dimension = Vector3(0.1f, 0.1f, 0.1f) + return when (shape) { + Shape.CUBE -> ShapeFactory + .makeCube(dimension, Vector3(0.0f, 0.0f, 0.0f), material) + Shape.CYLINDER -> ShapeFactory + .makeCylinder(0.1f, 0.3f, Vector3(0.0f, 0.0f, 0.0f), material) + Shape.SPHERE -> ShapeFactory + .makeSphere(0.1f, dimension, material) + } +} + +fun addNodeToScene(arFragment: ArFragment, anchor: Anchor, renderable: Renderable): Node { + val anchorNode = AnchorNode(anchor) + anchorNode.renderable = renderable + arFragment.arSceneView.scene.addChild(anchorNode) + return anchorNode +} + +enum class Shape { + CUBE, + SPHERE, + CYLINDER +} diff --git a/collision/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/collision/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..6348baa --- /dev/null +++ b/collision/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/collision/app/src/main/res/drawable/ic_launcher_background.xml b/collision/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..a0ad202 --- /dev/null +++ b/collision/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/collision/app/src/main/res/layout/activity_main.xml b/collision/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..8e0d308 --- /dev/null +++ b/collision/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file diff --git a/collision/app/src/main/res/layout/content_main.xml b/collision/app/src/main/res/layout/content_main.xml new file mode 100644 index 0000000..53199bf --- /dev/null +++ b/collision/app/src/main/res/layout/content_main.xml @@ -0,0 +1,35 @@ + + + + + + \ No newline at end of file diff --git a/collision/app/src/main/res/menu/menu_main.xml b/collision/app/src/main/res/menu/menu_main.xml new file mode 100644 index 0000000..a5adc6f --- /dev/null +++ b/collision/app/src/main/res/menu/menu_main.xml @@ -0,0 +1,9 @@ + + + diff --git a/collision/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/collision/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..bbd3e02 --- /dev/null +++ b/collision/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/collision/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/collision/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..bbd3e02 --- /dev/null +++ b/collision/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/collision/app/src/main/res/mipmap-hdpi/ic_launcher.png b/collision/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..898f3ed Binary files /dev/null and b/collision/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/collision/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/collision/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..dffca36 Binary files /dev/null and b/collision/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/collision/app/src/main/res/mipmap-mdpi/ic_launcher.png b/collision/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..64ba76f Binary files /dev/null and b/collision/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/collision/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/collision/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..dae5e08 Binary files /dev/null and b/collision/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/collision/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/collision/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..e5ed465 Binary files /dev/null and b/collision/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/collision/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/collision/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..14ed0af Binary files /dev/null and b/collision/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/collision/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/collision/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..b0907ca Binary files /dev/null and b/collision/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/collision/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/collision/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..d8ae031 Binary files /dev/null and b/collision/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/collision/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/collision/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..2c18de9 Binary files /dev/null and b/collision/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/collision/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/collision/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..beed3cd Binary files /dev/null and b/collision/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/collision/app/src/main/res/values/colors.xml b/collision/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..69b2233 --- /dev/null +++ b/collision/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #008577 + #00574B + #D81B60 + diff --git a/collision/app/src/main/res/values/dimens.xml b/collision/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..59a0b0c --- /dev/null +++ b/collision/app/src/main/res/values/dimens.xml @@ -0,0 +1,3 @@ + + 16dp + diff --git a/collision/app/src/main/res/values/strings.xml b/collision/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..bf38794 --- /dev/null +++ b/collision/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + collision + Settings + diff --git a/collision/app/src/main/res/values/styles.xml b/collision/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..16dbab3 --- /dev/null +++ b/collision/app/src/main/res/values/styles.xml @@ -0,0 +1,17 @@ + + + + + +