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}