Skip to content
This repository was archived by the owner on Dec 31, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions bindings_generator/src/special_methods.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,8 @@ unsafe impl GodotObject for {name} {{

impl ToVariant for {name} {{
fn to_variant(&self) -> Variant {{ Variant::from_object(self) }}
}}
impl FromVariant for {name} {{
fn from_variant(variant: &Variant) -> Option<Self> {{ variant.try_to_object::<Self>() }}
}}"#,
name = class.name,
Expand Down
4 changes: 4 additions & 0 deletions gdnative-core/src/byte_array.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::get_api;
use crate::sys;
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;
use crate::VariantArray;

Expand Down Expand Up @@ -110,6 +111,9 @@ impl ToVariant for ByteArray {
fn to_variant(&self) -> Variant {
Variant::from_byte_array(self)
}
}

impl FromVariant for ByteArray {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_byte_array()
}
Expand Down
4 changes: 4 additions & 0 deletions gdnative-core/src/color_array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use crate::get_api;
use crate::sys;
use crate::Color;
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;
use crate::VariantArray;

Expand Down Expand Up @@ -114,6 +115,9 @@ impl ToVariant for ColorArray {
fn to_variant(&self) -> Variant {
Variant::from_color_array(self)
}
}

impl FromVariant for ColorArray {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_color_array()
}
Expand Down
4 changes: 4 additions & 0 deletions gdnative-core/src/dictionary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use crate::get_api;
use crate::sys;
use crate::GodotString;
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;
use crate::VariantArray;
use std::fmt;
Expand Down Expand Up @@ -126,6 +127,9 @@ impl ToVariant for Dictionary {
fn to_variant(&self) -> Variant {
Variant::from_dictionary(self)
}
}

impl FromVariant for Dictionary {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_dictionary()
}
Expand Down
4 changes: 4 additions & 0 deletions gdnative-core/src/float32_array.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::get_api;
use crate::sys;
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;
use crate::VariantArray;

Expand Down Expand Up @@ -110,6 +111,9 @@ impl ToVariant for Float32Array {
fn to_variant(&self) -> Variant {
Variant::from_float32_array(self)
}
}

impl FromVariant for Float32Array {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_float32_array()
}
Expand Down
11 changes: 6 additions & 5 deletions gdnative-core/src/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ use super::*;
use crate::get_api;
use crate::NativeClass;
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;
use libc;
use std::ffi::CString;
Expand Down Expand Up @@ -280,7 +281,7 @@ impl<C: NativeClass> ClassBuilder<C> {

pub fn add_property<T, S, G>(&self, property: Property<T, S, G>)
where
T: ToVariant,
T: ToVariant + FromVariant,
S: PropertySetter<C, T>,
G: PropertyGetter<C, T>,
{
Expand Down Expand Up @@ -482,7 +483,7 @@ pub struct Signal<'l> {
pub args: &'l [SignalArgument<'l>],
}

pub unsafe trait PropertySetter<C: NativeClass, T: ToVariant> {
pub unsafe trait PropertySetter<C: NativeClass, T: FromVariant> {
unsafe fn as_godot_function(self) -> sys::godot_property_set_func;
}

Expand All @@ -508,7 +509,7 @@ extern "C" fn empty_getter(

extern "C" fn empty_free_func(_data: *mut libc::c_void) {}

unsafe impl<C: NativeClass, T: ToVariant> PropertySetter<C, T> for () {
unsafe impl<C: NativeClass, T: FromVariant> PropertySetter<C, T> for () {
unsafe fn as_godot_function(self) -> sys::godot_property_set_func {
let mut set = sys::godot_property_set_func::default();
set.set_func = Some(empty_setter);
Expand All @@ -529,7 +530,7 @@ unsafe impl<C: NativeClass, T: ToVariant> PropertyGetter<C, T> for () {
unsafe impl<F, C, T> PropertySetter<C, T> for F
where
C: NativeClass,
T: ToVariant,
T: FromVariant,
F: Fn(&mut C, T),
{
unsafe fn as_godot_function(self) -> sys::godot_property_set_func {
Expand All @@ -545,7 +546,7 @@ where
val: *mut sys::godot_variant,
) where
C: NativeClass,
T: ToVariant,
T: FromVariant,
F: Fn(&mut C, T),
{
unsafe {
Expand Down
4 changes: 4 additions & 0 deletions gdnative-core/src/int32_array.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::get_api;
use crate::sys;
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;
use crate::VariantArray;

Expand Down Expand Up @@ -110,6 +111,9 @@ impl ToVariant for Int32Array {
fn to_variant(&self) -> Variant {
Variant::from_int32_array(self)
}
}

impl FromVariant for Int32Array {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_int32_array()
}
Expand Down
2 changes: 1 addition & 1 deletion gdnative-core/src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,7 @@ macro_rules! godot_wrap_method {
let mut offset = 0;
$(
let _variant: &$crate::Variant = ::std::mem::transmute(&mut *(*args).offset(offset));
let $pname = if let Some(val) = <$pty as $crate::ToVariant>::from_variant(_variant) {
let $pname = if let Some(val) = <$pty as $crate::FromVariant>::from_variant(_variant) {
val
} else {
godot_error!("Incorrect argument type {:?} for argument {}",
Expand Down
4 changes: 4 additions & 0 deletions gdnative-core/src/node_path.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use crate::get_api;
use crate::sys;
use crate::GodotString;
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;
use std::fmt;

Expand Down Expand Up @@ -148,6 +149,9 @@ impl ToVariant for NodePath {
fn to_variant(&self) -> Variant {
Variant::from_node_path(self)
}
}

impl FromVariant for NodePath {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_node_path()
}
Expand Down
4 changes: 4 additions & 0 deletions gdnative-core/src/string.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::get_api;
use crate::sys;
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;

use std::cmp::Ordering;
Expand Down Expand Up @@ -204,6 +205,9 @@ impl ToVariant for GodotString {
fn to_variant(&self) -> Variant {
Variant::from_godot_string(self)
}
}

impl FromVariant for GodotString {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_godot_string()
}
Expand Down
4 changes: 4 additions & 0 deletions gdnative-core/src/string_array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use crate::get_api;
use crate::sys;
use crate::GodotString;
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;
use crate::VariantArray;

Expand Down Expand Up @@ -111,6 +112,9 @@ impl ToVariant for StringArray {
fn to_variant(&self) -> Variant {
Variant::from_string_array(self)
}
}

impl FromVariant for StringArray {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_string_array()
}
Expand Down
24 changes: 22 additions & 2 deletions gdnative-core/src/variant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -690,17 +690,23 @@ godot_test!(
}
);

/// Types that can be converted to and from a `Variant`.
pub trait ToVariant: Sized {
/// Types that can be converted to a `Variant`.
pub trait ToVariant {
fn to_variant(&self) -> Variant;
}

/// Types that can be converted from a `Variant`.
pub trait FromVariant: Sized {
fn from_variant(variant: &Variant) -> Option<Self>;
}

impl ToVariant for () {
fn to_variant(&self) -> Variant {
Variant::new()
}
}

impl FromVariant for () {
fn from_variant(variant: &Variant) -> Option<Self> {
if variant.get_type() == VariantType::Nil {
Some(())
Expand All @@ -720,7 +726,9 @@ macro_rules! impl_to_variant_for_int {
Variant(ret)
}
}
}

impl FromVariant for $ty {
fn from_variant(variant: &Variant) -> Option<Self> {
unsafe {
let api = get_api();
Expand Down Expand Up @@ -752,7 +760,9 @@ macro_rules! godot_uint_impl {
Variant(ret)
}
}
}

impl FromVariant for $ty {
fn from_variant(variant: &Variant) -> Option<Self> {
unsafe {
let api = get_api();
Expand Down Expand Up @@ -782,7 +792,9 @@ impl ToVariant for f32 {
Variant(ret)
}
}
}

impl FromVariant for f32 {
fn from_variant(variant: &Variant) -> Option<Self> {
unsafe {
let api = get_api();
Expand All @@ -805,7 +817,9 @@ impl ToVariant for f64 {
Variant(ret)
}
}
}

impl FromVariant for f64 {
fn from_variant(variant: &Variant) -> Option<Self> {
unsafe {
let api = get_api();
Expand All @@ -824,7 +838,9 @@ impl ToVariant for String {
fn to_variant(&self) -> Variant {
Variant::from_str(&self)
}
}

impl FromVariant for String {
fn from_variant(variant: &Variant) -> Option<Self> {
unsafe {
let api = get_api();
Expand All @@ -850,7 +866,9 @@ impl ToVariant for bool {
fn to_variant(&self) -> Variant {
Variant::from_bool(*self)
}
}

impl FromVariant for bool {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_bool()
}
Expand All @@ -860,7 +878,9 @@ impl ToVariant for Variant {
fn to_variant(&self) -> Variant {
self.clone()
}
}

impl FromVariant for Variant {
fn from_variant(variant: &Variant) -> Option<Self> {
Some(variant.clone())
}
Expand Down
4 changes: 4 additions & 0 deletions gdnative-core/src/variant_array.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::get_api;
use crate::sys;
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;

/// A reference-counted `Variant` vector. Godot's generic array data type.
Expand Down Expand Up @@ -176,6 +177,9 @@ impl ToVariant for VariantArray {
fn to_variant(&self) -> Variant {
Variant::from_array(self)
}
}

impl FromVariant for VariantArray {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_array()
}
Expand Down
3 changes: 3 additions & 0 deletions gdnative-core/src/vector2.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;
use crate::Vector2;

impl ToVariant for Vector2 {
fn to_variant(&self) -> Variant {
Variant::from_vector2(self)
}
}

impl FromVariant for Vector2 {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_vector2()
}
Expand Down
4 changes: 4 additions & 0 deletions gdnative-core/src/vector2_array.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::get_api;
use crate::sys;
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;
use crate::VariantArray;
use crate::Vector2;
Expand Down Expand Up @@ -114,6 +115,9 @@ impl ToVariant for Vector2Array {
fn to_variant(&self) -> Variant {
Variant::from_vector2_array(self)
}
}

impl FromVariant for Vector2Array {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_vector2_array()
}
Expand Down
3 changes: 3 additions & 0 deletions gdnative-core/src/vector3.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;
use crate::Vector3;

impl ToVariant for Vector3 {
fn to_variant(&self) -> Variant {
Variant::from_vector3(self)
}
}

impl FromVariant for Vector3 {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_vector3()
}
Expand Down
4 changes: 4 additions & 0 deletions gdnative-core/src/vector3_array.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::get_api;
use crate::sys;
use crate::ToVariant;
use crate::FromVariant;
use crate::Variant;
use crate::VariantArray;
use crate::Vector3;
Expand Down Expand Up @@ -114,6 +115,9 @@ impl ToVariant for Vector3Array {
fn to_variant(&self) -> Variant {
Variant::from_vector3_array(self)
}
}

impl FromVariant for Vector3Array {
fn from_variant(variant: &Variant) -> Option<Self> {
variant.try_to_vector3_array()
}
Expand Down