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