kitgit

tirbofish/dropbear · commit

46fd10eb3150714b93740d6e5508fce360b13064

fix: general fixes around the block style: `cargo fmt`

Unverified

Thribhu K <4tkbytes@pm.me> · 2026-03-28 10:01

view full diff

diff --git a/crates/dropbear-engine/src/lib.rs b/crates/dropbear-engine/src/lib.rs
index 013da09..f80f276 100644
--- a/crates/dropbear-engine/src/lib.rs
+++ b/crates/dropbear-engine/src/lib.rs
@@ -58,7 +58,7 @@ use std::{
     time::{Duration, Instant},
 };
 use wgpu::{
-    BindGroupLayoutEntry, BindingType, BufferBindingType, CurrentSurfaceTexture, Device,
+    BindGroupLayoutEntry, BindingType, BufferBindingType, Device,
     ExperimentalFeatures, Instance, Queue, ShaderStages, Surface, SurfaceConfiguration,
     TextureFormat, TextureFormatFeatureFlags,
 };
diff --git a/crates/eucalyptus-core/src/asset/mod.rs b/crates/eucalyptus-core/src/asset/mod.rs
index 3664bd4..c8043bb 100644
--- a/crates/eucalyptus-core/src/asset/mod.rs
+++ b/crates/eucalyptus-core/src/asset/mod.rs
@@ -1,13 +1,13 @@
 pub mod model;
 pub mod texture;
 
-use jni::{jni_sig, jni_str, Env};
 use crate::ptr::{AssetRegistryPtr, AssetRegistryUnwrapped};
 use crate::scripting::jni::utils::FromJObject;
 use crate::scripting::native::DropbearNativeError;
 use crate::scripting::result::DropbearNativeResult;
 use dropbear_engine::asset::AssetKind;
 use jni::objects::JObject;
+use jni::{Env, jni_sig, jni_str};
 
 #[dropbear_macro::export(
     kotlin(class = "com.dropbear.DropbearEngineNative", func = "getAsset"),
@@ -44,7 +44,9 @@ impl FromJObject for AssetKind {
     where
         Self: Sized,
     {
-        let ordinal = env.call_method(obj, jni_str!("ordinal"), jni_sig!(() -> i32), &[])?.i()?;
+        let ordinal = env
+            .call_method(obj, jni_str!("ordinal"), jni_sig!(() -> i32), &[])?
+            .i()?;
 
         match ordinal {
             0 => Ok(AssetKind::Texture),
diff --git a/crates/eucalyptus-core/src/asset/model.rs b/crates/eucalyptus-core/src/asset/model.rs
index 4b4bd22..b38684e 100644
--- a/crates/eucalyptus-core/src/asset/model.rs
+++ b/crates/eucalyptus-core/src/asset/model.rs
@@ -8,9 +8,8 @@ use dropbear_engine::model::{
     Animation, AnimationChannel, AnimationInterpolation, ChannelValues, Material, Mesh,
     ModelVertex, Node, NodeTransform, Skin,
 };
-use jni::{jni_sig, jni_str, Env};
 use jni::objects::{JObject, JValue};
-use jni::sys::jboolean;
+use jni::{Env, jni_sig, jni_str};
 
 #[repr(C)]
 #[derive(Clone, Debug)]
@@ -91,7 +90,11 @@ impl ToJObject for NMesh {
         ];
 
         let obj = env
-            .new_object(&class, jni_sig!((java.lang.String, int, int, java.util.List) -> ()), &args)
+            .new_object(
+                &class,
+                jni_sig!((java.lang.String, int, int, java.util.List) -> ()),
+                &args,
+            )
             .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
 
         Ok(obj)
@@ -223,7 +226,7 @@ impl ToJObject for NNodeTransform {
                 jni_sig!("(Lcom/dropbear/math/Vector3d;Lcom/dropbear/math/Quaterniond;Lcom/dropbear/math/Vector3d;)V"),
                 &args,
             )
-            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;;
+            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
 
         Ok(obj)
     }
@@ -264,7 +267,7 @@ impl ToJObject for NNode {
                 jni_sig!("(Ljava/lang/String;Ljava/lang/Integer;Ljava/util/List;Lcom/dropbear/asset/model/NodeTransform;)V"),
                 &args,
             )
-            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;;
+            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
 
         Ok(obj)
     }
@@ -302,10 +305,12 @@ impl ToJObject for NSkin {
         let obj = env
             .new_object(
                 &class,
-                jni_sig!("(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/Integer;)V"),
+                jni_sig!(
+                    "(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/Integer;)V"
+                ),
                 &args,
             )
-            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;;
+            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
 
         Ok(obj)
     }
@@ -337,8 +342,12 @@ impl ToJObject for NAnimation {
         ];
 
         let obj = env
-            .new_object(&class, jni_sig!("(Ljava/lang/String;Ljava/util/List;D)V"), &args)
-            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;;
+            .new_object(
+                &class,
+                jni_sig!("(Ljava/lang/String;Ljava/util/List;D)V"),
+                &args,
+            )
+            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
 
         Ok(obj)
     }
@@ -376,7 +385,7 @@ impl ToJObject for NAnimationChannel {
                 jni_sig!("(I[DLcom/dropbear/asset/model/ChannelValues;Lcom/dropbear/asset/model/AnimationInterpolation;)V"),
                 &args,
             )
-            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;;
+            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
 
         Ok(obj)
     }
@@ -411,7 +420,7 @@ impl ToJObject for NAnimationInterpolation {
             )
             .map_err(|_| DropbearNativeError::JNIFailedToGetField)?
             .l()
-            .map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;;
+            .map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;
 
         Ok(value)
     }
