bevy 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/Cargo.lock +4279 -0
  3. data/Cargo.toml +36 -0
  4. data/README.md +226 -0
  5. data/crates/bevy/Cargo.toml +52 -0
  6. data/crates/bevy/src/app.rs +43 -0
  7. data/crates/bevy/src/component.rs +111 -0
  8. data/crates/bevy/src/entity.rs +30 -0
  9. data/crates/bevy/src/error.rs +32 -0
  10. data/crates/bevy/src/event.rs +190 -0
  11. data/crates/bevy/src/input_bridge.rs +300 -0
  12. data/crates/bevy/src/lib.rs +42 -0
  13. data/crates/bevy/src/mesh_renderer.rs +328 -0
  14. data/crates/bevy/src/query.rs +53 -0
  15. data/crates/bevy/src/render_app.rs +689 -0
  16. data/crates/bevy/src/resource.rs +28 -0
  17. data/crates/bevy/src/schedule.rs +186 -0
  18. data/crates/bevy/src/sprite_renderer.rs +355 -0
  19. data/crates/bevy/src/system.rs +44 -0
  20. data/crates/bevy/src/text_renderer.rs +258 -0
  21. data/crates/bevy/src/types/color.rs +114 -0
  22. data/crates/bevy/src/types/dynamic.rs +131 -0
  23. data/crates/bevy/src/types/math.rs +260 -0
  24. data/crates/bevy/src/types/mod.rs +9 -0
  25. data/crates/bevy/src/types/transform.rs +166 -0
  26. data/crates/bevy/src/world.rs +163 -0
  27. data/crates/bevy_ruby_render/Cargo.toml +22 -0
  28. data/crates/bevy_ruby_render/src/asset.rs +360 -0
  29. data/crates/bevy_ruby_render/src/audio.rs +511 -0
  30. data/crates/bevy_ruby_render/src/camera.rs +365 -0
  31. data/crates/bevy_ruby_render/src/gamepad.rs +398 -0
  32. data/crates/bevy_ruby_render/src/lib.rs +26 -0
  33. data/crates/bevy_ruby_render/src/material.rs +310 -0
  34. data/crates/bevy_ruby_render/src/mesh.rs +491 -0
  35. data/crates/bevy_ruby_render/src/sprite.rs +289 -0
  36. data/ext/bevy/Cargo.toml +20 -0
  37. data/ext/bevy/extconf.rb +6 -0
  38. data/ext/bevy/src/conversions.rs +137 -0
  39. data/ext/bevy/src/lib.rs +29 -0
  40. data/ext/bevy/src/ruby_app.rs +65 -0
  41. data/ext/bevy/src/ruby_color.rs +149 -0
  42. data/ext/bevy/src/ruby_component.rs +189 -0
  43. data/ext/bevy/src/ruby_entity.rs +33 -0
  44. data/ext/bevy/src/ruby_math.rs +384 -0
  45. data/ext/bevy/src/ruby_query.rs +64 -0
  46. data/ext/bevy/src/ruby_render_app.rs +779 -0
  47. data/ext/bevy/src/ruby_system.rs +122 -0
  48. data/ext/bevy/src/ruby_world.rs +107 -0
  49. data/lib/bevy/animation.rb +597 -0
  50. data/lib/bevy/app.rb +675 -0
  51. data/lib/bevy/asset.rb +613 -0
  52. data/lib/bevy/audio.rb +545 -0
  53. data/lib/bevy/audio_effects.rb +224 -0
  54. data/lib/bevy/camera.rb +412 -0
  55. data/lib/bevy/component.rb +91 -0
  56. data/lib/bevy/diagnostics.rb +227 -0
  57. data/lib/bevy/ecs_advanced.rb +296 -0
  58. data/lib/bevy/event.rb +199 -0
  59. data/lib/bevy/gizmos.rb +158 -0
  60. data/lib/bevy/gltf.rb +227 -0
  61. data/lib/bevy/hierarchy.rb +444 -0
  62. data/lib/bevy/input.rb +514 -0
  63. data/lib/bevy/lighting.rb +369 -0
  64. data/lib/bevy/material.rb +248 -0
  65. data/lib/bevy/mesh.rb +257 -0
  66. data/lib/bevy/navigation.rb +344 -0
  67. data/lib/bevy/networking.rb +335 -0
  68. data/lib/bevy/particle.rb +337 -0
  69. data/lib/bevy/physics.rb +396 -0
  70. data/lib/bevy/plugins/default_plugins.rb +34 -0
  71. data/lib/bevy/plugins/input_plugin.rb +49 -0
  72. data/lib/bevy/reflect.rb +361 -0
  73. data/lib/bevy/render_graph.rb +210 -0
  74. data/lib/bevy/resource.rb +185 -0
  75. data/lib/bevy/scene.rb +254 -0
  76. data/lib/bevy/shader.rb +319 -0
  77. data/lib/bevy/shape.rb +195 -0
  78. data/lib/bevy/skeletal.rb +248 -0
  79. data/lib/bevy/sprite.rb +152 -0
  80. data/lib/bevy/sprite_sheet.rb +444 -0
  81. data/lib/bevy/state.rb +277 -0
  82. data/lib/bevy/system.rb +206 -0
  83. data/lib/bevy/text.rb +99 -0
  84. data/lib/bevy/text_advanced.rb +455 -0
  85. data/lib/bevy/timer.rb +147 -0
  86. data/lib/bevy/transform.rb +158 -0
  87. data/lib/bevy/ui.rb +454 -0
  88. data/lib/bevy/ui_advanced.rb +568 -0
  89. data/lib/bevy/version.rb +5 -0
  90. data/lib/bevy/visibility.rb +250 -0
  91. data/lib/bevy/window.rb +302 -0
  92. data/lib/bevy.rb +390 -0
  93. metadata +150 -0
