diff --git a/pax-chassis-common/Cargo.toml b/pax-chassis-common/Cargo.toml index 302f954c4..a5128bd74 100644 --- a/pax-chassis-common/Cargo.toml +++ b/pax-chassis-common/Cargo.toml @@ -12,6 +12,7 @@ include = ["src/**/*","pax-swift-common/**/*"] [lib] [dependencies] +env_logger = "0.11.1" piet = "0.6.0" piet-coregraphics = "0.6.0" pax-runtime = { path = "../pax-runtime", version="0.12.0" } diff --git a/pax-chassis-common/pax-swift-cartridge/PaxCartridge.xcframework/ios-arm64/PaxCartridge.framework/Headers/PaxCartridge.h b/pax-chassis-common/pax-swift-cartridge/PaxCartridge.xcframework/ios-arm64/PaxCartridge.framework/Headers/PaxCartridge.h index e7b6f013f..f7e768eec 100644 --- a/pax-chassis-common/pax-swift-cartridge/PaxCartridge.xcframework/ios-arm64/PaxCartridge.framework/Headers/PaxCartridge.h +++ b/pax-chassis-common/pax-swift-cartridge/PaxCartridge.xcframework/ios-arm64/PaxCartridge.framework/Headers/PaxCartridge.h @@ -20,7 +20,7 @@ typedef struct InterruptBuffer { typedef struct PaxEngineContainer PaxEngineContainer; -struct PaxEngineContainer *pax_init(void (*logger)(const char*)); +struct PaxEngineContainer *pax_init(); void pax_dealloc_engine(struct PaxEngineContainer * container); diff --git a/pax-chassis-common/pax-swift-cartridge/PaxCartridge.xcframework/ios-arm64_x86_64-simulator/PaxCartridge.framework/Headers/PaxCartridge.h b/pax-chassis-common/pax-swift-cartridge/PaxCartridge.xcframework/ios-arm64_x86_64-simulator/PaxCartridge.framework/Headers/PaxCartridge.h index e7b6f013f..f7e768eec 100644 --- a/pax-chassis-common/pax-swift-cartridge/PaxCartridge.xcframework/ios-arm64_x86_64-simulator/PaxCartridge.framework/Headers/PaxCartridge.h +++ b/pax-chassis-common/pax-swift-cartridge/PaxCartridge.xcframework/ios-arm64_x86_64-simulator/PaxCartridge.framework/Headers/PaxCartridge.h @@ -20,7 +20,7 @@ typedef struct InterruptBuffer { typedef struct PaxEngineContainer PaxEngineContainer; -struct PaxEngineContainer *pax_init(void (*logger)(const char*)); +struct PaxEngineContainer *pax_init(); void pax_dealloc_engine(struct PaxEngineContainer * container); diff --git a/pax-chassis-common/pax-swift-cartridge/PaxCartridge.xcframework/macos-arm64_x86_64/PaxCartridge.framework/Headers/PaxCartridge.h b/pax-chassis-common/pax-swift-cartridge/PaxCartridge.xcframework/macos-arm64_x86_64/PaxCartridge.framework/Headers/PaxCartridge.h index e7b6f013f..f7e768eec 100644 --- a/pax-chassis-common/pax-swift-cartridge/PaxCartridge.xcframework/macos-arm64_x86_64/PaxCartridge.framework/Headers/PaxCartridge.h +++ b/pax-chassis-common/pax-swift-cartridge/PaxCartridge.xcframework/macos-arm64_x86_64/PaxCartridge.framework/Headers/PaxCartridge.h @@ -20,7 +20,7 @@ typedef struct InterruptBuffer { typedef struct PaxEngineContainer PaxEngineContainer; -struct PaxEngineContainer *pax_init(void (*logger)(const char*)); +struct PaxEngineContainer *pax_init(); void pax_dealloc_engine(struct PaxEngineContainer * container); diff --git a/pax-chassis-common/src/core_graphics_c_bridge.rs b/pax-chassis-common/src/core_graphics_c_bridge.rs index cbaf8abb3..11b36a701 100644 --- a/pax-chassis-common/src/core_graphics_c_bridge.rs +++ b/pax-chassis-common/src/core_graphics_c_bridge.rs @@ -5,7 +5,6 @@ extern crate core; use std::ffi::c_void; use std::mem::{transmute, ManuallyDrop}; -use std::os::raw::c_char; use core_graphics::context::CGContext; use pax_runtime::math::Point2; @@ -35,7 +34,8 @@ pub struct PaxEngineContainer { /// Allocate an instance of the Pax engine, with a specified root/main component from the loaded `pax_cartridge`. #[no_mangle] //Exposed to Swift via PaxCartridge.h -pub extern "C" fn pax_init(logger: extern "C" fn(*const c_char)) -> *mut PaxEngineContainer { +pub extern "C" fn pax_init() -> *mut PaxEngineContainer { + env_logger::init(); //Initialize a ManuallyDrop-contained PaxEngine, so that a pointer to that //engine can be passed back to Swift via the C (FFI) bridge //This could presumably be cleaned up -- see `pax_dealloc_engine` @@ -47,7 +47,6 @@ pub extern "C" fn pax_init(logger: extern "C" fn(*const c_char)) -> *mut PaxEngi let engine: ManuallyDrop> = ManuallyDrop::new(Box::new(PaxEngine::new( main_component_instance, expression_table, - pax_runtime::api::PlatformSpecificLogger::MacOS(logger), (1.0, 1.0), ))); diff --git a/pax-chassis-macos/interface/pax-app-macos/pax-app-macos/PaxViewMacos.swift b/pax-chassis-macos/interface/pax-app-macos/pax-app-macos/PaxViewMacos.swift index fdda7db3b..a450d5a66 100644 --- a/pax-chassis-macos/interface/pax-app-macos/pax-app-macos/PaxViewMacos.swift +++ b/pax-chassis-macos/interface/pax-app-macos/pax-app-macos/PaxViewMacos.swift @@ -154,18 +154,7 @@ struct PaxViewMacos: View { var cgContext = context.cgContext if PaxEngineContainer.paxEngineContainer == nil { - let swiftLoggerCallback : @convention(c) (UnsafePointer?) -> () = { - (msg) -> () in - let outputString = String(cString: msg!) - print(outputString) - } - - //For manual debugger attachment: -// do { -// sleep(15) -// } - - PaxEngineContainer.paxEngineContainer = pax_init(swiftLoggerCallback) + PaxEngineContainer.paxEngineContainer = pax_init() } else { let nativeMessageQueue = pax_tick(PaxEngineContainer.paxEngineContainer!, &cgContext, CFloat(dirtyRect.width), CFloat(dirtyRect.height)) diff --git a/pax-chassis-web/Cargo.toml b/pax-chassis-web/Cargo.toml index f5be30084..3465e838f 100644 --- a/pax-chassis-web/Cargo.toml +++ b/pax-chassis-web/Cargo.toml @@ -22,6 +22,8 @@ pax-cartridge = {path="../pax-cartridge", version="0.12.0"} pax-message = {path = "../pax-message", version="0.12.0"} wasm-bindgen = {version = "0.2.80", features=["serde-serialize"]} serde_json = "1.0.95" +console_log = "1.0.0" +log = "0.4.20" console_error_panic_hook = { version = "0.1.6", optional = true } js-sys = "0.3.63" diff --git a/pax-chassis-web/src/lib.rs b/pax-chassis-web/src/lib.rs index d06f1d614..04daa86c9 100644 --- a/pax-chassis-web/src/lib.rs +++ b/pax-chassis-web/src/lib.rs @@ -1,6 +1,7 @@ //! Basic example of rendering in the browser use js_sys::Uint8Array; +use log::Level; use pax_runtime::api::ArgsButtonClick; use pax_runtime::api::ArgsCheckboxChange; use pax_runtime::api::ArgsTextboxChange; @@ -34,33 +35,6 @@ use pax_designtime::DesigntimeManager; #[cfg(feature = "designtime")] const USERLAND_PROJECT_ID: &str = "userland_project"; -// Console.log support, piped from `pax_engine::log` -#[wasm_bindgen] -extern "C" { - // Use `js_namespace` here to bind `console.log(..)` instead of just - // `log(..)` - #[wasm_bindgen(js_namespace = console)] - fn log(s: &str); - - // The `console.log` is quite polymorphic, so we can bind it with multiple - // signatures. Note that we need to use `js_name` to ensure we always call - // `log` in JS. - #[wasm_bindgen(js_namespace = console, js_name = log)] - fn log_u32(a: u32); - - // Multiple arguments too! - #[wasm_bindgen(js_namespace = console, js_name = log)] - fn log_many(a: &str, b: &str); -} - -macro_rules! console_log { - ($($t:tt)*) => (log(&format_args!($($t)*).to_string())) -} - -pub fn log_wrapper(msg: &str) { - console_log!("{}", msg); -} - #[wasm_bindgen] pub fn wasm_memory() -> JsValue { wasm_bindgen::memory() @@ -84,6 +58,14 @@ impl PaxChassisWeb { pub fn new() -> Self { #[cfg(feature = "console_error_panic_hook")] std::panic::set_hook(Box::new(console_error_panic_hook::hook)); + + #[cfg(debug_assertions)] + console_log::init_with_level(Level::Debug) + .expect("console_log::init_with_level initialized correctly"); + #[cfg(not(debug_assertions))] + console_log::init_with_level(Level::Error) + .expect("console_log::init_with_level initialized correctly"); + let window = window().unwrap(); let width = window.inner_width().unwrap().as_f64().unwrap(); let height = window.inner_height().unwrap().as_f64().unwrap(); @@ -101,7 +83,6 @@ impl PaxChassisWeb { let engine = pax_runtime::PaxEngine::new_with_designtime( main_component_instance, expression_table, - pax_runtime::api::PlatformSpecificLogger::Web(log_wrapper), (width, height), designtime_manager.clone(), ); @@ -119,7 +100,6 @@ impl PaxChassisWeb { let engine = pax_runtime::PaxEngine::new( main_component_instance, expression_table, - pax_runtime::api::PlatformSpecificLogger::Web(log_wrapper), (width, height), ); diff --git a/pax-engine/Cargo.toml b/pax-engine/Cargo.toml index 2a2e7d453..eef9e3864 100644 --- a/pax-engine/Cargo.toml +++ b/pax-engine/Cargo.toml @@ -15,6 +15,7 @@ pax-macro = {path="../pax-macro", version="0.12.0"} pax-message = {path="../pax-message", version="0.12.0"} pax-runtime = {path="../pax-runtime", version="0.12.0"} pax-compiler = {path="../pax-compiler", optional=true, version="0.12.0"} +log = "0.4.20" [features] parser = ["dep:pax-compiler"] diff --git a/pax-engine/src/lib.rs b/pax-engine/src/lib.rs index fcd6e273a..83a190298 100644 --- a/pax-engine/src/lib.rs +++ b/pax-engine/src/lib.rs @@ -1,12 +1,12 @@ pub extern crate pax_macro; pub use pax_macro::*; +pub use log; pub use pax_runtime::api; pub use pax_runtime::engine::node_interface::*; pub use pax_runtime::math; pub use pax_runtime::rendering; -pub use pax_runtime::api::log; pub use pax_runtime::api::serde; pub use pax_runtime::api::Property; diff --git a/pax-runtime/src/api.rs b/pax-runtime/src/api.rs index 5d80e7a55..71230ed2c 100644 --- a/pax-runtime/src/api.rs +++ b/pax-runtime/src/api.rs @@ -1,14 +1,10 @@ -use std::borrow::Borrow; use std::collections::VecDeque; -use std::ffi::CString; use std::ops::{Add, Deref, Mul, Neg}; #[cfg(feature = "designtime")] use std::rc::Rc; use kurbo::BezPath; -use lazy_static::lazy_static; -use mut_static::MutStatic; use piet::PaintBrush; use crate::math::{Point2, Space}; @@ -721,36 +717,6 @@ impl Default for Size { } } -/// Coproduct for storing various kinds of function pointer, -/// needed to achieve compatibility with various native bridge mechanisms -pub enum PlatformSpecificLogger { - Web(fn(&str)), - MacOS(extern "C" fn(*const std::os::raw::c_char)), -} - -pub struct Logger(PlatformSpecificLogger); - -lazy_static! { - static ref LOGGER: MutStatic = MutStatic::new(); -} - -pub fn register_logger(logger: PlatformSpecificLogger) { - LOGGER.borrow().set(Logger(logger)).unwrap(); -} - -/// Log to the appropriate native logging mechanism -/// Most often called as `pax_engine::log("some message")` -pub fn log(msg: &str) { - let logging_variant = &(LOGGER.borrow().read().expect("Logger isn't registered").0); - match logging_variant { - PlatformSpecificLogger::Web(closure) => closure(msg), - PlatformSpecificLogger::MacOS(closure) => { - let msg = CString::new(msg).unwrap(); - (closure)(msg.as_ptr()); - } - } -} - impl Mul for Size { type Output = Size; @@ -964,7 +930,6 @@ impl PropertyInstance for PropertyLiteral { } fn _get_transition_manager(&mut self) -> Option<&mut TransitionManager> { - // log(&format!("property T not printable")); if let None = self.transition_manager.value { None } else { diff --git a/pax-runtime/src/engine/mod.rs b/pax-runtime/src/engine/mod.rs index 81625dae5..e8a2674d9 100644 --- a/pax-runtime/src/engine/mod.rs +++ b/pax-runtime/src/engine/mod.rs @@ -253,13 +253,10 @@ impl PaxEngine { pub fn new( main_component_instance: Rc, expression_table: ExpressionTable, - logger: crate::api::PlatformSpecificLogger, viewport_size: (f64, f64), ) -> Self { use crate::math::Transform2; - crate::api::register_logger(logger); - let globals = Globals { frames_elapsed: 0, viewport: TransformAndBounds { @@ -282,14 +279,10 @@ impl PaxEngine { pub fn new_with_designtime( main_component_instance: Rc, expression_table: ExpressionTable, - logger: crate::api::PlatformSpecificLogger, viewport_size: (f64, f64), designtime: Rc>, ) -> Self { use crate::math::Transform2; - - crate::api::register_logger(logger); - let globals = Globals { frames_elapsed: 0, viewport: TransformAndBounds {