@@ -432,11 +441,17 @@ impl ToJObject for NChannelValues {
         match self {
             NChannelValues::Translations { values } => {
                 let class = env
-                    .load_class(jni_str!("com.dropbear.asset.model.ChannelValues$Translations"))
+                    .load_class(jni_str!(
+                        "com.dropbear.asset.model.ChannelValues$Translations"
+                    ))
                     .map_err(|_| DropbearNativeError::JNIClassNotFound)?;
                 let list = values.to_jobject(env)?;
                 let obj = env
-                    .new_object(&class, jni_sig!("(Ljava/util/List;)V"), &[JValue::Object(&list)])
+                    .new_object(
+                        &class,
+                        jni_sig!("(Ljava/util/List;)V"),
+                        &[JValue::Object(&list)],
+                    )
                     .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
                 Ok(obj)
             }
@@ -446,7 +461,11 @@ impl ToJObject for NChannelValues {
                     .map_err(|_| DropbearNativeError::JNIClassNotFound)?;
                 let list = values.to_jobject(env)?;
                 let obj = env
-                    .new_object(&class, jni_sig!("(Ljava/util/List;)V"), &[JValue::Object(&list)])
+                    .new_object(
+                        &class,
+                        jni_sig!("(Ljava/util/List;)V"),
+                        &[JValue::Object(&list)],
+                    )
                     .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
                 Ok(obj)
             }
@@ -456,17 +475,27 @@ impl ToJObject for NChannelValues {
                     .map_err(|_| DropbearNativeError::JNIClassNotFound)?;
                 let list = values.to_jobject(env)?;
                 let obj = env
-                    .new_object(&class, jni_sig!("(Ljava/util/List;)V"), &[JValue::Object(&list)])
-                    .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;;
+                    .new_object(
+                        &class,
+                        jni_sig!("(Ljava/util/List;)V"),
+                        &[JValue::Object(&list)],
+                    )
+                    .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
                 Ok(obj)
             }
             NChannelValues::MorphWeights { values } => {
                 let class = env
-                    .load_class(jni_str!("com.dropbear.asset.model.ChannelValues$MorphWeights"))
+                    .load_class(jni_str!(
+                        "com.dropbear.asset.model.ChannelValues$MorphWeights"
+                    ))
                     .map_err(|_| DropbearNativeError::JNIClassNotFound)?;
                 let list = values.to_jobject(env)?;
                 let obj = env
-                    .new_object(&class, jni_sig!("(Ljava/util/List;)V"), &[JValue::Object(&list)])
+                    .new_object(
+                        &class,
+                        jni_sig!("(Ljava/util/List;)V"),
+                        &[JValue::Object(&list)],
+                    )
                     .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
                 Ok(obj)
             }
diff --git a/crates/eucalyptus-core/src/input/gamepad.rs b/crates/eucalyptus-core/src/input/gamepad.rs
index f94df4b..8d542e7 100644
--- a/crates/eucalyptus-core/src/input/gamepad.rs
+++ b/crates/eucalyptus-core/src/input/gamepad.rs
@@ -9,8 +9,8 @@ pub mod shared {
     use crate::scripting::native::DropbearNativeError;
     use crate::scripting::result::DropbearNativeResult;
     use crate::types::NVector2;
-    use jni::{Env, jni_str, jni_sig};
     use jni::objects::{JObject, JValue};
+    use jni::{Env, jni_sig, jni_str};
 
     fn map_int_to_gamepad_button(ordinal: i32) -> Option<dropbear_engine::gilrs::Button> {
         match ordinal {
@@ -89,10 +89,12 @@ pub mod shared {
 
     impl ToJObject for NVector2 {
         fn to_jobject<'a>(&self, env: &mut Env<'a>) -> DropbearNativeResult<JObject<'a>> {
-            let cls = env.load_class(jni_str!("com/dropbear/math/Vector2d")).map_err(|e| {
-                eprintln!("Could not find Vector2d class: {:?}", e);
-                DropbearNativeError::GenericError
-            })?;
+            let cls = env
+                .load_class(jni_str!("com/dropbear/math/Vector2d"))
+                .map_err(|e| {
+                    eprintln!("Could not find Vector2d class: {:?}", e);
+                    DropbearNativeError::GenericError
+                })?;
 
             let obj = env
                 .new_object(
@@ -103,7 +105,7 @@ pub mod shared {
                 .map_err(|e| {
                     eprintln!("Failed to create Vector2d object: {:?}", e);
                     DropbearNativeError::GenericError
-                })?;;
+                })?;
 
             Ok(obj)
         }
diff --git a/crates/eucalyptus-core/src/lighting.rs b/crates/eucalyptus-core/src/lighting.rs
index 6e5da31..5d6b196 100644
--- a/crates/eucalyptus-core/src/lighting.rs
+++ b/crates/eucalyptus-core/src/lighting.rs
@@ -15,8 +15,8 @@ use dropbear_engine::lighting::{Light, LightType};
 use egui::{CollapsingHeader, ComboBox, DragValue, Ui};
 use glam::{DQuat, DVec3, Vec3};
 use hecs::{Entity, World};
-use jni::{Env, jni_str, jni_sig};
 use jni::objects::{JObject, JValue};
+use jni::{Env, jni_sig, jni_str};
 use std::sync::Arc;
 
 const LIGHT_FORWARD_AXIS: DVec3 = DVec3::new(0.0, -1.0, 0.0);
diff --git a/crates/eucalyptus-core/src/logging.rs b/crates/eucalyptus-core/src/logging.rs
index 79f1183..30ee252 100644
--- a/crates/eucalyptus-core/src/logging.rs
+++ b/crates/eucalyptus-core/src/logging.rs
@@ -5,12 +5,10 @@
 //! - Console
 //! - File (to be implemented)
 
-#[cfg(feature = "editor")]
-use egui::Context;
-use std::fmt::{Display, Formatter};
 use egui::Ui;
 #[cfg(feature = "editor")]
 use egui_toast::Toasts;
+use std::fmt::{Display, Formatter};
 
 use once_cell::sync::Lazy;
 use parking_lot::Mutex;
diff --git a/crates/eucalyptus-core/src/physics/collider.rs b/crates/eucalyptus-core/src/physics/collider.rs
index 3df18ce..f119852 100644
--- a/crates/eucalyptus-core/src/physics/collider.rs
+++ b/crates/eucalyptus-core/src/physics/collider.rs
@@ -27,8 +27,8 @@ use crate::scripting::native::DropbearNativeError;
 use crate::scripting::result::DropbearNativeResult;
 use crate::states::Label;
 use crate::types::{NCollider, NVector3};
-use ::jni::{Env, jni_str, jni_sig};
 use ::jni::objects::{JObject, JValue};
+use ::jni::{Env, jni_sig, jni_str};
 use dropbear_engine::asset::ASSET_REGISTRY;
 use dropbear_engine::entity::{MeshRenderer, inspect_rotation_dquat};
 use dropbear_engine::graphics::SharedGraphicsContext;
@@ -508,10 +508,12 @@ impl ToJObject for ColliderShape {
     fn to_jobject<'a>(&self, env: &mut Env<'a>) -> DropbearNativeResult<JObject<'a>> {
         match self {
             ColliderShape::Box { half_extents } => {
-                let vec_cls = env.load_class(jni_str!("com/dropbear/math/Vector3d")).map_err(|e| {
-                    eprintln!("[JNI Error] Vector3d class not found: {:?}", e);
-                    DropbearNativeError::JNIClassNotFound
-                })?;
+                let vec_cls = env
+                    .load_class(jni_str!("com/dropbear/math/Vector3d"))
+                    .map_err(|e| {
+                        eprintln!("[JNI Error] Vector3d class not found: {:?}", e);
+                        DropbearNativeError::JNIClassNotFound
+                    })?;
 
                 let vec_obj = env
                     .new_object(
@@ -619,14 +621,19 @@ impl FromJObject for ColliderShape {
     where
         Self: Sized,
     {
-        let is_instance = |env: &mut Env, obj: &JObject, class_name: &jni::strings::JNIStr| -> bool {
-            env.is_instance_of(obj, class_name).unwrap_or(false)
-        };
+        let is_instance = |env: &mut Env,
+                           obj: &JObject,
+                           class_name: &jni::strings::JNIStr|
+         -> bool { env.is_instance_of(obj, class_name).unwrap_or(false) };
 
         if is_instance(env, obj, jni_str!("com/dropbear/physics/ColliderShape$Box")) {
             let vec_obj_val = env
-                .get_field(obj, jni_str!("halfExtents"), jni_sig!("Lcom/dropbear/math/Vector3d;"))
-                .map_err(|_| DropbearNativeError::JNIFailedToGetField)?;;
+                .get_field(
+                    obj,
+                    jni_str!("halfExtents"),
+                    jni_sig!("Lcom/dropbear/math/Vector3d;"),
+                )
+                .map_err(|_| DropbearNativeError::JNIFailedToGetField)?;
             let vec_obj = vec_obj_val
                 .l()
                 .map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;
@@ -652,7 +659,11 @@ impl FromJObject for ColliderShape {
             });
         }
 
-        if is_instance(env, obj, jni_str!("com/dropbear/physics/ColliderShape$Sphere")) {
+        if is_instance(
+            env,
+            obj,
+            jni_str!("com/dropbear/physics/ColliderShape$Sphere"),
+        ) {
             let radius = env
                 .get_field(obj, jni_str!("radius"), jni_sig!("F"))
                 .map_err(|_| DropbearNativeError::JNIFailedToGetField)?
@@ -662,7 +673,11 @@ impl FromJObject for ColliderShape {
             return Ok(ColliderShape::Sphere { radius });
         }
 
-        if is_instance(env, obj, jni_str!("com/dropbear/physics/ColliderShape$Capsule")) {
+        if is_instance(
+            env,
+            obj,
+            jni_str!("com/dropbear/physics/ColliderShape$Capsule"),
+        ) {
             let hh = env
                 .get_field(obj, jni_str!("halfHeight"), jni_sig!("F"))
                 .map_err(|_| DropbearNativeError::JNIFailedToGetField)?
@@ -680,7 +695,11 @@ impl FromJObject for ColliderShape {
             });
         }
 
-        if is_instance(env, obj, jni_str!("com/dropbear/physics/ColliderShape$Cylinder")) {
+        if is_instance(
+            env,
+            obj,
+            jni_str!("com/dropbear/physics/ColliderShape$Cylinder"),
+        ) {
             let hh = env
                 .get_field(obj, jni_str!("halfHeight"), jni_sig!("F"))
                 .map_err(|_| DropbearNativeError::JNIFailedToGetField)?
@@ -698,7 +717,11 @@ impl FromJObject for ColliderShape {
             });
         }
 
-        if is_instance(env, obj, jni_str!("com/dropbear/physics/ColliderShape$Cone")) {
+        if is_instance(
+            env,
+            obj,
+            jni_str!("com/dropbear/physics/ColliderShape$Cone"),
+        ) {
             let hh = env
                 .get_field(obj, jni_str!("halfHeight"), jni_sig!("F"))
                 .map_err(|_| DropbearNativeError::JNIFailedToGetField)?
diff --git a/crates/eucalyptus-core/src/physics/kcc.rs b/crates/eucalyptus-core/src/physics/kcc.rs
index db0b620..0754047 100644
--- a/crates/eucalyptus-core/src/physics/kcc.rs
+++ b/crates/eucalyptus-core/src/physics/kcc.rs
@@ -16,8 +16,8 @@ use crate::types::{IndexNative, NQuaternion, NVector3};
 use dropbear_engine::graphics::SharedGraphicsContext;
 use egui::{ComboBox, DragValue, Ui};
 use hecs::{Entity, World};
-use jni::{Env, jni_str, jni_sig};
 use jni::objects::{JObject, JValue};
+use jni::{Env, jni_sig, jni_str};
 use rapier3d::control::{
     CharacterAutostep, CharacterCollision, CharacterLength, KinematicCharacterController,
 };
@@ -62,7 +62,11 @@ impl ToJObject for CharacterMovementResult {
         ];
 
         let obj = env
-            .new_object(&class, jni_sig!((com.dropbear.math.Vector3d, boolean, boolean) -> void), &args)
+            .new_object(
+                &class,
+                jni_sig!((com.dropbear.math.Vector3d, boolean, boolean) -> void),
+                &args,
+            )
             .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
 
         Ok(obj)
@@ -291,7 +295,11 @@ impl ToJObject for CharacterCollisionArray {
             .map_err(|_| DropbearNativeError::JNIClassNotFound)?;
 
         let entity_obj = env
-            .new_object(&entity_cls, jni_sig!((long) -> void), &[JValue::Long(self.entity_id as i64)])
+            .new_object(
+                &entity_cls,
+                jni_sig!((long) -> void),
+                &[JValue::Long(self.entity_id as i64)],
+            )
             .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
 
         let out = env
diff --git a/crates/eucalyptus-core/src/physics/kcc/character_collision.rs b/crates/eucalyptus-core/src/physics/kcc/character_collision.rs
index 16ccad3..0bf0104 100644
--- a/crates/eucalyptus-core/src/physics/kcc/character_collision.rs
+++ b/crates/eucalyptus-core/src/physics/kcc/character_collision.rs
@@ -2,8 +2,8 @@ use crate::scripting::jni::utils::ToJObject;
 use crate::scripting::native::DropbearNativeError;
 use crate::scripting::result::DropbearNativeResult;
 use crate::types::{IndexNative, NCollider, NShapeCastStatus, NTransform, NVector3};
-use ::jni::{Env, jni_str, jni_sig};
 use ::jni::objects::{JObject, JValue};
+use ::jni::{Env, jni_sig, jni_str};
 use hecs::{Entity, World};
 use rapier3d::control::CharacterCollision;
 
diff --git a/crates/eucalyptus-core/src/physics/rigidbody.rs b/crates/eucalyptus-core/src/physics/rigidbody.rs
index 028bca3..9ab69b2 100644
--- a/crates/eucalyptus-core/src/physics/rigidbody.rs
+++ b/crates/eucalyptus-core/src/physics/rigidbody.rs
@@ -10,8 +10,8 @@ use crate::scripting::native::DropbearNativeError;
 use crate::scripting::result::DropbearNativeResult;
 use crate::states::Label;
 use crate::types::{IndexNative, NCollider, NVector3, RigidBodyContext};
-use ::jni::{Env, jni_str, jni_sig};
 use ::jni::objects::{JObject, JValue};
+use ::jni::{Env, jni_sig, jni_str};
 use dropbear_engine::graphics::SharedGraphicsContext;
 use egui::{CollapsingHeader, ComboBox, DragValue, Ui};
 use hecs::{Entity, World};
diff --git a/crates/eucalyptus-core/src/scripting.rs b/crates/eucalyptus-core/src/scripting.rs
index 28b7732..350d594 100644
--- a/crates/eucalyptus-core/src/scripting.rs
+++ b/crates/eucalyptus-core/src/scripting.rs
@@ -568,7 +568,9 @@ impl ScriptManager {
     ///
     /// # ScriptTarget behaviours
     /// - [`ScriptTarget::JVM`] - Located the `RunnableRegistry.kt` manifest file, locates ComponentRegistry, then sets all the related function pointers
-    pub fn discover_components(&mut self) -> anyhow::Result<()> { Ok(()) }
+    pub fn discover_components(&mut self) -> anyhow::Result<()> {
+        Ok(())
+    }
 
     /// Reloads the .jar file by unloading the previous classes and reloading them back in,
     /// allowing for hot reloading.
diff --git a/crates/eucalyptus-core/src/scripting/jni.rs b/crates/eucalyptus-core/src/scripting/jni.rs
index a28cc3c..15d6ab7 100644
--- a/crates/eucalyptus-core/src/scripting/jni.rs
+++ b/crates/eucalyptus-core/src/scripting/jni.rs
@@ -13,10 +13,10 @@ use crate::scripting::error::LastErrorMessage;
 use crate::scripting::jni::utils::ToJObject;
 use crate::types::{CollisionEvent, ContactForceEvent};
 use jni::objects::{Global, JClass, JLongArray, JObject, JString, JValue};
+use jni::signature::RuntimeMethodSignature;
 use jni::strings::JNIString;
 use jni::sys::jlong;
 use jni::{InitArgsBuilder, JNIVersion, JavaVM, jni_sig, jni_str};
-use jni::signature::RuntimeMethodSignature;
 use once_cell::sync::OnceCell;
 use sha2::{Digest, Sha256};
 use std::fs;
@@ -321,7 +321,7 @@ impl JavaContext {
                 env.load_class(jni_str!("com.dropbear.ffi.DropbearContext"))?;
             let runtime_sig = RuntimeMethodSignature::from_str(&sig)
                 .map_err(|e| jni::errors::Error::MethodNotFound { name: sig.clone(), sig: e.to_string() })?;
-            let dropbear_context_obj = env.new_object(dropbear_context_class, runtime_sig.method_signature(), &args)?;;
+            let dropbear_context_obj = env.new_object(dropbear_context_class, runtime_sig.method_signature(), &args)?;
 
             log::trace!("Locating \"com/dropbear/ffi/NativeEngine\" class");
             let native_engine_class: JClass = env.load_class(jni_str!("com.dropbear.ffi.NativeEngine"))?;
@@ -985,15 +985,19 @@ impl LastErrorMessage for JavaContext {
         jvm.attach_current_thread(|env| -> anyhow::Result<Option<String>> {
             let dropbear_kt_class = env.load_class(jni_str!("com.dropbear.DropbearEngineKt"))?;
 
-            let field_value = env
-                .get_static_field(dropbear_kt_class, jni_str!("lastErrorMessage"), jni_sig!(java.lang.String))?;
+            let field_value = env.get_static_field(
+                dropbear_kt_class,
+                jni_str!("lastErrorMessage"),
+                jni_sig!(java.lang.String),
+            )?;
 
             let jobj = field_value.l()?;
 
             if jobj.is_null() {
                 return Ok(None);
             }
-            let rust_string = JString::cast_local(env, jobj).map_err(|_| anyhow::anyhow!("Failed to cast JString"))?;
+            let rust_string = JString::cast_local(env, jobj)
+                .map_err(|_| anyhow::anyhow!("Failed to cast JString"))?;
             Ok(Some(rust_string.to_string()))
         })
         .ok()
diff --git a/crates/eucalyptus-core/src/scripting/jni/primitives.rs b/crates/eucalyptus-core/src/scripting/jni/primitives.rs
index 03ae77f..a7a9a47 100644
--- a/crates/eucalyptus-core/src/scripting/jni/primitives.rs
+++ b/crates/eucalyptus-core/src/scripting/jni/primitives.rs
@@ -1,9 +1,9 @@
 use crate::scripting::jni::utils::{FromJObject, ToJObject};
 use crate::scripting::native::DropbearNativeError;
 use crate::scripting::result::DropbearNativeResult;
-use jni::{jni_sig, jni_str, Env};
 use jni::objects::{JObject, JValue};
 use jni::sys::{jdouble, jint, jlong};
+use jni::{Env, jni_sig, jni_str};
 
 impl ToJObject for Option<i32> {
     fn to_jobject<'a>(&self, env: &mut Env<'a>) -> DropbearNativeResult<JObject<'a>> {
@@ -60,7 +60,9 @@ impl ToJObject for &[i32] {
             .new_int_array(self.len())
             .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
         let buf: Vec<jint> = self.iter().map(|v| *v as jint).collect();
-        array.set_region(env, 0, &buf).map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
+        array
+            .set_region(env, 0, &buf)
+            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
         Ok(JObject::from(array))
     }
 }
@@ -120,7 +122,9 @@ impl ToJObject for &[f64] {
             .new_double_array(self.len())
             .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
         let buf: Vec<jdouble> = self.iter().map(|v| *v as jdouble).collect();
-        array.set_region(env, 0, &buf).map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
+        array
+            .set_region(env, 0, &buf)
+            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
         Ok(JObject::from(array))
     }
 }
diff --git a/crates/eucalyptus-core/src/scripting/jni/utils.rs b/crates/eucalyptus-core/src/scripting/jni/utils.rs
index 914be74..d49a8d9 100644
--- a/crates/eucalyptus-core/src/scripting/jni/utils.rs
+++ b/crates/eucalyptus-core/src/scripting/jni/utils.rs
@@ -66,12 +66,19 @@ where
     where
         Self: Sized,
     {
-        let size = env.call_method(obj, jni_str!("size"), jni_sig!(() -> int), &[])?.i()? as jint;
+        let size = env
+            .call_method(obj, jni_str!("size"), jni_sig!(() -> int), &[])?
+            .i()? as jint;
         let mut out = Vec::with_capacity(size as usize);
 
         for i in 0..size {
             let item = env
-                .call_method(obj, jni_str!("get"), jni_sig!((int) -> java.lang.Object), &[JValue::Int(i)])?
+                .call_method(
+                    obj,
+                    jni_str!("get"),
+                    jni_sig!((int) -> java.lang.Object),
+                    &[JValue::Int(i)],
+                )?
                 .l()?;
             let value = T::from_jobject(env, &item)?;
             out.push(value);
diff --git a/crates/eucalyptus-core/src/scripting/native.rs b/crates/eucalyptus-core/src/scripting/native.rs
index fcfe972..dd14adb 100644
--- a/crates/eucalyptus-core/src/scripting/native.rs
+++ b/crates/eucalyptus-core/src/scripting/native.rs
@@ -51,7 +51,9 @@ pub struct NativeLibrary {
     #[allow(dead_code)]
     pub(crate) set_last_err_msg_fn: Symbol<'static, sig::SetLastErrorMessage>,
 
+    #[allow(dead_code)]
     update_kotlin_component_fn: Option<Symbol<'static, sig::UpdateKotlinComponent>>,
+    #[allow(dead_code)]
     inspect_kotlin_component_fn: Option<Symbol<'static, sig::InspectKotlinComponent>>,
 }
 
diff --git a/crates/eucalyptus-core/src/transform.rs b/crates/eucalyptus-core/src/transform.rs
index 1deeddf..567eecf 100644
--- a/crates/eucalyptus-core/src/transform.rs
+++ b/crates/eucalyptus-core/src/transform.rs
@@ -9,8 +9,8 @@ use crate::scripting::jni::utils::{FromJObject, ToJObject};
 use crate::scripting::native::DropbearNativeError;
 use crate::scripting::result::DropbearNativeResult;
 use crate::types::{NTransform, NVector3};
-use ::jni::{Env, jni_str, jni_sig};
 use ::jni::objects::{JObject, JValue};
+use ::jni::{Env, jni_sig, jni_str};
 use dropbear_engine::camera::Camera;
 use dropbear_engine::entity::{EntityTransform, Transform};
 use dropbear_engine::graphics::SharedGraphicsContext;
@@ -550,7 +550,11 @@ impl InspectableComponent for EntityTransform {
 impl FromJObject for Transform {
     fn from_jobject(env: &mut Env, obj: &JObject) -> DropbearNativeResult<Self> {
         let pos_val = env
-            .get_field(obj, jni_str!("position"), jni_sig!(com.dropbear.math.Vector3d))
+            .get_field(
+                obj,
+                jni_str!("position"),
+                jni_sig!(com.dropbear.math.Vector3d),
+            )
             .map_err(|_| DropbearNativeError::JNIFailedToGetField)?;
 
         let pos_obj = pos_val
@@ -558,7 +562,11 @@ impl FromJObject for Transform {
             .map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;
 
         let rot_val = env
-            .get_field(obj, jni_str!("rotation"), jni_sig!(com.dropbear.math.Quaterniond))
+            .get_field(
+                obj,
+                jni_str!("rotation"),
+                jni_sig!(com.dropbear.math.Quaterniond),
+            )
             .map_err(|_| DropbearNativeError::JNIFailedToGetField)?;
 
         let rot_obj = rot_val
@@ -600,10 +608,12 @@ impl FromJObject for Transform {
 
 impl ToJObject for Transform {
     fn to_jobject<'a>(&self, env: &mut Env<'a>) -> DropbearNativeResult<JObject<'a>> {
-        let cls = env.load_class(jni_str!("com/dropbear/math/Transform")).map_err(|e| {
-            eprintln!("Could not find Transform class: {:?}", e);
-            DropbearNativeError::JNIClassNotFound
-        })?;
+        let cls = env
+            .load_class(jni_str!("com/dropbear/math/Transform"))
+            .map_err(|e| {
+                eprintln!("Could not find Transform class: {:?}", e);
+                DropbearNativeError::JNIClassNotFound
+            })?;
 
         let p = self.position;
         let r = self.rotation;
@@ -625,7 +635,7 @@ impl ToJObject for Transform {
         let obj = env.new_object(cls, jni_sig!((double, double, double, double, double, double, double, double, double, double) -> void), &args).map_err(|e| {
             eprintln!("Failed to create Transform object: {:?}", e);
             DropbearNativeError::JNIFailedToCreateObject
-        })?;;
+        })?;
 
         Ok(obj)
     }
@@ -634,7 +644,11 @@ impl ToJObject for Transform {
 impl FromJObject for EntityTransform {
     fn from_jobject(env: &mut Env, obj: &JObject) -> DropbearNativeResult<Self> {
         let local_val = env
-            .get_field(obj, jni_str!("local"), jni_sig!(com.dropbear.math.Transform))
+            .get_field(
+                obj,
+                jni_str!("local"),
+                jni_sig!(com.dropbear.math.Transform),
+            )
             .map_err(|_| DropbearNativeError::JNIFailedToGetField)?;
 
         let local_obj = local_val
@@ -642,7 +656,11 @@ impl FromJObject for EntityTransform {
             .map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;
 
         let world_val = env
-            .get_field(obj, jni_str!("world"), jni_sig!(com.dropbear.math.Transform))
+            .get_field(
+                obj,
+                jni_str!("world"),
+                jni_sig!(com.dropbear.math.Transform),
+            )
             .map_err(|_| DropbearNativeError::JNIFailedToGetField)?;
 
         let world_obj = world_val
diff --git a/crates/eucalyptus-core/src/types.rs b/crates/eucalyptus-core/src/types.rs
index f95f412..f739920 100644
--- a/crates/eucalyptus-core/src/types.rs
+++ b/crates/eucalyptus-core/src/types.rs
@@ -6,9 +6,9 @@ use crate::scripting::result::DropbearNativeResult;
 use dropbear_engine::entity::Transform;
 use glam::{DQuat, DVec3, Vec3};
 use hecs::Entity;
-use jni::{Env, jni_str, jni_sig};
 use jni::objects::{JObject, JValue};
 use jni::sys::jdouble;
+use jni::{Env, jni_sig, jni_str};
 use rapier3d::data::Index;
 use rapier3d::parry::query::ShapeCastStatus;
 use rapier3d::prelude::ColliderHandle;
@@ -349,7 +349,11 @@ impl ToJObject for NVector4 {
         ];
 
         let obj = env
-            .new_object(&class, jni_sig!((double, double, double, double) -> void), &args)
+            .new_object(
+                &class,
+                jni_sig!((double, double, double, double) -> void),
+                &args,
+            )
             .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
 
         Ok(obj)
@@ -444,8 +448,12 @@ impl ToJObject for NQuaternion {
             JValue::Double(self.w),
         ];
 
-        env.new_object(&class, jni_sig!((double, double, double, double) -> void), &args)
-            .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)
+        env.new_object(
+            &class,
+            jni_sig!((double, double, double, double) -> void),
+            &args,
+        )
+        .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)
     }
 }
 
@@ -524,7 +532,11 @@ impl From<NTransform> for Transform {
 impl FromJObject for NTransform {
     fn from_jobject(env: &mut Env, obj: &JObject) -> DropbearNativeResult<Self> {
         let pos_val = env
-            .get_field(obj, jni_str!("position"), jni_sig!(com.dropbear.math.Vector3d))
+            .get_field(
+                obj,
+                jni_str!("position"),
+                jni_sig!(com.dropbear.math.Vector3d),
+            )
             .map_err(|_| DropbearNativeError::JNIFailedToGetField)?;
 
         let pos_obj = pos_val
@@ -532,7 +544,11 @@ impl FromJObject for NTransform {
             .map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;
 
         let rot_val = env
-            .get_field(obj, jni_str!("rotation"), jni_sig!(com.dropbear.math.Quaterniond))
+            .get_field(
+                obj,
+                jni_str!("rotation"),
+                jni_sig!(com.dropbear.math.Quaterniond),
+            )
             .map_err(|_| DropbearNativeError::JNIFailedToGetField)?;
 
         let rot_obj = rot_val
@@ -619,7 +635,11 @@ impl ToJObject for NCollider {
             .map_err(|_| DropbearNativeError::JNIClassNotFound)?;
 
         let entity_obj = env
-            .new_object(&entity_cls, jni_sig!((long) -> void), &[JValue::Long(self.entity_id as i64)])
+            .new_object(
+                &entity_cls,
+                jni_sig!((long) -> void),
+                &[JValue::Long(self.entity_id as i64)],
+            )
             .map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
 
         let index_obj = env
@@ -726,10 +746,12 @@ impl From<IndexNative> for Index {
 
 impl ToJObject for IndexNative {
     fn to_jobject<'a>(&self, env: &mut Env<'a>) -> DropbearNativeResult<JObject<'a>> {
-        let cls = env.load_class(jni_str!("com/dropbear/physics/Index")).map_err(|e| {
-            eprintln!("[JNI Error] Could not find Index class: {:?}", e);
-            DropbearNativeError::GenericError
-        })?;
+        let cls = env
+            .load_class(jni_str!("com/dropbear/physics/Index"))
+            .map_err(|e| {
+                eprintln!("[JNI Error] Could not find Index class: {:?}", e);
+                DropbearNativeError::GenericError
+            })?;
 
         let obj = env
             .new_object(
@@ -836,21 +858,25 @@ impl FromJObject for RigidBodyContext {
 
 impl ToJObject for RigidBodyContext {
     fn to_jobject<'a>(&self, env: &mut Env<'a>) -> DropbearNativeResult<JObject<'a>> {
-        let index_cls = env.load_class(jni_str!("com/dropbear/physics/Index")).map_err(|e| {
-            eprintln!(
-                "[JNI Error] Class 'com/dropbear/physics/Index' not found: {:?}",
-                e
-            );
-            DropbearNativeError::JNIClassNotFound
-        })?;
-
-        let entity_cls = env.load_class(jni_str!("com/dropbear/EntityId")).map_err(|e| {
-            eprintln!(
-                "[JNI Error] Class 'com/dropbear/EntityId' not found: {:?}",
-                e
-            );
-            DropbearNativeError::JNIClassNotFound
-        })?;
+        let index_cls = env
+            .load_class(jni_str!("com/dropbear/physics/Index"))
+            .map_err(|e| {
+                eprintln!(
+                    "[JNI Error] Class 'com/dropbear/physics/Index' not found: {:?}",
+                    e
+                );
+                DropbearNativeError::JNIClassNotFound
+            })?;
+
+        let entity_cls = env
+            .load_class(jni_str!("com/dropbear/EntityId"))
+            .map_err(|e| {
+                eprintln!(
+                    "[JNI Error] Class 'com/dropbear/EntityId' not found: {:?}",
+                    e
+                );
+                DropbearNativeError::JNIClassNotFound
+            })?;
 
         let rb_cls = env
             .load_class(jni_str!("com/dropbear/physics/RigidBody"))
@@ -877,7 +903,11 @@ impl ToJObject for RigidBodyContext {
             })?;
 
         let entity_obj = env
-            .new_object(&entity_cls, jni_sig!((long) -> void), &[JValue::Long(self.entity_id as i64)])
+            .new_object(
+                &entity_cls,
+                jni_sig!((long) -> void),
+                &[JValue::Long(self.entity_id as i64)],
+            )
             .map_err(|e| {
                 eprintln!("[JNI Error] Failed to create EntityId object: {:?}", e);
                 DropbearNativeError::JNIFailedToCreateObject
@@ -910,10 +940,12 @@ impl ToJObject for RayHit {
         let collider = self.collider.to_jobject(env)?;
         let distance = self.distance as jdouble;
 
-        let class = env.load_class(jni_str!("com/dropbear/physics/RayHit")).map_err(|e| {
-            eprintln!("[JNI Error] Failed to create RayHit object: {:?}", e);
-            DropbearNativeError::JNIClassNotFound
-        })?;
+        let class = env
+            .load_class(jni_str!("com/dropbear/physics/RayHit"))
+            .map_err(|e| {
+                eprintln!("[JNI Error] Failed to create RayHit object: {:?}", e);
+                DropbearNativeError::JNIClassNotFound
+            })?;
 
         let object = env
             .new_object(
diff --git a/crates/eucalyptus-core/src/utils.rs b/crates/eucalyptus-core/src/utils.rs
index f113544..ae66938 100644
--- a/crates/eucalyptus-core/src/utils.rs
+++ b/crates/eucalyptus-core/src/utils.rs
@@ -6,8 +6,8 @@ use crate::scripting::result::DropbearNativeResult;
 use crate::ser::model::{EucalyptusMaterial, EucalyptusMesh, EucalyptusModel};
 use crate::states::Node;
 use dropbear_engine::utils::ResourceReference;
-use jni::{Env, jni_str, jni_sig};
 use jni::objects::{JObject, JValue};
+use jni::{Env, jni_sig, jni_str};
 use std::collections::hash_map::DefaultHasher;
 use std::fs;
 use std::hash::{Hash, Hasher};
diff --git a/crates/eucalyptus-editor/src/about.rs b/crates/eucalyptus-editor/src/about.rs
index 414aeb5..4b562d6 100644
--- a/crates/eucalyptus-editor/src/about.rs
+++ b/crates/eucalyptus-editor/src/about.rs
@@ -44,7 +44,9 @@ impl Scene for AboutWindow {
         _dt: f32,
         graphics: std::sync::Arc<dropbear_engine::graphics::SharedGraphicsContext>,
     ) {
-        CentralPanel::default().show(&graphics.get_egui_context(), |ui| {
+        let mut ui = egui::Ui::new(graphics.get_egui_context(), egui::Id::new("about window ui"), egui::UiBuilder::default());
+        
+        CentralPanel::default().show_inside(&mut ui, |ui| {
             ui.vertical_centered(|ui| {
                 ui.add_space(8.0);
                 ui.heading("eucalyptus editor");
diff --git a/crates/eucalyptus-editor/src/debug/window.rs b/crates/eucalyptus-editor/src/debug/window.rs
index 1166df7..67fb478 100644
--- a/crates/eucalyptus-editor/src/debug/window.rs
+++ b/crates/eucalyptus-editor/src/debug/window.rs
@@ -47,7 +47,11 @@ impl Scene for DebugWindow {
         _dt: f32,
         graphics: std::sync::Arc<dropbear_engine::graphics::SharedGraphicsContext>,
     ) {
-        let mut ui = egui::Ui::new(graphics.get_egui_context(), egui::Id::from("egui ui for debug window"), UiBuilder::default());
+        let mut ui = egui::Ui::new(
+            graphics.get_egui_context(),
+            egui::Id::from("egui ui for debug window"),
+            UiBuilder::default(),
+        );
         CentralPanel::default().show_inside(&mut ui, |ui| {
             ui.label("Hello Debug Window!");
         });
diff --git a/crates/eucalyptus-editor/src/editor/mod.rs b/crates/eucalyptus-editor/src/editor/mod.rs
index b4c51e9..e36a90b 100644
--- a/crates/eucalyptus-editor/src/editor/mod.rs
+++ b/crates/eucalyptus-editor/src/editor/mod.rs
@@ -35,7 +35,7 @@ use dropbear_engine::{
     DropbearWindowBuilder, WindowData, camera::Camera, entity::Transform, future::FutureHandle,
     graphics::SharedGraphicsContext, scene::SceneCommand,
 };
-use egui::{self, Context, Ui};
+use egui::{self, Ui};
 use egui_dock::{DockArea, DockState, NodeIndex, Style};
 use eucalyptus_core::component::{ComponentRegistry, SerializedComponent};
 use eucalyptus_core::hierarchy::{Children, SceneHierarchy};
@@ -1464,9 +1464,9 @@ impl Editor {
         let mut open_flag = self.open_new_scene_window;
         let mut close_requested = false;
         if open_flag {
-            egui::Window::new("New Scene")
-                .open(&mut open_flag)
-                .show(&graphics.get_egui_context(), |ui| {
+            egui::Window::new("New Scene").open(&mut open_flag).show(
+                &graphics.get_egui_context(),
+                |ui| {
                     ui.vertical(|ui| {
                         ui.label("Name: ");
                         ui.text_edit_singleline(&mut self.new_scene_name);
@@ -1510,7 +1510,8 @@ impl Editor {
                             close_requested = true;
                         }
                     });
-                });
+                },
+            );
         }
 
         if close_requested {
diff --git a/crates/eucalyptus-editor/src/editor/scene.rs b/crates/eucalyptus-editor/src/editor/scene.rs
index bd441e0..fe06134 100644
--- a/crates/eucalyptus-editor/src/editor/scene.rs
+++ b/crates/eucalyptus-editor/src/editor/scene.rs
@@ -12,6 +12,7 @@ use dropbear_engine::{
     model::{DrawLight, DrawModel},
     scene::{Scene, SceneCommand},
 };
+use egui::UiBuilder;
 use eucalyptus_core::billboard::BillboardComponent;
 use eucalyptus_core::component::KotlinComponentDecl;
 use eucalyptus_core::entity_status::EntityStatus;
@@ -33,7 +34,6 @@ use std::{
     fs,
     path::{Path, PathBuf},
 };
-use egui::UiBuilder;
 use winit::event::{MouseScrollDelta, TouchPhase};
 use winit::{event::WindowEvent, event_loop::ActiveEventLoop, keyboard::KeyCode};
 
@@ -1495,7 +1495,11 @@ impl Editor {
         self.texture_id = Some(*graphics.texture_id.clone());
         self.window = Some(graphics.window.clone());
 
-        let mut ui = Ui::new(graphics.get_egui_context(), egui::Id::new("ui"), UiBuilder::default());
+        let mut ui = Ui::new(
+            graphics.get_egui_context(),
+            egui::Id::new("ui"),
+            UiBuilder::default(),
+        );
 
         self.show_ui(&mut ui, graphics.clone());
         eucalyptus_core::logging::render(&mut ui);
diff --git a/crates/eucalyptus-editor/src/editor/settings/editor.rs b/crates/eucalyptus-editor/src/editor/settings/editor.rs
index 96f0af4..5d6599b 100644
--- a/crates/eucalyptus-editor/src/editor/settings/editor.rs
+++ b/crates/eucalyptus-editor/src/editor/settings/editor.rs
@@ -5,7 +5,7 @@ use app_dirs2::AppDataType;
 use dropbear_engine::input::{Controller, Keyboard, Mouse};
 use dropbear_engine::multisampling::AntiAliasingMode;
 use dropbear_engine::scene::{Scene, SceneCommand};
-use egui::{CentralPanel, ComboBox, Id, Slider, SliderClamping};
+use egui::{CentralPanel, ComboBox, Id, Panel, Slider, SliderClamping};
 use egui_dock::DockState;
 use egui_ltreeview::{Action, NodeBuilder};
 use eucalyptus_core::input::InputState;
@@ -154,13 +154,15 @@ impl Scene for EditorSettingsWindow {
         _dt: f32,
         graphics: std::sync::Arc<dropbear_engine::graphics::SharedGraphicsContext>,
     ) {
-        CentralPanel::default().show(&graphics.get_egui_context(), |ui| {
+        let mut ui = egui::Ui::new(graphics.get_egui_context(), egui::Id::new("editor settings window ui"), egui::UiBuilder::default());
+
+        CentralPanel::default().show_inside(&mut ui, |ui| {
             let mut editor = EDITOR_SETTINGS.write();
 
-            egui::SidePanel::left("editor_settings_tree_panel")
+            Panel::left("editor_settings_tree_panel")
                 .resizable(true)
-                .default_width(200.0)
-                .width_range(150.0..=400.0)
+                .default_size(200.0)
+                .size_range(150.0..=400.0)
                 .show_inside(ui, |ui| {
                     egui::ScrollArea::vertical()
                         .auto_shrink([false; 2])
diff --git a/crates/eucalyptus-editor/src/editor/settings/project.rs b/crates/eucalyptus-editor/src/editor/settings/project.rs
index 148a9f5..33dbda3 100644
--- a/crates/eucalyptus-editor/src/editor/settings/project.rs
+++ b/crates/eucalyptus-editor/src/editor/settings/project.rs
@@ -60,13 +60,14 @@ impl Scene for ProjectSettingsWindow {
         _dt: f32,
         graphics: std::sync::Arc<dropbear_engine::graphics::SharedGraphicsContext>,
     ) {
-        CentralPanel::default().show(&graphics.get_egui_context(), |ui| {
+        let mut ui = egui::Ui::new(graphics.get_egui_context(), egui::Id::new("project settings window ui"), egui::UiBuilder::default());
+        CentralPanel::default().show_inside(&mut ui, |ui| {
             let mut project = PROJECT.write();
 
-            egui::SidePanel::left("project_settings_tree_panel")
+            egui::Panel::left("project_settings_tree_panel")
                 .resizable(true)
-                .default_width(200.0)
-                .width_range(150.0..=400.0)
+                .default_size(200.0)
+                .size_range(150.0..=400.0)
                 .show_inside(ui, |ui| {
                     egui::ScrollArea::vertical()
                         .auto_shrink([false; 2])
diff --git a/crates/eucalyptus-editor/src/menu.rs b/crates/eucalyptus-editor/src/menu.rs
index 59476a3..e36301c 100644
--- a/crates/eucalyptus-editor/src/menu.rs
+++ b/crates/eucalyptus-editor/src/menu.rs
@@ -302,8 +302,12 @@ impl Scene for MainMenu {
                 ProjectProgress::Done => {}
             }
         }
-        
-        let mut ui = egui::Ui::new(graphics.get_egui_context(), egui::Id::new("main menu ui"), UiBuilder::default());
+
+        let mut ui = egui::Ui::new(
+            graphics.get_egui_context(),
+            egui::Id::new("main menu ui"),
+            UiBuilder::default(),
+        );
 
         let screen_size: (f32, f32) = (
             graphics.window.inner_size().width as f32 - 100.0,
diff --git a/crates/eucalyptus-editor/src/stats.rs b/crates/eucalyptus-editor/src/stats.rs
index db96c4f..4f0dcea 100644
--- a/crates/eucalyptus-editor/src/stats.rs
+++ b/crates/eucalyptus-editor/src/stats.rs
@@ -314,7 +314,9 @@ impl NerdStats {
 
     /// Shows the egui window as a CentralPanel, typically used for another window.
     pub fn show_window(&mut self, ctx: &Context) {
-        egui::CentralPanel::default().show(ctx, |ui| {
+        let mut nerd_stats_ui = egui::Ui::new(ctx.clone(), egui::Id::new("nerd-stats ui"), egui::UiBuilder::default());
+
+        egui::CentralPanel::default().show_inside(&mut nerd_stats_ui, |ui| {
             self.content(ui);
         });
 
diff --git a/crates/redback-runtime/src/lib.rs b/crates/redback-runtime/src/lib.rs
index 765fb83..7cef9ba 100644
--- a/crates/redback-runtime/src/lib.rs
+++ b/crates/redback-runtime/src/lib.rs
@@ -29,7 +29,6 @@ use eucalyptus_core::states::{SCENES, Script, WorldLoadingStatus};
 use futures::executor;
 use glam::Mat4;
 use hecs::{Entity, World};
-use jni::objects::JValue;
 use kino_ui::KinoState;
 use kino_ui::rendering::KinoWGPURenderer;
 use kino_ui::windowing::KinoWinitWindowing;
@@ -378,7 +377,7 @@ impl PlayMode {
             ));
         }
 
-        self.kino = Some(KinoState::new(
+        self.kino = Some(kino_ui::KinoState::new(
             KinoWGPURenderer::new(
                 &graphics.device,
                 &graphics.queue,
diff --git a/crates/redback-runtime/src/scene.rs b/crates/redback-runtime/src/scene.rs
index 5577f3a..764b363 100644
--- a/crates/redback-runtime/src/scene.rs
+++ b/crates/redback-runtime/src/scene.rs
@@ -410,8 +410,10 @@ impl Scene for PlayMode {
             l.update(graphics.clone(), &self.world);
         }
 
+        let mut ui = egui::Ui::new(graphics.get_egui_context(), egui::Id::new("redback-runtime ui"), egui::UiBuilder::default());
+
         #[cfg(feature = "debug")]
-        egui::TopBottomPanel::top("menu_bar").show(&graphics.get_egui_context(), |ui| {
+        egui::Panel::top("menu_bar").show_inside(&mut ui, |ui| {
             egui::MenuBar::new().ui(ui, |ui| {
                 use crate::WindowMode;
                 ui.menu_button("Window", |ui| {
@@ -480,7 +482,7 @@ impl Scene for PlayMode {
             });
         });
 
-        CentralPanel::default().show(&graphics.get_egui_context(), |ui| {
+        CentralPanel::default().show_inside(&mut ui, |ui| {
             if let Some(p) = &self.scene_progress {
                 if !p.is_everything_loaded() && p.is_first_scene {
                     ui.centered_and_justified(|ui| {
diff --git a/docs/player_hud.kts b/docs/player_hud.kts
deleted file mode 100644
index a2add67..0000000
--- a/docs/player_hud.kts
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.dropbear.sample
-
-DynamicBoundingBox {
-    Circle {
-        name = "status_backing"
-
-        align {
-            horizontal = Alignment.Left + 10
-            vertical = Alignment.Centered
-        }
-
-        radius = 40.0
-
-        Image {
-            name = "status_image"
-
-            when (Player.playerState) {
-                PlayerState.Gas -> {
-                    resource = "euca://player/status/gas.png"
-                }
-                PlayerState.Solid -> {
-                    resource = "euca://player/status/solid.png"
-                }
-                PlayerState.Liquid -> {
-                    resource = "euca://player/status/liquid.png"
-                }
-            }
-
-            align = Align.default()
-        }
-    }
-
-    bar("health_bar", Align.Center + 20.0)
-
-    bar("energy_bar", Align.Center - 20.0)
-}
-
-bar(val objectName: String, align: Align = Align.default()): DynamicBoundingBox {
-    Rectangle {
-        name = objectName + " backing"
-
-        size = Vector2d(30.0, 10.0)
-
-        align = align
-
-        style {
-            fill = null
-            stroke = Stroke(
-                colour = Colour.BLACK,
-                width = 1.0
-            )
-        }
-    }
-
-    Rectangle {
-        name = objectName + " fill"
-
-        size = Vector2d(Player.health.percentage() * 30.0, 10.0)
-
-        align = align
-
-        style {
-            fill = Fill(
-                colour = when (Player.currentZone) {
-                    CurrentZone.Freezing -> Colour.DARK_BLUE
-                    CurrentZone.Cold -> Colour.LIGHT_BLUE
-                    CurrentZone.Normal -> Colour.LIGHT_GREY
-                    CurrentZone.Hot -> Colour.ORANGE
-                    CurrentZone.Boiling -> Colour.SCARLET_RED
-                }
-            )
-            stroke = null
-        }
-    }
-}
\ No newline at end of file
diff --git a/scripting/jvmMain/kotlin/com/dropbear/components/camera/OnRails.jvm.kt b/scripting/jvmMain/kotlin/com/dropbear/components/camera/OnRails.jvm.kt
new file mode 100644
index 0000000..267ae37
--- /dev/null
+++ b/scripting/jvmMain/kotlin/com/dropbear/components/camera/OnRails.jvm.kt
@@ -0,0 +1,77 @@
+package com.dropbear.components.camera
+
+import com.dropbear.DropbearEngine
+import com.dropbear.EntityId
+import com.dropbear.math.Vector3d
+import com.dropbear.math.Vector3f
+
+internal actual fun onRailsExistsForEntity(entityId: EntityId): Boolean =
+    OnRailsNative.existsForEntity(DropbearEngine.native.worldHandle, entityId.raw)
+
+internal actual fun OnRails.onRailsGetEnabled(): Boolean =
+    OnRailsNative.getEnabled(DropbearEngine.native.worldHandle, entity.raw)
+
+internal actual fun OnRails.onRailsSetEnabled(enabled: Boolean) =
+    OnRailsNative.setEnabled(DropbearEngine.native.worldHandle, entity.raw, enabled)
+
+internal actual fun OnRails.onRailsGetProgress(): Float =
+    OnRailsNative.getProgress(DropbearEngine.native.worldHandle, entity.raw)
+
+internal actual fun OnRails.onRailsSetProgress(progress: Float) =
+    OnRailsNative.setProgress(DropbearEngine.native.worldHandle, entity.raw, progress)
+
+internal actual fun OnRails.onRailsGetPath(): List<Vector3d> {
+    val world = DropbearEngine.native.worldHandle
+    val len = OnRailsNative.getPathLen(world, entity.raw)
+    return (0 until len).map { i -> OnRailsNative.getPathPoint(world, entity.raw, i) }
+}
+
+internal actual fun OnRails.onRailsSetPath(path: List<Vector3d>) {
+    val world = DropbearEngine.native.worldHandle
+    OnRailsNative.clearPath(world, entity.raw)
+    path.forEach { p -> OnRailsNative.pushPathPoint(world, entity.raw, p) }
+}
+
+internal actual fun OnRails.onRailsGetDrive(): RailDrive {
+    val world = DropbearEngine.native.worldHandle
+    val entityRaw = entity.raw
+    return when (OnRailsNative.getDriveType(world, entityRaw)) {
+        0 -> RailDrive.Automatic(
+            speed   = OnRailsNative.getDriveAutomaticSpeed(world, entityRaw),
+            looping = OnRailsNative.getDriveAutomaticLooping(world, entityRaw),
+        )
+        1 -> RailDrive.FollowEntity(
+            target    = EntityId(OnRailsNative.getDriveFollowEntityTarget(world, entityRaw)),
+            monotonic = OnRailsNative.getDriveFollowEntityMonotonic(world, entityRaw),
+        )
+        2 -> {
+            val axisD = OnRailsNative.getDriveAxisDrivenAxis(world, entityRaw)
+            RailDrive.AxisDriven(
+                target   = EntityId(OnRailsNative.getDriveAxisDrivenTarget(world, entityRaw)),
+                axis     = Vector3f(axisD.x.toFloat(), axisD.y.toFloat(), axisD.z.toFloat()),
+                rangeMin = OnRailsNative.getDriveAxisDrivenRangeMin(world, entityRaw),
+                rangeMax = OnRailsNative.getDriveAxisDrivenRangeMax(world, entityRaw),
+            )
+        }
+        else -> RailDrive.Manual
+    }
+}
+
+internal actual fun OnRails.onRailsSetDrive(drive: RailDrive) {
+    val world = DropbearEngine.native.worldHandle
+    val entityRaw = entity.raw
+    when (drive) {
+        is RailDrive.Automatic ->
+            OnRailsNative.setDriveAutomatic(world, entityRaw, drive.speed, drive.looping)
+        is RailDrive.FollowEntity ->
+            OnRailsNative.setDriveFollowEntity(world, entityRaw, drive.target.raw, drive.monotonic)
+        is RailDrive.AxisDriven ->
+            OnRailsNative.setDriveAxisDriven(
+                world, entityRaw, drive.target.raw,
+                Vector3d(drive.axis.x.toDouble(), drive.axis.y.toDouble(), drive.axis.z.toDouble()),
+                drive.rangeMin, drive.rangeMax,
+            )
+        is RailDrive.Manual ->
+            OnRailsNative.setDriveManual(world, entityRaw)
+    }
+}
diff --git a/scripting/jvmMain/kotlin/com/dropbear/scene/SceneSettings.jvm.kt b/scripting/jvmMain/kotlin/com/dropbear/scene/SceneSettings.jvm.kt
new file mode 100644
index 0000000..f3d0d9e
--- /dev/null
+++ b/scripting/jvmMain/kotlin/com/dropbear/scene/SceneSettings.jvm.kt
@@ -0,0 +1,33 @@
+package com.dropbear.scene
+
+actual fun SceneSettings.getPreload(): Boolean {
+    TODO("Not yet implemented")
+}
+
+actual fun SceneSettings.getHitboxState(): Boolean {
+    TODO("Not yet implemented")
+}
+
+actual fun SceneSettings.setHitboxState(value: Boolean) {
+}
+
+actual fun SceneSettings.getOverlayHUDState(): Boolean {
+    TODO("Not yet implemented")
+}
+
+actual fun SceneSettings.setOverlayHUDState(value: Boolean) {
+}
+
+actual fun SceneSettings.getOverlayBillboardState(): Boolean {
+    TODO("Not yet implemented")
+}
+
+actual fun SceneSettings.setOverlayBillboardState(value: Boolean) {
+}
+
+actual fun SceneSettings.getAmbientStrength(): Double {
+    TODO("Not yet implemented")
+}
+
+actual fun SceneSettings.setAmbientStrength(value: Double) {
+}
\ No newline at end of file
diff --git a/scripting/nativeMain/kotlin/com/dropbear/components/camera/OnRails.native.kt b/scripting/nativeMain/kotlin/com/dropbear/components/camera/OnRails.native.kt
new file mode 100644
index 0000000..f19836a
--- /dev/null
+++ b/scripting/nativeMain/kotlin/com/dropbear/components/camera/OnRails.native.kt
@@ -0,0 +1,123 @@
+@file:OptIn(ExperimentalForeignApi::class)
+
+package com.dropbear.components.camera
+
+import com.dropbear.DropbearEngine
+import com.dropbear.EntityId
+import com.dropbear.ffi.generated.*
+import com.dropbear.math.Vector3d
+import com.dropbear.math.Vector3f
+import kotlinx.cinterop.*
+
+internal actual fun onRailsExistsForEntity(entityId: EntityId): Boolean = memScoped {
+    val world = DropbearEngine.native.worldHandle ?: return@memScoped false
+    val out = alloc<BooleanVar>()
+    dropbear_transform_on_rails_exists_for_entity(world, entityId.raw.toULong(), out.ptr)
+    out.value
+}
+
+internal actual fun OnRails.onRailsGetEnabled(): Boolean = memScoped {
+    val world = DropbearEngine.native.worldHandle ?: return@memScoped false
+    val out = alloc<BooleanVar>()
+    dropbear_transform_on_rails_get_enabled(world, entity.raw.toULong(), out.ptr)
+    out.value
+}
+
+internal actual fun OnRails.onRailsSetEnabled(enabled: Boolean) = memScoped {
+    val world = DropbearEngine.native.worldHandle ?: return@memScoped
+    dropbear_transform_on_rails_set_enabled(world, entity.raw.toULong(), enabled)
+}
+
+internal actual fun OnRails.onRailsGetProgress(): Float = memScoped {
+    val world = DropbearEngine.native.worldHandle ?: return@memScoped 0f
+    val out = alloc<FloatVar>()
+    dropbear_transform_on_rails_get_progress(world, entity.raw.toULong(), out.ptr)
+    out.value
+}
+
+internal actual fun OnRails.onRailsSetProgress(progress: Float) = memScoped {
+    val world = DropbearEngine.native.worldHandle ?: return@memScoped
+    dropbear_transform_on_rails_set_progress(world, entity.raw.toULong(), progress)
+}
+
+internal actual fun OnRails.onRailsGetPath(): List<Vector3d> = memScoped {
+    val world = DropbearEngine.native.worldHandle ?: return@memScoped emptyList()
+    val lenOut = alloc<IntVar>()
+    val rc = dropbear_transform_on_rails_get_path_len(world, entity.raw.toULong(), lenOut.ptr)
+    if (rc != 0) return@memScoped emptyList()
+    val len = lenOut.value
+    (0 until len).mapNotNull { i ->
+        val out = alloc<NVector3>()
+        val rc2 = dropbear_transform_on_rails_get_path_point(world, entity.raw.toULong(), i, out.ptr)
+        if (rc2 != 0) null else Vector3d(out.x, out.y, out.z)
+    }
+}
+
+internal actual fun OnRails.onRailsSetPath(path: List<Vector3d>) = memScoped {
+    val world = DropbearEngine.native.worldHandle ?: return@memScoped
+    dropbear_transform_on_rails_clear_path(world, entity.raw.toULong())
+    for (point in path) {
+        val v = alloc<NVector3>()
+        v.x = point.x; v.y = point.y; v.z = point.z
+        dropbear_transform_on_rails_push_path_point(world, entity.raw.toULong(), v.ptr)
+    }
+}
+
+internal actual fun OnRails.onRailsGetDrive(): RailDrive = memScoped {
+    val world = DropbearEngine.native.worldHandle ?: return@memScoped RailDrive.Manual
+    val typeOut = alloc<IntVar>()
+    val rc = dropbear_transform_on_rails_get_drive_type(world, entity.raw.toULong(), typeOut.ptr)
+    if (rc != 0) return@memScoped RailDrive.Manual
+
+    when (typeOut.value) {
+        0 -> {
+            val speed = alloc<FloatVar>()
+            val looping = alloc<BooleanVar>()
+            dropbear_transform_on_rails_get_drive_automatic_speed(world, entity.raw.toULong(), speed.ptr)
+            dropbear_transform_on_rails_get_drive_automatic_looping(world, entity.raw.toULong(), looping.ptr)
+            RailDrive.Automatic(speed.value, looping.value)
+        }
+        1 -> {
+            val target = alloc<ULongVar>()
+            val monotonic = alloc<BooleanVar>()
+            dropbear_transform_on_rails_get_drive_follow_entity_target(world, entity.raw.toULong(), target.ptr)
+            dropbear_transform_on_rails_get_drive_follow_entity_monotonic(world, entity.raw.toULong(), monotonic.ptr)
+            RailDrive.FollowEntity(EntityId(target.value.toLong()), monotonic.value)
+        }
+        2 -> {
+            val target = alloc<ULongVar>()
+            val axis = alloc<NVector3>()
+            val rangeMin = alloc<FloatVar>()
+            val rangeMax = alloc<FloatVar>()
+            dropbear_transform_on_rails_get_drive_axis_driven_target(world, entity.raw.toULong(), target.ptr)
+            dropbear_transform_on_rails_get_drive_axis_driven_axis(world, entity.raw.toULong(), axis.ptr)
+            dropbear_transform_on_rails_get_drive_axis_driven_range_min(world, entity.raw.toULong(), rangeMin.ptr)
+            dropbear_transform_on_rails_get_drive_axis_driven_range_max(world, entity.raw.toULong(), rangeMax.ptr)
+            RailDrive.AxisDriven(
+                EntityId(target.value.toLong()),
+                Vector3f(axis.x.toFloat(), axis.y.toFloat(), axis.z.toFloat()),
+                rangeMin.value,
+                rangeMax.value,
+            )
+        }
+        else -> RailDrive.Manual
+    }
+}
+
+internal actual fun OnRails.onRailsSetDrive(drive: RailDrive) = memScoped {
+    val world = DropbearEngine.native.worldHandle ?: return@memScoped
+    val entityBits = entity.raw.toULong()
+    when (drive) {
+        is RailDrive.Automatic ->
+            dropbear_transform_on_rails_set_drive_automatic(world, entityBits, drive.speed, drive.looping)
+        is RailDrive.FollowEntity ->
+            dropbear_transform_on_rails_set_drive_follow_entity(world, entityBits, drive.target.raw.toULong(), drive.monotonic)
+        is RailDrive.AxisDriven -> {
+            val v = alloc<NVector3>()
+            v.x = drive.axis.x.toDouble(); v.y = drive.axis.y.toDouble(); v.z = drive.axis.z.toDouble()
+            dropbear_transform_on_rails_set_drive_axis_driven(world, entityBits, drive.target.raw.toULong(), v.ptr, drive.rangeMin, drive.rangeMax)
+        }
+        is RailDrive.Manual ->
+            dropbear_transform_on_rails_set_drive_manual(world, entityBits)
+    }
+}
diff --git a/scripting/nativeMain/kotlin/com/dropbear/scene/SceneSettings.native.kt b/scripting/nativeMain/kotlin/com/dropbear/scene/SceneSettings.native.kt
new file mode 100644
index 0000000..f3d0d9e
--- /dev/null
+++ b/scripting/nativeMain/kotlin/com/dropbear/scene/SceneSettings.native.kt
@@ -0,0 +1,33 @@
+package com.dropbear.scene
+
+actual fun SceneSettings.getPreload(): Boolean {
+    TODO("Not yet implemented")
+}
+
+actual fun SceneSettings.getHitboxState(): Boolean {
+    TODO("Not yet implemented")
+}
+
+actual fun SceneSettings.setHitboxState(value: Boolean) {
+}
+
+actual fun SceneSettings.getOverlayHUDState(): Boolean {
+    TODO("Not yet implemented")
+}
+
+actual fun SceneSettings.setOverlayHUDState(value: Boolean) {
+}
+
+actual fun SceneSettings.getOverlayBillboardState(): Boolean {
+    TODO("Not yet implemented")
+}
+
+actual fun SceneSettings.setOverlayBillboardState(value: Boolean) {
+}
+
+actual fun SceneSettings.getAmbientStrength(): Double {
+    TODO("Not yet implemented")
+}
+
+actual fun SceneSettings.setAmbientStrength(value: Double) {
+}
\ No newline at end of file
diff --git a/src/jvmMain/kotlin/com/dropbear/components/camera/OnRails.jvm.kt b/src/jvmMain/kotlin/com/dropbear/components/camera/OnRails.jvm.kt
deleted file mode 100644
index 267ae37..0000000
--- a/src/jvmMain/kotlin/com/dropbear/components/camera/OnRails.jvm.kt
+++ /dev/null
@@ -1,77 +0,0 @@
-package com.dropbear.components.camera
-
-import com.dropbear.DropbearEngine
-import com.dropbear.EntityId
-import com.dropbear.math.Vector3d
-import com.dropbear.math.Vector3f
-
-internal actual fun onRailsExistsForEntity(entityId: EntityId): Boolean =
-    OnRailsNative.existsForEntity(DropbearEngine.native.worldHandle, entityId.raw)
-
-internal actual fun OnRails.onRailsGetEnabled(): Boolean =
-    OnRailsNative.getEnabled(DropbearEngine.native.worldHandle, entity.raw)
-
-internal actual fun OnRails.onRailsSetEnabled(enabled: Boolean) =
-    OnRailsNative.setEnabled(DropbearEngine.native.worldHandle, entity.raw, enabled)
-
-internal actual fun OnRails.onRailsGetProgress(): Float =
-    OnRailsNative.getProgress(DropbearEngine.native.worldHandle, entity.raw)
-
-internal actual fun OnRails.onRailsSetProgress(progress: Float) =
-    OnRailsNative.setProgress(DropbearEngine.native.worldHandle, entity.raw, progress)
-
-internal actual fun OnRails.onRailsGetPath(): List<Vector3d> {
-    val world = DropbearEngine.native.worldHandle
-    val len = OnRailsNative.getPathLen(world, entity.raw)
-    return (0 until len).map { i -> OnRailsNative.getPathPoint(world, entity.raw, i) }
-}
-
-internal actual fun OnRails.onRailsSetPath(path: List<Vector3d>) {
-    val world = DropbearEngine.native.worldHandle
-    OnRailsNative.clearPath(world, entity.raw)
-    path.forEach { p -> OnRailsNative.pushPathPoint(world, entity.raw, p) }
-}
-
-internal actual fun OnRails.onRailsGetDrive(): RailDrive {
-    val world = DropbearEngine.native.worldHandle
-    val entityRaw = entity.raw
-    return when (OnRailsNative.getDriveType(world, entityRaw)) {
-        0 -> RailDrive.Automatic(
-            speed   = OnRailsNative.getDriveAutomaticSpeed(world, entityRaw),
-            looping = OnRailsNative.getDriveAutomaticLooping(world, entityRaw),
-        )
-        1 -> RailDrive.FollowEntity(
-            target    = EntityId(OnRailsNative.getDriveFollowEntityTarget(world, entityRaw)),
-            monotonic = OnRailsNative.getDriveFollowEntityMonotonic(world, entityRaw),
-        )
-        2 -> {
-            val axisD = OnRailsNative.getDriveAxisDrivenAxis(world, entityRaw)
-            RailDrive.AxisDriven(
-                target   = EntityId(OnRailsNative.getDriveAxisDrivenTarget(world, entityRaw)),
-                axis     = Vector3f(axisD.x.toFloat(), axisD.y.toFloat(), axisD.z.toFloat()),
-                rangeMin = OnRailsNative.getDriveAxisDrivenRangeMin(world, entityRaw),
-                rangeMax = OnRailsNative.getDriveAxisDrivenRangeMax(world, entityRaw),
-            )
-        }
-        else -> RailDrive.Manual
-    }
-}
-
-internal actual fun OnRails.onRailsSetDrive(drive: RailDrive) {
-    val world = DropbearEngine.native.worldHandle
-    val entityRaw = entity.raw
-    when (drive) {
-        is RailDrive.Automatic ->
-            OnRailsNative.setDriveAutomatic(world, entityRaw, drive.speed, drive.looping)
-        is RailDrive.FollowEntity ->
-            OnRailsNative.setDriveFollowEntity(world, entityRaw, drive.target.raw, drive.monotonic)
-        is RailDrive.AxisDriven ->
-            OnRailsNative.setDriveAxisDriven(
-                world, entityRaw, drive.target.raw,
-                Vector3d(drive.axis.x.toDouble(), drive.axis.y.toDouble(), drive.axis.z.toDouble()),
-                drive.rangeMin, drive.rangeMax,
-            )
-        is RailDrive.Manual ->
-            OnRailsNative.setDriveManual(world, entityRaw)
-    }
-}
diff --git a/src/jvmMain/kotlin/com/dropbear/scene/SceneManager.jvm.kt b/src/jvmMain/kotlin/com/dropbear/scene/SceneManager.jvm.kt
deleted file mode 100644
index 7ab1b79..0000000
--- a/src/jvmMain/kotlin/com/dropbear/scene/SceneManager.jvm.kt
+++ /dev/null
@@ -1,2 +0,0 @@
-package com.dropbear.scene
-
diff --git a/src/jvmMain/kotlin/com/dropbear/scene/SceneSettings.jvm.kt b/src/jvmMain/kotlin/com/dropbear/scene/SceneSettings.jvm.kt
deleted file mode 100644
index 5d94704..0000000
--- a/src/jvmMain/kotlin/com/dropbear/scene/SceneSettings.jvm.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.dropbear.scene
-
-actual fun com.dropbear.scene.SceneSettings.getPreload(): Boolean {
-    TODO("Not yet implemented")
-}
-
-actual fun SceneSettings.getHitboxState(): Boolean {
-    TODO("Not yet implemented")
-}
-
-actual fun SceneSettings.setHitboxState(value: Boolean) {
-}
-
-actual fun SceneSettings.getOverlayHUDState(): Boolean {
-    TODO("Not yet implemented")
-}
-
-actual fun SceneSettings.setOverlayHUDState(value: Boolean) {
-}
-
-actual fun SceneSettings.getOverlayBillboardState(): Boolean {
-    TODO("Not yet implemented")
-}
-
-actual fun SceneSettings.setOverlayBillboardState(value: Boolean) {
-}
-
-actual fun SceneSettings.getAmbientStrength(): Double {
-    TODO("Not yet implemented")
-}
-
-actual fun SceneSettings.setAmbientStrength(value: Double) {
-}
\ No newline at end of file
diff --git a/src/nativeMain/kotlin/com/dropbear/components/camera/OnRails.native.kt b/src/nativeMain/kotlin/com/dropbear/components/camera/OnRails.native.kt
deleted file mode 100644
index f19836a..0000000
--- a/src/nativeMain/kotlin/com/dropbear/components/camera/OnRails.native.kt
+++ /dev/null
@@ -1,123 +0,0 @@
-@file:OptIn(ExperimentalForeignApi::class)
-
-package com.dropbear.components.camera
-
-import com.dropbear.DropbearEngine
-import com.dropbear.EntityId
-import com.dropbear.ffi.generated.*
-import com.dropbear.math.Vector3d
-import com.dropbear.math.Vector3f
-import kotlinx.cinterop.*
-
-internal actual fun onRailsExistsForEntity(entityId: EntityId): Boolean = memScoped {
-    val world = DropbearEngine.native.worldHandle ?: return@memScoped false
-    val out = alloc<BooleanVar>()
-    dropbear_transform_on_rails_exists_for_entity(world, entityId.raw.toULong(), out.ptr)
-    out.value
-}
-
-internal actual fun OnRails.onRailsGetEnabled(): Boolean = memScoped {
-    val world = DropbearEngine.native.worldHandle ?: return@memScoped false
-    val out = alloc<BooleanVar>()
-    dropbear_transform_on_rails_get_enabled(world, entity.raw.toULong(), out.ptr)
-    out.value
-}
-
-internal actual fun OnRails.onRailsSetEnabled(enabled: Boolean) = memScoped {
-    val world = DropbearEngine.native.worldHandle ?: return@memScoped
-    dropbear_transform_on_rails_set_enabled(world, entity.raw.toULong(), enabled)
-}
-
-internal actual fun OnRails.onRailsGetProgress(): Float = memScoped {
-    val world = DropbearEngine.native.worldHandle ?: return@memScoped 0f
-    val out = alloc<FloatVar>()
-    dropbear_transform_on_rails_get_progress(world, entity.raw.toULong(), out.ptr)
-    out.value
-}
-
-internal actual fun OnRails.onRailsSetProgress(progress: Float) = memScoped {
-    val world = DropbearEngine.native.worldHandle ?: return@memScoped
-    dropbear_transform_on_rails_set_progress(world, entity.raw.toULong(), progress)
-}
-
-internal actual fun OnRails.onRailsGetPath(): List<Vector3d> = memScoped {
-    val world = DropbearEngine.native.worldHandle ?: return@memScoped emptyList()
-    val lenOut = alloc<IntVar>()
-    val rc = dropbear_transform_on_rails_get_path_len(world, entity.raw.toULong(), lenOut.ptr)
-    if (rc != 0) return@memScoped emptyList()
-    val len = lenOut.value
-    (0 until len).mapNotNull { i ->
-        val out = alloc<NVector3>()
-        val rc2 = dropbear_transform_on_rails_get_path_point(world, entity.raw.toULong(), i, out.ptr)
-        if (rc2 != 0) null else Vector3d(out.x, out.y, out.z)
-    }
-}
-
-internal actual fun OnRails.onRailsSetPath(path: List<Vector3d>) = memScoped {
-    val world = DropbearEngine.native.worldHandle ?: return@memScoped
-    dropbear_transform_on_rails_clear_path(world, entity.raw.toULong())
-    for (point in path) {
-        val v = alloc<NVector3>()
-        v.x = point.x; v.y = point.y; v.z = point.z
-        dropbear_transform_on_rails_push_path_point(world, entity.raw.toULong(), v.ptr)
-    }
-}
-
-internal actual fun OnRails.onRailsGetDrive(): RailDrive = memScoped {
-    val world = DropbearEngine.native.worldHandle ?: return@memScoped RailDrive.Manual
-    val typeOut = alloc<IntVar>()
-    val rc = dropbear_transform_on_rails_get_drive_type(world, entity.raw.toULong(), typeOut.ptr)
-    if (rc != 0) return@memScoped RailDrive.Manual
-
-    when (typeOut.value) {
-        0 -> {
-            val speed = alloc<FloatVar>()
-            val looping = alloc<BooleanVar>()
-            dropbear_transform_on_rails_get_drive_automatic_speed(world, entity.raw.toULong(), speed.ptr)
-            dropbear_transform_on_rails_get_drive_automatic_looping(world, entity.raw.toULong(), looping.ptr)
-            RailDrive.Automatic(speed.value, looping.value)
-        }
-        1 -> {
-            val target = alloc<ULongVar>()
-            val monotonic = alloc<BooleanVar>()
-            dropbear_transform_on_rails_get_drive_follow_entity_target(world, entity.raw.toULong(), target.ptr)
-            dropbear_transform_on_rails_get_drive_follow_entity_monotonic(world, entity.raw.toULong(), monotonic.ptr)
-            RailDrive.FollowEntity(EntityId(target.value.toLong()), monotonic.value)
-        }
-        2 -> {
-            val target = alloc<ULongVar>()
-            val axis = alloc<NVector3>()
-            val rangeMin = alloc<FloatVar>()
-            val rangeMax = alloc<FloatVar>()
-            dropbear_transform_on_rails_get_drive_axis_driven_target(world, entity.raw.toULong(), target.ptr)
-            dropbear_transform_on_rails_get_drive_axis_driven_axis(world, entity.raw.toULong(), axis.ptr)
-            dropbear_transform_on_rails_get_drive_axis_driven_range_min(world, entity.raw.toULong(), rangeMin.ptr)
-            dropbear_transform_on_rails_get_drive_axis_driven_range_max(world, entity.raw.toULong(), rangeMax.ptr)
-            RailDrive.AxisDriven(
-                EntityId(target.value.toLong()),
-                Vector3f(axis.x.toFloat(), axis.y.toFloat(), axis.z.toFloat()),
-                rangeMin.value,
-                rangeMax.value,
-            )
-        }
-        else -> RailDrive.Manual
-    }
-}
-
-internal actual fun OnRails.onRailsSetDrive(drive: RailDrive) = memScoped {
-    val world = DropbearEngine.native.worldHandle ?: return@memScoped
-    val entityBits = entity.raw.toULong()
-    when (drive) {
-        is RailDrive.Automatic ->
-            dropbear_transform_on_rails_set_drive_automatic(world, entityBits, drive.speed, drive.looping)
-        is RailDrive.FollowEntity ->
-            dropbear_transform_on_rails_set_drive_follow_entity(world, entityBits, drive.target.raw.toULong(), drive.monotonic)
-        is RailDrive.AxisDriven -> {
-            val v = alloc<NVector3>()
-            v.x = drive.axis.x.toDouble(); v.y = drive.axis.y.toDouble(); v.z = drive.axis.z.toDouble()
-            dropbear_transform_on_rails_set_drive_axis_driven(world, entityBits, drive.target.raw.toULong(), v.ptr, drive.rangeMin, drive.rangeMax)
-        }
-        is RailDrive.Manual ->
-            dropbear_transform_on_rails_set_drive_manual(world, entityBits)
-    }
-}
diff --git a/src/nativeMain/kotlin/com/dropbear/scene/SceneManager.native.kt b/src/nativeMain/kotlin/com/dropbear/scene/SceneManager.native.kt
deleted file mode 100644
index 4eabbce..0000000
--- a/src/nativeMain/kotlin/com/dropbear/scene/SceneManager.native.kt
+++ /dev/null
@@ -1 +0,0 @@
-package com.dropbear.scene
\ No newline at end of file
diff --git a/src/nativeMain/kotlin/com/dropbear/scene/SceneSettings.native.kt b/src/nativeMain/kotlin/com/dropbear/scene/SceneSettings.native.kt
deleted file mode 100644
index 5d94704..0000000
--- a/src/nativeMain/kotlin/com/dropbear/scene/SceneSettings.native.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.dropbear.scene
-
-actual fun com.dropbear.scene.SceneSettings.getPreload(): Boolean {
-    TODO("Not yet implemented")
-}
-
-actual fun SceneSettings.getHitboxState(): Boolean {
-    TODO("Not yet implemented")
-}
-
-actual fun SceneSettings.setHitboxState(value: Boolean) {
-}
-
-actual fun SceneSettings.getOverlayHUDState(): Boolean {
-    TODO("Not yet implemented")
-}
-
-actual fun SceneSettings.setOverlayHUDState(value: Boolean) {
-}
-
-actual fun SceneSettings.getOverlayBillboardState(): Boolean {
-    TODO("Not yet implemented")
-}
-
-actual fun SceneSettings.setOverlayBillboardState(value: Boolean) {
-}
-
-actual fun SceneSettings.getAmbientStrength(): Double {
-    TODO("Not yet implemented")
-}
-
-actual fun SceneSettings.setAmbientStrength(value: Double) {
-}
\ No newline at end of file