diff --git a/android-3D-model-viewer.iml b/android-3D-model-viewer.iml new file mode 100644 index 00000000..efbfa0ca --- /dev/null +++ b/android-3D-model-viewer.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/app.iml b/app/app.iml new file mode 100644 index 00000000..69ecea78 --- /dev/null +++ b/app/app.iml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cb96ddd7..15e2256f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,7 +37,7 @@ android:parentActivityName="org.andresoviedo.app.model3D.MainActivity" > diff --git a/app/src/main/java/org/andresoviedo/app/model3D/MainActivity.java b/app/src/main/java/org/andresoviedo/app/model3D/MainActivity.java index b9eb6344..e603797a 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/MainActivity.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/MainActivity.java @@ -7,7 +7,7 @@ import org.andresoviedo.app.model3D.view.MenuActivity; import org.andresoviedo.app.model3D.view.ModelActivity; -import org.andresoviedo.app.util.android.AndroidURLStreamHandlerFactory; +import org.andresoviedo.util.android.AndroidURLStreamHandlerFactory; import org.andresoviedo.dddmodel2.R; import java.net.URL; @@ -26,7 +26,7 @@ public class MainActivity extends Activity { // Custom handler: org/andresoviedo/app/util/url/android/Handler.class static { - System.setProperty("java.protocol.handler.pkgs", "org.andresoviedo.app.util.android"); + System.setProperty("java.protocol.handler.pkgs", "org.andresoviedo.util.android"); URL.setURLStreamHandlerFactory(new AndroidURLStreamHandlerFactory()); } diff --git a/app/src/main/java/org/andresoviedo/app/model3D/animation/JointTransform.java b/app/src/main/java/org/andresoviedo/app/model3D/animation/JointTransform.java index 4dc4cbad..091c7f0c 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/animation/JointTransform.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/animation/JointTransform.java @@ -3,7 +3,7 @@ import android.opengl.Matrix; import org.andresoviedo.app.model3D.services.collada.entities.Vector3f; -import org.andresoviedo.app.util.math.Quaternion; +import org.andresoviedo.util.math.Quaternion; /** * diff --git a/app/src/main/java/org/andresoviedo/app/model3D/collision/CollisionDetection.java b/app/src/main/java/org/andresoviedo/app/model3D/collision/CollisionDetection.java index ea7d8a52..55cd1eda 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/collision/CollisionDetection.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/collision/CollisionDetection.java @@ -6,7 +6,7 @@ import org.andresoviedo.app.model3D.entities.BoundingBox; import org.andresoviedo.app.model3D.model.Object3DData; import org.andresoviedo.app.model3D.view.ModelRenderer; -import org.andresoviedo.app.util.math.Math3DUtils; +import org.andresoviedo.util.math.Math3DUtils; import java.util.Arrays; import java.util.List; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/collision/Octree.java b/app/src/main/java/org/andresoviedo/app/model3D/collision/Octree.java index be45528b..b1f81c18 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/collision/Octree.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/collision/Octree.java @@ -5,7 +5,7 @@ import org.andresoviedo.app.model3D.entities.BoundingBox; import org.andresoviedo.app.model3D.model.Object3DData; -import org.andresoviedo.app.util.math.Math3DUtils; +import org.andresoviedo.util.math.Math3DUtils; import java.nio.FloatBuffer; import java.nio.IntBuffer; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/model/Object3DBuilder.java b/app/src/main/java/org/andresoviedo/app/model3D/model/Object3DBuilder.java index 3b3ccfdc..9a08afad 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/model/Object3DBuilder.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/model/Object3DBuilder.java @@ -13,9 +13,9 @@ import org.andresoviedo.app.model3D.services.wavefront.WavefrontLoader.Material; import org.andresoviedo.app.model3D.services.wavefront.WavefrontLoader.Materials; import org.andresoviedo.app.model3D.services.wavefront.WavefrontLoader.Tuple3; -import org.andresoviedo.app.util.android.ContentUtils; -import org.andresoviedo.app.util.io.IOUtils; -import org.andresoviedo.app.util.math.Math3DUtils; +import org.andresoviedo.util.android.ContentUtils; +import org.andresoviedo.util.io.IOUtils; +import org.andresoviedo.util.math.Math3DUtils; import java.io.BufferedReader; import java.io.IOException; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/model/Object3DData.java b/app/src/main/java/org/andresoviedo/app/model3D/model/Object3DData.java index 691df7b5..d37ed09c 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/model/Object3DData.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/model/Object3DData.java @@ -12,7 +12,7 @@ import org.andresoviedo.app.model3D.services.wavefront.WavefrontLoader.Faces; import org.andresoviedo.app.model3D.services.wavefront.WavefrontLoader.Materials; import org.andresoviedo.app.model3D.services.wavefront.WavefrontLoader.Tuple3; -import org.andresoviedo.app.util.math.Math3DUtils; +import org.andresoviedo.util.math.Math3DUtils; import java.io.InputStream; import java.nio.ByteBuffer; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/services/ExampleSceneLoader.java b/app/src/main/java/org/andresoviedo/app/model3D/services/ExampleSceneLoader.java index 560b35f5..85446c0b 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/services/ExampleSceneLoader.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/services/ExampleSceneLoader.java @@ -10,8 +10,8 @@ import org.andresoviedo.app.model3D.model.Object3DBuilder; import org.andresoviedo.app.model3D.model.Object3DData; import org.andresoviedo.app.model3D.view.ModelActivity; -import org.andresoviedo.app.util.android.ContentUtils; -import org.andresoviedo.app.util.io.IOUtils; +import org.andresoviedo.util.android.ContentUtils; +import org.andresoviedo.util.io.IOUtils; import java.io.InputStream; import java.util.ArrayList; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/services/SceneLoader.java b/app/src/main/java/org/andresoviedo/app/model3D/services/SceneLoader.java index f44ca725..46f901fb 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/services/SceneLoader.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/services/SceneLoader.java @@ -14,8 +14,8 @@ import org.andresoviedo.app.model3D.services.stl.STLLoaderTask; import org.andresoviedo.app.model3D.services.wavefront.WavefrontLoaderTask; import org.andresoviedo.app.model3D.view.ModelActivity; -import org.andresoviedo.app.util.android.ContentUtils; -import org.andresoviedo.app.util.io.IOUtils; +import org.andresoviedo.util.android.ContentUtils; +import org.andresoviedo.util.io.IOUtils; import java.io.IOException; import java.io.InputStream; @@ -86,6 +86,10 @@ public class SceneLoader implements LoaderTask.Callback { * Toggle collision detection */ private boolean isCollision = false; + /** + * Toggle 3d anaglyph + */ + private boolean isAnaglyph = false; /** * Object selected by the user */ @@ -307,6 +311,10 @@ public boolean isCollision() { return isCollision; } + public boolean isAnaglyph() { + return isAnaglyph; + } + @Override public void onStart(){ ContentUtils.setThreadActivity(parent); diff --git a/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/AnimationLoader.java b/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/AnimationLoader.java index e66dca53..1775635e 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/AnimationLoader.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/AnimationLoader.java @@ -6,7 +6,7 @@ import org.andresoviedo.app.model3D.services.collada.entities.AnimationData; import org.andresoviedo.app.model3D.services.collada.entities.JointTransformData; import org.andresoviedo.app.model3D.services.collada.entities.KeyFrameData; -import org.andresoviedo.app.util.xml.XmlNode; +import org.andresoviedo.util.xml.XmlNode; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/ColladaLoader.java b/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/ColladaLoader.java index dabbe052..04250f3e 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/ColladaLoader.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/ColladaLoader.java @@ -19,8 +19,8 @@ import org.andresoviedo.app.model3D.services.collada.entities.SkeletonData; import org.andresoviedo.app.model3D.services.collada.entities.SkinningData; import org.andresoviedo.app.model3D.services.wavefront.WavefrontLoader; -import org.andresoviedo.app.util.xml.XmlNode; -import org.andresoviedo.app.util.xml.XmlParser; +import org.andresoviedo.util.xml.XmlNode; +import org.andresoviedo.util.xml.XmlParser; import java.io.IOException; import java.io.InputStream; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/GeometryLoader.java b/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/GeometryLoader.java index 33be966c..9f5cefd0 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/GeometryLoader.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/GeometryLoader.java @@ -12,7 +12,7 @@ import org.andresoviedo.app.model3D.services.collada.entities.Vector4f; import org.andresoviedo.app.model3D.services.collada.entities.Vertex; import org.andresoviedo.app.model3D.services.collada.entities.VertexSkinData; -import org.andresoviedo.app.util.xml.XmlNode; +import org.andresoviedo.util.xml.XmlNode; import java.nio.ByteBuffer; import java.nio.ByteOrder; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/SkeletonLoader.java b/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/SkeletonLoader.java index 1331fc3c..03bdb0ca 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/SkeletonLoader.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/SkeletonLoader.java @@ -6,8 +6,8 @@ import org.andresoviedo.app.model3D.services.collada.entities.JointData; import org.andresoviedo.app.model3D.services.collada.entities.SkeletonData; import org.andresoviedo.app.model3D.services.collada.entities.SkinningData; -import org.andresoviedo.app.util.math.Math3DUtils; -import org.andresoviedo.app.util.xml.XmlNode; +import org.andresoviedo.util.math.Math3DUtils; +import org.andresoviedo.util.xml.XmlNode; import java.util.List; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/SkinLoader.java b/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/SkinLoader.java index 84a6c963..90a537ee 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/SkinLoader.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/services/collada/loader/SkinLoader.java @@ -5,8 +5,8 @@ import org.andresoviedo.app.model3D.services.collada.entities.SkinningData; import org.andresoviedo.app.model3D.services.collada.entities.VertexSkinData; -import org.andresoviedo.app.util.math.Math3DUtils; -import org.andresoviedo.app.util.xml.XmlNode; +import org.andresoviedo.util.math.Math3DUtils; +import org.andresoviedo.util.xml.XmlNode; import java.util.ArrayList; import java.util.Collections; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/services/stl/STLASCIIParser.java b/app/src/main/java/org/andresoviedo/app/model3D/services/stl/STLASCIIParser.java index 5e1dd62a..ef73b7c8 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/services/stl/STLASCIIParser.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/services/stl/STLASCIIParser.java @@ -13,7 +13,7 @@ // External imports -import org.andresoviedo.app.util.io.ProgressMonitorInputStream; +import org.andresoviedo.util.io.ProgressMonitorInputStream; import java.io.BufferedReader; import java.io.IOException; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/services/stl/STLBinaryParser.java b/app/src/main/java/org/andresoviedo/app/model3D/services/stl/STLBinaryParser.java index 61a0f093..13fcd1cc 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/services/stl/STLBinaryParser.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/services/stl/STLBinaryParser.java @@ -13,7 +13,7 @@ // External imports -import org.andresoviedo.app.util.io.ProgressMonitorInputStream; +import org.andresoviedo.util.io.ProgressMonitorInputStream; import java.io.BufferedInputStream; import java.io.IOException; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/services/wavefront/WavefrontLoader.java b/app/src/main/java/org/andresoviedo/app/model3D/services/wavefront/WavefrontLoader.java index 62f5c5d0..b0f1d1be 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/services/wavefront/WavefrontLoader.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/services/wavefront/WavefrontLoader.java @@ -34,7 +34,7 @@ a display list (modelDispList), which is drawn by calls to import android.support.annotation.Nullable; import android.util.Log; -import org.andresoviedo.app.util.android.ContentUtils; +import org.andresoviedo.util.android.ContentUtils; import java.io.BufferedReader; import java.io.IOException; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/services/wavefront/WavefrontLoaderTask.java b/app/src/main/java/org/andresoviedo/app/model3D/services/wavefront/WavefrontLoaderTask.java index 54519b02..db692780 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/services/wavefront/WavefrontLoaderTask.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/services/wavefront/WavefrontLoaderTask.java @@ -8,7 +8,7 @@ import org.andresoviedo.app.model3D.model.Object3DBuilder; import org.andresoviedo.app.model3D.model.Object3DData; import org.andresoviedo.app.model3D.services.LoaderTask; -import org.andresoviedo.app.util.android.ContentUtils; +import org.andresoviedo.util.android.ContentUtils; import java.io.IOException; import java.io.InputStream; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/view/DemoActivity.java b/app/src/main/java/org/andresoviedo/app/model3D/view/DemoActivity.java index c5722544..62899d75 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/view/DemoActivity.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/view/DemoActivity.java @@ -18,7 +18,7 @@ import android.widget.TextView; import android.widget.Toast; -import org.andresoviedo.app.util.android.ContentUtils; +import org.andresoviedo.util.android.ContentUtils; import org.andresoviedo.dddmodel2.R; import java.io.IOException; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/view/MenuActivity.java b/app/src/main/java/org/andresoviedo/app/model3D/view/MenuActivity.java index 11010e28..a3333ff0 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/view/MenuActivity.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/view/MenuActivity.java @@ -16,11 +16,11 @@ import android.widget.Toast; import org.andresoviedo.app.model3D.services.wavefront.WavefrontLoader; -import org.andresoviedo.app.util.android.AndroidUtils; -import org.andresoviedo.app.util.android.AssetUtils; -import org.andresoviedo.app.util.android.ContentUtils; -import org.andresoviedo.app.util.android.FileUtils; -import org.andresoviedo.app.util.view.TextActivity; +import org.andresoviedo.util.android.AndroidUtils; +import org.andresoviedo.util.android.AssetUtils; +import org.andresoviedo.util.android.ContentUtils; +import org.andresoviedo.util.android.FileUtils; +import org.andresoviedo.util.view.TextActivity; import org.andresoviedo.dddmodel2.R; import java.io.File; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/view/ModelActivity.java b/app/src/main/java/org/andresoviedo/app/model3D/view/ModelActivity.java index 2b340010..235b31b2 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/view/ModelActivity.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/view/ModelActivity.java @@ -16,7 +16,7 @@ import org.andresoviedo.app.model3D.services.ExampleSceneLoader; import org.andresoviedo.app.model3D.services.SceneLoader; -import org.andresoviedo.app.util.android.ContentUtils; +import org.andresoviedo.util.android.ContentUtils; import org.andresoviedo.dddmodel2.R; import java.io.IOException; diff --git a/app/src/main/java/org/andresoviedo/app/model3D/view/ModelRenderer.java b/app/src/main/java/org/andresoviedo/app/model3D/view/ModelRenderer.java index 84ec8078..1d71c475 100644 --- a/app/src/main/java/org/andresoviedo/app/model3D/view/ModelRenderer.java +++ b/app/src/main/java/org/andresoviedo/app/model3D/view/ModelRenderer.java @@ -196,8 +196,9 @@ public void onDrawFrame(GL10 unused) { if (objData.getDrawMode() == GLES20.GL_POINTS){ Object3DImpl lightBulbDrawer = (Object3DImpl) drawer.getPointDrawer(); lightBulbDrawer.draw(objData,modelProjectionMatrix, modelViewMatrix, GLES20.GL_POINTS,lightPosInEyeSpace); - } - else if (scene.isDrawWireframe() && objData.getDrawMode() != GLES20.GL_POINTS + } else if (scene.isAnaglyph()){ + // TODO: implement anaglyph + } else if (scene.isDrawWireframe() && objData.getDrawMode() != GLES20.GL_POINTS && objData.getDrawMode() != GLES20.GL_LINES && objData.getDrawMode() != GLES20.GL_LINE_STRIP && objData.getDrawMode() != GLES20.GL_LINE_LOOP) { // Log.d("ModelRenderer","Drawing wireframe model..."); diff --git a/app/src/main/java/org/andresoviedo/app/util/android/AndroidURLConnection.java b/app/src/main/java/org/andresoviedo/util/android/AndroidURLConnection.java similarity index 95% rename from app/src/main/java/org/andresoviedo/app/util/android/AndroidURLConnection.java rename to app/src/main/java/org/andresoviedo/util/android/AndroidURLConnection.java index 6c90442d..259a3fd3 100644 --- a/app/src/main/java/org/andresoviedo/app/util/android/AndroidURLConnection.java +++ b/app/src/main/java/org/andresoviedo/util/android/AndroidURLConnection.java @@ -1,4 +1,4 @@ -package org.andresoviedo.app.util.android; +package org.andresoviedo.util.android; import android.util.Log; diff --git a/app/src/main/java/org/andresoviedo/app/util/android/AndroidURLStreamHandlerFactory.java b/app/src/main/java/org/andresoviedo/util/android/AndroidURLStreamHandlerFactory.java similarity index 65% rename from app/src/main/java/org/andresoviedo/app/util/android/AndroidURLStreamHandlerFactory.java rename to app/src/main/java/org/andresoviedo/util/android/AndroidURLStreamHandlerFactory.java index 1f9df065..b41ba7c5 100644 --- a/app/src/main/java/org/andresoviedo/app/util/android/AndroidURLStreamHandlerFactory.java +++ b/app/src/main/java/org/andresoviedo/util/android/AndroidURLStreamHandlerFactory.java @@ -1,4 +1,4 @@ -package org.andresoviedo.app.util.android; +package org.andresoviedo.util.android; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; @@ -8,9 +8,9 @@ public class AndroidURLStreamHandlerFactory implements URLStreamHandlerFactory { @Override public URLStreamHandler createURLStreamHandler(String protocol) { if ("assets".equals(protocol)) { - return new org.andresoviedo.app.util.android.assets.Handler(); + return new org.andresoviedo.util.android.assets.Handler(); } else if ("content".equals(protocol)){ - return new org.andresoviedo.app.util.android.content.Handler(); + return new org.andresoviedo.util.android.content.Handler(); } return null; } diff --git a/app/src/main/java/org/andresoviedo/app/util/android/AndroidUtils.java b/app/src/main/java/org/andresoviedo/util/android/AndroidUtils.java similarity index 97% rename from app/src/main/java/org/andresoviedo/app/util/android/AndroidUtils.java rename to app/src/main/java/org/andresoviedo/util/android/AndroidUtils.java index 2fc51df6..89401f0f 100644 --- a/app/src/main/java/org/andresoviedo/app/util/android/AndroidUtils.java +++ b/app/src/main/java/org/andresoviedo/util/android/AndroidUtils.java @@ -1,4 +1,4 @@ -package org.andresoviedo.app.util.android; +package org.andresoviedo.util.android; import android.annotation.TargetApi; import android.app.Activity; diff --git a/app/src/main/java/org/andresoviedo/app/util/android/AssetUtils.java b/app/src/main/java/org/andresoviedo/util/android/AssetUtils.java similarity index 98% rename from app/src/main/java/org/andresoviedo/app/util/android/AssetUtils.java rename to app/src/main/java/org/andresoviedo/util/android/AssetUtils.java index 12332e30..584a67a6 100644 --- a/app/src/main/java/org/andresoviedo/app/util/android/AssetUtils.java +++ b/app/src/main/java/org/andresoviedo/util/android/AssetUtils.java @@ -1,4 +1,4 @@ -package org.andresoviedo.app.util.android; +package org.andresoviedo.util.android; import android.app.AlertDialog; import android.content.Context; diff --git a/app/src/main/java/org/andresoviedo/app/util/android/ContentUtils.java b/app/src/main/java/org/andresoviedo/util/android/ContentUtils.java similarity index 99% rename from app/src/main/java/org/andresoviedo/app/util/android/ContentUtils.java rename to app/src/main/java/org/andresoviedo/util/android/ContentUtils.java index 7b921394..4ff909f1 100644 --- a/app/src/main/java/org/andresoviedo/app/util/android/ContentUtils.java +++ b/app/src/main/java/org/andresoviedo/util/android/ContentUtils.java @@ -1,4 +1,4 @@ -package org.andresoviedo.app.util.android; +package org.andresoviedo.util.android; import android.annotation.TargetApi; import android.app.Activity; diff --git a/app/src/main/java/org/andresoviedo/app/util/android/FileUtils.java b/app/src/main/java/org/andresoviedo/util/android/FileUtils.java similarity index 99% rename from app/src/main/java/org/andresoviedo/app/util/android/FileUtils.java rename to app/src/main/java/org/andresoviedo/util/android/FileUtils.java index 95c84250..71a7f4e1 100644 --- a/app/src/main/java/org/andresoviedo/app/util/android/FileUtils.java +++ b/app/src/main/java/org/andresoviedo/util/android/FileUtils.java @@ -1,4 +1,4 @@ -package org.andresoviedo.app.util.android; +package org.andresoviedo.util.android; import android.app.AlertDialog; import android.content.Context; diff --git a/app/src/main/java/org/andresoviedo/app/util/android/assets/Handler.java b/app/src/main/java/org/andresoviedo/util/android/assets/Handler.java similarity index 72% rename from app/src/main/java/org/andresoviedo/app/util/android/assets/Handler.java rename to app/src/main/java/org/andresoviedo/util/android/assets/Handler.java index 6f431bad..5b442b47 100644 --- a/app/src/main/java/org/andresoviedo/app/util/android/assets/Handler.java +++ b/app/src/main/java/org/andresoviedo/util/android/assets/Handler.java @@ -1,6 +1,6 @@ -package org.andresoviedo.app.util.android.assets; +package org.andresoviedo.util.android.assets; -import org.andresoviedo.app.util.android.AndroidURLConnection; +import org.andresoviedo.util.android.AndroidURLConnection; import java.net.URL; import java.net.URLConnection; diff --git a/app/src/main/java/org/andresoviedo/app/util/android/content/Handler.java b/app/src/main/java/org/andresoviedo/util/android/content/Handler.java similarity index 72% rename from app/src/main/java/org/andresoviedo/app/util/android/content/Handler.java rename to app/src/main/java/org/andresoviedo/util/android/content/Handler.java index 8cd4c54f..a2a9ef88 100644 --- a/app/src/main/java/org/andresoviedo/app/util/android/content/Handler.java +++ b/app/src/main/java/org/andresoviedo/util/android/content/Handler.java @@ -1,6 +1,6 @@ -package org.andresoviedo.app.util.android.content; +package org.andresoviedo.util.android.content; -import org.andresoviedo.app.util.android.AndroidURLConnection; +import org.andresoviedo.util.android.AndroidURLConnection; import java.net.URL; import java.net.URLConnection; diff --git a/app/src/main/java/org/andresoviedo/app/util/io/IOUtils.java b/app/src/main/java/org/andresoviedo/util/io/IOUtils.java similarity index 95% rename from app/src/main/java/org/andresoviedo/app/util/io/IOUtils.java rename to app/src/main/java/org/andresoviedo/util/io/IOUtils.java index bb012b1f..6631fece 100644 --- a/app/src/main/java/org/andresoviedo/app/util/io/IOUtils.java +++ b/app/src/main/java/org/andresoviedo/util/io/IOUtils.java @@ -1,4 +1,4 @@ -package org.andresoviedo.app.util.io; +package org.andresoviedo.util.io; import java.io.ByteArrayOutputStream; import java.io.File; diff --git a/app/src/main/java/org/andresoviedo/app/util/io/ProgressMonitorInputStream.java b/app/src/main/java/org/andresoviedo/util/io/ProgressMonitorInputStream.java similarity index 93% rename from app/src/main/java/org/andresoviedo/app/util/io/ProgressMonitorInputStream.java rename to app/src/main/java/org/andresoviedo/util/io/ProgressMonitorInputStream.java index 3d51d540..9e3f6c3e 100644 --- a/app/src/main/java/org/andresoviedo/app/util/io/ProgressMonitorInputStream.java +++ b/app/src/main/java/org/andresoviedo/util/io/ProgressMonitorInputStream.java @@ -1,4 +1,4 @@ -package org.andresoviedo.app.util.io; +package org.andresoviedo.util.io; import android.app.Activity; diff --git a/app/src/main/java/org/andresoviedo/app/util/math/Math3DUtils.java b/app/src/main/java/org/andresoviedo/util/math/Math3DUtils.java similarity index 99% rename from app/src/main/java/org/andresoviedo/app/util/math/Math3DUtils.java rename to app/src/main/java/org/andresoviedo/util/math/Math3DUtils.java index e34c6580..ffd0a1d7 100644 --- a/app/src/main/java/org/andresoviedo/app/util/math/Math3DUtils.java +++ b/app/src/main/java/org/andresoviedo/util/math/Math3DUtils.java @@ -1,4 +1,4 @@ -package org.andresoviedo.app.util.math; +package org.andresoviedo.util.math; import android.opengl.Matrix; diff --git a/app/src/main/java/org/andresoviedo/app/util/math/Quaternion.java b/app/src/main/java/org/andresoviedo/util/math/Quaternion.java similarity index 96% rename from app/src/main/java/org/andresoviedo/app/util/math/Quaternion.java rename to app/src/main/java/org/andresoviedo/util/math/Quaternion.java index ce9e7b4a..c87154b3 100644 --- a/app/src/main/java/org/andresoviedo/app/util/math/Quaternion.java +++ b/app/src/main/java/org/andresoviedo/util/math/Quaternion.java @@ -1,203 +1,203 @@ -package org.andresoviedo.app.util.math; - -/** - * A quaternion simply represents a 3D rotation. The maths behind it is quite - * complex (literally; it involves complex numbers) so I wont go into it in too - * much detail. The important things to note are that it represents a 3d - * rotation, it's very easy to interpolate between two quaternion rotations - * (which would not be easy to do correctly with Euler rotations or rotation - * matrices), and you can convert to and from matrices fairly easily. So when we - * need to interpolate between rotations we'll represent them as quaternions, - * but when we need to apply the rotations to anything we'll convert back to a - * matrix. - * - * An quick introduction video to quaternions: - * https://www.youtube.com/watch?v=SCbpxiCN0U0 - * - * and a slightly longer one: - * https://www.youtube.com/watch?v=fKIss4EV6ME&t=0s - * - * - * @author Karl - * - */ -public class Quaternion { - - private float x, y, z, w; - - /** - * Creates a quaternion and normalizes it. - * - * @param x - * @param y - * @param z - * @param w - */ - public Quaternion(float x, float y, float z, float w) { - this.x = x; - this.y = y; - this.z = z; - this.w = w; - normalize(); - } - - /** - * Normalizes the quaternion. - */ - public void normalize() { - float mag = (float) Math.sqrt(w * w + x * x + y * y + z * z); - w /= mag; - x /= mag; - y /= mag; - z /= mag; - } - - /** - * Converts the quaternion to a 4x4 matrix representing the exact same - * rotation as this quaternion. (The rotation is only contained in the - * top-left 3x3 part, but a 4x4 matrix is returned here for convenience - * seeing as it will be multiplied with other 4x4 matrices). - * - * More detailed explanation here: - * http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/ - * - * @return The rotation matrix which represents the exact same rotation as - * this quaternion. - */ - public float[] toRotationMatrix(float[] matrix) { - final float xy = x * y; - final float xz = x * z; - final float xw = x * w; - final float yz = y * z; - final float yw = y * w; - final float zw = z * w; - final float xSquared = x * x; - final float ySquared = y * y; - final float zSquared = z * z; - matrix[0] = 1 - 2 * (ySquared + zSquared); - matrix[1] = 2 * (xy - zw); - matrix[2] = 2 * (xz + yw); - matrix[3] = 0; - matrix[4] = 2 * (xy + zw); - matrix[5] = 1 - 2 * (xSquared + zSquared); - matrix[6] = 2 * (yz - xw); - matrix[7] = 0; - matrix[8] = 2 * (xz - yw); - matrix[9] = 2 * (yz + xw); - matrix[10] = 1 - 2 * (xSquared + ySquared); - matrix[11] = 0; - matrix[12] = 0; - matrix[13] = 0; - matrix[14] = 0; - matrix[15] = 1; - return matrix; - } - - /** - * Extracts the rotation part of a transformation matrix and converts it to - * a quaternion using the magic of maths. - * - * More detailed explanation here: - * http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm - * - * @param matrix - * - the transformation matrix containing the rotation which this - * quaternion shall represent. - */ - public static Quaternion fromMatrix(float[] matrix) { - float w, x, y, z; - float diagonal = matrix[0] + matrix[5] + matrix[10]; - if (diagonal > 0) { - float w4 = (float) (Math.sqrt(diagonal + 1f) * 2f); - w = w4 / 4f; - x = (matrix[9] - matrix[6]) / w4; - y = (matrix[2] - matrix[8]) / w4; - z = (matrix[4] - matrix[1]) / w4; - } else if ((matrix[0] > matrix[5]) && (matrix[0] > matrix[10])) { - float x4 = (float) (Math.sqrt(1f + matrix[0] - matrix[5] - matrix[10]) * 2f); - w = (matrix[9] - matrix[6]) / x4; - x = x4 / 4f; - y = (matrix[1] + matrix[4]) / x4; - z = (matrix[2] + matrix[8]) / x4; - } else if (matrix[5] > matrix[10]) { - float y4 = (float) (Math.sqrt(1f + matrix[5] - matrix[0] - matrix[10]) * 2f); - w = (matrix[2] - matrix[8]) / y4; - x = (matrix[1] + matrix[4]) / y4; - y = y4 / 4f; - z = (matrix[6] + matrix[9]) / y4; - } else { - float z4 = (float) (Math.sqrt(1f + matrix[10] - matrix[0] - matrix[5]) * 2f); - w = (matrix[4] - matrix[1]) / z4; - x = (matrix[2] + matrix[8]) / z4; - y = (matrix[6] + matrix[9]) / z4; - z = z4 / 4f; - } - return new Quaternion(x, y, z, w); - } - - /** - * Interpolates between two quaternion rotations and returns the resulting - * quaternion rotation. The interpolation method here is "nlerp", or - * "normalized-lerp". Another mnethod that could be used is "slerp", and you - * can see a comparison of the methods here: - * https://keithmaggio.wordpress.com/2011/02/15/math-magician-lerp-slerp-and-nlerp/ - * - * and here: - * http://number-none.com/product/Understanding%20Slerp,%20Then%20Not%20Using%20It/ - * - * @param a - * @param b - * @param blend - * - a value between 0 and 1 indicating how far to interpolate - * between the two quaternions. - * @return The resulting interpolated rotation in quaternion format. - */ - public static Quaternion interpolate(Quaternion a, Quaternion b, float blend) { - // TODO: optimize this (memory allocation) - Quaternion result = new Quaternion(0, 0, 0, 1); - float dot = a.w * b.w + a.x * b.x + a.y * b.y + a.z * b.z; - float blendI = 1f - blend; - if (dot < 0) { - result.w = blendI * a.w + blend * -b.w; - result.x = blendI * a.x + blend * -b.x; - result.y = blendI * a.y + blend * -b.y; - result.z = blendI * a.z + blend * -b.z; - } else { - result.w = blendI * a.w + blend * b.w; - result.x = blendI * a.x + blend * b.x; - result.y = blendI * a.y + blend * b.y; - result.z = blendI * a.z + blend * b.z; - } - result.normalize(); - return result; - } - - public static void interpolate(Quaternion a, Quaternion b, float blend, float[] output) { - Quaternion result = new Quaternion(0, 0, 0, 1); - float dot = a.w * b.w + a.x * b.x + a.y * b.y + a.z * b.z; - float blendI = 1f - blend; - if (dot < 0) { - result.w = blendI * a.w + blend * -b.w; - result.x = blendI * a.x + blend * -b.x; - result.y = blendI * a.y + blend * -b.y; - result.z = blendI * a.z + blend * -b.z; - } else { - result.w = blendI * a.w + blend * b.w; - result.x = blendI * a.x + blend * b.x; - result.y = blendI * a.y + blend * b.y; - result.z = blendI * a.z + blend * b.z; - } - result.normalize(); - result.toRotationMatrix(output); - } - - @Override - public String toString() { - return "Quaternion{" + - "x=" + x + - ", y=" + y + - ", z=" + z + - ", w=" + w + - '}'; - } -} +package org.andresoviedo.util.math; + +/** + * A quaternion simply represents a 3D rotation. The maths behind it is quite + * complex (literally; it involves complex numbers) so I wont go into it in too + * much detail. The important things to note are that it represents a 3d + * rotation, it's very easy to interpolate between two quaternion rotations + * (which would not be easy to do correctly with Euler rotations or rotation + * matrices), and you can convert to and from matrices fairly easily. So when we + * need to interpolate between rotations we'll represent them as quaternions, + * but when we need to apply the rotations to anything we'll convert back to a + * matrix. + * + * An quick introduction video to quaternions: + * https://www.youtube.com/watch?v=SCbpxiCN0U0 + * + * and a slightly longer one: + * https://www.youtube.com/watch?v=fKIss4EV6ME&t=0s + * + * + * @author Karl + * + */ +public class Quaternion { + + private float x, y, z, w; + + /** + * Creates a quaternion and normalizes it. + * + * @param x + * @param y + * @param z + * @param w + */ + public Quaternion(float x, float y, float z, float w) { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + normalize(); + } + + /** + * Normalizes the quaternion. + */ + public void normalize() { + float mag = (float) Math.sqrt(w * w + x * x + y * y + z * z); + w /= mag; + x /= mag; + y /= mag; + z /= mag; + } + + /** + * Converts the quaternion to a 4x4 matrix representing the exact same + * rotation as this quaternion. (The rotation is only contained in the + * top-left 3x3 part, but a 4x4 matrix is returned here for convenience + * seeing as it will be multiplied with other 4x4 matrices). + * + * More detailed explanation here: + * http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/ + * + * @return The rotation matrix which represents the exact same rotation as + * this quaternion. + */ + public float[] toRotationMatrix(float[] matrix) { + final float xy = x * y; + final float xz = x * z; + final float xw = x * w; + final float yz = y * z; + final float yw = y * w; + final float zw = z * w; + final float xSquared = x * x; + final float ySquared = y * y; + final float zSquared = z * z; + matrix[0] = 1 - 2 * (ySquared + zSquared); + matrix[1] = 2 * (xy - zw); + matrix[2] = 2 * (xz + yw); + matrix[3] = 0; + matrix[4] = 2 * (xy + zw); + matrix[5] = 1 - 2 * (xSquared + zSquared); + matrix[6] = 2 * (yz - xw); + matrix[7] = 0; + matrix[8] = 2 * (xz - yw); + matrix[9] = 2 * (yz + xw); + matrix[10] = 1 - 2 * (xSquared + ySquared); + matrix[11] = 0; + matrix[12] = 0; + matrix[13] = 0; + matrix[14] = 0; + matrix[15] = 1; + return matrix; + } + + /** + * Extracts the rotation part of a transformation matrix and converts it to + * a quaternion using the magic of maths. + * + * More detailed explanation here: + * http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + * + * @param matrix + * - the transformation matrix containing the rotation which this + * quaternion shall represent. + */ + public static Quaternion fromMatrix(float[] matrix) { + float w, x, y, z; + float diagonal = matrix[0] + matrix[5] + matrix[10]; + if (diagonal > 0) { + float w4 = (float) (Math.sqrt(diagonal + 1f) * 2f); + w = w4 / 4f; + x = (matrix[9] - matrix[6]) / w4; + y = (matrix[2] - matrix[8]) / w4; + z = (matrix[4] - matrix[1]) / w4; + } else if ((matrix[0] > matrix[5]) && (matrix[0] > matrix[10])) { + float x4 = (float) (Math.sqrt(1f + matrix[0] - matrix[5] - matrix[10]) * 2f); + w = (matrix[9] - matrix[6]) / x4; + x = x4 / 4f; + y = (matrix[1] + matrix[4]) / x4; + z = (matrix[2] + matrix[8]) / x4; + } else if (matrix[5] > matrix[10]) { + float y4 = (float) (Math.sqrt(1f + matrix[5] - matrix[0] - matrix[10]) * 2f); + w = (matrix[2] - matrix[8]) / y4; + x = (matrix[1] + matrix[4]) / y4; + y = y4 / 4f; + z = (matrix[6] + matrix[9]) / y4; + } else { + float z4 = (float) (Math.sqrt(1f + matrix[10] - matrix[0] - matrix[5]) * 2f); + w = (matrix[4] - matrix[1]) / z4; + x = (matrix[2] + matrix[8]) / z4; + y = (matrix[6] + matrix[9]) / z4; + z = z4 / 4f; + } + return new Quaternion(x, y, z, w); + } + + /** + * Interpolates between two quaternion rotations and returns the resulting + * quaternion rotation. The interpolation method here is "nlerp", or + * "normalized-lerp". Another mnethod that could be used is "slerp", and you + * can see a comparison of the methods here: + * https://keithmaggio.wordpress.com/2011/02/15/math-magician-lerp-slerp-and-nlerp/ + * + * and here: + * http://number-none.com/product/Understanding%20Slerp,%20Then%20Not%20Using%20It/ + * + * @param a + * @param b + * @param blend + * - a value between 0 and 1 indicating how far to interpolate + * between the two quaternions. + * @return The resulting interpolated rotation in quaternion format. + */ + public static Quaternion interpolate(Quaternion a, Quaternion b, float blend) { + // TODO: optimize this (memory allocation) + Quaternion result = new Quaternion(0, 0, 0, 1); + float dot = a.w * b.w + a.x * b.x + a.y * b.y + a.z * b.z; + float blendI = 1f - blend; + if (dot < 0) { + result.w = blendI * a.w + blend * -b.w; + result.x = blendI * a.x + blend * -b.x; + result.y = blendI * a.y + blend * -b.y; + result.z = blendI * a.z + blend * -b.z; + } else { + result.w = blendI * a.w + blend * b.w; + result.x = blendI * a.x + blend * b.x; + result.y = blendI * a.y + blend * b.y; + result.z = blendI * a.z + blend * b.z; + } + result.normalize(); + return result; + } + + public static void interpolate(Quaternion a, Quaternion b, float blend, float[] output) { + Quaternion result = new Quaternion(0, 0, 0, 1); + float dot = a.w * b.w + a.x * b.x + a.y * b.y + a.z * b.z; + float blendI = 1f - blend; + if (dot < 0) { + result.w = blendI * a.w + blend * -b.w; + result.x = blendI * a.x + blend * -b.x; + result.y = blendI * a.y + blend * -b.y; + result.z = blendI * a.z + blend * -b.z; + } else { + result.w = blendI * a.w + blend * b.w; + result.x = blendI * a.x + blend * b.x; + result.y = blendI * a.y + blend * b.y; + result.z = blendI * a.z + blend * b.z; + } + result.normalize(); + result.toRotationMatrix(output); + } + + @Override + public String toString() { + return "Quaternion{" + + "x=" + x + + ", y=" + y + + ", z=" + z + + ", w=" + w + + '}'; + } +} diff --git a/app/src/main/java/org/andresoviedo/app/util/view/TextActivity.java b/app/src/main/java/org/andresoviedo/util/view/TextActivity.java similarity index 90% rename from app/src/main/java/org/andresoviedo/app/util/view/TextActivity.java rename to app/src/main/java/org/andresoviedo/util/view/TextActivity.java index 74f146e9..7af56018 100644 --- a/app/src/main/java/org/andresoviedo/app/util/view/TextActivity.java +++ b/app/src/main/java/org/andresoviedo/util/view/TextActivity.java @@ -1,28 +1,28 @@ -package org.andresoviedo.app.util.view; - -import android.app.Activity; -import android.os.Bundle; -import android.text.method.LinkMovementMethod; -import android.widget.TextView; - -import org.andresoviedo.dddmodel2.R; - -public class TextActivity extends Activity { - - private TextView text; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_text); - - Bundle b = getIntent().getExtras(); - String title = b.getString("title"); - setTitle(title); - - String value = b.getString("text"); - text = (TextView) findViewById(R.id.text_activity_text); - text.setMovementMethod(LinkMovementMethod.getInstance()); - text.setText(value); - } -} +package org.andresoviedo.util.view; + +import android.app.Activity; +import android.os.Bundle; +import android.text.method.LinkMovementMethod; +import android.widget.TextView; + +import org.andresoviedo.dddmodel2.R; + +public class TextActivity extends Activity { + + private TextView text; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_text); + + Bundle b = getIntent().getExtras(); + String title = b.getString("title"); + setTitle(title); + + String value = b.getString("text"); + text = (TextView) findViewById(R.id.text_activity_text); + text.setMovementMethod(LinkMovementMethod.getInstance()); + text.setText(value); + } +} diff --git a/app/src/main/java/org/andresoviedo/app/util/xml/XmlNode.java b/app/src/main/java/org/andresoviedo/util/xml/XmlNode.java similarity index 95% rename from app/src/main/java/org/andresoviedo/app/util/xml/XmlNode.java rename to app/src/main/java/org/andresoviedo/util/xml/XmlNode.java index cbfa7624..304614f1 100644 --- a/app/src/main/java/org/andresoviedo/app/util/xml/XmlNode.java +++ b/app/src/main/java/org/andresoviedo/util/xml/XmlNode.java @@ -1,168 +1,168 @@ -package org.andresoviedo.app.util.xml; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Represents a node in an XML file. This contains the name of the node, a map - * of the attributes and their values, any text data between the start and end - * tag, and a list of all its children nodes. - * - * @author Karl - * - */ -public class XmlNode { - - private String name; - private Map attributes; - private String data; - private Map> childNodes; - - protected XmlNode(String name) { - this.name = name; - } - - /** - * @return The name of the XML node. - */ - public String getName() { - return name; - } - - /** - * @return Any text data contained between the start and end tag of the - * node. - */ - public String getData() { - return data; - } - - /** - * Gets the value of a certain attribute of the node. Returns {@code null} - * if the attribute doesn't exist. - * - * @param attr - * - the name of the attribute. - * @return The value of the attribute. - */ - public String getAttribute(String attr) { - if (attributes != null) { - return attributes.get(attr); - } else { - return null; - } - } - - /** - * Gets a certain child node of this node. - * - * @param childName - * - the name of the child node. - * @return The child XML node with the given name. - */ - public XmlNode getChild(String childName) { - if (childNodes != null) { - List nodes = childNodes.get(childName); - if (nodes != null && !nodes.isEmpty()) { - return nodes.get(0); - } - } - return null; - - } - - /** - * Gets a child node with a certain name, and with a given value of a given - * attribute. Used to get a specific child when there are multiple child - * nodes with the same node name. - * - * @param childName - * - the name of the child node. - * @param attr - * - the attribute whose value is to be checked. - * @param value - * - the value that the attribute must have. - * @return The child node which has the correct name and the correct value - * for the chosen attribute. - */ - public XmlNode getChildWithAttribute(String childName, String attr, String value) { - List children = getChildren(childName); - if (children == null || children.isEmpty()) { - return null; - } - for (XmlNode child : children) { - String val = child.getAttribute(attr); - if (value.equals(val)) { - return child; - } - } - return null; - } - - /** - * Get the child nodes of this node that have a given name. - * - * @param name - * - the name of the child nodes. - * @return A list of the child nodes with the given name. If none exist then - * an empty list is returned. - */ - public List getChildren(String name) { - if (childNodes != null) { - List children = childNodes.get(name); - if (children != null) { - return children; - } - } - return new ArrayList(); - } - - /** - * Adds a new attribute to this node. An attribute has a name and a value. - * Attributes are stored in a HashMap which is initialized in here if it was - * previously null. - * - * @param attr - * - the name of the attribute. - * @param value - * - the value of the attribute. - */ - protected void addAttribute(String attr, String value) { - if (attributes == null) { - attributes = new HashMap(); - } - attributes.put(attr, value); - } - - /** - * Adds a child node to this node. - * - * @param child - * - the child node to add. - */ - protected void addChild(XmlNode child) { - if (childNodes == null) { - childNodes = new HashMap>(); - } - List list = childNodes.get(child.name); - if (list == null) { - list = new ArrayList(); - childNodes.put(child.name, list); - } - list.add(child); - } - - /** - * Sets some data for this node. - * - * @param data - * - the data for this node (text that is found between the start - * and end tags of this node). - */ - protected void setData(String data) { - this.data = data; - } - -} +package org.andresoviedo.util.xml; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Represents a node in an XML file. This contains the name of the node, a map + * of the attributes and their values, any text data between the start and end + * tag, and a list of all its children nodes. + * + * @author Karl + * + */ +public class XmlNode { + + private String name; + private Map attributes; + private String data; + private Map> childNodes; + + protected XmlNode(String name) { + this.name = name; + } + + /** + * @return The name of the XML node. + */ + public String getName() { + return name; + } + + /** + * @return Any text data contained between the start and end tag of the + * node. + */ + public String getData() { + return data; + } + + /** + * Gets the value of a certain attribute of the node. Returns {@code null} + * if the attribute doesn't exist. + * + * @param attr + * - the name of the attribute. + * @return The value of the attribute. + */ + public String getAttribute(String attr) { + if (attributes != null) { + return attributes.get(attr); + } else { + return null; + } + } + + /** + * Gets a certain child node of this node. + * + * @param childName + * - the name of the child node. + * @return The child XML node with the given name. + */ + public XmlNode getChild(String childName) { + if (childNodes != null) { + List nodes = childNodes.get(childName); + if (nodes != null && !nodes.isEmpty()) { + return nodes.get(0); + } + } + return null; + + } + + /** + * Gets a child node with a certain name, and with a given value of a given + * attribute. Used to get a specific child when there are multiple child + * nodes with the same node name. + * + * @param childName + * - the name of the child node. + * @param attr + * - the attribute whose value is to be checked. + * @param value + * - the value that the attribute must have. + * @return The child node which has the correct name and the correct value + * for the chosen attribute. + */ + public XmlNode getChildWithAttribute(String childName, String attr, String value) { + List children = getChildren(childName); + if (children == null || children.isEmpty()) { + return null; + } + for (XmlNode child : children) { + String val = child.getAttribute(attr); + if (value.equals(val)) { + return child; + } + } + return null; + } + + /** + * Get the child nodes of this node that have a given name. + * + * @param name + * - the name of the child nodes. + * @return A list of the child nodes with the given name. If none exist then + * an empty list is returned. + */ + public List getChildren(String name) { + if (childNodes != null) { + List children = childNodes.get(name); + if (children != null) { + return children; + } + } + return new ArrayList(); + } + + /** + * Adds a new attribute to this node. An attribute has a name and a value. + * Attributes are stored in a HashMap which is initialized in here if it was + * previously null. + * + * @param attr + * - the name of the attribute. + * @param value + * - the value of the attribute. + */ + protected void addAttribute(String attr, String value) { + if (attributes == null) { + attributes = new HashMap(); + } + attributes.put(attr, value); + } + + /** + * Adds a child node to this node. + * + * @param child + * - the child node to add. + */ + protected void addChild(XmlNode child) { + if (childNodes == null) { + childNodes = new HashMap>(); + } + List list = childNodes.get(child.name); + if (list == null) { + list = new ArrayList(); + childNodes.put(child.name, list); + } + list.add(child); + } + + /** + * Sets some data for this node. + * + * @param data + * - the data for this node (text that is found between the start + * and end tags of this node). + */ + protected void setData(String data) { + this.data = data; + } + +} diff --git a/app/src/main/java/org/andresoviedo/app/util/xml/XmlParser.java b/app/src/main/java/org/andresoviedo/util/xml/XmlParser.java similarity index 97% rename from app/src/main/java/org/andresoviedo/app/util/xml/XmlParser.java rename to app/src/main/java/org/andresoviedo/util/xml/XmlParser.java index 7adbde60..abc3d972 100644 --- a/app/src/main/java/org/andresoviedo/app/util/xml/XmlParser.java +++ b/app/src/main/java/org/andresoviedo/util/xml/XmlParser.java @@ -1,4 +1,4 @@ -package org.andresoviedo.app.util.xml; +package org.andresoviedo.util.xml; import android.util.Xml; diff --git a/engine/.gitignore b/engine/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/engine/.gitignore @@ -0,0 +1 @@ +/build diff --git a/engine/build.gradle b/engine/build.gradle new file mode 100644 index 00000000..7425a039 --- /dev/null +++ b/engine/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 27 + + + + defaultConfig { + minSdkVersion 8 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation 'com.android.support:appcompat-v7:27.1.1' + 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' +} diff --git a/engine/engine.iml b/engine/engine.iml new file mode 100644 index 00000000..fe7f5d97 --- /dev/null +++ b/engine/engine.iml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/engine/proguard-rules.pro b/engine/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/engine/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/engine/src/androidTest/java/org/andresoviedo/android_3d_model_engine/ExampleInstrumentedTest.java b/engine/src/androidTest/java/org/andresoviedo/android_3d_model_engine/ExampleInstrumentedTest.java new file mode 100644 index 00000000..5ef6a35d --- /dev/null +++ b/engine/src/androidTest/java/org/andresoviedo/android_3d_model_engine/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package org.andresoviedo.android_3d_model_engine; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("org.andresoviedo.android_3d_model_engine.test", appContext.getPackageName()); + } +} diff --git a/engine/src/main/AndroidManifest.xml b/engine/src/main/AndroidManifest.xml new file mode 100644 index 00000000..4d0cebc7 --- /dev/null +++ b/engine/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/engine/src/main/res/values/strings.xml b/engine/src/main/res/values/strings.xml new file mode 100644 index 00000000..0e6a1169 --- /dev/null +++ b/engine/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + android-3d-model-engine + diff --git a/engine/src/test/java/org/andresoviedo/android_3d_model_engine/ExampleUnitTest.java b/engine/src/test/java/org/andresoviedo/android_3d_model_engine/ExampleUnitTest.java new file mode 100644 index 00000000..2af7c6fa --- /dev/null +++ b/engine/src/test/java/org/andresoviedo/android_3d_model_engine/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package org.andresoviedo.android_3d_model_engine; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index e7b4def4..a1781b63 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app' +include ':app', ':engine'