@@ -0,0 +1,28 @@
1
+ use std::collections::HashMap;
2
+
3
+ #[derive(Debug, Clone)]
4
+ pub struct ResourceWrapper {
5
+ name: String,
6
+ data: HashMap<String, Vec<u8>>,
7
+ }
8
+
9
+ impl ResourceWrapper {
10
+ pub fn new(name: &str) -> Self {
11
+ Self {
12
+ name: name.to_string(),
13
+ data: HashMap::new(),
14
+ }
15
+ }
16
+
17
+ pub fn name(&self) -> &str {
18
+ &self.name
19
+ }
20
+
21
+ pub fn set(&mut self, key: &str, value: Vec<u8>) {
22
+ self.data.insert(key.to_string(), value);
23
+ }
24
+
25
+ pub fn get(&self, key: &str) -> Option<&Vec<u8>> {
26
+ self.data.get(key)
27
+ }
28
+ }
@@ -0,0 +1,186 @@
1
+ use crate::system::ScheduleLabel;
2
+ use std::collections::HashMap;
3
+
4
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5
+ pub enum SystemSet {
6
+ PreUpdate,
7
+ Update,
8
+ PostUpdate,
9
+ First,
10
+ Last,
11
+ Custom(u32),
12
+ }
13
+
14
+ impl Default for SystemSet {
15
+ fn default() -> Self {
16
+ SystemSet::Update
17
+ }
18
+ }
19
+
20
+ #[derive(Debug, Clone)]
21
+ pub struct SystemOrdering {
22
+ pub before: Vec<String>,
23
+ pub after: Vec<String>,
24
+ }
25
+
26
+ impl SystemOrdering {
27
+ pub fn new() -> Self {
28
+ Self {
29
+ before: Vec::new(),
30
+ after: Vec::new(),
31
+ }
32
+ }
33
+
34
+ pub fn before(mut self, system_name: &str) -> Self {
35
+ self.before.push(system_name.to_string());
36
+ self
37
+ }
38
+
39
+ pub fn after(mut self, system_name: &str) -> Self {
40
+ self.after.push(system_name.to_string());
41
+ self
42
+ }
43
+ }
44
+
45
+ impl Default for SystemOrdering {
46
+ fn default() -> Self {
47
+ Self::new()
48
+ }
49
+ }
50
+
51
+ #[derive(Debug, Clone)]
52
+ pub struct ScheduleConfig {
53
+ pub set: SystemSet,
54
+ pub ordering: SystemOrdering,
55
+ pub run_if: Option<String>,
56
+ }
57
+
58
+ impl ScheduleConfig {
59
+ pub fn new() -> Self {
60
+ Self {
61
+ set: SystemSet::default(),
62
+ ordering: SystemOrdering::new(),
63
+ run_if: None,
64
+ }
65
+ }
66
+
67
+ pub fn in_set(mut self, set: SystemSet) -> Self {
68
+ self.set = set;
69
+ self
70
+ }
71
+
72
+ pub fn before(mut self, system_name: &str) -> Self {
73
+ self.ordering = self.ordering.before(system_name);
74
+ self
75
+ }
76
+
77
+ pub fn after(mut self, system_name: &str) -> Self {
78
+ self.ordering = self.ordering.after(system_name);
79
+ self
80
+ }
81
+
82
+ pub fn run_if(mut self, condition: &str) -> Self {
83
+ self.run_if = Some(condition.to_string());
84
+ self
85
+ }
86
+ }
87
+
88
+ impl Default for ScheduleConfig {
89
+ fn default() -> Self {
90
+ Self::new()
91
+ }
92
+ }
93
+
94
+ pub struct Schedule {
95
+ label: ScheduleLabel,
96
+ systems: Vec<(String, ScheduleConfig)>,
97
+ set_order: Vec<SystemSet>,
98
+ }
99
+
100
+ impl Schedule {
101
+ pub fn new(label: ScheduleLabel) -> Self {
102
+ Self {
103
+ label,
104
+ systems: Vec::new(),
105
+ set_order: vec![
106
+ SystemSet::First,
107
+ SystemSet::PreUpdate,
108
+ SystemSet::Update,
109
+ SystemSet::PostUpdate,
110
+ SystemSet::Last,
111
+ ],
112
+ }
113
+ }
114
+
115
+ pub fn label(&self) -> ScheduleLabel {
116
+ self.label
117
+ }
118
+
119
+ pub fn add_system(&mut self, name: &str, config: ScheduleConfig) {
120
+ self.systems.push((name.to_string(), config));
121
+ }
122
+
123
+ pub fn systems(&self) -> &[(String, ScheduleConfig)] {
124
+ &self.systems
125
+ }
126
+
127
+ pub fn systems_in_order(&self) -> Vec<&str> {
128
+ let mut by_set: HashMap<SystemSet, Vec<&str>> = HashMap::new();
129
+
130
+ for (name, config) in &self.systems {
131
+ by_set.entry(config.set).or_default().push(name.as_str());
132
+ }
133
+
134
+ let mut result = Vec::new();
135
+ for set in &self.set_order {
136
+ if let Some(systems) = by_set.get(set) {
137
+ result.extend(systems.iter().copied());
138
+ }
139
+ }
140
+
141
+ for (name, config) in &self.systems {
142
+ if let SystemSet::Custom(_) = config.set {
143
+ if !result.contains(&name.as_str()) {
144
+ result.push(name.as_str());
145
+ }
146
+ }
147
+ }
148
+
149
+ result
150
+ }
151
+ }
152
+
153
+ pub struct Schedules {
154
+ schedules: HashMap<ScheduleLabel, Schedule>,
155
+ }
156
+
157
+ impl Schedules {
158
+ pub fn new() -> Self {
159
+ let mut schedules = HashMap::new();
160
+ schedules.insert(ScheduleLabel::Startup, Schedule::new(ScheduleLabel::Startup));
161
+ schedules.insert(ScheduleLabel::Update, Schedule::new(ScheduleLabel::Update));
162
+ schedules.insert(ScheduleLabel::FixedUpdate, Schedule::new(ScheduleLabel::FixedUpdate));
163
+ schedules.insert(ScheduleLabel::PostUpdate, Schedule::new(ScheduleLabel::PostUpdate));
164
+ Self { schedules }
165
+ }
166
+
167
+ pub fn get(&self, label: ScheduleLabel) -> Option<&Schedule> {
168
+ self.schedules.get(&label)
169
+ }
170
+
171
+ pub fn get_mut(&mut self, label: ScheduleLabel) -> Option<&mut Schedule> {
172
+ self.schedules.get_mut(&label)
173
+ }
174
+
175
+ pub fn add_system(&mut self, label: ScheduleLabel, name: &str, config: ScheduleConfig) {
176
+ if let Some(schedule) = self.schedules.get_mut(&label) {
177
+ schedule.add_system(name, config);
178
+ }
179
+ }
180
+ }
181
+
182
+ impl Default for Schedules {
183
+ fn default() -> Self {
184
+ Self::new()
185
+ }
186
+ }
@@ -0,0 +1,355 @@
1
+ //! Sprite renderer module for synchronizing Ruby sprites with Bevy.
2
+
3
+ use std::collections::HashMap;
4
+
5
+ #[cfg(feature = "rendering")]
6
+ use bevy_asset::{Assets, Handle};
7
+ #[cfg(feature = "rendering")]
8
+ use bevy_color::Color;
9
+ #[cfg(feature = "rendering")]
10
+ use bevy_ecs::entity::Entity;
11
+ #[cfg(feature = "rendering")]
12
+ use bevy_ecs::system::Resource;
13
+ #[cfg(feature = "rendering")]
14
+ use bevy_ecs::world::World;
15
+ #[cfg(feature = "rendering")]
16
+ use bevy_image::Image;
17
+ #[cfg(feature = "rendering")]
18
+ use bevy_math::Vec2;
19
+ #[cfg(feature = "rendering")]
20
+ use bevy_sprite::Sprite;
21
+ #[cfg(feature = "rendering")]
22
+ use bevy_transform::components::Transform;
23
+
24
+ /// Sprite data received from Ruby.
25
+ #[derive(Debug, Clone)]
26
+ pub struct SpriteData {
27
+ pub color_r: f32,
28
+ pub color_g: f32,
29
+ pub color_b: f32,
30
+ pub color_a: f32,
31
+ pub flip_x: bool,
32
+ pub flip_y: bool,
33
+ pub anchor_x: f32,
34
+ pub anchor_y: f32,
35
+ pub has_custom_size: bool,
36
+ pub custom_size_x: f32,
37
+ pub custom_size_y: f32,
38
+ }
39
+
40
+ impl Default for SpriteData {
41
+ fn default() -> Self {
42
+ Self {
43
+ color_r: 1.0,
44
+ color_g: 1.0,
45
+ color_b: 1.0,
46
+ color_a: 1.0,
47
+ flip_x: false,
48
+ flip_y: false,
49
+ anchor_x: 0.5,
50
+ anchor_y: 0.5,
51
+ has_custom_size: false,
52
+ custom_size_x: 0.0,
53
+ custom_size_y: 0.0,
54
+ }
55
+ }
56
+ }
57
+
58
+ /// Transform data received from Ruby.
59
+ #[derive(Debug, Clone)]
60
+ pub struct TransformData {
61
+ pub translation_x: f32,
62
+ pub translation_y: f32,
63
+ pub translation_z: f32,
64
+ pub rotation_x: f32,
65
+ pub rotation_y: f32,
66
+ pub rotation_z: f32,
67
+ pub rotation_w: f32,
68
+ pub scale_x: f32,
69
+ pub scale_y: f32,
70
+ pub scale_z: f32,
71
+ }
72
+
73
+ impl Default for TransformData {
74
+ fn default() -> Self {
75
+ Self {
76
+ translation_x: 0.0,
77
+ translation_y: 0.0,
78
+ translation_z: 0.0,
79
+ rotation_x: 0.0,
80
+ rotation_y: 0.0,
81
+ rotation_z: 0.0,
82
+ rotation_w: 1.0,
83
+ scale_x: 1.0,
84
+ scale_y: 1.0,
85
+ scale_z: 1.0,
86
+ }
87
+ }
88
+ }
89
+
90
+ /// Pending sprite operation.
91
+ #[derive(Debug, Clone)]
92
+ pub enum SpriteOperation {
93
+ Sync {
94
+ ruby_entity_id: u64,
95
+ sprite_data: SpriteData,
96
+ transform_data: TransformData,
97
+ },
98
+ Remove {
99
+ ruby_entity_id: u64,
100
+ },
101
+ Clear,
102
+ }
103
+
104
+ /// Resource to hold the default white texture for sprites.
105
+ #[cfg(feature = "rendering")]
106
+ #[derive(Resource)]
107
+ pub struct DefaultSpriteTexture {
108
+ pub handle: Handle<Image>,
109
+ }
110
+
111
+ #[cfg(feature = "rendering")]
112
+ impl DefaultSpriteTexture {
113
+ pub fn create_1x1_white_image() -> Image {
114
+ use bevy_image::Image;
115
+ use bevy_render::render_asset::RenderAssetUsages;
116
+ use bevy_render::render_resource::{Extent3d, TextureDimension, TextureFormat};
117
+
118
+ Image::new(
119
+ Extent3d {
120
+ width: 1,
121
+ height: 1,
122
+ depth_or_array_layers: 1,
123
+ },
124
+ TextureDimension::D2,
125
+ vec![255, 255, 255, 255],
126
+ TextureFormat::Rgba8UnormSrgb,
127
+ RenderAssetUsages::RENDER_WORLD | RenderAssetUsages::MAIN_WORLD,
128
+ )
129
+ }
130
+
131
+ pub fn insert_into_world(world: &mut World) {
132
+ let image = Self::create_1x1_white_image();
133
+ let handle = {
134
+ let mut images = world.resource_mut::<Assets<Image>>();
135
+ images.add(image)
136
+ };
137
+ world.insert_resource(DefaultSpriteTexture { handle });
138
+ }
139
+ }
140
+
141
+ /// Manages the synchronization of Ruby sprites to Bevy entities.
142
+ pub struct SpriteSync {
143
+ /// Maps Ruby entity IDs to Bevy render entities.
144
+ entity_map: HashMap<u64, EntityData>,
145
+ /// Pending operations to apply on next update.
146
+ pub pending_operations: Vec<SpriteOperation>,
147
+ }
148
+
149
+ struct EntityData {
150
+ #[cfg(feature = "rendering")]
151
+ bevy_entity: Entity,
152
+ #[cfg(not(feature = "rendering"))]
153
+ _phantom: (),
154
+ }
155
+
156
+ impl SpriteSync {
157
+ /// Creates a new SpriteSync instance.
158
+ pub fn new() -> Self {
159
+ Self {
160
+ entity_map: HashMap::new(),
161
+ pending_operations: Vec::new(),
162
+ }
163
+ }
164
+
165
+ /// Queues a sprite sync operation (standalone, no World needed).
166
+ pub fn sync_sprite_standalone(
167
+ &mut self,
168
+ ruby_entity_id: u64,
169
+ sprite_data: &SpriteData,
170
+ transform_data: &TransformData,
171
+ ) {
172
+ self.pending_operations.push(SpriteOperation::Sync {
173
+ ruby_entity_id,
174
+ sprite_data: sprite_data.clone(),
175
+ transform_data: transform_data.clone(),
176
+ });
177
+ }
178
+
179
+ /// Queues a sprite removal (standalone, no World needed).
180
+ pub fn remove_sprite_standalone(&mut self, ruby_entity_id: u64) {
181
+ self.pending_operations.push(SpriteOperation::Remove { ruby_entity_id });
182
+ }
183
+
184
+ /// Queues clearing all sprites (standalone, no World needed).
185
+ pub fn clear_standalone(&mut self) {
186
+ self.pending_operations.push(SpriteOperation::Clear);
187
+ }
188
+
189
+ /// Applies all pending operations to the World.
190
+ #[cfg(feature = "rendering")]
191
+ pub fn apply_pending(&mut self, world: &mut World) {
192
+ let ops: Vec<_> = self.pending_operations.drain(..).collect();
193
+ for op in ops {
194
+ match op {
195
+ SpriteOperation::Sync {
196
+ ruby_entity_id,
197
+ sprite_data,
198
+ transform_data,
199
+ } => {
200
+ self.sync_sprite(world, ruby_entity_id, &sprite_data, &transform_data);
201
+ }
202
+ SpriteOperation::Remove { ruby_entity_id } => {
203
+ self.remove_sprite(world, ruby_entity_id);
204
+ }
205
+ SpriteOperation::Clear => {
206
+ self.clear(world);
207
+ }
208
+ }
209
+ }
210
+ }
211
+
212
+ #[cfg(not(feature = "rendering"))]
213
+ pub fn apply_pending(&mut self, _world: &mut ()) {
214
+ self.pending_operations.clear();
215
+ }
216
+
217
+ /// Synchronizes a Ruby sprite to Bevy.
218
+ #[cfg(feature = "rendering")]
219
+ pub fn sync_sprite(
220
+ &mut self,
221
+ world: &mut World,
222
+ ruby_entity_id: u64,
223
+ sprite_data: &SpriteData,
224
+ transform_data: &TransformData,
225
+ ) {
226
+ let color = Color::srgba(
227
+ sprite_data.color_r,
228
+ sprite_data.color_g,
229
+ sprite_data.color_b,
230
+ sprite_data.color_a,
231
+ );
232
+
233
+ let custom_size = if sprite_data.has_custom_size {
234
+ Some(Vec2::new(
235
+ sprite_data.custom_size_x,
236
+ sprite_data.custom_size_y,
237
+ ))
238
+ } else {
239
+ None
240
+ };
241
+
242
+ let transform = Transform {
243
+ translation: bevy_math::Vec3::new(
244
+ transform_data.translation_x,
245
+ transform_data.translation_y,
246
+ transform_data.translation_z,
247
+ ),
248
+ rotation: bevy_math::Quat::from_xyzw(
249
+ transform_data.rotation_x,
250
+ transform_data.rotation_y,
251
+ transform_data.rotation_z,
252
+ transform_data.rotation_w,
253
+ ),
254
+ scale: bevy_math::Vec3::new(
255
+ transform_data.scale_x,
256
+ transform_data.scale_y,
257
+ transform_data.scale_z,
258
+ ),
259
+ };
260
+
261
+ if let Some(entity_data) = self.entity_map.get(&ruby_entity_id) {
262
+ // Update existing Bevy entity
263
+ let bevy_entity = entity_data.bevy_entity;
264
+
265
+ if let Some(mut sprite) = world.get_mut::<Sprite>(bevy_entity) {
266
+ sprite.color = color;
267
+ sprite.custom_size = custom_size;
268
+ sprite.flip_x = sprite_data.flip_x;
269
+ sprite.flip_y = sprite_data.flip_y;
270
+ }
271
+
272
+ if let Some(mut t) = world.get_mut::<Transform>(bevy_entity) {
273
+ *t = transform;
274
+ }
275
+ } else {
276
+ // Spawn new Bevy render entity with default white texture
277
+ let texture_handle = world
278
+ .get_resource::<DefaultSpriteTexture>()
279
+ .map(|t| t.handle.clone());
280
+
281
+ let bevy_entity = world
282
+ .spawn((
283
+ Sprite {
284
+ color,
285
+ custom_size,
286
+ flip_x: sprite_data.flip_x,
287
+ flip_y: sprite_data.flip_y,
288
+ image: texture_handle.clone().unwrap_or_default(),
289
+ ..Default::default()
290
+ },
291
+ transform,
292
+ ))
293
+ .id();
294
+
295
+ self.entity_map.insert(
296
+ ruby_entity_id,
297
+ EntityData { bevy_entity },
298
+ );
299
+ }
300
+ }
301
+
302
+ /// Removes a sprite from Bevy.
303
+ #[cfg(feature = "rendering")]
304
+ pub fn remove_sprite(&mut self, world: &mut World, ruby_entity_id: u64) {
305
+ if let Some(entity_data) = self.entity_map.remove(&ruby_entity_id) {
306
+ world.despawn(entity_data.bevy_entity);
307
+ }
308
+ }
309
+
310
+ /// Clears all sprites and removes them from Bevy.
311
+ #[cfg(feature = "rendering")]
312
+ pub fn clear(&mut self, world: &mut World) {
313
+ for (_, entity_data) in self.entity_map.drain() {
314
+ world.despawn(entity_data.bevy_entity);
315
+ }
316
+ }
317
+
318
+ /// Returns the number of synced sprites.
319
+ pub fn len(&self) -> usize {
320
+ self.entity_map.len()
321
+ }
322
+
323
+ /// Returns true if no sprites are synced.
324
+ pub fn is_empty(&self) -> bool {
325
+ self.entity_map.is_empty()
326
+ }
327
+
328
+ /// Returns all Ruby entity IDs that are currently synced.
329
+ pub fn synced_entities(&self) -> Vec<u64> {
330
+ self.entity_map.keys().copied().collect()
331
+ }
332
+
333
+ // No-op implementations for non-rendering builds
334
+ #[cfg(not(feature = "rendering"))]
335
+ pub fn sync_sprite(
336
+ &mut self,
337
+ _world: &mut (),
338
+ _ruby_entity_id: u64,
339
+ _sprite_data: &SpriteData,
340
+ _transform_data: &TransformData,
341
+ ) {
342
+ }
343
+
344
+ #[cfg(not(feature = "rendering"))]
345
+ pub fn remove_sprite(&mut self, _world: &mut (), _ruby_entity_id: u64) {}
346
+
347
+ #[cfg(not(feature = "rendering"))]
348
+ pub fn clear(&mut self, _world: &mut ()) {}
349
+ }
350
+
351
+ impl Default for SpriteSync {
352
+ fn default() -> Self {
353
+ Self::new()
354
+ }
355
+ }
@@ -0,0 +1,44 @@
1
+ use crate::error::BevyRubyError;
2
+
3
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
4
+ pub enum ScheduleLabel {
5
+ Startup,
6
+ Update,
7
+ FixedUpdate,
8
+ PostUpdate,
9
+ }
10
+
11
+ impl ScheduleLabel {
12
+ pub fn from_str(s: &str) -> Result<Self, BevyRubyError> {
13
+ match s.to_lowercase().as_str() {
14
+ "startup" => Ok(ScheduleLabel::Startup),
15
+ "update" => Ok(ScheduleLabel::Update),
16
+ "fixed_update" | "fixedupdate" => Ok(ScheduleLabel::FixedUpdate),
17
+ "post_update" | "postupdate" => Ok(ScheduleLabel::PostUpdate),
18
+ _ => Err(BevyRubyError::SystemError(format!(
19
+ "Unknown schedule: {}",
20
+ s
21
+ ))),
22
+ }
23
+ }
24
+ }
25
+
26
+ #[derive(Clone)]
27
+ pub struct SystemDescriptor {
28
+ pub schedule: ScheduleLabel,
29
+ pub param_types: Vec<String>,
30
+ }
31
+
32
+ impl SystemDescriptor {
33
+ pub fn new(schedule: ScheduleLabel) -> Self {
34
+ Self {
35
+ schedule,
36
+ param_types: Vec::new(),
37
+ }
38
+ }
39
+
40
+ pub fn with_param(mut self, param_type: &str) -> Self {
41
+ self.param_types.push(param_type.to_string());
42
+ self
43
+ }
44
+ }