Skip to content

Commit f532d30

Browse files
committed
#176 gltf resources
1 parent 3623155 commit f532d30

File tree

10 files changed

+240
-5
lines changed

10 files changed

+240
-5
lines changed
23 KB
Binary file not shown.
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
{
2+
"accessors": [
3+
{
4+
"bufferView": 0,
5+
"componentType": 5126,
6+
"count": 406,
7+
"type": "VEC2"
8+
},
9+
{
10+
"bufferView": 1,
11+
"componentType": 5126,
12+
"count": 406,
13+
"type": "VEC3"
14+
},
15+
{
16+
"bufferView": 2,
17+
"componentType": 5126,
18+
"count": 406,
19+
"type": "VEC4"
20+
},
21+
{
22+
"bufferView": 3,
23+
"componentType": 5126,
24+
"count": 406,
25+
"type": "VEC3",
26+
"max": [
27+
0.02128091,
28+
0.06284806,
29+
0.0138090011
30+
],
31+
"min": [
32+
-0.02128091,
33+
-4.773855E-05,
34+
-0.013809
35+
]
36+
},
37+
{
38+
"bufferView": 4,
39+
"componentType": 5123,
40+
"count": 2046,
41+
"type": "SCALAR"
42+
}
43+
],
44+
"asset": {
45+
"generator": "glTF Tools for Unity",
46+
"version": "2.0"
47+
},
48+
"bufferViews": [
49+
{
50+
"buffer": 0,
51+
"byteLength": 3248
52+
},
53+
{
54+
"buffer": 0,
55+
"byteOffset": 3248,
56+
"byteLength": 4872
57+
},
58+
{
59+
"buffer": 0,
60+
"byteOffset": 8120,
61+
"byteLength": 6496
62+
},
63+
{
64+
"buffer": 0,
65+
"byteOffset": 14616,
66+
"byteLength": 4872
67+
},
68+
{
69+
"buffer": 0,
70+
"byteOffset": 19488,
71+
"byteLength": 4092
72+
}
73+
],
74+
"buffers": [
75+
{
76+
"uri": "Avocado.bin",
77+
"byteLength": 23580
78+
}
79+
],
80+
"images": [
81+
{
82+
"uri": "Avocado_baseColor.png"
83+
},
84+
{
85+
"uri": "Avocado_roughnessMetallic.png"
86+
},
87+
{
88+
"uri": "Avocado_normal.png"
89+
}
90+
],
91+
"meshes": [
92+
{
93+
"primitives": [
94+
{
95+
"attributes": {
96+
"TEXCOORD_0": 0,
97+
"NORMAL": 1,
98+
"TANGENT": 2,
99+
"POSITION": 3
100+
},
101+
"indices": 4,
102+
"material": 0
103+
}
104+
],
105+
"name": "Avocado"
106+
}
107+
],
108+
"materials": [
109+
{
110+
"pbrMetallicRoughness": {
111+
"baseColorTexture": {
112+
"index": 0
113+
},
114+
"metallicRoughnessTexture": {
115+
"index": 1
116+
}
117+
},
118+
"normalTexture": {
119+
"index": 2
120+
},
121+
"name": "2256_Avocado_d"
122+
}
123+
],
124+
"nodes": [
125+
{
126+
"mesh": 0,
127+
"rotation": [
128+
0.0,
129+
1.0,
130+
0.0,
131+
0.0
132+
],
133+
"name": "Avocado"
134+
}
135+
],
136+
"scene": 0,
137+
"scenes": [
138+
{
139+
"nodes": [
140+
0
141+
]
142+
}
143+
],
144+
"textures": [
145+
{
146+
"source": 0
147+
},
148+
{
149+
"source": 1
150+
},
151+
{
152+
"source": 2
153+
}
154+
]
155+
}
3.01 MB
Loading
3.33 MB
Loading
1.58 MB
Loading

app/src/main/java/org/andresoviedo/app/model3D/view/MenuActivity.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ private void loadModel() {
166166
}
167167

