kitgit

tirbofish/dropbear · commit

fd8da52e0edbc855f0fc92ca582659f65f27788f

feature: JVM now working after testing has been complete. HOORAY!!!. Happy new year to everyone. final commit for the year because i gotta spend time with family now :D looks like its ready to merge into main!

Unverified

Thribhu K <4tkbytes@pm.me> · 2025-12-31 12:28

view full diff

diff --git a/build.gradle.kts b/build.gradle.kts
index 06a66f0..47daf77 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -42,7 +42,7 @@ val libPathProvider = provider {
 }
 
 kotlin {
-    jvm {}
+    jvm { }
 
     val nativeTarget = when {
         isMacOs && isArm64 -> macosArm64("nativeLib")
@@ -145,7 +145,7 @@ tasks.register<JavaCompile>("generateJniHeaders") {
         tasks.named("compileKotlinJvm"),
     )
 
-    source = fileTree("src/jvmMain/kotlin") {
+    source = fileTree("src/jvmMain/java") {
         include("**/*.java")
     }
 
diff --git a/eucalyptus-core/src/asset.rs b/eucalyptus-core/src/asset.rs
index 399baf5..fa00e93 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 extern "system" fn Java_com_com_dropbear_asset_AssetHandleNative_isModelHandle(
+    pub 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 extern "system" fn Java_com_com_dropbear_asset_AssetHandleNative_isTextureHandle(
+    pub 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 7e37fcc..0e30f30 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 extern "system" fn Java_com_dropbear_asset_TextureHandleNative_getTextureName(
+    pub 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 7ccd606..94c71d5 100644
--- a/eucalyptus-core/src/camera.rs
+++ b/eucalyptus-core/src/camera.rs
@@ -135,9 +135,10 @@ pub mod jni {
     use dropbear_engine::camera::Camera;
     use crate::convert_jlong_to_entity;
     use crate::scripting::jni::utils::{FromJObject, ToJObject};
+    use crate::types::Vector3;
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_cameraExistsForEntity(
+    pub fn Java_com_dropbear_components_CameraNative_cameraExistsForEntity(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -153,7 +154,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_getCameraEye(
+    pub fn Java_com_dropbear_components_CameraNative_getCameraEye(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -162,7 +163,7 @@ pub mod jni {
         let world = crate::convert_ptr!(world_ptr => hecs::World);
         let entity = convert_jlong_to_entity!(entity_id);
         if let Ok(camera) = world.get::<&Camera>(entity) {
-            let eye: DVec3 = camera.eye;
+            let eye: Vector3 = Vector3::from(camera.eye);
             return match eye.to_jobject(&mut env) {
                 Ok(val) => val.into_raw(),
                 Err(_) => std::ptr::null_mut()
@@ -174,7 +175,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_setCameraEye(
+    pub fn Java_com_dropbear_components_CameraNative_setCameraEye(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -183,7 +184,7 @@ pub mod jni {
     ) {
         let world = crate::convert_ptr!(world_ptr => hecs::World);
         let entity = convert_jlong_to_entity!(entity_id);
-        let new_eye = match DVec3::from_jobject(&mut env, &eye_obj) {
+        let new_eye = match Vector3::from_jobject(&mut env, &eye_obj) {
             Ok(v) => v,
             Err(e) => {
                 let _ = env.throw_new("java/lang/IllegalArgumentException", format!("Invalid Vector3d: {:?}", e));
@@ -191,7 +192,7 @@ pub mod jni {
             }
         };
         if let Ok(mut camera) = world.get::<&mut Camera>(entity) {
-            camera.eye = new_eye;
+            camera.eye = DVec3::from(new_eye);
         } else {
             let _ = env.throw_new("java/lang/IllegalArgumentException", "Entity missing Camera component");
         }
@@ -199,7 +200,7 @@ pub mod jni {
 
     // TARGET
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_getCameraTarget(
+    pub fn Java_com_dropbear_components_CameraNative_getCameraTarget(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -208,7 +209,7 @@ pub mod jni {
         let world = crate::convert_ptr!(world_ptr => hecs::World);
         let entity = convert_jlong_to_entity!(entity_id);
         if let Ok(camera) = world.get::<&Camera>(entity) {
-            let target: DVec3 = camera.target;
+            let target: Vector3 = Vector3::from(camera.target);
             return match target.to_jobject(&mut env) {
                 Ok(val) => val.into_raw(),
                 Err(_) => std::ptr::null_mut()
@@ -220,7 +221,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_setCameraTarget(
+    pub fn Java_com_dropbear_components_CameraNative_setCameraTarget(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -229,17 +230,17 @@ pub mod jni {
     ) {
         let world = crate::convert_ptr!(world_ptr => hecs::World);
         let entity = convert_jlong_to_entity!(entity_id);
-        let new_target = match DVec3::from_jobject(&mut env, &target_obj) {
+        let new_target = match Vector3::from_jobject(&mut env, &target_obj) {
             Ok(v) => v,
             Err(_) => return,
         };
         if let Ok(mut camera) = world.get::<&mut Camera>(entity) {
-            camera.target = new_target;
+            camera.target = DVec3::from(new_target);
         }
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_getCameraUp(
+    pub fn Java_com_dropbear_components_CameraNative_getCameraUp(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -248,7 +249,7 @@ pub mod jni {
         let world = crate::convert_ptr!(world_ptr => hecs::World);
         let entity = convert_jlong_to_entity!(entity_id);
         if let Ok(camera) = world.get::<&Camera>(entity) {
-            let up: DVec3 = camera.up;
+            let up = Vector3::from(camera.up);
             return match up.to_jobject(&mut env) {
                 Ok(val) => val.into_raw(),
                 Err(_) => std::ptr::null_mut()
@@ -260,7 +261,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_setCameraUp(
+    pub fn Java_com_dropbear_components_CameraNative_setCameraUp(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -269,17 +270,17 @@ pub mod jni {
     ) {
         let world = crate::convert_ptr!(world_ptr => hecs::World);
         let entity = convert_jlong_to_entity!(entity_id);
-        let new_up = match DVec3::from_jobject(&mut env, &up_obj) {
+        let new_up = match Vector3::from_jobject(&mut env, &up_obj) {
             Ok(v) => v,
             Err(_) => return,
         };
         if let Ok(mut camera) = world.get::<&mut Camera>(entity) {
-            camera.up = new_up;
+            camera.up = DVec3::from(new_up);
         }
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_getCameraAspect(
+    pub fn Java_com_dropbear_components_CameraNative_getCameraAspect(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -295,7 +296,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_getCameraFovY(
+    pub fn Java_com_dropbear_components_CameraNative_getCameraFovY(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -311,7 +312,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_setCameraFovY(
+    pub fn Java_com_dropbear_components_CameraNative_setCameraFovY(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -326,7 +327,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_getCameraZNear(
+    pub fn Java_com_dropbear_components_CameraNative_getCameraZNear(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -342,7 +343,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_setCameraZNear(
+    pub fn Java_com_dropbear_components_CameraNative_setCameraZNear(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -357,7 +358,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_getCameraZFar(
+    pub fn Java_com_dropbear_components_CameraNative_getCameraZFar(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -373,7 +374,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_setCameraZFar(
+    pub fn Java_com_dropbear_components_CameraNative_setCameraZFar(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -388,7 +389,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_getCameraYaw(
+    pub fn Java_com_dropbear_components_CameraNative_getCameraYaw(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -404,7 +405,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_setCameraYaw(
+    pub fn Java_com_dropbear_components_CameraNative_setCameraYaw(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -419,7 +420,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_getCameraPitch(
+    pub fn Java_com_dropbear_components_CameraNative_getCameraPitch(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -435,7 +436,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_setCameraPitch(
+    pub fn Java_com_dropbear_components_CameraNative_setCameraPitch(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -450,7 +451,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_getCameraSpeed(
+    pub fn Java_com_dropbear_components_CameraNative_getCameraSpeed(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -466,7 +467,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_setCameraSpeed(
+    pub fn Java_com_dropbear_components_CameraNative_setCameraSpeed(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -481,7 +482,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_getCameraSensitivity(
+    pub fn Java_com_dropbear_components_CameraNative_getCameraSensitivity(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -497,7 +498,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CameraNative_setCameraSensitivity(
+    pub 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 65714db..d946533 100644
--- a/eucalyptus-core/src/engine.rs
+++ b/eucalyptus-core/src/engine.rs
@@ -66,7 +66,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_DropbearEngineNative_getEntity(
+    pub fn Java_com_dropbear_DropbearEngineNative_getEntity(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -88,7 +88,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_DropbearEngineNative_getAsset(
+    pub fn Java_com_dropbear_DropbearEngineNative_getAsset(
         mut env: JNIEnv,
         _class: JClass,
         asset_handle: jlong,
@@ -110,7 +110,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_DropbearEngineNative_quit(
+    pub 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 730f655..bb9a87e 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 extern "system" fn Java_com_com_dropbear_EntityRefNative_getEntityLabel(
+    pub fn Java_com_dropbear_EntityRefNative_getEntityLabel(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -33,7 +33,7 @@ pub mod jni {
         string.into_raw()
     }
 
-    pub extern "system" fn Java_com_com_dropbear_EntityRefNative_getChildren(
+    pub fn Java_com_dropbear_EntityRefNative_getChildren(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -64,7 +64,7 @@ pub mod jni {
         }
     }
 
-    pub extern "system" fn Java_com_com_dropbear_EntityRefNative_getChildByLabel(
+    pub fn Java_com_dropbear_EntityRefNative_getChildByLabel(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -98,7 +98,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_EntityRefNative_getParent(
+    pub fn Java_com_dropbear_EntityRefNative_getParent(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
diff --git a/eucalyptus-core/src/input.rs b/eucalyptus-core/src/input.rs
index 4efca24..a34adac 100644
--- a/eucalyptus-core/src/input.rs
+++ b/eucalyptus-core/src/input.rs
@@ -200,7 +200,7 @@ pub mod jni {
     use crate::scripting::jni::utils::ToJObject;
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_input_InputStateNative_printInputState(
+    pub fn Java_com_dropbear_input_InputStateNative_printInputState(
         _env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -210,7 +210,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_input_InputStateNative_isKeyPressed(
+    pub fn Java_com_dropbear_input_InputStateNative_isKeyPressed(
         _env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -221,7 +221,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_input_InputStateNative_getMousePosition(
+    pub fn Java_com_dropbear_input_InputStateNative_getMousePosition(
         mut env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -235,7 +235,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_input_InputStateNative_isMouseButtonPressed(
+    pub fn Java_com_dropbear_input_InputStateNative_isMouseButtonPressed(
         mut env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -257,7 +257,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_input_InputStateNative_getMouseDelta(
+    pub fn Java_com_dropbear_input_InputStateNative_getMouseDelta(
         mut env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -271,7 +271,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_input_InputStateNative_isCursorLocked(
+    pub fn Java_com_dropbear_input_InputStateNative_isCursorLocked(
         _env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -281,7 +281,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_input_InputStateNative_setCursorLocked(
+    pub fn Java_com_dropbear_input_InputStateNative_setCursorLocked(
         mut env: JNIEnv,
         _class: JClass,
         cmd_ptr: jlong,
@@ -297,7 +297,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_input_InputStateNative_getLastMousePos(
+    pub fn Java_com_dropbear_input_InputStateNative_getLastMousePos(
         mut env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -311,7 +311,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_input_InputStateNative_isCursorHidden(
+    pub fn Java_com_dropbear_input_InputStateNative_isCursorHidden(
         _env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
@@ -321,7 +321,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_input_InputStateNative_setCursorHidden(
+    pub fn Java_com_dropbear_input_InputStateNative_setCursorHidden(
         mut env: JNIEnv,
         _class: JClass,
         cmd_ptr: jlong,
@@ -337,7 +337,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_input_InputStateNative_getConnectedGamepads(
+    pub 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 2b99487..0455131 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 extern "system" fn Java_com_dropbear_input_GamepadNative_isGamepadButtonPressed(
+    pub 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 extern "system" fn Java_com_dropbear_input_GamepadNative_getLeftStickPosition(
+    pub 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 extern "system" fn Java_com_dropbear_input_GamepadNative_getRightStickPosition(
+    pub fn Java_com_dropbear_input_GamepadNative_getRightStickPosition(
         mut env: JNIEnv,
         _class: JClass,
         input_ptr: jlong,
diff --git a/eucalyptus-core/src/mesh.rs b/eucalyptus-core/src/mesh.rs
index 6bf4e26..5eda4a0 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 extern "system" fn Java_com_com_dropbear_components_MeshRendererNative_meshRendererExistsForEntity(
+    pub 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 extern "system" fn Java_com_com_dropbear_components_MeshRendererNative_getModel(
+    pub 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 extern "system" fn Java_com_com_dropbear_components_MeshRendererNative_setModel(
+    pub 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 extern "system" fn Java_com_com_dropbear_components_MeshRendererNative_getAllTextureIds(
+    pub 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 extern "system" fn Java_com_com_dropbear_components_MeshRendererNative_getTexture(
+    pub 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 extern "system" fn Java_com_com_dropbear_components_MeshRendererNative_setTextureOverride(
+    pub 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 6a3d5a0..2455c43 100644
--- a/eucalyptus-core/src/physics.rs
+++ b/eucalyptus-core/src/physics.rs
@@ -94,10 +94,9 @@ impl PhysicsState {
 
         let pos = transform.position.as_vec3().to_array();
         let rot = transform.rotation.as_quat().to_array();
-        let scale = transform.scale;
-        
+
         let body = RigidBodyBuilder::new(mode)
-            .translation(vector![pos[0] * scale.x as f32, pos[1] * scale.y as f32, pos[2] * scale.z as f32])
+            .translation(vector![pos[0], pos[1], pos[2]])
             .rotation(UnitQuaternion::from_quaternion(Quaternion::new(
                 rot[3] as f32, rot[0] as f32, rot[1] as f32, rot[2] as f32
             )).scaled_axis())
@@ -216,4 +215,70 @@ impl Default for PhysicsState {
     fn default() -> Self {
         Self::new()
     }
+}
+
+pub mod shared {
+    use crate::physics::PhysicsState;
+    use crate::types::Vector3;
+
+    pub fn get_gravity(physics: &PhysicsState) -> Vector3 {
+        Vector3::from(physics.gravity)
+    }
+
+    pub fn set_gravity(physics: &mut PhysicsState, new: Vector3) {
+        physics.gravity = new.to_float_array();
+    }
+}
+
+pub mod jni {
+    #![allow(non_snake_case)]
+
+    use jni::JNIEnv;
+    use jni::sys::{jlong, jobject};
+    use jni::objects::{JClass, JObject};
+    use crate::physics::PhysicsState;
+    use crate::scripting::jni::utils::{FromJObject, ToJObject};
+    use crate::scripting::result::DropbearNativeResult;
+    use crate::types::Vector3;
+
+    #[unsafe(no_mangle)]
+    pub fn Java_com_dropbear_physics_PhysicsNative_getGravity(
+        mut env: JNIEnv,
+        _: JClass,
+        physics_handle: jlong,
+    ) -> jobject {
+        let physics = crate::convert_ptr!(physics_handle => PhysicsState);
+
+        match super::shared::get_gravity(&physics).to_jobject(&mut env) {
+            Ok(v) => v.into_raw(),
+            Err(e) => {
+                let _ = env.throw_new("java/lang/RuntimeException", format!("Unable to create new Vector3d object for gravity: {}", e));
+                std::ptr::null_mut()
+            }
+        }
+
+    }
+
+    #[unsafe(no_mangle)]
+    pub fn Java_com_dropbear_physics_PhysicsNative_setGravity(
+        mut env: JNIEnv,
+        _: JClass,
+        physics_handle: jlong,
+        new_gravity: JObject,
+    ) {
+        let mut physics = crate::convert_ptr!(mut physics_handle => PhysicsState);
+        let vec3 = match Vector3::from_jobject(&mut env, &new_gravity) {
+            Ok(v) => v,
+            Err(e) => {
+                let _ = env.throw_new("java/lang/RuntimeException", format!("Unable to create new Vector3d object for gravity: {}", e));
+                return;
+            }
+        };
+
+        super::shared::set_gravity(&mut physics, vec3);
+    }
+}
+
+pub mod native {
+
 }
\ No newline at end of file
diff --git a/eucalyptus-core/src/physics/collider.rs b/eucalyptus-core/src/physics/collider.rs
index aa8a7bf..d6e4a9b 100644
--- a/eucalyptus-core/src/physics/collider.rs
+++ b/eucalyptus-core/src/physics/collider.rs
@@ -615,7 +615,7 @@ pub mod jni {
     use crate::physics::collider::ColliderShape;
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderShape(
+    pub fn Java_com_dropbear_physics_ColliderNative_getColliderShape(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -680,7 +680,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderShape(
+    pub fn Java_com_dropbear_physics_ColliderNative_setColliderShape(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -728,7 +728,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderDensity(
+    pub fn Java_com_dropbear_physics_ColliderNative_getColliderDensity(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -745,7 +745,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderDensity(
+    pub fn Java_com_dropbear_physics_ColliderNative_setColliderDensity(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -761,7 +761,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderFriction(
+    pub fn Java_com_dropbear_physics_ColliderNative_getColliderFriction(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -775,7 +775,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderFriction(
+    pub fn Java_com_dropbear_physics_ColliderNative_setColliderFriction(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -791,7 +791,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderRestitution(
+    pub fn Java_com_dropbear_physics_ColliderNative_getColliderRestitution(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -805,7 +805,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderRestitution(
+    pub fn Java_com_dropbear_physics_ColliderNative_setColliderRestitution(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -821,7 +821,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderMass(
+    pub fn Java_com_dropbear_physics_ColliderNative_getColliderMass(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -835,7 +835,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderMass(
+    pub fn Java_com_dropbear_physics_ColliderNative_setColliderMass(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -851,7 +851,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderIsSensor(
+    pub fn Java_com_dropbear_physics_ColliderNative_getColliderIsSensor(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -865,7 +865,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderIsSensor(
+    pub fn Java_com_dropbear_physics_ColliderNative_setColliderIsSensor(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -881,7 +881,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderTranslation(
+    pub fn Java_com_dropbear_physics_ColliderNative_getColliderTranslation(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -895,7 +895,7 @@ pub mod jni {
 
         if let Some(col) = get_collider(&physics, &ffi) {
             let t: &Vector3<f32> = col.translation();
-            let vec = DVec3::new(t.x as f64, t.y as f64, t.z as f64);
+            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(),
                 Err(_) => std::ptr::null_mut(),
@@ -906,7 +906,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderTranslation(
+    pub fn Java_com_dropbear_physics_ColliderNative_setColliderTranslation(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -915,7 +915,7 @@ pub mod jni {
     ) {
         let physics = crate::convert_ptr!(mut physics_ptr => PhysicsState);
         if let Ok(ffi) = ColliderFFI::from_jobject(&mut env, &collider_obj) {
-            if let Ok(vec) = DVec3::from_jobject(&mut env, &vec_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);
                     col.set_translation(t);
@@ -925,7 +925,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_getColliderRotation(
+    pub fn Java_com_dropbear_physics_ColliderNative_getColliderRotation(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -941,7 +941,7 @@ pub mod jni {
             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 euler = q.to_euler(glam::EulerRot::XYZ);
-            let vec = DVec3::new(euler.0, euler.1, euler.2);
+            let vec = crate::types::Vector3::new(euler.0, euler.1, euler.2);
 
             match vec.to_jobject(&mut env) {
                 Ok(o) => o.into_raw(),
@@ -953,7 +953,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_physics_ColliderNative_setColliderRotation(
+    pub fn Java_com_dropbear_physics_ColliderNative_setColliderRotation(
         mut env: JNIEnv,
         _class: JClass,
         physics_ptr: jlong,
@@ -962,7 +962,7 @@ pub mod jni {
     ) {
         let physics = crate::convert_ptr!(mut physics_ptr => PhysicsState);
         if let Ok(ffi) = ColliderFFI::from_jobject(&mut env, &collider_obj) {
-            if let Ok(vec) = DVec3::from_jobject(&mut env, &vec_obj) {
+            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(
diff --git a/eucalyptus-core/src/physics/collider/collidergroup.rs b/eucalyptus-core/src/physics/collider/collidergroup.rs
index 4395ccf..9ca2f16 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 extern "system" fn Java_com_dropbear_physics_ColliderGroupNative_colliderGroupExistsForEntity(
+    pub 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 extern "system" fn Java_com_dropbear_physics_ColliderGroupNative_getColliderGroupColliders(
+    pub fn Java_com_dropbear_physics_ColliderGroupNative_getColliderGroupColliders(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
diff --git a/eucalyptus-core/src/physics/rigidbody.rs b/eucalyptus-core/src/physics/rigidbody.rs
index 19cfe55..62a2e6c 100644
--- a/eucalyptus-core/src/physics/rigidbody.rs
+++ b/eucalyptus-core/src/physics/rigidbody.rs
@@ -129,8 +129,9 @@ pub struct RigidBody {
 	/// Scaling factor applied to gravity for this body.
 	#[serde(default = "RigidBody::default_gravity_scale")]
 	pub gravity_scale: f32,
-	
-	/// If the rigidbody is currently sleeping or not. 
+
+	#[serde(default)]
+	/// If the rigidbody is currently sleeping or not.
 	pub sleeping: bool,
 
 	/// Whether this body is allowed to sleep.
@@ -591,7 +592,7 @@ pub mod jni {
 	use rapier3d::dynamics::RigidBodyType;
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_rigidBodyExistsForEntity(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_rigidBodyExistsForEntity(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -618,7 +619,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyMode(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyMode(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -649,7 +650,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyMode(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyMode(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -673,7 +674,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyGravityScale(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyGravityScale(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -698,7 +699,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyGravityScale(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyGravityScale(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -722,7 +723,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLinearDamping(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLinearDamping(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -747,7 +748,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLinearDamping(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLinearDamping(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -771,7 +772,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyAngularDamping(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyAngularDamping(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -796,7 +797,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyAngularDamping(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyAngularDamping(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -820,7 +821,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodySleep(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodySleep(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -845,7 +846,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodySleep(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodySleep(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -869,7 +870,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyCcdEnabled(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyCcdEnabled(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -894,7 +895,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyCcdEnabled(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyCcdEnabled(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -918,7 +919,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLinearVelocity(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLinearVelocity(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -952,7 +953,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLinearVelocity(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLinearVelocity(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -982,7 +983,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyAngularVelocity(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyAngularVelocity(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -1016,7 +1017,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyAngularVelocity(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyAngularVelocity(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -1046,7 +1047,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLockTranslation(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLockTranslation(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -1080,7 +1081,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLockTranslation(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLockTranslation(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -1110,7 +1111,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLockRotation(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyLockRotation(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -1144,7 +1145,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLockRotation(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_setRigidBodyLockRotation(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -1174,7 +1175,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyChildren(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_getRigidBodyChildren(
 		mut env: JNIEnv,
 		_: JClass,
 		_world_ptr: jlong,
@@ -1226,7 +1227,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_applyImpulse(
+	pub fn Java_com_dropbear_physics_RigidBodyNative_applyImpulse(
 		mut env: JNIEnv,
 		_: JClass,
 		world_ptr: jlong,
@@ -1253,7 +1254,7 @@ pub mod jni {
 	}
 
 	#[unsafe(no_mangle)]
-	pub extern "system" fn Java_com_dropbear_physics_RigidBodyNative_applyTorqueImpulse(
+	pub 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 4537985..c0c68cf 100644
--- a/eucalyptus-core/src/properties.rs
+++ b/eucalyptus-core/src/properties.rs
@@ -184,6 +184,7 @@ pub mod jni {
 
     use crate::properties::{CustomProperties, Value};
     use crate::scripting::jni::utils::{FromJObject, ToJObject};
+    use crate::types::Vector3;
 
     /// Returns a primitive that is boxed (long => java.lang.Long)
     ///
@@ -221,7 +222,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_customPropertiesExistsForEntity(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_customPropertiesExistsForEntity(
         _env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -238,7 +239,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_getStringProperty(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_getStringProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -258,7 +259,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_getIntProperty(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_getIntProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -279,7 +280,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_getLongProperty(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_getLongProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -300,7 +301,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_getDoubleProperty(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_getDoubleProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -321,7 +322,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_getFloatProperty(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_getFloatProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -342,7 +343,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_getBoolProperty(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_getBoolProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -363,7 +364,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_getVec3Property(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_getVec3Property(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -376,7 +377,7 @@ pub mod jni {
 
         if let Ok(props) = world.get::<&CustomProperties>(entity) {
             if let Some(Value::Vec3(v)) = props.get_property(&key_str) {
-                return match DVec3::from_array(*v).to_jobject(&mut env) {
+                return match Vector3::from(*v).to_jobject(&mut env) {
                     Ok(obj) => obj.into_raw(),
                     Err(_) => std::ptr::null_mut()
                 };
@@ -386,7 +387,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_setStringProperty(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_setStringProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -405,7 +406,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_setIntProperty(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_setIntProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -423,7 +424,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_setLongProperty(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_setLongProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -441,7 +442,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_setFloatProperty(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_setFloatProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -459,7 +460,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_setDoubleProperty(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_setDoubleProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -477,7 +478,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_setBoolProperty(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_setBoolProperty(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -495,7 +496,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_com_dropbear_components_CustomPropertiesNative_setVec3Property(
+    pub fn Java_com_dropbear_components_CustomPropertiesNative_setVec3Property(
         mut env: JNIEnv,
         _class: JClass,
         world_handle: jlong,
@@ -507,7 +508,7 @@ pub mod jni {
         let entity = crate::convert_jlong_to_entity!(entity_id);
         let key_str = crate::convert_jstring!(env, key);
 
-        let vec_val = match DVec3::from_jobject(&mut env, &value) {
+        let vec_val = match Vector3::from_jobject(&mut env, &value) {
             Ok(v) => v,
             Err(_) => return,
         };
diff --git a/eucalyptus-core/src/scene/scripting.rs b/eucalyptus-core/src/scene/scripting.rs
index bf22c06..e3c5db2 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 extern "system" fn Java_com_dropbear_scene_SceneManagerNative_loadSceneAsyncNative__JJLjava_lang_String_2(
+    pub 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 extern "system" fn Java_com_dropbear_scene_SceneManagerNative_loadSceneAsyncNative__JJLjava_lang_String_2Ljava_lang_String_2(
+    pub 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 extern "system" fn Java_com_dropbear_scene_SceneManagerNative_switchToSceneImmediateNative(
+    pub 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 extern "system" fn Java_com_dropbear_scene_SceneLoadHandleNative_getSceneLoadHandleSceneName(
+    pub 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 extern "system" fn Java_com_dropbear_scene_SceneLoadHandleNative_switchToSceneAsync(
+    pub 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 extern "system" fn Java_com_dropbear_scene_SceneLoadHandleNative_getSceneLoadProgress(
+    pub 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 extern "system" fn Java_com_dropbear_scene_SceneLoadHandleNative_getSceneLoadStatus(
+    pub 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 3f9d986..73a2fe6 100644
--- a/eucalyptus-core/src/scripting.rs
+++ b/eucalyptus-core/src/scripting.rs
@@ -234,6 +234,13 @@ impl ScriptManager {
             physics_state,
         };
 
+        if world.is_null() { log::error!("World pointer is null"); }
+        if input.is_null() { log::error!("InputState pointer is null"); }
+        if graphics.is_null() { log::error!("CommandBuffer pointer is null"); }
+        if assets.is_null() { log::error!("AssetRegistry pointer is null"); }
+        if scene_loader.is_null() { log::error!("SceneLoader pointer is null"); }
+        if physics_state.is_null() { log::error!("PhysicsState pointer is null"); }
+
         match &self.script_target {
             ScriptTarget::JVM { .. } => {
                 if let Some(jvm) = &mut self.jvm {
diff --git a/eucalyptus-core/src/scripting/jni.rs b/eucalyptus-core/src/scripting/jni.rs
index f332732..97e9714 100644
--- a/eucalyptus-core/src/scripting/jni.rs
+++ b/eucalyptus-core/src/scripting/jni.rs
@@ -303,18 +303,27 @@ impl JavaContext {
             let scene_loader_handle = context.scene_loader as jlong;
             let physics_handle = context.physics_state as jlong;
 
+            let args = [
+                JValue::Long(world_handle),
+                JValue::Long(input_handle),
+                JValue::Long(graphics_handle),
+                JValue::Long(asset_handle),
+                JValue::Long(scene_loader_handle),
+                JValue::Long(physics_handle)
+            ];
+
+            let mut sig = String::from("(");
+            for _ in 0..args.len() {
+                sig.push('J');
+            }
+            sig.push(')');
+            sig.push('V');
+
             let dropbear_context_class: JClass = env.find_class("com/dropbear/ffi/DropbearContext")?;
             let dropbear_context_obj = env.new_object(
                 dropbear_context_class,
-                "(JJJJJ)V",
-                &[
-                    JValue::Long(world_handle),
-                    JValue::Long(input_handle),
-                    JValue::Long(graphics_handle),
-                    JValue::Long(asset_handle),
-                    JValue::Long(scene_loader_handle),
-                    JValue::Long(physics_handle)
-                ]
+                sig,
+                &args
             )?;
 
             log::trace!("Locating \"com/dropbear/ffi/NativeEngine\" class");
@@ -411,6 +420,10 @@ impl JavaContext {
 
     pub fn get_exception(env: &mut JNIEnv) -> anyhow::Result<()> {
         if let Ok(ex) = env.exception_occurred() {
+            if ex.is_null() {
+                return Ok(());
+            }
+
             env.exception_clear()?;
 
             let message_result = env.call_method(
diff --git a/eucalyptus-core/src/scripting/jni/utils.rs b/eucalyptus-core/src/scripting/jni/utils.rs
index c351823..80281e7 100644
--- a/eucalyptus-core/src/scripting/jni/utils.rs
+++ b/eucalyptus-core/src/scripting/jni/utils.rs
@@ -33,49 +33,7 @@ pub trait FromJObject {
         Self: Sized;
 }
 
-impl FromJObject for DVec3 {
-    fn from_jobject(env: &mut JNIEnv, obj: &JObject) -> DropbearNativeResult<Self>
-    where
-        Self: Sized
-    {
-        let x_obj = env
-            .get_field(obj, "x", "Ljava/lang/Number;").map_err(|_| DropbearNativeError::JNIFailedToGetField)?.l().map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;
-        let y_obj = env
-            .get_field(obj, "y", "Ljava/lang/Number;").map_err(|_| DropbearNativeError::JNIFailedToGetField)?.l().map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;
-        let z_obj = env
-            .get_field(obj, "z", "Ljava/lang/Number;").map_err(|_| DropbearNativeError::JNIFailedToGetField)?.l().map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;
-
-        let x = env
-            .call_method(&x_obj, "doubleValue", "()D", &[]).map_err(|_| DropbearNativeError::JNIMethodNotFound)?.d().map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;
-        let y = env
-            .call_method(&y_obj, "doubleValue", "()D", &[]).map_err(|_| DropbearNativeError::JNIMethodNotFound)?.d().map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;
-        let z = env
-            .call_method(&z_obj, "doubleValue", "()D", &[]).map_err(|_| DropbearNativeError::JNIMethodNotFound)?.d().map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;
-
-        Ok(DVec3::new(x, y, z))
-    }
-}
-
 /// Converts a Rust object (struct or enum) into a java [JObject]
 pub trait ToJObject {
     fn to_jobject<'a>(&self, env: &mut JNIEnv<'a>) -> DropbearNativeResult<JObject<'a>>;
-}
-
-impl ToJObject for DVec3 {
-    fn to_jobject<'a>(&self, env: &mut JNIEnv<'a>) -> DropbearNativeResult<JObject<'a>> {
-        let cls = env.find_class("com/dropbear/math/Vector3d")
-            .map_err(|_| DropbearNativeError::JNIClassNotFound)?;
-
-        let obj = env.new_object(
-            cls,
-            "(DDD)V",
-            &[
-                JValue::Double(self.x),
-                JValue::Double(self.y),
-                JValue::Double(self.z)
-            ]
-        ).map_err(|_| DropbearNativeError::JNIFailedToCreateObject)?;
-
-        Ok(obj)
-    }
 }
\ No newline at end of file
diff --git a/eucalyptus-core/src/transform.rs b/eucalyptus-core/src/transform.rs
index 75b8b52..b6a2d38 100644
--- a/eucalyptus-core/src/transform.rs
+++ b/eucalyptus-core/src/transform.rs
@@ -5,6 +5,7 @@ use dropbear_engine::entity::{EntityTransform, Transform};
 use glam::{DQuat, DVec3};
 use ::jni::objects::{JObject, JValue};
 use ::jni::JNIEnv;
+use crate::types::Vector3;
 
 impl FromJObject for Transform {
     fn from_jobject(env: &mut JNIEnv, obj: &JObject) -> DropbearNativeResult<Self> {
@@ -26,8 +27,8 @@ impl FromJObject for Transform {
         let scale_obj = scale_val.l()
             .map_err(|_| DropbearNativeError::JNIUnwrapFailed)?;
 
-        let position = DVec3::from_jobject(env, &pos_obj)?;
-        let scale = DVec3::from_jobject(env, &scale_obj)?;
+        let position: DVec3 = Vector3::from_jobject(env, &pos_obj)?.into();
+        let scale: DVec3 = Vector3::from_jobject(env, &scale_obj)?.into();
 
         let mut get_double = |field: &str| -> DropbearNativeResult<f64> {
             env.get_field(&rot_obj, field, "D")
@@ -151,7 +152,7 @@ pub mod jni {
     use jni::JNIEnv;
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_components_EntityTransformNative_entityTransformExistsForEntity(
+    pub fn Java_com_dropbear_components_EntityTransformNative_entityTransformExistsForEntity(
         _env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -164,7 +165,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_components_EntityTransformNative_getLocalTransform(
+    pub fn Java_com_dropbear_components_EntityTransformNative_getLocalTransform(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -185,7 +186,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_components_EntityTransformNative_setLocalTransform(
+    pub fn Java_com_dropbear_components_EntityTransformNative_setLocalTransform(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -211,7 +212,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_components_EntityTransformNative_getWorldTransform(
+    pub fn Java_com_dropbear_components_EntityTransformNative_getWorldTransform(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -232,7 +233,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_components_EntityTransformNative_setWorldTransform(
+    pub fn Java_com_dropbear_components_EntityTransformNative_setWorldTransform(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
@@ -255,7 +256,7 @@ pub mod jni {
     }
 
     #[unsafe(no_mangle)]
-    pub extern "system" fn Java_com_dropbear_components_EntityTransformNative_propagateTransform(
+    pub fn Java_com_dropbear_components_EntityTransformNative_propagateTransform(
         mut env: JNIEnv,
         _class: JClass,
         world_ptr: jlong,
diff --git a/eucalyptus-core/src/types.rs b/eucalyptus-core/src/types.rs
index 47e5753..9266a94 100644
--- a/eucalyptus-core/src/types.rs
+++ b/eucalyptus-core/src/types.rs
@@ -27,6 +27,9 @@ impl Vector3 {
     pub fn to_array(&self) -> [f64; 3] {
         [self.x, self.y, self.z]
     }
+    pub fn to_float_array(&self) -> [f32; 3] {
+        [self.x as f32, self.y as f32, self.z as f32]
+    }
 }
 
 impl From<glam::DVec3> for Vector3 {
@@ -45,6 +48,16 @@ impl From<[f64; 3]> for Vector3 {
     }
 }
 
+impl From<[f32; 3]> for Vector3 {
+    fn from(value: [f32; 3]) -> Self {
+        Vector3 {
+            x: value[0] as f64,
+            y: value[1] as f64,
+            z: value[2] as f64,
+        }
+    }
+}
+
 impl From<Vector3> for glam::DVec3 {
     fn from(v: Vector3) -> Self {
         Self::new(v.x, v.y, v.z)
diff --git a/eucalyptus-editor/src/editor/scene.rs b/eucalyptus-editor/src/editor/scene.rs
index fe51d2a..2a7d00d 100644
--- a/eucalyptus-editor/src/editor/scene.rs
+++ b/eucalyptus-editor/src/editor/scene.rs
@@ -1,4 +1,5 @@
 use crossbeam_channel::unbounded;
+use glam::DMat4;
 use super::*;
 use crate::signal::SignalController;
 use crate::spawn::PendingSpawnController;
@@ -473,18 +474,23 @@ impl Scene for Editor {
 
                             for (_entity, (entity_transform, group)) in q.iter() {
                                 for collider in &group.colliders {
-                                    let entity_matrix = entity_transform.sync().matrix().as_mat4();
+                                    let world_tf = entity_transform.sync();
+
+                                    let entity_matrix = DMat4::from_rotation_translation(
+                                        world_tf.rotation,
+                                        world_tf.position
+                                    ).as_mat4();
 
                                     let offset_transform = Transform::new()
                                         .with_offset(collider.translation, collider.rotation);
+
                                     let offset_matrix = offset_transform.matrix().as_mat4();
 
                                     let final_matrix = entity_matrix * offset_matrix;
 
                                     let color = [0.0, 1.0, 0.0, 1.0];
-
                                     let collider_uniform = ColliderUniform::from_matrix(final_matrix, color);
-
+                                    
                                     let collider_buffer = graphics.shared.device.create_buffer_init(
                                         &wgpu::util::BufferInitDescriptor {
                                             label: Some("Collider Uniform Buffer"),
diff --git a/eucalyptus-editor/src/runtime/mod.rs b/eucalyptus-editor/src/runtime/mod.rs
index a746092..5c8edcd 100644
--- a/eucalyptus-editor/src/runtime/mod.rs
+++ b/eucalyptus-editor/src/runtime/mod.rs
@@ -219,8 +219,9 @@ impl PlayMode {
             .script_manager
             .init_script(None, entity_tag_map.clone(), target.clone())
         {
-            log::error!("Failed to initialise scripts: {}", e);
-            return;
+            panic!("Failed to initialise scripts: {}", e);
+        } else {
+            log::debug!("Initialised scripts successfully!");
         }
 
         let world_ptr = self.world.as_mut() as WorldPtr;
@@ -232,12 +233,13 @@ impl PlayMode {
             .script_manager
             .load_script(world_ptr, input_ptr, graphics_ptr, physics_ptr)
         {
-            log::error!("Failed to load scripts: {}", e);
-            return;
+            panic!("Failed to load scripts: {}", e);
+        } else {
+            log::debug!("Loaded scripts successfully!");
         }
 
         self.scripts_ready = true;
-        log::debug!("Scripts initialised successfully");
+        log::debug!("Scripts reloaded successfully!");
     }
 
     /// Requests an asynchronous scene load, returning immediately and loading the scene in the background.
diff --git a/eucalyptus-editor/src/runtime/scene.rs b/eucalyptus-editor/src/runtime/scene.rs
index 40b06eb..00bae74 100644
--- a/eucalyptus-editor/src/runtime/scene.rs
+++ b/eucalyptus-editor/src/runtime/scene.rs
@@ -2,7 +2,7 @@ use std::collections::HashMap;
 use egui::{CentralPanel, MenuBar, TopBottomPanel};
 use eucalyptus_core::physics::collider::ColliderGroup;
 use eucalyptus_core::physics::collider::shader::ColliderUniform;
-use glam::{DQuat, DVec3};
+use glam::{DMat4, DQuat, DVec3};
 use hecs::Entity;
 use wgpu::Color;
 use wgpu::util::DeviceExt;
@@ -93,11 +93,11 @@ impl Scene for PlayMode {
                     let new_local_pos = (inv_p_rot * relative_pos) / p_scale;
                     let new_local_rot = inv_p_rot * new_world_rot;
 
-                    let local = transform.local_mut();
+                    let local = transform.world_mut();
                     local.position = new_local_pos;
                     local.rotation = new_local_rot;
                 } else {
-                    let local = transform.local_mut();
+                    let local = transform.world_mut();
                     local.position = new_world_pos;
                     local.rotation = new_world_rot;
                 }
@@ -472,16 +472,21 @@ impl Scene for PlayMode {
 
                 for (_entity, (entity_transform, group)) in q.iter() {
                     for collider in &group.colliders {
-                        let entity_matrix = entity_transform.sync().matrix().as_mat4();
+                        let world_tf = entity_transform.sync();
+
+                        let entity_matrix = DMat4::from_rotation_translation(
+                            world_tf.rotation,
+                            world_tf.position
+                        ).as_mat4();
 
                         let offset_transform = Transform::new()
                             .with_offset(collider.translation, collider.rotation);
+
                         let offset_matrix = offset_transform.matrix().as_mat4();
 
                         let final_matrix = entity_matrix * offset_matrix;
 
                         let color = [0.0, 1.0, 0.0, 1.0];
-
                         let collider_uniform = ColliderUniform::from_matrix(final_matrix, color);
 
                         let collider_buffer = graphics.shared.device.create_buffer_init(
diff --git a/src/commonMain/kotlin/com/dropbear/physics/Physics.kt b/src/commonMain/kotlin/com/dropbear/physics/Physics.kt
new file mode 100644
index 0000000..781583f
--- /dev/null
+++ b/src/commonMain/kotlin/com/dropbear/physics/Physics.kt
@@ -0,0 +1,10 @@
+package com.dropbear.physics
+
+import com.dropbear.math.Vector3d
+
+var gravity: Vector3d
+    get() = getGravity()
+    set(value) = setGravity(value)
+
+internal expect fun getGravity(): Vector3d
+internal expect fun setGravity(gravity: Vector3d)
\ No newline at end of file
diff --git a/src/jvmMain/java/com/dropbear/DropbearEngineNative.java b/src/jvmMain/java/com/dropbear/DropbearEngineNative.java
new file mode 100644
index 0000000..3068b19
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/DropbearEngineNative.java
@@ -0,0 +1,11 @@
+package com.dropbear;
+
+public class DropbearEngineNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native Long getEntity(long worldPtr, String label);
+    public static native Long getAsset(long assetHandle, String label);
+    public static native void quit(long commandBufferPtr);
+}
diff --git a/src/jvmMain/java/com/dropbear/EntityRefNative.java b/src/jvmMain/java/com/dropbear/EntityRefNative.java
new file mode 100644
index 0000000..9c79135
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/EntityRefNative.java
@@ -0,0 +1,12 @@
+package com.dropbear;
+
+public class EntityRefNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native String getEntityLabel(long worldPtr, long entityId);
+    public static native long[] getChildren(long worldPtr, long entityId);
+    public static native Long getChildByLabel(long worldPtr, long entityId, String label);
+    public static native Long getParent(long worldPtr, long entityId);
+}
diff --git a/src/jvmMain/java/com/dropbear/EucalyptusCoreLoader.java b/src/jvmMain/java/com/dropbear/EucalyptusCoreLoader.java
new file mode 100644
index 0000000..5cf3705
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/EucalyptusCoreLoader.java
@@ -0,0 +1,22 @@
+package com.dropbear;
+
+import com.dropbear.ffi.DynamicLibraryLoader;
+
+import java.lang.System;
+
+public class EucalyptusCoreLoader implements DynamicLibraryLoader {
+    private static boolean loaded = false;
+
+    @Override
+    public void ensureLoaded() {
+        if (!loaded) {
+            System.loadLibrary("eucalyptus_core");
+            loaded = true;
+        }
+    }
+
+    @Override
+    public boolean isLoaded() {
+        return loaded;
+    }
+}
diff --git a/src/jvmMain/java/com/dropbear/asset/AssetHandleNative.java b/src/jvmMain/java/com/dropbear/asset/AssetHandleNative.java
new file mode 100644
index 0000000..adc49b0
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/asset/AssetHandleNative.java
@@ -0,0 +1,12 @@
+package com.dropbear.asset;
+
+import com.dropbear.EucalyptusCoreLoader;
+
+public class AssetHandleNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native boolean isModelHandle(long assetRegistryHandle, long handle);
+    public static native boolean isTextureHandle(long assetRegistryHandle, long handle);
+}
diff --git a/src/jvmMain/java/com/dropbear/asset/TextureHandleNative.java b/src/jvmMain/java/com/dropbear/asset/TextureHandleNative.java
new file mode 100644
index 0000000..7fc5a1c
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/asset/TextureHandleNative.java
@@ -0,0 +1,11 @@
+package com.dropbear.asset;
+
+import com.dropbear.EucalyptusCoreLoader;
+
+public class TextureHandleNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native String getTextureName(long assetRegistryHandle, long handle);
+}
diff --git a/src/jvmMain/java/com/dropbear/components/CameraNative.java b/src/jvmMain/java/com/dropbear/components/CameraNative.java
new file mode 100644
index 0000000..969c2ff
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/components/CameraNative.java
@@ -0,0 +1,44 @@
+package com.dropbear.components;
+
+import com.dropbear.EucalyptusCoreLoader;
+import com.dropbear.math.Vector3d;
+
+public class CameraNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native boolean cameraExistsForEntity(long worldHandle, long entityId);
+
+    public static native Vector3d getCameraEye(long worldHandle, long entityId);
+    public static native void setCameraEye(long worldHandle, long entityId, Vector3d value);
+
+    public static native Vector3d getCameraTarget(long worldHandle, long entityId);
+    public static native void setCameraTarget(long worldHandle, long entityId, Vector3d value);
+
+    public static native Vector3d getCameraUp(long worldHandle, long entityId);
+    public static native void setCameraUp(long worldHandle, long entityId, Vector3d value);
+
+    public static native double getCameraAspect(long worldHandle, long entityId);
+
+    public static native double getCameraFovY(long worldHandle, long entityId);
+    public static native void setCameraFovY(long worldHandle, long entityId, double value);
+
+    public static native double getCameraZNear(long worldHandle, long entityId);
+    public static native void setCameraZNear(long worldHandle, long entityId, double value);
+
+    public static native double getCameraZFar(long worldHandle, long entityId);
+    public static native void setCameraZFar(long worldHandle, long entityId, double value);
+
+    public static native double getCameraYaw(long worldHandle, long entityId);
+    public static native void setCameraYaw(long worldHandle, long entityId, double value);
+
+    public static native double getCameraPitch(long worldHandle, long entityId);
+    public static native void setCameraPitch(long worldHandle, long entityId, double value);
+
+    public static native double getCameraSpeed(long worldHandle, long entityId);
+    public static native void setCameraSpeed(long worldHandle, long entityId, double value);
+
+    public static native double getCameraSensitivity(long worldHandle, long entityId);
+    public static native void setCameraSensitivity(long worldHandle, long entityId, double value);
+}
\ No newline at end of file
diff --git a/src/jvmMain/java/com/dropbear/components/CustomPropertiesNative.java b/src/jvmMain/java/com/dropbear/components/CustomPropertiesNative.java
new file mode 100644
index 0000000..e1775c0
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/components/CustomPropertiesNative.java
@@ -0,0 +1,27 @@
+package com.dropbear.components;
+
+import com.dropbear.EucalyptusCoreLoader;
+import com.dropbear.math.Vector3d;
+
+public class CustomPropertiesNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native boolean customPropertiesExistsForEntity(long worldHandle, long entityId);
+
+    public static native String getStringProperty(long worldHandle, long entityId, String label);
+    public static native Integer getIntProperty(long worldHandle, long entityId, String label);
+    public static native Long getLongProperty(long worldHandle, long entityId, String label);
+    public static native Double getDoubleProperty(long worldHandle, long entityId, String label);
+    public static native Float getFloatProperty(long worldHandle, long entityId, String label);
+    public static native Boolean getBoolProperty(long worldHandle, long entityId, String label);
+    public static native Vector3d getVec3Property(long worldHandle, long entityId, String label);
+
+    public static native void setStringProperty(long worldHandle, long entityId, String label, String value);
+    public static native void setIntProperty(long worldHandle, long entityId, String label, int value);
+    public static native void setLongProperty(long worldHandle, long entityId, String label, long value);
+    public static native void setFloatProperty(long worldHandle, long entityId, String label, double value);
+    public static native void setBoolProperty(long worldHandle, long entityId, String label, boolean value);
+    public static native void setVec3Property(long worldHandle, long entityId, String label, Vector3d value);
+}
\ No newline at end of file
diff --git a/src/jvmMain/java/com/dropbear/components/EntityTransformNative.java b/src/jvmMain/java/com/dropbear/components/EntityTransformNative.java
new file mode 100644
index 0000000..37520f7
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/components/EntityTransformNative.java
@@ -0,0 +1,18 @@
+package com.dropbear.components;
+
+import com.dropbear.EucalyptusCoreLoader;
+import com.dropbear.math.Transform;
+
+public class EntityTransformNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native boolean entityTransformExistsForEntity(long worldPtr, long entityId);
+
+    public static native Transform getLocalTransform(long worldPtr, long entityId);
+    public static native void setLocalTransform(long worldPtr, long entityId, Transform transform);
+    public static native Transform getWorldTransform(long worldPtr, long entityId);
+    public static native void setWorldTransform(long worldPtr, long entityId, Transform transform);
+    public static native Transform propagateTransform(long worldPtr, long entityId);
+}
\ No newline at end of file
diff --git a/src/jvmMain/java/com/dropbear/components/MeshRendererNative.java b/src/jvmMain/java/com/dropbear/components/MeshRendererNative.java
new file mode 100644
index 0000000..4bc8052
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/components/MeshRendererNative.java
@@ -0,0 +1,17 @@
+package com.dropbear.components;
+
+import com.dropbear.EucalyptusCoreLoader;
+
+public class MeshRendererNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native boolean meshRendererExistsForEntity(long worldHandle, long entityId);
+
+    public static native long getModel(long worldHandle, long entityId);
+    public static native void setModel(long worldHandle, long assetRegistryHandle, long entityId, long modelHandle);
+    public static native long[] getAllTextureIds(long worldHandle, long assetRegistryHandle, long entityId);
+    public static native Long getTexture(long worldHandle, long assetRegistryHandle, long entityId, String materialName);
+    public static native void setTextureOverride(long worldHandle, long assetRegistryHandle, long entityId, String meshName, long textureHandle);
+}
\ No newline at end of file
diff --git a/src/jvmMain/java/com/dropbear/ffi/DynamicLibraryLoader.java b/src/jvmMain/java/com/dropbear/ffi/DynamicLibraryLoader.java
new file mode 100644
index 0000000..43b5c17
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/ffi/DynamicLibraryLoader.java
@@ -0,0 +1,12 @@
+package com.dropbear.ffi;
+
+/// Interface for dynamic library loading, allowing for custom components not within the dropbear component
+/// library.
+public interface DynamicLibraryLoader {
+    /// Ensures that the library is loaded before accessing
+    /// any of the JNI static functions.
+    void ensureLoaded();
+
+    /// Forces the library to have a loaded boolean variable.
+    boolean isLoaded();
+}
diff --git a/src/jvmMain/java/com/dropbear/input/GamepadNative.java b/src/jvmMain/java/com/dropbear/input/GamepadNative.java
new file mode 100644
index 0000000..7ae48fa
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/input/GamepadNative.java
@@ -0,0 +1,14 @@
+package com.dropbear.input;
+
+import com.dropbear.EucalyptusCoreLoader;
+import com.dropbear.math.Vector2d;
+
+public class GamepadNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native boolean isGamepadButtonPressed(long inputStateHandle, long gamepad, int gamepadButton);
+    public static native Vector2d getLeftStickPosition(long inputStateHandle, long gamepad);
+    public static native Vector2d getRightStickPosition(long inputStateHandle, long gamepad);
+}
diff --git a/src/jvmMain/java/com/dropbear/input/InputStateNative.java b/src/jvmMain/java/com/dropbear/input/InputStateNative.java
new file mode 100644
index 0000000..1f47bc3
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/input/InputStateNative.java
@@ -0,0 +1,22 @@
+package com.dropbear.input;
+
+import com.dropbear.EucalyptusCoreLoader;
+import com.dropbear.math.Vector2d;
+
+public class InputStateNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native void printInputState(long inputStateHandle);
+    public static native boolean isKeyPressed(long inputStateHandle, int keyCode);
+    public static native Vector2d getMousePosition(long inputStateHandle);
+    public static native boolean isMouseButtonPressed(long inputStateHandle, MouseButton mouseButton);
+    public static native Vector2d getMouseDelta(long inputStateHandle);
+    public static native boolean isCursorLocked(long inputStateHandle);
+    public static native void setCursorLocked(long commandBufferPtr, long inputStateHandle, boolean locked);
+    public static native Vector2d getLastMousePos(long inputStateHandle);
+    public static native boolean isCursorHidden(long inputStateHandle);
+    public static native void setCursorHidden(long commandBufferPtr, long inputStateHandle, boolean hidden);
+    public static native long[] getConnectedGamepads(long inputStateHandle);
+}
diff --git a/src/jvmMain/java/com/dropbear/physics/ColliderGroupNative.java b/src/jvmMain/java/com/dropbear/physics/ColliderGroupNative.java
new file mode 100644
index 0000000..faa5998
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/physics/ColliderGroupNative.java
@@ -0,0 +1,12 @@
+package com.dropbear.physics;
+
+import com.dropbear.EucalyptusCoreLoader;
+
+public class ColliderGroupNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native Collider[] getColliderGroupColliders(long worldPtr, long physicsPtr, long entityId);
+    public static native boolean colliderGroupExistsForEntity(long worldPtr, long entityId);
+}
\ No newline at end of file
diff --git a/src/jvmMain/java/com/dropbear/physics/ColliderNative.java b/src/jvmMain/java/com/dropbear/physics/ColliderNative.java
new file mode 100644
index 0000000..e1a2052
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/physics/ColliderNative.java
@@ -0,0 +1,34 @@
+package com.dropbear.physics;
+
+import com.dropbear.EucalyptusCoreLoader;
+import com.dropbear.math.Vector3d;
+
+public class ColliderNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native ColliderShape getColliderShape(long physicsPtr, Collider collider);
+    public static native void setColliderShape(long physicsPtr, Collider collider, ColliderShape shape);
+
+    public static native double getColliderDensity(long physicsPtr, Collider collider);
+    public static native void setColliderDensity(long physicsPtr, Collider collider, double density);
+
+    public static native double getColliderFriction(long physicsPtr, Collider collider);
+    public static native void setColliderFriction(long physicsPtr, Collider collider, double friction);
+
+    public static native double getColliderRestitution(long physicsPtr, Collider collider);
+    public static native void setColliderRestitution(long physicsPtr, Collider collider, double restitution);
+
+    public static native double getColliderMass(long physicsPtr, Collider collider);
+    public static native void setColliderMass(long physicsPtr, Collider collider, double mass);
+
+    public static native boolean getColliderIsSensor(long physicsPtr, Collider collider);
+    public static native void setColliderIsSensor(long physicsPtr, Collider collider, boolean isSensor);
+
+    public static native Vector3d getColliderTranslation(long physicsPtr, Collider collider);
+    public static native void setColliderTranslation(long physicsPtr, Collider collider, Vector3d translation);
+
+    public static native Vector3d getColliderRotation(long physicsPtr, Collider collider);
+    public static native void setColliderRotation(long physicsPtr, Collider collider, Vector3d rotation);
+}
\ No newline at end of file
diff --git a/src/jvmMain/java/com/dropbear/physics/PhysicsNative.java b/src/jvmMain/java/com/dropbear/physics/PhysicsNative.java
new file mode 100644
index 0000000..f6476f2
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/physics/PhysicsNative.java
@@ -0,0 +1,13 @@
+package com.dropbear.physics;
+
+import com.dropbear.EucalyptusCoreLoader;
+import com.dropbear.math.Vector3d;
+
+public class PhysicsNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native Vector3d getGravity(long physicsHandle);
+    public static native void setGravity(long physicsHandle, Vector3d gravity);
+}
diff --git a/src/jvmMain/java/com/dropbear/physics/RigidBodyNative.java b/src/jvmMain/java/com/dropbear/physics/RigidBodyNative.java
new file mode 100644
index 0000000..cf3fa23
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/physics/RigidBodyNative.java
@@ -0,0 +1,47 @@
+package com.dropbear.physics;
+
+import com.dropbear.EucalyptusCoreLoader;
+import com.dropbear.math.Vector3d;
+
+public class RigidBodyNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native Index rigidBodyExistsForEntity(long worldPtr, long physicsPtr, long entityId);
+
+    public static native int getRigidBodyMode(long worldPtr, long physicsPtr, RigidBody rigidBody);
+    public static native void setRigidBodyMode(long worldPtr, long physicsPtr, RigidBody rigidBody, int mode);
+
+    public static native double getRigidBodyGravityScale(long worldPtr, long physicsPtr, RigidBody rigidBody);
+    public static native void setRigidBodyGravityScale(long worldPtr, long physicsPtr, RigidBody rigidBody, double gravityScale);
+
+    public static native double getRigidBodyLinearDamping(long worldPtr, long physicsPtr, RigidBody rigidBody);
+    public static native void setRigidBodyLinearDamping(long worldPtr, long physicsPtr, RigidBody rigidBody, double linearDamping);
+
+    public static native double getRigidBodyAngularDamping(long worldPtr, long physicsPtr, RigidBody rigidBody);
+    public static native void setRigidBodyAngularDamping(long worldPtr, long physicsPtr, RigidBody rigidBody, double angularDamping);
+
+    public static native boolean getRigidBodySleep(long worldPtr, long physicsPtr, RigidBody rigidBody);
+    public static native void setRigidBodySleep(long worldPtr, long physicsPtr, RigidBody rigidBody, boolean canSleep);
+
+    public static native boolean getRigidBodyCcdEnabled(long worldPtr, long physicsPtr, RigidBody rigidBody);
+    public static native void setRigidBodyCcdEnabled(long worldPtr, long physicsPtr, RigidBody rigidBody, boolean ccdEnabled);
+
+    public static native Vector3d getRigidBodyLinearVelocity(long worldPtr, long physicsPtr, RigidBody rigidBody);
+    public static native void setRigidBodyLinearVelocity(long worldPtr, long physicsPtr, RigidBody rigidBody, Vector3d linearVelocity);
+
+    public static native Vector3d getRigidBodyAngularVelocity(long worldPtr, long physicsPtr, RigidBody rigidBody);
+    public static native void setRigidBodyAngularVelocity(long worldPtr, long physicsPtr, RigidBody rigidBody, Vector3d angularVelocity);
+
+    public static native AxisLock getRigidBodyLockTranslation(long worldPtr, long physicsPtr, RigidBody rigidBody);
+    public static native void setRigidBodyLockTranslation(long worldPtr, long physicsPtr, RigidBody rigidBody, AxisLock lockTranslation);
+
+    public static native AxisLock getRigidBodyLockRotation(long worldPtr, long physicsPtr, RigidBody rigidBody);
+    public static native void setRigidBodyLockRotation(long worldPtr, long physicsPtr, RigidBody rigidBody, AxisLock lockRotation);
+
+    public static native Collider[] getRigidBodyChildren(long worldPtr, long physicsPtr, RigidBody rigidBody);
+
+    public static native void applyImpulse(long worldPtr, long physicsPtr, RigidBody rigidBody, double x, double y, double z);
+    public static native void applyTorqueImpulse(long worldPtr, long physicsPtr, RigidBody rigidBody, double x, double y, double z);
+}
\ No newline at end of file
diff --git a/src/jvmMain/java/com/dropbear/scene/SceneLoadHandleNative.java b/src/jvmMain/java/com/dropbear/scene/SceneLoadHandleNative.java
new file mode 100644
index 0000000..28f72df
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/scene/SceneLoadHandleNative.java
@@ -0,0 +1,15 @@
+package com.dropbear.scene;
+
+import com.dropbear.EucalyptusCoreLoader;
+import com.dropbear.utils.Progress;
+
+public class SceneLoadHandleNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native String getSceneLoadHandleSceneName(long sceneLoaderHandle, long sceneId);
+    public static native void switchToSceneAsync(long commandBufferPtr, long sceneId);
+    public static native Progress getSceneLoadProgress(long sceneLoaderHandle, long sceneId);
+    public static native int getSceneLoadStatus(long sceneLoaderHandle, long sceneId);
+}
diff --git a/src/jvmMain/java/com/dropbear/scene/SceneManagerNative.java b/src/jvmMain/java/com/dropbear/scene/SceneManagerNative.java
new file mode 100644
index 0000000..7788660
--- /dev/null
+++ b/src/jvmMain/java/com/dropbear/scene/SceneManagerNative.java
@@ -0,0 +1,13 @@
+package com.dropbear.scene;
+
+import com.dropbear.EucalyptusCoreLoader;
+
+public class SceneManagerNative {
+    static {
+        new EucalyptusCoreLoader().ensureLoaded();
+    }
+
+    public static native Long loadSceneAsyncNative(long commandBufferPtr, long sceneManagerHandle, String sceneName);
+    public static native Long loadSceneAsyncNative(long commandBufferPtr, long sceneManagerHandle, String sceneName, String loadingScene);
+    public static native void switchToSceneImmediateNative(long commandBufferPtr, String sceneName);
+}
\ No newline at end of file
diff --git a/src/jvmMain/kotlin/com/dropbear/DropbearEngineNative.java b/src/jvmMain/kotlin/com/dropbear/DropbearEngineNative.java
deleted file mode 100644
index 3068b19..0000000
--- a/src/jvmMain/kotlin/com/dropbear/DropbearEngineNative.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.dropbear;
-
-public class DropbearEngineNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native Long getEntity(long worldPtr, String label);
-    public static native Long getAsset(long assetHandle, String label);
-    public static native void quit(long commandBufferPtr);
-}
diff --git a/src/jvmMain/kotlin/com/dropbear/EntityRefNative.java b/src/jvmMain/kotlin/com/dropbear/EntityRefNative.java
deleted file mode 100644
index 9c79135..0000000
--- a/src/jvmMain/kotlin/com/dropbear/EntityRefNative.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.dropbear;
-
-public class EntityRefNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native String getEntityLabel(long worldPtr, long entityId);
-    public static native long[] getChildren(long worldPtr, long entityId);
-    public static native Long getChildByLabel(long worldPtr, long entityId, String label);
-    public static native Long getParent(long worldPtr, long entityId);
-}
diff --git a/src/jvmMain/kotlin/com/dropbear/EucalyptusCoreLoader.java b/src/jvmMain/kotlin/com/dropbear/EucalyptusCoreLoader.java
deleted file mode 100644
index 5cf3705..0000000
--- a/src/jvmMain/kotlin/com/dropbear/EucalyptusCoreLoader.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.dropbear;
-
-import com.dropbear.ffi.DynamicLibraryLoader;
-
-import java.lang.System;
-
-public class EucalyptusCoreLoader implements DynamicLibraryLoader {
-    private static boolean loaded = false;
-
-    @Override
-    public void ensureLoaded() {
-        if (!loaded) {
-            System.loadLibrary("eucalyptus_core");
-            loaded = true;
-        }
-    }
-
-    @Override
-    public boolean isLoaded() {
-        return loaded;
-    }
-}
diff --git a/src/jvmMain/kotlin/com/dropbear/asset/AssetHandleNative.java b/src/jvmMain/kotlin/com/dropbear/asset/AssetHandleNative.java
deleted file mode 100644
index adc49b0..0000000
--- a/src/jvmMain/kotlin/com/dropbear/asset/AssetHandleNative.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.dropbear.asset;
-
-import com.dropbear.EucalyptusCoreLoader;
-
-public class AssetHandleNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native boolean isModelHandle(long assetRegistryHandle, long handle);
-    public static native boolean isTextureHandle(long assetRegistryHandle, long handle);
-}
diff --git a/src/jvmMain/kotlin/com/dropbear/asset/TextureHandleNative.java b/src/jvmMain/kotlin/com/dropbear/asset/TextureHandleNative.java
deleted file mode 100644
index 7fc5a1c..0000000
--- a/src/jvmMain/kotlin/com/dropbear/asset/TextureHandleNative.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.dropbear.asset;
-
-import com.dropbear.EucalyptusCoreLoader;
-
-public class TextureHandleNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native String getTextureName(long assetRegistryHandle, long handle);
-}
diff --git a/src/jvmMain/kotlin/com/dropbear/components/CameraNative.java b/src/jvmMain/kotlin/com/dropbear/components/CameraNative.java
deleted file mode 100644
index 969c2ff..0000000
--- a/src/jvmMain/kotlin/com/dropbear/components/CameraNative.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.dropbear.components;
-
-import com.dropbear.EucalyptusCoreLoader;
-import com.dropbear.math.Vector3d;
-
-public class CameraNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native boolean cameraExistsForEntity(long worldHandle, long entityId);
-
-    public static native Vector3d getCameraEye(long worldHandle, long entityId);
-    public static native void setCameraEye(long worldHandle, long entityId, Vector3d value);
-
-    public static native Vector3d getCameraTarget(long worldHandle, long entityId);
-    public static native void setCameraTarget(long worldHandle, long entityId, Vector3d value);
-
-    public static native Vector3d getCameraUp(long worldHandle, long entityId);
-    public static native void setCameraUp(long worldHandle, long entityId, Vector3d value);
-
-    public static native double getCameraAspect(long worldHandle, long entityId);
-
-    public static native double getCameraFovY(long worldHandle, long entityId);
-    public static native void setCameraFovY(long worldHandle, long entityId, double value);
-
-    public static native double getCameraZNear(long worldHandle, long entityId);
-    public static native void setCameraZNear(long worldHandle, long entityId, double value);
-
-    public static native double getCameraZFar(long worldHandle, long entityId);
-    public static native void setCameraZFar(long worldHandle, long entityId, double value);
-
-    public static native double getCameraYaw(long worldHandle, long entityId);
-    public static native void setCameraYaw(long worldHandle, long entityId, double value);
-
-    public static native double getCameraPitch(long worldHandle, long entityId);
-    public static native void setCameraPitch(long worldHandle, long entityId, double value);
-
-    public static native double getCameraSpeed(long worldHandle, long entityId);
-    public static native void setCameraSpeed(long worldHandle, long entityId, double value);
-
-    public static native double getCameraSensitivity(long worldHandle, long entityId);
-    public static native void setCameraSensitivity(long worldHandle, long entityId, double value);
-}
\ No newline at end of file
diff --git a/src/jvmMain/kotlin/com/dropbear/components/CustomPropertiesNative.java b/src/jvmMain/kotlin/com/dropbear/components/CustomPropertiesNative.java
deleted file mode 100644
index e1775c0..0000000
--- a/src/jvmMain/kotlin/com/dropbear/components/CustomPropertiesNative.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.dropbear.components;
-
-import com.dropbear.EucalyptusCoreLoader;
-import com.dropbear.math.Vector3d;
-
-public class CustomPropertiesNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native boolean customPropertiesExistsForEntity(long worldHandle, long entityId);
-
-    public static native String getStringProperty(long worldHandle, long entityId, String label);
-    public static native Integer getIntProperty(long worldHandle, long entityId, String label);
-    public static native Long getLongProperty(long worldHandle, long entityId, String label);
-    public static native Double getDoubleProperty(long worldHandle, long entityId, String label);
-    public static native Float getFloatProperty(long worldHandle, long entityId, String label);
-    public static native Boolean getBoolProperty(long worldHandle, long entityId, String label);
-    public static native Vector3d getVec3Property(long worldHandle, long entityId, String label);
-
-    public static native void setStringProperty(long worldHandle, long entityId, String label, String value);
-    public static native void setIntProperty(long worldHandle, long entityId, String label, int value);
-    public static native void setLongProperty(long worldHandle, long entityId, String label, long value);
-    public static native void setFloatProperty(long worldHandle, long entityId, String label, double value);
-    public static native void setBoolProperty(long worldHandle, long entityId, String label, boolean value);
-    public static native void setVec3Property(long worldHandle, long entityId, String label, Vector3d value);
-}
\ No newline at end of file
diff --git a/src/jvmMain/kotlin/com/dropbear/components/EntityTransformNative.java b/src/jvmMain/kotlin/com/dropbear/components/EntityTransformNative.java
deleted file mode 100644
index 37520f7..0000000
--- a/src/jvmMain/kotlin/com/dropbear/components/EntityTransformNative.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.dropbear.components;
-
-import com.dropbear.EucalyptusCoreLoader;
-import com.dropbear.math.Transform;
-
-public class EntityTransformNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native boolean entityTransformExistsForEntity(long worldPtr, long entityId);
-
-    public static native Transform getLocalTransform(long worldPtr, long entityId);
-    public static native void setLocalTransform(long worldPtr, long entityId, Transform transform);
-    public static native Transform getWorldTransform(long worldPtr, long entityId);
-    public static native void setWorldTransform(long worldPtr, long entityId, Transform transform);
-    public static native Transform propagateTransform(long worldPtr, long entityId);
-}
\ No newline at end of file
diff --git a/src/jvmMain/kotlin/com/dropbear/components/MeshRendererNative.java b/src/jvmMain/kotlin/com/dropbear/components/MeshRendererNative.java
deleted file mode 100644
index 4bc8052..0000000
--- a/src/jvmMain/kotlin/com/dropbear/components/MeshRendererNative.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.dropbear.components;
-
-import com.dropbear.EucalyptusCoreLoader;
-
-public class MeshRendererNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native boolean meshRendererExistsForEntity(long worldHandle, long entityId);
-
-    public static native long getModel(long worldHandle, long entityId);
-    public static native void setModel(long worldHandle, long assetRegistryHandle, long entityId, long modelHandle);
-    public static native long[] getAllTextureIds(long worldHandle, long assetRegistryHandle, long entityId);
-    public static native Long getTexture(long worldHandle, long assetRegistryHandle, long entityId, String materialName);
-    public static native void setTextureOverride(long worldHandle, long assetRegistryHandle, long entityId, String meshName, long textureHandle);
-}
\ No newline at end of file
diff --git a/src/jvmMain/kotlin/com/dropbear/ffi/DynamicLibraryLoader.java b/src/jvmMain/kotlin/com/dropbear/ffi/DynamicLibraryLoader.java
deleted file mode 100644
index 43b5c17..0000000
--- a/src/jvmMain/kotlin/com/dropbear/ffi/DynamicLibraryLoader.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.dropbear.ffi;
-
-/// Interface for dynamic library loading, allowing for custom components not within the dropbear component
-/// library.
-public interface DynamicLibraryLoader {
-    /// Ensures that the library is loaded before accessing
-    /// any of the JNI static functions.
-    void ensureLoaded();
-
-    /// Forces the library to have a loaded boolean variable.
-    boolean isLoaded();
-}
diff --git a/src/jvmMain/kotlin/com/dropbear/input/GamepadNative.java b/src/jvmMain/kotlin/com/dropbear/input/GamepadNative.java
deleted file mode 100644
index 0ee5294..0000000
--- a/src/jvmMain/kotlin/com/dropbear/input/GamepadNative.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.dropbear.input;
-
-import com.dropbear.EucalyptusCoreLoader;
-import com.dropbear.math.Vector2;
-import com.dropbear.math.Vector2d;
-
-public class GamepadNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native boolean isGamepadButtonPressed(long inputStateHandle, long gamepad, int gamepadButton);
-    public static native Vector2d getLeftStickPosition(long inputStateHandle, long gamepad);
-    public static native Vector2d getRightStickPosition(long inputStateHandle, long gamepad);
-}
diff --git a/src/jvmMain/kotlin/com/dropbear/input/InputStateNative.java b/src/jvmMain/kotlin/com/dropbear/input/InputStateNative.java
deleted file mode 100644
index 1f47bc3..0000000
--- a/src/jvmMain/kotlin/com/dropbear/input/InputStateNative.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.dropbear.input;
-
-import com.dropbear.EucalyptusCoreLoader;
-import com.dropbear.math.Vector2d;
-
-public class InputStateNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native void printInputState(long inputStateHandle);
-    public static native boolean isKeyPressed(long inputStateHandle, int keyCode);
-    public static native Vector2d getMousePosition(long inputStateHandle);
-    public static native boolean isMouseButtonPressed(long inputStateHandle, MouseButton mouseButton);
-    public static native Vector2d getMouseDelta(long inputStateHandle);
-    public static native boolean isCursorLocked(long inputStateHandle);
-    public static native void setCursorLocked(long commandBufferPtr, long inputStateHandle, boolean locked);
-    public static native Vector2d getLastMousePos(long inputStateHandle);
-    public static native boolean isCursorHidden(long inputStateHandle);
-    public static native void setCursorHidden(long commandBufferPtr, long inputStateHandle, boolean hidden);
-    public static native long[] getConnectedGamepads(long inputStateHandle);
-}
diff --git a/src/jvmMain/kotlin/com/dropbear/physics/ColliderGroupNative.java b/src/jvmMain/kotlin/com/dropbear/physics/ColliderGroupNative.java
deleted file mode 100644
index faa5998..0000000
--- a/src/jvmMain/kotlin/com/dropbear/physics/ColliderGroupNative.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.dropbear.physics;
-
-import com.dropbear.EucalyptusCoreLoader;
-
-public class ColliderGroupNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native Collider[] getColliderGroupColliders(long worldPtr, long physicsPtr, long entityId);
-    public static native boolean colliderGroupExistsForEntity(long worldPtr, long entityId);
-}
\ No newline at end of file
diff --git a/src/jvmMain/kotlin/com/dropbear/physics/ColliderNative.java b/src/jvmMain/kotlin/com/dropbear/physics/ColliderNative.java
deleted file mode 100644
index e1a2052..0000000
--- a/src/jvmMain/kotlin/com/dropbear/physics/ColliderNative.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.dropbear.physics;
-
-import com.dropbear.EucalyptusCoreLoader;
-import com.dropbear.math.Vector3d;
-
-public class ColliderNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native ColliderShape getColliderShape(long physicsPtr, Collider collider);
-    public static native void setColliderShape(long physicsPtr, Collider collider, ColliderShape shape);
-
-    public static native double getColliderDensity(long physicsPtr, Collider collider);
-    public static native void setColliderDensity(long physicsPtr, Collider collider, double density);
-
-    public static native double getColliderFriction(long physicsPtr, Collider collider);
-    public static native void setColliderFriction(long physicsPtr, Collider collider, double friction);
-
-    public static native double getColliderRestitution(long physicsPtr, Collider collider);
-    public static native void setColliderRestitution(long physicsPtr, Collider collider, double restitution);
-
-    public static native double getColliderMass(long physicsPtr, Collider collider);
-    public static native void setColliderMass(long physicsPtr, Collider collider, double mass);
-
-    public static native boolean getColliderIsSensor(long physicsPtr, Collider collider);
-    public static native void setColliderIsSensor(long physicsPtr, Collider collider, boolean isSensor);
-
-    public static native Vector3d getColliderTranslation(long physicsPtr, Collider collider);
-    public static native void setColliderTranslation(long physicsPtr, Collider collider, Vector3d translation);
-
-    public static native Vector3d getColliderRotation(long physicsPtr, Collider collider);
-    public static native void setColliderRotation(long physicsPtr, Collider collider, Vector3d rotation);
-}
\ No newline at end of file
diff --git a/src/jvmMain/kotlin/com/dropbear/physics/Physics.jvm.kt b/src/jvmMain/kotlin/com/dropbear/physics/Physics.jvm.kt
new file mode 100644
index 0000000..61e4b1c
--- /dev/null
+++ b/src/jvmMain/kotlin/com/dropbear/physics/Physics.jvm.kt
@@ -0,0 +1,12 @@
+package com.dropbear.physics
+
+import com.dropbear.DropbearEngine
+import com.dropbear.math.Vector3d
+
+internal actual fun getGravity(): Vector3d {
+    return PhysicsNative.getGravity(DropbearEngine.native.physicsEngineHandle) ?: Vector3d(0.0, -9.81, 0.0)
+}
+
+internal actual fun setGravity(gravity: Vector3d) {
+    return PhysicsNative.setGravity(DropbearEngine.native.physicsEngineHandle, gravity)
+}
\ No newline at end of file
diff --git a/src/jvmMain/kotlin/com/dropbear/physics/RigidBodyNative.java b/src/jvmMain/kotlin/com/dropbear/physics/RigidBodyNative.java
deleted file mode 100644
index cf3fa23..0000000
--- a/src/jvmMain/kotlin/com/dropbear/physics/RigidBodyNative.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.dropbear.physics;
-
-import com.dropbear.EucalyptusCoreLoader;
-import com.dropbear.math.Vector3d;
-
-public class RigidBodyNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native Index rigidBodyExistsForEntity(long worldPtr, long physicsPtr, long entityId);
-
-    public static native int getRigidBodyMode(long worldPtr, long physicsPtr, RigidBody rigidBody);
-    public static native void setRigidBodyMode(long worldPtr, long physicsPtr, RigidBody rigidBody, int mode);
-
-    public static native double getRigidBodyGravityScale(long worldPtr, long physicsPtr, RigidBody rigidBody);
-    public static native void setRigidBodyGravityScale(long worldPtr, long physicsPtr, RigidBody rigidBody, double gravityScale);
-
-    public static native double getRigidBodyLinearDamping(long worldPtr, long physicsPtr, RigidBody rigidBody);
-    public static native void setRigidBodyLinearDamping(long worldPtr, long physicsPtr, RigidBody rigidBody, double linearDamping);
-
-    public static native double getRigidBodyAngularDamping(long worldPtr, long physicsPtr, RigidBody rigidBody);
-    public static native void setRigidBodyAngularDamping(long worldPtr, long physicsPtr, RigidBody rigidBody, double angularDamping);
-
-    public static native boolean getRigidBodySleep(long worldPtr, long physicsPtr, RigidBody rigidBody);
-    public static native void setRigidBodySleep(long worldPtr, long physicsPtr, RigidBody rigidBody, boolean canSleep);
-
-    public static native boolean getRigidBodyCcdEnabled(long worldPtr, long physicsPtr, RigidBody rigidBody);
-    public static native void setRigidBodyCcdEnabled(long worldPtr, long physicsPtr, RigidBody rigidBody, boolean ccdEnabled);
-
-    public static native Vector3d getRigidBodyLinearVelocity(long worldPtr, long physicsPtr, RigidBody rigidBody);
-    public static native void setRigidBodyLinearVelocity(long worldPtr, long physicsPtr, RigidBody rigidBody, Vector3d linearVelocity);
-
-    public static native Vector3d getRigidBodyAngularVelocity(long worldPtr, long physicsPtr, RigidBody rigidBody);
-    public static native void setRigidBodyAngularVelocity(long worldPtr, long physicsPtr, RigidBody rigidBody, Vector3d angularVelocity);
-
-    public static native AxisLock getRigidBodyLockTranslation(long worldPtr, long physicsPtr, RigidBody rigidBody);
-    public static native void setRigidBodyLockTranslation(long worldPtr, long physicsPtr, RigidBody rigidBody, AxisLock lockTranslation);
-
-    public static native AxisLock getRigidBodyLockRotation(long worldPtr, long physicsPtr, RigidBody rigidBody);
-    public static native void setRigidBodyLockRotation(long worldPtr, long physicsPtr, RigidBody rigidBody, AxisLock lockRotation);
-
-    public static native Collider[] getRigidBodyChildren(long worldPtr, long physicsPtr, RigidBody rigidBody);
-
-    public static native void applyImpulse(long worldPtr, long physicsPtr, RigidBody rigidBody, double x, double y, double z);
-    public static native void applyTorqueImpulse(long worldPtr, long physicsPtr, RigidBody rigidBody, double x, double y, double z);
-}
\ No newline at end of file
diff --git a/src/jvmMain/kotlin/com/dropbear/scene/SceneLoadHandleNative.java b/src/jvmMain/kotlin/com/dropbear/scene/SceneLoadHandleNative.java
deleted file mode 100644
index 28f72df..0000000
--- a/src/jvmMain/kotlin/com/dropbear/scene/SceneLoadHandleNative.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.dropbear.scene;
-
-import com.dropbear.EucalyptusCoreLoader;
-import com.dropbear.utils.Progress;
-
-public class SceneLoadHandleNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native String getSceneLoadHandleSceneName(long sceneLoaderHandle, long sceneId);
-    public static native void switchToSceneAsync(long commandBufferPtr, long sceneId);
-    public static native Progress getSceneLoadProgress(long sceneLoaderHandle, long sceneId);
-    public static native int getSceneLoadStatus(long sceneLoaderHandle, long sceneId);
-}
diff --git a/src/jvmMain/kotlin/com/dropbear/scene/SceneManagerNative.java b/src/jvmMain/kotlin/com/dropbear/scene/SceneManagerNative.java
deleted file mode 100644
index 7788660..0000000
--- a/src/jvmMain/kotlin/com/dropbear/scene/SceneManagerNative.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.dropbear.scene;
-
-import com.dropbear.EucalyptusCoreLoader;
-
-public class SceneManagerNative {
-    static {
-        new EucalyptusCoreLoader().ensureLoaded();
-    }
-
-    public static native Long loadSceneAsyncNative(long commandBufferPtr, long sceneManagerHandle, String sceneName);
-    public static native Long loadSceneAsyncNative(long commandBufferPtr, long sceneManagerHandle, String sceneName, String loadingScene);
-    public static native void switchToSceneImmediateNative(long commandBufferPtr, String sceneName);
-}
\ No newline at end of file
diff --git a/src/nativeMain/kotlin/com/dropbear/physics/Physics.native.kt b/src/nativeMain/kotlin/com/dropbear/physics/Physics.native.kt
new file mode 100644
index 0000000..e8e232f
--- /dev/null
+++ b/src/nativeMain/kotlin/com/dropbear/physics/Physics.native.kt
@@ -0,0 +1,10 @@
+package com.dropbear.physics
+
+import com.dropbear.math.Vector3d
+
+internal actual fun getGravity(): Vector3d {
+    TODO("Not yet implemented")
+}
+
+internal actual fun setGravity(gravity: Vector3d) {
+}
\ No newline at end of file