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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ generateDebugSources
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ generateDebugSources
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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'