168168
private void loadModelFromAssets() {
169-
AssetUtils.createChooserDialog(this, "Select file", null, "models", "(?i).*\\.(obj|stl|dae)",
169+
AssetUtils.createChooserDialog(this, "Select file", null, "models", SUPPORTED_FILE_TYPES_REGEX,
170170
(String file) -> {
171171
if (file != null) {
172172
ContentUtils.provideAssets(this);
@@ -390,6 +390,8 @@ private void onLoadModel(Uri uri) throws IOException {
390390
askForRelatedFiles(1);
391391
} else if (uri.toString().toLowerCase().endsWith(".dae")) {
392392
askForRelatedFiles(2);
393+
} if (uri.toString().toLowerCase().endsWith(".gltf")) {
394+
askForRelatedFiles(3);
393395
} else {
394396
// no model type from filename, ask user...
395397
ContentUtils.showListDialog(this, "Select type", new String[]{"Wavefront (*.obj)", "Stereolithography (*" +

engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/SceneLoader.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.andresoviedo.android_3d_model_engine.model.Transform;
2020
import org.andresoviedo.android_3d_model_engine.objects.Point;
2121
import org.andresoviedo.android_3d_model_engine.services.collada.ColladaLoaderTask;
22+
import org.andresoviedo.android_3d_model_engine.services.gltf.GltfLoaderTask;
2223
import org.andresoviedo.android_3d_model_engine.services.stl.STLLoaderTask;
2324
import org.andresoviedo.android_3d_model_engine.services.wavefront.WavefrontLoaderTask;
2425
import org.andresoviedo.util.android.AndroidUtils;
@@ -225,6 +226,9 @@ public void init() {
225226
} else if (uri.toString().toLowerCase().endsWith(".dae") || type == 2) {
226227
Log.i("SceneLoader", "Loading Collada object from: " + uri);
227228
new ColladaLoaderTask(parent, uri, this).execute();
229+
} else if (uri.toString().toLowerCase().endsWith(".gltf") || type == 3) {
230+
Log.i("SceneLoader", "Loading GLTF object from: " + uri);
231+
new GltfLoaderTask(parent, uri, this).execute();
228232
}
229233
}
230234

engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/MeshData.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,10 @@ private static float[] calculateNormalFailsafe(float[] v1, float[] v2, float[] v
290290
try {
291291
Math3DUtils.normalize(normal);
292292
} catch (Exception e) {
293-
Log.e("MeshData", "Error calculating normal. " + e.getMessage()
293+
Log.w("MeshData", "Error calculating normal. " + e.getMessage()
294294
+ "," + Math3DUtils.toString(v1)
295295
+ "," + Math3DUtils.toString(v2)
296-
+ "," + Math3DUtils.toString(v3), e);
296+
+ "," + Math3DUtils.toString(v3));
297297
normal = WRONG_NORMAL;
298298
}
299299
return normal;
@@ -483,6 +483,8 @@ private void fixNormalsForElements() {
483483
int counter = 0;
484484
for (Element element : getElements()) {
485485

486+
if (element.getIndices().size() % 3 != 0) continue;
487+
486488
for (int i = 0; i < element.getIndices().size(); i += 3) {
487489

488490
final int idx1 = element.getIndices().get(i);
@@ -747,7 +749,7 @@ public void validate() {
747749
if (Float.isNaN(normal[2])) throw new IllegalArgumentException("NaN");
748750

749751
if (Math3DUtils.length(normal) < 0.9f) {
750-
throw new IllegalArgumentException("Wrong normal. Length < 1.0");
752+
Log.e("MeshData","Wrong normal. Length < 0.9");
751753
}
752754
}
753755

@@ -760,7 +762,7 @@ public void validate() {
760762

761763
// check normals
762764
if (vertexAttribute.getNormalIndex() < 0 || vertexAttribute.getNormalIndex() >= normals.size()) {
763-
throw new IllegalArgumentException("Wrong normal index: " + vertexAttribute.getNormalIndex());
765+
//throw new IllegalArgumentException("Wrong normal index: " + vertexAttribute.getNormalIndex());
764766
}
765767
}
766768
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.andresoviedo.android_3d_model_engine.services.gltf;
2+
3+
import android.util.Log;
4+
5+
import androidx.annotation.NonNull;
6+
7+
import org.andresoviedo.android_3d_model_engine.model.Object3DData;
8+
import org.andresoviedo.android_3d_model_engine.services.LoadListener;
9+
import org.andresoviedo.android_3d_model_engine.services.collada.entities.MeshData;
10+
import org.andresoviedo.util.android.ContentUtils;
11+
12+
import java.io.InputStream;
13+
import java.net.URI;
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
17+
public final class GltfLoader {
18+
19+
@NonNull
20+
public List<Object3DData> load(URI uri, LoadListener callback) {
21+
22+
final List<Object3DData> ret = new ArrayList<>();
23+
final List<MeshData> allMeshes = new ArrayList<>();
24+
25+
try (InputStream is = ContentUtils.getInputStream(uri)) {
26+
27+
Log.i("GltfLoaderTask", "Parsing file... " + uri.toString());
28+
callback.onProgress("Loading file...");
29+
30+
// gltf ...
31+
32+
/*GltfAssetReader gltfAssetReader = new GltfAssetReader();
33+
GltfAsset gltfAsset = gltfAssetReader.readWithoutReferences(is);
34+
URI baseUri = IO.getParent(uri);
35+
GltfReferenceResolver.resolveAll(
36+
gltfAsset.getReferences(), baseUri);
37+
GltfModel gltfModel = GltfModels.create(gltfAsset);
38+
BufferModel bufferModel = gltfModel.getBufferModels().get(0);
39+
<gltfModel.getMeshModels()>
40+
41+
callback.onProgress("Loading Buffers...");*/
42+
43+
} catch (Exception ex) {
44+
Log.e("ColladaLoaderTask", "Problem loading model", ex);
45+
}
46+
return ret;
47+
}
48+
49+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.andresoviedo.android_3d_model_engine.services.gltf;
2+
3+
import android.app.Activity;
4+
5+
import org.andresoviedo.android_3d_model_engine.model.Object3DData;
6+
import org.andresoviedo.android_3d_model_engine.services.LoadListener;
7+
import org.andresoviedo.android_3d_model_engine.services.LoaderTask;
8+
9+
import java.io.IOException;
10+
import java.net.URI;
11+
import java.util.List;
12+
13+
public class GltfLoaderTask extends LoaderTask {
14+
15+
public GltfLoaderTask(Activity parent, URI uri, LoadListener callback) {
16+
super(parent, uri, callback);
17+
}
18+
19+
@Override
20+
protected List<Object3DData> build() throws IOException {
21+
return new GltfLoader().load(uri, this);
22+
}
23+
}

0 commit comments

Comments
 (0)