mirror of
https://github.com/bevyengine/bevy
synced 2024-11-22 20:53:53 +00:00
model loading works!
This commit is contained in:
parent
75ab0e21e5
commit
1143f16743
8 changed files with 171 additions and 616 deletions
|
@ -69,4 +69,4 @@ type-uuid = "0.1"
|
|||
env_logger = "0.7"
|
||||
|
||||
[profile.dev]
|
||||
opt-level = 3
|
||||
# opt-level = 3
|
|
@ -53,16 +53,35 @@ fn load_node(buffer_data: &[Vec<u8>], node: &gltf::Node, depth: i32) -> Result<M
|
|||
reader
|
||||
.read_positions()
|
||||
.map(|v| VertexAttribute {
|
||||
name: "position".into(),
|
||||
name: "Vertex_Position".into(),
|
||||
values: VertexAttributeValues::Float3(v.collect()),
|
||||
})
|
||||
.map(|vertex_attribute| mesh.attributes.push(vertex_attribute));
|
||||
|
||||
// let indices = reader.read_indices().unwrap();
|
||||
reader
|
||||
.read_normals()
|
||||
.map(|v| VertexAttribute {
|
||||
name: "Vertex_Normal".into(),
|
||||
values: VertexAttributeValues::Float3(v.collect()),
|
||||
})
|
||||
.map(|vertex_attribute| mesh.attributes.push(vertex_attribute));
|
||||
|
||||
reader
|
||||
.read_tex_coords(0)
|
||||
.map(|v| VertexAttribute {
|
||||
name: "Vertex_Uv".into(),
|
||||
values: VertexAttributeValues::Float2(v.into_f32().collect()),
|
||||
})
|
||||
.map(|vertex_attribute| mesh.attributes.push(vertex_attribute));
|
||||
|
||||
|
||||
reader.read_indices().map(|indices| {
|
||||
mesh.indices = Some(indices.into_u32().collect::<Vec<u32>>());
|
||||
});
|
||||
|
||||
return Ok(mesh);
|
||||
}
|
||||
}
|
||||
println!();
|
||||
|
||||
for child in node.children() {
|
||||
return Ok(load_node(buffer_data, &child, depth + 1)?);
|
||||
|
|
Binary file not shown.
|
@ -1,142 +0,0 @@
|
|||
{
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,468 +0,0 @@
|
|||
{
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
BIN
examples/assets/Monkey.bin
Normal file
BIN
examples/assets/Monkey.bin
Normal file
Binary file not shown.
100
examples/assets/Monkey.gltf
Normal file
100
examples/assets/Monkey.gltf
Normal file
|
@ -0,0 +1,100 @@
|
|||
{
|
||||
"asset" : {
|
||||
"generator" : "Khronos glTF Blender I/O v1.1.46",
|
||||
"version" : "2.0"
|
||||
},
|
||||
"scene" : 0,
|
||||
"scenes" : [
|
||||
{
|
||||
"name" : "Scene",
|
||||
"nodes" : [
|
||||
0
|
||||
]
|
||||
}
|
||||
],
|
||||
"nodes" : [
|
||||
{
|
||||
"mesh" : 0,
|
||||
"name" : "Suzanne"
|
||||
}
|
||||
],
|
||||
"meshes" : [
|
||||
{
|
||||
"name" : "Suzanne",
|
||||
"primitives" : [
|
||||
{
|
||||
"attributes" : {
|
||||
"POSITION" : 0,
|
||||
"NORMAL" : 1,
|
||||
"TEXCOORD_0" : 2
|
||||
},
|
||||
"indices" : 3
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"accessors" : [
|
||||
{
|
||||
"bufferView" : 0,
|
||||
"componentType" : 5126,
|
||||
"count" : 1968,
|
||||
"max" : [
|
||||
1.3671875,
|
||||
0.8515625,
|
||||
0.984375
|
||||
],
|
||||
"min" : [
|
||||
-1.3671875,
|
||||
-0.8515625,
|
||||
-0.984375
|
||||
],
|
||||
"type" : "VEC3"
|
||||
},
|
||||
{
|
||||
"bufferView" : 1,
|
||||
"componentType" : 5126,
|
||||
"count" : 1968,
|
||||
"type" : "VEC3"
|
||||
},
|
||||
{
|
||||
"bufferView" : 2,
|
||||
"componentType" : 5126,
|
||||
"count" : 1968,
|
||||
"type" : "VEC2"
|
||||
},
|
||||
{
|
||||
"bufferView" : 3,
|
||||
"componentType" : 5123,
|
||||
"count" : 2904,
|
||||
"type" : "SCALAR"
|
||||
}
|
||||
],
|
||||
"bufferViews" : [
|
||||
{
|
||||
"buffer" : 0,
|
||||
"byteLength" : 23616,
|
||||
"byteOffset" : 0
|
||||
},
|
||||
{
|
||||
"buffer" : 0,
|
||||
"byteLength" : 23616,
|
||||
"byteOffset" : 23616
|
||||
},
|
||||
{
|
||||
"buffer" : 0,
|
||||
"byteLength" : 15744,
|
||||
"byteOffset" : 47232
|
||||
},
|
||||
{
|
||||
"buffer" : 0,
|
||||
"byteLength" : 5808,
|
||||
"byteOffset" : 62976
|
||||
}
|
||||
],
|
||||
"buffers" : [
|
||||
{
|
||||
"byteLength" : 68784,
|
||||
"uri" : "Monkey.bin"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,6 +1,52 @@
|
|||
use bevy::{gltf, prelude::*};
|
||||
|
||||
fn main() {
|
||||
let mesh = gltf::load_gltf("examples/assets/Box.gltf").unwrap().unwrap();
|
||||
// App::build().add_default_plugins().run();
|
||||
App::build()
|
||||
.add_default_plugins()
|
||||
.add_startup_system(setup)
|
||||
.add_system_init(bevy::input::system::exit_on_esc_system)
|
||||
.run();
|
||||
}
|
||||
|
||||
/// set up a simple scene
|
||||
fn setup(world: &mut World, resources: &mut Resources) {
|
||||
let mesh = gltf::load_gltf("examples/assets/Monkey.gltf")
|
||||
.unwrap()
|
||||
.unwrap();
|
||||
// create a cube and a plane mesh
|
||||
let mut mesh_storage = resources.get_mut::<AssetStorage<Mesh>>().unwrap();
|
||||
let mesh_handle = mesh_storage.add(mesh);
|
||||
|
||||
// create materials for our cube and plane
|
||||
let mut material_storage = resources
|
||||
.get_mut::<AssetStorage<StandardMaterial>>()
|
||||
.unwrap();
|
||||
let material_handle = material_storage.add(StandardMaterial {
|
||||
albedo: Color::rgb(0.5, 0.4, 0.3),
|
||||
..Default::default()
|
||||
});
|
||||
|
||||
// add entities to the world
|
||||
world
|
||||
.build()
|
||||
// mesh
|
||||
.add_entity(MeshEntity {
|
||||
mesh: mesh_handle,
|
||||
material: material_handle,
|
||||
..Default::default()
|
||||
})
|
||||
// light
|
||||
.add_entity(LightEntity {
|
||||
translation: Translation::new(4.0, -4.0, 5.0),
|
||||
..Default::default()
|
||||
})
|
||||
// camera
|
||||
.add_entity(CameraEntity {
|
||||
local_to_world: LocalToWorld(Mat4::look_at_rh(
|
||||
Vec3::new(2.0, -6.0, 2.0),
|
||||
Vec3::new(0.0, 0.0, 0.0),
|
||||
Vec3::new(0.0, 0.0, 1.0),
|
||||
)),
|
||||
..Default::default()
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue