mirror of
https://github.com/bevyengine/bevy
synced 2024-11-25 06:00:20 +00:00
initial gltf example
This commit is contained in:
parent
f27942e961
commit
86a467f0f3
9 changed files with 630 additions and 4 deletions
|
@ -15,6 +15,7 @@ zerocopy = "0.2"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
env_logger = "0.7"
|
env_logger = "0.7"
|
||||||
rand = "0.7.2"
|
rand = "0.7.2"
|
||||||
|
gltf = "0.14.0"
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
debug = true
|
debug = true
|
BIN
examples/assets/Box.glb
Normal file
BIN
examples/assets/Box.glb
Normal file
Binary file not shown.
142
examples/assets/Box.gltf
Normal file
142
examples/assets/Box.gltf
Normal file
|
@ -0,0 +1,142 @@
|
||||||
|
{
|
||||||
|
"asset": {
|
||||||
|
"generator": "COLLADA2GLTF",
|
||||||
|
"version": "2.0"
|
||||||
|
},
|
||||||
|
"scene": 0,
|
||||||
|
"scenes": [
|
||||||
|
{
|
||||||
|
"nodes": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"children": [
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"matrix": [
|
||||||
|
1.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
-1.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
1.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
1.0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mesh": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"primitives": [
|
||||||
|
{
|
||||||
|
"attributes": {
|
||||||
|
"NORMAL": 1,
|
||||||
|
"POSITION": 2
|
||||||
|
},
|
||||||
|
"indices": 0,
|
||||||
|
"mode": 4,
|
||||||
|
"material": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "Mesh"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"accessors": [
|
||||||
|
{
|
||||||
|
"bufferView": 0,
|
||||||
|
"byteOffset": 0,
|
||||||
|
"componentType": 5123,
|
||||||
|
"count": 36,
|
||||||
|
"max": [
|
||||||
|
23
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"type": "SCALAR"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 1,
|
||||||
|
"byteOffset": 0,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 24,
|
||||||
|
"max": [
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-1.0,
|
||||||
|
-1.0,
|
||||||
|
-1.0
|
||||||
|
],
|
||||||
|
"type": "VEC3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 1,
|
||||||
|
"byteOffset": 288,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 24,
|
||||||
|
"max": [
|
||||||
|
0.5,
|
||||||
|
0.5,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-0.5,
|
||||||
|
-0.5,
|
||||||
|
-0.5
|
||||||
|
],
|
||||||
|
"type": "VEC3"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"pbrMetallicRoughness": {
|
||||||
|
"baseColorFactor": [
|
||||||
|
0.800000011920929,
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"metallicFactor": 0.0
|
||||||
|
},
|
||||||
|
"name": "Red"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"bufferViews": [
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 576,
|
||||||
|
"byteLength": 72,
|
||||||
|
"target": 34963
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 0,
|
||||||
|
"byteLength": 576,
|
||||||
|
"byteStride": 12,
|
||||||
|
"target": 34962
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"buffers": [
|
||||||
|
{
|
||||||
|
"byteLength": 648,
|
||||||
|
"uri": "Box0.bin"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
BIN
examples/assets/Box0.bin
Normal file
BIN
examples/assets/Box0.bin
Normal file
Binary file not shown.
468
examples/assets/Lantern.gltf
Normal file
468
examples/assets/Lantern.gltf
Normal file
|
@ -0,0 +1,468 @@
|
||||||
|
{
|
||||||
|
"accessors": [
|
||||||
|
{
|
||||||
|
"bufferView": 0,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 926,
|
||||||
|
"type": "VEC2",
|
||||||
|
"max": [
|
||||||
|
0.992169142,
|
||||||
|
-0.007998445
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
0.0107366741,
|
||||||
|
-0.992534757
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 1,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 926,
|
||||||
|
"type": "VEC3",
|
||||||
|
"max": [
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-1.0,
|
||||||
|
-1.0,
|
||||||
|
-1.0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 2,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 926,
|
||||||
|
"type": "VEC4",
|
||||||
|
"max": [
|
||||||
|
1.0,
|
||||||
|
0.9999658,
|
||||||
|
1.0,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-1.0,
|
||||||
|
-0.962171,
|
||||||
|
-1.0,
|
||||||
|
1.0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 3,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 926,
|
||||||
|
"type": "VEC3",
|
||||||
|
"max": [
|
||||||
|
7.74559927,
|
||||||
|
12.8321095,
|
||||||
|
2.31570983
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-7.74559927,
|
||||||
|
-12.8321095,
|
||||||
|
-2.31570983
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 4,
|
||||||
|
"componentType": 5123,
|
||||||
|
"count": 2616,
|
||||||
|
"type": "SCALAR",
|
||||||
|
"max": [
|
||||||
|
925
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 5,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 756,
|
||||||
|
"type": "VEC2",
|
||||||
|
"max": [
|
||||||
|
0.8007193,
|
||||||
|
-0.0581455827
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
0.351246148,
|
||||||
|
-0.361011624
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 6,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 756,
|
||||||
|
"type": "VEC3",
|
||||||
|
"max": [
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
0.999998
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-1.0,
|
||||||
|
-1.0,
|
||||||
|
-0.999998
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 7,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 756,
|
||||||
|
"type": "VEC4",
|
||||||
|
"max": [
|
||||||
|
0.9997526,
|
||||||
|
1.0,
|
||||||
|
0.999752462,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-0.9995128,
|
||||||
|
-1.0,
|
||||||
|
-0.999752462,
|
||||||
|
1.0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 8,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 756,
|
||||||
|
"type": "VEC3",
|
||||||
|
"max": [
|
||||||
|
0.129208073,
|
||||||
|
0.6523504,
|
||||||
|
0.129208073
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-0.129208073,
|
||||||
|
-0.6523504,
|
||||||
|
-0.129208073
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 9,
|
||||||
|
"componentType": 5123,
|
||||||
|
"count": 3744,
|
||||||
|
"type": "SCALAR",
|
||||||
|
"max": [
|
||||||
|
755
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 10,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 2463,
|
||||||
|
"type": "VEC2",
|
||||||
|
"max": [
|
||||||
|
0.9923278,
|
||||||
|
-0.00728821754
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
0.3673209,
|
||||||
|
-0.413352221
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 11,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 2463,
|
||||||
|
"type": "VEC3",
|
||||||
|
"max": [
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-1.0,
|
||||||
|
-1.0,
|
||||||
|
-1.0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 12,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 2463,
|
||||||
|
"type": "VEC4",
|
||||||
|
"max": [
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-1.0,
|
||||||
|
-1.0,
|
||||||
|
-1.0,
|
||||||
|
-1.0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 13,
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 2463,
|
||||||
|
"type": "VEC3",
|
||||||
|
"max": [
|
||||||
|
1.03408229,
|
||||||
|
2.529281,
|
||||||
|
1.03408468
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-1.03408229,
|
||||||
|
-2.529281,
|
||||||
|
-1.03408468
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView": 14,
|
||||||
|
"componentType": 5123,
|
||||||
|
"count": 9822,
|
||||||
|
"type": "SCALAR",
|
||||||
|
"max": [
|
||||||
|
2462
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"asset": {
|
||||||
|
"generator": "glTF Tools for Unity",
|
||||||
|
"version": "2.0"
|
||||||
|
},
|
||||||
|
"bufferViews": [
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteLength": 7408
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 7408,
|
||||||
|
"byteLength": 11112
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 18520,
|
||||||
|
"byteLength": 14816
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 33336,
|
||||||
|
"byteLength": 11112
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 44448,
|
||||||
|
"byteLength": 5232
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 49680,
|
||||||
|
"byteLength": 6048
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 55728,
|
||||||
|
"byteLength": 9072
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 64800,
|
||||||
|
"byteLength": 12096
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 76896,
|
||||||
|
"byteLength": 9072
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 85968,
|
||||||
|
"byteLength": 7488
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 93456,
|
||||||
|
"byteLength": 19704
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 113160,
|
||||||
|
"byteLength": 29556
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 142716,
|
||||||
|
"byteLength": 39408
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 182124,
|
||||||
|
"byteLength": 29556
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 211680,
|
||||||
|
"byteLength": 19644
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"buffers": [
|
||||||
|
{
|
||||||
|
"uri": "Lantern.bin",
|
||||||
|
"byteLength": 231324
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"uri": "Lantern_baseColor.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "Lantern_roughnessMetallic.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "Lantern_normal.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"uri": "Lantern_emissive.png"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"primitives": [
|
||||||
|
{
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 0,
|
||||||
|
"NORMAL": 1,
|
||||||
|
"TANGENT": 2,
|
||||||
|
"POSITION": 3
|
||||||
|
},
|
||||||
|
"indices": 4,
|
||||||
|
"material": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "LanternPole_Body"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"primitives": [
|
||||||
|
{
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 5,
|
||||||
|
"NORMAL": 6,
|
||||||
|
"TANGENT": 7,
|
||||||
|
"POSITION": 8
|
||||||
|
},
|
||||||
|
"indices": 9,
|
||||||
|
"material": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "LanternPole_Chain"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"primitives": [
|
||||||
|
{
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 10,
|
||||||
|
"NORMAL": 11,
|
||||||
|
"TANGENT": 12,
|
||||||
|
"POSITION": 13
|
||||||
|
},
|
||||||
|
"indices": 14,
|
||||||
|
"material": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "LanternPole_Lantern"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"pbrMetallicRoughness": {
|
||||||
|
"baseColorFactor": [
|
||||||
|
0.214041144,
|
||||||
|
0.214041144,
|
||||||
|
0.214041144,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"baseColorTexture": {
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
"metallicRoughnessTexture": {
|
||||||
|
"index": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"normalTexture": {
|
||||||
|
"index": 2
|
||||||
|
},
|
||||||
|
"emissiveFactor": [
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
"emissiveTexture": {
|
||||||
|
"index": 3
|
||||||
|
},
|
||||||
|
"name": "LanternPost_Mat"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"mesh": 0,
|
||||||
|
"translation": [
|
||||||
|
-3.82315421,
|
||||||
|
13.01603,
|
||||||
|
0.0
|
||||||
|
],
|
||||||
|
"name": "LanternPole_Body"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mesh": 1,
|
||||||
|
"translation": [
|
||||||
|
-9.582001,
|
||||||
|
21.0378723,
|
||||||
|
0.0
|
||||||
|
],
|
||||||
|
"name": "LanternPole_Chain"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mesh": 2,
|
||||||
|
"translation": [
|
||||||
|
-9.582007,
|
||||||
|
18.0091515,
|
||||||
|
0.0
|
||||||
|
],
|
||||||
|
"name": "LanternPole_Lantern"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"children": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"name": "Lantern"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"scene": 0,
|
||||||
|
"scenes": [
|
||||||
|
{
|
||||||
|
"nodes": [
|
||||||
|
3
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"source": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 3
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
11
examples/load_model.rs
Normal file
11
examples/load_model.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
use bevy::*;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// let universe = Universe::new();
|
||||||
|
// let world = universe.create_world();
|
||||||
|
// let scheduler = SystemScheduler::<ApplicationStage>::new();
|
||||||
|
// asset::load_gltf(get_path("examples/assets/Box.gltf").to_str().unwrap()).unwrap();
|
||||||
|
asset::load_gltf("examples/assets/Box.gltf").unwrap();
|
||||||
|
|
||||||
|
// Application::run(universe, world, scheduler);
|
||||||
|
}
|
|
@ -2,15 +2,15 @@ use std::{fs, io};
|
||||||
use std::boxed::Box;
|
use std::boxed::Box;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
|
|
||||||
// use crate::render::Mesh;
|
// use crate::render::Mesh;
|
||||||
|
|
||||||
pub fn load_gltf(path: &str) -> Result<(), Box<dyn Error>> {
|
pub fn load_gltf(path: &str) -> Result<(), Box<dyn Error>> {
|
||||||
|
println!("{}", path);
|
||||||
let file = fs::File::open(&path)?;
|
let file = fs::File::open(&path)?;
|
||||||
let reader = io::BufReader::new(file);
|
let reader = io::BufReader::new(file);
|
||||||
let gltf = gltf::Gltf::from_reader(reader)?;
|
let gltf = gltf::Gltf::from_reader(reader)?;
|
||||||
for scene in gltf.scenes() {
|
for scene in gltf.scenes() {
|
||||||
for mesh in scene.nodes() {
|
for _mesh in scene.nodes() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
mod gltf;
|
||||||
|
|
||||||
|
pub use self::gltf::load_gltf;
|
||||||
|
|
||||||
use std::{sync::{Arc, RwLock}, marker::PhantomData, ops::Drop, collections::HashMap};
|
use std::{sync::{Arc, RwLock}, marker::PhantomData, ops::Drop, collections::HashMap};
|
||||||
|
|
||||||
pub struct Handle<T>
|
pub struct Handle<T>
|
||||||
|
|
|
@ -6,7 +6,7 @@ pub enum MeshType {
|
||||||
Cube,
|
Cube,
|
||||||
Plane {
|
Plane {
|
||||||
size: f32
|
size: f32
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Mesh {
|
pub struct Mesh {
|
||||||
|
|
Loading…
Reference in a new issue