kitgit

tirbofish/dropbear · commit

5e7c2afbabf5fd8e8c22d9ba3731a72e1d82fea9

refactor: changed from `pub fn Java_*` to `pub extern "system" fn Java_*` ci: the rfd crate has a dependency (`ashpd`) that caused a bug while compiling. changed rfd version. chore: updated *most* of the dependencies. wgpu is still at v27 due to egui requiring the dependency. refactor: due to bincode not being updated and the devs basically nuking the entire project, i have to switch to `postcard`. refactor + chore: update rapier3d to the latest version (0.32). refactor: update hecs to the latest version and reflect the new update onto the codebase refactor: remove the old legacy scripting modules opt: optimised incremental builds

Unverified

Thribhu K <4tkbytes@pm.me> · 2026-01-11 09:24

view full diff

diff --git a/.cargo/.config.toml b/.cargo/.config.toml
index 8d15538..a001a2b 100644
--- a/.cargo/.config.toml
+++ b/.cargo/.config.toml
@@ -1,2 +1,8 @@
-[target.x86_64-pc-windows-msvc]
-rustflags = ["-C", "target-feature=+crt-static", "-C", "prefer-dynamic"]
\ No newline at end of file
+[target.'cfg(target_os = "windows")']
+rustflags = ["-C", "target-feature=+crt-static", "-C", "prefer-dynamic", "-C", "link-arg=-fuse-ld=lld"]
+
+[target.'cfg(target_os = "macos")']
+rustflags = ["-C", "link-arg=-fuse-ld=/opt/homebrew/bin/zld"]
+
+[target.'cfg(target_os = "linux")']
+rustflags = ["-C", "link-arg=-fuse-ld=mold"]
\ No newline at end of file
diff --git a/.github/workflows/create_executable.yaml b/.github/workflows/create_executable.yaml
index 24c48a6..6641cdb 100644
--- a/.github/workflows/create_executable.yaml
+++ b/.github/workflows/create_executable.yaml
@@ -49,15 +49,23 @@ jobs:
       - name: install assimp-utils (Linux)
         if: matrix.os == 'ubuntu-latest'
         run: sudo apt-get install -y assimp-utils
+      - name: install mold linker (Linux)
+        if: matrix.os == 'ubuntu-latest'
+        run: |
+          sudo apt-get install -y mold
+          clang --version || sudo apt-get install -y clang
       - name: install assimp (macOS)
         if: matrix.os == 'macos-latest'
         run: brew install assimp
+      - name: install zld linker (macOS)
+        if: matrix.os == 'macos-latest'
+        run: brew install zld
       - name: install rust toolchain
         uses: dtolnay/rust-toolchain@stable
         with:
           targets: ${{ matrix.target }}
       - name: build eucalyptus packages
-      # run: cargo build --release --package eucalyptus-core --package eucalyptus-editor --package magna-carta --package redback-runtime --target ${{ matrix.target }}
+        # run: cargo build --release --package eucalyptus-core --package eucalyptus-editor --package magna-carta --package redback-runtime --target ${{ matrix.target }}
         run: cargo build --release --package eucalyptus-core --package eucalyptus-editor --package magna-carta --target ${{ matrix.target }}
       - name: prepare the artifact
         run: |
@@ -77,4 +85,4 @@ jobs:
         uses: actions/upload-artifact@v4
         with:
           name: executables-${{ matrix.os_name }}
-          path: dist/
+          path: dist/
\ No newline at end of file
diff --git a/Cargo.toml b/Cargo.toml
index 299d5a4..d59eeca 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -22,8 +22,7 @@ members = [
 anyhow = { version = "1.0", features = ["backtrace"] }
 app_dirs2 = "2.5"
 arboard = "3.6"
-bincode = { version = "2.0", features = ["serde"] }
-bytemuck = { version = "1.23", features = ["derive"] }
+bytemuck = { version = "1.24", features = ["derive"] }
 chrono = "0.4"
 clap = { version = "4.5", features = ["derive"] }
 colored = "3.0"
@@ -41,21 +40,21 @@ futures = "0.3"
 gilrs = "0.11"
 git2 = { version = "0.20", features = ["vendored-openssl"] }
 glam = { version = "0.30", features = ["serde", "mint"] }
-hecs = { version = "0.10", features = ["serde"] }
+hecs = { version = "0.11", features = ["serde"] }
 log = "0.4"
 log-once = "0.4"
 model_to_image = "0.1"
 once_cell = "1.21"
 parking_lot = {version = "0.12", features = ["deadlock_detection"] }
-rfd = "0.15"
-ron = "0.11"
+rfd = "0.17"
+ron = "0.12"
 serde = { version = "1.0", features = ["derive"] }
 spin_sleep = "1.3"
 transform-gizmo-egui = { version = "0.8" }
 tokio = { version = "1", features = ["full"] }
 wgpu = "27"
 winit = { version = "0.30", features = [] }
-zip = "6.0"
+zip = "7.0"
 walkdir = "2.5"
 rayon = "1.11"
 backtrace = "0.3"
@@ -65,10 +64,10 @@ rustc_version_runtime = "0.3"
 jni = { version = "0.21", features = ["invocation"] }
 tree-sitter = "0.22" # must be kept as 0.22 because tree-sitter-kotlin has not been updated
 tree-sitter-kotlin = "0.3"
-libloading = "0.8"
+libloading = "0.9"
 indexmap = "2.11"
 sha2 = "0.10"
-wesl = "0.2"
+wesl = "0.3"
 dashmap = "6.1"
 open = "5.3"
 egui_plot = "0.34"
@@ -79,8 +78,9 @@ quote = "1.0"
 egui_ltreeview = { version = "0.6", features = ["doc"] }
 dyn-hash = "1.0"
 semver = { version = "1.0", features = ["serde"] }
-rapier3d = { version = "0.31", features = [ "simd-stable", "serde-serialize" ] }
+rapier3d = { version = "0.32", features = [ "simd-stable", "serde-serialize" ] }
 cbindgen = { version = "0.29.2" }
+postcard = { version = "1.1"}
 
 [workspace.dependencies.image]
 version = "0.25"
@@ -88,9 +88,9 @@ default-features = false
 features = ["png"]
 
 [profile.dev]
-opt-level = 3
+opt-level = 1
 debug = true
-codegen-units = 16
+codegen-units = 256
 incremental = true
 lto = false
 
diff --git a/README.md b/README.md
index 8a90760..b5c3cfc 100644
--- a/README.md
+++ b/README.md
@@ -25,12 +25,24 @@ If you might have not realised, all the crates/projects names are after Australi
 
 ## Build
 
-To build, ensure build requirements, clone the repository, then build it. It will build in debug mode, and use a lot of packages, so if your CPU is not fast enough for building you should brew a cup of coffee during the build time or scroll through Instagram Reels (you could get a nice doomscroll in).
+<details>
+<summary>Windows</summary>
 
-With Unix systems (macOS not tested), you will have to download a couple of dependencies if building locally:
+Required dependencies: 
+- JDK 21
+- assimp is automatically dealt with during build
+- the latest rustc
+- windows sdk/visual studio of some sort
 
-<!-- If you have a macOS system, please create a PR and add your own implementation. I know you need to use brew, but I don't know what dependencies to install.  -->
+yeah thats about it
 
+</details>
+
+<details>
+
+<summary>Linux</summary>
+
+With Unix systems (macOS not tested), you will have to download a couple of dependencies if building locally:
 
 ```bash
 # ubuntu
@@ -41,6 +53,21 @@ sudo pacman -Syu base-devel systemd pkgconf openssl clang cmake meson assimp jdk
 
 ```
 
+</details>
+
+<details>
+
+<summary>macOS</summary>
+
+If you have a macOS system, please create a PR and add your own implementation. I am unfortunately broke
+and do not own any sort of macOS system. 
+
+</details>
+
+To build, ensure build requirements, clone the repository, then build it. It will build in debug mode, and use a lot 
+of packages, so if your CPU is not fast enough for building you should brew a cup of coffee during the build time or 
+scroll through Instagram Reels. (you could get a nice doomscroll in.)
+
 Then run this to build the project
 
 ```bash
diff --git a/dropbear-engine/Cargo.toml b/dropbear-engine/Cargo.toml
index 59bfe8c..2c060fa 100644
--- a/dropbear-engine/Cargo.toml
+++ b/dropbear-engine/Cargo.toml
@@ -17,7 +17,6 @@ dropbear-macro = { path = "../dropbear-macro" }
 anyhow.workspace = true
 app_dirs2.workspace = true
 bytemuck.workspace = true
-bincode.workspace = true
 chrono.workspace = true
 colored.workspace = true
 egui-wgpu.workspace = true
@@ -43,6 +42,7 @@ rustc_version_runtime.workspace = true
 ron.workspace = true
 dashmap.workspace = true
 typetag.workspace = true
+postcard.workspace = true
 
 [target.'cfg(not(target_os = "android"))'.dependencies]
 rfd.workspace = true
diff --git a/dropbear-engine/src/lighting.rs b/dropbear-engine/src/lighting.rs
index bc4c1ee..a9e3be9 100644
--- a/dropbear-engine/src/lighting.rs
+++ b/dropbear-engine/src/lighting.rs
@@ -12,6 +12,7 @@ use dropbear_traits::SerializableComponent;
 use glam::{DMat4, DQuat, DVec3};
 use std::fmt::{Display, Formatter};
 use std::sync::Arc;
+use hecs::Entity;
 use wgpu::{BindGroup, BindGroupLayout, Buffer, BufferAddress, CompareFunction, DepthBiasState, RenderPipeline, StencilState, VertexBufferLayout, FilterMode};
 
 pub const MAX_LIGHTS: usize = 8;
@@ -678,7 +679,7 @@ impl LightManager {
 
         let mut shadow_map_index = 0;
 
-        for (_, (light_component, s_trans, e_trans, light)) in world
+        for (light_component, s_trans, e_trans, light) in world
             .query::<(&LightComponent, Option<&Transform>, Option<&EntityTransform>, &mut Light)>()
             .iter()
         {
diff --git a/dropbear-engine/src/utils.rs b/dropbear-engine/src/utils.rs
index 3bd5cb6..1bcc759 100644
--- a/dropbear-engine/src/utils.rs
+++ b/dropbear-engine/src/utils.rs
@@ -86,7 +86,7 @@ pub fn relative_path_from_euca<'a>(uri: &'a str) -> anyhow::Result<&'a str> {
 /// assert_eq!(resource_ref.as_path().unwrap(), "models/cube.obj");
 /// ```
 #[derive(
-    Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, bincode::Decode, bincode::Encode,
+    Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize
 )]
 pub enum ResourceReferenceType {
     /// The default type; Specifies there being no resource reference type.
@@ -116,7 +116,7 @@ pub enum ResourceReferenceType {
 }
 
 #[derive(
-    Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, bincode::Decode, bincode::Encode,
+    Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize
 )]
 pub enum TextureWrapMode {
     Repeat,
diff --git a/dropbear-traits/src/lib.rs b/dropbear-traits/src/lib.rs
index a05f2ed..c5a62b3 100644
--- a/dropbear-traits/src/lib.rs
+++ b/dropbear-traits/src/lib.rs
@@ -95,8 +95,7 @@ impl<T: SerializableComponent + hecs::Component + Clone + 'static> ComponentConv
         world: &World,
         entity: Entity,
     ) -> Option<Box<dyn SerializableComponent>> {
-        if let Ok(mut q) = world.query_one::<&T>(entity)
-            && let Some(ty) = q.get()
+        if let Ok(ty) = world.query_one::<&T>(entity).get()
         {
             return Some(ty.clone_boxed());
         }
diff --git a/dropbear-traits/src/registry.rs b/dropbear-traits/src/registry.rs
index eafb008..5508a29 100644
--- a/dropbear-traits/src/registry.rs
+++ b/dropbear-traits/src/registry.rs
@@ -327,7 +327,7 @@ impl ComponentRegistry {
         component_id: u64,
     ) -> Vec<(Entity, Box<dyn SerializableComponent>)> {
         let mut matches = Vec::new();
-        for (entity, ()) in world.query::<()>().iter() {
+        for entity in world.query::<Entity>().iter() {
             if let Some(component) =
                 self.extract_component_by_numeric_id(world, entity, component_id)
             {
diff --git a/eucalyptus-core/Cargo.toml b/eucalyptus-core/Cargo.toml
index 47b3bcd..b45ebbb 100644
--- a/eucalyptus-core/Cargo.toml
+++ b/eucalyptus-core/Cargo.toml
@@ -15,7 +15,7 @@ dropbear-macro = { path = "../dropbear-macro" }
 magna-carta = { path = "../magna-carta" }
 
 anyhow.workspace = true
-bincode.workspace = true
+postcard.workspace = true
 chrono.workspace = true
 dropbear-engine.workspace = true
 egui-toast.workspace = true
diff --git a/eucalyptus-core/src/asset.rs b/eucalyptus-core/src/asset.rs
index fa00e93..c2d52a4 100644
--- a/eucalyptus-core/src/asset.rs
+++ b/eucalyptus-core/src/asset.rs
@@ -33,7 +33,7 @@ pub mod jni {
     use crate::convert_ptr;
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_asset_AssetHandleNative_isModelHandle(
+    pub extern "system" fn Java_com_dropbear_asset_AssetHandleNative_isModelHandle(
         _env: JNIEnv,
         _class: JClass,
         asset_registry_ptr: jlong,
@@ -50,7 +50,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_asset_AssetHandleNative_isTextureHandle(
+    pub extern "system" fn Java_com_dropbear_asset_AssetHandleNative_isTextureHandle(
         _env: JNIEnv,
         _class: JClass,
         asset_registry_ptr: jlong,
diff --git a/eucalyptus-core/src/asset/texture.rs b/eucalyptus-core/src/asset/texture.rs
index 51c2693..0acc2e9 100644
--- a/eucalyptus-core/src/asset/texture.rs
+++ b/eucalyptus-core/src/asset/texture.rs
@@ -25,7 +25,7 @@ pub mod jni {
     use crate::scripting::native::DropbearNativeError;
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_asset_TextureHandleNative_getTextureName(
+    pub extern "system" fn Java_com_dropbear_asset_TextureHandleNative_getTextureName(
         env: JNIEnv,
         _class: JClass,
         asset_registry_ptr: jlong,
diff --git a/eucalyptus-core/src/camera.rs b/eucalyptus-core/src/camera.rs
index 94c71d5..a333a40 100644
--- a/eucalyptus-core/src/camera.rs
+++ b/eucalyptus-core/src/camera.rs
@@ -138,7 +138,7 @@ pub mod jni {
     use crate::types::Vector3;
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_cameraExistsForEntity(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_cameraExistsForEntity(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -154,7 +154,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_getCameraEye(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_getCameraEye(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -175,7 +175,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_setCameraEye(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_setCameraEye(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -200,7 +200,7 @@ pub mod jni {
 
     // TARGET
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_getCameraTarget(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_getCameraTarget(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -221,7 +221,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_setCameraTarget(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_setCameraTarget(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -240,7 +240,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_getCameraUp(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_getCameraUp(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -261,7 +261,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_setCameraUp(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_setCameraUp(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -280,7 +280,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_getCameraAspect(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_getCameraAspect(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -296,7 +296,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_getCameraFovY(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_getCameraFovY(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -312,7 +312,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_setCameraFovY(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_setCameraFovY(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -327,7 +327,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_getCameraZNear(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_getCameraZNear(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -343,7 +343,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_setCameraZNear(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_setCameraZNear(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -358,7 +358,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_getCameraZFar(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_getCameraZFar(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -374,7 +374,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_setCameraZFar(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_setCameraZFar(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -389,7 +389,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_getCameraYaw(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_getCameraYaw(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -405,7 +405,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_setCameraYaw(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_setCameraYaw(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -420,7 +420,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_getCameraPitch(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_getCameraPitch(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -436,7 +436,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_setCameraPitch(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_setCameraPitch(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -451,7 +451,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_getCameraSpeed(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_getCameraSpeed(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -467,7 +467,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_setCameraSpeed(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_setCameraSpeed(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -482,7 +482,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_getCameraSensitivity(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_getCameraSensitivity(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -498,7 +498,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CameraNative_setCameraSensitivity(
+    pub extern "system" fn Java_com_dropbear_components_CameraNative_setCameraSensitivity(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
diff --git a/eucalyptus-core/src/engine.rs b/eucalyptus-core/src/engine.rs
index a51fa0b..4229fbd 100644
--- a/eucalyptus-core/src/engine.rs
+++ b/eucalyptus-core/src/engine.rs
@@ -5,12 +5,12 @@ pub mod shared {
     use crate::states::Label;
     use dropbear_engine::asset::AssetRegistry;
     use dropbear_engine::utils::ResourceReference;
-    use hecs::World;
+    use hecs::{Entity, World};
     use std::ffi::CStr;
     use std::os::raw::c_char;
 
     pub fn get_entity(world: &World, label: &str) -> DropbearNativeResult<u64> {
-        for (id, entity_label) in world.query::<&Label>().iter() {
+        for (id, entity_label) in world.query::<(Entity, &Label)>().iter() {
             if entity_label.as_str() == label {
                 return Ok(id.to_bits().get());
             }
@@ -52,7 +52,7 @@ pub mod jni {
     use crate::return_boxed;
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_DropbearEngineNative_getEntity(
+    pub extern "system" fn Java_com_dropbear_DropbearEngineNative_getEntity(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -74,7 +74,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_DropbearEngineNative_getAsset(
+    pub extern "system" fn Java_com_dropbear_DropbearEngineNative_getAsset(
         mut env: JNIEnv,
         _class: JClass,
         asset_handle: jlong,
@@ -96,7 +96,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_DropbearEngineNative_quit(
+    pub extern "system" fn Java_com_dropbear_DropbearEngineNative_quit(
         mut env: JNIEnv,
         _class: JClass,
         command_buffer_ptr: jlong,
diff --git a/eucalyptus-core/src/entity.rs b/eucalyptus-core/src/entity.rs
index 075a0a3..9779968 100644
--- a/eucalyptus-core/src/entity.rs
+++ b/eucalyptus-core/src/entity.rs
@@ -9,7 +9,7 @@ pub mod jni {
     use jni::JNIEnv;
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_LabelNative_labelExistsForEntity(
+    pub extern "system" fn Java_com_dropbear_components_LabelNative_labelExistsForEntity(
         _env: JNIEnv,
         _: JClass,
         world_ptr: jlong,
@@ -22,7 +22,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_EntityRefNative_getEntityLabel(
+    pub extern "system" fn Java_com_dropbear_EntityRefNative_getEntityLabel(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -46,7 +46,7 @@ pub mod jni {
         string.into_raw()
     }
 
-    pub fn Java_com_dropbear_EntityRefNative_getChildren(
+    pub extern "system" fn Java_com_dropbear_EntityRefNative_getChildren(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -55,8 +55,7 @@ pub mod jni {
         let world = crate::convert_ptr!(world_ptr => World);
         let entity = crate::convert_jlong_to_entity!(entity_id);
 
-        if let Ok(mut q) = world.query_one::<&Children>(entity)
-            && let Some(children) = q.get()
+        if let Ok(children) = world.query_one::<&Children>(entity).get()
         {
             let entity_bytes = children.children().iter().map(|c| c.to_bits().get() as i64).collect::<Vec<_>>();
 
@@ -77,7 +76,7 @@ pub mod jni {
         }
     }
 
-    pub fn Java_com_dropbear_EntityRefNative_getChildByLabel(
+    pub extern "system" fn Java_com_dropbear_EntityRefNative_getChildByLabel(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -88,8 +87,7 @@ pub mod jni {
         let entity = crate::convert_jlong_to_entity!(entity_id);
         let target = convert_jstring!(env, label);
 
-        if let Ok(mut q) = world.query_one::<&Children>(entity)
-            && let Some(children) = q.get()
+        if let Ok(children) = world.query_one::<&Children>(entity).get()
         {
             for child in children.children() {
                 if let Ok(label) = world.get::<&Label>(entity) {
@@ -111,7 +109,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_EntityRefNative_getParent(
+    pub extern "system" fn Java_com_dropbear_EntityRefNative_getParent(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -119,15 +117,11 @@ pub mod jni {
     ) -> jobject {
         let world = convert_ptr!(world_ptr => World);
         let entity = convert_jlong_to_entity!(entity_id);
-
-        if let Ok(mut q) = world.query_one::<&Parent>(entity) {
-            if let Some(parent) = q.get() {
-                crate::return_boxed!(&mut env, Some(JValue::Long(parent.parent().to_bits().get() as jlong)), "(J)Ljava/lang/Long", "java/lang/Long")
-            } else {
-                std::ptr::null_mut()
-            }
+        
+        if let Ok(parent) = world.query_one::<&Parent>(entity).get() {
+            crate::return_boxed!(&mut env, Some(JValue::Long(parent.parent().to_bits().get() as jlong)), "(J)Ljava/lang/Long", "java/lang/Long")
         } else {
-            crate::ffi_error_return!("No entity exists")
+            std::ptr::null_mut()
         }
     }
 }
diff --git a/eucalyptus-core/src/hierarchy.rs b/eucalyptus-core/src/hierarchy.rs
index 6d3f3fb..8affa89 100644
--- a/eucalyptus-core/src/hierarchy.rs
+++ b/eucalyptus-core/src/hierarchy.rs
@@ -205,7 +205,7 @@ impl SceneHierarchy {
     pub fn from_world(world: &hecs::World) -> Self {
         let mut hierarchy = Self::new();
 
-        for (_entity, (label, parent)) in world.query::<(&Label, &Parent)>().iter() {
+        for (label, parent) in world.query::<(&Label, &Parent)>().iter() {
             if let Ok(parent_label) = world.get::<&Label>(parent.parent()) {
                 hierarchy.set_parent(label.clone(), Label::new(parent_label.as_str()));
             }
diff --git a/eucalyptus-core/src/input.rs b/eucalyptus-core/src/input.rs
index e74d155..2fa22d3 100644
--- a/eucalyptus-core/src/input.rs
+++ b/eucalyptus-core/src/input.rs
@@ -201,7 +201,7 @@ pub mod jni {
     use crate::scripting::jni::utils::ToJObject;
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_InputStateNative_printInputState(
+    pub extern "system" fn Java_com_dropbear_input_InputStateNative_printInputState(
         _env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -211,7 +211,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_InputStateNative_isKeyPressed(
+    pub extern "system" fn Java_com_dropbear_input_InputStateNative_isKeyPressed(
         _env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -222,7 +222,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_InputStateNative_getMousePosition(
+    pub extern "system" fn Java_com_dropbear_input_InputStateNative_getMousePosition(
         mut env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -236,7 +236,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_InputStateNative_isMouseButtonPressed(
+    pub extern "system" fn Java_com_dropbear_input_InputStateNative_isMouseButtonPressed(
         mut env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -258,7 +258,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_InputStateNative_getMouseDelta(
+    pub extern "system" fn Java_com_dropbear_input_InputStateNative_getMouseDelta(
         mut env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -272,7 +272,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_InputStateNative_isCursorLocked(
+    pub extern "system" fn Java_com_dropbear_input_InputStateNative_isCursorLocked(
         _env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -282,7 +282,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_InputStateNative_setCursorLocked(
+    pub extern "system" fn Java_com_dropbear_input_InputStateNative_setCursorLocked(
         mut env: JNIEnv,
         _class: JClass,
         cmd_ptr: jlong,
@@ -298,7 +298,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_InputStateNative_getLastMousePos(
+    pub extern "system" fn Java_com_dropbear_input_InputStateNative_getLastMousePos(
         mut env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -312,7 +312,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_InputStateNative_isCursorHidden(
+    pub extern "system" fn Java_com_dropbear_input_InputStateNative_isCursorHidden(
         _env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -322,7 +322,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_InputStateNative_setCursorHidden(
+    pub extern "system" fn Java_com_dropbear_input_InputStateNative_setCursorHidden(
         mut env: JNIEnv,
         _class: JClass,
         cmd_ptr: jlong,
@@ -338,7 +338,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_InputStateNative_getConnectedGamepads(
+    pub extern "system" fn Java_com_dropbear_input_InputStateNative_getConnectedGamepads(
         env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
diff --git a/eucalyptus-core/src/input/gamepad.rs b/eucalyptus-core/src/input/gamepad.rs
index 0455131..2b99487 100644
--- a/eucalyptus-core/src/input/gamepad.rs
+++ b/eucalyptus-core/src/input/gamepad.rs
@@ -132,7 +132,7 @@ pub mod jni {
     use crate::scripting::jni::utils::ToJObject;
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_GamepadNative_isGamepadButtonPressed(
+    pub extern "system" fn Java_com_dropbear_input_GamepadNative_isGamepadButtonPressed(
         _env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -148,7 +148,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_GamepadNative_getLeftStickPosition(
+    pub extern "system" fn Java_com_dropbear_input_GamepadNative_getLeftStickPosition(
         mut env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -164,7 +164,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_input_GamepadNative_getRightStickPosition(
+    pub extern "system" fn Java_com_dropbear_input_GamepadNative_getRightStickPosition(
         mut env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
diff --git a/eucalyptus-core/src/lighting.rs b/eucalyptus-core/src/lighting.rs
index fd94109..bfa05f1 100644
--- a/eucalyptus-core/src/lighting.rs
+++ b/eucalyptus-core/src/lighting.rs
@@ -259,7 +259,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_lightExistsForEntity(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_lightExistsForEntity(
 		_env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -275,7 +275,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_getPosition(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_getPosition(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -296,7 +296,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_setPosition(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_setPosition(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -323,7 +323,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_getDirection(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_getDirection(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -347,7 +347,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_setDirection(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_setDirection(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -383,7 +383,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_getColour(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_getColour(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -405,7 +405,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_setColour(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_setColour(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -435,7 +435,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_getLightType(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_getLightType(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -453,7 +453,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_setLightType(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_setLightType(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -480,7 +480,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_getIntensity(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_getIntensity(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -498,7 +498,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_setIntensity(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_setIntensity(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -517,7 +517,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_getAttenuation(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_getAttenuation(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -544,7 +544,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_setAttenuation(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_setAttenuation(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -577,7 +577,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_getEnabled(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_getEnabled(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -595,7 +595,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_setEnabled(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_setEnabled(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -614,7 +614,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_getCutoffAngle(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_getCutoffAngle(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -632,7 +632,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_setCutoffAngle(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_setCutoffAngle(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -651,7 +651,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_getOuterCutoffAngle(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_getOuterCutoffAngle(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -669,7 +669,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_setOuterCutoffAngle(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_setOuterCutoffAngle(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -688,7 +688,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_getCastsShadows(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_getCastsShadows(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -706,7 +706,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_setCastsShadows(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_setCastsShadows(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -725,7 +725,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_getDepth(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_getDepth(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
@@ -751,7 +751,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_lighting_LightNative_setDepth(
+	pub extern "system" fn Java_com_dropbear_lighting_LightNative_setDepth(
 		mut env: JNIEnv,
 		_class: JClass,
 		world_ptr: jlong,
diff --git a/eucalyptus-core/src/mesh.rs b/eucalyptus-core/src/mesh.rs
index 289c40f..554fb03 100644
--- a/eucalyptus-core/src/mesh.rs
+++ b/eucalyptus-core/src/mesh.rs
@@ -41,7 +41,7 @@ pub mod jni {
     use std::sync::Arc;
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_MeshRendererNative_meshRendererExistsForEntity(
+    pub extern "system" fn Java_com_dropbear_components_MeshRendererNative_meshRendererExistsForEntity(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -53,7 +53,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_MeshRendererNative_getModel(
+    pub extern "system" fn Java_com_dropbear_components_MeshRendererNative_getModel(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -71,7 +71,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_MeshRendererNative_setModel(
+    pub extern "system" fn Java_com_dropbear_components_MeshRendererNative_setModel(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -96,7 +96,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_MeshRendererNative_getAllTextureIds(
+    pub extern "system" fn Java_com_dropbear_components_MeshRendererNative_getAllTextureIds(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -130,7 +130,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_MeshRendererNative_getTexture(
+    pub extern "system" fn Java_com_dropbear_components_MeshRendererNative_getTexture(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -154,7 +154,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_MeshRendererNative_setTextureOverride(
+    pub extern "system" fn Java_com_dropbear_components_MeshRendererNative_setTextureOverride(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
diff --git a/eucalyptus-core/src/physics.rs b/eucalyptus-core/src/physics.rs
index c259747..b79d5f6 100644
--- a/eucalyptus-core/src/physics.rs
+++ b/eucalyptus-core/src/physics.rs
@@ -73,7 +73,7 @@ impl PhysicsState {
     pub fn step(&mut self, entity_label_map: HashMap<Entity, Label>, pipeline: &mut PhysicsPipeline, physics_hooks: &dyn PhysicsHooks, event_handler: &dyn EventHandler) {
         self.entity_label_map = entity_label_map;
         pipeline.step(
-            &vector![self.gravity[0], self.gravity[1], self.gravity[2]], // a panic is deserved for those who don't specify a 3rd type in a vector array
+            Vector::new(self.gravity[0], self.gravity[1], self.gravity[2]), // a panic is deserved for those who don't specify a 3rd type in a vector array
             &self.integration_parameters,
             &mut self.islands,
             &mut self.broad_phase,
@@ -100,16 +100,16 @@ impl PhysicsState {
         let rot = transform.rotation.as_quat().to_array();
 
         let body = RigidBodyBuilder::new(mode)
-            .translation(vector![pos[0], pos[1], pos[2]])
+            .translation(Vector::from_array(pos))
             .rotation(UnitQuaternion::from_quaternion(Quaternion::new(
-                rot[3] as f32, rot[0] as f32, rot[1] as f32, rot[2] as f32
-            )).scaled_axis())
+                rot[3], rot[0], rot[1], rot[2]
+            )).scaled_axis().into())
             .gravity_scale(rigid_body.gravity_scale)
             .sleeping(rigid_body.sleeping)
             .can_sleep(rigid_body.can_sleep)
             .ccd_enabled(rigid_body.ccd_enabled)
-            .linvel(Vector3::from_column_slice(&rigid_body.linvel))
-            .angvel(Vector3::from_column_slice(&rigid_body.angvel))
+            .linvel(Vector::from_array(rigid_body.linvel))
+            .angvel(Vector::from_array(rigid_body.angvel))
             .linear_damping(rigid_body.linear_damping)
             .angular_damping(rigid_body.angular_damping)
             .enabled_translations(!rigid_body.lock_translation.x, !rigid_body.lock_translation.y, !rigid_body.lock_translation.z)
@@ -161,14 +161,14 @@ impl PhysicsState {
         }
         builder = builder.active_events(active_events);
 
-        builder = builder.translation(Vector3::from_column_slice(&collider_component.translation));
+        builder = builder.translation(Vector::from_array(collider_component.translation));
 
         let rotation = UnitQuaternion::from_euler_angles(
             collider_component.rotation[0],
             collider_component.rotation[1],
             collider_component.rotation[2]
         );
-        builder = builder.rotation(rotation.scaled_axis());
+        builder = builder.rotation(rotation.scaled_axis().into());
 
         let handle = if let Some(&rigid_body_handle) = self.bodies_entity_map.get(&collider_component.entity) {
             self.colliders.insert_with_parent(
@@ -293,7 +293,7 @@ pub mod shared {
         for (_, h1) in handles1 {
             for (_, h2) in handles2 {
                 if let Some(pair) = physics.narrow_phase.contact_pair(*h1, *h2) {
-                    if pair.has_any_active_contact {
+                    if pair.has_any_active_contact() {
                         return true;
                     }
                 }
@@ -320,7 +320,7 @@ pub mod jni {
     use rapier3d::prelude::{point, vector, Ray};
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_PhysicsNative_getGravity(
+    pub extern "system" fn Java_com_dropbear_physics_PhysicsNative_getGravity(
         mut env: JNIEnv,
         _: JClass,
         physics_handle: jlong,
@@ -338,7 +338,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_PhysicsNative_setGravity(
+    pub extern "system" fn Java_com_dropbear_physics_PhysicsNative_setGravity(
         mut env: JNIEnv,
         _: JClass,
         physics_handle: jlong,
@@ -357,7 +357,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_PhysicsNative_raycast(
+    pub extern "system" fn Java_com_dropbear_physics_PhysicsNative_raycast(
         mut env: JNIEnv,
         _: JClass,
         physics_handle: jlong,
@@ -387,8 +387,8 @@ pub mod jni {
         };
 
         let ray = Ray::new(
-            point![origin.x as f32, origin.y as f32, origin.z as f32],
-            vector![dir.x as f32, dir.y as f32, dir.z as f32],
+            point![origin.x as f32, origin.y as f32, origin.z as f32].into(),
+            vector![dir.x as f32, dir.y as f32, dir.z as f32].into(),
         );
 
         if let Some((hit, distance)) = qp.cast_ray(&ray, time_of_impact as f32, solid != 0) {
@@ -452,7 +452,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_PhysicsNative_isOverlapping(
+    pub extern "system" fn Java_com_dropbear_physics_PhysicsNative_isOverlapping(
         mut env: JNIEnv,
         _: JClass,
         physics_handle: jlong,
@@ -480,7 +480,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_PhysicsNative_isTriggering(
+    pub extern "system" fn Java_com_dropbear_physics_PhysicsNative_isTriggering(
         mut env: JNIEnv,
         _: JClass,
         physics_handle: jlong,
@@ -508,7 +508,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_PhysicsNative_isTouching(
+    pub extern "system" fn Java_com_dropbear_physics_PhysicsNative_isTouching(
         _env: JNIEnv,
         _: JClass,
         physics_handle: jlong,
diff --git a/eucalyptus-core/src/physics/collider.rs b/eucalyptus-core/src/physics/collider.rs
index cd52295..8f3acc4 100644
--- a/eucalyptus-core/src/physics/collider.rs
+++ b/eucalyptus-core/src/physics/collider.rs
@@ -31,6 +31,7 @@ use rapier3d::na::Vector3;
 use rapier3d::prelude::ColliderBuilder;
 use serde::{Deserialize, Serialize};
 use std::sync::Arc;
+use rapier3d::math::Vector;
 
 #[derive(Debug, Default, Serialize, Deserialize, Clone, SerializableComponent)]
 pub struct ColliderGroup {
@@ -425,8 +426,8 @@ impl Collider {
             .friction(self.friction)
             .restitution(self.restitution)
             .sensor(self.is_sensor)
-            .translation(Vector3::from_column_slice(&self.translation))
-            .rotation(Vector3::from_column_slice(&self.rotation))
+            .translation(Vector::from_array(self.translation))
+            .rotation(Vector::from_array(self.rotation))
             .build()
     }
 
@@ -644,10 +645,10 @@ pub mod jni {
     use jni::sys::{jboolean, jdouble, jlong, jobject};
     use jni::JNIEnv;
     use rapier3d::na::{UnitQuaternion, Vector3};
-    use rapier3d::prelude::{ColliderHandle, SharedShape, TypedShape};
+    use rapier3d::prelude::{ColliderHandle, Rotation, SharedShape, TypedShape, Vector};
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_getColliderShape(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderShape(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -712,7 +713,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_setColliderShape(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderShape(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -760,7 +761,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_getColliderDensity(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderDensity(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -777,7 +778,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_setColliderDensity(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderDensity(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -793,7 +794,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_getColliderFriction(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderFriction(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -807,7 +808,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_setColliderFriction(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderFriction(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -823,7 +824,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_getColliderRestitution(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderRestitution(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -837,7 +838,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_setColliderRestitution(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderRestitution(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -853,7 +854,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_getColliderMass(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderMass(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -867,7 +868,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_setColliderMass(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderMass(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -883,7 +884,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_getColliderIsSensor(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderIsSensor(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -897,7 +898,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_setColliderIsSensor(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderIsSensor(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -913,7 +914,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_getColliderTranslation(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderTranslation(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -926,7 +927,7 @@ pub mod jni {
         };
 
         if let Some(col) = get_collider(&physics, &ffi) {
-            let t: &Vector3<f32> = col.translation();
+            let t: Vector = col.translation();
             let vec = crate::types::Vector3::new(t.x as f64, t.y as f64, t.z as f64);
             match vec.to_jobject(&mut env) {
                 Ok(o) => o.into_raw(),
@@ -938,7 +939,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_setColliderTranslation(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderTranslation(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -949,7 +950,7 @@ pub mod jni {
         if let Ok(ffi) = ColliderFFI::from_jobject(&mut env, &collider_obj) {
             if let Ok(vec) = crate::types::Vector3::from_jobject(&mut env, &vec_obj) {
                 if let Some(col) = get_collider_mut(physics, &ffi) {
-                    let t = Vector3::new(vec.x as f32, vec.y as f32, vec.z as f32);
+                    let t = Vector::new(vec.x as f32, vec.y as f32, vec.z as f32);
                     col.set_translation(t);
                 }
             }
@@ -957,7 +958,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_getColliderRotation(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderRotation(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -970,8 +971,8 @@ pub mod jni {
         };
 
         if let Some(col) = get_collider(&physics, &ffi) {
-            let r: &UnitQuaternion<f32> = col.rotation();
-            let q = DQuat::from_xyzw(r.i as f64, r.j as f64, r.k as f64, r.w as f64);
+            let r: Rotation = col.rotation();
+            let q = DQuat::from_xyzw(r.x as f64, r.y as f64, r.z as f64, r.w as f64);
             let euler = q.to_euler(glam::EulerRot::XYZ);
             let vec = crate::types::Vector3::new(euler.0, euler.1, euler.2);
 
@@ -985,7 +986,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderNative_setColliderRotation(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderRotation(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -997,9 +998,7 @@ pub mod jni {
             if let Ok(vec) = crate::types::Vector3::from_jobject(&mut env, &vec_obj) {
                 if let Some(col) = get_collider_mut(physics, &ffi) {
                     let q = DQuat::from_euler(glam::EulerRot::XYZ, vec.x, vec.y, vec.z);
-                    let r = rapier3d::na::UnitQuaternion::new_normalize(
-                        rapier3d::na::Quaternion::new(q.w as f32, q.x as f32, q.y as f32, q.z as f32)
-                    );
+                    let r = Rotation::from_array([q.w as f32, q.x as f32, q.y as f32, q.z as f32]);
                     col.set_rotation(r);
                 }
             }
@@ -1007,8 +1006,9 @@ pub mod jni {
     }
 }
 
-#[dropbear_macro::impl_c_api]
+// #[dropbear_macro::impl_c_api]
 pub mod native {
+    use crate::physics::Rotation;
     use crate::convert_ptr;
     use crate::physics::collider::shared::{get_collider, get_collider_mut};
     use crate::physics::PhysicsState;
@@ -1019,8 +1019,7 @@ pub mod native {
     use crate::scripting::result::DropbearNativeResult;
     use crate::types::{ColliderFFI, ColliderShapeFFI, ColliderShapeType};
     use glam::DQuat;
-    use rapier3d::na::{Quaternion, UnitQuaternion};
-    use rapier3d::prelude::{SharedShape, TypedShape};
+    use rapier3d::prelude::{SharedShape, TypedShape, Vector};
 
     pub fn dropbear_get_collider_shape(
         physics_ptr: PhysicsStatePtr,
@@ -1242,7 +1241,7 @@ pub mod native {
     ) -> DropbearNativeResult<()> {
         let physics = convert_ptr!(mut physics_ptr => PhysicsState);
         if let Some(col) = get_collider_mut(physics, &ffi) {
-            let t = rapier3d::na::Vector3::new(translation.x as f32, translation.y as f32, translation.z as f32);
+            let t = Vector::new(translation.x as f32, translation.y as f32, translation.z as f32);
             col.set_translation(t);
             DropbearNativeResult::Ok(())
         } else {
@@ -1257,7 +1256,7 @@ pub mod native {
         let physics = convert_ptr!(physics_ptr => PhysicsState);
         if let Some(col) = get_collider(physics, &ffi) {
             let r = col.rotation();
-            let q = DQuat::from_xyzw(r.i as f64, r.j as f64, r.k as f64, r.w as f64);
+            let q: DQuat = DQuat::from_xyzw(r.x as f64, r.y as f64, r.z as f64, r.w as f64);
             let (x, y, z) = q.to_euler(glam::EulerRot::XYZ);
             DropbearNativeResult::Ok(Vector3 { x, y, z })
         } else {
@@ -1273,9 +1272,7 @@ pub mod native {
         let physics = convert_ptr!(mut physics_ptr => PhysicsState);
         if let Some(col) = get_collider_mut(physics, &ffi) {
             let q = DQuat::from_euler(glam::EulerRot::XYZ, rotation.x, rotation.y, rotation.z);
-            let r = UnitQuaternion::new_normalize(
-                Quaternion::new(q.w as f32, q.x as f32, q.y as f32, q.z as f32)
-            );
+            let r = Rotation::from(q.as_quat());
             col.set_rotation(r);
             DropbearNativeResult::Ok(())
         } else {
diff --git a/eucalyptus-core/src/physics/collider/collidergroup.rs b/eucalyptus-core/src/physics/collider/collidergroup.rs
index 9ca2f16..4395ccf 100644
--- a/eucalyptus-core/src/physics/collider/collidergroup.rs
+++ b/eucalyptus-core/src/physics/collider/collidergroup.rs
@@ -72,7 +72,7 @@ pub mod jni {
     use jni::JNIEnv;
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderGroupNative_colliderGroupExistsForEntity(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderGroupNative_colliderGroupExistsForEntity(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -89,7 +89,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_ColliderGroupNative_getColliderGroupColliders(
+    pub extern "system" fn Java_com_dropbear_physics_ColliderGroupNative_getColliderGroupColliders(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
diff --git a/eucalyptus-core/src/physics/kcc.rs b/eucalyptus-core/src/physics/kcc.rs
index f8c03ca..a6bae53 100644
--- a/eucalyptus-core/src/physics/kcc.rs
+++ b/eucalyptus-core/src/physics/kcc.rs
@@ -53,7 +53,7 @@ pub mod jni {
     use crate::scripting::jni::utils::ToJObject;
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_KinematicCharacterControllerNative_existsForEntity(
+    pub extern "system" fn Java_com_dropbear_physics_KinematicCharacterControllerNative_existsForEntity(
         _env: JNIEnv,
         _: JClass,
         world_handle: jlong,
@@ -67,7 +67,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_KinematicCharacterControllerNative_moveCharacter(
+    pub extern "system" fn Java_com_dropbear_physics_KinematicCharacterControllerNative_moveCharacter(
         mut env: JNIEnv,
         _: JClass,
         world_handle: jlong,
@@ -88,8 +88,7 @@ pub mod jni {
             }
         };
 
-        if let Ok(mut q) = world.query_one::<(&Label, &KCC)>(entity)
-            && let Some((label, kcc)) = q.get()
+        if let Ok((label, kcc)) = world.query_one::<(&Label, &KCC)>(entity).get()
         {
             let Some(rigid_body_handle) = physics_state.bodies_entity_map.get(label) else {
                 return;
@@ -156,7 +155,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_physics_KinematicCharacterControllerNative_getHitNative(
+    pub extern "system" fn Java_com_dropbear_physics_KinematicCharacterControllerNative_getHitNative(
         mut env: JNIEnv,
         _: JClass,
         world_handle: jlong,
diff --git a/eucalyptus-core/src/physics/kcc/character_collision.rs b/eucalyptus-core/src/physics/kcc/character_collision.rs
index 13b7b23..85e2da3 100644
--- a/eucalyptus-core/src/physics/kcc/character_collision.rs
+++ b/eucalyptus-core/src/physics/kcc/character_collision.rs
@@ -30,7 +30,7 @@ fn get_collision_from_world(world: &World, entity: Entity, collision_handle: Ind
 fn collider_ffi_from_handle(world: &World, handle: rapier3d::prelude::ColliderHandle) -> Option<ColliderFFI> {
 	let (idx, generation) = handle.into_raw_parts();
 
-	for (entity, group) in world.query::<&ColliderGroup>().iter() {
+	for (entity, group) in world.query::<(Entity, &ColliderGroup)>().iter() {
 		if group.colliders.iter().any(|c| c.id == idx) {
 			return Some(ColliderFFI {
 				index: IndexNative { index: idx, generation },
@@ -90,9 +90,9 @@ pub mod shared {
 		let collision = super::get_collision_from_world(world, entity, collision_handle)?;
 
 		let iso = collision.character_pos;
-		let t = iso.translation.vector;
+		let t = iso.translation;
 		let rot = iso.rotation;
-		let q: Quaternion<f32> = rot.into_inner();
+		let q: Quaternion<f32> = Quaternion::from(rot);
 
 		Ok(DbTransform {
 			position: DVec3::new(t.x as f64, t.y as f64, t.z as f64),
@@ -162,7 +162,7 @@ pub mod jni {
 	use jni::objects::JObject;
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_CharacterCollisionNative_getCollider(
+	pub extern "system" fn Java_com_dropbear_physics_CharacterCollisionNative_getCollider(
 		mut env: JNIEnv,
 		_: JClass,
 		world_handle: jlong,
@@ -193,7 +193,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_CharacterCollisionNative_getCharacterPosition(
+	pub extern "system" fn Java_com_dropbear_physics_CharacterCollisionNative_getCharacterPosition(
 		mut env: JNIEnv,
 		_: JClass,
 		world_handle: jlong,
@@ -224,7 +224,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_CharacterCollisionNative_getTranslationApplied(
+	pub extern "system" fn Java_com_dropbear_physics_CharacterCollisionNative_getTranslationApplied(
 		mut env: JNIEnv,
 		_: JClass,
 		world_handle: jlong,
@@ -255,7 +255,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_CharacterCollisionNative_getTranslationRemaining(
+	pub extern "system" fn Java_com_dropbear_physics_CharacterCollisionNative_getTranslationRemaining(
 		mut env: JNIEnv,
 		_: JClass,
 		world_handle: jlong,
@@ -286,7 +286,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_CharacterCollisionNative_getTimeOfImpact(
+	pub extern "system" fn Java_com_dropbear_physics_CharacterCollisionNative_getTimeOfImpact(
 		mut env: JNIEnv,
 		_: JClass,
 		world_handle: jlong,
@@ -311,7 +311,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_CharacterCollisionNative_getWitness1(
+	pub extern "system" fn Java_com_dropbear_physics_CharacterCollisionNative_getWitness1(
 		mut env: JNIEnv,
 		_: JClass,
 		world_handle: jlong,
@@ -342,7 +342,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_CharacterCollisionNative_getWitness2(
+	pub extern "system" fn Java_com_dropbear_physics_CharacterCollisionNative_getWitness2(
 		mut env: JNIEnv,
 		_: JClass,
 		world_handle: jlong,
@@ -373,7 +373,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_CharacterCollisionNative_getNormal1(
+	pub extern "system" fn Java_com_dropbear_physics_CharacterCollisionNative_getNormal1(
 		mut env: JNIEnv,
 		_: JClass,
 		world_handle: jlong,
@@ -404,7 +404,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_CharacterCollisionNative_getNormal2(
+	pub extern "system" fn Java_com_dropbear_physics_CharacterCollisionNative_getNormal2(
 		mut env: JNIEnv,
 		_: JClass,
 		world_handle: jlong,
@@ -435,7 +435,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_CharacterCollisionNative_getStatus(
+	pub extern "system" fn Java_com_dropbear_physics_CharacterCollisionNative_getStatus(
 		mut env: JNIEnv,
 		_: JClass,
 		world_handle: jlong,
diff --git a/eucalyptus-core/src/physics/rigidbody.rs b/eucalyptus-core/src/physics/rigidbody.rs
index 88834cf..7ece459 100644
--- a/eucalyptus-core/src/physics/rigidbody.rs
+++ b/eucalyptus-core/src/physics/rigidbody.rs
@@ -206,7 +206,7 @@ pub mod shared {
 	use crate::types::{IndexNative, RigidBodyContext, Vector3};
 	use hecs::{Entity, World};
 	use rapier3d::dynamics::{RigidBodyHandle, RigidBodyType};
-	use rapier3d::prelude::vector;
+	use rapier3d::prelude::{vector, Vector};
 	use rapier3d::prelude::{nalgebra, ColliderHandle, LockedAxes};
 
 	pub fn rigid_body_exists_for_entity(
@@ -214,8 +214,7 @@ pub mod shared {
 		physics: &PhysicsState,
 		entity: Entity
 	) -> Option<IndexNative> {
-		if let Ok(mut q) = world.query_one::<(&Label, &RigidBody)>(entity)
-			&& let Some((label, _)) = q.get()
+		if let Ok((label, _)) = world.query_one::<(&Label, &RigidBody)>(entity).get()
 		{
 			if let Some(handle) = physics.bodies_entity_map.get(label) {
 				Some(IndexNative::from(handle.0))
@@ -250,7 +249,7 @@ pub mod shared {
 
 			let entity = Entity::from_bits(rb_context.entity_id).ok_or(DropbearNativeError::InvalidEntity)?;
 
-			if let Ok(mut q) = world.query_one::<&mut RigidBody>(entity) && let Some(rb) = q.get() {
+			if let Ok(rb) = world.query_one::<&mut RigidBody>(entity).get() {
 				let rb_mode = RigidBodyMode::from(mode);
 				rb.mode = rb_mode;
 			}
@@ -277,7 +276,7 @@ pub mod shared {
 			
 			let entity = Entity::from_bits(rb_context.entity_id).ok_or(DropbearNativeError::InvalidEntity)?;
 
-			if let Ok(mut q) = world.query_one::<&mut RigidBody>(entity) && let Some(rb) = q.get() {
+			if let Ok(rb) = world.query_one::<&mut RigidBody>(entity).get() {
 				rb.gravity_scale = new_scale as f32;				
 			}
 
@@ -303,7 +302,7 @@ pub mod shared {
 
 			let entity = Entity::from_bits(rb_context.entity_id).ok_or(DropbearNativeError::InvalidEntity)?;
 
-			if let Ok(mut q) = world.query_one::<&mut RigidBody>(entity) && let Some(rb) = q.get() {
+			if let Ok(rb) = world.query_one::<&mut RigidBody>(entity).get() {
 				rb.linear_damping = new as f32;
 			}
 
@@ -329,7 +328,7 @@ pub mod shared {
 
 			let entity = Entity::from_bits(rb_context.entity_id).ok_or(DropbearNativeError::InvalidEntity)?;
 
-			if let Ok(mut q) = world.query_one::<&mut RigidBody>(entity) && let Some(rb) = q.get() {
+			if let Ok(rb) = world.query_one::<&mut RigidBody>(entity).get() {
 				rb.angular_damping = new as f32;
 			}
 
@@ -359,7 +358,7 @@ pub mod shared {
 
 			let entity = Entity::from_bits(rb_context.entity_id).ok_or(DropbearNativeError::InvalidEntity)?;
 
-			if let Ok(mut q) = world.query_one::<&mut RigidBody>(entity) && let Some(rb) = q.get() {
+			if let Ok(rb) = world.query_one::<&mut RigidBody>(entity).get() {
 				rb.sleeping = new;
 			}
 
@@ -385,7 +384,7 @@ pub mod shared {
 
 			let entity = Entity::from_bits(rb_context.entity_id).ok_or(DropbearNativeError::InvalidEntity)?;
 
-			if let Ok(mut q) = world.query_one::<&mut RigidBody>(entity) && let Some(rb) = q.get() {
+			if let Ok(rb) = world.query_one::<&mut RigidBody>(entity).get() {
 				rb.ccd_enabled = new;
 			}
 
@@ -408,11 +407,11 @@ pub mod shared {
 	pub fn set_rigidbody_linvel(physics: &mut PhysicsState, world: &World, rb_context: RigidBodyContext, new: Vector3) -> DropbearNativeResult<()> {
 		let handle = RigidBodyHandle::from_raw_parts(rb_context.index.index, rb_context.index.generation);
 		if let Some(rb) = physics.bodies.get_mut(handle) {
-			rb.set_linvel(vector![new.x as f32, new.y as f32, new.z as f32], true);
+			rb.set_linvel(Vector::new(new.x as f32, new.y as f32, new.z as f32), true);
 
 			let entity = Entity::from_bits(rb_context.entity_id).ok_or(DropbearNativeError::InvalidEntity)?;
 
-			if let Ok(mut q) = world.query_one::<&mut RigidBody>(entity) && let Some(rb) = q.get() {
+			if let Ok(rb) = world.query_one::<&mut RigidBody>(entity).get() {
 				rb.linvel = [new.x as f32, new.y as f32, new.z as f32];
 			}
 
@@ -435,11 +434,11 @@ pub mod shared {
 	pub fn set_rigidbody_angvel(physics: &mut PhysicsState, world: &World, rb_context: RigidBodyContext, new: Vector3) -> DropbearNativeResult<()> {
 		let handle = RigidBodyHandle::from_raw_parts(rb_context.index.index, rb_context.index.generation);
 		if let Some(rb) = physics.bodies.get_mut(handle) {
-			rb.set_angvel(vector![new.x as f32, new.y as f32, new.z as f32], true);
+			rb.set_angvel(Vector::new(new.x as f32, new.y as f32, new.z as f32), true);
 
 			let entity = Entity::from_bits(rb_context.entity_id).ok_or(DropbearNativeError::InvalidEntity)?;
 
-			if let Ok(mut q) = world.query_one::<&mut RigidBody>(entity) && let Some(rb) = q.get() {
+			if let Ok(rb) = world.query_one::<&mut RigidBody>(entity).get() {
 				rb.angvel = [new.x as f32, new.y as f32, new.z as f32];
 			}
 
@@ -487,7 +486,7 @@ pub mod shared {
 			
 			let entity = Entity::from_bits(rb_context.entity_id).ok_or(DropbearNativeError::InvalidEntity)?;
 
-			if let Ok(mut q) = world.query_one::<&mut RigidBody>(entity) && let Some(rb) = q.get() {
+			if let Ok(rb) = world.query_one::<&mut RigidBody>(entity).get() {
 				rb.lock_translation = new;
 			}
 
@@ -535,7 +534,7 @@ pub mod shared {
 
 			let entity = Entity::from_bits(rb_context.entity_id).ok_or(DropbearNativeError::InvalidEntity)?;
 
-			if let Ok(mut q) = world.query_one::<&mut RigidBody>(entity) && let Some(rb) = q.get() {
+			if let Ok(rb) = world.query_one::<&mut RigidBody>(entity).get() {
 				rb.lock_translation = new;
 			}
 
@@ -558,7 +557,7 @@ pub mod shared {
 	pub fn apply_impulse(physics: &mut PhysicsState, _world: &World, rb_context: RigidBodyContext, new: Vector3) -> DropbearNativeResult<()> {
 		let handle = RigidBodyHandle::from_raw_parts(rb_context.index.index, rb_context.index.generation);
 		if let Some(rb) = physics.bodies.get_mut(handle) {
-			rb.apply_impulse(vector![new.x as f32, new.y as f32, new.z as f32], true);
+			rb.apply_impulse(Vector::new(new.x as f32, new.y as f32, new.z as f32), true);
 
 			Ok(())
 		} else {
@@ -569,7 +568,7 @@ pub mod shared {
 	pub fn apply_torque_impulse(physics: &mut PhysicsState, _world: &World, rb_context: RigidBodyContext, new: Vector3) -> DropbearNativeResult<()> {
 		let handle = RigidBodyHandle::from_raw_parts(rb_context.index.index, rb_context.index.generation);
 		if let Some(rb) = physics.bodies.get_mut(handle) {
-			rb.apply_torque_impulse(vector![new.x as f32, new.y as f32, new.z as f32], true);
+			rb.apply_torque_impulse(Vector::new(new.x as f32, new.y as f32, new.z as f32), true);
 
 			Ok(())
 		} else {
@@ -592,7 +591,7 @@ pub mod jni {
 	use rapier3d::dynamics::RigidBodyType;
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_rigidBodyExistsForEntity(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_rigidBodyExistsForEntity(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -619,7 +618,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyMode(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyMode(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -650,7 +649,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyMode(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyMode(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -674,7 +673,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyGravityScale(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyGravityScale(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -699,7 +698,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyGravityScale(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyGravityScale(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -723,7 +722,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLinearDamping(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLinearDamping(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -748,7 +747,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLinearDamping(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLinearDamping(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -772,7 +771,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyAngularDamping(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyAngularDamping(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -797,7 +796,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyAngularDamping(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyAngularDamping(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -821,7 +820,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodySleep(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodySleep(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -846,7 +845,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodySleep(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodySleep(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -870,7 +869,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyCcdEnabled(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyCcdEnabled(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -895,7 +894,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyCcdEnabled(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyCcdEnabled(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -919,7 +918,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLinearVelocity(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLinearVelocity(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -953,7 +952,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLinearVelocity(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLinearVelocity(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -983,7 +982,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyAngularVelocity(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyAngularVelocity(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -1017,7 +1016,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyAngularVelocity(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyAngularVelocity(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -1047,7 +1046,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLockTranslation(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLockTranslation(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -1081,7 +1080,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLockTranslation(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLockTranslation(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -1111,7 +1110,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLockRotation(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLockRotation(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -1145,7 +1144,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLockRotation(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLockRotation(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -1175,7 +1174,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyChildren(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyChildren(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -1227,7 +1226,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_applyImpulse(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_applyImpulse(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -1254,7 +1253,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub fn Java_com_dropbear_physics_RigidBodyNative_applyTorqueImpulse(
+	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_applyTorqueImpulse(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
diff --git a/eucalyptus-core/src/properties.rs b/eucalyptus-core/src/properties.rs
index 6872c89..35e75d7 100644
--- a/eucalyptus-core/src/properties.rs
+++ b/eucalyptus-core/src/properties.rs
@@ -221,7 +221,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_customPropertiesExistsForEntity(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_customPropertiesExistsForEntity(
         _env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -238,7 +238,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_getStringProperty(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_getStringProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -258,7 +258,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_getIntProperty(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_getIntProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -279,7 +279,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_getLongProperty(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_getLongProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -300,7 +300,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_getDoubleProperty(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_getDoubleProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -321,7 +321,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_getFloatProperty(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_getFloatProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -342,7 +342,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_getBoolProperty(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_getBoolProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -363,7 +363,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_getVec3Property(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_getVec3Property(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -386,7 +386,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_setStringProperty(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_setStringProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -405,7 +405,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_setIntProperty(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_setIntProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -423,7 +423,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_setLongProperty(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_setLongProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -441,7 +441,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_setFloatProperty(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_setFloatProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -459,7 +459,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_setDoubleProperty(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_setDoubleProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -477,7 +477,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_setBoolProperty(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_setBoolProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -495,7 +495,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_CustomPropertiesNative_setVec3Property(
+    pub extern "system" fn Java_com_dropbear_components_CustomPropertiesNative_setVec3Property(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
diff --git a/eucalyptus-core/src/runtime.rs b/eucalyptus-core/src/runtime.rs
index 9c571ea..e2cceee 100644
--- a/eucalyptus-core/src/runtime.rs
+++ b/eucalyptus-core/src/runtime.rs
@@ -10,7 +10,7 @@ use semver::Version;
 /// This is different to [`SceneSettings`], which contains settings for ONLY
 /// that specific scene. This is for any configurations of the project during its runtime,
 /// such as initial scene and stuff like that.
-#[derive(bincode::Decode, bincode::Encode, serde::Serialize, serde::Deserialize, Debug, Clone)]
+#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
 pub struct RuntimeSettings {
     /// The first scene that shows up when redback-runtime is ran. 
     /// 
@@ -37,7 +37,7 @@ impl Default for RuntimeSettings {
 }
 
 /// A struct that represents the authors and creators of the eucalyptus project.
-#[derive(bincode::Decode, bincode::Encode, serde::Serialize, serde::Deserialize, Debug, Clone)]
+#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
 pub struct Authoring {
     /// The team behind the game
     pub developer: String,
@@ -55,38 +55,31 @@ impl Default for Authoring {
 ///
 /// Often stored as a single .eupak file, it contains all the scenes and the references of different
 /// resources.
-#[derive(bincode::Decode, bincode::Encode, serde::Serialize, serde::Deserialize, Clone)]
+#[derive(serde::Serialize, serde::Deserialize, Clone)]
 pub struct RuntimeProjectConfig {
     /// The name of the project
-    #[bincode(with_serde)]
     pub project_name: String,
 
     /// The initial/first scene that will show up. 
     /// 
     /// Access to other scenes are done with the game's scripting. 
-    #[bincode(with_serde)]
     pub initial_scene: String,
 
     /// Authors and creators of the game
-    #[bincode(with_serde)]
     pub authors: Authoring,
 
     /// The version of dropbear engine and eucalyptus-editor.
     ///
     /// dropbear and eucalyptus all share the same semver version.
-    #[bincode(with_serde)]
     pub editor_version: Version,
 
     /// The version of the project. By default, it returns `0.1.0` if none has been specified.
-    #[bincode(with_serde)]
     pub project_version: Version,
 
     /// Any specific settings to do with the runtime.
-    #[bincode(with_serde)]
     pub runtime_settings: RuntimeSettings,
 
     /// All scenes that are available in the project.
-    #[bincode(with_serde)]
     pub scenes: Vec<SceneConfig>,
 }
 
diff --git a/eucalyptus-core/src/scene.rs b/eucalyptus-core/src/scene.rs
index 744660b..64265e6 100644
--- a/eucalyptus-core/src/scene.rs
+++ b/eucalyptus-core/src/scene.rs
@@ -27,6 +27,7 @@ use std::fs;
 use std::path::{Path, PathBuf};
 use std::sync::Arc;
 use crossbeam_channel::Sender;
+use hecs::Entity;
 use crate::physics::collider::ColliderGroup;
 use crate::physics::kcc::KCC;
 use crate::physics::PhysicsState;
@@ -51,8 +52,7 @@ impl SceneEntity {
         entity: hecs::Entity,
         registry: &ComponentRegistry,
     ) -> Option<Self> {
-        let label = if let Ok(mut q) = world.query_one::<&Label>(entity)
-            && let Some(label) = q.get()
+        let label = if let Ok(label) = world.query_one::<&Label>(entity).get()
         {
             label.clone()
         } else {
@@ -477,34 +477,46 @@ impl SceneConfig {
             let entity = world.spawn(builder.build());
 
             if has_entity_transform {
-                if let Ok(mut query) = world.query_one::<(
+                if let Ok((
+                              entity_transform, 
+                              renderer_opt, 
+                              light_opt, 
+                              light_comp_opt
+                          )) = world.query_one::<(
                     &EntityTransform,
                     Option<&mut MeshRenderer>,
                     Option<&mut EngineLight>,
                     Option<&mut LightComponent>,
-                )>(entity)
+                )>(entity).get()
                 {
-                    if let Some((entity_transform, renderer_opt, light_opt, light_comp_opt)) =
-                        query.get()
-                    {
-                        let transform = entity_transform.sync();
+                    let transform = entity_transform.sync();
 
-                        if let Some(renderer) = renderer_opt {
-                            renderer.update(&transform);
-                            log::debug!("Updated renderer transform for '{}'", label_for_logs);
-                        }
+                    if let Some(renderer) = renderer_opt {
+                        renderer.update(&transform);
+                        log::debug!("Updated renderer transform for '{}'", label_for_logs);
+                    }
 
-                        if let (Some(light), Some(light_comp)) = (light_opt, light_comp_opt) {
-                            light.update(graphics.as_ref(), light_comp, &transform);
-                            log::debug!("Updated light transform for '{}'", label_for_logs);
-                        }
+                    if let (Some(light), Some(light_comp)) = (light_opt, light_comp_opt) {
+                        light.update(graphics.as_ref(), light_comp, &transform);
+                        log::debug!("Updated light transform for '{}'", label_for_logs);
                     }
                 }
             }
 
             // adding to physics
-            if let Ok(mut q) = world.query_one::<(&Label, &EntityTransform, Option<&mut RigidBody>, Option<&mut ColliderGroup>, Option<&mut KCC>)>(entity)
-                && let Some((label, e_trans, rigid, col_group, kcc)) = q.get() {
+            if let Ok((
+                  label, 
+                  e_trans, 
+                  rigid, 
+                  col_group, 
+                  kcc
+              )) = world.query_one::<(
+                &Label, 
+                &EntityTransform, 
+                Option<&mut RigidBody>, 
+                Option<&mut ColliderGroup>, 
+                Option<&mut KCC>
+            )>(entity).get() {
 
                 // rigidbody
                 if let Some(body) = rigid {
@@ -583,16 +595,12 @@ impl SceneConfig {
 
             let mut local_insert_one: Option<hecs::Entity> = None;
 
-            match world.query_one::<&mut Children>(parent_entity) {
-                Ok(mut parent_query) => {
-                    if let Some(child_component) = parent_query.get() {
-                        child_component.clear();
-                        child_component
-                            .children_mut()
-                            .extend(resolved_children.iter().copied());
-                    } else {
-                        local_insert_one = Some(parent_entity);
-                    }
+            match world.query_one::<&mut Children>(parent_entity).get() {
+                Ok(child_component) => {
+                    child_component.clear();
+                    child_component
+                        .children_mut()
+                        .extend(resolved_children.iter().copied());
                 }
                 Err(e) => {
                     log::warn!(
@@ -630,7 +638,7 @@ impl SceneConfig {
                 log::info!("No lights in scene, spawning default light");
 
                 let legacy_lights: Vec<hecs::Entity> = world
-                    .query::<&Label>()
+                    .query::<(Entity, &Label)>()
                     .iter()
                     .filter_map(|(entity, label)| {
                         if label.as_str() == "Default Light" {
@@ -704,9 +712,9 @@ impl SceneConfig {
             if is_play_mode {
                 log::debug!("Running in play mode");
                 let starting_camera = world
-                    .query::<(&Camera, &CameraComponent)>()
+                    .query::<(Entity, &Camera, &CameraComponent)>()
                     .iter()
-                    .find_map(|(entity, (_, component))| {
+                    .find_map(|(entity, _, component)| {
                         if component.starting_camera {
                             log::debug!("Found starting camera: {:?}", entity);
                             Some(entity)
@@ -724,9 +732,9 @@ impl SceneConfig {
             } else {
                 let debug_camera = {
                     world
-                        .query::<(&Camera, &CameraComponent)>()
+                        .query::<(Entity, &Camera, &CameraComponent)>()
                         .iter()
-                        .find_map(|(entity, (_, component))| {
+                        .find_map(|(entity, _, component)| {
                             if matches!(component.camera_type, CameraType::Debug) {
                                 log::debug!("Found debug camera: {:?}", entity);
                                 Some(entity)
@@ -744,7 +752,7 @@ impl SceneConfig {
                         log::info!("No debug or starting camera found, creating viewport camera for editor");
 
                         let legacy_cameras: Vec<hecs::Entity> = world
-                            .query::<&Label>()
+                            .query::<(Entity, &Label)>()
                             .iter()
                             .filter_map(|(entity, label)| {
                                 if label.as_str() == "Viewport Camera" {
diff --git a/eucalyptus-core/src/scene/scripting.rs b/eucalyptus-core/src/scene/scripting.rs
index e3c5db2..bf22c06 100644
--- a/eucalyptus-core/src/scene/scripting.rs
+++ b/eucalyptus-core/src/scene/scripting.rs
@@ -146,7 +146,7 @@ pub mod jni {
     use jni::JNIEnv;
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_scene_SceneManagerNative_loadSceneAsyncNative__JJLjava_lang_String_2(
+    pub extern "system" fn Java_com_dropbear_scene_SceneManagerNative_loadSceneAsyncNative__JJLjava_lang_String_2(
         mut env: JNIEnv,
         _: JClass,
         command_buffer_ptr: jlong,
@@ -190,7 +190,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_scene_SceneManagerNative_loadSceneAsyncNative__JJLjava_lang_String_2Ljava_lang_String_2(
+    pub extern "system" fn Java_com_dropbear_scene_SceneManagerNative_loadSceneAsyncNative__JJLjava_lang_String_2Ljava_lang_String_2(
         mut env: JNIEnv,
         _: JClass,
         command_buffer_ptr: jlong,
@@ -236,7 +236,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_scene_SceneManagerNative_switchToSceneImmediateNative(
+    pub extern "system" fn Java_com_dropbear_scene_SceneManagerNative_switchToSceneImmediateNative(
         mut env: JNIEnv,
         _: JClass,
         command_buffer_ptr: jlong,
@@ -254,7 +254,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_scene_SceneLoadHandleNative_getSceneLoadHandleSceneName(
+    pub extern "system" fn Java_com_dropbear_scene_SceneLoadHandleNative_getSceneLoadHandleSceneName(
         mut env: JNIEnv,
         _: JClass,
         scene_loader_handle: jlong,
@@ -284,7 +284,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_scene_SceneLoadHandleNative_switchToSceneAsync(
+    pub extern "system" fn Java_com_dropbear_scene_SceneLoadHandleNative_switchToSceneAsync(
         mut env: JNIEnv,
         _: JClass,
         command_buffer_ptr: jlong,
@@ -308,7 +308,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_scene_SceneLoadHandleNative_getSceneLoadProgress(
+    pub extern "system" fn Java_com_dropbear_scene_SceneLoadHandleNative_getSceneLoadProgress(
         mut env: JNIEnv,
         _: JClass,
         scene_loader_handle: jlong,
@@ -338,7 +338,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_scene_SceneLoadHandleNative_getSceneLoadStatus(
+    pub extern "system" fn Java_com_dropbear_scene_SceneLoadHandleNative_getSceneLoadStatus(
         mut env: JNIEnv,
         _: JClass,
         scene_loader_handle: jlong,
diff --git a/eucalyptus-core/src/scripting.rs b/eucalyptus-core/src/scripting.rs
index 1483878..4926101 100644
--- a/eucalyptus-core/src/scripting.rs
+++ b/eucalyptus-core/src/scripting.rs
@@ -625,7 +625,7 @@ impl ScriptManager {
     fn rebuild_entity_tag_database(&mut self, world: &World) -> anyhow::Result<()> {
         let mut new_map: HashMap<String, Vec<Entity>> = HashMap::new();
 
-        for (entity, script) in world.query::<&Script>().iter() {
+        for (entity, script) in world.query::<(Entity, &Script)>().iter() {
             for tag in &script.tags {
                 new_map.entry(tag.clone()).or_default().push(entity);
             }
diff --git a/eucalyptus-core/src/scripting/jni.rs b/eucalyptus-core/src/scripting/jni.rs
index a0e5923..88000fa 100644
--- a/eucalyptus-core/src/scripting/jni.rs
+++ b/eucalyptus-core/src/scripting/jni.rs
@@ -1,7 +1,6 @@
 #![allow(non_snake_case)]
 //! Deals with the Java Native Interface (JNI) with the help of the [`jni`] crate
 
-// pub mod exports;
 pub mod utils;
 
 use crate::APP_INFO;
diff --git a/eucalyptus-core/src/scripting/jni/exports.rs b/eucalyptus-core/src/scripting/jni/exports.rs
deleted file mode 100644
index a856d28..0000000
--- a/eucalyptus-core/src/scripting/jni/exports.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-pub mod components;
-pub mod DropbearEngineNative;
-pub mod InputStateNative;
-pub mod SceneNative;
-pub mod JNINative;
-mod PhysicsNative;
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/jni/exports/DropbearEngineNative.rs b/eucalyptus-core/src/scripting/jni/exports/DropbearEngineNative.rs
deleted file mode 100644
index fe5c6ec..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/DropbearEngineNative.rs
+++ /dev/null
@@ -1,39 +0,0 @@
-#![allow(non_snake_case)]
-
-use jni::JNIEnv;
-use jni::objects::JClass;
-use jni::sys::jlong;
-use crate::ptr::CommandBufferPtr;
-use crate::command::CommandBuffer;
-
-/**
- * Class:     `com_dropbear_ffi_DropbearEngineNative`
- * 
- * Method:    `quit`
- *
- * Signature: `(J)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_DropbearEngineNative_quit
- * (JNIEnv *, jclass, jlong);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_DropbearEngineNative_quit(
-    _env: JNIEnv,
-    _class: JClass,
-    command_handle: jlong,
-) {
-    let graphics = command_handle as CommandBufferPtr;
-
-    if graphics.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_DropbearEngineNative_quit] [ERROR] Graphics pointer is null"
-        );
-        panic!("NullHandle while quitting GraphicsCommand, better off to shoot with gun than to nicely ask...")
-    }
-
-    let graphics = unsafe { &*graphics };
-
-    if let Err(e) = graphics.send(CommandBuffer::Quit) {
-        panic!("Unable to send window command while quitting GraphicsCommand, better off to shoot with gun than to nicely ask... \n Error: {}", e);
-    }
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/jni/exports/InputStateNative.rs b/eucalyptus-core/src/scripting/jni/exports/InputStateNative.rs
deleted file mode 100644
index 8b68f2b..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/InputStateNative.rs
+++ /dev/null
@@ -1,563 +0,0 @@
-#![allow(non_snake_case)]
-
-use crate::ptr::{CommandBufferPtr, InputStatePtr};
-use crate::scripting::jni::utils::{java_button_to_rust, new_float_array};
-use crate::utils::keycode_from_ordinal;
-use crate::command::{CommandBuffer, WindowCommand};
-use crate::scripting::utils::button_from_ordinal;
-use jni::objects::JClass;
-use jni::objects::{JObject, JValue};
-use jni::sys::{jboolean, jfloatArray, jint, jlong, jobjectArray, JNI_FALSE};
-use jni::JNIEnv;
-
-/// **Class:** `com_dropbear_ffi_InputStateNative`  
-/// **Method:** `printInputState`  
-/// **Signature:** `(J)V`  
-///  
-/// `JNIEXPORT void JNICALL Java_com_dropbear_ffi_InputStateNative_printInputState`  
-/// `(JNIEnv *, jclass, jlong);`
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_InputStateNative_printInputState(
-    _env: JNIEnv,
-    _class: JClass,
-    input_handle: jlong,
-) {
-    let input = input_handle as InputStatePtr;
-
-    if input.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_printInputState] [ERROR] Input state pointer is null"
-        );
-        return;
-    }
-
-    let input = unsafe { &*input };
-    println!("{:#?}", input);
-}
-
-/// **Class:** `com_dropbear_ffi_InputStateNative`  
-/// **Method:** `isKeyPressed`  
-/// **Signature:** `(JI)Z`  
-///  
-/// `JNIEXPORT jboolean JNICALL Java_com_dropbear_ffi_InputStateNative_isKeyPressed`  
-/// `(JNIEnv *, jclass, jlong, jint);`
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_InputStateNative_isKeyPressed(
-    _env: JNIEnv,
-    _class: JClass,
-    input_handle: jlong,
-    key: jint,
-) -> jboolean {
-    let input = input_handle as InputStatePtr;
-    if input.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_isKeyPressed] [ERROR] Input state pointer is null"
-        );
-        return false.into();
-    }
-    let input = unsafe { &*input };
-
-    match keycode_from_ordinal(key) {
-        Some(k) => input.pressed_keys.contains(&k).into(),
-        None => {
-            println!(
-                "[Java_com_dropbear_ffi_InputStateNative_isKeyPressed] [WARN] Ordinal keycode is invalid"
-            );
-            false.into()
-        }
-    }
-}
-
-/// **Class:** `com_dropbear_ffi_InputStateNative`  
-/// **Method:** `getMousePosition`  
-/// **Signature:** `(J)[F`  
-///  
-/// `JNIEXPORT jfloatArray JNICALL Java_com_dropbear_ffi_InputStateNative_getMousePosition`  
-/// `(JNIEnv *, jclass, jlong);`
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_InputStateNative_getMousePosition(
-    mut env: JNIEnv,
-    _class: JClass,
-    input_handle: jlong,
-) -> jfloatArray {
-    let input = input_handle as InputStatePtr;
-    if input.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_getMousePosition] [ERROR] Input state pointer is null"
-        );
-        return new_float_array(&mut env, -1.0, -1.0);
-    }
-
-    let input = unsafe { &*input };
-    new_float_array(&mut env, input.mouse_pos.0 as f32, input.mouse_pos.1 as f32)
-}
-
-/// **Class:** `com_dropbear_ffi_InputStateNative`  
-/// **Method:** `isMouseButtonPressed`  
-/// **Signature:** `(JI)Z`  
-///  
-/// `JNIEXPORT jboolean JNICALL Java_com_dropbear_ffi_InputStateNative_isMouseButtonPressed`  
-/// `(JNIEnv *, jclass, jlong, jint);`
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_InputStateNative_isMouseButtonPressed(
-    _env: JNIEnv,
-    _class: JClass,
-    input_handle: jlong,
-    button: jint,
-) -> jboolean {
-    let input_ptr = input_handle as InputStatePtr;
-
-    if input_ptr.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_isMouseButtonPressed] [ERROR] Input state pointer is null"
-        );
-        return false as jboolean;
-    }
-
-    let input = unsafe { &*input_ptr };
-
-    if let Some(rust_button) = java_button_to_rust(button) {
-        input.mouse_button.contains(&rust_button) as jboolean
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_InputStateNative_isMouseButtonPressed] [ERROR] Invalid button code: {}",
-            button
-        );
-        false as jboolean
-    }
-}
-
-/// **Class:** `com_dropbear_ffi_InputStateNative`  
-/// **Method:** `getMouseDelta`  
-/// **Signature:** `(J)[F`  
-///  
-/// `JNIEXPORT jfloatArray JNICALL Java_com_dropbear_ffi_InputStateNative_getMouseDelta`  
-/// `(JNIEnv *, jclass, jlong);`
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_InputStateNative_getMouseDelta(
-    mut env: JNIEnv,
-    _class: JClass,
-    input_handle: jlong,
-) -> jfloatArray {
-    let input = input_handle as InputStatePtr;
-    if input.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_getMouseDelta] [ERROR] Input state pointer is null"
-        );
-        return new_float_array(&mut env, 0.0, 0.0);
-    }
-
-    let input = unsafe { &mut *input };
-
-    if let Some(pos) = input.mouse_delta.take() {
-        new_float_array(&mut env, pos.0 as f32, pos.1 as f32)
-    } else {
-        new_float_array(&mut env, 0.0, 0.0)
-    }
-}
-
-/// **Class:** `com_dropbear_ffi_InputStateNative`  
-/// **Method:** `isCursorLocked`  
-/// **Signature:** `(J)Z`  
-///  
-/// `JNIEXPORT jboolean JNICALL Java_com_dropbear_ffi_InputStateNative_isCursorLocked`  
-/// `(JNIEnv *, jclass, jlong);`
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_InputStateNative_isCursorLocked(
-    _env: JNIEnv,
-    _class: JClass,
-    input_handle: jlong,
-) -> jboolean {
-    let input = input_handle as InputStatePtr;
-    if input.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_isCursorLocked] [ERROR] Input state pointer is null"
-        );
-        return false as jboolean;
-    }
-
-    let input = unsafe { &*input };
-    input.is_cursor_locked as jboolean
-}
-
-/// **Class:** `com_dropbear_ffi_InputStateNative`  
-/// **Method:** `setCursorLocked`  
-/// **Signature:** `(JJZ)V`  
-///  
-/// `JNIEXPORT void JNICALL Java_com_dropbear_ffi_InputStateNative_setCursorLocked`  
-/// `(JNIEnv *, jclass, jlong, jlong, jboolean);`
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_InputStateNative_setCursorLocked(
-    _env: JNIEnv,
-    _class: JClass,
-    input_handle: jlong,
-    command_handle: jlong,
-    locked: jboolean,
-) {
-    let input = input_handle as InputStatePtr;
-    if input.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_InputStateNative_setCursorLocked] [ERROR] Input state pointer is null"
-        );
-        return;
-    }
-
-    let graphics = command_handle as CommandBufferPtr;
-    if graphics.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_InputStateNative_setCursorLocked] [ERROR] Graphics pointer is null"
-        );
-        return;
-    }
-
-    let input = unsafe { &mut *input };
-    let graphics = unsafe { &*graphics };
-
-    let is_locked = locked != 0;
-
-    if let Err(e) = graphics.send(CommandBuffer::WindowCommand(WindowCommand::WindowGrab(is_locked))) {
-        eprintln!(
-            "[Java_com_dropbear_ffi_InputStateNative_setCursorLocked] [ERROR] Unable to send window command: {}",
-            e
-        );
-        return;
-    }
-
-    input.is_cursor_locked = is_locked;
-}
-
-/// **Class:** `com_dropbear_ffi_InputStateNative`  
-/// **Method:** `getLastMousePos`  
-/// **Signature:** `(J)[F`  
-///  
-/// `JNIEXPORT jfloatArray JNICALL Java_com_dropbear_ffi_InputStateNative_getLastMousePos`  
-/// `(JNIEnv *, jclass, jlong);`
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_InputStateNative_getLastMousePos(
-    mut env: JNIEnv,
-    _class: JClass,
-    input_handle: jlong,
-) -> jfloatArray {
-    let input = input_handle as InputStatePtr;
-    if input.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_getLastMousePos] [ERROR] Input state pointer is null"
-        );
-        return new_float_array(&mut env, 0.0, 0.0);
-    }
-
-    let input = unsafe { &*input };
-    if let Some(pos) = input.last_mouse_pos {
-        new_float_array(&mut env, pos.0 as f32, pos.1 as f32)
-    } else {
-        new_float_array(&mut env, 0.0, 0.0)
-    }
-}
-
-/// **Class:** `com_dropbear_ffi_InputStateNative`  
-/// **Method:** `isCursorHidden`  
-/// **Signature:** `(J)Z`  
-///  
-/// `JNIEXPORT jboolean JNICALL Java_com_dropbear_ffi_InputStateNative_isCursorHidden`  
-/// `(JNIEnv *, jclass, jlong);`
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_InputStateNative_isCursorHidden(
-    _env: JNIEnv,
-    _class: JClass,
-    input_handle: jlong,
-) -> jboolean {
-    let input = input_handle as InputStatePtr;
-    if input.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_isCursorHidden] [ERROR] Input state pointer is null"
-        );
-        return false.into();
-    }
-    let input = unsafe { &*input };
-
-    input.is_cursor_hidden.into()
-}
-
-/// **Class:** `com_dropbear_ffi_InputStateNative`  
-/// **Method:** `setCursorHidden`  
-/// **Signature:** `(JJZ)V`  
-///  
-/// `JNIEXPORT void JNICALL Java_com_dropbear_ffi_InputStateNative_setCursorHidden`  
-/// `(JNIEnv *, jclass, jlong, jlong, jboolean);`
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_InputStateNative_setCursorHidden(
-    _env: JNIEnv,
-    _class: JClass,
-    input_handle: jlong,
-    command_handle: jlong,
-    hide: jboolean,
-) {
-    let input = input_handle as InputStatePtr;
-    if input.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_setCursorHidden] [ERROR] Input state pointer is null"
-        );
-        return;
-    }
-    let input = unsafe { &mut *input };
-
-    let graphics = command_handle as CommandBufferPtr;
-    if graphics.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_setCursorHidden] [ERROR] Graphics pointer is null"
-        );
-        return;
-    }
-    let graphics = unsafe { &*graphics };
-
-    let hide = hide != JNI_FALSE;
-
-    if let Err(e) = graphics.send(CommandBuffer::WindowCommand(WindowCommand::HideCursor(hide))) {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_setCursorHidden] [ERROR] Unable to send hide cursor command: {}",
-            e
-        );
-    }
-
-    input.is_cursor_hidden = hide;
-}
-
-/// **Class:** `com_dropbear_ffi_InputStateNative`
-/// **Method:** `getConnectedGamepads`
-/// **Signature:** `(J)[Lcom/dropbear/input/Gamepad;`
-///
-/// `JNIEXPORT jobjectArray JNICALL Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads
-///   (JNIEnv *, jclass, jlong);`
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads(
-    mut env: JNIEnv,
-    _class: JClass,
-    input_handle: jlong,
-) -> jobjectArray {
-
-    let input = input_handle as InputStatePtr;
-
-    let empty = match env.new_object_array(0, "com/dropbear/input/Gamepad", JObject::null()) {
-        Ok(arr) => arr,
-        Err(e) => {
-            println!(
-                "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Unable to allocate empty Gamepad[]: {}",
-                e
-            );
-            return std::ptr::null_mut();
-        }
-    };
-
-    if input.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Input state pointer is null"
-        );
-        return empty.into_raw();
-    }
-
-    let input = unsafe { &*input };
-
-    // Create a NativeEngine instance and bind inputHandle so Gamepad.isButtonPressed works.
-    let engine_obj = match env.new_object("com/dropbear/ffi/NativeEngine", "()V", &[]) {
-        Ok(o) => o,
-        Err(e) => {
-            println!(
-                "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Unable to create NativeEngine: {}",
-                e
-            );
-            return empty.into_raw();
-        }
-    };
-
-    if let Err(e) = env.set_field(&engine_obj, "inputHandle", "J", JValue::Long(input_handle)) {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Unable to set NativeEngine.inputHandle: {}",
-            e
-        );
-        return empty.into_raw();
-    }
-
-    let count = input.connected_gamepads.len();
-    let out = match env.new_object_array(count as i32, "com/dropbear/input/Gamepad", JObject::null()) {
-        Ok(arr) => arr,
-        Err(e) => {
-            println!(
-                "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Unable to allocate Gamepad[]: {}",
-                e
-            );
-            return empty.into_raw();
-        }
-    };
-
-    for (index, gid) in input.connected_gamepads.iter().enumerate() {
-        let id: usize = (*gid).into();
-        let (lx, ly) = input.get_left_stick(*gid);
-        let (rx, ry) = input.get_right_stick(*gid);
-
-        let ldx = match env.new_object("java/lang/Double", "(D)V", &[JValue::Double(lx as f64)]) {
-            Ok(o) => o,
-            Err(e) => {
-                println!(
-                    "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Unable to create Double for left stick x: {}",
-                    e
-                );
-                continue;
-            }
-        };
-        let ldy = match env.new_object("java/lang/Double", "(D)V", &[JValue::Double(ly as f64)]) {
-            Ok(o) => o,
-            Err(e) => {
-                println!(
-                    "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Unable to create Double for left stick y: {}",
-                    e
-                );
-                continue;
-            }
-        };
-        let rdx = match env.new_object("java/lang/Double", "(D)V", &[JValue::Double(rx as f64)]) {
-            Ok(o) => o,
-            Err(e) => {
-                println!(
-                    "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Unable to create Double for right stick x: {}",
-                    e
-                );
-                continue;
-            }
-        };
-        let rdy = match env.new_object("java/lang/Double", "(D)V", &[JValue::Double(ry as f64)]) {
-            Ok(o) => o,
-            Err(e) => {
-                println!(
-                    "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Unable to create Double for right stick y: {}",
-                    e
-                );
-                continue;
-            }
-        };
-
-        let left_vec = match env.new_object(
-            "com/dropbear/math/Vector2",
-            "(Ljava/lang/Number;Ljava/lang/Number;)V",
-            &[JValue::Object(&ldx), JValue::Object(&ldy)],
-        ) {
-            Ok(o) => o,
-            Err(e) => {
-                println!(
-                    "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Unable to create left Vector2: {}",
-                    e
-                );
-                continue;
-            }
-        };
-
-        let right_vec = match env.new_object(
-            "com/dropbear/math/Vector2",
-            "(Ljava/lang/Number;Ljava/lang/Number;)V",
-            &[JValue::Object(&rdx), JValue::Object(&rdy)],
-        ) {
-            Ok(o) => o,
-            Err(e) => {
-                println!(
-                    "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Unable to create right Vector2: {}",
-                    e
-                );
-                continue;
-            }
-        };
-
-        let gamepad_obj = match env.new_object(
-            "com/dropbear/input/Gamepad",
-            "(JLcom/dropbear/math/Vector2;Lcom/dropbear/math/Vector2;Lcom/dropbear/ffi/NativeEngine;)V",
-            &[
-                JValue::Long(id as jlong),
-                JValue::Object(&left_vec),
-                JValue::Object(&right_vec),
-                JValue::Object(&engine_obj),
-            ],
-        ) {
-            Ok(o) => o,
-            Err(e) => {
-                println!(
-                    "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Unable to create Gamepad: {}",
-                    e
-                );
-                continue;
-            }
-        };
-
-        if let Err(e) = env.set_object_array_element(&out, index as i32, gamepad_obj) {
-            println!(
-                "[Java_com_dropbear_ffi_InputStateNative_getConnectedGamepads] [ERROR] Unable to set Gamepad[] element {}: {}",
-                index, e
-            );
-        }
-    }
-
-    out.into_raw()
-}
-
-/// **Class:** `com_dropbear_ffi_InputStateNative`
-/// **Method:** `isGamepadButtonPressed`
-/// **Signature:** `(JJI)Z`
-///
-/// `JNIEXPORT jboolean JNICALL Java_com_dropbear_ffi_InputStateNative_isGamepadButtonPressed
-///   (JNIEnv *, jclass, jlong, jlong, jint);`
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_InputStateNative_isGamepadButtonPressed(
-    _env: JNIEnv,
-    _class: JClass,
-    input_handle: jlong,
-    gamepad_id: jlong,
-    button_ordinal: jint,
-) -> jboolean {
-
-    let input_ptr = input_handle as InputStatePtr;
-    if input_ptr.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_isGamepadButtonPressed] [ERROR] Input state pointer is null"
-        );
-        return false.into();
-    }
-
-    if gamepad_id < 0 {
-        println!(
-            "[Java_com_dropbear_ffi_InputStateNative_isGamepadButtonPressed] [WARN] Invalid gamepad id (negative): {}",
-            gamepad_id
-        );
-        return false.into();
-    }
-
-    let input = unsafe { &*input_ptr };
-
-    let button = match button_from_ordinal(button_ordinal) {
-        Ok(btn) => btn,
-        Err(_) => {
-            println!(
-                "[Java_com_dropbear_ffi_InputStateNative_isGamepadButtonPressed] [WARN] Invalid button ordinal: {}",
-                button_ordinal
-            );
-            return false.into();
-        }
-    };
-
-    let target_id = gamepad_id as usize;
-    let maybe_gid = input
-        .connected_gamepads
-        .iter()
-        .find(|gid| {
-            let id: usize = (**gid).into();
-            id == target_id
-        })
-        .copied();
-
-    match maybe_gid {
-        Some(gid) => input.is_button_pressed(gid, button).into(),
-        None => {
-            println!(
-                "[Java_com_dropbear_ffi_InputStateNative_isGamepadButtonPressed] [WARN] Gamepad id {} not connected",
-                gamepad_id
-            );
-            false.into()
-        }
-    }
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/jni/exports/JNINative.rs b/eucalyptus-core/src/scripting/jni/exports/JNINative.rs
deleted file mode 100644
index 059b726..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/JNINative.rs
+++ /dev/null
@@ -1,120 +0,0 @@
-#![allow(non_snake_case)]
-
-use hecs::World;
-use jni::JNIEnv;
-use jni::objects::{JClass, JString};
-use jni::sys::jlong;
-use dropbear_engine::utils::ResourceReference;
-use crate::ptr::AssetRegistryPtr;
-use crate::states::Label;
-
-
-/**
- * Class:     `com_dropbear_ffi_JNINative`
- *
- * Method:    `getEntity`
- *
- * Signature: `(JLjava/lang/String;)J`
- *
- * `JNIEXPORT jlong JNICALL Java_com_dropbear_ffi_JNINative_getEntity
- * (JNIEnv *, jclass, jlong, jstring);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_JNINative_getEntity(
-    mut env: JNIEnv,
-    _obj: JClass,
-    world_handle: jlong,
-    label: JString,
-) -> jlong {
-    let label_jni_result = env.get_string(&label);
-    let label_str = match label_jni_result {
-        Ok(java_string) => match java_string.to_str() {
-            Ok(rust_str) => rust_str.to_string(),
-            Err(e) => {
-                println!(
-                    "[Java_com_dropbear_ffi_JNINative_getEntity] [ERROR] Failed to convert Java string to Rust string: {}",
-                    e
-                );
-                return -1;
-            }
-        },
-        Err(e) => {
-            println!(
-                "[Java_com_dropbear_ffi_JNINative_getEntity] [ERROR] Failed to get string from JNI: {}",
-                e
-            );
-            return -1;
-        }
-    };
-
-    let world = world_handle as *mut World;
-
-    if world.is_null() {
-        println!("[Java_com_dropbear_ffi_JNINative_getEntity] [ERROR] World pointer is null");
-        return -1;
-    }
-
-    let world = unsafe { &mut *world };
-
-    for (id, entity_label) in world.query::<&Label>().iter() {
-        if entity_label.as_str() == label_str {
-            return id.to_bits().get() as jlong;
-        }
-    }
-    0
-}
-
-/**
- * Class:     `com_dropbear_ffi_JNINative`
- *
- * Method:    `getAsset`
- *
- * Signature: `(JLjava/lang/String;)J`
- *
- * `JNIEXPORT jlong JNICALL Java_com_dropbear_ffi_JNINative_getAsset
- * (JNIEnv *, jclass, jlong, jstring);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_JNINative_getAsset(
-    mut env: JNIEnv,
-    _class: JClass,
-    asset_handle: jlong,
-    euca_uri: JString,
-) -> jlong {
-    let asset = asset_handle as AssetRegistryPtr;
-    if asset.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_JNINative_getAsset] [ERROR] Asset registry pointer is null"
-        );
-        return -1;
-    }
-
-    let asset = unsafe { &*asset };
-
-    let jni_result = env.get_string(&euca_uri);
-    let str = match jni_result {
-        Ok(java_string) => match java_string.to_str() {
-            Ok(rust_str) => rust_str.to_string(),
-            Err(e) => {
-                println!(
-                    "[Java_com_dropbear_ffi_JNINative_getAsset] [ERROR] Failed to convert Java string to Rust string: {}",
-                    e
-                );
-                return -1;
-            }
-        },
-        Err(e) => {
-            println!(
-                "[Java_com_dropbear_ffi_JNINative_getAsset] [ERROR] Failed to get string from JNI: {}",
-                e
-            );
-            return -1;
-        }
-    };
-    if let Ok(res) = ResourceReference::from_euca_uri(str)
-        && let Some(asset_handle) = asset.get_handle_from_reference(&res)
-    {
-        return asset_handle.raw() as jlong;
-    };
-    0 as jlong
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/jni/exports/PhysicsNative.rs b/eucalyptus-core/src/scripting/jni/exports/PhysicsNative.rs
deleted file mode 100644
index 51cca03..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/PhysicsNative.rs
+++ /dev/null
@@ -1,116 +0,0 @@
-use hecs::World;
-use jni::JNIEnv;
-use jni::objects::{JClass, JObject};
-use jni::sys::{jboolean, jlong, jobject, jobjectArray};
-use crate::{convert_jlong_to_entity, convert_ptr};
-use crate::physics::PhysicsState;
-use crate::physics::rigidbody::RigidBody;
-
-/**
- * Class:     `com_dropbear_ffi_PhysicsNative`
- *
- * Method:    `setPhysicsEnabled`
- *
- * Signature: `(JJJZ)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_PhysicsNative_setPhysicsEnabled
- * (JNIEnv *, jclass, jlong, jlong, jlong, jboolean);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_PhysicsNative_setPhysicsEnabled(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_ptr: jlong,
-    physics_handle: jlong,
-    entity_id: jlong,
-    enabled: jboolean,
-) {
-    let world = convert_ptr!(mut world_ptr => World);
-    let physics = convert_ptr!(mut physics_handle => PhysicsState);
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    todo!()
-}
-
-/**
- * Class:     `com_dropbear_ffi_PhysicsNative`
- *
- * Method:    `isPhysicsEnabled`
- *
- * Signature: `(JJJ)Z`
- *
- * `JNIEXPORT jboolean JNICALL Java_com_dropbear_ffi_PhysicsNative_isPhysicsEnabled
- * (JNIEnv *, jclass, jlong, jlong, jlong);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_PhysicsNative_isPhysicsEnabled(
-    _env: JNIEnv,
-    _class: JClass,
-    world_ptr: jlong,
-    physics_handle: jlong,
-    entity_id: jlong,
-) -> jboolean {
-    let world = convert_ptr!(mut world_ptr => World);
-    let physics = convert_ptr!(mut physics_handle => PhysicsState);
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    if let Ok(rb) = world.get::<&RigidBody>(entity) {
-        if rb.disable_physics {
-            false.into()
-        } else {
-            true.into()
-        }
-    } else {
-        false.into()
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_PhysicsNative`
- *
- * Method:    `getRigidBody`
- *
- * Signature: `(JJJ)Lcom/dropbear/physics/RigidBody;`
- *
- * `JNIEXPORT jobject JNICALL Java_com_dropbear_ffi_PhysicsNative_getRigidBody
- * (JNIEnv *, jclass, jlong, jlong, jlong);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_PhysicsNative_getRigidBody(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_ptr: jlong,
-    physics_handle: jlong,
-    entity_id: jlong,
-) -> jobject {
-    let world = convert_ptr!(mut world_ptr => World);
-    let physics = convert_ptr!(mut physics_handle => PhysicsState);
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    todo!()
-}
-
-/**
- * Class:     `com_dropbear_ffi_PhysicsNative`
- *
- * Method:    `getAllColliders`
- *
- * Signature: `(JJ)[Lcom/dropbear/physics/Collider;`
- *
- * `JNIEXPORT jobjectArray JNICALL Java_com_dropbear_ffi_PhysicsNative_getAllColliders
- * (JNIEnv *, jclass, jlong, jlong, jlong);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_PhysicsNative_getAllColliders(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_ptr: jlong,
-    physics_handle: jlong,
-    entity_id: jlong,
-) -> jobjectArray {
-    let world = convert_ptr!(mut world_ptr => World);
-    let physics = convert_ptr!(mut physics_handle => PhysicsState);
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    todo!()
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/jni/exports/SceneNative.rs b/eucalyptus-core/src/scripting/jni/exports/SceneNative.rs
deleted file mode 100644
index 73d0b33..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/SceneNative.rs
+++ /dev/null
@@ -1,329 +0,0 @@
-#![allow(non_snake_case, dead_code)]
-
-use jni::JNIEnv;
-use jni::objects::{JClass, JObject, JString, JThrowable, JValue};
-use jni::sys::{jlong, jobject};
-use crate::command::CommandBuffer;
-use crate::ptr::{CommandBufferPtr, SceneLoaderPtr};
-use crate::scene::loading::{SceneLoadHandle as CoreSceneLoadHandle};
-use crate::states::WorldLoadingStatus;
-
-fn throw_premature_scene_switch(env: &mut JNIEnv, message: &str) -> Result<(), jni::errors::Error> {
-    let ex_class = env.find_class("com/dropbear/exception/PrematureSceneSwitchException")?;
-    let msg = env.new_string(message)?;
-    let ex_obj = env.new_object(
-        ex_class,
-        "(Ljava/lang/String;Ljava/lang/Throwable;)V",
-        &[JValue::Object(&JObject::from(msg)), JValue::Object(&JObject::null())],
-    )?;
-    let ex_throwable = JThrowable::from(ex_obj);
-    env.throw(ex_throwable)?;
-    Ok(())
-}
-
-/**
- * Class: `com_dropbear_ffi_SceneNative`
- *
- * Method: `loadSceneAsync`
- *
- * Signature: `(JJLjava/lang/String;Lcom/dropbear/ffi/NativeEngine;)Lcom/dropbear/scene/SceneLoadHandle;`
- *
- * `JNIEXPORT jobject JNICALL Java_com_dropbear_ffi_SceneNative_loadSceneAsync__JJLjava_lang_String_2Lcom_dropbear_ffi_NativeEngine_2`
- * `(JNIEnv *, jclass, jlong, jstring, jobject);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_SceneNative_loadSceneAsync__JJLjava_lang_String_2Lcom_dropbear_ffi_NativeEngine_2(
-    mut env: JNIEnv,
-    _class: JClass,
-    command_buffer_handle: jlong,
-    scene_loader_ptr: jlong,
-    scene_name: JString,
-    native_engine: JObject,
-) -> jobject {
-    let command_buffer_ptr = command_buffer_handle as CommandBufferPtr;
-    let scene_loader_ptr = scene_loader_ptr as SceneLoaderPtr;
-
-    if command_buffer_ptr.is_null() || scene_loader_ptr.is_null() {
-        return JObject::null().into_raw();
-    }
-
-    let command_buffer = unsafe { &*command_buffer_ptr };
-    let scene_loader = unsafe { &*scene_loader_ptr };
-
-    let scene_name_str: String = match env.get_string(&scene_name) {
-        Ok(s) => s.into(),
-        Err(_) => return JObject::null().into_raw(),
-    };
-
-    // removes need for double scene loading
-    let id = {
-        let loader_guard = scene_loader.lock();
-        if let Some(existing_id) = loader_guard.find_pending_id_by_name(&scene_name_str) {
-            existing_id
-        } else {
-            drop(loader_guard);
-            let mut loader_guard = scene_loader.lock();
-            let new_id = loader_guard.register_load(scene_name_str.clone());
-
-            let core_handle = CoreSceneLoadHandle {
-                id: new_id,
-                scene_name: scene_name_str.clone(),
-            };
-
-            if command_buffer.try_send(CommandBuffer::LoadSceneAsync(core_handle)).is_err() {
-                return JObject::null().into_raw();
-            }
-
-            new_id
-        }
-    };
-
-    let cls = match env.find_class("com/dropbear/scene/SceneLoadHandle") {
-        Ok(c) => c,
-        Err(_) => return JObject::null().into_raw(),
-    };
-
-    let obj = match env.new_object(cls, "(JLjava/lang/String;Lcom/dropbear/ffi/NativeEngine;)V", &[
-        JValue::Long(id as jlong),
-        JValue::Object(&scene_name),
-        JValue::Object(&native_engine),
-    ]) {
-        Ok(o) => o,
-        Err(_) => return JObject::null().into_raw(),
-    };
-
-    obj.into_raw()
-}
-
-/**
- * Class: `com_dropbear_ffi_SceneNative`
- *
- * Method: `loadSceneAsync`
- *
- * Signature: `(JJLjava/lang/String;Ljava/lang/String;Lcom/dropbear/ffi/NativeEngine;)Lcom/dropbear/scene/SceneLoadHandle;`
- *
- * `JNIEXPORT jobject JNICALL Java_com_dropbear_ffi_SceneNative_loadSceneAsync__JJLjava_lang_String_2Ljava_lang_String_2Lcom_dropbear_ffi_NativeEngine_2`
- * `(JNIEnv *, jclass, jlong, jstring, jstring, jobject);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_SceneNative_loadSceneAsync__JJLjava_lang_String_2Ljava_lang_String_2Lcom_dropbear_ffi_NativeEngine_2(
-    _env: JNIEnv,
-    _class: JClass,
-    _command_buffer_handle: jlong,
-    _scene_loader_ptr: jlong,
-    _scene_name: JString,
-    _loading_scene_name: JString,
-    _native_engine: JObject,
-) -> jobject {
-    todo!("Not implemented yet")
-}
-
-/**
- * Class: `com_dropbear_ffi_SceneNative`
- *
- * Method: `switchToSceneAsync`
- *
- * Signature: `(JLcom/dropbear/scene/SceneLoadHandle;)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_SceneNative_switchToSceneAsync`
- * `(JNIEnv *, jclass, jlong, jobject);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_SceneNative_switchToSceneAsync(
-    mut env: JNIEnv,
-    _class: JClass,
-    command_buffer_ptr: jlong,
-    handle: JObject,
-) {
-    let command_buffer_ptr = command_buffer_ptr as CommandBufferPtr;
-    if command_buffer_ptr.is_null() {
-        return;
-    }
-    let command_buffer = unsafe { &*command_buffer_ptr };
-
-    let id = match env.get_field(&handle, "id", "J") {
-        Ok(v) => v.j().unwrap(),
-        Err(_) => return,
-    };
-    
-    let name_obj = match env.get_field(&handle, "sceneName", "Ljava/lang/String;") {
-        Ok(v) => v.l().unwrap(),
-        Err(_) => return,
-    };
-    
-    let name_str: String = match env.get_string(&JString::from(name_obj)) {
-        Ok(s) => s.into(),
-        Err(_) => return,
-    };
-
-    let core_handle = CoreSceneLoadHandle {
-        id: id as u64,
-        scene_name: name_str,
-    };
-
-    let _ = command_buffer.try_send(CommandBuffer::SwitchToAsync(core_handle));
-}
-
-/**
- * Class: `com_dropbear_ffi_SceneNative`
- *
- * Method: `switchToSceneImmediate`
- *
- * Signature: `(JLjava/lang/String;)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_SceneNative_switchToSceneImmediate`
- * `(JNIEnv *, jclass, jlong, jstring);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_SceneNative_switchToSceneImmediate(
-    mut env: JNIEnv,
-    _class: JClass,
-    command_buffer_ptr: jlong,
-    scene_name: JString,
-) {
-    let command_buffer_ptr = command_buffer_ptr as CommandBufferPtr;
-    if command_buffer_ptr.is_null() {
-        return;
-    }
-    let command_buffer = unsafe { &*command_buffer_ptr };
-
-    let scene_name_str: String = match env.get_string(&scene_name) {
-        Ok(s) => s.into(),
-        Err(_) => return,
-    };
-
-    let _ = command_buffer.try_send(CommandBuffer::SwitchSceneImmediate(scene_name_str));
-}
-
-/**
- * Class: `com_dropbear_ffi_SceneNative`
- *
- * Method: `getSceneLoadProgress`
- *
- * Signature: `(JLcom/dropbear/scene/SceneLoadHandle;)Lcom/dropbear/utils/Progress;`
- *
- * `JNIEXPORT jobject JNICALL Java_com_dropbear_ffi_SceneNative_getSceneLoadProgress`
- * `(JNIEnv *, jclass, jlong, jobject);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_SceneNative_getSceneLoadProgress(
-    mut env: JNIEnv,
-    _class: JClass,
-    scene_loader_ptr: jlong,
-    handle: JObject, // SceneLoadHandle
-) -> jobject {
-    let scene_loader_ptr = scene_loader_ptr as SceneLoaderPtr;
-    if scene_loader_ptr.is_null() {
-        return JObject::null().into_raw();
-    }
-    let scene_loader = unsafe { &*scene_loader_ptr };
-    
-    let id = match env.get_field(&handle, "id", "J") {
-        Ok(v) => v.j().unwrap(),
-        Err(_) => return JObject::null().into_raw(),
-    };
-
-    let mut loader = scene_loader.lock();
-    if let Some(entry) = loader.get_entry_mut(id as u64) {
-        if let Some(rx) = &entry.status {
-            while let Ok(status) = rx.try_recv() {
-                match status {
-                    WorldLoadingStatus::Idle => {
-                        entry.progress.message = "Idle".to_string();
-                    },
-                    WorldLoadingStatus::LoadingEntity { index, name, total } => {
-                        entry.progress.current = index;
-                        entry.progress.total = total;
-                        entry.progress.message = format!("Loading entity: {}", name);
-                    },
-                    WorldLoadingStatus::Completed => {
-                        entry.progress.current = entry.progress.total;
-                        entry.progress.message = "Completed".to_string();
-                    }
-                }
-            }
-        }
-
-        let p = &entry.progress;
-        
-        let cls = match env.find_class("com/dropbear/utils/Progress") {
-            Ok(c) => c,
-            Err(_) => return JObject::null().into_raw(),
-        };
-        
-        let msg = match env.new_string(&p.message) {
-            Ok(s) => s,
-            Err(_) => return JObject::null().into_raw(),
-        };
-
-        let obj = match env.new_object(cls, "(DDLjava/lang/String;)V", &[
-            JValue::Double(p.current as f64),
-            JValue::Double(p.total as f64),
-            JValue::Object(&msg),
-        ]) {
-            Ok(o) => o,
-            Err(_) => return JObject::null().into_raw(),
-        };
-        
-        obj.into_raw()
-    } else {
-        JObject::null().into_raw()
-    }
-}
-
-/**
- * Class: `com_dropbear_ffi_SceneNative`
- *
- * Method: `getSceneLoadStatus`
- *
- * Signature: `(JLcom/dropbear/scene/SceneLoadHandle;)Lcom/dropbear/scene/SceneLoadStatus;`
- *
- * `JNIEXPORT jobject JNICALL Java_com_dropbear_ffi_SceneNative_getSceneLoadStatus`
- * `(JNIEnv *, jclass, jlong, jobject);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_SceneNative_getSceneLoadStatus(
-    mut env: JNIEnv,
-    _class: JClass,
-    scene_loader_ptr: jlong,
-    handle: JObject, // SceneLoadHandle
-) -> jobject {
-    let scene_loader_ptr = scene_loader_ptr as SceneLoaderPtr;
-    if scene_loader_ptr.is_null() {
-        return JObject::null().into_raw();
-    }
-    let scene_loader = unsafe { &*scene_loader_ptr };
-    
-    let id = match env.get_field(&handle, "id", "J") {
-        Ok(v) => v.j().unwrap(),
-        Err(_) => return JObject::null().into_raw(),
-    };
-
-    let loader = scene_loader.lock();
-    if let Some(entry) = loader.get_entry(id as u64) {
-        let status_str = match entry.result {
-            crate::scene::loading::SceneLoadResult::Pending => "PENDING",
-            crate::scene::loading::SceneLoadResult::Success => "READY",
-            crate::scene::loading::SceneLoadResult::Error(_) => "FAILED",
-        };
-        
-        let cls = match env.find_class("com/dropbear/scene/SceneLoadStatus") {
-            Ok(c) => c,
-            Err(_) => return JObject::null().into_raw(),
-        };
-        
-        let field_id = match env.get_static_field_id(&cls, status_str, "Lcom/dropbear/scene/SceneLoadStatus;") {
-            Ok(f) => f,
-            Err(_) => return JObject::null().into_raw(),
-        };
-        
-        let obj = match env.get_static_field_unchecked(&cls, field_id, jni::signature::JavaType::Object("com/dropbear/scene/SceneLoadStatus".to_string())) {
-             Ok(v) => v.l().unwrap(),
-             Err(_) => return JObject::null().into_raw(),
-        };
-        
-        obj.into_raw()
-    } else {
-        JObject::null().into_raw()
-    }
-}
diff --git a/eucalyptus-core/src/scripting/jni/exports/components/CameraNative.rs b/eucalyptus-core/src/scripting/jni/exports/components/CameraNative.rs
deleted file mode 100644
index 5062831..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/components/CameraNative.rs
+++ /dev/null
@@ -1,539 +0,0 @@
-#![allow(non_snake_case)]
-
-use hecs::World;
-use jni::JNIEnv;
-use jni::objects::{JClass, JObject, JString, JValue};
-use jni::sys::{jlong, jobject};
-use dropbear_engine::camera::Camera;
-use crate::camera::{CameraComponent, CameraType};
-use crate::convert_jlong_to_entity;
-use crate::scripting::jni::utils::{create_vector3, extract_vector3};
-
-/**
- * Class:     `com_dropbear_ffi_components_CameraNative`
- *
- * Method:    `getCamera`
- *
- * Signature: `(JLjava/lang/String;)Lcom/dropbear/Camera;`
- *
- * `JNIEXPORT jobject JNICALL Java_com_dropbear_ffi_components_CameraNative_getCamera
- * (JNIEnv *, jclass, jlong, jstring);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CameraNative_getCamera(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    camera_name: JString,
-) -> jobject {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!("[Java_com_dropbear_ffi_components_CameraNative_getCamera] [ERROR] World pointer is null");
-        return std::ptr::null_mut();
-    }
-
-    let world = unsafe { &*world };
-
-    let label = env.get_string(&camera_name);
-    let label: String = if let Ok(str) = label {
-        str.to_string_lossy().to_string()
-    } else {
-        eprintln!("[Java_com_dropbear_ffi_components_CameraNative_getCamera] [ERROR] Failed to get camera name");
-        return std::ptr::null_mut();
-    };
-
-    if let Some((id, (cam, comp))) = world
-        .query::<(&Camera, &CameraComponent)>()
-        .iter()
-        .find(|(_, (cam, _))| cam.label == label)
-    {
-        if matches!(comp.camera_type, CameraType::Debug) {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getCamera] [WARN] Querying a CameraType::Debug is illegal, returning null"
-            );
-            return std::ptr::null_mut();
-        }
-
-        let entity_id = if let Ok(v) = env.find_class("com/dropbear/EntityId") {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getCamera] [ERROR] Unable to find EntityId class"
-            );
-            return std::ptr::null_mut();
-        };
-        let entity_id = if let Ok(v) = env.new_object(
-            entity_id,
-            "(J)V",
-            &[JValue::Long(id.to_bits().get() as i64)],
-        ) {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getCamera] [ERROR] Unable to create new entity_id object"
-            );
-            return std::ptr::null_mut();
-        };
-
-        let label = if let Ok(v) = env.new_string(cam.label.as_str()) {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getCamera] [ERROR] Unable to create new string for label"
-            );
-            return std::ptr::null_mut();
-        };
-
-        let eye = if let Ok(v) = create_vector3(&mut env, cam.eye.x, cam.eye.y, cam.eye.z) {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getCamera] [ERROR] Unable to create vector3 for eye"
-            );
-            return std::ptr::null_mut();
-        };
-
-        let target = if let Ok(v) =
-            create_vector3(&mut env, cam.target.x, cam.target.y, cam.target.z)
-        {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getCamera] [ERROR] Unable to create vector3 for target"
-            );
-            return std::ptr::null_mut();
-        };
-
-        let up = if let Ok(v) = create_vector3(&mut env, cam.up.x, cam.up.y, cam.up.z) {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getCamera] [ERROR] Unable to create vector3 for up"
-            );
-            return std::ptr::null_mut();
-        };
-
-        let class = if let Ok(v) = env.find_class("com/dropbear/Camera") {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getCamera] [ERROR] Unable to locate camera class"
-            );
-            return std::ptr::null_mut();
-        };
-
-        let camera_obj = if let Ok(v) = env.new_object(
-            class,
-            "(Ljava/lang/String;Lcom/dropbear/EntityId;Lcom/dropbear/math/Vector3;Lcom/dropbear/math/Vector3;Lcom/dropbear/math/Vector3;DDDDDDDD)V",
-            &[
-                JValue::Object(&label),
-                JValue::Object(&entity_id),
-                JValue::Object(&eye),
-                JValue::Object(&target),
-                JValue::Object(&up),
-                JValue::Double(cam.aspect),
-                JValue::Double(cam.settings.fov_y),
-                JValue::Double(cam.znear),
-                JValue::Double(cam.zfar),
-                JValue::Double(cam.yaw),
-                JValue::Double(cam.pitch),
-                JValue::Double(cam.settings.speed),
-                JValue::Double(cam.settings.sensitivity),
-            ],
-        ) {
-            v
-        } else {
-            eprintln!("[Java_com_dropbear_ffi_components_CameraNative_getCamera] [ERROR] Unable to create the camera object");
-            return std::ptr::null_mut();
-        };
-
-        return camera_obj.as_raw();
-    }
-
-    std::ptr::null_mut()
-}
-
-
-
-/**
- * Class:     `com_dropbear_ffi_components_CameraNative`
- *
- * Method:    `getAttachedCamera`
- *
- * Signature: `(JJ)Lcom/dropbear/Camera;`
- *
- * `JNIEXPORT jobject JNICALL Java_com_dropbear_ffi_components_CameraNative_getAttachedCamera
- * (JNIEnv *, jclass, jlong, jlong);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CameraNative_getAttachedCamera(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-) -> jobject {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CameraNative_getAttachedCamera] [ERROR] World pointer is null"
-        );
-        return std::ptr::null_mut();
-    }
-
-    let world = unsafe { &*world };
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    if let Ok(mut q) = world.query_one::<(&Camera, &CameraComponent)>(entity)
-        && let Some((cam, comp)) = q.get()
-    {
-        if matches!(comp.camera_type, CameraType::Debug) {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getAttachedCamera] [WARN] Querying a CameraType::Debug is illegal, returning null"
-            );
-            return std::ptr::null_mut();
-        }
-
-        let entity_id = if let Ok(v) = env.find_class("com/dropbear/EntityId") {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getAttachedCamera] [ERROR] Unable to find EntityId class"
-            );
-            return std::ptr::null_mut();
-        };
-        let entity_id = if let Ok(v) = env.new_object(
-            entity_id,
-            "(J)V",
-            &[JValue::Long(entity.to_bits().get() as i64)],
-        ) {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getAttachedCamera] [ERROR] Unable to create new entity_id object"
-            );
-            return std::ptr::null_mut();
-        };
-
-        let label = if let Ok(v) = env.new_string(cam.label.as_str()) {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getAttachedCamera] [ERROR] Unable to create new string for label"
-            );
-            return std::ptr::null_mut();
-        };
-
-        let eye = if let Ok(v) = create_vector3(&mut env, cam.eye.x, cam.eye.y, cam.eye.z) {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getAttachedCamera] [ERROR] Unable to create vector3 for eye"
-            );
-            return std::ptr::null_mut();
-        };
-
-        let target = if let Ok(v) =
-            create_vector3(&mut env, cam.target.x, cam.target.y, cam.target.z)
-        {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getAttachedCamera] [ERROR] Unable to create vector3 for target"
-            );
-            return std::ptr::null_mut();
-        };
-
-        let up = if let Ok(v) = create_vector3(&mut env, cam.up.x, cam.up.y, cam.up.z) {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getAttachedCamera] [ERROR] Unable to create vector3 for up"
-            );
-            return std::ptr::null_mut();
-        };
-
-        let class = if let Ok(v) = env.find_class("com/dropbear/Camera") {
-            v
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_getAttachedCamera] [ERROR] Unable to locate camera class"
-            );
-            return std::ptr::null_mut();
-        };
-
-        let camera_obj = if let Ok(v) = env.new_object(
-            class,
-            "(Ljava/lang/String;Lcom/dropbear/EntityId;Lcom/dropbear/math/Vector3;Lcom/dropbear/math/Vector3;Lcom/dropbear/math/Vector3;DDDDDDDD)V",
-            &[
-                JValue::Object(&label),
-                JValue::Object(&entity_id),
-                JValue::Object(&eye),
-                JValue::Object(&target),
-                JValue::Object(&up),
-                JValue::Double(cam.aspect),
-                JValue::Double(cam.settings.fov_y),
-                JValue::Double(cam.znear),
-                JValue::Double(cam.zfar),
-                JValue::Double(cam.yaw),
-                JValue::Double(cam.pitch),
-                JValue::Double(cam.settings.speed),
-                JValue::Double(cam.settings.sensitivity),
-            ],
-        ) {
-            v
-        } else {
-            eprintln!("[Java_com_dropbear_ffi_components_CameraNative_getAttachedCamera] [ERROR] Unable to create the camera object");
-            return std::ptr::null_mut();
-        };
-
-        return camera_obj.as_raw();
-    }
-
-    std::ptr::null_mut()
-}
-
-
-/**
- * Class:     `com_dropbear_ffi_components_CameraNative`
- *
- * Method:    `setCamera`
- *
- * Signature: `(JLcom/dropbear/Camera;)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_CameraNative_setCamera
- * (JNIEnv *, jclass, jlong, jobject);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CameraNative_setCamera(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    camera_obj: JObject,
-) {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!("[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] World pointer is null");
-        return;
-    }
-
-    let world = unsafe { &mut *world };
-
-    let entity_id_obj = if let Ok(v) =
-        env.call_method(&camera_obj, "getId", "()Lcom/dropbear/EntityId;", &[])
-    {
-        if let Ok(obj) = v.l() {
-            obj
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to extract EntityId object"
-            );
-            return;
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to get EntityId from camera"
-        );
-        return;
-    };
-
-    let entity_id = if let Ok(v) = env.call_method(&entity_id_obj, "getId", "()J", &[]) {
-        if let Ok(id) = v.j() {
-            id as u32
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to extract entity id value"
-            );
-            return;
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to call getId on EntityId"
-        );
-        return;
-    };
-
-    let entity = unsafe { world.find_entity_from_id(entity_id) };
-
-    let eye_obj = if let Ok(v) =
-        env.call_method(&camera_obj, "getEye", "()Lcom/dropbear/math/Vector3;", &[])
-    {
-        if let Ok(obj) = v.l() {
-            obj
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to extract eye vector"
-            );
-            return;
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to get eye from camera"
-        );
-        return;
-    };
-
-    let eye = if let Some(v) = extract_vector3(&mut env, &eye_obj) {
-        v
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to extract eye vector values"
-        );
-        return;
-    };
-
-    let target_obj = if let Ok(v) = env.call_method(
-        &camera_obj,
-        "getTarget",
-        "()Lcom/dropbear/math/Vector3;",
-        &[],
-    ) {
-        if let Ok(obj) = v.l() {
-            obj
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to extract target vector"
-            );
-            return;
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to get target from camera"
-        );
-        return;
-    };
-
-    let target = if let Some(v) = extract_vector3(&mut env, &target_obj) {
-        v
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to extract target vector values"
-        );
-        return;
-    };
-
-    let up_obj = if let Ok(v) =
-        env.call_method(&camera_obj, "getUp", "()Lcom/dropbear/math/Vector3;", &[])
-    {
-        if let Ok(obj) = v.l() {
-            obj
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to extract up vector"
-            );
-            return;
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to get up from camera"
-        );
-        return;
-    };
-
-    let up = if let Some(v) = extract_vector3(&mut env, &up_obj) {
-        v
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to extract up vector values"
-        );
-        return;
-    };
-
-    let fov_y = if let Ok(v) = env.call_method(&camera_obj, "getFov_y", "()D", &[]) {
-        if let Ok(d) = v.d() {
-            d
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to extract fov_y"
-            );
-            return;
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to get fov_y from camera"
-        );
-        return;
-    };
-
-    let znear = if let Ok(v) = env.call_method(&camera_obj, "getZnear", "()D", &[]) {
-        if let Ok(d) = v.d() {
-            d
-        } else {
-            return;
-        }
-    } else {
-        return;
-    };
-
-    let zfar = if let Ok(v) = env.call_method(&camera_obj, "getZfar", "()D", &[]) {
-        if let Ok(d) = v.d() {
-            d
-        } else {
-            return;
-        }
-    } else {
-        return;
-    };
-
-    let yaw = if let Ok(v) = env.call_method(&camera_obj, "getYaw", "()D", &[]) {
-        if let Ok(d) = v.d() {
-            d
-        } else {
-            return;
-        }
-    } else {
-        return;
-    };
-
-    let pitch = if let Ok(v) = env.call_method(&camera_obj, "getPitch", "()D", &[]) {
-        if let Ok(d) = v.d() {
-            d
-        } else {
-            return;
-        }
-    } else {
-        return;
-    };
-
-    let speed = if let Ok(v) = env.call_method(&camera_obj, "getSpeed", "()D", &[]) {
-        if let Ok(d) = v.d() {
-            d
-        } else {
-            return;
-        }
-    } else {
-        return;
-    };
-
-    let sensitivity = if let Ok(v) = env.call_method(&camera_obj, "getSensitivity", "()D", &[]) {
-        if let Ok(d) = v.d() {
-            d
-        } else {
-            return;
-        }
-    } else {
-        return;
-    };
-
-    if let Ok(mut q) = world.query_one::<&mut Camera>(entity) {
-        if let Some(cam) = q.get() {
-            cam.eye = eye.as_dvec3();
-            cam.target = target.as_dvec3();
-            cam.up = up.as_dvec3();
-            cam.settings.fov_y = fov_y;
-            cam.znear = znear;
-            cam.zfar = zfar;
-            cam.yaw = yaw;
-            cam.pitch = pitch;
-            cam.settings.speed = speed;
-            cam.settings.sensitivity = sensitivity;
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Entity does not have a Camera component"
-            );
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CameraNative_setCamera] [ERROR] Unable to query camera component"
-        );
-    }
-}
diff --git a/eucalyptus-core/src/scripting/jni/exports/components/ColliderNative.rs b/eucalyptus-core/src/scripting/jni/exports/components/ColliderNative.rs
deleted file mode 100644
index 3fbd3fa..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/components/ColliderNative.rs
+++ /dev/null
@@ -1,76 +0,0 @@
-use crate::convert_ptr;
-use crate::physics::collider::{Collider, ColliderGroup};
-use crate::physics::PhysicsState;
-use hecs::World;
-use jni::objects::{JClass, JObject};
-use jni::sys::jlong;
-use jni::JNIEnv;
-use rapier3d::na::{UnitQuaternion, Vector3};
-use rapier3d::prelude::AngVector;
-
-/**
- * Class:     `com_dropbear_ffi_components_ColliderNative`
- *
- * Method:    `setCollider`
- *
- * Signature: `(JLcom/dropbear/physics/Collider;)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_ColliderNative_setCollider
- * (JNIEnv *, jclass, jlong, jlong, jobject);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_ColliderNative_setCollider(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    physics_handle: jlong,
-    collider_obj: JObject,
-) {
-    let world = convert_ptr!(mut world_handle => World);
-    let physics = convert_ptr!(mut physics_handle => PhysicsState);
-
-    Collider::from_jni_object(&mut env, &collider_obj).and_then(|(handle, collider)| {
-        if let Some(rapier_collider) = physics.colliders.get_mut(handle) {
-            rapier_collider.set_friction(collider.friction);
-            rapier_collider.set_restitution(collider.restitution);
-            rapier_collider.set_density(collider.density);
-            rapier_collider.set_sensor(collider.is_sensor);
-
-            let translation = Vector3::from_column_slice(&collider.translation);
-            let rotation = UnitQuaternion::from_euler_angles(
-                collider.rotation[0],
-                collider.rotation[1],
-                collider.rotation[2]
-            );
-
-            rapier_collider.set_translation_wrt_parent(translation);
-            let rot = rotation.euler_angles();
-            rapier_collider.set_rotation_wrt_parent(AngVector::new(rot.0, rot.1, rot.2));
-
-            let temp_collider = collider.to_rapier();
-            rapier_collider.set_shape(temp_collider.shared_shape().clone());
-        }
-
-        if let Some(ecs_entity) = collider.entity.locate_entity(&world) {
-            if let Ok(mut group) = world.get::<&mut ColliderGroup>(ecs_entity) {
-                let mut success = false;
-                for c in group.colliders.iter_mut() {
-                    if c.id == collider.id {
-                        *c = collider.clone();
-                        success = true;
-                        break;
-                    }
-                }
-                if success {
-                    Ok(())
-                } else {
-                    Err(anyhow::anyhow!("Failed to find Collider [{}] in ColliderGroup", collider.id))
-                }
-            } else {
-                Err(anyhow::anyhow!("Failed to get ColliderGroup from ECS"))
-            }
-        } else {
-            Err(anyhow::anyhow!("Failed to locate entity in ECS"))
-        }
-    }).ok();
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/jni/exports/components/CustomPropertiesNative.rs b/eucalyptus-core/src/scripting/jni/exports/components/CustomPropertiesNative.rs
deleted file mode 100644
index 68d2dcd..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/components/CustomPropertiesNative.rs
+++ /dev/null
@@ -1,795 +0,0 @@
-#![allow(non_snake_case)]
-
-use hecs::World;
-use jni::JNIEnv;
-use jni::objects::{JClass, JPrimitiveArray, JString};
-use jni::sys::{jboolean, jdouble, jfloatArray, jint, jlong, jstring};
-use dropbear_engine::entity::MeshRenderer;
-use crate::convert_jlong_to_entity;
-use crate::states::{CustomProperties, Value};
-
-/**
- * Class:     `com_dropbear_ffi_components_CustomPropertiesNative`
- *
- * Method:    `getStringProperty`
- *
- * Signature: `(JJLjava/lang/String;)Ljava/lang/String;`
- *
- * `JNIEXPORT jstring JNICALL Java_com_dropbear_ffi_components_CustomPropertiesNative_getStringProperty
- * (JNIEnv *, jclass, jlong, jlong, jstring);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CustomPropertiesNative_getStringProperty(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    property_name: JString,
-) -> jstring {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getStringProperty] [ERROR] World pointer is null"
-        );
-        return std::ptr::null_mut();
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-    if let Ok(mut q) = world.query_one::<(&MeshRenderer, &CustomProperties)>(entity)
-        && let Some((_, props)) = q.get()
-    {
-        let string = env.get_string(&property_name);
-        let value: String = if let Ok(str) = string {
-            let value = str.to_string_lossy();
-            value.to_string()
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getStringProperty] [ERROR] Failed to get property name"
-            );
-            return std::ptr::null_mut();
-        };
-        let output = props.get_property(&value);
-        if let Some(output) = output {
-            match output {
-                Value::String(val) => match env.new_string(val) {
-                    Ok(string) => string.as_raw(),
-                    Err(e) => {
-                        eprintln!(
-                            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getStringProperty] [ERROR] Failed to create string: {}",
-                            e
-                        );
-                        std::ptr::null_mut()
-                    }
-                },
-                _ => {
-                    println!(
-                        "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getStringProperty] [WARN] Property is not a string"
-                    );
-                    std::ptr::null_mut()
-                }
-            }
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getStringProperty] [WARN] Property not found"
-            );
-            std::ptr::null_mut()
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getStringProperty] [ERROR] Failed to query entity for model properties"
-        );
-        std::ptr::null_mut()
-    }
-}
-
-
-/**
- * Fetches a [`jint`]/[`i32`] value from a key value.
- *
- * If the value does not exist, it will return `650911`, a randomly generated number
- * that is extremely specific that no one would be sane enough to use this as a property.
- *
- * Class: `com_dropbear_ffi_components_CustomPropertiesNative`
- *
- * Method: `getIntProperty`
- *
- * Signature: `(JJLjava/lang/String;)I`
- *
- * `JNIEXPORT jint JNICALL Java_com_dropbear_ffi_components_CustomPropertiesNative_getIntProperty
- * (JNIEnv *, jclass, jlong, jlong, jstring);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CustomPropertiesNative_getIntProperty(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    property_name: JString,
-) -> jint {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!("[Java_com_dropbear_ffi_components_CustomPropertiesNative_getIntProperty] [ERROR] World pointer is null");
-        return 650911;
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-    if let Ok(mut q) = world.query_one::<(&MeshRenderer, &CustomProperties)>(entity)
-        && let Some((_, props)) = q.get()
-    {
-        let string = env.get_string(&property_name);
-        let value: String = if let Ok(str) = string {
-            let value = str.to_string_lossy();
-            value.to_string()
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getIntProperty] [ERROR] Failed to get property name"
-            );
-            return 650911;
-        };
-        let output = props.get_property(&value);
-        if let Some(output) = output {
-            match output {
-                Value::Int(val) => *val as jint,
-                _ => {
-                    eprintln!(
-                        "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getIntProperty] [WARN] Property is not an int"
-                    );
-                    650911
-                }
-            }
-        } else {
-            eprintln!("[Java_com_dropbear_ffi_components_CustomPropertiesNative_getIntProperty] [WARN] Property not found");
-            650911
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getIntProperty] [ERROR] Failed to query entity for model properties"
-        );
-        650911
-    }
-}
-
-
-/**
- * Gets a [`jlong`]/[`i64`] property.
- *
- * If the value doesn't exist, it will return this value: `6509112938`. This is a random number
- * from a generator I got, and it is such a specific number that no one would ever have this number
- * in one of their properties.
- *
- * Class:     `com_dropbear_ffi_components_CustomPropertiesNative`
- *
- * Method:    `getLongProperty`
- *
- * Signature: `(JJLjava/lang/String;)J`
- *
- * `JNIEXPORT jlong JNICALL Java_com_dropbear_ffi_components_CustomPropertiesNative_getLongProperty
- * (JNIEnv *, jclass, jlong, jlong, jstring);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CustomPropertiesNative_getLongProperty(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    property_name: JString,
-) -> jlong {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getLongProperty] [ERROR] World pointer is null"
-        );
-        return 6509112938;
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-    if let Ok(mut q) = world.query_one::<(&MeshRenderer, &CustomProperties)>(entity)
-        && let Some((_, props)) = q.get()
-    {
-        let string = env.get_string(&property_name);
-        let value: String = if let Ok(str) = string {
-            let value = str.to_string_lossy();
-            value.to_string()
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getLongProperty] [ERROR] Failed to get property name"
-            );
-            return 0;
-        };
-        let output = props.get_property(&value);
-        if let Some(output) = output {
-            match output {
-                Value::Int(val) => *val as jlong,
-                _ => {
-                    eprintln!(
-                        "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getLongProperty] [WARN] Property is not a long"
-                    );
-                    6509112938
-                }
-            }
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getLongProperty] [WARN] Property not found"
-            );
-            6509112938
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getLongProperty] [ERROR] Failed to query entity for model properties"
-        );
-        6509112938
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_CustomPropertiesNative`
- *
- * Method:    `getFloatProperty`
- *
- * Signature: `(JJLjava/lang/String;)D`
- *
- * `JNIEXPORT jdouble JNICALL Java_com_dropbear_ffi_components_CustomPropertiesNative_getFloatProperty
- * (JNIEnv *, jclass, jlong, jlong, jstring);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CustomPropertiesNative_getFloatProperty(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    property_name: JString,
-) -> jdouble {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getFloatProperty] [ERROR] World pointer is null"
-        );
-        return f64::NAN;
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-    if let Ok(mut q) = world.query_one::<(&MeshRenderer, &CustomProperties)>(entity)
-        && let Some((_, props)) = q.get()
-    {
-        let string = env.get_string(&property_name);
-        let value: String = if let Ok(str) = string {
-            let value = str.to_string_lossy();
-            value.to_string()
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getFloatProperty] [ERROR] Failed to get property name"
-            );
-            return f64::NAN;
-        };
-        let output = props.get_property(&value);
-        if let Some(output) = output {
-            match output {
-                Value::Float(val) => *val as jdouble,
-                _ => {
-                    eprintln!(
-                        "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getFloatProperty] [WARN] Property is not a float"
-                    );
-                    f64::NAN
-                }
-            }
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getFloatProperty] [WARN] Property not found"
-            );
-            f64::NAN
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getFloatProperty] [ERROR] Failed to query entity for model properties"
-        );
-        f64::NAN
-    }
-}
-
-
-/**
- * Class:     `com_dropbear_ffi_components_CustomPropertiesNative`
- *
- * Method:    `getBoolProperty`
- *
- * Signature: `(JJLjava/lang/String;)Z`
- *
- * `JNIEXPORT jboolean JNICALL Java_com_dropbear_ffi_components_CustomPropertiesNative_getBoolProperty
- * (JNIEnv *, jclass, jlong, jlong, jstring);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CustomPropertiesNative_getBoolProperty(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    property_name: JString,
-) -> jboolean {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getBoolProperty] [ERROR] World pointer is null"
-        );
-        return 0;
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-    if let Ok(mut q) = world.query_one::<(&MeshRenderer, &CustomProperties)>(entity)
-        && let Some((_, props)) = q.get()
-    {
-        let string = env.get_string(&property_name);
-        let value: String = if let Ok(str) = string {
-            let value = str.to_string_lossy();
-            value.to_string()
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getBoolProperty] [ERROR] Failed to get property name"
-            );
-            return 0;
-        };
-        let output = props.get_property(&value);
-        if let Some(output) = output {
-            match output {
-                Value::Bool(val) => {
-                    if *val {
-                        1
-                    } else {
-                        0
-                    }
-                }
-                _ => {
-                    eprintln!(
-                        "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getBoolProperty] [WARN] Property is not a bool"
-                    );
-                    0
-                }
-            }
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getBoolProperty] [WARN] Property not found"
-            );
-            0
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getBoolProperty] [ERROR] Failed to query entity for model properties"
-        );
-        0
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_CustomPropertiesNative`
- *
- * Method:    `getVec3Property`
- *
- * Signature: `(JJLjava/lang/String;)[F`
- *
- * `JNIEXPORT jfloatArray JNICALL Java_com_dropbear_ffi_components_CustomPropertiesNative_getVec3Property
- * (JNIEnv *, jclass, jlong, jlong, jstring);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CustomPropertiesNative_getVec3Property(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    property_name: JString,
-) -> jfloatArray {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getVec3Property] [ERROR] World pointer is null"
-        );
-        return std::ptr::null_mut();
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-    if let Ok(mut q) = world.query_one::<(&MeshRenderer, &CustomProperties)>(entity)
-        && let Some((_, props)) = q.get()
-    {
-        let string = env.get_string(&property_name);
-        let value: String = if let Ok(str) = string {
-            let value = str.to_string_lossy();
-            value.to_string()
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getVec3Property] [ERROR] Failed to get property name"
-            );
-            return std::ptr::null_mut();
-        };
-        let output = props.get_property(&value);
-        if let Some(output) = output {
-            match output {
-                Value::Vec3([x, y, z]) => {
-                    let arr = env.new_float_array(3);
-                    if let Ok(arr) = arr {
-                        let values = [*x, *y, *z];
-                        if env.set_float_array_region(&arr, 0, &values).is_ok() {
-                            arr.into_raw()
-                        } else {
-                            eprintln!(
-                                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getVec3Property] [ERROR] Failed to set array region"
-                            );
-                            std::ptr::null_mut()
-                        }
-                    } else {
-                        eprintln!(
-                            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getVec3Property] [ERROR] Failed to create float array"
-                        );
-                        std::ptr::null_mut()
-                    }
-                }
-                _ => {
-                    eprintln!(
-                        "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getVec3Property] [WARN] Property is not a vec3"
-                    );
-                    std::ptr::null_mut()
-                }
-            }
-        } else {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getVec3Property] [WARN] Property not found"
-            );
-            std::ptr::null_mut()
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_getVec3Property] [ERROR] Failed to query entity for model properties"
-        );
-        std::ptr::null_mut()
-    }
-}
-
-
-/**
- * Class:     `com_dropbear_ffi_components_CustomPropertiesNative`
- *
- * Method:    `setStringProperty`
- *
- * Signature: `(JJLjava/lang/String;Ljava/lang/String;)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_CustomPropertiesNative_setStringProperty
- * (JNIEnv *, jclass, jlong, jlong, jstring, jstring);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CustomPropertiesNative_setStringProperty(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    property_name: JString,
-    value: JString,
-) {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setStringProperty] [ERROR] World pointer is null"
-        );
-        return;
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    let key = env.get_string(&property_name);
-    let key: String = if let Ok(str) = key {
-        let value = str.to_string_lossy();
-        value.to_string()
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setStringProperty] [ERROR] Failed to get property name"
-        );
-        return;
-    };
-
-    let string = env.get_string(&value);
-    let value: String = if let Ok(str) = string {
-        let value = str.to_string_lossy();
-        value.to_string()
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setStringProperty] [ERROR] Failed to get property name"
-        );
-        return;
-    };
-
-    if let Ok((_, props)) = world.query_one_mut::<(&MeshRenderer, &mut CustomProperties)>(entity) {
-        props.set_property(key, Value::String(value));
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setStringProperty] [ERROR] Failed to query entity for model properties"
-        );
-    }
-}
-
-
-/**
- * Class:     `com_dropbear_ffi_components_CustomPropertiesNative`
- *
- * Method:    `setIntProperty`
- *
- * Signature: `(JJLjava/lang/String;I)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_CustomPropertiesNative_setIntProperty
- * (JNIEnv *, jclass, jlong, jlong, jstring, jint);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CustomPropertiesNative_setIntProperty(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    property_name: JString,
-    value: jint,
-) {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!("[Java_com_dropbear_ffi_components_CustomPropertiesNative_setIntProperty] [ERROR] World pointer is null");
-        return;
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    let key = env.get_string(&property_name);
-    let key: String = if let Ok(str) = key {
-        let value = str.to_string_lossy();
-        value.to_string()
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setIntProperty] [ERROR] Failed to get property name"
-        );
-        return;
-    };
-
-    if let Ok((_, props)) = world.query_one_mut::<(&MeshRenderer, &mut CustomProperties)>(entity) {
-        props.set_property(key, Value::Int(value as i64));
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setIntProperty] [ERROR] Failed to query entity for model properties"
-        );
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_CustomPropertiesNative`
- *
- * Method:    `setLongProperty`
- *
- * Signature: `(JJLjava/lang/String;J)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_CustomPropertiesNative_setLongProperty
- * (JNIEnv *, jclass, jlong, jlong, jstring, jlong);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CustomPropertiesNative_setLongProperty(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    property_name: JString,
-    value: jlong,
-) {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setLongProperty] [ERROR] World pointer is null"
-        );
-        return;
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    let key = env.get_string(&property_name);
-    let key: String = if let Ok(str) = key {
-        let value = str.to_string_lossy();
-        value.to_string()
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setLongProperty] [ERROR] Failed to get property name"
-        );
-        return;
-    };
-
-    if let Ok((_, props)) = world.query_one_mut::<(&MeshRenderer, &mut CustomProperties)>(entity) {
-        props.set_property(key, Value::Int(value));
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setLongProperty] [ERROR] Failed to query entity for model properties"
-        );
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_CustomPropertiesNative`
- *
- * Method:    `setFloatProperty`
- *
- * Signature: `(JJLjava/lang/String;D)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_CustomPropertiesNative_setFloatProperty
- * (JNIEnv *, jclass, jlong, jlong, jstring, jdouble);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CustomPropertiesNative_setFloatProperty(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    property_name: JString,
-    value: jdouble,
-) {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setFloatProperty] [ERROR] World pointer is null"
-        );
-        return;
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    let key = env.get_string(&property_name);
-    let key: String = if let Ok(str) = key {
-        let value = str.to_string_lossy();
-        value.to_string()
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setFloatProperty] [ERROR] Failed to get property name"
-        );
-        return;
-    };
-
-    if let Ok((_, props)) = world.query_one_mut::<(&MeshRenderer, &mut CustomProperties)>(entity) {
-        props.set_property(key, Value::Float(value));
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setFloatProperty] [ERROR] Failed to query entity for model properties"
-        );
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_CustomPropertiesNative`
- *
- * Method:    `setBoolProperty`
- *
- * Signature: `(JJLjava/lang/String;Z)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_CustomPropertiesNative_setBoolProperty
- * (JNIEnv *, jclass, jlong, jlong, jstring, jboolean);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CustomPropertiesNative_setBoolProperty(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    property_name: JString,
-    value: jboolean,
-) {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setBoolProperty] [ERROR] World pointer is null"
-        );
-        return;
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    let key = env.get_string(&property_name);
-    let key: String = if let Ok(str) = key {
-        let value = str.to_string_lossy();
-        value.to_string()
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setBoolProperty] [ERROR] Failed to get property name"
-        );
-        return;
-    };
-
-    let bool_value = value != 0;
-
-    if let Ok((_, props)) = world.query_one_mut::<(&MeshRenderer, &mut CustomProperties)>(entity) {
-        props.set_property(key, Value::Bool(bool_value));
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setBoolProperty] [ERROR] Failed to query entity for model properties"
-        );
-    }
-}
-
-
-/**
- * Class:     `com_dropbear_ffi_components_CustomPropertiesNative`
- *
- * Method:    `setVec3Property`
- *
- * Signature: `(JJLjava/lang/String;[F)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_CustomPropertiesNative_setVec3Property
- * (JNIEnv *, jclass, jlong, jlong, jstring, jfloatArray);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_CustomPropertiesNative_setVec3Property(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    property_name: JString,
-    value: jfloatArray,
-) {
-    let world = world_handle as *mut World;
-    if world.is_null() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setVec3Property] [ERROR] World pointer is null"
-        );
-        return;
-    }
-
-    if value.is_null() {
-        eprintln!("[Java_com_dropbear_ffi_components_CustomPropertiesNative_setVec3Property] [ERROR] Value array is null");
-        return;
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-    #[allow(unused_unsafe)]
-    let val = unsafe { value };
-    let array = unsafe { JPrimitiveArray::from_raw(val) };
-
-    let key = env.get_string(&property_name);
-    let key: String = if let Ok(str) = key {
-        let value = str.to_string_lossy();
-        value.to_string()
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setVec3Property] [ERROR] Failed to get property name"
-        );
-        return;
-    };
-
-    let length = env.get_array_length(&array);
-
-    if let Ok(length) = length {
-        if length != 3 {
-            eprintln!(
-                "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setVec3Property] [ERROR] Vec3 array must have exactly 3 elements, got {}",
-                length
-            );
-            return;
-        }
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setVec3Property] [ERROR] Failed to get array length"
-        );
-        return;
-    }
-
-    let mut values = [0.0f32; 3];
-    if env.get_float_array_region(&array, 0, &mut values).is_err() {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setVec3Property] [ERROR] Failed to get array region"
-        );
-        return;
-    }
-
-    if let Ok((_, props)) = world.query_one_mut::<(&MeshRenderer, &mut CustomProperties)>(entity) {
-        props.set_property(key, Value::Vec3(values));
-    } else {
-        eprintln!(
-            "[Java_com_dropbear_ffi_components_CustomPropertiesNative_setVec3Property] [ERROR] Failed to query entity for model properties"
-        );
-    }
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/jni/exports/components/EntityTransformNative.rs b/eucalyptus-core/src/scripting/jni/exports/components/EntityTransformNative.rs
deleted file mode 100644
index 9e82d24..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/components/EntityTransformNative.rs
+++ /dev/null
@@ -1,367 +0,0 @@
-#![allow(non_snake_case)]
-
-use glam::{DQuat, DVec3};
-use hecs::World;
-use jni::JNIEnv;
-use jni::objects::{JClass, JObject, JValue};
-use jni::sys::{jclass, jlong, jobject};
-use dropbear_engine::entity::{EntityTransform, Transform};
-use crate::convert_jlong_to_entity;
-use crate::hierarchy::EntityTransformExt;
-
-/**
- * Class:     `com_dropbear_ffi_components_EntityTransformNative`
- *
- * Method:    `getTransform`
- *
- * Signature: `(JJ)Lcom/dropbear/EntityTransform;`
- *
- * `JNIEXPORT jobject JNICALL Java_com_dropbear_ffi_components_EntityTransformNative_getTransform
- * (JNIEnv *, jclass, jlong, jlong);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_EntityTransformNative_getTransform(
-    mut env: JNIEnv,
-    _class: jclass,
-    world_handle: jlong,
-    entity_id: jlong,
-) -> JObject {
-    let world = world_handle as *mut World;
-
-    if world.is_null() {
-        println!("[Java_com_dropbear_ffi_components_EntityTransformNative_getTransform] [ERROR] World pointer is null");
-        return JObject::null();
-    }
-
-    let world = unsafe { &mut *world };
-
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    if let Ok(mut q) = world.query_one::<&EntityTransform>(entity)
-        && let Some(transform) = q.get()
-    {
-        let wt = *transform.world();
-
-        let transform_class = match env.find_class("com/dropbear/math/Transform") {
-            Ok(c) => c,
-            Err(_) => return JObject::null(),
-        };
-
-        let world_transform_java = match env.new_object(
-            &transform_class,
-            "(DDDDDDDDDD)V",
-            &[
-                wt.position.x.into(),
-                wt.position.y.into(),
-                wt.position.z.into(),
-                wt.rotation.x.into(),
-                wt.rotation.y.into(),
-                wt.rotation.z.into(),
-                wt.rotation.w.into(),
-                wt.scale.x.into(),
-                wt.scale.y.into(),
-                wt.scale.z.into(),
-            ],
-        ) {
-            Ok(java_transform) => java_transform,
-            Err(_) => {
-                println!(
-                    "[Java_com_dropbear_ffi_components_EntityTransformNative_getTransform] [ERROR] Failed to create world transform object"
-                );
-                return JObject::null();
-            }
-        };
-
-        let lt = *transform.local();
-
-        let local_transform_java = match env.new_object(
-            &transform_class,
-            "(DDDDDDDDDD)V",
-            &[
-                lt.position.x.into(),
-                lt.position.y.into(),
-                lt.position.z.into(),
-                lt.rotation.x.into(),
-                lt.rotation.y.into(),
-                lt.rotation.z.into(),
-                lt.rotation.w.into(),
-                lt.scale.x.into(),
-                lt.scale.y.into(),
-                lt.scale.z.into(),
-            ],
-        ) {
-            Ok(java_transform) => java_transform,
-            Err(_) => {
-                println!(
-                    "[Java_com_dropbear_ffi_components_EntityTransformNative_getTransform] [ERROR] Failed to create local transform object"
-                );
-                return JObject::null();
-            }
-        };
-
-        let entity_transform_class = match env.find_class("com/dropbear/EntityTransform") {
-            Ok(c) => c,
-            Err(_) => return JObject::null(),
-        };
-
-        return match env.new_object(
-            &entity_transform_class,
-            "(Lcom/dropbear/math/Transform;Lcom/dropbear/math/Transform;)V",
-            &[
-                JValue::Object(&local_transform_java),
-                JValue::Object(&world_transform_java),
-            ],
-        ) {
-            Ok(java_transform) => java_transform,
-            Err(e) => {
-                println!(
-                    "[Java_com_dropbear_ffi_components_EntityTransformNative_getTransform] [ERROR] Failed to create Transform object: {}",
-                    e
-                );
-                JObject::null()
-            }
-        };
-    }
-
-    println!(
-        "[Java_com_dropbear_ffi_components_EntityTransformNative_getTransform] [ERROR] Failed to query for transform value for entity: {}",
-        entity_id
-    );
-    JObject::null()
-}
-
-/**
- * Class:     com_dropbear_ffi_components_EntityTransformNative
- *
- * Method:    propagateTransform
- *
- * Signature: (JJ)Lcom/dropbear/math/Transform;
- *
- * `JNIEXPORT jobject JNICALL Java_com_dropbear_ffi_components_EntityTransformNative_propagateTransform
- * (JNIEnv *, jclass, jlong, jlong);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_EntityTransformNative_propagateTransform(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-) -> jobject {
-    let world = world_handle as *mut World;
-
-    if world.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_components_EntityTransformNative_propagateTransform] [ERROR] World pointer is null"
-        );
-        return std::ptr::null_mut();
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    if let Ok(mut q) = world.query_one::<&mut EntityTransform>(entity) {
-        if let Some(entity_transform) = q.get() {
-            let new_world = entity_transform.propagate(world, entity);
-
-            let transform_class = match env.find_class("com/dropbear/math/Transform") {
-                Ok(c) => c,
-                Err(e) => {
-                    println!(
-                        "[Java_com_dropbear_ffi_components_EntityTransformNative_propagateTransform] [ERROR] Failed to find Transform class: {:?}",
-                        e
-                    );
-                    return std::ptr::null_mut();
-                }
-            };
-
-            let transform_obj = match env.new_object(
-                &transform_class,
-                "(DDDDDDDDDD)V",
-                &[
-                    new_world.position.x.into(),
-                    new_world.position.y.into(),
-                    new_world.position.z.into(),
-                    new_world.rotation.x.into(),
-                    new_world.rotation.y.into(),
-                    new_world.rotation.z.into(),
-                    new_world.rotation.w.into(),
-                    new_world.scale.x.into(),
-                    new_world.scale.y.into(),
-                    new_world.scale.z.into(),
-                ],
-            ) {
-                Ok(obj) => obj,
-                Err(e) => {
-                    println!(
-                        "[Java_com_dropbear_ffi_components_EntityTransformNative_propagateTransform] [ERROR] Failed to create Transform object: {:?}",
-                        e
-                    );
-                    return std::ptr::null_mut();
-                }
-            };
-
-            transform_obj.into_raw()
-        } else {
-            println!(
-                "[Java_com_dropbear_ffi_components_EntityTransformNative_propagateTransform] [ERROR] Failed to get entity transform"
-            );
-            std::ptr::null_mut()
-        }
-    } else {
-        println!(
-            "[Java_com_dropbear_ffi_components_EntityTransformNative_propagateTransform] [ERROR] Entity does not have EntityTransform component"
-        );
-        std::ptr::null_mut()
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_EntityTransformNative`
- *
- * Method:    `setTransform`
- *
- * Signature: `(JJLcom/dropbear/EntityTransform;)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_EntityTransformNative_setTransform
- * (JNIEnv *, jclass, jlong, jlong, jobject);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_EntityTransformNative_setTransform(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    entity_transform_obj: JObject,
-) {
-    let world = world_handle as *mut World;
-
-    if world.is_null() {
-        println!("[Java_com_dropbear_ffi_components_EntityTransformNative_setTransform] [ERROR] World pointer is null");
-        return;
-    }
-
-    let world = unsafe { &mut *world };
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    let extract_transform = |env: &mut JNIEnv, transform_obj: &JObject| -> Option<Transform> {
-        let get_number_field = |env: &mut JNIEnv, obj: &JObject, field_name: &str| -> f64 {
-            match env.get_field(obj, field_name, "Ljava/lang/Number;") {
-                Ok(v) => match v.l() {
-                    Ok(num_obj) => match env.call_method(&num_obj, "doubleValue", "()D", &[]) {
-                        Ok(result) => result.d().unwrap_or(0.0),
-                        Err(_) => 0.0,
-                    },
-                    Err(_) => 0.0,
-                },
-                Err(_) => 0.0,
-            }
-        };
-
-        let position_obj: JObject =
-            match env.get_field(transform_obj, "position", "Lcom/dropbear/math/Vector3;") {
-                Ok(v) => v.l().ok()?,
-                Err(_) => return None,
-            };
-
-        let rotation_obj: JObject =
-            match env.get_field(transform_obj, "rotation", "Lcom/dropbear/math/Quaternion;") {
-                Ok(v) => v.l().ok()?,
-                Err(_) => return None,
-            };
-
-        let scale_obj: JObject =
-            match env.get_field(transform_obj, "scale", "Lcom/dropbear/math/Vector3;") {
-                Ok(v) => v.l().ok()?,
-                Err(_) => return None,
-            };
-
-        let px = get_number_field(env, &position_obj, "x");
-        let py = get_number_field(env, &position_obj, "y");
-        let pz = get_number_field(env, &position_obj, "z");
-
-        let rx = get_number_field(env, &rotation_obj, "x");
-        let ry = get_number_field(env, &rotation_obj, "y");
-        let rz = get_number_field(env, &rotation_obj, "z");
-        let rw = get_number_field(env, &rotation_obj, "w");
-
-        let sx = get_number_field(env, &scale_obj, "x");
-        let sy = get_number_field(env, &scale_obj, "y");
-        let sz = get_number_field(env, &scale_obj, "z");
-
-        Some(Transform {
-            position: DVec3::new(px, py, pz),
-            rotation: DQuat::from_xyzw(rx, ry, rz, rw),
-            scale: DVec3::new(sx, sy, sz),
-        })
-    };
-
-    let local_obj: JObject = match env.get_field(
-        &entity_transform_obj,
-        "local",
-        "Lcom/dropbear/math/Transform;",
-    ) {
-        Ok(v) => v.l().unwrap_or_else(|_| JObject::null()),
-        Err(_) => {
-            println!(
-                "[Java_com_dropbear_ffi_components_EntityTransformNative_setTransform] [ERROR] Failed to get local transform field"
-            );
-            return;
-        }
-    };
-
-    let world_obj: JObject = match env.get_field(
-        &entity_transform_obj,
-        "world",
-        "Lcom/dropbear/math/Transform;",
-    ) {
-        Ok(v) => v.l().unwrap_or_else(|_| JObject::null()),
-        Err(_) => {
-            println!(
-                "[Java_com_dropbear_ffi_components_EntityTransformNative_setTransform] [ERROR] Failed to get world transform field"
-            );
-            return;
-        }
-    };
-
-    if local_obj.is_null() || world_obj.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_components_EntityTransformNative_setTransform] [ERROR] local or world transform is null"
-        );
-        return;
-    }
-
-    let local_transform = match extract_transform(&mut env, &local_obj) {
-        Some(t) => t,
-        None => {
-            println!(
-                "[Java_com_dropbear_ffi_components_EntityTransformNative_setTransform] [ERROR] Failed to extract local transform"
-            );
-            return;
-        }
-    };
-
-    let world_transform = match extract_transform(&mut env, &world_obj) {
-        Some(t) => t,
-        None => {
-            println!(
-                "[Java_com_dropbear_ffi_components_EntityTransformNative_setTransform] [ERROR] Failed to extract world transform"
-            );
-            return;
-        }
-    };
-
-    if let Ok(mut q) = world.query_one::<&mut EntityTransform>(entity) {
-        if let Some(entity_transform) = q.get() {
-            *entity_transform.local_mut() = local_transform;
-            *entity_transform.world_mut() = world_transform;
-        } else {
-            println!(
-                "[Java_com_dropbear_ffi_components_EntityTransformNative_setTransform] [ERROR] Failed to get entity transform"
-            );
-        }
-    } else {
-        println!(
-            "[Java_com_dropbear_ffi_components_EntityTransformNative_setTransform] [ERROR] Entity does not have EntityTransform component"
-        );
-    }
-}
diff --git a/eucalyptus-core/src/scripting/jni/exports/components/HierarchyNative.rs b/eucalyptus-core/src/scripting/jni/exports/components/HierarchyNative.rs
deleted file mode 100644
index 7307c98..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/components/HierarchyNative.rs
+++ /dev/null
@@ -1,132 +0,0 @@
-#![allow(non_snake_case)]
-
-use hecs::World;
-use jni::JNIEnv;
-use jni::objects::{JClass, JString};
-use jni::sys::{jlong, jlongArray};
-use crate::{convert_jlong_to_entity, convert_jstring, convert_ptr};
-use crate::hierarchy::{Children, Parent};
-use crate::ptr::WorldPtr;
-use crate::states::Label;
-
-/**
- * Class:     `com_dropbear_ffi_components_HierarchyNative`
- *
- * Method:    `getChildren`
- *
- * Signature: `(JJ)[J`
- *
- * `JNIEXPORT jlongArray JNICALL Java_com_dropbear_ffi_components_HierarchyNative_getChildren
- * (JNIEnv *, jclass, jlong, jlong);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_HierarchyNative_getChildren(
-    env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-) -> jlongArray {
-    let world = convert_ptr!(world_handle, WorldPtr => World);
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    let entities = if let Ok(mut q) = world.query_one::<&Children>(entity)
-        && let Some(children) = q.get()
-    {
-        let children = children.children();
-        let mut array = vec![];
-        for child in children {
-            array.push(child.to_bits().get() as i64);
-        }
-        array
-    } else {
-        vec![]
-    };
-
-    let array = match env.new_long_array(entities.len() as i32) {
-        Ok(array) => array,
-        Err(e) => {
-            return crate::ffi_error_return!("Unable to create a new long array: {}", e);
-        }
-    };
-
-    if let Err(e) = env.set_long_array_region(&array, 0, &entities) {
-        return crate::ffi_error_return!("Unable to populate long array: {}", e);
-    }
-
-    array.into_raw()
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_HierarchyNative`
- *
- * Method:    `getChildByLabel`
- *
- * Signature: `(JJLjava/lang/String;)J`
- *
- * `JNIEXPORT jlong JNICALL Java_com_dropbear_ffi_components_HierarchyNative_getChildByLabel
- * (JNIEnv *, jclass, jlong, jlong, jstring);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_HierarchyNative_getChildByLabel(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    label: JString,
-) -> jlong {
-    let world = convert_ptr!(world_handle, WorldPtr => World);
-    let entity = convert_jlong_to_entity!(entity_id);
-    let target = convert_jstring!(env, label);
-
-    if let Ok(mut q) = world.query_one::<&Children>(entity)
-        && let Some(children) = q.get()
-    {
-        for child in children.children() {
-            if let Ok(label) = world.get::<&Label>(entity) {
-                if label.as_str() == target {
-                    return child.to_bits().get() as jlong;
-                }
-            } else {
-                // skip if error or no entity
-                continue;
-            }
-        }
-    } else {
-        // no children exist for the entity
-        return -2 as jlong;
-    };
-
-    // no children exist with that label
-    -2 as jlong
-}
-
-/**
- * Class:     com_dropbear_ffi_components_HierarchyNative
- *
- * Method:    getParent
- *
- * Signature: (JJ)J
- * 
- * `JNIEXPORT jlong JNICALL Java_com_dropbear_ffi_components_HierarchyNative_getParent
- * (JNIEnv *, jclass, jlong, jlong);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_HierarchyNative_getParent(
-    _env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-) -> jlong {
-    let world = convert_ptr!(world_handle, WorldPtr => World);
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    if let Ok(mut q) = world.query_one::<&Parent>(entity) {
-        if let Some(parent) = q.get() {
-            parent.parent().to_bits().get() as jlong
-        } else {
-            -2 as jlong
-        }
-    } else {
-        crate::ffi_error_return!("No entity exists")
-    }
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/jni/exports/components/LabelNative.rs b/eucalyptus-core/src/scripting/jni/exports/components/LabelNative.rs
deleted file mode 100644
index 03d752f..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/components/LabelNative.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-#![allow(non_snake_case)]
-
-use hecs::World;
-use jni::JNIEnv;
-use jni::sys::{jclass, jlong, jstring};
-use crate::{convert_jlong_to_entity, ffi_error_return};
-use crate::states::Label;
-
-/**
- * Class:     `com_dropbear_ffi_components_LabelNative`
- *
- * Method:    `getEntityLabel`
- *
- * Signature: `(JJ)Ljava/lang/String;`
- *
- * `JNIEXPORT jstring JNICALL Java_com_dropbear_ffi_components_LabelNative_getEntityLabel
- * (JNIEnv *, jclass, jlong, jlong);`
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_LabelNative_getEntityLabel(
-    env: JNIEnv,
-    _class: jclass,
-    world_handle: jlong,
-    entity_id: jlong,
-) -> jstring {
-    let world = world_handle as *mut World;
-
-    if world.is_null() {
-        return ffi_error_return!("[Java_com_dropbear_ffi_JNINative_getTransform] [ERROR] World pointer is null");
-    }
-
-    let world = unsafe { &mut *world };
-
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    if let Ok(mut q) = world.query_one::<&Label>(entity) && let Some(label) = q.get() {
-        let label_str = label.as_str();
-        let Ok(str) = env.new_string(label_str) else {
-            return ffi_error_return!("[Java_com_dropbear_ffi_JNINative_getTransform] [ERROR] Unable to create new string from label");
-        };
-        return str.into_raw();
-    }
-
-    ffi_error_return!("[Java_com_dropbear_ffi_JNINative_getTransform] [ERROR] Unable to locate Label for player, likely engine bug")
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/jni/exports/components/MeshRendererNative.rs b/eucalyptus-core/src/scripting/jni/exports/components/MeshRendererNative.rs
deleted file mode 100644
index 679ac6d..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/components/MeshRendererNative.rs
+++ /dev/null
@@ -1,644 +0,0 @@
-#![allow(non_snake_case)]
-
-use std::collections::{HashMap, HashSet};
-use std::sync::Arc;
-use hecs::World;
-use jni::JNIEnv;
-use jni::objects::{JClass, JObject, JString};
-use jni::sys::{jboolean, jlong, jobjectArray, jstring};
-use parking_lot::Mutex;
-use dropbear_engine::asset::{AssetHandle, AssetRegistry, ASSET_REGISTRY};
-use dropbear_engine::asset::PointerKind::Const;
-use dropbear_engine::entity::MeshRenderer;
-use dropbear_engine::model::Model;
-use crate::{convert_jlong_to_entity, convert_jstring, convert_ptr};
-use crate::ptr::{AssetRegistryPtr, WorldPtr};
-
-/**
- * Class:     `com_dropbear_ffi_components_MeshRendererNative`
- *
- * Method:    `getModel`
- *
- * Signature: `(JJ)J`
- *
- * JNIEXPORT jlong JNICALL Java_com_dropbear_ffi_components_MeshRendererNative_getModel
- * (JNIEnv *, jclass, jlong, jlong);
-*/
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_MeshRendererNative_getModel(
-    _env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-) -> jlong {
-    let world = world_handle as WorldPtr;
-    if world.is_null() {
-        println!("[Java_com_dropbear_ffi_components_MeshRendererNative_getModel] [ERROR] World pointer is null");
-        return -1;
-    }
-
-    let world = unsafe { &*world };
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    if let Ok(mut q) = world.query_one::<&MeshRenderer>(entity)
-        && let Some(model) = q.get()
-    {
-        let handle = model.asset_handle();
-        handle.raw() as jlong
-    } else {
-        println!(
-            "[Java_com_dropbear_ffi_components_MeshRendererNative_getModel] [ERROR] Unable to find entity in world"
-        );
-        -1
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_MeshRendererNative`
- *
- * Method:    `setModel`
- *
- * Signature: `(JJJJ)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_MeshRendererNative_setModel
- * (JNIEnv *, jclass, jlong, jlong, jlong, jlong);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_MeshRendererNative_setModel(
-    _env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    asset_handle: jlong,
-    entity_id: jlong,
-    model_handle: jlong,
-) {
-    let world = world_handle as WorldPtr;
-    if world.is_null() {
-        println!("[Java_com_dropbear_ffi_components_MeshRendererNative_setModel] [ERROR] World pointer is null");
-        return;
-    }
-
-    let asset = asset_handle as AssetRegistryPtr;
-    if asset.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_components_MeshRendererNative_setModel] [ERROR] Asset registry pointer is null"
-        );
-        return;
-    }
-
-    let world = unsafe { &*world };
-    let asset = unsafe { &*asset };
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    if let Ok(mut q) = world.query_one::<&mut MeshRenderer>(entity)
-        && let Some(model) = q.get()
-    {
-        let asset_handle = AssetHandle::new(model_handle as u64);
-        if !asset.contains_handle(asset_handle) {
-            println!("[Java_com_dropbear_ffi_components_MeshRendererNative_setModel] [ERROR] Invalid model handle");
-            return;
-        }
-        if let Err(e) = model.set_asset_handle_raw(asset, asset_handle) {
-            println!(
-                "[Java_com_dropbear_ffi_components_MeshRendererNative_setModel] [ERROR] Unable to set model: {}",
-                e
-            );
-        }
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_MeshRendererNative`
- *
- * Method:    `isModelHandle`
- *
- * Signature: `(JJ)Z`
- *
- * `JNIEXPORT jboolean JNICALL Java_com_dropbear_ffi_components_MeshRendererNative_isModelHandle
- * (JNIEnv *, jclass, jlong, jlong);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_MeshRendererNative_isModelHandle(
-    _env: JNIEnv,
-    _class: JClass,
-    asset_handle: jlong,
-    model_id: jlong,
-) -> jboolean {
-    let asset = convert_ptr!(asset_handle, AssetRegistryPtr => AssetRegistry);
-
-    asset
-        .contains_handle(AssetHandle::new(model_id as u64))
-        .into()
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_MeshRendererNative`
- *
- * Method:    `isUsingModel`
- *
- * Signature: `(JJJ)Z`
- * `JNIEXPORT jboolean JNICALL Java_com_dropbear_ffi_components_MeshRendererNative_isUsingModel
- * (JNIEnv *, jclass, jlong, jlong, jlong);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_MeshRendererNative_isUsingModel(
-    _env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    model_handle: jlong,
-) -> jboolean {
-    let world = convert_ptr!(world_handle, WorldPtr => World);
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    let handle = AssetHandle::new(model_handle as u64);
-    if let Ok(mut q) = world.query_one::<&MeshRenderer>(entity)
-        && let Some(model) = q.get()
-    {
-        if model.asset_handle() == handle {
-            true.into()
-        } else {
-            false.into()
-        }
-    } else {
-        println!(
-            "[Java_com_dropbear_ffi_components_MeshRendererNative_isUsingModel] [ERROR] Unable to find entity in world"
-        );
-        false.into()
-    }
-}
-
-
-/**
- * Class:     `com_dropbear_ffi_components_MeshRendererNative`
- *
- * Method:    `getTexture`
- *
- * Signature: `(JJJLjava/lang/String;)J`
- *
- * `JNIEXPORT jlong JNICALL Java_com_dropbear_ffi_components_MeshRendererNative_getTexture
- * (JNIEnv *, jclass, jlong, jlong, jlong, jstring);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_MeshRendererNative_getTexture(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    asset_handle: jlong,
-    entity_id: jlong,
-    name: JString,
-) -> jlong {
-    let world = world_handle as WorldPtr;
-    if world.is_null() {
-        println!("[Java_com_dropbear_ffi_components_MeshRendererNative_getTexture] [ERROR] World pointer is null");
-        return -1;
-    }
-
-    let world = unsafe { &*world };
-
-    let asset = convert_ptr!(asset_handle, AssetRegistryPtr => AssetRegistry);
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    if let Ok(mut q) = world.query_one::<&MeshRenderer>(entity)
-        && let Some(mesh) = q.get()
-    {
-        let str = convert_jstring!(env, name);
-        if let Some(handle) = mesh.material_handle_raw(asset, str.as_str()) {
-            handle.raw() as jlong
-        } else {
-            println!("[Java_com_dropbear_ffi_components_MeshRendererNative_getTexture] [ERROR] Invalid texture handle");
-            0
-        }
-    } else {
-        println!(
-            "[Java_com_dropbear_ffi_components_MeshRendererNative_getTexture] [ERROR] Unable to find entity in world"
-        );
-        0
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_MeshRendererNative`
- *
- * Method:    `getTextureName`
- *
- * Signature: `(JJ)Ljava/lang/String;`
- *
- * `JNIEXPORT jstring JNICALL Java_com_dropbear_ffi_components_MeshRendererNative_getTextureName
- * (JNIEnv *, jclass, jlong, jlong);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_MeshRendererNative_getTextureName(
-    env: JNIEnv,
-    _class: JClass,
-    asset_handle: jlong,
-    texture_id: jlong,
-) -> jstring {
-    let asset = convert_ptr!(asset_handle, AssetRegistryPtr => AssetRegistry);
-
-    let texture_id = AssetHandle::new(texture_id as u64);
-    asset.get_material(texture_id).map_or_else(
-        || {
-            println!(
-                "[Java_com_dropbear_ffi_components_MeshRendererNative_getTextureName] [ERROR] Invalid texture handle"
-            );
-            return std::ptr::null_mut();
-        },
-        |material| {
-            let Ok(str) = env.new_string(material.name.as_str()) else {
-                return std::ptr::null_mut();
-            };
-
-            str.into_raw()
-        },
-    )
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_MeshRendererNative`
- *
- * Method:    `setTexture`
- *
- * Signature: `(JJJLjava/lang/String;J)V`
- *
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_MeshRendererNative_setTexture
- * (JNIEnv *, jclass, jlong, jlong, jlong, jstring, jlong);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_MeshRendererNative_setTexture(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    asset_handle: jlong,
-    entity_id: jlong,
-    old_material_name: JString,
-    new_texture_handle: jlong,
-) {
-    let world = world_handle as WorldPtr;
-    if world.is_null() {
-        println!("[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] World pointer is null");
-        return;
-    }
-
-    let asset = asset_handle as AssetRegistryPtr;
-    if asset.is_null() {
-        println!(
-            "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Asset registry pointer is null"
-        );
-        return;
-    }
-
-    let asset = unsafe { &*asset };
-
-    let world = unsafe { &*world };
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    match world.query_one::<&mut MeshRenderer>(entity) {
-        Ok(mut query) => {
-            let Some(renderer) = query.get() else {
-                println!(
-                    "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Entity does not have a MeshRenderer component"
-                );
-                return;
-            };
-
-            let Some(cache) = asset.get_pointer(Const("model_cache")) else {
-                println!(
-                    "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Asset registry does not contain model cache"
-                );
-                return;
-            };
-
-            let cache = cache as *const Mutex<HashMap<String, Arc<Model>>>;
-            let cache = unsafe { &*cache };
-
-            let jni_result = env.get_string(&old_material_name);
-            let target_identifier = match jni_result {
-                Ok(java_string) => match java_string.to_str() {
-                    Ok(rust_str) => rust_str.to_string(),
-                    Err(e) => {
-                        println!(
-                            "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Failed to convert Java string to Rust string: {}",
-                            e
-                        );
-                        return;
-                    }
-                },
-                Err(e) => {
-                    println!(
-                        "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Failed to get string from JNI: {}",
-                        e
-                    );
-                    return;
-                }
-            };
-
-            let resolved_target_name = renderer
-                .resolve_texture_identifier(&target_identifier)
-                .map(|name| name.to_string())
-                .or_else(|| {
-                    let model = renderer.model();
-                    let model_id = renderer.model_id();
-
-                    if model
-                        .materials
-                        .iter()
-                        .any(|material| material.name == target_identifier)
-                    {
-                        return Some(target_identifier.clone());
-                    }
-
-                    model.materials.iter().find_map(|material| {
-                        if material.name == target_identifier {
-                            return Some(material.name.clone());
-                        }
-
-                        let registry_reference = ASSET_REGISTRY
-                            .material_handle(model_id, &material.name)
-                            .and_then(|handle| ASSET_REGISTRY.material_reference_for_handle(handle))
-                            .and_then(|reference| reference.as_uri().map(|uri| uri.to_string()));
-
-                        if registry_reference
-                            .as_ref()
-                            .map(|value| value == &target_identifier)
-                            .unwrap_or(false)
-                        {
-                            return Some(material.name.clone());
-                        }
-
-                        if material
-                            .texture_tag
-                            .as_ref()
-                            .map(|tag| tag == &target_identifier)
-                            .unwrap_or(false)
-                        {
-                            return Some(material.name.clone());
-                        }
-
-                        None
-                    })
-                });
-
-            let Some(target_material) = resolved_target_name else {
-                let message = format!(
-                    "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Unable to resolve material '{}' on model '{}'",
-                    target_identifier,
-                    renderer.model().label
-                );
-                println!("{}", message);
-                return;
-            };
-
-            let handle = AssetHandle::new(new_texture_handle as u64);
-
-            if !asset.contains_handle(handle) {
-                println!(
-                    "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Invalid texture handle: {}",
-                    new_texture_handle
-                );
-                return;
-            }
-
-            if !asset.is_material(handle) {
-                println!(
-                    "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Handle {} does not refer to a material",
-                    new_texture_handle
-                );
-                return;
-            }
-
-            let Some(material) = asset.get_material(handle) else {
-                println!(
-                    "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Invalid texture handle"
-                );
-                return;
-            };
-
-            let Some(owner_model_id) = asset.material_owner(handle) else {
-                println!(
-                    "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Unable to determine owning model for material handle {}",
-                    new_texture_handle
-                );
-                return;
-            };
-
-            let Some(owner_model_handle) = asset.model_handle_from_id(owner_model_id) else {
-                println!(
-                    "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Unable to resolve model handle for owner id {:?}",
-                    owner_model_id
-                );
-                return;
-            };
-
-            let Some(source_reference) = asset.model_reference_for_handle(owner_model_handle)
-            else {
-                println!(
-                    "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Unable to resolve model reference for handle {}",
-                    owner_model_handle.raw()
-                );
-                return;
-            };
-
-            if let Err(e) = renderer.apply_material_override_raw(
-                asset,
-                cache,
-                target_material.as_str(),
-                source_reference,
-                material.name.as_str(),
-            ) {
-                println!(
-                    "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Failed to apply material override: {}",
-                    e
-                );
-            }
-        }
-        Err(err) => {
-            println!(
-                "[Java_com_dropbear_ffi_components_MeshRendererNative_setTexture] [ERROR] Unable to query MeshRenderer: {}",
-                err
-            );
-        }
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_MeshRendererNative`
- *
- * Method:    `isTextureHandle`
- *
- * Signature: `(JJ)Z`
- *
- *
- * `JNIEXPORT jboolean JNICALL Java_com_dropbear_ffi_components_MeshRendererNative_isTextureHandle
- * (JNIEnv *, jclass, jlong, jlong);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_MeshRendererNative_isTextureHandle(
-    _env: JNIEnv,
-    _class: JClass,
-    asset_handle: jlong,
-    texture_id: jlong,
-) -> jboolean {
-    let asset = convert_ptr!(asset_handle, AssetRegistryPtr => AssetRegistry);
-    let texture_id = AssetHandle::new(texture_id as u64);
-    if asset.is_material(texture_id) {
-        true.into()
-    } else {
-        false.into()
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_MeshRendererNative`
- *
- * Method:    `isUsingTexture`
- *
- * Signature: `(JJJ)Z`
- *
- * `JNIEXPORT jboolean JNICALL Java_com_dropbear_ffi_components_MeshRendererNative_isUsingTexture
- * (JNIEnv *, jclass, jlong, jlong, jlong);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_MeshRendererNative_isUsingTexture(
-    _env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-    texture_handle: jlong,
-) -> jboolean {
-    let world = convert_ptr!(world_handle, WorldPtr => World);
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    if let Ok(mut q) = world.query_one::<&MeshRenderer>(entity)
-        && let Some(mesh) = q.get()
-    {
-        mesh.contains_material_handle(AssetHandle::new(texture_handle as u64))
-            .into()
-    } else {
-        println!(
-            "[Java_com_dropbear_ffi_components_MeshRendererNative_isUsingTexture] [ERROR] Unable to find entity in world"
-        );
-        false.into()
-    }
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_MeshRendererNative`
- * 
- * Method:    `getAllTextures`
- * 
- * Signature: `(JJ)[Ljava/lang/String;`
- *
- * `JNIEXPORT jobjectArray JNICALL Java_com_dropbear_ffi_components_MeshRendererNative_getAllTextures
- * (JNIEnv *, jclass, jlong, jlong);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_MeshRendererNative_getAllTextures(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    entity_id: jlong,
-) -> jobjectArray {
-    let world = convert_ptr!(world_handle, WorldPtr => World);
-    let entity = convert_jlong_to_entity!(entity_id);
-
-    let mut query = match world.query_one::<&mut MeshRenderer>(entity) {
-        Ok(query) => query,
-        Err(e) => {
-            let message = format!(
-                "[Java_com_dropbear_ffi_components_MeshRendererNative_getAllTextures] [ERROR] Failed to query entity: {}",
-                e
-            );
-            println!("{}", message);
-            return std::ptr::null_mut();
-        }
-    };
-
-    let renderer = match query.get() {
-        Some(renderer) => renderer,
-        None => {
-            let message = "[Java_com_dropbear_ffi_components_MeshRendererNative_getAllTextures] [ERROR] Entity does not have a MeshRenderer component";
-            println!("{}", message);
-            return std::ptr::null_mut();
-        }
-    };
-
-    renderer.clear_texture_identifier_cache();
-
-    let model = renderer.model();
-    let model_id = renderer.model_id();
-
-    let mut seen = HashSet::new();
-    let mut textures = Vec::new();
-
-    for material in &model.materials {
-        renderer.register_texture_identifier(material.name.clone(), material.name.clone());
-        if let Some(tag) = &material.texture_tag {
-            renderer.register_texture_identifier(tag.clone(), material.name.clone());
-        }
-
-        let reference = ASSET_REGISTRY
-            .material_handle(model_id, &material.name)
-            .and_then(|handle| ASSET_REGISTRY.material_reference_for_handle(handle))
-            .and_then(|reference| reference.as_uri().map(|uri| uri.to_string()))
-            .or_else(|| material.texture_tag.clone())
-            .unwrap_or_else(|| material.name.clone());
-
-        if seen.insert(reference.clone()) {
-            renderer.register_texture_identifier(reference.clone(), material.name.clone());
-            textures.push(reference);
-        }
-    }
-
-    let string_class = match env.find_class("java/lang/String") {
-        Ok(class) => class,
-        Err(e) => {
-            let message = format!(
-                "[Java_com_dropbear_ffi_components_MeshRendererNative_getAllTextures] [ERROR] Failed to locate java/lang/String: {}",
-                e
-            );
-            println!("{}", message);
-            return std::ptr::null_mut();
-        }
-    };
-
-    let array = match env.new_object_array(textures.len() as i32, string_class, JObject::null()) {
-        Ok(array) => array,
-        Err(e) => {
-            let message = format!(
-                "[Java_com_dropbear_ffi_components_MeshRendererNative_getAllTextures] [ERROR] Failed to allocate string array: {}",
-                e
-            );
-            println!("{}", message);
-            return std::ptr::null_mut();
-        }
-    };
-
-    for (index, value) in textures.iter().enumerate() {
-        let java_string = match env.new_string(value) {
-            Ok(string) => string,
-            Err(e) => {
-                let message = format!(
-                    "[Java_com_dropbear_ffi_components_MeshRendererNative_getAllTextures] [ERROR] Failed to create Java string: {}",
-                    e
-                );
-                println!("{}", message);
-                return std::ptr::null_mut();
-            }
-        };
-
-        if let Err(e) =
-            env.set_object_array_element(&array, index as i32, JObject::from(java_string))
-        {
-            let message = format!(
-                "[Java_com_dropbear_ffi_components_MeshRendererNative_getAllTextures] [ERROR] Failed to set array element: {}",
-                e
-            );
-            println!("{}", message);
-            return std::ptr::null_mut();
-        }
-    }
-
-    array.into_raw()
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/jni/exports/components/RigidBodyNative.rs b/eucalyptus-core/src/scripting/jni/exports/components/RigidBodyNative.rs
deleted file mode 100644
index 0c1b9c9..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/components/RigidBodyNative.rs
+++ /dev/null
@@ -1,144 +0,0 @@
-use hecs::World;
-use jni::JNIEnv;
-use jni::objects::{JClass, JObject};
-use jni::sys::{jdouble, jlong, jobjectArray};
-use rapier3d::na::Vector3;
-use rapier3d::prelude::RigidBodyType;
-use crate::{convert_jlong_to_entity, convert_ptr};
-use crate::physics::PhysicsState;
-use crate::physics::rigidbody::{RigidBody, RigidBodyMode};
-use crate::states::Label;
-
-/**
- * Class:     `com_dropbear_ffi_components_RigidBodyNative`
- *
- * Method:    `applyImpulse`
- *
- * Signature: `(JLcom/dropbear/physics/Index;DDD)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_RigidBodyNative_applyImpulse
- * (JNIEnv *, jclass, jlong, jobject, jdouble, jdouble, jdouble);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_RigidBodyNative_applyImpulse(
-    mut env: JNIEnv,
-    _class: JClass,
-    physics_handle: jlong,
-    index_obj: JObject,
-    x: jdouble,
-    y: jdouble,
-    z: jdouble,
-) {
-    // TODO: Implementation
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_RigidBodyNative`
- *
- * Method:    `applyTorqueImpulse`
- *
- * Signature: `(JLcom/dropbear/physics/Index;DDD)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_RigidBodyNative_applyTorqueImpulse
- * (JNIEnv *, jclass, jlong, jobject, jdouble, jdouble, jdouble);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_RigidBodyNative_applyTorqueImpulse(
-    mut env: JNIEnv,
-    _class: JClass,
-    physics_handle: jlong,
-    index_obj: JObject,
-    x: jdouble,
-    y: jdouble,
-    z: jdouble,
-) {
-    // TODO: Implementation
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_RigidBodyNative`
- *
- * Method:    `setRigidBody`
- *
- * Signature: `(JJLcom/dropbear/physics/RigidBody;)V`
- *
- * `JNIEXPORT void JNICALL Java_com_dropbear_ffi_components_RigidBodyNative_setRigidBody
- * (JNIEnv *, jclass, jlong, jlong, jobject);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_RigidBodyNative_setRigidBody(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    physics_handle: jlong,
-    rigidbody_obj: JObject,
-) {
-    let world = convert_ptr!(mut world_handle => World);
-    let physics = convert_ptr!(mut physics_handle => PhysicsState);
-
-    RigidBody::from_jni(&mut env, &rigidbody_obj).map(|(handle, rb_data)| {
-        if let Some(rapier_body) = physics.bodies.get_mut(handle) {
-            let rapier_mode = match rb_data.mode {
-                RigidBodyMode::Dynamic => RigidBodyType::Dynamic,
-                RigidBodyMode::Fixed => RigidBodyType::Fixed,
-                RigidBodyMode::KinematicPosition => RigidBodyType::KinematicPositionBased,
-                RigidBodyMode::KinematicVelocity => RigidBodyType::KinematicVelocityBased,
-            };
-            rapier_body.set_body_type(rapier_mode, true);
-
-            rapier_body.set_gravity_scale(rb_data.gravity_scale, true);
-            rapier_body.set_linvel(Vector3::from(rb_data.linvel), true);
-            rapier_body.set_angvel(Vector3::from(rb_data.angvel), true);
-            rapier_body.set_linear_damping(rb_data.linear_damping);
-            rapier_body.set_angular_damping(rb_data.angular_damping);
-
-            if !rb_data.can_sleep {
-                rapier_body.wake_up(true);
-            }
-            rapier_body.enable_ccd(rb_data.ccd_enabled);
-
-            rapier_body.set_enabled_translations(
-                !rb_data.lock_translation.x,
-                !rb_data.lock_translation.y,
-                !rb_data.lock_translation.z,
-                true
-            );
-            rapier_body.set_enabled_rotations(
-                !rb_data.lock_rotation.x,
-                !rb_data.lock_rotation.y,
-                !rb_data.lock_rotation.z,
-                true
-            );
-        } else {
-            eprintln!("Attempted to set RigidBody with invalid handle: {:?}", handle);
-        }
-
-        if let Some(ecs_entity) = rb_data.entity.locate_entity(&world) {
-            if let Ok(mut component) = world.get::<&mut RigidBody>(ecs_entity) {
-                *component = rb_data;
-            }
-        }
-    }).ok();
-}
-
-/**
- * Class:     `com_dropbear_ffi_components_RigidBodyNative`
- *
- * Method:    `getChildColliders`
- *
- * Signature: `(JJLcom/dropbear/physics/Index;)[Lcom/dropbear/physics/Collider;`
- *
- * `JNIEXPORT jobjectArray JNICALL Java_com_dropbear_ffi_components_RigidBodyNative_getChildColliders
- * (JNIEnv *, jclass, jlong, jlong, jobject);`
- */
-#[unsafe(no_mangle)]
-pub fn Java_com_dropbear_ffi_components_RigidBodyNative_getChildColliders(
-    mut env: JNIEnv,
-    _class: JClass,
-    world_handle: jlong,
-    physics_handle: jlong,
-    index_obj: JObject,
-) -> jobjectArray {
-    // TODO: Implementation
-    std::ptr::null_mut()
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/jni/exports/components/mod.rs b/eucalyptus-core/src/scripting/jni/exports/components/mod.rs
deleted file mode 100644
index 71ace83..0000000
--- a/eucalyptus-core/src/scripting/jni/exports/components/mod.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-pub mod CameraNative;
-pub mod CustomPropertiesNative;
-pub mod EntityTransformNative;
-pub mod HierarchyNative;
-pub mod LabelNative;
-pub mod MeshRendererNative;
-mod RigidBodyNative;
-mod ColliderNative;
diff --git a/eucalyptus-core/src/scripting/jni/utils.rs b/eucalyptus-core/src/scripting/jni/utils.rs
index 6025fb7..e75c6f7 100644
--- a/eucalyptus-core/src/scripting/jni/utils.rs
+++ b/eucalyptus-core/src/scripting/jni/utils.rs
@@ -11,7 +11,7 @@ const JAVA_MOUSE_BUTTON_MIDDLE: jint = 2;
 const JAVA_MOUSE_BUTTON_BACK: jint = 3;
 const JAVA_MOUSE_BUTTON_FORWARD: jint = 4;
 
-pub fn java_button_to_rust(button_code: jint) -> Option<winit::event::MouseButton> {
+pub fn Java_button_to_rust(button_code: jint) -> Option<winit::event::MouseButton> {
     match button_code {
         JAVA_MOUSE_BUTTON_LEFT => Some(winit::event::MouseButton::Left),
         JAVA_MOUSE_BUTTON_RIGHT => Some(winit::event::MouseButton::Right),
diff --git a/eucalyptus-core/src/scripting/native.rs b/eucalyptus-core/src/scripting/native.rs
index fe5ed41..c70f5bf 100644
--- a/eucalyptus-core/src/scripting/native.rs
+++ b/eucalyptus-core/src/scripting/native.rs
@@ -381,7 +381,7 @@ fn load_symbol<T>(
     let mut last_err = None;
 
     for (idx, candidate) in candidates.iter().enumerate() {
-        match unsafe { library.get::<T>(candidate) } {
+        match unsafe { library.get::<T>(*candidate) } {
             Ok(symbol) => {
                 if idx > 0 {
                     log::warn!(
@@ -538,6 +538,7 @@ pub enum DropbearNativeError {
     AssetNotFound = -21,
     /// When a handle has been inputted wrongly.
     InvalidHandle = -22,
+    /// When a physics object is not found
     PhysicsObjectNotFound = -23,
     
     /// The entity provided was invalid, likely not from [hecs::Entity::from_bits].
diff --git a/eucalyptus-core/src/scripting/native/exports.rs b/eucalyptus-core/src/scripting/native/exports.rs
deleted file mode 100644
index d0727e3..0000000
--- a/eucalyptus-core/src/scripting/native/exports.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-#![allow(unsafe_op_in_unsafe_fn)]
-
-pub mod dropbear_common;
-pub mod dropbear_math;
-pub mod dropbear_utils;
-pub mod components;
-pub mod dropbear_engine;
-pub mod dropbear_input;
-pub mod dropbear_scene;
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/components/dropbear_camera.rs b/eucalyptus-core/src/scripting/native/exports/components/dropbear_camera.rs
deleted file mode 100644
index 7d7ec7d..0000000
--- a/eucalyptus-core/src/scripting/native/exports/components/dropbear_camera.rs
+++ /dev/null
@@ -1,229 +0,0 @@
-use std::ffi::{c_char, CStr, CString};
-use glam::DVec3;
-use hecs::World;
-use dropbear_engine::camera::Camera;
-use crate::camera::{CameraComponent, CameraType};
-use crate::ptr::WorldPtr;
-use crate::scripting::native::DropbearNativeError;
-use crate::scripting::native::exports::dropbear_common::{DropbearNativeReturn, Handle};
-use crate::scripting::native::exports::dropbear_math::Vector3D;
-
-/// A camera that represents the [`Camera`] type in Rust in a C struct form. 
-#[repr(C)]
-pub struct NativeCamera {
-    pub label: *const c_char,
-    pub entity_id: i64,
-    pub eye: Vector3D,
-    pub target: Vector3D,
-    pub up: Vector3D,
-    pub aspect: f64,
-    pub fov_y: f64,
-    pub znear: f64,
-    pub zfar: f64,
-    pub yaw: f64,
-    pub pitch: f64,
-    pub speed: f64,
-    pub sensitivity: f64,
-}
-
-/// Fetches a camera from the world by label.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_camera(
-    world_ptr: *const World,
-    label: *const c_char,
-    out_camera: *mut NativeCamera,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() || out_camera.is_null() {
-        eprintln!("[dropbear_get_camera] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = unsafe { &*world_ptr };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s,
-        Err(_) => {
-            eprintln!("[dropbear_get_camera] [ERROR] Invalid UTF-8 in label");
-            return DropbearNativeError::InvalidUTF8 as i32;
-        }
-    };
-
-    if let Some((id, (cam, comp))) = world
-        .query::<(&Camera, &CameraComponent)>()
-        .iter()
-        .find(|(_, (cam, _))| cam.label == label_str)
-    {
-        if matches!(comp.camera_type, CameraType::Debug) {
-            eprintln!("[dropbear_get_camera] [WARN] Querying a CameraType::Debug is illegal");
-            return DropbearNativeError::NoSuchEntity as i32;
-        }
-
-        let label_cstring = CString::new(cam.label.as_str()).unwrap();
-
-        unsafe {
-            (*out_camera).label = label_cstring.into_raw();
-            (*out_camera).entity_id = id.id() as i64;
-
-            (*out_camera).eye = Vector3D {
-                x: cam.eye.x,
-                y: cam.eye.y,
-                z: cam.eye.z,
-            };
-
-            (*out_camera).target = Vector3D {
-                x: cam.target.x,
-                y: cam.target.y,
-                z: cam.target.z,
-            };
-
-            (*out_camera).up = Vector3D {
-                x: cam.up.x,
-                y: cam.up.y,
-                z: cam.up.z,
-            };
-
-            (*out_camera).aspect = cam.aspect;
-            (*out_camera).fov_y = cam.settings.fov_y;
-            (*out_camera).znear = cam.znear;
-            (*out_camera).zfar = cam.zfar;
-            (*out_camera).yaw = cam.yaw;
-            (*out_camera).pitch = cam.pitch;
-            (*out_camera).speed = cam.settings.speed;
-            (*out_camera).sensitivity = cam.settings.sensitivity;
-        }
-
-        return DropbearNativeError::Success as i32;
-    }
-
-    eprintln!(
-        "[dropbear_get_camera] [ERROR] Camera with label '{}' not found",
-        label_str
-    );
-    DropbearNativeError::EntityNotFound as i32
-}
-
-/// Fetches the camera attached to an entity as a component. 
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_attached_camera(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    out_camera: *mut NativeCamera,
-) -> i32 {
-    if world_ptr.is_null() || out_camera.is_null() {
-        eprintln!("[dropbear_get_attached_camera] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = unsafe { &*world_ptr };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    match world.query_one::<(&Camera, &CameraComponent)>(entity) {
-        Ok(mut q) => {
-            if let Some((cam, comp)) = q.get() {
-                if matches!(comp.camera_type, CameraType::Debug) {
-                    eprintln!(
-                        "[dropbear_get_attached_camera] [WARN] Querying a CameraType::Debug is illegal"
-                    );
-                    return DropbearNativeError::NoSuchEntity as i32;
-                }
-
-                let label_cstring = CString::new(cam.label.as_str()).unwrap();
-
-                unsafe {
-                    (*out_camera).label = label_cstring.into_raw();
-                    (*out_camera).entity_id = entity_handle;
-
-                    (*out_camera).eye = Vector3D {
-                        x: cam.eye.x,
-                        y: cam.eye.y,
-                        z: cam.eye.z,
-                    };
-
-                    (*out_camera).target = Vector3D {
-                        x: cam.target.x,
-                        y: cam.target.y,
-                        z: cam.target.z,
-                    };
-
-                    (*out_camera).up = Vector3D {
-                        x: cam.up.x,
-                        y: cam.up.y,
-                        z: cam.up.z,
-                    };
-
-                    (*out_camera).aspect = cam.aspect;
-                    (*out_camera).fov_y = cam.settings.fov_y;
-                    (*out_camera).znear = cam.znear;
-                    (*out_camera).zfar = cam.zfar;
-                    (*out_camera).yaw = cam.yaw;
-                    (*out_camera).pitch = cam.pitch;
-                    (*out_camera).speed = cam.settings.speed;
-                    (*out_camera).sensitivity = cam.settings.sensitivity;
-                }
-
-                0
-            } else {
-                eprintln!("[dropbear_get_attached_camera] [ERROR] Entity has no Camera component");
-                DropbearNativeError::NoSuchEntity as i32
-            }
-        }
-        Err(_) => {
-            eprintln!("[dropbear_get_attached_camera] [ERROR] Failed to query entity");
-            DropbearNativeError::EntityNotFound as i32
-        }
-    }
-}
-
-/// Sets the camera attached to an entity as a component.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_set_camera(
-    world_ptr: WorldPtr,
-    camera: *const NativeCamera,
-) -> i32 {
-    if world_ptr.is_null() || camera.is_null() {
-        eprintln!("[dropbear_set_camera] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = unsafe { &mut *(world_ptr) };
-    let cam_data = unsafe { &*camera };
-
-    let entity = unsafe { world.find_entity_from_id(cam_data.entity_id as u32) };
-
-    match world.query_one_mut::<&mut Camera>(entity) {
-        Ok(cam) => {
-            cam.eye = DVec3::new(
-                cam_data.eye.x,
-                cam_data.eye.y,
-                cam_data.eye.z,
-            );
-
-            cam.target = DVec3::new(
-                cam_data.target.x,
-                cam_data.target.y,
-                cam_data.target.z,
-            );
-
-            cam.up = DVec3::new(
-                cam_data.up.x,
-                cam_data.up.y,
-                cam_data.up.z,
-            );
-
-            cam.aspect = cam_data.aspect;
-            cam.settings.fov_y = cam_data.fov_y;
-            cam.znear = cam_data.znear;
-            cam.zfar = cam_data.zfar;
-            cam.yaw = cam_data.yaw;
-            cam.pitch = cam_data.pitch;
-            cam.settings.speed = cam_data.speed;
-            cam.settings.sensitivity = cam_data.sensitivity;
-
-            DropbearNativeError::Success as i32
-        }
-        Err(_) => {
-            eprintln!("[dropbear_set_camera] [ERROR] Unable to query camera component");
-            DropbearNativeError::EntityNotFound as i32
-        }
-    }
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/components/dropbear_entitytransform.rs b/eucalyptus-core/src/scripting/native/exports/components/dropbear_entitytransform.rs
deleted file mode 100644
index bf9866d..0000000
--- a/eucalyptus-core/src/scripting/native/exports/components/dropbear_entitytransform.rs
+++ /dev/null
@@ -1,117 +0,0 @@
-use hecs::World;
-use dropbear_engine::entity::EntityTransform;
-use crate::hierarchy::EntityTransformExt;
-use crate::scripting::native::{utils, DropbearNativeError};
-use crate::scripting::native::exports::dropbear_common::{DropbearNativeReturn, Handle};
-use crate::scripting::native::exports::dropbear_math::{NativeEntityTransform, NativeTransform};
-
-/// Fetches the [`EntityTransform`] component of an entity.
-///
-/// The [`EntityTransform`] returns a `world` and `local` transform.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_transform(
-    world_ptr: *const World,
-    entity_handle: i64,
-    out_transform: *mut NativeEntityTransform,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || out_transform.is_null() {
-        eprintln!("[dropbear_get_transform] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &*world_ptr;
-    let entity = world.find_entity_from_id(entity_handle as u32);
-
-    match world.query_one::<&EntityTransform>(entity) {
-        Ok(mut q) => {
-            if let Some(transform) = q.get() {
-                unsafe {
-                    utils::write_native_transform(&mut (*out_transform).local, transform.local());
-                    utils::write_native_transform(&mut (*out_transform).world, transform.world());
-                }
-                DropbearNativeError::Success as i32
-            } else {
-                eprintln!("[dropbear_get_transform] [ERROR] Entity has no transform component");
-                DropbearNativeError::NoSuchComponent as i32
-            }
-        }
-        Err(_) => {
-            eprintln!("[dropbear_get_transform] [ERROR] Failed to query entity");
-            DropbearNativeError::QueryFailed as i32
-        }
-    }
-}
-
-/// Propagates a transform.
-///
-/// To propagate a transform is to collect all the [`EntityTransform`] of the parent and self of the
-/// querying entity. It then calculates the positions by summing them up (position, rotation and scale),
-/// then returns that resulting [`Transform`]
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_propagate_transform(
-    world_ptr: *const World,
-    entity_handle: i64,
-    out_transform: *mut NativeTransform,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || out_transform.is_null() {
-        eprintln!("[dropbear_propagate_transform] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &mut *(world_ptr as *mut World);
-    let entity = world.find_entity_from_id(entity_handle as u32);
-
-    match world.query_one::<&mut EntityTransform>(entity) {
-        Ok(mut q) => {
-            if let Some(transform) = q.get() {
-                let propagated = transform.propagate(world, entity);
-                unsafe {
-                    utils::write_native_transform(&mut *out_transform, &propagated);
-                }
-                DropbearNativeError::Success as i32
-            } else {
-                eprintln!(
-                    "[dropbear_propagate_transform] [ERROR] Entity has no transform component"
-                );
-                DropbearNativeError::NoSuchComponent as i32
-            }
-        }
-        Err(_) => {
-            eprintln!("[dropbear_propagate_transform] [ERROR] Failed to query entity");
-            DropbearNativeError::QueryFailed as i32
-        }
-    }
-}
-
-/// Sets the [`EntityTransform`] component for a specific entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_set_transform(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    transform: NativeEntityTransform,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() {
-        eprintln!("[dropbear_set_transform] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &mut *(world_ptr as *mut World);
-    let entity = world.find_entity_from_id(entity_handle as u32);
-
-    match world.query_one::<&mut EntityTransform>(entity) {
-        Ok(mut q) => {
-            if let Some(entity_transform) = q.get() {
-                *entity_transform.local_mut() = utils::native_transform_to_transform(&transform.local);
-                *entity_transform.world_mut() = utils::native_transform_to_transform(&transform.world);
-                DropbearNativeError::Success as i32
-            } else {
-                eprintln!("[dropbear_set_transform] [ERROR] Entity has no transform component");
-                DropbearNativeError::NoSuchComponent as i32
-            }
-        }
-        Err(_) => {
-            eprintln!("[dropbear_set_transform] [ERROR] Failed to query entity");
-            DropbearNativeError::QueryFailed as i32
-        }
-    }
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/components/dropbear_hierarchy.rs b/eucalyptus-core/src/scripting/native/exports/components/dropbear_hierarchy.rs
deleted file mode 100644
index d5c20f1..0000000
--- a/eucalyptus-core/src/scripting/native/exports/components/dropbear_hierarchy.rs
+++ /dev/null
@@ -1,128 +0,0 @@
-use std::ffi::{c_char, CStr};
-use std::ptr;
-use hecs::World;
-use crate::hierarchy::{Children, Parent};
-use crate::scripting::native::DropbearNativeError;
-use crate::scripting::native::exports::dropbear_common::{DropbearNativeReturn, Handle};
-use crate::states::Label;
-
-/// Fetches the children of the given entity.
-///
-/// Returns an array of [`Handle`], or an [`ptr::null_mut()`] if no children of the entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_children(
-    world_ptr: *const World,
-    entity_id: Handle,
-    out_children: *mut *mut Handle, // array of handles
-    out_count: *mut usize,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || out_children.is_null() || out_count.is_null() {
-        eprintln!("[dropbear_get_children] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &*world_ptr;
-    let entity = world.find_entity_from_id(entity_id as u32);
-
-    let children: Vec<i64> = match world.query_one::<&Children>(entity) {
-        Ok(mut q) => q
-            .get()
-            .map(|component| {
-                component
-                    .children()
-                    .iter()
-                    .map(|child| child.id() as i64)
-                    .collect()
-            })
-            .unwrap_or_default(),
-        Err(_) => Vec::new(),
-    };
-
-    unsafe {
-        *out_count = children.len();
-    }
-
-    if children.is_empty() {
-        unsafe { *out_children = ptr::null_mut(); }
-        return DropbearNativeError::Success as i32;
-    }
-
-    let mut boxed = children.into_boxed_slice();
-    unsafe {
-        *out_children = boxed.as_mut_ptr();
-    }
-    Box::leak(boxed);
-    DropbearNativeError::Success as i32
-}
-
-/// Fetches the child of the entity by a String label.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_child_by_label(
-    world_ptr: *const World,
-    entity_id: Handle,
-    label: *const c_char,
-    out_child: *mut Handle,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() || out_child.is_null() {
-        eprintln!("[dropbear_get_child_by_label] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &*world_ptr;
-    let entity = world.find_entity_from_id(entity_id as u32);
-    let target = match CStr::from_ptr(label).to_str() {
-        Ok(s) => s,
-        Err(_) => {
-            eprintln!("[dropbear_get_child_by_label] [ERROR] Invalid UTF-8 in label");
-            return DropbearNativeError::InvalidUTF8 as i32;
-        }
-    };
-
-    match world.query_one::<&Children>(entity) {
-        Ok(mut q) => {
-            if let Some(children) = q.get() {
-                for child in children.children() {
-                    if let Ok(label_comp) = world.get::<&Label>(*child) {
-                        if label_comp.as_str() == target {
-                            unsafe {
-                                *out_child = child.id() as i64;
-                            }
-                            return DropbearNativeError::Success as i32;
-                        }
-                    }
-                }
-            }
-            DropbearNativeError::EntityNotFound as i32
-        }
-        Err(_) => DropbearNativeError::QueryFailed as i32,
-    }
-}
-
-/// Fetches the parent entity ID of the given entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_parent(
-    world_ptr: *const World,
-    entity_id: Handle,
-    out_parent: *mut Handle,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || out_parent.is_null() {
-        eprintln!("[dropbear_get_parent] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &*world_ptr;
-    let entity = world.find_entity_from_id(entity_id as u32);
-
-    match world.get::<&Parent>(entity) {
-        Ok(parent) => {
-            unsafe {
-                *out_parent = parent.parent().id() as i64;
-            }
-            DropbearNativeError::Success as i32
-        }
-        Err(_) => {
-            eprintln!("[dropbear_get_parent] [WARN] Parent component not found");
-            DropbearNativeError::EntityNotFound as i32
-        }
-    }
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/components/dropbear_label.rs b/eucalyptus-core/src/scripting/native/exports/components/dropbear_label.rs
deleted file mode 100644
index e990ea4..0000000
--- a/eucalyptus-core/src/scripting/native/exports/components/dropbear_label.rs
+++ /dev/null
@@ -1,48 +0,0 @@
-use std::ffi::{c_char, CString};
-use hecs::World;
-use crate::scripting::native::DropbearNativeError;
-use crate::scripting::native::exports::dropbear_common::{DropbearNativeReturn, Handle};
-use crate::states::Label;
-
-/// Fetches the [`Label`] (or name) component of an entity. 
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_entity_name(
-    world_ptr: *const World,
-    entity_id: Handle,
-    out_name: *mut c_char,
-    max_len: usize,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || out_name.is_null() {
-        eprintln!("[dropbear_get_entity_name] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = unsafe { &*world_ptr };
-    let entity = unsafe { world.find_entity_from_id(entity_id as u32) };
-
-    if let Ok(mut q) = world.query_one::<&Label>(entity) {
-        if let Some(label) = q.get() {
-            let label_str = label.as_str();
-            let Ok(c_str) = CString::new(label_str) else {
-                return DropbearNativeError::CStringError as i32;
-            };
-
-            let bytes = c_str.as_bytes_with_nul();
-            if bytes.len() > max_len {
-                return DropbearNativeError::BufferTooSmall as i32;
-            }
-
-            unsafe {
-                std::ptr::copy_nonoverlapping(
-                    bytes.as_ptr(),
-                    out_name as *mut u8,
-                    bytes.len()
-                );
-            }
-
-            return DropbearNativeError::Success as i32;
-        }
-    }
-
-    DropbearNativeError::QueryFailed as i32
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/components/dropbear_meshrenderer.rs b/eucalyptus-core/src/scripting/native/exports/components/dropbear_meshrenderer.rs
deleted file mode 100644
index a1a73ab..0000000
--- a/eucalyptus-core/src/scripting/native/exports/components/dropbear_meshrenderer.rs
+++ /dev/null
@@ -1,560 +0,0 @@
-use std::collections::{HashMap, HashSet};
-use std::ffi::{c_char, CStr, CString};
-use std::ptr;
-use std::sync::{Arc};
-use hecs::World;
-use parking_lot::Mutex;
-use dropbear_engine::asset::AssetHandle;
-use dropbear_engine::asset::PointerKind::Const;
-use dropbear_engine::entity::MeshRenderer;
-use dropbear_engine::model::Model;
-use crate::ptr::AssetRegistryPtr;
-use crate::scripting::native::DropbearNativeError;
-use crate::scripting::native::exports::dropbear_common::{Bool, DropbearNativeReturn, Handle};
-
-/// Fetches the model that is currently being used by the entity being queried. 
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_model(
-    world_ptr: *const World,
-    asset_ptr: AssetRegistryPtr,
-    entity_handle: Handle,
-    out_model_id: *mut Handle,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || asset_ptr.is_null() || out_model_id.is_null() {
-        eprintln!("[dropbear_get_model] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &*world_ptr;
-    let _asset = &*asset_ptr;
-    let entity = world.find_entity_from_id(entity_handle as u32);
-
-    match world.query_one::<&MeshRenderer>(entity) {
-        Ok(mut q) => {
-            if let Some(renderer) = q.get() {
-                unsafe { *out_model_id = renderer.asset_handle().raw() as i64; }
-                DropbearNativeError::Success as i32
-            } else {
-                eprintln!("[dropbear_get_model] [ERROR] Entity missing MeshRenderer component");
-                DropbearNativeError::NoSuchComponent as i32
-            }
-        }
-        Err(_) => {
-            eprintln!("[dropbear_get_model] [ERROR] Failed to query entity");
-            DropbearNativeError::QueryFailed as i32
-        }
-    }
-}
-
-/// Sets the MeshRenderer's model as that of the provided asset in the form of a ModelHandle.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_set_model(
-    world_ptr: *const World,
-    asset_ptr: AssetRegistryPtr,
-    entity_handle: Handle,
-    model_id: Handle,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || asset_ptr.is_null() {
-        eprintln!("[dropbear_set_model] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &*world_ptr;
-    let asset = &*asset_ptr;
-    let entity = world.find_entity_from_id(entity_handle as u32);
-
-    match world.query_one::<&mut MeshRenderer>(entity) {
-        Ok(mut q) => {
-            if let Some(renderer) = q.get() {
-                let handle = AssetHandle::new(model_id as u64);
-                if let Err(err) = renderer.set_asset_handle_raw(asset, handle) {
-                    eprintln!(
-                        "[dropbear_set_model] [ERROR] Failed to set model handle {}: {}",
-                        model_id,
-                        err
-                    );
-                    DropbearNativeError::UnknownError as i32
-                } else {
-                    DropbearNativeError::Success as i32
-                }
-            } else {
-                eprintln!("[dropbear_set_model] [ERROR] Entity missing MeshRenderer component");
-                DropbearNativeError::NoSuchComponent as i32
-            }
-        }
-        Err(_) => {
-            eprintln!("[dropbear_set_model] [ERROR] Failed to query entity");
-            DropbearNativeError::QueryFailed as i32
-        }
-    }
-}
-
-/// Checks if a handle provided is that of a Model. Returns false if not or true if is.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_is_model_handle(
-    asset_ptr: AssetRegistryPtr,
-    handle: Handle,
-    out_is_model: *mut Bool,
-) -> DropbearNativeReturn {
-    if asset_ptr.is_null() || out_is_model.is_null() {
-        eprintln!("[dropbear_is_model_handle] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let asset = &*asset_ptr;
-    let handle = AssetHandle::new(handle as u64);
-    unsafe {
-        *out_is_model = if asset.is_model(handle) { 1 } else { 0 };
-    }
-    DropbearNativeError::Success as i32
-}
-
-/// Checks if the entity is currently using a specific asset (in the form of a ModelHandle) to render
-/// its meshes.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_is_using_model(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    model_handle: Handle,
-    out_is_using: *mut Bool,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || out_is_using.is_null() {
-        eprintln!("[dropbear_is_using_model] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &*world_ptr;
-    let entity = world.find_entity_from_id(entity_handle as u32);
-    let handle = AssetHandle::new(model_handle as u64);
-
-    match world.query_one::<&MeshRenderer>(entity) {
-        Ok(mut q) => {
-            if let Some(renderer) = q.get() {
-                unsafe {
-                    *out_is_using = if renderer.uses_model_handle(handle) { 1 } else { 0 };
-                }
-                DropbearNativeError::Success as i32
-            } else {
-                eprintln!(
-                    "[dropbear_is_using_model] [ERROR] Entity missing MeshRenderer component"
-                );
-                DropbearNativeError::NoSuchComponent as i32
-            }
-        }
-        Err(_) => {
-            eprintln!("[dropbear_is_using_model] [ERROR] Failed to query entity");
-            DropbearNativeError::QueryFailed as i32
-        }
-    }
-}
-
-/// Fetches the texture (in the form of a TextureHandle) from a specific entity that is currently
-/// rendering the model. 
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_texture(
-    world_ptr: *const World,
-    asset_ptr: AssetRegistryPtr,
-    entity_handle: Handle,
-    name: *const c_char,
-    out_texture_id: *mut Handle,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || asset_ptr.is_null() || name.is_null() || out_texture_id.is_null() {
-        eprintln!("[dropbear_get_texture] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &*world_ptr;
-    let asset = &*asset_ptr;
-    let entity = world.find_entity_from_id(entity_handle as u32);
-    let label = match CStr::from_ptr(name).to_str() {
-        Ok(s) => s.to_string(),
-        Err(_) => {
-            eprintln!("[dropbear_get_texture] [ERROR] Invalid UTF-8 in material name");
-            return DropbearNativeError::InvalidUTF8 as i32;
-        }
-    };
-
-    match world.query_one::<&MeshRenderer>(entity) {
-        Ok(mut q) => {
-            if let Some(renderer) = q.get() {
-                if let Some(handle) = renderer.material_handle_raw(asset, label.as_str()) {
-                    unsafe { *out_texture_id = handle.raw() as i64; }
-                    DropbearNativeError::Success as i32
-                } else {
-                    eprintln!(
-                        "[dropbear_get_texture] [ERROR] Material '{}' not found on entity",
-                        label
-                    );
-                    DropbearNativeError::EntityNotFound as i32
-                }
-            } else {
-                eprintln!("[dropbear_get_texture] [ERROR] Entity missing MeshRenderer component");
-                DropbearNativeError::NoSuchComponent as i32
-            }
-        }
-        Err(_) => {
-            eprintln!("[dropbear_get_texture] [ERROR] Failed to query entity");
-            DropbearNativeError::QueryFailed as i32
-        }
-    }
-}
-
-/// Fetches the texture name. 
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_texture_name(
-    asset_ptr: AssetRegistryPtr,
-    texture_handle: Handle,
-    out_name: *mut *const c_char,
-) -> DropbearNativeReturn {
-    if asset_ptr.is_null() || out_name.is_null() {
-        eprintln!("[dropbear_get_texture_name] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let asset = &*asset_ptr;
-    let handle = AssetHandle::new(texture_handle as u64);
-
-    if let Some(material) = asset.get_material(handle) {
-        match CString::new(material.name.as_str()) {
-            Ok(c_string) => {
-                unsafe {
-                    *out_name = c_string.into_raw();
-                }
-                DropbearNativeError::Success as i32
-            }
-            Err(err) => {
-                eprintln!(
-                    "[dropbear_get_texture_name] [ERROR] Failed to allocate string: {}",
-                    err
-                );
-                DropbearNativeError::UnknownError as i32
-            }
-        }
-    } else {
-        eprintln!(
-            "[dropbear_get_texture_name] [ERROR] Invalid texture handle {}",
-            texture_handle
-        );
-        DropbearNativeError::EntityNotFound as i32
-    }
-}
-
-/// Replaces the texture of a specific texture of the model currently being rendered on an entity. 
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_set_texture(
-    world_ptr: *const World,
-    asset_ptr: AssetRegistryPtr,
-    entity_handle: Handle,
-    old_material_name: *const c_char,
-    texture_id: Handle,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || asset_ptr.is_null() || old_material_name.is_null() {
-        eprintln!("[dropbear_set_texture] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &*world_ptr;
-    let asset = &*asset_ptr;
-    let entity = world.find_entity_from_id(entity_handle as u32);
-    let target_identifier = match CStr::from_ptr(old_material_name).to_str() {
-        Ok(s) => s.to_string(),
-        Err(_) => {
-            eprintln!("[dropbear_set_texture] [ERROR] Invalid UTF-8 in material identifier");
-            return DropbearNativeError::InvalidUTF8 as i32;
-        }
-    };
-
-    match world.query_one::<&mut MeshRenderer>(entity) {
-        Ok(mut query) => {
-            let Some(renderer) = query.get() else {
-                eprintln!(
-                    "[dropbear_set_texture] [ERROR] Entity missing MeshRenderer component"
-                );
-                return DropbearNativeError::NoSuchComponent as i32;
-            };
-
-            let cache_ptr = match asset.get_pointer(Const("model_cache")) {
-                Some(ptr) => ptr as *const Mutex<HashMap<String, Arc<Model>>>,
-                None => {
-                    eprintln!(
-                        "[dropbear_set_texture] [ERROR] Asset registry missing model cache pointer"
-                    );
-                    return DropbearNativeError::UnknownError as i32;
-                }
-            };
-
-            let Some(cache) = (unsafe { cache_ptr.as_ref() }) else {
-                eprintln!("[dropbear_set_texture] [ERROR] Model cache pointer is null");
-                return DropbearNativeError::NullPointer as i32;
-            };
-
-            let resolved_target_name = renderer
-                .resolve_texture_identifier(&target_identifier)
-                .map(|name| name.to_string())
-                .or_else(|| {
-                    let model = renderer.model();
-                    let model_id = renderer.model_id();
-
-                    if model
-                        .materials
-                        .iter()
-                        .any(|material| material.name == target_identifier)
-                    {
-                        return Some(target_identifier.clone());
-                    }
-
-                    model.materials.iter().find_map(|material| {
-                        if material.name == target_identifier {
-                            return Some(material.name.clone());
-                        }
-
-                        let registry_reference = asset
-                            .material_handle(model_id, &material.name)
-                            .and_then(|handle| asset.material_reference_for_handle(handle))
-                            .and_then(|reference| reference.as_uri().map(|uri| uri.to_string()));
-
-                        if registry_reference
-                            .as_ref()
-                            .map(|value| value == &target_identifier)
-                            .unwrap_or(false)
-                        {
-                            return Some(material.name.clone());
-                        }
-
-                        if material
-                            .texture_tag
-                            .as_ref()
-                            .map(|tag| tag == &target_identifier)
-                            .unwrap_or(false)
-                        {
-                            return Some(material.name.clone());
-                        }
-
-                        None
-                    })
-                });
-
-            let Some(target_material) = resolved_target_name else {
-                eprintln!(
-                    "[dropbear_set_texture] [ERROR] Unable to resolve material '{}' on model '{}'",
-                    target_identifier,
-                    renderer.model().label
-                );
-                return DropbearNativeError::EntityNotFound as i32;
-            };
-
-            let handle = AssetHandle::new(texture_id as u64);
-
-            if !asset.contains_handle(handle) || !asset.is_material(handle) {
-                eprintln!(
-                    "[dropbear_set_texture] [ERROR] Handle {} is not a valid material",
-                    texture_id
-                );
-                return DropbearNativeError::EntityNotFound as i32;
-            }
-
-            let Some(material) = asset.get_material(handle) else {
-                eprintln!("[dropbear_set_texture] [ERROR] Material handle not found");
-                return DropbearNativeError::EntityNotFound as i32;
-            };
-
-            let Some(owner_model_id) = asset.material_owner(handle) else {
-                eprintln!(
-                    "[dropbear_set_texture] [ERROR] Unable to resolve owner model for material"
-                );
-                return DropbearNativeError::UnknownError as i32;
-            };
-
-            let Some(owner_model_handle) = asset.model_handle_from_id(owner_model_id) else {
-                eprintln!(
-                    "[dropbear_set_texture] [ERROR] Unable to resolve model handle for owner"
-                );
-                return DropbearNativeError::UnknownError as i32;
-            };
-
-            let Some(source_reference) = asset.model_reference_for_handle(owner_model_handle) else {
-                eprintln!(
-                    "[dropbear_set_texture] [ERROR] Unable to resolve model reference for owner"
-                );
-                return DropbearNativeError::UnknownError as i32;
-            };
-
-            match renderer.apply_material_override_raw(
-                asset,
-                cache,
-                target_material.as_str(),
-                source_reference,
-                material.name.as_str(),
-            ) {
-                Ok(()) => DropbearNativeError::Success as i32,
-                Err(err) => {
-                    eprintln!(
-                        "[dropbear_set_texture] [ERROR] Failed to apply material override: {}",
-                        err
-                    );
-                    DropbearNativeError::UnknownError as i32
-                }
-            }
-        }
-        Err(err) => {
-            eprintln!(
-                "[dropbear_set_texture] [ERROR] Unable to query MeshRenderer: {}",
-                err
-            );
-            DropbearNativeError::QueryFailed as i32
-        }
-    }
-}
-
-/// Checks if a general AssetHandle is linked to a texture, therefore making it a TextureHandle. 
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_is_texture_handle(
-    asset_ptr: AssetRegistryPtr,
-    handle: Handle,
-    out_is_texture: *mut Bool,
-) -> DropbearNativeReturn {
-    if asset_ptr.is_null() || out_is_texture.is_null() {
-        eprintln!("[dropbear_is_texture_handle] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let asset = &*asset_ptr;
-    let handle = AssetHandle::new(handle as u64);
-    unsafe {
-        *out_is_texture = if asset.is_material(handle) { 1 } else { 0 };
-    }
-    DropbearNativeError::Success as i32
-}
-
-/// Checks if an entity is currently using a texture as specified by the TextureId. 
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_is_using_texture(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    texture_handle: Handle,
-    out_is_using: *mut Bool,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || out_is_using.is_null() {
-        eprintln!("[dropbear_is_using_texture] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &*world_ptr;
-    let entity = world.find_entity_from_id(entity_handle as u32);
-    let handle = AssetHandle::new(texture_handle as u64);
-
-    match world.query_one::<&MeshRenderer>(entity) {
-        Ok(mut q) => {
-            if let Some(renderer) = q.get() {
-                unsafe {
-                    *out_is_using = if renderer.contains_material_handle(handle) { 1 } else { 0 };
-                }
-                DropbearNativeError::Success as i32
-            } else {
-                eprintln!(
-                    "[dropbear_is_using_texture] [ERROR] Entity missing MeshRenderer component"
-                );
-                DropbearNativeError::NoSuchComponent as i32
-            }
-        }
-        Err(_) => {
-            eprintln!("[dropbear_is_using_texture] [ERROR] Failed to query entity");
-            DropbearNativeError::QueryFailed as i32
-        }
-    }
-}
-
-
-// todo: change from returning texture names to return TextureHandle
-/// Fetches all the textures currently being rendered by an entity
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_all_textures(
-    world_ptr: *const World,
-    asset_registry_ptr: AssetRegistryPtr,
-    entity_handle: Handle,
-    out_textures: *mut *mut *const c_char,
-    out_count: *mut usize,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || out_textures.is_null() || out_count.is_null() || asset_registry_ptr.is_null() {
-        eprintln!("[dropbear_get_all_textures] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = &mut *(world_ptr as *mut World);
-    let asset = &*asset_registry_ptr;
-    let entity = world.find_entity_from_id(entity_handle as u32);
-
-    let mut query = match world.query_one::<&mut MeshRenderer>(entity) {
-        Ok(query) => query,
-        Err(err) => {
-            eprintln!(
-                "[dropbear_get_all_textures] [ERROR] Failed to query entity: {}",
-                err
-            );
-            return DropbearNativeError::QueryFailed as i32;
-        }
-    };
-
-    let Some(renderer) = query.get() else {
-        eprintln!(
-            "[dropbear_get_all_textures] [ERROR] Entity missing MeshRenderer component"
-        );
-        return DropbearNativeError::NoSuchComponent as i32;
-    };
-
-    renderer.clear_texture_identifier_cache();
-    let model = renderer.model();
-    let model_id = renderer.model_id();
-
-    let mut seen = HashSet::new();
-    let mut textures = Vec::new();
-
-    for material in &model.materials {
-        renderer.register_texture_identifier(material.name.clone(), material.name.clone());
-        if let Some(tag) = &material.texture_tag {
-            renderer.register_texture_identifier(tag.clone(), material.name.clone());
-        }
-
-        let reference = asset
-            .material_handle(model_id, &material.name)
-            .and_then(|handle| asset.material_reference_for_handle(handle))
-            .and_then(|reference| reference.as_uri().map(|uri| uri.to_string()))
-            .or_else(|| material.texture_tag.clone())
-            .unwrap_or_else(|| material.name.clone());
-
-        if seen.insert(reference.clone()) {
-            renderer.register_texture_identifier(reference.clone(), material.name.clone());
-            textures.push(reference);
-        }
-    }
-
-    unsafe {
-        *out_count = textures.len();
-    }
-
-    if textures.is_empty() {
-        unsafe { *out_textures = ptr::null_mut(); }
-        return DropbearNativeError::Success as i32;
-    }
-
-    let mut c_pointers: Vec<*const c_char> = Vec::with_capacity(textures.len());
-    for value in textures {
-        match CString::new(value) {
-            Ok(c_string) => c_pointers.push(c_string.into_raw()),
-            Err(err) => {
-                eprintln!(
-                    "[dropbear_get_all_textures] [ERROR] Failed to allocate string: {}",
-                    err
-                );
-                return DropbearNativeError::UnknownError as i32;
-            }
-        }
-    }
-
-    let mut boxed = c_pointers.into_boxed_slice();
-    unsafe {
-        *out_textures = boxed.as_mut_ptr();
-    }
-    Box::leak(boxed);
-    DropbearNativeError::Success as i32
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/components/dropbear_properties.rs b/eucalyptus-core/src/scripting/native/exports/components/dropbear_properties.rs
deleted file mode 100644
index 94684f9..0000000
--- a/eucalyptus-core/src/scripting/native/exports/components/dropbear_properties.rs
+++ /dev/null
@@ -1,441 +0,0 @@
-use std::ffi::{c_char, CStr};
-use hecs::World;
-use dropbear_engine::entity::MeshRenderer;
-use crate::scripting::native::DropbearNativeError;
-use crate::scripting::native::exports::dropbear_common::{Bool, DropbearNativeReturn, Handle};
-use crate::states::{CustomProperties, Value};
-
-/// Fetches the string property
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_string_property(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    label: *const c_char,
-    out_value: *mut c_char,
-    out_value_max_length: i32,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() || out_value.is_null() {
-        eprintln!("[dropbear_get_string_property] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = unsafe { &*world_ptr };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s,
-        Err(_) => {
-            eprintln!("[dropbear_get_string_property] [ERROR] Invalid UTF-8 in label");
-            return -108;
-        }
-    };
-
-    match world.query_one::<(&MeshRenderer, &CustomProperties)>(entity) {
-        Ok(mut q) => {
-            if let Some((_, props)) = q.get() {
-                if let Some(Value::String(val)) = props.get_property(label_str) {
-                    let bytes = val.as_bytes();
-                    let copy_len = std::cmp::min(bytes.len(), (out_value_max_length - 1) as usize);
-                    unsafe {
-                        std::ptr::copy_nonoverlapping(
-                            bytes.as_ptr(),
-                            out_value as *mut u8,
-                            copy_len,
-                        );
-                        *out_value.add(copy_len) = 0; // null terminator
-                    }
-                    0
-                } else {
-                    eprintln!(
-                        "[dropbear_get_string_property] [WARN] Property not found or wrong type"
-                    );
-                    -3
-                }
-            } else {
-                -4
-            }
-        }
-        Err(_) => {
-            eprintln!("[dropbear_get_string_property] [ERROR] Failed to query entity");
-            -2
-        }
-    }
-}
-
-/// Fetches the integer property of an entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_int_property(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    label: *const c_char,
-    out_value: *mut i32,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() || out_value.is_null() {
-        eprintln!("[dropbear_get_int_property] [ERROR] Null pointer received");
-        return -1;
-    }
-
-    let world = unsafe { &*world_ptr };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s,
-        Err(_) => return -108,
-    };
-
-    match world.query_one::<(&MeshRenderer, &CustomProperties)>(entity) {
-        Ok(mut q) => {
-            if let Some((_, props)) = q.get() {
-                if let Some(Value::Int(val)) = props.get_property(label_str) {
-                    unsafe { *out_value = *val as i32 };
-                    0
-                } else {
-                    -3
-                }
-            } else {
-                -4
-            }
-        }
-        Err(_) => -2,
-    }
-}
-
-/// Fetches the long/[`f64`] property of an entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_long_property(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    label: *const c_char,
-    out_value: *mut Handle,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() || out_value.is_null() {
-        return -1;
-    }
-
-    let world = unsafe { &*world_ptr };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s,
-        Err(_) => return -108,
-    };
-
-    match world.query_one::<(&MeshRenderer, &CustomProperties)>(entity) {
-        Ok(mut q) => {
-            if let Some((_, props)) = q.get() {
-                if let Some(Value::Int(val)) = props.get_property(label_str) {
-                    unsafe { *out_value = *val };
-                    0
-                } else {
-                    -3
-                }
-            } else {
-                -4
-            }
-        }
-        Err(_) => -2,
-    }
-}
-
-/// Fetches the double/[`f64`] (idk why its called float but cbb to change) value of an entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_float_property(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    label: *const c_char,
-    out_value: *mut f64,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() || out_value.is_null() {
-        return -1;
-    }
-
-    let world = unsafe { &*world_ptr };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s,
-        Err(_) => return -108,
-    };
-
-    match world.query_one::<(&MeshRenderer, &CustomProperties)>(entity) {
-        Ok(mut q) => {
-            if let Some((_, props)) = q.get() {
-                if let Some(Value::Float(val)) = props.get_property(label_str) {
-                    unsafe { *out_value = *val as f64 };
-                    0
-                } else {
-                    -3
-                }
-            } else {
-                -4
-            }
-        }
-        Err(_) => -2,
-    }
-}
-
-/// Fetches the boolean property of an entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_bool_property(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    label: *const c_char,
-    out_value: *mut Bool,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() || out_value.is_null() {
-        return -1;
-    }
-
-    let world = unsafe { &*world_ptr };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s,
-        Err(_) => return -108,
-    };
-
-    match world.query_one::<(&MeshRenderer, &CustomProperties)>(entity) {
-        Ok(mut q) => {
-            if let Some((_, props)) = q.get() {
-                if let Some(Value::Bool(val)) = props.get_property(label_str) {
-                    unsafe { *out_value = if *val { 1 } else { 0 } };
-                    0
-                } else {
-                    -3
-                }
-            } else {
-                -4
-            }
-        }
-        Err(_) => -2,
-    }
-}
-
-/// Fetches the Vector3<float> property of an entity
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_vec3_property(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    label: *const c_char,
-    out_x: *mut f32,
-    out_y: *mut f32,
-    out_z: *mut f32,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null()
-        || label.is_null()
-        || out_x.is_null()
-        || out_y.is_null()
-        || out_z.is_null()
-    {
-        return -1;
-    }
-
-    let world = unsafe { &*world_ptr };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s,
-        Err(_) => return -108,
-    };
-
-    match world.query_one::<(&MeshRenderer, &CustomProperties)>(entity) {
-        Ok(mut q) => {
-            if let Some((_, props)) = q.get() {
-                if let Some(Value::Vec3([x, y, z])) = props.get_property(label_str) {
-                    unsafe {
-                        *out_x = *x;
-                        *out_y = *y;
-                        *out_z = *z;
-                    }
-                    0
-                } else {
-                    -3
-                }
-            } else {
-                -4
-            }
-        }
-        Err(_) => -2,
-    }
-}
-
-/// Sets the string property of an entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_set_string_property(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    label: *const c_char,
-    value: *const c_char,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() || value.is_null() {
-        return -1;
-    }
-
-    let world = unsafe { &mut *(world_ptr as *mut World) };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s.to_string(),
-        Err(_) => return -108,
-    };
-
-    let value_str = match unsafe { CStr::from_ptr(value) }.to_str() {
-        Ok(s) => s.to_string(),
-        Err(_) => return -108,
-    };
-
-    match world.query_one_mut::<(&MeshRenderer, &mut CustomProperties)>(entity) {
-        Ok((_, props)) => {
-            props.set_property(label_str, Value::String(value_str));
-            0
-        }
-        Err(_) => -2,
-    }
-}
-
-/// Sets the integer property of an entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_set_int_property(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    label: *const c_char,
-    value: i32,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() {
-        return -1;
-    }
-
-    let world = unsafe { &mut *(world_ptr as *mut World) };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s.to_string(),
-        Err(_) => return -108,
-    };
-
-    match world.query_one_mut::<(&MeshRenderer, &mut CustomProperties)>(entity) {
-        Ok((_, props)) => {
-            props.set_property(label_str, Value::Int(value as Handle));
-            0
-        }
-        Err(_) => -2,
-    }
-}
-
-/// Sets the long property of an entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_set_long_property(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    label: *const c_char,
-    value: Handle,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() {
-        return -1;
-    }
-
-    let world = unsafe { &mut *(world_ptr as *mut World) };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s.to_string(),
-        Err(_) => return -108,
-    };
-
-    match world.query_one_mut::<(&MeshRenderer, &mut CustomProperties)>(entity) {
-        Ok((_, props)) => {
-            props.set_property(label_str, Value::Int(value));
-            0
-        }
-        Err(_) => -2,
-    }
-}
-
-/// Sets the float property of an entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_set_float_property(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    label: *const c_char,
-    value: f32,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() {
-        return -1;
-    }
-
-    let world = unsafe { &mut *(world_ptr as *mut World) };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s.to_string(),
-        Err(_) => return -108,
-    };
-
-    match world.query_one_mut::<(&MeshRenderer, &mut CustomProperties)>(entity) {
-        Ok((_, props)) => {
-            props.set_property(label_str, Value::Float(value as f64));
-            0
-        }
-        Err(_) => -2,
-    }
-}
-
-/// Sets the boolean property of an entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_set_bool_property(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    label: *const c_char,
-    value: Bool,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() {
-        return -1;
-    }
-
-    let world = unsafe { &mut *(world_ptr as *mut World) };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s.to_string(),
-        Err(_) => return -108,
-    };
-
-    match world.query_one_mut::<(&MeshRenderer, &mut CustomProperties)>(entity) {
-        Ok((_, props)) => {
-            props.set_property(label_str, Value::Bool(value != 0));
-            0
-        }
-        Err(_) => -2,
-    }
-}
-
-/// Sets the Vector3<float> property of an entity.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_set_vec3_property(
-    world_ptr: *const World,
-    entity_handle: Handle,
-    label: *const c_char,
-    x: f32,
-    y: f32,
-    z: f32,
-) -> DropbearNativeReturn {
-    if world_ptr.is_null() || label.is_null() {
-        return -1;
-    }
-
-    let world = unsafe { &mut *(world_ptr as *mut World) };
-    let entity = unsafe { world.find_entity_from_id(entity_handle as u32) };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s.to_string(),
-        Err(_) => return -108,
-    };
-
-    match world.query_one_mut::<(&MeshRenderer, &mut CustomProperties)>(entity) {
-        Ok((_, props)) => {
-            props.set_property(label_str, Value::Vec3([x, y, z]));
-            0
-        }
-        Err(_) => -2,
-    }
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/components/mod.rs b/eucalyptus-core/src/scripting/native/exports/components/mod.rs
deleted file mode 100644
index d5a0f6b..0000000
--- a/eucalyptus-core/src/scripting/native/exports/components/mod.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-pub mod dropbear_camera;
-pub mod dropbear_entitytransform;
-pub mod dropbear_hierarchy;
-pub mod dropbear_label;
-pub mod dropbear_meshrenderer;
-pub mod dropbear_properties;
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/dropbear_common.rs b/eucalyptus-core/src/scripting/native/exports/dropbear_common.rs
deleted file mode 100644
index 9856d93..0000000
--- a/eucalyptus-core/src/scripting/native/exports/dropbear_common.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-use crate::ptr::{AssetRegistryPtr, CommandBufferPtr, InputStatePtr, PhysicsStatePtr, SceneLoaderPtr, WorldPtr};
-
-/// The return code for a function.
-///
-/// Follows the same code as [`DropbearNativeError`]
-pub type DropbearNativeReturn = i32;
-
-/// The handle/id of an object, as a long.
-///
-/// Kotlin/Native requires this to be an `int64_t` or a Long.
-pub type Handle = i64;
-
-/// A helper type that defines a value that can either be a 0 or 1.
-pub type Bool = i32;
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/dropbear_engine.rs b/eucalyptus-core/src/scripting/native/exports/dropbear_engine.rs
deleted file mode 100644
index 1c5e7a1..0000000
--- a/eucalyptus-core/src/scripting/native/exports/dropbear_engine.rs
+++ /dev/null
@@ -1,119 +0,0 @@
-use std::ffi::{c_char, CStr};
-use hecs::World;
-use dropbear_engine::utils::ResourceReference;
-use crate::ptr::{AssetRegistryPtr, CommandBufferPtr};
-use crate::scripting::native::DropbearNativeError;
-use crate::scripting::native::exports::dropbear_common::{DropbearNativeReturn, Handle};
-use crate::states::Label;
-use crate::command::CommandBuffer;
-
-/// Fetches an entity from the world/current scene by its label.
-///
-/// Returns the entity's id.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_entity(
-    label: *const c_char,
-    world_ptr: *const World,
-    out_entity: *mut Handle,
-) -> DropbearNativeReturn {
-    if label.is_null() || world_ptr.is_null() || out_entity.is_null() {
-        eprintln!("[dropbear_get_entity] [ERROR] received null pointer");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let world = unsafe { &*world_ptr };
-
-    let label_str = match unsafe { CStr::from_ptr(label) }.to_str() {
-        Ok(s) => s,
-        Err(_) => {
-            eprintln!("[dropbear_get_entity] [ERROR] invalid UTF-8 in label");
-            return DropbearNativeError::InvalidUTF8 as i32;
-        }
-    };
-
-    for (id, entity_label) in world.query::<&Label>().iter() {
-        if entity_label.as_str() == label_str {
-            unsafe { *out_entity = id.id() as i64 };
-            return DropbearNativeError::Success as i32;
-        }
-    }
-
-    eprintln!(
-        "[dropbear_get_entity] [ERROR] Entity with label '{}' not found",
-        label_str
-    );
-    DropbearNativeError::EntityNotFound as i32
-}
-
-/// Fetches an asset from the asset registry as by its name.
-///
-/// Returns the asset's handle.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_asset(
-    asset_ptr: AssetRegistryPtr,
-    uri: *const c_char,
-    out_asset_id: *mut i64,
-) -> DropbearNativeReturn {
-    if asset_ptr.is_null() || uri.is_null() || out_asset_id.is_null() {
-        eprintln!("[dropbear_get_asset] [ERROR] Null pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let asset = &*asset_ptr;
-    let uri_str = match CStr::from_ptr(uri).to_str() {
-        Ok(s) => s.to_string(),
-        Err(_) => {
-            eprintln!("[dropbear_get_asset] [ERROR] Invalid UTF-8 in URI");
-            return DropbearNativeError::InvalidUTF8 as i32;
-        }
-    };
-
-    let reference = match ResourceReference::from_euca_uri(uri_str) {
-        Ok(reference) => reference,
-        Err(err) => {
-            eprintln!(
-                "[dropbear_get_asset] [ERROR] Failed to parse resource reference: {}",
-                err
-            );
-            return DropbearNativeError::UnknownError as i32;
-        }
-    };
-
-    if let Some(handle) = asset.get_handle_from_reference(&reference) {
-        unsafe {
-            *out_asset_id = handle.raw() as i64;
-        }
-        DropbearNativeError::Success as i32
-    } else {
-        eprintln!("[dropbear_get_asset] [ERROR] Asset not found");
-        DropbearNativeError::EntityNotFound as i32
-    }
-}
-
-/// Quits the currently running app or game.
-///
-/// Does not return anything. If any issues occur, it will panic.
-///
-/// # Behaviours
-/// - eucalyptus-editor - When called, this exits your Play Mode session and brings you back to
-///                       `EditorState::Editing`
-/// - redback-runtime - When called, this will exit your current process and kill the app as is. It will
-///                     also drop any pointers and do any additional clean-up.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_quit(
-    command_ptr: CommandBufferPtr,
-) {
-    if command_ptr.is_null() {
-        panic!("NullPointer (-1) while quitting, better off to shoot with gun than to nicely ask...")
-    }
-
-    let graphics = unsafe { &*(command_ptr as CommandBufferPtr) };
-
-    if graphics
-        .send(CommandBuffer::Quit)
-        .is_err()
-    {
-        panic!("SendError (-7) while sending a quit signal to the CommandBuffer, \
-        better off to shoot with gun than to nicely ask...")
-    }
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/dropbear_input.rs b/eucalyptus-core/src/scripting/native/exports/dropbear_input.rs
deleted file mode 100644
index 53537aa..0000000
--- a/eucalyptus-core/src/scripting/native/exports/dropbear_input.rs
+++ /dev/null
@@ -1,392 +0,0 @@
-use crate::ptr::{CommandBufferPtr, InputStatePtr};
-use crate::scripting::native::DropbearNativeError;
-use crate::scripting::native::exports::dropbear_common::{Bool, DropbearNativeReturn, Handle};
-use crate::utils::keycode_from_ordinal;
-use crate::command::{CommandBuffer, WindowCommand};
-use crate::scripting::native::exports::dropbear_math::Vector2D;
-use crate::scripting::utils::button_from_ordinal;
-
-/// A struct that represents an external input device in the shape of a controller.
-#[repr(C)]
-#[derive(Clone, Debug)]
-pub struct Gamepad {
-    id: i32,
-    left_stick_pos: Vector2D,
-    right_stick_pos: Vector2D,
-}
-
-/// Prints the input state to the console. Does not return anything, failure does not do anything.
-///
-/// Can be useful for debugging.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_print_input_state(input_state_ptr: InputStatePtr) {
-    if input_state_ptr.is_null() {
-        eprintln!("[dropbear_print_input_state] [ERROR] Input state pointer is null");
-        return;
-    }
-
-    let input_state = unsafe { &*input_state_ptr };
-    println!("{:#?}", input_state);
-}
-
-/// Checks if a key is currently pressed. If pressed, returns 1, otherwise 0.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_is_key_pressed(
-    input_state_ptr: InputStatePtr,
-    keycode: i32,
-    out_value: *mut Bool,
-) -> DropbearNativeReturn {
-    if input_state_ptr.is_null() || out_value.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let input = unsafe { &*input_state_ptr };
-
-    match keycode_from_ordinal(keycode) {
-        Some(k) => {
-            let is_pressed = input.pressed_keys.contains(&k);
-            unsafe { *out_value = if is_pressed { 1 } else { 0 } };
-            DropbearNativeError::Success as i32
-        }
-        None => {
-            eprintln!("[dropbear_is_key_pressed] [WARN] Invalid keycode");
-            unsafe { *out_value = 0 };
-            DropbearNativeError::Success as i32
-        }
-    }
-}
-
-/// Fetches the current mouse position for that frame.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_mouse_position(
-    input_state_ptr: InputStatePtr,
-    out_x: *mut f32,
-    out_y: *mut f32,
-) -> DropbearNativeReturn {
-    if input_state_ptr.is_null() || out_x.is_null() || out_y.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let input = unsafe { &*input_state_ptr };
-
-    unsafe {
-        *out_x = input.mouse_pos.0 as f32;
-        *out_y = input.mouse_pos.1 as f32;
-    }
-
-    DropbearNativeError::Success as i32
-}
-
-/// Checks if a mouse button is currently pressed. If pressed, returns 1, otherwise 0.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_is_mouse_button_pressed(
-    input_state_ptr: InputStatePtr,
-    button_code: i32,
-    out_pressed: *mut Bool,
-) -> DropbearNativeReturn {
-    if input_state_ptr.is_null() || out_pressed.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let input = unsafe { &*input_state_ptr };
-
-    let button = match button_code {
-        0 => Some(winit::event::MouseButton::Left),
-        1 => Some(winit::event::MouseButton::Right),
-        2 => Some(winit::event::MouseButton::Middle),
-        3 => Some(winit::event::MouseButton::Back),
-        4 => Some(winit::event::MouseButton::Forward),
-        _ => None,
-    };
-
-    match button {
-        None => {
-            eprintln!("[dropbear_is_mouse_button_pressed] [WARN] Invalid button code");
-            unsafe { *out_pressed = 0 };
-        }
-        Some(btn) => {
-            if input.mouse_button.contains(&btn) {
-                unsafe { *out_pressed = 1 };
-            } else {
-                unsafe { *out_pressed = 0 };
-            }
-        }
-    }
-
-    DropbearNativeError::Success as i32
-}
-
-/// Fetches the delta of the mouse position since the last frame.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_mouse_delta(
-    input_state_ptr: InputStatePtr,
-    out_delta_x: *mut f32,
-    out_delta_y: *mut f32,
-) -> DropbearNativeReturn {
-    if input_state_ptr.is_null() || out_delta_x.is_null() || out_delta_y.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let input = unsafe { &mut *(input_state_ptr as InputStatePtr) };
-
-    if let Some(pos) = input.mouse_delta {
-        unsafe {
-            *out_delta_x = pos.0 as f32;
-            *out_delta_y = pos.1 as f32;
-        }
-    } else {
-        unsafe {
-            *out_delta_x = 0.0;
-            *out_delta_y = 0.0;
-        }
-    }
-
-    DropbearNativeError::Success as i32
-}
-
-/// Checks if the cursor is currently locked. If locked, returns 1, otherwise 0.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_is_cursor_locked(
-    input_state_ptr: InputStatePtr,
-    out_locked: *mut Bool,
-) -> DropbearNativeReturn {
-    if input_state_ptr.is_null() || out_locked.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let input = unsafe { &*input_state_ptr };
-
-    unsafe { *out_locked = if input.is_cursor_locked { 1 } else { 0 } };
-
-    DropbearNativeError::Success as i32
-}
-
-/// Sets the mouse cursor to be locked or unlocked.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_set_cursor_locked(
-    input_state_ptr: InputStatePtr,
-    queue_ptr: CommandBufferPtr,
-    locked: Bool,
-) -> DropbearNativeReturn {
-    if input_state_ptr.is_null() || queue_ptr.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let input = unsafe { &mut *(input_state_ptr as InputStatePtr) };
-
-    let graphics = unsafe { &*(queue_ptr as CommandBufferPtr) };
-
-    input.is_cursor_locked = locked != 0;
-
-    if graphics
-        .send(CommandBuffer::WindowCommand(WindowCommand::WindowGrab(
-            input.is_cursor_locked,
-        )))
-        .is_err()
-    {
-        DropbearNativeError::SendError as i32
-    } else {
-        DropbearNativeError::Success as i32
-    }
-}
-
-/// Fetches the mouse position of the previous frame.
-///
-/// Can be used to calculate the delta of the mouse position.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_last_mouse_pos(
-    input_state_ptr: InputStatePtr,
-    out_x: *mut f32,
-    out_y: *mut f32,
-) -> DropbearNativeReturn {
-    if input_state_ptr.is_null() || out_x.is_null() || out_y.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let input = unsafe { &*input_state_ptr };
-
-    if let Some(pos) = input.last_mouse_pos {
-        unsafe {
-            *out_x = pos.0 as f32;
-            *out_y = pos.1 as f32;
-        }
-    } else {
-        unsafe {
-            *out_x = 0.0;
-            *out_y = 0.0;
-        }
-    }
-
-    DropbearNativeError::Success as i32
-}
-
-/// Checks if the cursor is currently hidden. If hidden, returns 1, otherwise 0.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_is_cursor_hidden(
-    input_state_ptr: InputStatePtr,
-    out_hidden: *mut Bool,
-) -> DropbearNativeReturn {
-    if input_state_ptr.is_null() || out_hidden.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let input = unsafe { &*input_state_ptr };
-
-    unsafe { *out_hidden = if input.is_cursor_hidden { 1 } else { 0 } };
-
-    DropbearNativeError::Success as i32
-}
-
-/// Sets the cursor to either hidden (invisible) or visible
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_set_cursor_hidden(
-    input_state_ptr: InputStatePtr,
-    queue_ptr: CommandBufferPtr,
-    hidden: Bool,
-) -> DropbearNativeReturn {
-    if input_state_ptr.is_null() || queue_ptr.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let input = unsafe { &mut *(input_state_ptr as InputStatePtr) };
-    let graphics = unsafe { &*(queue_ptr as CommandBufferPtr) };
-    input.is_cursor_hidden = hidden != 0;
-
-    if graphics
-        .send(CommandBuffer::WindowCommand(WindowCommand::HideCursor(
-            input.is_cursor_hidden,
-        )))
-        .is_err()
-    {
-        DropbearNativeError::SendError as i32
-    } else {
-        DropbearNativeError::Success as i32
-    }
-}
-
-/// Fetches all available connected gamepads in the input state.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_connected_gamepads(
-    input_state_ptr: InputStatePtr,
-    out_gamepads: *mut *const Gamepad,
-    out_count: *mut i32,
-) -> DropbearNativeReturn {
-    if input_state_ptr.is_null() {
-        eprintln!("[dropbear_get_connected_gamepads] [ERROR] Input state pointer provided was null");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    if out_gamepads.is_null() {
-        eprintln!("[dropbear_get_connected_gamepads] [ERROR] out_gamepads pointer provided was null");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    if out_count.is_null() {
-        eprintln!("[dropbear_get_connected_gamepads] [ERROR] out_count of gamepads pointer provided was null");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let input_state = &mut *input_state_ptr;
-
-
-    let mut gamepads = Vec::new();
-    for g in &input_state.connected_gamepads {
-        let id: usize = (*g).into();
-        let left_stick = input_state.left_stick_position.get(&g);
-        let right_stick = input_state.right_stick_position.get(&g);
-
-        if let Some(l) = left_stick && let Some(r) = right_stick {
-            let l = l.clone();
-            let r = r.clone();
-
-            let gamepad = Gamepad {
-                id: id as i32,
-                left_stick_pos: Vector2D {
-                    x: l.0 as f64,
-                    y: l.1 as f64,
-                },
-                right_stick_pos: Vector2D {
-                    x: r.0 as f64,
-                    y: r.1 as f64,
-                },
-            };
-            gamepads.push(gamepad);
-        }
-    }
-
-    input_state.cached_gamepads = gamepads;
-
-    unsafe {
-        *out_count = input_state.cached_gamepads.len() as i32;
-        *out_gamepads = input_state.cached_gamepads.as_ptr();
-    }
-
-    DropbearNativeError::Success as i32
-}
-
-/// Checks if a button has been pressed on a specific gamepad. 
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_is_gamepad_button_pressed(
-    input_state_ptr: InputStatePtr,
-    gamepad_id: Handle,
-    button_ordinal: i32,
-    out_pressed: *mut Bool,
-) -> DropbearNativeReturn {
-    if input_state_ptr.is_null() {
-        eprintln!("[dropbear_is_gamepad_button_pressed] [ERROR] Input state pointer provided was null");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    if out_pressed.is_null() {
-        eprintln!("[dropbear_is_gamepad_button_pressed] [ERROR] out_pressed pointer provided was null");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let input_state = &*input_state_ptr;
-
-    if gamepad_id < 0 {
-        eprintln!(
-            "[dropbear_is_gamepad_button_pressed] [ERROR] Invalid gamepad id (negative): {}",
-            gamepad_id
-        );
-        return DropbearNativeError::InvalidArgument as i32;
-    }
-
-    let gamepad_id_usize = gamepad_id as usize;
-    let maybe_gid = input_state
-        .connected_gamepads
-        .iter()
-        .find(|gid| {
-            let id: usize = (**gid).into();
-            id == gamepad_id_usize
-        })
-        .copied();
-
-    let gid = match maybe_gid {
-        Some(gid) => gid,
-        None => {
-            eprintln!(
-                "[dropbear_is_gamepad_button_pressed] [ERROR] Gamepad with id {} not found",
-                gamepad_id
-            );
-            return DropbearNativeError::GamepadNotFound as i32;
-        }
-    };
-
-    let button = match button_from_ordinal(button_ordinal) {
-        Ok(btn) => btn,
-        Err(_) => {
-            eprintln!(
-                "[dropbear_is_gamepad_button_pressed] [ERROR] Invalid button ordinal: {}",
-                button_ordinal
-            );
-            return DropbearNativeError::InvalidArgument as i32;
-        }
-    };
-
-    let is_pressed = input_state.is_button_pressed(gid, button);
-
-    *out_pressed = if is_pressed { 1 } else { 0 };
-
-    DropbearNativeError::Success as i32
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/dropbear_math.rs b/eucalyptus-core/src/scripting/native/exports/dropbear_math.rs
deleted file mode 100644
index ca54970..0000000
--- a/eucalyptus-core/src/scripting/native/exports/dropbear_math.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-/// Represents a [`Vec2`] in a C struct form.
-#[repr(C)]
-#[derive(Clone, Debug)]
-pub struct Vector2D {
-    pub x: f64,
-    pub y: f64,
-}
-
-/// Represents a [`Vec3`] in a C struct form.
-#[repr(C)]
-pub struct Vector3D {
-    pub x: f64,
-    pub y: f64,
-    pub z: f64,
-}
-
-/// Represents a [`Transform`] in a C struct form. 
-#[repr(C)]
-pub struct NativeTransform {
-    pub position_x: f64,
-    pub position_y: f64,
-    pub position_z: f64,
-    pub rotation_x: f64,
-    pub rotation_y: f64,
-    pub rotation_z: f64,
-    pub rotation_w: f64,
-    pub scale_x: f64,
-    pub scale_y: f64,
-    pub scale_z: f64,
-}
-
-/// Represents an [`EntityTransform`] in a C struct form. 
-#[repr(C)]
-pub struct NativeEntityTransform {
-    pub local: NativeTransform,
-    pub world: NativeTransform,
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/dropbear_scene.rs b/eucalyptus-core/src/scripting/native/exports/dropbear_scene.rs
deleted file mode 100644
index 4e014ca..0000000
--- a/eucalyptus-core/src/scripting/native/exports/dropbear_scene.rs
+++ /dev/null
@@ -1,238 +0,0 @@
-use std::ffi::{c_char, CStr, CString};
-use crate::command::CommandBuffer;
-use crate::ptr::{CommandBufferPtr, SceneLoaderPtr};
-use crate::scripting::native::DropbearNativeError;
-use crate::scripting::native::exports::dropbear_common::{DropbearNativeReturn, Handle};
-use crate::scripting::native::exports::dropbear_utils::Progress;
-use crate::scene::loading::{SceneLoadHandle as CoreSceneLoadHandle};
-
-/// The sister to [`crate::scene::loading::SceneLoadResult`], which provides C-compatible enum values.
-#[repr(C)]
-#[derive(Default)]
-pub enum SceneLoadResult {
-    Pending = 0,
-    Success = 1,
-    #[default]
-    Error = 2,
-}
-
-impl From<SceneLoadResult> for i32 {
-    fn from(value: SceneLoadResult) -> Self {
-        value as i32
-    }
-}
-
-impl From<i32> for SceneLoadResult {
-    fn from(value: i32) -> Self {
-        match value {
-            -1 => SceneLoadResult::Error,
-            0 => SceneLoadResult::Pending,
-            1 => SceneLoadResult::Success,
-            _ => SceneLoadResult::Error,
-        }
-    }
-}
-
-impl From<crate::scene::loading::SceneLoadResult> for SceneLoadResult {
-    fn from(value: crate::scene::loading::SceneLoadResult) -> Self {
-        match value {
-            crate::scene::loading::SceneLoadResult::Pending => SceneLoadResult::Pending,
-            crate::scene::loading::SceneLoadResult::Success => SceneLoadResult::Success,
-            crate::scene::loading::SceneLoadResult::Error(_) => SceneLoadResult::Error,
-        }
-    }
-}
-
-/// The sister handle to [`crate::scene::loading::SceneLoadHandle`], which provides C-compatible values.
-#[repr(C)]
-pub struct SceneLoadHandle {
-    pub id: Handle,
-    pub name: *mut c_char,
-}
-
-/// Loads a scene asynchronously.
-///
-/// Returns a handle (in the form of an integer)
-/// to the scene load operation.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_load_scene_async_1(
-    command_buffer_ptr: CommandBufferPtr,
-    scene_loader_ptr: SceneLoaderPtr,
-    scene_name: *const c_char,
-    out_scene_handle: *mut SceneLoadHandle,
-) -> DropbearNativeReturn {
-    if command_buffer_ptr.is_null() || scene_loader_ptr.is_null() || scene_name.is_null() || out_scene_handle.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let command_buffer = &*command_buffer_ptr;
-    let scene_loader = &*scene_loader_ptr;
-    
-    let Ok(scene_name_str) = CStr::from_ptr(scene_name).to_str() else {
-        return DropbearNativeError::InvalidUTF8 as i32;
-    };
-    let scene_name_string = scene_name_str.to_string();
-
-    let mut loader = scene_loader.lock();
-    let id = loader.register_load(scene_name_string.clone());
-    
-    let c_string = match CString::new(scene_name_string.clone()) {
-        Ok(s) => s,
-        Err(_) => return DropbearNativeError::InvalidUTF8 as i32,
-    };
-    
-    *out_scene_handle = SceneLoadHandle {
-        id: id as Handle,
-        name: c_string.into_raw(),
-    };
-
-    let core_handle = CoreSceneLoadHandle {
-        id,
-        scene_name: scene_name_string,
-    };
-    
-    if command_buffer.try_send(CommandBuffer::LoadSceneAsync(core_handle)).is_err() {
-        return DropbearNativeError::SendError as i32;
-    }
-
-    DropbearNativeError::Success as i32
-}
-
-/// Loads a scene asynchronously. Allows you to include a loading_scene_name,
-/// which will be displayed while the scene is loading.
-///
-/// Returns a handle (in the form of an integer)
-/// to the scene load operation.
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_load_scene_async_2(
-    _command_buffer_ptr: CommandBufferPtr,
-    _scene_loader_ptr: SceneLoaderPtr,
-    _scene_name: *const c_char,
-    _loading_scene_name: *const c_char,
-    _out_scene_handle: *mut SceneLoadHandle,
-) -> DropbearNativeReturn {
-    todo!("Not implemented yet")
-}
-
-/// Switches to a scene asynchronously.
-///
-/// This must be run after you initialise the scene loading (using [`dropbear_load_scene_async_1`]
-/// or [`dropbear_load_scene_async_2`]). If this function is called before you have checked the progress
-/// (with the [`dropbear_get_scene_load_status`] function), it will return -10 or [`DropbearNativeError::PrematureSceneSwitch`].
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_switch_to_scene_async(
-    command_buffer_ptr: CommandBufferPtr,
-    scene_handle: SceneLoadHandle,
-) -> DropbearNativeReturn {
-    if command_buffer_ptr.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-    
-    let command_buffer = &*command_buffer_ptr;
-    
-    if scene_handle.name.is_null() {
-         return DropbearNativeError::NullPointer as i32;
-    }
-    
-    let Ok(scene_name) = CStr::from_ptr(scene_handle.name).to_str() else {
-        return DropbearNativeError::InvalidUTF8 as i32;
-    };
-
-    let core_handle = CoreSceneLoadHandle {
-        id: scene_handle.id as u64,
-        scene_name: scene_name.to_string(),
-    };
-
-    if command_buffer.try_send(CommandBuffer::SwitchToAsync(core_handle)).is_err() {
-        return DropbearNativeError::SendError as i32;
-    }
-
-    DropbearNativeError::Success as i32
-}
-
-/// Switches to a scene immediately.
-///
-/// # Warning
-/// This will block your main thread and freeze the window. It will be extremely inconvenient for
-/// your players, and is recommended to use [`dropbear_load_scene_async_1`] or
-/// [`dropbear_load_scene_async_2`].
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_switch_to_scene_immediate(
-    command_buffer_ptr: CommandBufferPtr,
-    scene_name: *const c_char,
-) -> DropbearNativeReturn {
-    if command_buffer_ptr.is_null() {
-        eprintln!("[dropbear_switch_to_scene_immediate] [ERROR] Null command buffer pointer received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    if scene_name.is_null() {
-        eprintln!("[dropbear_switch_to_scene_immediate] [ERROR] Null scene name received");
-        return DropbearNativeError::NullPointer as i32;
-    }
-
-    let command_buffer =  &*command_buffer_ptr;
-    let Ok(scene_name) = CStr::from_ptr(scene_name).to_str() else {
-        return DropbearNativeError::InvalidUTF8 as i32;
-    };
-    
-    if command_buffer.try_send(CommandBuffer::SwitchSceneImmediate(scene_name.to_string())).is_err() {
-        return DropbearNativeError::SendError as i32;
-    }
-    
-    DropbearNativeError::Success as i32
-}
-
-/// Gets the progress of a scene load operation.
-///
-/// Returns a [`Progress`] and a [`DropbearNativeReturn`]
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_scene_load_progress(
-    scene_loader_ptr: SceneLoaderPtr,
-    scene_handle: SceneLoadHandle,
-    out_progress: *mut Progress,
-) -> DropbearNativeReturn {
-    if scene_loader_ptr.is_null() || out_progress.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-    
-    let scene_loader = &*scene_loader_ptr;
-    let loader = scene_loader.lock();
-    
-    if let Some(entry) = loader.get_entry(scene_handle.id as u64) {
-        let p = &entry.progress;
-        let c_message = CString::new(p.message.clone()).unwrap_or_default();
-        *out_progress = Progress {
-            current: p.current as f64,
-            total: p.total as f64,
-            message: c_message.into_raw(),
-        };
-        DropbearNativeError::Success as i32
-    } else {
-        DropbearNativeError::GenericError as i32
-    }
-}
-
-/// Gets the status of a scene load operation
-///
-/// Returns a [`SceneLoadResult`] and a [`DropbearNativeReturn`]
-#[unsafe(no_mangle)]
-pub unsafe extern "C" fn dropbear_get_scene_load_status(
-    scene_loader_ptr: SceneLoaderPtr,
-    scene_handle: SceneLoadHandle,
-    out_status: *mut SceneLoadResult,
-) -> DropbearNativeReturn {
-    if scene_loader_ptr.is_null() || out_status.is_null() {
-        return DropbearNativeError::NullPointer as i32;
-    }
-    
-    let scene_loader = &*scene_loader_ptr;
-    let loader = scene_loader.lock();
-    
-    if let Some(entry) = loader.get_entry(scene_handle.id as u64) {
-        *out_status = entry.result.clone().into();
-        DropbearNativeError::Success as i32
-    } else {
-        DropbearNativeError::GenericError as i32
-    }
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/scripting/native/exports/dropbear_utils.rs b/eucalyptus-core/src/scripting/native/exports/dropbear_utils.rs
deleted file mode 100644
index ede6610..0000000
--- a/eucalyptus-core/src/scripting/native/exports/dropbear_utils.rs
+++ /dev/null
@@ -1,12 +0,0 @@
-use std::ffi::{c_char};
-
-/// A double-precision floating point number. Convenient!
-pub type Double = f64;
-
-/// The sister to [`crate::utils::Progress`], which provides C-compatible values.
-#[repr(C)]
-pub struct Progress {
-    pub current: Double,
-    pub total: Double,
-    pub message: *mut c_char,
-}
\ No newline at end of file
diff --git a/eucalyptus-core/src/states.rs b/eucalyptus-core/src/states.rs
index bfbca64..4f31dec 100644
--- a/eucalyptus-core/src/states.rs
+++ b/eucalyptus-core/src/states.rs
@@ -20,7 +20,7 @@ use std::fmt;
 use std::fmt::{Display, Formatter};
 use std::ops::{Deref, DerefMut};
 use std::path::PathBuf;
-use hecs::World;
+use hecs::{Entity, World};
 use crate::properties::Value;
 
 /// A global "singleton" that contains the configuration of a project.
@@ -279,15 +279,11 @@ pub enum WorldLoadingStatus {
     Completed,
 }
 
-#[derive(Clone, Serialize, Deserialize, bincode::Encode, bincode::Decode)]
+#[derive(Clone, Serialize, Deserialize)]
 pub struct RuntimeData {
-    #[bincode(with_serde)]
     pub project_config: ProjectConfig,
-    #[bincode(with_serde)]
     pub source_config: SourceConfig,
-    #[bincode(with_serde)]
     pub scene_data: Vec<SceneConfig>,
-    #[bincode(with_serde)]
     pub scripts: HashMap<String, String>,
 }
 
@@ -332,7 +328,7 @@ impl Label {
     }
     
     pub fn locate_entity(&self, world: &World) -> Option<hecs::Entity> {
-        world.query::<&Label>().iter().find_map(|(e, l)| if l == self { Some(e.clone()) } else { None })
+        world.query::<(Entity, &Label)>().iter().find_map(|(e, l)| if l == self { Some(e.clone()) } else { None })
     }
 }
 
diff --git a/eucalyptus-core/src/transform.rs b/eucalyptus-core/src/transform.rs
index b6a2d38..86977dc 100644
--- a/eucalyptus-core/src/transform.rs
+++ b/eucalyptus-core/src/transform.rs
@@ -152,7 +152,7 @@ pub mod jni {
     use jni::JNIEnv;
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_EntityTransformNative_entityTransformExistsForEntity(
+    pub extern "system" fn Java_com_dropbear_components_EntityTransformNative_entityTransformExistsForEntity(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -165,7 +165,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_EntityTransformNative_getLocalTransform(
+    pub extern "system" fn Java_com_dropbear_components_EntityTransformNative_getLocalTransform(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -186,7 +186,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_EntityTransformNative_setLocalTransform(
+    pub extern "system" fn Java_com_dropbear_components_EntityTransformNative_setLocalTransform(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -212,7 +212,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_EntityTransformNative_getWorldTransform(
+    pub extern "system" fn Java_com_dropbear_components_EntityTransformNative_getWorldTransform(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -233,7 +233,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_EntityTransformNative_setWorldTransform(
+    pub extern "system" fn Java_com_dropbear_components_EntityTransformNative_setWorldTransform(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -256,7 +256,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub fn Java_com_dropbear_components_EntityTransformNative_propagateTransform(
+    pub extern "system" fn Java_com_dropbear_components_EntityTransformNative_propagateTransform(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
diff --git a/eucalyptus-editor/Cargo.toml b/eucalyptus-editor/Cargo.toml
index b2ff594..d96e566 100644
--- a/eucalyptus-editor/Cargo.toml
+++ b/eucalyptus-editor/Cargo.toml
@@ -13,7 +13,7 @@ magna-carta = { path = "../magna-carta" }
 
 anyhow.workspace = true
 app_dirs2.workspace = true
-bincode.workspace = true
+postcard.workspace = true
 bytemuck.workspace = true
 dropbear-engine.workspace = true
 egui-toast.workspace = true
diff --git a/eucalyptus-editor/src/build.rs b/eucalyptus-editor/src/build.rs
index 7aec8be..e86eb37 100644
--- a/eucalyptus-editor/src/build.rs
+++ b/eucalyptus-editor/src/build.rs
@@ -76,7 +76,8 @@ pub fn build(project_config: PathBuf) -> anyhow::Result<PathBuf> {
 
     // export to .eupak
     let eupak_path = build_dir.join("data.eupak");
-    let config_bytes = bincode::encode_to_vec(&runtime_config, bincode::config::standard())?;
+    const SIZE_OF_RUNTIME_PROJECT_CONFIG: usize = size_of::<RuntimeProjectConfig>();
+    let config_bytes = postcard::to_vec::<RuntimeProjectConfig, SIZE_OF_RUNTIME_PROJECT_CONFIG>(&runtime_config)?;
     fs::write(&eupak_path, config_bytes)?;
     log::debug!("Exported scene config to {:?}", eupak_path);
 
@@ -113,7 +114,7 @@ fn copy_dir_recursive(src: &Path, dst: &Path) -> anyhow::Result<()> {
 pub fn read(eupak: PathBuf) -> anyhow::Result<RuntimeProjectConfig> {
     let bytes = std::fs::read(&eupak)?;
     let (content, _): (RuntimeProjectConfig, usize) =
-        bincode::decode_from_slice(&bytes, bincode::config::standard())?;
+        postcard::from_bytes(&bytes)?;
 
     let str = ron::ser::to_string_pretty(&content, PrettyConfig::default())?;
 
diff --git a/eucalyptus-editor/src/editor/dock.rs b/eucalyptus-editor/src/editor/dock.rs
index 55c7753..f778cb6 100644
--- a/eucalyptus-editor/src/editor/dock.rs
+++ b/eucalyptus-editor/src/editor/dock.rs
@@ -273,19 +273,13 @@ impl<'a> TabViewer for EditorTabViewer<'a> {
                 let active_cam = self.active_camera.lock();
                 if let Some(active_camera) = *active_cam {
                     let camera_data = {
-                        if let Ok(mut q) = self
+                        if let Ok((cam, comp)) = self
                             .world
-                            .query_one::<(&Camera, &CameraComponent)>(active_camera)
+                            .query_one::<(&Camera, &CameraComponent)>(active_camera).get()
                         {
-                            let val = q.get();
-                            if let Some(val) = val {
-                                Some(val.0.clone())
-                            } else {
-                                log::warn!("Queried camera but unable to get value");
-
-                                None
-                            }
+                            Some(cam.clone())
                         } else {
+                            log::warn!("Queried camera but found no value");
                             None
                         }
                     };
@@ -308,8 +302,7 @@ impl<'a> TabViewer for EditorTabViewer<'a> {
                 {
                     let mut handled = false;
 
-                    if let Ok(mut q) = self.world.query_one::<&mut EntityTransform>(*entity_id)
-                        && let Some(entity_transform) = q.get()
+                    if let Ok(entity_transform) = self.world.query_one::<&mut EntityTransform>(*entity_id).get()
                     {
                         let was_focused = cfg.is_focused;
                         cfg.is_focused = self.gizmo.is_focused();
@@ -394,8 +387,7 @@ impl<'a> TabViewer for EditorTabViewer<'a> {
                     }
 
                     if !handled {
-                        if let Ok(mut q) = self.world.query_one::<&mut Transform>(*entity_id)
-                            && let Some(transform) = q.get()
+                        if let Ok(transform) = self.world.query_one::<&mut Transform>(*entity_id).get()
                         {
                             let was_focused = cfg.is_focused;
                             cfg.is_focused = self.gizmo.is_focused();
@@ -470,8 +462,7 @@ impl<'a> TabViewer for EditorTabViewer<'a> {
                         signal: &mut Signal,
                     ) -> anyhow::Result<()> {
                         let entity_id = entity.to_bits().get();
-                        let label = if let Ok(mut q) = world.query_one::<&Label>(entity)
-                            && let Some(label) = q.get()
+                        let label = if let Ok(label) = world.query_one::<&Label>(entity).get()
                         {
                             label.clone()
                         } else {
@@ -620,10 +611,10 @@ impl<'a> TabViewer for EditorTabViewer<'a> {
 
                     let root_entities: Vec<Entity> = self
                         .world
-                        .query::<()>()
+                        .query::<Entity>()
                         .without::<&Parent>()
                         .iter()
-                        .map(|(e, _)| e)
+                        .map(|e| e)
                         .collect();
 
                     for entity in root_entities {
@@ -681,254 +672,245 @@ impl<'a> TabViewer for EditorTabViewer<'a> {
                     let world = &self.world;
 
                     if !cfg.root_node_selected {
-                        if let Ok(mut q) = world.query_one::<(&mut Label,)>(inspect_entity) {
-                            if let Some((label, )) = q.get() {
-                                label.inspect(
-                                    &mut inspect_entity,
-                                    &mut cfg,
-                                    ui,
-                                    self.undo_stack,
-                                    self.signal,
-                                    &mut String::new(),
-                                );
+                        if let Ok((label, )) = world.query_one::<(&mut Label,)>(inspect_entity).get() {
+                            label.inspect(
+                                &mut inspect_entity,
+                                &mut cfg,
+                                ui,
+                                self.undo_stack,
+                                self.signal,
+                                &mut String::new(),
+                            );
 
-                                ui.label(format!("Entity ID: {}", inspect_entity.id()));
+                            ui.label(format!("Entity ID: {}", inspect_entity.id()));
 
-                                ui.separator();
+                            ui.separator();
 
-                                // mesh renderer
-                                if let Ok(mut q) = world.query_one::<&mut MeshRenderer>(inspect_entity)
-                                    && let Some(e) = q.get()
-                                {
-                                    CollapsingHeader::new("MeshRenderer").default_open(true).show(ui, |ui| {
-                                        e.inspect(
-                                            &mut inspect_entity,
-                                            &mut cfg,
-                                            ui,
-                                            self.undo_stack,
-                                            self.signal,
-                                            &mut String::new(),
-                                        );
-                                    });
-                                }
+                            // mesh renderer
+                            if let Ok(e) = world.query_one::<&mut MeshRenderer>(inspect_entity).get()
+                            {
+                                CollapsingHeader::new("MeshRenderer").default_open(true).show(ui, |ui| {
+                                    e.inspect(
+                                        &mut inspect_entity,
+                                        &mut cfg,
+                                        ui,
+                                        self.undo_stack,
+                                        self.signal,
+                                        &mut String::new(),
+                                    );
+                                });
+                            }
 
-                                // entity transform
-                                if let Ok(mut q) = world.query_one::<&mut EntityTransform>(inspect_entity)
-                                    && let Some(t) = q.get()
-                                {
-                                    CollapsingHeader::new("Transform").default_open(true).show(ui, |ui| {
-                                        t.inspect(
-                                            &mut inspect_entity,
-                                            &mut cfg,
-                                            ui,
-                                            self.undo_stack,
-                                            self.signal,
-                                            &mut String::new(),
-                                        );
-                                    });
-                                    ui.separator();
-                                }
+                            // entity transform
+                            if let Ok(t) = world.query_one::<&mut EntityTransform>(inspect_entity).get()
+                            {
+                                CollapsingHeader::new("Transform").default_open(true).show(ui, |ui| {
+                                    t.inspect(
+                                        &mut inspect_entity,
+                                        &mut cfg,
+                                        ui,
+                                        self.undo_stack,
+                                        self.signal,
+                                        &mut String::new(),
+                                    );
+                                });
+                                ui.separator();
+                            }
 
-                                // custom properties
-                                if let Ok(mut q) = world.query_one::<&mut CustomProperties>(inspect_entity)
-                                    && let Some(props) = q.get()
-                                {
-                                    CollapsingHeader::new("Custom Properties").default_open(true).show(ui, |ui| {
-                                        props.inspect(
-                                            &mut inspect_entity,
-                                            &mut cfg,
-                                            ui,
-                                            self.undo_stack,
-                                            self.signal,
-                                            label.as_mut_string(),
-                                        );
-                                    });
-                                    ui.separator();
-                                }
+                            // custom properties
+                            if let Ok(props) = world.query_one::<&mut CustomProperties>(inspect_entity).get()
+                            {
+                                CollapsingHeader::new("Custom Properties").default_open(true).show(ui, |ui| {
+                                    props.inspect(
+                                        &mut inspect_entity,
+                                        &mut cfg,
+                                        ui,
+                                        self.undo_stack,
+                                        self.signal,
+                                        label.as_mut_string(),
+                                    );
+                                });
+                                ui.separator();
+                            }
 
-                                // camera
-                                if let Ok(mut q) = world
-                                    .query_one::<(&mut Camera, &mut CameraComponent)>(inspect_entity)
-                                    && let Some((camera, camera_component)) = q.get()
-                                {
-                                    CollapsingHeader::new("Camera").default_open(true).show(ui, |ui| {
-                                        camera.inspect(
-                                            &mut inspect_entity,
-                                            &mut cfg,
-                                            ui,
-                                            self.undo_stack,
-                                            self.signal,
-                                            &mut String::new(),
-                                        );
+                            // camera
+                            if let Ok((camera, camera_component)) = world
+                                .query_one::<(&mut Camera, &mut CameraComponent)>(inspect_entity).get()
+                            {
+                                CollapsingHeader::new("Camera").default_open(true).show(ui, |ui| {
+                                    camera.inspect(
+                                        &mut inspect_entity,
+                                        &mut cfg,
+                                        ui,
+                                        self.undo_stack,
+                                        self.signal,
+                                        &mut String::new(),
+                                    );
 
-                                        ui.separator();
+                                    ui.separator();
 
-                                        camera_component.inspect(
-                                            &mut inspect_entity,
-                                            &mut cfg,
-                                            ui,
-                                            self.undo_stack,
-                                            self.signal,
-                                            &mut camera.label.clone(),
-                                        );
+                                    camera_component.inspect(
+                                        &mut inspect_entity,
+                                        &mut cfg,
+                                        ui,
+                                        self.undo_stack,
+                                        self.signal,
+                                        &mut camera.label.clone(),
+                                    );
 
-                                        ui.separator();
+                                    ui.separator();
 
-                                        // camera controller
-                                        let mut active_camera = self.active_camera.lock();
+                                    // camera controller
+                                    let mut active_camera = self.active_camera.lock();
 
-                                        if active_camera.equivalent(&Some(*entity)) {
-                                            ui.label("Status: Currently viewing through camera");
-                                        } else {
-                                            ui.label("Status: Not viewing through this camera");
-                                        }
+                                    if active_camera.equivalent(&Some(*entity)) {
+                                        ui.label("Status: Currently viewing through camera");
+                                    } else {
+                                        ui.label("Status: Not viewing through this camera");
+                                    }
 
-                                        if ui.button("Set as active camera").clicked() {
-                                            *active_camera = Some(*entity);
-                                            log::info!(
+                                    if ui.button("Set as active camera").clicked() {
+                                        *active_camera = Some(*entity);
+                                        log::info!(
                                             "Currently viewing from camera angle '{}'",
                                             camera.label
                                         );
-                                        }
+                                    }
 
-                                        if camera_component.starting_camera {
-                                            if ui.button("Stop making camera initial").clicked() {
-                                                log::debug!("'Stop making camera initial' button clicked");
-                                                camera_component.starting_camera = false;
-                                                success!("Removed {} from starting camera", camera.label);
-                                            }
-                                        } else if ui.button("Set as initial camera").clicked() {
-                                            log::debug!("'Set as initial camera' button clicked");
-                                            if matches!(camera_component.camera_type, CameraType::Debug) {
-                                                warn!(
+                                    if camera_component.starting_camera {
+                                        if ui.button("Stop making camera initial").clicked() {
+                                            log::debug!("'Stop making camera initial' button clicked");
+                                            camera_component.starting_camera = false;
+                                            success!("Removed {} from starting camera", camera.label);
+                                        }
+                                    } else if ui.button("Set as initial camera").clicked() {
+                                        log::debug!("'Set as initial camera' button clicked");
+                                        if matches!(camera_component.camera_type, CameraType::Debug) {
+                                            warn!(
                                                 "Cannot set any cameras of type 'Debug' to initial camera"
                                             );
-                                            } else {
-                                                local_set_initial_camera = true
-                                            }
+                                        } else {
+                                            local_set_initial_camera = true
                                         }
-                                    });
-                                    ui.separator();
-                                }
+                                    }
+                                });
+                                ui.separator();
+                            }
 
-                                // light
-                                if let Ok(mut q) = world.query_one::<(&mut Light, &mut LightComponent, &mut Transform)>(inspect_entity)
-                                    && let Some((light, comp, transform)) = q.get()
-                                {
-                                    light.transform = *transform;
-                                    light.light_component = comp.clone();
+                            // light
+                            if let Ok((light, comp, transform)) = world.query_one::<(&mut Light, &mut LightComponent, &mut Transform)>(inspect_entity).get()
+                            {
+                                light.transform = *transform;
+                                light.light_component = comp.clone();
+
+                                light.inspect(
+                                    entity,
+                                    &mut cfg,
+                                    ui,
+                                    self.undo_stack,
+                                    self.signal,
+                                    &mut String::new(),
+                                );
 
-                                    light.inspect(
+                                *transform = light.transform;
+                                *comp = light.light_component.clone();
+                                ui.separator();
+                            }
+
+                            // script
+                            if let Ok(script) = world.query_one::<&mut Script>(*entity).get()
+                            {
+                                CollapsingHeader::new("Script").default_open(true).show(ui, |ui| {
+                                    script.inspect(
                                         entity,
                                         &mut cfg,
                                         ui,
                                         self.undo_stack,
                                         self.signal,
-                                        &mut String::new(),
+                                        label.as_mut_string(),
                                     );
+                                });
+                                ui.separator();
+                            }
 
-                                    *transform = light.transform;
-                                    *comp = light.light_component.clone();
-                                    ui.separator();
-                                }
-
-                                // script
-                                if let Ok(mut q) = world.query_one::<&mut Script>(*entity)
-                                    && let Some(script) = q.get()
-                                {
-                                    CollapsingHeader::new("Script").default_open(true).show(ui, |ui| {
-                                        script.inspect(
-                                            entity,
-                                            &mut cfg,
-                                            ui,
-                                            self.undo_stack,
-                                            self.signal,
-                                            label.as_mut_string(),
-                                        );
-                                    });
-                                    ui.separator();
-                                }
-
-                                // physics
-                                if let Ok(mut q) = world.query_one::<(Option<&mut RigidBody>, Option<&mut ColliderGroup>, Option<&mut KCC>)>(*entity)
-                                    && let Some((rigid, colliders, kcc)) = q.get()
-                                {
-                                    if rigid.is_some() || colliders.is_some() || kcc.is_some() {
-                                        CollapsingHeader::new("Physics").default_open(true).show(ui, |ui| {
+                            // physics
+                            if let Ok((rigid, colliders, kcc)) = world.query_one::<(Option<&mut RigidBody>, Option<&mut ColliderGroup>, Option<&mut KCC>)>(*entity).get()
+                            {
+                                if rigid.is_some() || colliders.is_some() || kcc.is_some() {
+                                    CollapsingHeader::new("Physics").default_open(true).show(ui, |ui| {
+
+                                        if let Some(kcc) = kcc {
+                                            CollapsingHeader::new("Kinematic Character Controller").default_open(true).show(ui, |ui| {
+                                                kcc.inspect(
+                                                    entity,
+                                                    &mut cfg,
+                                                    ui,
+                                                    self.undo_stack,
+                                                    self.signal,
+                                                    label.as_mut_string(),
+                                                );
+                                            });
+                                            ui.separator();
+                                        }
 
-                                            if let Some(kcc) = kcc {
-                                                CollapsingHeader::new("Kinematic Character Controller").default_open(true).show(ui, |ui| {
-                                                    kcc.inspect(
-                                                        entity,
-                                                        &mut cfg,
-                                                        ui,
-                                                        self.undo_stack,
-                                                        self.signal,
-                                                        label.as_mut_string(),
-                                                    );
-                                                });
-                                                ui.separator();
-                                            }
+                                        if let Some(rigid) = rigid {
+                                            CollapsingHeader::new("RigidBody").default_open(true).show(ui, |ui| {
+                                                rigid.inspect(
+                                                    entity,
+                                                    &mut cfg,
+                                                    ui,
+                                                    self.undo_stack,
+                                                    self.signal,
+                                                    label.as_mut_string(),
+                                                );
+                                            });
+                                            ui.separator();
+                                        }
 
-                                            if let Some(rigid) = rigid {
-                                                CollapsingHeader::new("RigidBody").default_open(true).show(ui, |ui| {
-                                                    rigid.inspect(
-                                                        entity,
-                                                        &mut cfg,
-                                                        ui,
-                                                        self.undo_stack,
-                                                        self.signal,
-                                                        label.as_mut_string(),
-                                                    );
-                                                });
-                                                ui.separator();
-                                            }
+                                        if let Some(col) = colliders {
+                                            CollapsingHeader::new("Colliders").default_open(true).show(ui, |ui| {
+                                                let mut to_remove: Option<usize> = None;
+
+                                                for (index, c) in col.colliders.iter_mut().enumerate() {
+                                                    ui.horizontal(|ui| {
+                                                        let header = CollapsingHeader::new(format!("Collider {}", index + 1))
+                                                            .default_open(true);
+
+                                                        header.show(ui, |ui| {
+                                                            c.inspect(
+                                                                entity,
+                                                                &mut cfg,
+                                                                ui,
+                                                                self.undo_stack,
+                                                                self.signal,
+                                                                label.as_mut_string(),
+                                                            );
+                                                        });
 
-                                            if let Some(col) = colliders {
-                                                CollapsingHeader::new("Colliders").default_open(true).show(ui, |ui| {
-                                                    let mut to_remove: Option<usize> = None;
-
-                                                    for (index, c) in col.colliders.iter_mut().enumerate() {
-                                                        ui.horizontal(|ui| {
-                                                            let header = CollapsingHeader::new(format!("Collider {}", index + 1))
-                                                                .default_open(true);
-
-                                                            header.show(ui, |ui| {
-                                                                c.inspect(
-                                                                    entity,
-                                                                    &mut cfg,
-                                                                    ui,
-                                                                    self.undo_stack,
-                                                                    self.signal,
-                                                                    label.as_mut_string(),
-                                                                );
-                                                            });
-
-                                                            ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
-                                                                if ui.button("🗑").on_hover_text("Remove collider").clicked() {
-                                                                    to_remove = Some(index);
-                                                                }
-                                                            });
+                                                        ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
+                                                            if ui.button("🗑").on_hover_text("Remove collider").clicked() {
+                                                                to_remove = Some(index);
+                                                            }
                                                         });
+                                                    });
 
-                                                        ui.separator();
-                                                    }
+                                                    ui.separator();
+                                                }
 
-                                                    if let Some(index) = to_remove {
-                                                        col.colliders.remove(index);
-                                                    }
+                                                if let Some(index) = to_remove {
+                                                    col.colliders.remove(index);
+                                                }
 
-                                                    if ui.button("➕ Add new collider").clicked() {
-                                                        local_add_collider = Some(*entity);
-                                                    }
-                                                });
-                                            }
+                                                if ui.button("➕ Add new collider").clicked() {
+                                                    local_add_collider = Some(*entity);
+                                                }
+                                            });
+                                        }
 
-                                            ui.separator();
-                                        });
-                                    }
-                                    ui.separator();
+                                        ui.separator();
+                                    });
                                 }
+                                ui.separator();
                             }
                         } else {
                             log_once::debug_once!("Unable to query entity inside resource inspector");
@@ -936,7 +918,7 @@ impl<'a> TabViewer for EditorTabViewer<'a> {
                     }
 
                     if local_set_initial_camera {
-                        for (id, comp) in self.world.query::<&mut CameraComponent>().iter() {
+                        for (id, comp) in self.world.query::<(Entity, &mut CameraComponent)>().iter() {
                             comp.starting_camera = false;
                             self.undo_stack
                                 .push(UndoableAction::RemoveStartingCamera(id))
@@ -959,8 +941,7 @@ impl<'a> TabViewer for EditorTabViewer<'a> {
 
                 if let Some(e) = local_add_collider {
                     let mut manual_edit = false;
-                    if let Ok(mut q) = self.world.query_one::<Option<&mut ColliderGroup>>(e)
-                        && let Some(col) = q.get()
+                    if let Ok(col) = self.world.query_one::<Option<&mut ColliderGroup>>(e).get()
                     {
                         if let Some(col) = col {
                             let mut collider = Collider::new();
diff --git a/eucalyptus-editor/src/editor/input.rs b/eucalyptus-editor/src/editor/input.rs
index 7928a41..81b8ab7 100644
--- a/eucalyptus-editor/src/editor/input.rs
+++ b/eucalyptus-editor/src/editor/input.rs
@@ -190,35 +190,29 @@ impl Keyboard for Editor {
                         && matches!(tab, EditorTab::ModelEntityList)
                     {
                         if let Some(entity) = &self.selected_entity {
-                            let query = self.world.query_one::<(
+                            let mut query = self.world.query_one::<(
                                 &Label,
                                 &MeshRenderer,
                                 &EntityTransform,
                                 &CustomProperties,
                             )>(*entity);
-                            if let Ok(mut q) = query {
-                                if let Some((label, renderer, t, props)) = q.get() {
-                                    let s_entity = SceneEntity {
-                                        label: label.clone(),
-                                        components: vec![
-                                            Box::new(props.clone()),
-                                            Box::new(SerializedMeshRenderer::from_renderer(
-                                                &renderer,
-                                            )),
-                                            Box::new(t.clone()),
-                                        ],
-                                        entity_id: None,
-                                    };
-                                    self.signal = Signal::Copy(s_entity);
+                            if let Ok((label, renderer, t, props)) = query.get() {
+                                let s_entity = SceneEntity {
+                                    label: label.clone(),
+                                    components: vec![
+                                        Box::new(props.clone()),
+                                        Box::new(SerializedMeshRenderer::from_renderer(
+                                            &renderer,
+                                        )),
+                                        Box::new(t.clone()),
+                                    ],
+                                    entity_id: None,
+                                };
+                                self.signal = Signal::Copy(s_entity);
 
-                                    info!("Copied!");
+                                info!("Copied!");
 
-                                    log::debug!("Copied selected entity");
-                                } else {
-                                    warn!(
-                                        "Unable to copy entity: Unable to fetch world entity properties"
-                                    );
-                                }
+                                log::debug!("Copied selected entity");
                             } else {
                                 warn!("Unable to copy entity: Unable to obtain lock");
                             }
@@ -355,10 +349,9 @@ impl Mouse for Editor {
             }
 
             if let Some(active_camera) = *self.active_camera.lock()
-                && let Ok(mut q) = self
+                && let Ok((camera, _)) = self
                     .world
-                    .query_one::<(&mut Camera, &CameraComponent)>(active_camera)
-                && let Some((camera, _)) = q.get()
+                    .query_one::<(&mut Camera, &CameraComponent)>(active_camera).get()
             {
                 if let Some((dx, dy)) = delta {
                     camera.track_mouse_delta(dx, dy);
diff --git a/eucalyptus-editor/src/editor/mod.rs b/eucalyptus-editor/src/editor/mod.rs
index f15f73b..81ec732 100644
--- a/eucalyptus-editor/src/editor/mod.rs
+++ b/eucalyptus-editor/src/editor/mod.rs
@@ -294,7 +294,7 @@ impl Editor {
 
         let labels = self
             .world
-            .query::<&Label>()
+            .query::<(Entity, &Label)>()
             .iter()
             .map(|(e, l)| (e, l.clone()))
             .collect::<Vec<_>>();
@@ -522,9 +522,9 @@ impl Editor {
             } else {
                 let existing_debug_camera = {
                     world
-                        .query::<(&Camera, &CameraComponent)>()
+                        .query::<(Entity, &Camera, &CameraComponent)>()
                         .iter()
-                        .find_map(|(entity, (_, component))| {
+                        .find_map(|(entity, _, component)| {
                             if matches!(component.camera_type, CameraType::Debug) {
                                 Some(entity)
                             } else {
@@ -888,34 +888,30 @@ impl Editor {
                 ui.menu_button("Edit", |ui| {
                     if ui.button("Copy").clicked() {
                         if let Some(entity) = &self.selected_entity {
-                            let query = self.world.query_one::<(
+                            let mut query = self.world.query_one::<(
                                 &Label,
                                 &MeshRenderer,
                                 &EntityTransform,
                                 &CustomProperties,
                             )>(*entity);
-                            if let Ok(mut q) = query {
-                                if let Some((entity_label, renderer, transform, props)) = q.get() {
-                                    let mut components: Vec<Box<dyn SerializableComponent>> = Vec::new();
+                            if let Ok((entity_label, renderer, transform, props)) = query.get() {
+                                let mut components: Vec<Box<dyn SerializableComponent>> = Vec::new();
 
-                                    components.push(Box::new(*transform));
+                                components.push(Box::new(*transform));
 
-                                    let serialized_renderer = SerializedMeshRenderer::from_renderer(renderer);
-                                    components.push(Box::new(serialized_renderer));
+                                let serialized_renderer = SerializedMeshRenderer::from_renderer(renderer);
+                                components.push(Box::new(serialized_renderer));
 
-                                    components.push(Box::new(props.clone()));
+                                components.push(Box::new(props.clone()));
 
-                                    let s_entity = SceneEntity {
-                                        label: entity_label.clone(),
-                                        components,
-                                        entity_id: None,
-                                    };
-                                    self.signal = Signal::Copy(s_entity);
+                                let s_entity = SceneEntity {
+                                    label: entity_label.clone(),
+                                    components,
+                                    entity_id: None,
+                                };
+                                self.signal = Signal::Copy(s_entity);
 
-                                    info!("Copied selected entity!");
-                                } else {
-                                    warn!("Unable to copy entity: Unable to fetch world entity properties");
-                                }
+                                info!("Copied selected entity!");
                             } else {
                                 warn!("Unable to copy entity: Unable to obtain lock");
                             }
@@ -1185,16 +1181,17 @@ impl Editor {
     pub fn create_backup(&mut self) -> anyhow::Result<()> {
         let mut entities = Vec::new();
 
-        for (entity_id, (mesh_renderer, transform, properties)) in self
+        for (entity_id, mesh_renderer, transform, properties) in self
             .world
-            .query::<(&MeshRenderer, &EntityTransform, &CustomProperties)>()
+            .query::<(Entity, &MeshRenderer, &EntityTransform, &CustomProperties)>()
             .iter()
         {
             let script = self
                 .world
                 .query_one::<&Script>(entity_id)
+                .get()
                 .ok()
-                .and_then(|mut s| s.get().cloned());
+                .cloned();
             entities.push((
                 entity_id,
                 mesh_renderer.clone(),
@@ -1206,8 +1203,8 @@ impl Editor {
 
         let mut camera_data = Vec::new();
 
-        for (entity_id, (camera, component)) in
-            self.world.query::<(&Camera, &CameraComponent)>().iter()
+        for (entity_id, camera, component) in
+            self.world.query::<(Entity, &Camera, &CameraComponent)>().iter()
         {
             camera_data.push((entity_id, camera.clone(), component.clone()));
         }
@@ -1232,9 +1229,9 @@ impl Editor {
     pub fn switch_to_debug_camera(&mut self) {
         let debug_camera = self
             .world
-            .query::<(&Camera, &CameraComponent)>()
+            .query::<(Entity, &Camera, &CameraComponent)>()
             .iter()
-            .find_map(|(e, (_cam, comp))| {
+            .find_map(|(e, _, comp)| {
                 if matches!(comp.camera_type, CameraType::Debug) {
                     Some(e)
                 } else {
@@ -1254,10 +1251,10 @@ impl Editor {
     pub fn switch_to_player_camera(&mut self) {
         let player_camera = self
             .world
-            .query::<(&Camera, &CameraComponent)>()
+            .query::<(Entity, &Camera, &CameraComponent)>()
             .iter()
             .find_map(
-                |(e, (_cam, comp))| {
+                |(e, _, comp)| {
                     if comp.starting_camera { Some(e) } else { None }
                 },
             );
@@ -1274,10 +1271,9 @@ impl Editor {
     pub fn is_using_debug_camera(&self) -> bool {
         let active_camera = self.active_camera.lock();
         if let Some(active_camera_entity) = *active_camera
-            && let Ok(mut query) = self
+            && let Ok(component) = self
                 .world
-                .query_one::<&CameraComponent>(active_camera_entity)
-            && let Some(component) = query.get()
+                .query_one::<&CameraComponent>(active_camera_entity).get()
         {
             return matches!(component.camera_type, CameraType::Debug);
         }
@@ -1299,55 +1295,49 @@ impl Editor {
             .create_light_array_resources(graphics.shared.clone());
 
         if let Some(active_camera) = *self.active_camera.lock() {
-            if let Ok(mut q) = self
+            if let Ok((camera, _)) = self
                 .world
                 .query_one::<(&Camera, &CameraComponent)>(active_camera)
+                .get()
             {
-                if let Some((camera, _component)) = q.get() {
-                    let pipeline = graphics.create_render_pipline(
-                        &shader,
-                        vec![
-                            &graphics.shared.texture_bind_layout.clone(),
-                            camera.layout(),
-                            self.light_manager.layout(),
-                            &graphics.shared.material_tint_bind_layout.clone(),
-                        ],
-                        None,
-                    );
-                    self.render_pipeline = Some(pipeline);
-
-                    // log::debug!("Contents of light shader: \n{:#?}", dropbear_engine::shader::shader_wesl::LIGHT_SHADER);
-                    self.light_manager.create_render_pipeline(
-                        graphics.shared.clone(),
-                        dropbear_engine::shader::shader_wesl::LIGHT_SHADER,
-                        camera,
-                        Some("Light Pipeline"),
-                    );
-
-                    self.light_manager.create_shadow_pipeline(
-                        graphics.shared.clone(),
-                        dropbear_engine::shader::shader_wesl::SHADOW_SHADER,
-                        Some("Shadow Pipeline"),
-                    );
-
-                    // log::debug!("Contents of outline shader: \n{:#?}", dropbear_engine::shader::shader_wesl::OUTLINE_SHADER);
-                    let outline_shader =
-                        OutlineShader::init(graphics.shared.clone(), camera.layout());
-                    self.outline_pipeline = Some(outline_shader);
-
-                    let collider_pipeline = ColliderWireframePipeline::new(graphics.shared.clone(), camera.layout());
-                    self.collider_wireframe_pipeline = Some(collider_pipeline);
-
-                    self.mipmap_generator = Some(MipMapGenerator::new(graphics.shared.clone()))
-                } else {
-                    log_once::warn_once!(
-                        "Unable to fetch the query result of camera: {:?}",
-                        active_camera
-                    )
-                }
+                let pipeline = graphics.create_render_pipline(
+                    &shader,
+                    vec![
+                        &graphics.shared.texture_bind_layout.clone(),
+                        camera.layout(),
+                        self.light_manager.layout(),
+                        &graphics.shared.material_tint_bind_layout.clone(),
+                    ],
+                    None,
+                );
+                self.render_pipeline = Some(pipeline);
+
+                // log::debug!("Contents of light shader: \n{:#?}", dropbear_engine::shader::shader_wesl::LIGHT_SHADER);
+                self.light_manager.create_render_pipeline(
+                    graphics.shared.clone(),
+                    dropbear_engine::shader::shader_wesl::LIGHT_SHADER,
+                    camera,
+                    Some("Light Pipeline"),
+                );
+
+                self.light_manager.create_shadow_pipeline(
+                    graphics.shared.clone(),
+                    dropbear_engine::shader::shader_wesl::SHADOW_SHADER,
+                    Some("Shadow Pipeline"),
+                );
+
+                // log::debug!("Contents of outline shader: \n{:#?}", dropbear_engine::shader::shader_wesl::OUTLINE_SHADER);
+                let outline_shader =
+                    OutlineShader::init(graphics.shared.clone(), camera.layout());
+                self.outline_pipeline = Some(outline_shader);
+
+                let collider_pipeline = ColliderWireframePipeline::new(graphics.shared.clone(), camera.layout());
+                self.collider_wireframe_pipeline = Some(collider_pipeline);
+
+                self.mipmap_generator = Some(MipMapGenerator::new(graphics.shared.clone()))
             } else {
                 log_once::warn_once!(
-                    "Unable to query camera, component and option<camerafollowtarget> for active camera: {:?}",
+                    "Unable to query Camera and CameraComponent for active camera: {:?}",
                     active_camera
                 );
             }
@@ -1453,27 +1443,19 @@ impl UndoableAction {
     pub fn undo(&self, world: &mut World) -> anyhow::Result<()> {
         match self {
             UndoableAction::Transform(entity, transform) => {
-                if let Ok(mut q) = world.query_one::<&mut Transform>(*entity) {
-                    if let Some(e_t) = q.get() {
-                        *e_t = *transform;
-                        log::debug!("Reverted transform");
-                        Ok(())
-                    } else {
-                        Err(anyhow::anyhow!("Unable to query the entity"))
-                    }
+                if let Ok(e_t) = world.query_one::<&mut Transform>(*entity).get() {
+                    *e_t = *transform;
+                    log::debug!("Reverted transform");
+                    Ok(())
                 } else {
                     Err(anyhow::anyhow!("Could not find an entity to query"))
                 }
             }
             UndoableAction::EntityTransform(entity, transform) => {
-                if let Ok(mut q) = world.query_one::<&mut EntityTransform>(*entity) {
-                    if let Some(e_t) = q.get() {
-                        *e_t = *transform;
-                        log::debug!("Reverted entity transform");
-                        Ok(())
-                    } else {
-                        Err(anyhow::anyhow!("Unable to query the entity"))
-                    }
+                if let Ok(e_t) = world.query_one::<&mut EntityTransform>(*entity).get() {
+                    *e_t = *transform;
+                    log::debug!("Reverted entity transform");
+                    Ok(())
                 } else {
                     Err(anyhow::anyhow!("Could not find an entity to query"))
                 }
@@ -1495,7 +1477,7 @@ impl UndoableAction {
                 }
             }
             UndoableAction::RemoveStartingCamera(old) => {
-                for (_i, comp) in &mut world.query::<&mut CameraComponent>() {
+                for comp in &mut world.query::<&mut CameraComponent>() {
                     comp.starting_camera = false;
                 }
                 if let Ok((cam, comp)) =
diff --git a/eucalyptus-editor/src/editor/scene.rs b/eucalyptus-editor/src/editor/scene.rs
index d214776..968ce6f 100644
--- a/eucalyptus-editor/src/editor/scene.rs
+++ b/eucalyptus-editor/src/editor/scene.rs
@@ -219,10 +219,9 @@ impl Scene for Editor {
         {
             let active_cam = self.active_camera.lock();
             if let Some(active_camera) = *active_cam
-                && let Ok(mut query) = self
+                && let Ok((camera, _)) = self
                     .world
-                    .query_one::<(&mut Camera, &CameraComponent)>(active_camera)
-                && let Some((camera, _)) = query.get()
+                    .query_one::<(&mut Camera, &CameraComponent)>(active_camera).get()
             {
                 for key in &self.input_state.pressed_keys {
                     match key {
@@ -242,15 +241,13 @@ impl Scene for Editor {
         
 
         if let Some(e) = self.previously_selected_entity
-            && let Ok(mut q) = self.world.query_one::<&mut MeshRenderer>(e)
-            && let Some(entity) = q.get()
+            && let Ok(entity) = self.world.query_one::<&mut MeshRenderer>(e).get()
         {
             entity.is_selected = false
         }
 
         if let Some(e) = self.selected_entity
-            && let Ok(mut q) = self.world.query_one::<&mut MeshRenderer>(e)
-            && let Some(entity) = q.get()
+            && let Ok(entity) = self.world.query_one::<&mut MeshRenderer>(e).get()
         {
             entity.is_selected = true
         }
@@ -265,8 +262,7 @@ impl Scene for Editor {
             let world = self.world.as_mut();
 
             if let Some(active_camera) = active_camera
-                && let Ok(mut query) = world.query_one::<&mut Camera>(active_camera)
-                && let Some(camera) = query.get()
+                && let Ok(camera) = world.query_one::<&mut Camera>(active_camera).get()
             {
                 camera.aspect = new_aspect;
             }
@@ -275,8 +271,8 @@ impl Scene for Editor {
         {
             let sim_world = self.world.as_mut();
 
-            for (_entity_id, (camera, component)) in sim_world
-                .query::<(&mut Camera, &mut CameraComponent)>()
+            for (_entity_id, camera, component) in sim_world
+                .query::<(Entity, &mut Camera, &mut CameraComponent)>()
                 .iter()
             {
                 component.update(camera);
@@ -289,14 +285,14 @@ impl Scene for Editor {
 
             {
                 let query = sim_world.query_mut::<(&mut MeshRenderer, &Transform)>();
-                for (_, (renderer, transform)) in query {
+                for (renderer, transform) in query {
                     renderer.update(transform);
                 }
             }
 
             {
                 let mut updates = Vec::new();
-                for (entity, transform) in sim_world.query::<&EntityTransform>().iter() {
+                for (entity, transform) in sim_world.query::<(Entity, &EntityTransform)>().iter() {
                     let final_transform = transform.propagate(sim_world, entity);
                     updates.push((entity, final_transform));
                 }
@@ -316,7 +312,7 @@ impl Scene for Editor {
                     &mut Light,
                 )>();
 
-                for (_, (light_component, transform_opt, entity_transform_opt, light)) in light_query {
+                for (light_component, transform_opt, entity_transform_opt, light) in light_query {
                     let transform = if let Some(entity_transform) = entity_transform_opt {
                         entity_transform.sync()
                     } else if let Some(transform) = transform_opt {
@@ -369,18 +365,14 @@ impl Scene for Editor {
 
             if let Some(active_camera) = active_camera {
                 let cam = {
-                    if let Ok(mut query) = world.query_one::<&Camera>(active_camera) {
-                        query.get().cloned()
-                    } else {
-                        None
-                    }
+                    world.query_one::<&Camera>(active_camera).get().ok().cloned()
                 };
 
                 if let Some(camera) = cam {
                     let lights = {
                         let mut lights = Vec::new();
                         let mut light_query = world.query::<(&Light, &LightComponent)>();
-                        for (_, (light, comp)) in light_query.iter() {
+                        for (light, comp) in light_query.iter() {
                             lights.push((light.clone(), comp.clone()));
                         }
                         lights
@@ -389,7 +381,7 @@ impl Scene for Editor {
                     let entities = {
                         let mut entities = Vec::new();
                         let mut entity_query = world.query::<&MeshRenderer>();
-                        for (_, renderer) in entity_query.iter() {
+                        for renderer in entity_query.iter() {
                             entities.push(renderer.clone());
                         }
                         entities
@@ -551,7 +543,7 @@ impl Scene for Editor {
                                     HashMap::new();
 
                                 let mut q = self.world.query::<(&EntityTransform, &ColliderGroup)>();
-                                for (_entity, (entity_transform, group)) in q.iter() {
+                                for (entity_transform, group) in q.iter() {
                                     for collider in &group.colliders {
                                         let world_tf = entity_transform.sync();
 
diff --git a/eucalyptus-editor/src/physics/kcc.rs b/eucalyptus-editor/src/physics/kcc.rs
index e587d1d..0601e77 100644
--- a/eucalyptus-editor/src/physics/kcc.rs
+++ b/eucalyptus-editor/src/physics/kcc.rs
@@ -50,7 +50,7 @@ impl InspectableComponent for KCC {
 
         ui.vertical(|ui| {
             ui.label("Up Vector:");
-            let up = *self.controller.up;
+            let up = self.controller.up;
             let mut up_v = Vector3::new(up.x, up.y, up.z);
 
             ui.horizontal(|ui| {
@@ -63,7 +63,7 @@ impl InspectableComponent for KCC {
             });
 
             if up_v.norm_squared() > 0.0 {
-                self.controller.up = UnitVector3::new_normalize(up_v);
+                self.controller.up = UnitVector3::new_normalize(up_v).into();
             }
 
             ui.add_space(8.0);
diff --git a/eucalyptus-editor/src/runtime/mod.rs b/eucalyptus-editor/src/runtime/mod.rs
index 7a12569..593a7cb 100644
--- a/eucalyptus-editor/src/runtime/mod.rs
+++ b/eucalyptus-editor/src/runtime/mod.rs
@@ -176,59 +176,54 @@ impl PlayMode {
         self.light_manager
             .create_light_array_resources(graphics.shared.clone());
 
-        if let Some(active_camera) = self.active_camera {
-            if let Ok(mut q) = self
-                .world
-                .query_one::<(&Camera, &CameraComponent)>(active_camera)
-            {
-                if let Some((camera, _component)) = q.get() {
-                    let pipeline = graphics.create_render_pipline(
-                        &shader,
-                        vec![
-                            &graphics.shared.texture_bind_layout.clone(),
-                            camera.layout(),
-                            self.light_manager.layout(),
-                            &graphics.shared.material_tint_bind_layout.clone(),
-                        ],
-                        None,
-                    );
-                    self.render_pipeline = Some(pipeline);
-
-                    self.light_manager.create_render_pipeline(
-                        graphics.shared.clone(),
-                        dropbear_engine::shader::shader_wesl::LIGHT_SHADER,
-                        camera,
-                        Some("Light Pipeline"),
-                    );
-
-                    self.light_manager.create_shadow_pipeline(
-                        graphics.shared.clone(),
-                        dropbear_engine::shader::shader_wesl::SHADOW_SHADER,
-                        Some("Shadow Pipeline"),
-                    );
-
-                    let collider_pipeline = ColliderWireframePipeline::new(graphics.shared.clone(), camera.layout());
-                    self.collider_wireframe_pipeline = Some(collider_pipeline);
-                } else {
-                    log_once::warn_once!(
-                        "Unable to fetch the query result of camera: {:?}",
-                        active_camera
-                    )
-                }
-            } else {
-                log_once::warn_once!(
+        let Some(active_camera) = self.active_camera else {
+            log_once::warn_once!("No active camera found");
+            return;
+        };
+
+        if let Ok((camera, _component)) = self
+            .world
+            .query_one::<(&Camera, &CameraComponent)>(active_camera)
+            .get()
+        {
+            let pipeline = graphics.create_render_pipline(
+                &shader,
+                vec![
+                    &graphics.shared.texture_bind_layout.clone(),
+                    camera.layout(),
+                    self.light_manager.layout(),
+                    &graphics.shared.material_tint_bind_layout.clone(),
+                ],
+                None,
+            );
+            self.render_pipeline = Some(pipeline);
+
+            self.light_manager.create_render_pipeline(
+                graphics.shared.clone(),
+                dropbear_engine::shader::shader_wesl::LIGHT_SHADER,
+                camera,
+                Some("Light Pipeline"),
+            );
+
+            self.light_manager.create_shadow_pipeline(
+                graphics.shared.clone(),
+                dropbear_engine::shader::shader_wesl::SHADOW_SHADER,
+                Some("Shadow Pipeline"),
+            );
+
+            let collider_pipeline = ColliderWireframePipeline::new(graphics.shared.clone(), camera.layout());
+            self.collider_wireframe_pipeline = Some(collider_pipeline);
+        } else {
+            log_once::warn_once!(
                     "Unable to query camera, component for active camera: {:?}",
                     active_camera
                 );
-            }
-        } else {
-            log_once::warn_once!("No active camera found");
         }
     }
 
     fn reload_scripts_for_current_world(&mut self) {
         let mut entity_tag_map: HashMap<String, Vec<Entity>> = HashMap::new();
-        for (entity_id, script) in self.world.query::<&Script>().iter() {
+        for (entity_id, script) in self.world.query::<(Entity, &Script)>().iter() {
             for tag in &script.tags {
                 entity_tag_map.entry(tag.clone()).or_default().push(entity_id);
             }
diff --git a/eucalyptus-editor/src/runtime/scene.rs b/eucalyptus-editor/src/runtime/scene.rs
index 60bba78..9844322 100644
--- a/eucalyptus-editor/src/runtime/scene.rs
+++ b/eucalyptus-editor/src/runtime/scene.rs
@@ -3,8 +3,8 @@ use egui::{CentralPanel, MenuBar, TopBottomPanel};
 use eucalyptus_core::physics::collider::ColliderGroup;
 use eucalyptus_core::physics::collider::ColliderShapeKey;
 use eucalyptus_core::physics::collider::shader::ColliderInstanceRaw;
-use glam::{DMat4, DQuat, DVec3};
-use hecs::Entity;
+use glam::{DMat4, DQuat, DVec3, Quat};
+use hecs::{Entity, QueryOneError};
 use wgpu::Color;
 use wgpu::util::DeviceExt;
 use winit::event_loop::ActiveEventLoop;
@@ -50,11 +50,11 @@ impl Scene for PlayMode {
             let _ = self.script_manager.physics_update_script(self.world.as_mut(), dt as f64);
         }
 
-        for (_, kcc) in self.world.query::<&mut KCC>().iter() {
+        for kcc in self.world.query::<&mut KCC>().iter() {
             kcc.collisions.clear();
         }
 
-        for (e, (l, _)) in self.world.query::<(&Label, &KCC)>().iter() {
+        for (e, l, _) in self.world.query::<(Entity, &Label, &KCC)>().iter() {
             log_once::debug_once!("This entity [{:?}, label = {}] has the KCC (KinematicCharacterController) component attached", e, l);
         }
 
@@ -78,12 +78,14 @@ impl Scene for PlayMode {
                     kcc.collisions = collisions.clone();
                 }
 
-                let (label, kcc_controller) = match self.world.query_one::<(&Label, &KCC)>(entity) {
-                    Ok(mut q) => match q.get() {
-                        Some((label, kcc)) => (label.clone(), kcc.controller.clone()),
-                        None => continue,
-                    },
-                    Err(_) => continue,
+                let (label, kcc_controller) = match self.world.query_one::<(&Label, &KCC)>(entity).get() {
+                    Ok(v) => {
+                        (v.0.clone(), v.1.clone())
+                    }
+                    Err(e) => {
+                        log_once::warn_once!("Unable to query {:?}: {}", entity, e);
+                        continue;
+                    }
                 };
 
                 let Some(rigid_body_handle) = self.physics_state.bodies_entity_map.get(&label).copied() else {
@@ -124,7 +126,7 @@ impl Scene for PlayMode {
                     filter,
                 );
 
-                kcc_controller.solve_character_collision_impulses(
+                kcc_controller.controller.solve_character_collision_impulses(
                     dt,
                     &mut query_pipeline_mut,
                     character_shape.as_ref(),
@@ -135,7 +137,7 @@ impl Scene for PlayMode {
         }
         
         let mut entity_label_map = HashMap::new();
-        for (entity, label) in self.world.query::<&Label>().iter() {
+        for (entity, label) in self.world.query::<(Entity, &Label)>().iter() {
             entity_label_map.insert(entity, label.clone());
         }
         
@@ -166,7 +168,7 @@ impl Scene for PlayMode {
 
         let mut sync_updates = Vec::new();
 
-        for (entity, (label, _)) in self.world.query::<(&Label, &EntityTransform)>().iter() {
+        for (entity, label, _) in self.world.query::<(Entity, &Label, &EntityTransform)>().iter() {
             if let Some(handle) = self.physics_state.bodies_entity_map.get(label) {
                 if let Some(body) = self.physics_state.bodies.get(*handle) {
                     let p = body.translation();
@@ -175,7 +177,7 @@ impl Scene for PlayMode {
                     sync_updates.push((
                         entity,
                         DVec3::new(p.x as f64, p.y as f64, p.z as f64),
-                        DQuat::from_xyzw(r.i as f64, r.j as f64, r.k as f64, r.w as f64)
+                        Quat::from(r.clone()).as_dquat()
                     ));
                 }
             }
@@ -301,14 +303,14 @@ impl Scene for PlayMode {
 
         {
             let mut query = self.world.query::<(&mut MeshRenderer, &Transform)>();
-            for (_entity, (renderer, transform)) in query.iter() {
+            for (renderer, transform) in query.iter() {
                 renderer.update(transform);
             }
         }
 
         {
             let mut updates = Vec::new();
-            for (entity, transform) in self.world.query::<&EntityTransform>().iter() {
+            for (entity, transform) in self.world.query::<(Entity, &EntityTransform)>().iter() {
                 let final_transform = transform.propagate(&self.world, entity);
                 updates.push((entity, final_transform));
             }
@@ -325,7 +327,7 @@ impl Scene for PlayMode {
                 .world
                 .query::<(&mut LightComponent, Option<&Transform>, Option<&EntityTransform>, &mut Light)>();
 
-            for (_, (light_comp, transform_opt, entity_transform_opt, light)) in light_query.iter() {
+            for (light_comp, transform_opt, entity_transform_opt, light) in light_query.iter() {
                 let transform = if let Some(entity_transform) = entity_transform_opt {
                     entity_transform.sync()
                 } else if let Some(transform) = transform_opt {
@@ -339,7 +341,7 @@ impl Scene for PlayMode {
         }
 
         {
-            for (_entity_id, (camera, component)) in self
+            for (camera, component) in self
                 .world
                 .query::<(&mut Camera, &mut CameraComponent)>()
                 .iter()
@@ -477,11 +479,7 @@ impl Scene for PlayMode {
         };
         log_once::debug_once!("Active camera found: {:?}", active_camera);
 
-        let q = if let Ok(mut query) = self.world.query_one::<&Camera>(active_camera) {
-            query.get().cloned()
-        } else {
-            None
-        };
+        let q = self.world.query_one::<&Camera>(active_camera).get().ok().cloned();
 
         let Some(camera) = q else {
             return;
@@ -505,7 +503,7 @@ impl Scene for PlayMode {
         let lights = {
             let mut lights = Vec::new();
             let mut query = self.world.query::<(&Light, &LightComponent)>();
-            for (_, (light, comp)) in query.iter() {
+            for (light, comp) in query.iter() {
                 lights.push((light.clone(), comp.clone()));
             }
             lights
@@ -514,7 +512,7 @@ impl Scene for PlayMode {
         let renderers = {
             let mut renderers = Vec::new();
             let mut query = self.world.query::<&MeshRenderer>();
-            for (_, renderer) in query.iter() {
+            for renderer in query.iter() {
                 renderers.push(renderer.clone());
             }
             renderers
@@ -559,7 +557,7 @@ impl Scene for PlayMode {
                 &mut Light,
             )>();
 
-            for (_, (light_component, transform_opt, entity_transform_opt, light)) in query.iter() {
+            for (light_component, transform_opt, entity_transform_opt, light) in query.iter() {
                 let transform = if let Some(entity_transform) = entity_transform_opt {
                     entity_transform.sync()
                 } else if let Some(transform) = transform_opt {
@@ -658,7 +656,7 @@ impl Scene for PlayMode {
                         HashMap::new();
 
                     let mut q = self.world.query::<(&EntityTransform, &ColliderGroup)>();
-                    for (_entity, (entity_transform, group)) in q.iter() {
+                    for (entity_transform, group) in q.iter() {
                         for collider in &group.colliders {
                             let world_tf = entity_transform.sync();
 
diff --git a/eucalyptus-editor/src/signal.rs b/eucalyptus-editor/src/signal.rs
index 5abc279..0f47faa 100644
--- a/eucalyptus-editor/src/signal.rs
+++ b/eucalyptus-editor/src/signal.rs
@@ -63,12 +63,8 @@ impl SignalController for Editor {
             Signal::Delete => {
                 if let Some(sel_e) = &self.selected_entity {
                     let is_viewport_cam =
-                        if let Ok(mut q) = self.world.query_one::<&CameraComponent>(*sel_e) {
-                            if let Some(c) = q.get() {
-                                matches!(c.camera_type, CameraType::Debug)
-                            } else {
-                                false
-                            }
+                        if let Ok(c) = self.world.query_one::<&CameraComponent>(*sel_e).get() {
+                            matches!(c.camera_type, CameraType::Debug)
                         } else {
                             false
                         };
diff --git a/redback-runtime/Cargo.toml b/redback-runtime/Cargo.toml
index 41e5152..5892af9 100644
--- a/redback-runtime/Cargo.toml
+++ b/redback-runtime/Cargo.toml
@@ -18,7 +18,7 @@ chrono.workspace = true
 env_logger.workspace = true
 colored.workspace = true
 parking_lot.workspace = true
-bincode.workspace = true
+postcard.workspace = true
 ron.workspace = true
 hecs.workspace = true
 bytemuck.workspace = true