Update to use bevy 0.17.x (#70)
* Update to bevy 0.17 * Update magnus 0.8 * Update examples for bevy 0.17 * Update documentation references bevy 0.16 => 0.17 * add some additional ruby installation instructions --------- Co-authored-by: Adam <adam@lassiter.uk> Co-authored-by: Jaroslaw Konik <konikjar@gmail.com>
This commit is contained in:
parent
b05745c9ce
commit
a9f41f5bca
21 changed files with 359 additions and 314 deletions
10
Cargo.toml
10
Cargo.toml
|
|
@ -1,7 +1,7 @@
|
|||
[package]
|
||||
name = "bevy_scriptum"
|
||||
authors = ["Jaroslaw Konik <konikjar@gmail.com>"]
|
||||
version = "0.9.1"
|
||||
version = "0.10.0"
|
||||
edition = "2024"
|
||||
license = "MIT OR Apache-2.0"
|
||||
readme = "README.md"
|
||||
|
|
@ -16,14 +16,14 @@ rhai = ["dep:rhai"]
|
|||
ruby = ["dep:magnus", "dep:rb-sys"]
|
||||
|
||||
[dependencies]
|
||||
bevy = { default-features = false, version = "0.16", features = ["bevy_asset", "bevy_log"] }
|
||||
bevy = { default-features = false, version = "0.17", features = ["bevy_asset", "bevy_log"] }
|
||||
serde = "1.0.162"
|
||||
rhai = { version = "1.14.0", features = [
|
||||
"sync",
|
||||
"internals",
|
||||
"unchecked",
|
||||
], optional = true }
|
||||
thiserror = "1.0.40"
|
||||
thiserror = "1.0.69"
|
||||
anyhow = "1.0.82"
|
||||
tracing = "0.1.40"
|
||||
mlua = { version = "0.9.8", features = [
|
||||
|
|
@ -31,8 +31,8 @@ mlua = { version = "0.9.8", features = [
|
|||
"vendored",
|
||||
"send",
|
||||
], optional = true }
|
||||
magnus = { version = "0.7.1", optional = true }
|
||||
rb-sys = { version = "0.9", default-features = false, features = ["link-ruby", "ruby-static"], optional = true }
|
||||
magnus = { version = "0.8.2", optional = true }
|
||||
rb-sys = { version = "*", default-features = false, features = ["link-ruby", "ruby-static"], optional = true }
|
||||
crossbeam-channel = "0.5.15"
|
||||
libc = "0.2.172"
|
||||
|
||||
|
|
|
|||
|
|
@ -167,6 +167,7 @@ The examples live in `examples` directory and their corresponding scripts live i
|
|||
|
||||
| bevy version | bevy_scriptum version |
|
||||
|--------------|-----------------------|
|
||||
| 0.17 | 0.10 |
|
||||
| 0.16 | 0.8-0.9 |
|
||||
| 0.15 | 0.7 |
|
||||
| 0.14 | 0.6 |
|
||||
|
|
|
|||
533
book/Cargo.lock
generated
533
book/Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
| bevy version | bevy_scriptum version |
|
||||
| ------------ | --------------------- |
|
||||
| 0.17 | 0.10 |
|
||||
| 0.16 | 0.8-0.9 |
|
||||
| 0.15 | 0.7 |
|
||||
| 0.14 | 0.6 |
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ Add the following to your `Cargo.toml`:
|
|||
|
||||
```toml
|
||||
[dependencies]
|
||||
bevy = "0.16"
|
||||
bevy = "0.17"
|
||||
bevy_scriptum = { version = "0.9", features = ["lua"] }
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ Add the following to your `Cargo.toml`:
|
|||
|
||||
```toml
|
||||
[dependencies]
|
||||
bevy = "0.16"
|
||||
bevy = "0.17"
|
||||
bevy_scriptum = { version = "0.9", features = ["rhai"] }
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -13,9 +13,20 @@ After installing `rbenv` along with its `ruby-build` plugin you can build and
|
|||
install a Ruby installation that will work with `bevy_scriptum` by executing:
|
||||
|
||||
```sh
|
||||
CC=clang rbenv install 3.4.4
|
||||
CC=clang RUBY_CONFIGURE_OPTS="--disable-shared" rbenv install 3.4.4
|
||||
```
|
||||
|
||||
Before building make sure you are using the correct Ruby version.
|
||||
It can be done for example by executing `which ruby`.
|
||||
Output should be similar to `/home/$USER/.rbenv/shims/ruby`.
|
||||
If the version is not correct then refer to `rbenv` manual or documentation
|
||||
relevant for your method of installation to switch to correct Ruby.
|
||||
To set Ruby version for current shell for example `rbenv shell 3.4.4` can be
|
||||
used.
|
||||
|
||||
If ruby-static installation can't be found its advisable to run `cargo clean`
|
||||
before building as `rb-sys` may have cached an incorrect Ruby version.
|
||||
|
||||
Above assumes that you also have `clang` installed on your system.
|
||||
For `clang` installation instruction consult your
|
||||
OS vendor provided documentation or [clang official webiste](https://clang.llvm.org).
|
||||
|
|
@ -34,7 +45,7 @@ Add the following to your `Cargo.toml`:
|
|||
|
||||
```toml
|
||||
[dependencies]
|
||||
bevy = "0.16"
|
||||
bevy = "0.17"
|
||||
bevy_scriptum = { version = "0.9", features = ["ruby"] }
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ To enable live reload it should be enough to enable `file-watcher` feature
|
|||
within bevy dependency in `Cargo.toml`
|
||||
|
||||
```toml
|
||||
bevy = { version = "0.16", features = ["file_watcher"] }
|
||||
bevy = { version = "0.17", features = ["file_watcher"] }
|
||||
```
|
||||
|
||||
## Init-teardown pattern
|
||||
|
|
@ -81,7 +81,7 @@ fn update(
|
|||
|
||||
|
||||
fn teardown(
|
||||
mut ev_asset: EventReader<AssetEvent<LuaScript>>,
|
||||
mut ev_asset: MessageReader<AssetEvent<LuaScript>>,
|
||||
scripting_runtime: ResMut<LuaRuntime>,
|
||||
mut scripted_entities: Query<(Entity, &mut LuaScriptData)>,
|
||||
) {
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ fn main() {
|
|||
.add_systems(Startup, startup)
|
||||
.add_systems(Update, call_lua_on_update_from_rust)
|
||||
.add_scripting::<LuaRuntime>(|runtime| {
|
||||
runtime.add_function(String::from("quit"), |mut exit: EventWriter<AppExit>| {
|
||||
runtime.add_function(String::from("quit"), |mut exit: MessageWriter<AppExit>| {
|
||||
exit.write(AppExit::Success);
|
||||
});
|
||||
})
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ fn main() {
|
|||
.add_systems(Startup, startup)
|
||||
.add_systems(Update, call_lua_on_update_from_rust)
|
||||
.add_scripting::<LuaRuntime>(|runtime| {
|
||||
runtime.add_function(String::from("quit"), |mut exit: EventWriter<AppExit>| {
|
||||
runtime.add_function(String::from("quit"), |mut exit: MessageWriter<AppExit>| {
|
||||
exit.write(AppExit::Success);
|
||||
});
|
||||
})
|
||||
|
|
@ -24,7 +24,7 @@ fn startup(mut commands: Commands, assets_server: Res<AssetServer>) {
|
|||
fn call_lua_on_update_from_rust(
|
||||
mut scripted_entities: Query<(Entity, &mut LuaScriptData)>,
|
||||
scripting_runtime: ResMut<LuaRuntime>,
|
||||
mut exit: EventWriter<AppExit>,
|
||||
mut exit: MessageWriter<AppExit>,
|
||||
) {
|
||||
for (entity, mut script_data) in &mut scripted_entities {
|
||||
let val = scripting_runtime
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ fn startup(mut commands: Commands, assets_server: Res<AssetServer>) {
|
|||
),));
|
||||
}
|
||||
|
||||
fn print_entity_names_and_quit(query: Query<&Name>, mut exit: EventWriter<AppExit>) {
|
||||
fn print_entity_names_and_quit(query: Query<&Name>, mut exit: MessageWriter<AppExit>) {
|
||||
if !query.is_empty() {
|
||||
for e in &query {
|
||||
println!("{}", e);
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ fn main() {
|
|||
.add_systems(Startup, startup)
|
||||
.add_systems(Update, call_rhai_on_update_from_rust)
|
||||
.add_scripting::<RhaiRuntime>(|runtime| {
|
||||
runtime.add_function(String::from("quit"), |mut exit: EventWriter<AppExit>| {
|
||||
runtime.add_function(String::from("quit"), |mut exit: MessageWriter<AppExit>| {
|
||||
exit.write(AppExit::Success);
|
||||
});
|
||||
})
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ fn main() {
|
|||
.add_systems(Startup, startup)
|
||||
.add_systems(Update, call_rhai_on_update_from_rust)
|
||||
.add_scripting::<RhaiRuntime>(|runtime| {
|
||||
runtime.add_function(String::from("quit"), |mut exit: EventWriter<AppExit>| {
|
||||
runtime.add_function(String::from("quit"), |mut exit: MessageWriter<AppExit>| {
|
||||
exit.write(AppExit::Success);
|
||||
});
|
||||
})
|
||||
|
|
@ -24,7 +24,7 @@ fn startup(mut commands: Commands, assets_server: Res<AssetServer>) {
|
|||
fn call_rhai_on_update_from_rust(
|
||||
mut scripted_entities: Query<(Entity, &mut RhaiScriptData)>,
|
||||
scripting_runtime: ResMut<RhaiRuntime>,
|
||||
mut exit: EventWriter<AppExit>,
|
||||
mut exit: MessageWriter<AppExit>,
|
||||
) {
|
||||
for (entity, mut script_data) in &mut scripted_entities {
|
||||
let val = scripting_runtime
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ fn startup(mut commands: Commands, assets_server: Res<AssetServer>) {
|
|||
),));
|
||||
}
|
||||
|
||||
fn print_entity_names_and_quit(query: Query<&Name>, mut exit: EventWriter<AppExit>) {
|
||||
fn print_entity_names_and_quit(query: Query<&Name>, mut exit: MessageWriter<AppExit>) {
|
||||
if !query.is_empty() {
|
||||
for e in &query {
|
||||
println!("{}", e);
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ fn main() {
|
|||
.add_systems(Startup, startup)
|
||||
.add_systems(Update, call_ruby_on_update_from_rust)
|
||||
.add_scripting::<RubyRuntime>(|runtime| {
|
||||
runtime.add_function(String::from("quit"), |mut exit: EventWriter<AppExit>| {
|
||||
runtime.add_function(String::from("quit"), |mut exit: MessageWriter<AppExit>| {
|
||||
exit.write(AppExit::Success);
|
||||
});
|
||||
})
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ fn main() {
|
|||
.add_systems(Startup, startup)
|
||||
.add_systems(Update, call_lua_on_update_from_rust)
|
||||
.add_scripting::<RubyRuntime>(|runtime| {
|
||||
runtime.add_function(String::from("quit"), |mut exit: EventWriter<AppExit>| {
|
||||
runtime.add_function(String::from("quit"), |mut exit: MessageWriter<AppExit>| {
|
||||
exit.write(AppExit::Success);
|
||||
});
|
||||
})
|
||||
|
|
@ -26,7 +26,7 @@ fn startup(mut commands: Commands, assets_server: Res<AssetServer>) {
|
|||
fn call_lua_on_update_from_rust(
|
||||
mut scripted_entities: Query<(Entity, &mut RubyScriptData)>,
|
||||
scripting_runtime: ResMut<RubyRuntime>,
|
||||
mut exit: EventWriter<AppExit>,
|
||||
mut exit: MessageWriter<AppExit>,
|
||||
) {
|
||||
for (entity, mut script_data) in &mut scripted_entities {
|
||||
let val = scripting_runtime
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ fn startup(mut commands: Commands, assets_server: Res<AssetServer>) {
|
|||
),));
|
||||
}
|
||||
|
||||
fn print_entity_names_and_quit(query: Query<&Name>, mut exit: EventWriter<AppExit>) {
|
||||
fn print_entity_names_and_quit(query: Query<&Name>, mut exit: MessageWriter<AppExit>) {
|
||||
if !query.is_empty() {
|
||||
for e in &query {
|
||||
println!("{}", e);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
use bevy::prelude::*;
|
||||
use bevy::{ecs::system::RunSystemError, prelude::*};
|
||||
use core::any::TypeId;
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
|
|
@ -39,7 +39,7 @@ impl<R: Runtime> CallbackSystem<R> {
|
|||
&mut self,
|
||||
call: &FunctionCallEvent<R::CallContext, R::Value>,
|
||||
world: &mut World,
|
||||
) -> R::Value {
|
||||
) -> Result<R::Value, RunSystemError> {
|
||||
self.system.run(call.params.clone(), world)
|
||||
}
|
||||
}
|
||||
|
|
@ -74,7 +74,9 @@ where
|
|||
let mut inner_system = IntoSystem::into_system(self);
|
||||
inner_system.initialize(world);
|
||||
let system_fn = move |_args: In<Vec<R::Value>>, world: &mut World| {
|
||||
let result = inner_system.run((), world);
|
||||
let result = inner_system
|
||||
.run((), world)
|
||||
.expect("Callback system failed to run");
|
||||
inner_system.apply_deferred(world);
|
||||
let mut runtime = world.get_resource_mut::<R>().expect("No runtime resource");
|
||||
|
||||
|
|
@ -112,7 +114,7 @@ macro_rules! impl_tuple {
|
|||
)
|
||||
});
|
||||
|
||||
let result = inner_system.run(args, world);
|
||||
let result = inner_system.run(args, world).expect("Callback system failed to run");
|
||||
inner_system.apply_deferred(world);
|
||||
let mut runtime = world.get_resource_mut::<RN>().expect("No runtime resource");
|
||||
|
||||
|
|
|
|||
47
src/lib.rs
47
src/lib.rs
|
|
@ -176,6 +176,7 @@
|
|||
//!
|
||||
//! | bevy version | bevy_scriptum version |
|
||||
//! |--------------|-----------------------|
|
||||
//! | 0.17 | 0.10 |
|
||||
//! | 0.16 | 0.8-0.9 |
|
||||
//! | 0.15 | 0.7 |
|
||||
//! | 0.14 | 0.6 |
|
||||
|
|
@ -280,6 +281,12 @@ pub enum ScriptingError {
|
|||
NoSettingsResource,
|
||||
}
|
||||
|
||||
#[derive(SystemSet, Debug, Hash, PartialEq, Eq, Clone)]
|
||||
pub enum ScriptSystemSet {
|
||||
Reload,
|
||||
Process,
|
||||
}
|
||||
|
||||
/// Trait that represents a scripting runtime/engine. In practice it is
|
||||
/// implemented for a scripint language interpreter and the implementor provides
|
||||
/// function implementations for calling and registering functions within the interpreter.
|
||||
|
|
@ -433,6 +440,14 @@ impl<'a, R: Runtime> ScriptingRuntimeBuilder<'a, R> {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(SystemSet, Debug, Hash, PartialEq, Eq, Clone)]
|
||||
pub enum ScriptSystems {
|
||||
Reload,
|
||||
InitCallbacks,
|
||||
ProcessNewScripts,
|
||||
ProcessCalls,
|
||||
}
|
||||
|
||||
impl BuildScriptingRuntime for App {
|
||||
/// Adds a scripting runtime. Registers required bevy systems that take
|
||||
/// care of processing and running the scripts.
|
||||
|
|
@ -441,13 +456,14 @@ impl BuildScriptingRuntime for App {
|
|||
if R::needs_rdynamic_linking() && !is_rdynamic_linking() {
|
||||
panic!(
|
||||
"Missing `-rdynamic`: symbol resolution failed.\n\
|
||||
It is needed by {:?}.\n\
|
||||
Please add `println!(\"cargo:rustc-link-arg=-rdynamic\");` to your build.rs\n\
|
||||
or set `RUSTFLAGS=\"-C link-arg=-rdynamic\"`.",
|
||||
It is needed by {:?}.\n\
|
||||
Please add `println!(\"cargo:rustc-link-arg=-rdynamic\");` to your build.rs\n\
|
||||
or set `RUSTFLAGS=\"-C link-arg=-rdynamic\"`.",
|
||||
std::any::type_name::<R>()
|
||||
);
|
||||
}
|
||||
|
||||
// Insert the runtime schedule after Update
|
||||
self.world_mut()
|
||||
.resource_mut::<MainScheduleOrder>()
|
||||
.insert_after(Update, R::Schedule::default());
|
||||
|
|
@ -457,22 +473,35 @@ impl BuildScriptingRuntime for App {
|
|||
.init_asset::<R::ScriptAsset>()
|
||||
.init_resource::<Callbacks<R>>()
|
||||
.insert_resource(R::default())
|
||||
.configure_sets(
|
||||
R::Schedule::default(),
|
||||
(
|
||||
ScriptSystems::Reload,
|
||||
ScriptSystems::InitCallbacks.after(ScriptSystems::Reload),
|
||||
ScriptSystems::ProcessNewScripts.after(ScriptSystems::InitCallbacks),
|
||||
ScriptSystems::ProcessCalls.after(ScriptSystems::ProcessNewScripts),
|
||||
),
|
||||
)
|
||||
.add_systems(
|
||||
R::Schedule::default(),
|
||||
(
|
||||
reload_scripts::<R>,
|
||||
process_calls::<R>
|
||||
reload_scripts::<R>.in_set(ScriptSystems::Reload),
|
||||
init_callbacks::<R>
|
||||
.pipe(log_errors)
|
||||
.after(process_new_scripts::<R>),
|
||||
init_callbacks::<R>.pipe(log_errors),
|
||||
.in_set(ScriptSystems::InitCallbacks)
|
||||
.after(ScriptSystems::Reload),
|
||||
process_new_scripts::<R>
|
||||
.pipe(log_errors)
|
||||
.after(init_callbacks::<R>),
|
||||
.in_set(ScriptSystems::ProcessNewScripts)
|
||||
.after(ScriptSystems::InitCallbacks),
|
||||
process_calls::<R>
|
||||
.pipe(log_errors)
|
||||
.in_set(ScriptSystems::ProcessCalls)
|
||||
.after(ScriptSystems::ProcessNewScripts),
|
||||
),
|
||||
);
|
||||
|
||||
let runtime = ScriptingRuntimeBuilder::<R>::new(self.world_mut());
|
||||
|
||||
f(runtime);
|
||||
|
||||
self
|
||||
|
|
|
|||
|
|
@ -171,7 +171,7 @@ fn then(r_self: magnus::Value) -> magnus::Value {
|
|||
}
|
||||
.as_value(),
|
||||
))
|
||||
.into_value()
|
||||
.into_value_with(&ruby)
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
|
@ -448,11 +448,11 @@ impl Runtime for RubyRuntime {
|
|||
let result = f(
|
||||
(),
|
||||
args.iter()
|
||||
.map(|arg| RubyValue::new(arg.into_value()))
|
||||
.map(|arg| RubyValue::new(arg.into_value_with(&ruby)))
|
||||
.collect(),
|
||||
)
|
||||
.expect("failed to call callback");
|
||||
result.into_value()
|
||||
result.into_value_with(&ruby)
|
||||
}
|
||||
|
||||
self.execute_in_thread(Box::new(move |ruby: &Ruby| {
|
||||
|
|
@ -527,8 +527,8 @@ impl<T: TryConvert> FromRuntimeValueWithEngine<'_, RubyRuntime> for T {
|
|||
}
|
||||
|
||||
impl<T: IntoValue> IntoRuntimeValueWithEngine<'_, T, RubyRuntime> for T {
|
||||
fn into_runtime_value_with_engine(value: T, _engine: &magnus::Ruby) -> RubyValue {
|
||||
RubyValue::new(value.into_value())
|
||||
fn into_runtime_value_with_engine(value: T, engine: &magnus::Ruby) -> RubyValue {
|
||||
RubyValue::new(value.into_value_with(engine))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -539,9 +539,9 @@ impl FuncArgs<'_, RubyValue, RubyRuntime> for () {
|
|||
}
|
||||
|
||||
impl<T: IntoValue> FuncArgs<'_, RubyValue, RubyRuntime> for Vec<T> {
|
||||
fn parse(self, _engine: &magnus::Ruby) -> Vec<RubyValue> {
|
||||
fn parse(self, engine: &magnus::Ruby) -> Vec<RubyValue> {
|
||||
self.into_iter()
|
||||
.map(|x| RubyValue::new(x.into_value()))
|
||||
.map(|x| RubyValue::new(x.into_value_with(engine)))
|
||||
.collect()
|
||||
}
|
||||
}
|
||||
|
|
@ -562,9 +562,9 @@ macro_rules! impl_tuple {
|
|||
impl<'a, $($t: IntoValue,)+> FuncArgs<'a, RubyValue, RubyRuntime>
|
||||
for ($($t,)+)
|
||||
{
|
||||
fn parse(self, _engine: &'a magnus::Ruby) -> Vec<RubyValue> {
|
||||
fn parse(self, engine: &'a magnus::Ruby) -> Vec<RubyValue> {
|
||||
vec![
|
||||
$(RubyValue::new(self.$idx.into_value()), )+
|
||||
$(RubyValue::new(self.$idx.into_value_with(engine)), )+
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ use super::components::Script;
|
|||
/// Reloads scripts when they are modified.
|
||||
pub(crate) fn reload_scripts<R: Runtime>(
|
||||
mut commands: Commands,
|
||||
mut ev_asset: EventReader<AssetEvent<R::ScriptAsset>>,
|
||||
mut ev_asset: MessageReader<AssetEvent<R::ScriptAsset>>,
|
||||
mut scripts: Query<(Entity, &mut Script<R::ScriptAsset>)>,
|
||||
) {
|
||||
for ev in ev_asset.read() {
|
||||
|
|
@ -149,7 +149,9 @@ pub(crate) fn process_calls<R: Runtime>(world: &mut World) -> Result<(), Scripti
|
|||
.system
|
||||
.lock()
|
||||
.expect("Failed to lock callback system mutex");
|
||||
let val = system.call(&call, world);
|
||||
let val = system
|
||||
.call(&call, world)
|
||||
.expect("Callback system call failed");
|
||||
let mut runtime = world
|
||||
.get_resource_mut::<R>()
|
||||
.ok_or(ScriptingError::NoRuntimeResource)?;
|
||||
|
|
|
|||
Loading…
Reference in a new issue