bevy_gltf_kun/lib.rs
1//! Bevy [gltf_kun](https://crates.io/crates/gltf_kun) plugin.
2//!
3//! ## Features
4//!
5//! - glTF extension processing via hooks
6//! - [glTF](https://github.com/KhronosGroup/glTF) import / export
7//! - [glXF](https://github.com/KhronosGroup/glXF) import / export
8//!
9//! ## Usage
10//!
11//! Add [GltfKunPlugin] to your app:
12//!
13//! ```no_run
14//! use bevy::prelude::*;
15//! use bevy_gltf_kun::GltfKunPlugin;
16//!
17//! App::new().add_plugins((DefaultPlugins, GltfKunPlugin::default()));
18//! ```
19//!
20//! ### Export
21//!
22//! Export scenes to glTF using [GltfExportEvent](export::gltf::GltfExportEvent).
23//!
24//! The resulting [GltfExportResult](export::gltf::GltfExportResult) will contain a flexible
25//! [GltfDocument](gltf_kun::graph::gltf::document::GltfDocument) that can be exported to various
26//! file types. See [gltf_kun] for more information on how to do so.
27//!
28//!
29//! ```
30//! use bevy::prelude::*;
31//! use bevy_gltf_kun::{
32//! extensions::DefaultExtensions,
33//! export::gltf::{GltfExportEvent, GltfExportResult}
34//! };
35//! use gltf_kun::io::format::glb::GlbExport;
36//!
37//! fn export_scene(
38//! scenes: Query<&SceneRoot>,
39//! mut export: EventWriter<GltfExportEvent<DefaultExtensions>>,
40//! mut results: ResMut<Events<GltfExportResult>>,
41//! mut did_export: Local<bool>,
42//! ) {
43//! // Send an export event once.
44//! if !*did_export {
45//! if let Some(handle) = scenes.iter().next() {
46//! export.send(GltfExportEvent::new(handle.0.clone()));
47//! *did_export = true;
48//! }
49//! }
50//!
51//! // Listen for the result.
52//! for mut event in results.drain() {
53//! let doc = event.result.unwrap();
54//! let bytes = GlbExport::<DefaultExtensions>::export(&mut event.graph, &doc);
55//! }
56//! }
57//!
58//! App::new().add_systems(Update, export_scene);
59//! ```
60//!
61//! ### Import
62//!
63//! Import glTFs using the [GltfKun](import::gltf::GltfKun) asset.
64//!
65//! ```
66//! use bevy::prelude::*;
67//! use bevy_gltf_kun::import::gltf::{GltfKun, scene::GltfScene};
68//!
69//! fn import_gltf(
70//! asset_server: Res<AssetServer>,
71//! gltf_kun_assets: Res<Assets<GltfKun>>,
72//! gltf_scene_assets: Res<Assets<GltfScene>>,
73//! mut commands: Commands,
74//! mut handle: Local<Option<Handle<GltfKun>>>,
75//! mut did_import: Local<bool>,
76//! ) {
77//! if *did_import {
78//! return;
79//! }
80//!
81//! // Load the asset.
82//! if handle.is_none() {
83//! *handle = Some(asset_server.load::<GltfKun>("model.gltf"));
84//! }
85//!
86//! let handle = handle.as_ref().unwrap();
87//!
88//! let gltf = match gltf_kun_assets.get(handle) {
89//! Some(a) => a,
90//! None => return,
91//! };
92//!
93//! // Spawn the first scene.
94//! let gltf_scene = gltf_scene_assets.get(&gltf.scenes[0]).unwrap();
95//! commands.spawn(SceneRoot(gltf_scene.scene.clone()));
96//!
97//! *did_import = true;
98//! }
99//!
100//! App::new().add_systems(Update, import_gltf);
101//! ```
102
103use bevy::prelude::*;
104use extensions::ExtensionsPlugin;
105use gltf_kun::extensions::DefaultExtensions;
106use plugins::{GltfExportPlugin, GltfImportPlugin};
107
108pub mod export;
109pub mod extensions;
110pub mod import;
111mod plugins;
112
113pub struct GltfKunPlugin {
114 pub gltf_export: bool,
115 pub gltf_import: bool,
116}
117
118impl Default for GltfKunPlugin {
119 fn default() -> Self {
120 Self {
121 gltf_export: true,
122 gltf_import: true,
123 }
124 }
125}
126
127impl Plugin for GltfKunPlugin {
128 fn build(&self, app: &mut App) {
129 app.add_plugins(ExtensionsPlugin);
130
131 if self.gltf_export {
132 app.add_plugins(GltfExportPlugin::<DefaultExtensions>::default());
133 }
134
135 if self.gltf_import {
136 app.add_plugins(GltfImportPlugin::<DefaultExtensions>::default());
137 }
138 }
139}