2014-02-10 02:10:30 +01:00
/*************************************************************************/
/* variant.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 14:16:55 +02:00
/* https://godotengine.org */
2014-02-10 02:10:30 +01:00
/*************************************************************************/
2021-01-01 20:13:46 +01:00
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
2014-02-10 02:10:30 +01:00
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
2018-01-05 00:50:27 +01:00
2014-02-10 02:10:30 +01:00
# include "variant.h"
2017-01-16 08:04:19 +01:00
2018-09-11 18:13:45 +02:00
# include "core/core_string_names.h"
# include "core/io/marshalls.h"
# include "core/math/math_funcs.h"
2020-04-23 12:40:06 +02:00
# include "core/object_rc.h"
2018-09-11 18:13:45 +02:00
# include "core/print_string.h"
# include "core/resource.h"
# include "core/variant_parser.h"
2014-02-10 02:10:30 +01:00
# include "scene/gui/control.h"
2017-03-05 16:44:50 +01:00
# include "scene/main/node.h"
2014-02-10 02:10:30 +01:00
String Variant : : get_type_name ( Variant : : Type p_type ) {
2017-03-05 16:44:50 +01:00
switch ( p_type ) {
2014-02-10 02:10:30 +01:00
case NIL : {
return " Nil " ;
} break ;
2017-03-05 16:44:50 +01:00
// atomic types
2014-02-10 02:10:30 +01:00
case BOOL : {
return " bool " ;
} break ;
case INT : {
return " int " ;
} break ;
case REAL : {
2014-04-05 23:50:09 +02:00
return " float " ;
2014-02-10 02:10:30 +01:00
} break ;
case STRING : {
return " String " ;
} break ;
2017-11-20 22:41:22 +01:00
// math types
2014-02-10 02:10:30 +01:00
case VECTOR2 : {
return " Vector2 " ;
} break ;
case RECT2 : {
return " Rect2 " ;
} break ;
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
return " Transform2D " ;
2014-02-10 02:10:30 +01:00
} break ;
case VECTOR3 : {
return " Vector3 " ;
} break ;
case PLANE : {
return " Plane " ;
} break ;
2017-03-05 16:44:50 +01:00
/*
2014-02-10 02:10:30 +01:00
case QUAT : {
} break ; */
2017-11-17 03:09:00 +01:00
case AABB : {
return " AABB " ;
2014-02-10 02:10:30 +01:00
} break ;
case QUAT : {
return " Quat " ;
} break ;
2017-01-11 04:52:51 +01:00
case BASIS : {
return " Basis " ;
2014-02-10 02:10:30 +01:00
} break ;
case TRANSFORM : {
return " Transform " ;
} break ;
2017-03-05 16:44:50 +01:00
// misc types
2014-02-10 02:10:30 +01:00
case COLOR : {
return " Color " ;
} break ;
case _RID : {
return " RID " ;
} break ;
case OBJECT : {
return " Object " ;
} break ;
case NODE_PATH : {
return " NodePath " ;
} break ;
case DICTIONARY : {
return " Dictionary " ;
} break ;
case ARRAY : {
return " Array " ;
} break ;
2017-03-05 16:44:50 +01:00
// arrays
2017-01-11 04:52:51 +01:00
case POOL_BYTE_ARRAY : {
return " PoolByteArray " ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_INT_ARRAY : {
return " PoolIntArray " ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_REAL_ARRAY : {
2017-03-13 16:45:27 +01:00
return " PoolRealArray " ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_STRING_ARRAY : {
return " PoolStringArray " ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR2_ARRAY : {
return " PoolVector2Array " ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR3_ARRAY : {
return " PoolVector3Array " ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_COLOR_ARRAY : {
return " PoolColorArray " ;
2014-02-10 02:10:30 +01:00
} break ;
2019-04-09 17:08:36 +02:00
default : {
}
2017-03-05 16:44:50 +01:00
}
2014-02-10 02:10:30 +01:00
return " " ;
}
2017-03-05 16:44:50 +01:00
bool Variant : : can_convert ( Variant : : Type p_type_from , Variant : : Type p_type_to ) {
2021-05-05 12:44:11 +02:00
if ( p_type_from = = p_type_to ) {
2014-02-10 02:10:30 +01:00
return true ;
2021-05-05 12:44:11 +02:00
}
if ( p_type_to = = NIL & & p_type_from ! = NIL ) { //nil can convert to anything
2014-02-10 02:10:30 +01:00
return true ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
if ( p_type_from = = NIL ) {
return ( p_type_to = = OBJECT ) ;
} ;
2021-05-04 16:00:45 +02:00
const Type * valid_types = nullptr ;
const Type * invalid_types = nullptr ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
switch ( p_type_to ) {
2014-02-10 02:10:30 +01:00
case BOOL : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
INT ,
REAL ,
2015-05-04 23:30:57 +02:00
STRING ,
2014-02-10 02:10:30 +01:00
NIL ,
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
case INT : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
BOOL ,
REAL ,
2015-05-04 23:30:57 +02:00
STRING ,
2014-02-10 02:10:30 +01:00
NIL ,
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
case REAL : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
BOOL ,
INT ,
2015-05-04 23:30:57 +02:00
STRING ,
2014-02-10 02:10:30 +01:00
NIL ,
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
case STRING : {
2017-03-05 16:44:50 +01:00
static const Type invalid [ ] = {
2014-02-10 02:10:30 +01:00
OBJECT ,
NIL
} ;
2017-03-05 16:44:50 +01:00
invalid_types = invalid ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
TRANSFORM ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
case QUAT : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2017-01-11 04:52:51 +01:00
BASIS ,
2014-02-10 02:10:30 +01:00
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case BASIS : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
QUAT ,
2017-11-20 09:59:42 +01:00
VECTOR3 ,
2014-02-10 02:10:30 +01:00
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
case TRANSFORM : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2017-01-11 04:52:51 +01:00
TRANSFORM2D ,
2014-02-10 02:10:30 +01:00
QUAT ,
2017-01-11 04:52:51 +01:00
BASIS ,
2014-02-10 02:10:30 +01:00
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
2016-03-09 00:00:52 +01:00
} break ;
2014-04-10 05:18:27 +02:00
2015-05-04 23:30:57 +02:00
case COLOR : {
static const Type valid [ ] = {
2015-05-27 15:56:57 +02:00
STRING ,
INT ,
2015-05-04 23:30:57 +02:00
NIL ,
} ;
valid_types = valid ;
} break ;
case _RID : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
OBJECT ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
case OBJECT : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
case NODE_PATH : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
STRING ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
case ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2017-01-11 04:52:51 +01:00
POOL_BYTE_ARRAY ,
POOL_INT_ARRAY ,
POOL_STRING_ARRAY ,
POOL_REAL_ARRAY ,
POOL_COLOR_ARRAY ,
POOL_VECTOR2_ARRAY ,
POOL_VECTOR3_ARRAY ,
2015-05-04 23:30:57 +02:00
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
2017-03-05 16:44:50 +01:00
// arrays
2017-01-11 04:52:51 +01:00
case POOL_BYTE_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_INT_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_REAL_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_STRING_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR2_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR3_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_COLOR_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
2019-04-09 17:08:36 +02:00
default : {
}
2015-05-04 23:30:57 +02:00
}
if ( valid_types ) {
2017-03-05 16:44:50 +01:00
int i = 0 ;
while ( valid_types [ i ] ! = NIL ) {
2021-05-05 12:44:11 +02:00
if ( p_type_from = = valid_types [ i ] ) {
2015-05-04 23:30:57 +02:00
return true ;
2021-05-05 12:44:11 +02:00
}
2015-05-04 23:30:57 +02:00
i + + ;
}
2016-10-04 12:36:31 +02:00
2015-05-04 23:30:57 +02:00
} else if ( invalid_types ) {
2017-03-05 16:44:50 +01:00
int i = 0 ;
while ( invalid_types [ i ] ! = NIL ) {
2021-05-05 12:44:11 +02:00
if ( p_type_from = = invalid_types [ i ] ) {
2015-05-04 23:30:57 +02:00
return false ;
2021-05-05 12:44:11 +02:00
}
2015-05-04 23:30:57 +02:00
i + + ;
}
2016-10-04 12:36:31 +02:00
return true ;
2015-05-04 23:30:57 +02:00
}
return false ;
}
2017-03-05 16:44:50 +01:00
bool Variant : : can_convert_strict ( Variant : : Type p_type_from , Variant : : Type p_type_to ) {
2021-05-05 12:44:11 +02:00
if ( p_type_from = = p_type_to ) {
2015-05-04 23:30:57 +02:00
return true ;
2021-05-05 12:44:11 +02:00
}
if ( p_type_to = = NIL & & p_type_from ! = NIL ) { //nil can convert to anything
2015-05-04 23:30:57 +02:00
return true ;
2021-05-05 12:44:11 +02:00
}
2015-05-04 23:30:57 +02:00
if ( p_type_from = = NIL ) {
return ( p_type_to = = OBJECT ) ;
} ;
2021-05-04 16:00:45 +02:00
const Type * valid_types = nullptr ;
2015-05-04 23:30:57 +02:00
2017-03-05 16:44:50 +01:00
switch ( p_type_to ) {
2015-05-04 23:30:57 +02:00
case BOOL : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-05 14:53:37 +02:00
INT ,
REAL ,
2015-05-04 23:30:57 +02:00
//STRING,
NIL ,
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
case INT : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-05 14:53:37 +02:00
BOOL ,
2015-05-04 23:30:57 +02:00
REAL ,
//STRING,
NIL ,
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
case REAL : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-05 14:53:37 +02:00
BOOL ,
2015-05-04 23:30:57 +02:00
INT ,
//STRING,
NIL ,
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
case STRING : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
NODE_PATH ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
TRANSFORM ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
case QUAT : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2017-01-11 04:52:51 +01:00
BASIS ,
2015-05-04 23:30:57 +02:00
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
2017-01-11 04:52:51 +01:00
case BASIS : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2015-05-04 23:30:57 +02:00
QUAT ,
2017-11-20 22:41:22 +01:00
VECTOR3 ,
2015-05-04 23:30:57 +02:00
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
case TRANSFORM : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2017-01-11 04:52:51 +01:00
TRANSFORM2D ,
2015-05-04 23:30:57 +02:00
QUAT ,
2017-01-11 04:52:51 +01:00
BASIS ,
2015-05-04 23:30:57 +02:00
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2015-05-04 23:30:57 +02:00
} break ;
2014-04-10 05:18:27 +02:00
case COLOR : {
static const Type valid [ ] = {
STRING ,
INT ,
NIL ,
} ;
valid_types = valid ;
} break ;
2014-02-10 02:10:30 +01:00
case _RID : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
OBJECT ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
case OBJECT : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
case NODE_PATH : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
STRING ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
case ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2017-01-11 04:52:51 +01:00
POOL_BYTE_ARRAY ,
POOL_INT_ARRAY ,
POOL_STRING_ARRAY ,
POOL_REAL_ARRAY ,
POOL_COLOR_ARRAY ,
POOL_VECTOR2_ARRAY ,
POOL_VECTOR3_ARRAY ,
2014-02-10 02:10:30 +01:00
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
2017-03-05 16:44:50 +01:00
// arrays
2017-01-11 04:52:51 +01:00
case POOL_BYTE_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_INT_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_REAL_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_STRING_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR2_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR3_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_COLOR_ARRAY : {
2017-03-05 16:44:50 +01:00
static const Type valid [ ] = {
2014-02-10 02:10:30 +01:00
ARRAY ,
NIL
} ;
2017-03-05 16:44:50 +01:00
valid_types = valid ;
2014-02-10 02:10:30 +01:00
} break ;
2019-04-09 17:08:36 +02:00
default : {
}
2014-02-10 02:10:30 +01:00
}
if ( valid_types ) {
2017-03-05 16:44:50 +01:00
int i = 0 ;
while ( valid_types [ i ] ! = NIL ) {
2021-05-05 12:44:11 +02:00
if ( p_type_from = = valid_types [ i ] ) {
2014-02-10 02:10:30 +01:00
return true ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
i + + ;
}
}
return false ;
}
2020-10-07 19:23:06 +02:00
bool Variant : : deep_equal ( const Variant & p_variant , int p_recursion_count ) const {
ERR_FAIL_COND_V_MSG ( p_recursion_count > MAX_RECURSION , true , " Max recursion reached " ) ;
// Containers must be handled with recursivity checks
switch ( type ) {
case Variant : : Type : : DICTIONARY : {
if ( p_variant . type ! = Variant : : Type : : DICTIONARY ) {
return false ;
}
const Dictionary v1_as_d = Dictionary ( * this ) ;
const Dictionary v2_as_d = Dictionary ( p_variant ) ;
return v1_as_d . deep_equal ( v2_as_d , p_recursion_count + 1 ) ;
} break ;
case Variant : : Type : : ARRAY : {
if ( p_variant . type ! = Variant : : Type : : ARRAY ) {
return false ;
}
const Array v1_as_a = Array ( * this ) ;
const Array v2_as_a = Array ( p_variant ) ;
return v1_as_a . deep_equal ( v2_as_a , p_recursion_count + 1 ) ;
} break ;
default : {
return * this = = p_variant ;
} break ;
}
}
2017-03-05 16:44:50 +01:00
bool Variant : : operator = = ( const Variant & p_variant ) const {
2021-05-05 12:44:11 +02:00
if ( type ! = p_variant . type ) { //evaluation of operator== needs to be more strict
2014-02-10 02:10:30 +01:00
return false ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
bool v ;
Variant r ;
2017-03-05 16:44:50 +01:00
evaluate ( OP_EQUAL , * this , p_variant , r , v ) ;
2014-02-10 02:10:30 +01:00
return r ;
}
2017-03-05 16:44:50 +01:00
bool Variant : : operator ! = ( const Variant & p_variant ) const {
2021-05-05 12:44:11 +02:00
if ( type ! = p_variant . type ) { //evaluation of operator== needs to be more strict
2016-01-03 00:17:31 +01:00
return true ;
2021-05-05 12:44:11 +02:00
}
2016-01-03 00:17:31 +01:00
bool v ;
Variant r ;
2017-03-05 16:44:50 +01:00
evaluate ( OP_NOT_EQUAL , * this , p_variant , r , v ) ;
2016-01-03 00:17:31 +01:00
return r ;
}
2017-03-05 16:44:50 +01:00
bool Variant : : operator < ( const Variant & p_variant ) const {
2021-05-05 12:44:11 +02:00
if ( type ! = p_variant . type ) { //if types differ, then order by type first
2017-03-05 16:44:50 +01:00
return type < p_variant . type ;
2021-05-05 12:44:11 +02:00
}
2015-05-01 02:53:41 +02:00
bool v ;
Variant r ;
2017-03-05 16:44:50 +01:00
evaluate ( OP_LESS , * this , p_variant , r , v ) ;
2015-05-01 02:53:41 +02:00
return r ;
}
2014-02-10 02:10:30 +01:00
bool Variant : : is_zero ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2014-02-10 02:10:30 +01:00
case NIL : {
return true ;
} break ;
// atomic types
case BOOL : {
2019-06-26 15:08:25 +02:00
return ! ( _data . _bool ) ;
2014-02-10 02:10:30 +01:00
} break ;
case INT : {
2017-03-05 16:44:50 +01:00
return _data . _int = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
case REAL : {
2017-03-05 16:44:50 +01:00
return _data . _real = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
case STRING : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const String * > ( _data . _mem ) = = String ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-11-20 22:41:22 +01:00
// math types
2014-02-10 02:10:30 +01:00
case VECTOR2 : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Vector2 * > ( _data . _mem ) = = Vector2 ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case RECT2 : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Rect2 * > ( _data . _mem ) = = Rect2 ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
2017-03-05 16:44:50 +01:00
return * _data . _transform2d = = Transform2D ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case VECTOR3 : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Vector3 * > ( _data . _mem ) = = Vector3 ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case PLANE : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Plane * > ( _data . _mem ) = = Plane ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-03-05 16:44:50 +01:00
/*
2014-02-10 02:10:30 +01:00
case QUAT : {
} break ; */
2017-11-17 03:09:00 +01:00
case AABB : {
return * _data . _aabb = = : : AABB ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case QUAT : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Quat * > ( _data . _mem ) = = Quat ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case BASIS : {
2017-03-05 16:44:50 +01:00
return * _data . _basis = = Basis ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case TRANSFORM : {
return * _data . _transform = = Transform ( ) ;
} break ;
// misc types
case COLOR : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Color * > ( _data . _mem ) = = Color ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case _RID : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const RID * > ( _data . _mem ) = = RID ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case OBJECT : {
2021-05-04 16:00:45 +02:00
return _UNSAFE_OBJ_PROXY_PTR ( * this ) = = nullptr ;
2014-02-10 02:10:30 +01:00
} break ;
case NODE_PATH : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const NodePath * > ( _data . _mem ) - > is_empty ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case DICTIONARY : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const Dictionary * > ( _data . _mem ) - > empty ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case ARRAY : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const Array * > ( _data . _mem ) - > empty ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
// arrays
2017-01-11 04:52:51 +01:00
case POOL_BYTE_ARRAY : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const PoolVector < uint8_t > * > ( _data . _mem ) - > size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_INT_ARRAY : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const PoolVector < int > * > ( _data . _mem ) - > size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_REAL_ARRAY : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const PoolVector < real_t > * > ( _data . _mem ) - > size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_STRING_ARRAY : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const PoolVector < String > * > ( _data . _mem ) - > size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR2_ARRAY : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const PoolVector < Vector2 > * > ( _data . _mem ) - > size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR3_ARRAY : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const PoolVector < Vector3 > * > ( _data . _mem ) - > size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_COLOR_ARRAY : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const PoolVector < Color > * > ( _data . _mem ) - > size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2019-04-09 17:08:36 +02:00
default : {
}
2014-02-10 02:10:30 +01:00
}
return false ;
}
2015-06-29 05:29:49 +02:00
bool Variant : : is_one ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2015-06-29 05:29:49 +02:00
case NIL : {
return true ;
} break ;
// atomic types
case BOOL : {
2018-10-03 19:40:37 +02:00
return _data . _bool ;
2015-06-29 05:29:49 +02:00
} break ;
case INT : {
2017-03-05 16:44:50 +01:00
return _data . _int = = 1 ;
2015-06-29 05:29:49 +02:00
} break ;
case REAL : {
2017-03-05 16:44:50 +01:00
return _data . _real = = 1 ;
2015-06-29 05:29:49 +02:00
} break ;
case VECTOR2 : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Vector2 * > ( _data . _mem ) = = Vector2 ( 1 , 1 ) ;
2015-06-29 05:29:49 +02:00
} break ;
case RECT2 : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Rect2 * > ( _data . _mem ) = = Rect2 ( 1 , 1 , 1 , 1 ) ;
2015-06-29 05:29:49 +02:00
} break ;
case VECTOR3 : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Vector3 * > ( _data . _mem ) = = Vector3 ( 1 , 1 , 1 ) ;
2015-06-29 05:29:49 +02:00
} break ;
case PLANE : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Plane * > ( _data . _mem ) = = Plane ( 1 , 1 , 1 , 1 ) ;
2015-06-29 05:29:49 +02:00
} break ;
case COLOR : {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Color * > ( _data . _mem ) = = Color ( 1 , 1 , 1 , 1 ) ;
2015-06-29 05:29:49 +02:00
} break ;
2019-04-09 17:08:36 +02:00
default : {
return ! is_zero ( ) ;
}
2015-06-29 05:29:49 +02:00
}
return false ;
}
2021-07-31 11:54:41 +02:00
ObjectID Variant : : get_object_instance_id ( ) const {
2021-09-24 17:31:17 +02:00
if ( unlikely ( type ! = OBJECT ) ) {
2021-07-31 11:54:41 +02:00
return 0 ;
2021-09-24 17:31:17 +02:00
} else if ( likely ( _get_obj ( ) . rc ) ) {
2021-07-31 11:54:41 +02:00
return _get_obj ( ) . rc - > instance_id ;
2021-09-24 17:31:17 +02:00
} else if ( likely ( ! _get_obj ( ) . ref . is_null ( ) ) ) {
return _REF_OBJ_PTR ( * this ) - > get_instance_id ( ) ;
2021-07-31 11:54:41 +02:00
} else {
2021-09-24 17:31:17 +02:00
return 0 ;
2021-07-31 11:54:41 +02:00
}
}
2021-09-21 10:30:34 +02:00
bool Variant : : is_invalid_object ( ) const {
return type = = OBJECT & & _get_obj ( ) . rc & & ! _get_obj ( ) . rc - > get_ptr ( ) ;
}
2017-03-05 16:44:50 +01:00
void Variant : : reference ( const Variant & p_variant ) {
2019-09-09 11:39:40 +02:00
switch ( type ) {
case NIL :
case BOOL :
case INT :
case REAL :
break ;
default :
clear ( ) ;
}
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
type = p_variant . type ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
switch ( p_variant . type ) {
2014-02-10 02:10:30 +01:00
case NIL : {
// none
} break ;
2016-03-09 00:00:52 +01:00
// atomic types
2014-02-10 02:10:30 +01:00
case BOOL : {
2017-03-05 16:44:50 +01:00
_data . _bool = p_variant . _data . _bool ;
2014-02-10 02:10:30 +01:00
} break ;
case INT : {
2017-03-05 16:44:50 +01:00
_data . _int = p_variant . _data . _int ;
2014-02-10 02:10:30 +01:00
} break ;
case REAL : {
2017-03-05 16:44:50 +01:00
_data . _real = p_variant . _data . _real ;
2014-02-10 02:10:30 +01:00
} break ;
case STRING : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , String ( * reinterpret_cast < const String * > ( p_variant . _data . _mem ) ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
2016-03-09 00:00:52 +01:00
2017-11-20 22:41:22 +01:00
// math types
2014-02-10 02:10:30 +01:00
case VECTOR2 : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , Vector2 ( * reinterpret_cast < const Vector2 * > ( p_variant . _data . _mem ) ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
case RECT2 : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , Rect2 ( * reinterpret_cast < const Rect2 * > ( p_variant . _data . _mem ) ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
2017-03-05 16:44:50 +01:00
_data . _transform2d = memnew ( Transform2D ( * p_variant . _data . _transform2d ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
case VECTOR3 : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , Vector3 ( * reinterpret_cast < const Vector3 * > ( p_variant . _data . _mem ) ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
case PLANE : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , Plane ( * reinterpret_cast < const Plane * > ( p_variant . _data . _mem ) ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
2016-03-09 00:00:52 +01:00
2017-11-17 03:09:00 +01:00
case AABB : {
_data . _aabb = memnew ( : : AABB ( * p_variant . _data . _aabb ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
case QUAT : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , Quat ( * reinterpret_cast < const Quat * > ( p_variant . _data . _mem ) ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case BASIS : {
2017-03-05 16:44:50 +01:00
_data . _basis = memnew ( Basis ( * p_variant . _data . _basis ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
case TRANSFORM : {
2017-03-05 16:44:50 +01:00
_data . _transform = memnew ( Transform ( * p_variant . _data . _transform ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
2016-03-09 00:00:52 +01:00
// misc types
2014-02-10 02:10:30 +01:00
case COLOR : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , Color ( * reinterpret_cast < const Color * > ( p_variant . _data . _mem ) ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
case _RID : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , RID ( * reinterpret_cast < const RID * > ( p_variant . _data . _mem ) ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
case OBJECT : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , ObjData ( p_variant . _get_obj ( ) ) ) ;
2021-09-21 10:30:34 +02:00
if ( likely ( _get_obj ( ) . rc ) ) {
2020-04-23 12:40:06 +02:00
_get_obj ( ) . rc - > increment ( ) ;
}
2014-02-10 02:10:30 +01:00
} break ;
case NODE_PATH : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , NodePath ( * reinterpret_cast < const NodePath * > ( p_variant . _data . _mem ) ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
case DICTIONARY : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , Dictionary ( * reinterpret_cast < const Dictionary * > ( p_variant . _data . _mem ) ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
case ARRAY : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , Array ( * reinterpret_cast < const Array * > ( p_variant . _data . _mem ) ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
// arrays
2017-01-11 04:52:51 +01:00
case POOL_BYTE_ARRAY : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , PoolVector < uint8_t > ( * reinterpret_cast < const PoolVector < uint8_t > * > ( p_variant . _data . _mem ) ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_INT_ARRAY : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , PoolVector < int > ( * reinterpret_cast < const PoolVector < int > * > ( p_variant . _data . _mem ) ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_REAL_ARRAY : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , PoolVector < real_t > ( * reinterpret_cast < const PoolVector < real_t > * > ( p_variant . _data . _mem ) ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_STRING_ARRAY : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , PoolVector < String > ( * reinterpret_cast < const PoolVector < String > * > ( p_variant . _data . _mem ) ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR2_ARRAY : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , PoolVector < Vector2 > ( * reinterpret_cast < const PoolVector < Vector2 > * > ( p_variant . _data . _mem ) ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR3_ARRAY : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , PoolVector < Vector3 > ( * reinterpret_cast < const PoolVector < Vector3 > * > ( p_variant . _data . _mem ) ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_COLOR_ARRAY : {
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , PoolVector < Color > ( * reinterpret_cast < const PoolVector < Color > * > ( p_variant . _data . _mem ) ) ) ;
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2019-04-09 17:08:36 +02:00
default : {
}
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
2017-09-19 01:46:48 +02:00
2016-02-18 04:34:49 +01:00
void Variant : : zero ( ) {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
break ;
case BOOL :
this - > _data . _bool = false ;
break ;
case INT :
this - > _data . _int = 0 ;
break ;
case REAL :
this - > _data . _real = 0 ;
break ;
case VECTOR2 :
* reinterpret_cast < Vector2 * > ( this - > _data . _mem ) = Vector2 ( ) ;
break ;
case RECT2 :
* reinterpret_cast < Rect2 * > ( this - > _data . _mem ) = Rect2 ( ) ;
break ;
case VECTOR3 :
* reinterpret_cast < Vector3 * > ( this - > _data . _mem ) = Vector3 ( ) ;
break ;
case PLANE :
* reinterpret_cast < Plane * > ( this - > _data . _mem ) = Plane ( ) ;
break ;
case QUAT :
* reinterpret_cast < Quat * > ( this - > _data . _mem ) = Quat ( ) ;
break ;
case COLOR :
* reinterpret_cast < Color * > ( this - > _data . _mem ) = Color ( ) ;
break ;
default :
this - > clear ( ) ;
break ;
2016-02-18 04:34:49 +01:00
}
}
2017-09-19 01:46:48 +02:00
2014-02-10 02:10:30 +01:00
void Variant : : clear ( ) {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2014-02-10 02:10:30 +01:00
case STRING : {
2017-03-05 16:44:50 +01:00
reinterpret_cast < String * > ( _data . _mem ) - > ~ String ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-03-05 16:44:50 +01:00
/*
2014-02-10 02:10:30 +01:00
// no point, they don't allocate memory
VECTOR3 ,
PLANE ,
QUAT ,
COLOR ,
VECTOR2 ,
RECT2
*/
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
2017-03-05 16:44:50 +01:00
memdelete ( _data . _transform2d ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-11-17 03:09:00 +01:00
case AABB : {
memdelete ( _data . _aabb ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case BASIS : {
2017-03-05 16:44:50 +01:00
memdelete ( _data . _basis ) ;
2014-02-10 02:10:30 +01:00
} break ;
case TRANSFORM : {
2017-03-05 16:44:50 +01:00
memdelete ( _data . _transform ) ;
2014-02-10 02:10:30 +01:00
} break ;
2016-03-09 00:00:52 +01:00
// misc types
2014-02-10 02:10:30 +01:00
case NODE_PATH : {
2017-03-05 16:44:50 +01:00
reinterpret_cast < NodePath * > ( _data . _mem ) - > ~ NodePath ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case OBJECT : {
2020-06-28 01:27:03 +02:00
if ( likely ( _get_obj ( ) . rc ) ) {
if ( unlikely ( _get_obj ( ) . rc - > decrement ( ) ) ) {
memdelete ( _get_obj ( ) . rc ) ;
2020-04-23 12:40:06 +02:00
}
} else {
_get_obj ( ) . ref . unref ( ) ;
}
2014-02-10 02:10:30 +01:00
} break ;
case _RID : {
// not much need probably
2017-03-05 16:44:50 +01:00
reinterpret_cast < RID * > ( _data . _mem ) - > ~ RID ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case DICTIONARY : {
2017-03-05 16:44:50 +01:00
reinterpret_cast < Dictionary * > ( _data . _mem ) - > ~ Dictionary ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case ARRAY : {
2017-03-05 16:44:50 +01:00
reinterpret_cast < Array * > ( _data . _mem ) - > ~ Array ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
// arrays
2017-01-11 04:52:51 +01:00
case POOL_BYTE_ARRAY : {
2017-03-05 16:44:50 +01:00
reinterpret_cast < PoolVector < uint8_t > * > ( _data . _mem ) - > ~ PoolVector < uint8_t > ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_INT_ARRAY : {
2017-03-05 16:44:50 +01:00
reinterpret_cast < PoolVector < int > * > ( _data . _mem ) - > ~ PoolVector < int > ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_REAL_ARRAY : {
2017-03-05 16:44:50 +01:00
reinterpret_cast < PoolVector < real_t > * > ( _data . _mem ) - > ~ PoolVector < real_t > ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_STRING_ARRAY : {
2017-03-05 16:44:50 +01:00
reinterpret_cast < PoolVector < String > * > ( _data . _mem ) - > ~ PoolVector < String > ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR2_ARRAY : {
2017-03-05 16:44:50 +01:00
reinterpret_cast < PoolVector < Vector2 > * > ( _data . _mem ) - > ~ PoolVector < Vector2 > ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR3_ARRAY : {
2017-03-05 16:44:50 +01:00
reinterpret_cast < PoolVector < Vector3 > * > ( _data . _mem ) - > ~ PoolVector < Vector3 > ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_COLOR_ARRAY : {
2017-03-05 16:44:50 +01:00
reinterpret_cast < PoolVector < Color > * > ( _data . _mem ) - > ~ PoolVector < Color > ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2019-04-09 17:08:36 +02:00
default : {
} /* not needed */
2014-02-10 02:10:30 +01:00
}
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
type = NIL ;
2014-02-10 02:10:30 +01:00
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
Variant : : operator signed int ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return 0 ;
case BOOL :
return _data . _bool ? 1 : 0 ;
case INT :
return _data . _int ;
case REAL :
return _data . _real ;
case STRING :
return operator String ( ) . to_int ( ) ;
2014-02-10 02:10:30 +01:00
default : {
return 0 ;
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
}
Variant : : operator unsigned int ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return 0 ;
case BOOL :
return _data . _bool ? 1 : 0 ;
case INT :
return _data . _int ;
case REAL :
return _data . _real ;
case STRING :
return operator String ( ) . to_int ( ) ;
2014-02-10 02:10:30 +01:00
default : {
return 0 ;
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
}
Variant : : operator int64_t ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return 0 ;
case BOOL :
return _data . _bool ? 1 : 0 ;
case INT :
return _data . _int ;
case REAL :
return _data . _real ;
case STRING :
return operator String ( ) . to_int64 ( ) ;
2014-02-10 02:10:30 +01:00
default : {
return 0 ;
}
}
}
/*
Variant : : operator long unsigned int ( ) const {
switch ( type ) {
case NIL : return 0 ;
case BOOL : return _data . _bool ? 1 : 0 ;
case INT : return _data . _int ;
case REAL : return _data . _real ;
case STRING : return operator String ( ) . to_int ( ) ;
default : {
return 0 ;
}
}
return 0 ;
} ;
*/
Variant : : operator uint64_t ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return 0 ;
case BOOL :
return _data . _bool ? 1 : 0 ;
case INT :
return _data . _int ;
case REAL :
return _data . _real ;
case STRING :
return operator String ( ) . to_int ( ) ;
2014-02-10 02:10:30 +01:00
default : {
return 0 ;
}
}
}
# ifdef NEED_LONG_INT
Variant : : operator signed long ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return 0 ;
case BOOL :
return _data . _bool ? 1 : 0 ;
case INT :
return _data . _int ;
case REAL :
return _data . _real ;
case STRING :
return operator String ( ) . to_int ( ) ;
2014-02-10 02:10:30 +01:00
default : {
return 0 ;
}
}
return 0 ;
} ;
Variant : : operator unsigned long ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return 0 ;
case BOOL :
return _data . _bool ? 1 : 0 ;
case INT :
return _data . _int ;
case REAL :
return _data . _real ;
case STRING :
return operator String ( ) . to_int ( ) ;
2014-02-10 02:10:30 +01:00
default : {
return 0 ;
}
}
return 0 ;
} ;
# endif
Variant : : operator signed short ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return 0 ;
case BOOL :
return _data . _bool ? 1 : 0 ;
case INT :
return _data . _int ;
case REAL :
return _data . _real ;
case STRING :
return operator String ( ) . to_int ( ) ;
2014-02-10 02:10:30 +01:00
default : {
return 0 ;
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
}
Variant : : operator unsigned short ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return 0 ;
case BOOL :
return _data . _bool ? 1 : 0 ;
case INT :
return _data . _int ;
case REAL :
return _data . _real ;
case STRING :
return operator String ( ) . to_int ( ) ;
2014-02-10 02:10:30 +01:00
default : {
return 0 ;
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
}
Variant : : operator signed char ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return 0 ;
case BOOL :
return _data . _bool ? 1 : 0 ;
case INT :
return _data . _int ;
case REAL :
return _data . _real ;
case STRING :
return operator String ( ) . to_int ( ) ;
2014-02-10 02:10:30 +01:00
default : {
return 0 ;
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
}
Variant : : operator unsigned char ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return 0 ;
case BOOL :
return _data . _bool ? 1 : 0 ;
case INT :
return _data . _int ;
case REAL :
return _data . _real ;
case STRING :
return operator String ( ) . to_int ( ) ;
2014-02-10 02:10:30 +01:00
default : {
return 0 ;
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
}
2016-06-19 00:05:23 +02:00
2014-02-10 02:10:30 +01:00
Variant : : operator CharType ( ) const {
return operator unsigned int ( ) ;
}
2016-06-19 00:05:23 +02:00
2014-02-10 02:10:30 +01:00
Variant : : operator float ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return 0 ;
case BOOL :
return _data . _bool ? 1.0 : 0.0 ;
case INT :
return ( float ) _data . _int ;
case REAL :
return _data . _real ;
case STRING :
return operator String ( ) . to_double ( ) ;
2014-02-10 02:10:30 +01:00
default : {
return 0 ;
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
}
Variant : : operator double ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return 0 ;
case BOOL :
return _data . _bool ? 1.0 : 0.0 ;
case INT :
return ( double ) _data . _int ;
case REAL :
return _data . _real ;
case STRING :
return operator String ( ) . to_double ( ) ;
2014-02-10 02:10:30 +01:00
default : {
return 0 ;
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
}
Variant : : operator StringName ( ) const {
2017-03-05 16:44:50 +01:00
if ( type = = NODE_PATH ) {
return reinterpret_cast < const NodePath * > ( _data . _mem ) - > get_sname ( ) ;
2014-02-10 02:10:30 +01:00
}
return StringName ( operator String ( ) ) ;
}
struct _VariantStrPair {
String key ;
String value ;
2017-03-05 16:44:50 +01:00
bool operator < ( const _VariantStrPair & p ) const {
2014-02-10 02:10:30 +01:00
return key < p . key ;
}
} ;
Variant : : operator String ( ) const {
2019-04-20 01:57:29 +02:00
List < const void * > stack ;
2014-02-10 02:10:30 +01:00
2019-04-20 01:57:29 +02:00
return stringify ( stack ) ;
}
2021-10-11 00:55:52 +02:00
template < class T >
String stringify_vector ( const T & vec , List < const void * > & stack ) {
String str ( " [ " ) ;
for ( int i = 0 ; i < vec . size ( ) ; i + + ) {
if ( i > 0 ) {
str + = " , " ;
}
str = str + Variant ( vec [ i ] ) . stringify ( stack ) ;
}
str + = " ] " ;
return str ;
}
2019-04-20 01:57:29 +02:00
String Variant : : stringify ( List < const void * > & stack ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case NIL :
return " Null " ;
case BOOL :
return _data . _bool ? " True " : " False " ;
case INT :
return itos ( _data . _int ) ;
case REAL :
return rtos ( _data . _real ) ;
case STRING :
return * reinterpret_cast < const String * > ( _data . _mem ) ;
case VECTOR2 :
return " ( " + operator Vector2 ( ) + " ) " ;
case RECT2 :
return " ( " + operator Rect2 ( ) + " ) " ;
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
Transform2D mat32 = operator Transform2D ( ) ;
2017-03-05 16:44:50 +01:00
return " ( " + Variant ( mat32 . elements [ 0 ] ) . operator String ( ) + " , " + Variant ( mat32 . elements [ 1 ] ) . operator String ( ) + " , " + Variant ( mat32 . elements [ 2 ] ) . operator String ( ) + " ) " ;
2016-07-28 14:41:15 +02:00
} break ;
2021-05-04 14:35:44 +02:00
case VECTOR3 :
return " ( " + operator Vector3 ( ) + " ) " ;
2017-03-05 16:44:50 +01:00
case PLANE :
return operator Plane ( ) ;
2016-03-09 00:00:52 +01:00
//case QUAT:
2021-05-04 14:35:44 +02:00
case AABB :
return operator : : AABB ( ) ;
case QUAT :
return " ( " + operator Quat ( ) + " ) " ;
2017-01-11 04:52:51 +01:00
case BASIS : {
Basis mat3 = operator Basis ( ) ;
2016-07-28 14:41:15 +02:00
String mtx ( " ( " ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < 3 ; i + + ) {
2021-05-05 12:44:11 +02:00
if ( i ! = 0 ) {
2017-03-05 16:44:50 +01:00
mtx + = " , " ;
2021-05-05 12:44:11 +02:00
}
2016-07-28 14:41:15 +02:00
2017-03-05 16:44:50 +01:00
mtx + = " ( " ;
2016-07-28 14:41:15 +02:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < 3 ; j + + ) {
2021-05-05 12:44:11 +02:00
if ( j ! = 0 ) {
2017-03-05 16:44:50 +01:00
mtx + = " , " ;
2021-05-05 12:44:11 +02:00
}
2016-07-28 14:41:15 +02:00
2017-03-05 16:44:50 +01:00
mtx + = Variant ( mat3 . elements [ i ] [ j ] ) . operator String ( ) ;
2016-07-28 14:41:15 +02:00
}
2017-03-05 16:44:50 +01:00
mtx + = " ) " ;
2016-07-28 14:41:15 +02:00
}
2017-03-05 16:44:50 +01:00
return mtx + " ) " ;
2016-07-28 14:41:15 +02:00
} break ;
2021-05-04 14:35:44 +02:00
case TRANSFORM :
return operator Transform ( ) ;
case NODE_PATH :
return operator NodePath ( ) ;
case COLOR :
return String : : num ( operator Color ( ) . r ) + " , " + String : : num ( operator Color ( ) . g ) + " , " + String : : num ( operator Color ( ) . b ) + " , " + String : : num ( operator Color ( ) . a ) ;
2014-02-10 02:10:30 +01:00
case DICTIONARY : {
2017-03-05 16:44:50 +01:00
const Dictionary & d = * reinterpret_cast < const Dictionary * > ( _data . _mem ) ;
2019-04-20 01:57:29 +02:00
if ( stack . find ( d . id ( ) ) ) {
return " {...} " ;
}
stack . push_back ( d . id ( ) ) ;
2014-02-10 02:10:30 +01:00
//const String *K=NULL;
2018-08-09 21:44:41 +02:00
String str ( " { " ) ;
2014-02-10 02:10:30 +01:00
List < Variant > keys ;
d . get_key_list ( & keys ) ;
Vector < _VariantStrPair > pairs ;
2017-03-05 16:44:50 +01:00
for ( List < Variant > : : Element * E = keys . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-10 02:10:30 +01:00
_VariantStrPair sp ;
2019-04-20 01:57:29 +02:00
sp . key = E - > get ( ) . stringify ( stack ) ;
sp . value = d [ E - > get ( ) ] . stringify ( stack ) ;
2014-02-10 02:10:30 +01:00
pairs . push_back ( sp ) ;
}
pairs . sort ( ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < pairs . size ( ) ; i + + ) {
2021-05-05 12:44:11 +02:00
if ( i > 0 ) {
2017-03-05 16:44:50 +01:00
str + = " , " ;
2021-05-05 12:44:11 +02:00
}
2018-08-09 21:44:41 +02:00
str + = pairs [ i ] . key + " : " + pairs [ i ] . value ;
2014-02-10 02:10:30 +01:00
}
2018-08-09 21:44:41 +02:00
str + = " } " ;
2016-03-09 00:00:52 +01:00
2021-05-26 16:29:32 +02:00
stack . erase ( d . id ( ) ) ;
2014-02-10 02:10:30 +01:00
return str ;
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR2_ARRAY : {
2021-10-11 00:55:52 +02:00
return stringify_vector ( operator PoolVector < Vector2 > ( ) , stack ) ;
2016-05-04 15:04:12 +02:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR3_ARRAY : {
2021-10-11 00:55:52 +02:00
return stringify_vector ( operator PoolVector < Vector3 > ( ) , stack ) ;
} break ;
case POOL_COLOR_ARRAY : {
return stringify_vector ( operator PoolVector < Color > ( ) , stack ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_STRING_ARRAY : {
2021-10-11 00:55:52 +02:00
return stringify_vector ( operator PoolVector < String > ( ) , stack ) ;
} break ;
case POOL_BYTE_ARRAY : {
return stringify_vector ( operator PoolVector < uint8_t > ( ) , stack ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_INT_ARRAY : {
2021-10-11 00:55:52 +02:00
return stringify_vector ( operator PoolVector < int > ( ) , stack ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_REAL_ARRAY : {
2021-10-11 00:55:52 +02:00
return stringify_vector ( operator PoolVector < real_t > ( ) , stack ) ;
2014-02-10 02:10:30 +01:00
} break ;
case ARRAY : {
Array arr = operator Array ( ) ;
2019-04-20 01:57:29 +02:00
if ( stack . find ( arr . id ( ) ) ) {
return " [...] " ;
}
stack . push_back ( arr . id ( ) ) ;
2021-10-11 00:55:52 +02:00
String str = stringify_vector ( arr , stack ) ;
2021-05-26 16:29:32 +02:00
stack . erase ( arr . id ( ) ) ;
2014-02-10 02:10:30 +01:00
return str ;
} break ;
case OBJECT : {
2020-04-23 12:40:06 +02:00
Object * obj = _OBJ_PTR ( * this ) ;
2021-09-21 10:30:34 +02:00
if ( likely ( obj ) ) {
2020-04-23 12:40:06 +02:00
return obj - > to_string ( ) ;
} else {
2021-09-21 10:30:34 +02:00
if ( _get_obj ( ) . rc ) {
2020-04-23 12:40:06 +02:00
return " [Deleted Object] " ;
}
2014-02-10 02:10:30 +01:00
return " [Object:null] " ;
2020-04-23 12:40:06 +02:00
}
2014-02-10 02:10:30 +01:00
} break ;
default : {
2017-03-05 16:44:50 +01:00
return " [ " + get_type_name ( type ) + " ] " ;
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
return " " ;
}
Variant : : operator Vector2 ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = VECTOR2 ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Vector2 * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else if ( type = = VECTOR3 ) {
2017-03-05 16:44:50 +01:00
return Vector2 ( reinterpret_cast < const Vector3 * > ( _data . _mem ) - > x , reinterpret_cast < const Vector3 * > ( _data . _mem ) - > y ) ;
2021-05-05 12:44:11 +02:00
} else {
2014-02-10 02:10:30 +01:00
return Vector2 ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
Variant : : operator Rect2 ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = RECT2 ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Rect2 * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else {
2014-02-10 02:10:30 +01:00
return Rect2 ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
Variant : : operator Vector3 ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = VECTOR3 ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Vector3 * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else if ( type = = VECTOR2 ) {
2018-02-21 13:38:21 +01:00
return Vector3 ( reinterpret_cast < const Vector2 * > ( _data . _mem ) - > x , reinterpret_cast < const Vector2 * > ( _data . _mem ) - > y , 0.0 ) ;
2021-05-05 12:44:11 +02:00
} else {
2014-02-10 02:10:30 +01:00
return Vector3 ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
Variant : : operator Plane ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = PLANE ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Plane * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else {
2014-02-10 02:10:30 +01:00
return Plane ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-11-17 03:09:00 +01:00
Variant : : operator : : AABB ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = AABB ) {
2017-11-17 03:09:00 +01:00
return * _data . _aabb ;
2021-05-05 12:44:11 +02:00
} else {
2017-11-17 03:09:00 +01:00
return : : AABB ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-01-11 04:52:51 +01:00
Variant : : operator Basis ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = BASIS ) {
2017-01-11 04:52:51 +01:00
return * _data . _basis ;
2021-05-05 12:44:11 +02:00
} else if ( type = = QUAT ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Quat * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else if ( type = = VECTOR3 ) {
2017-11-20 22:41:22 +01:00
return Basis ( * reinterpret_cast < const Vector3 * > ( _data . _mem ) ) ;
2021-05-05 12:44:11 +02:00
} else if ( type = = TRANSFORM ) { // unexposed in Variant::can_convert?
2014-05-14 06:22:15 +02:00
return _data . _transform - > basis ;
2021-05-05 12:44:11 +02:00
} else {
2017-01-11 04:52:51 +01:00
return Basis ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
Variant : : operator Quat ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = QUAT ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Quat * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else if ( type = = BASIS ) {
2017-03-05 16:44:50 +01:00
return * _data . _basis ;
2021-05-05 12:44:11 +02:00
} else if ( type = = TRANSFORM ) {
2017-03-05 16:44:50 +01:00
return _data . _transform - > basis ;
2021-05-05 12:44:11 +02:00
} else {
2014-02-10 02:10:30 +01:00
return Quat ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
Variant : : operator Transform ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = TRANSFORM ) {
2014-02-10 02:10:30 +01:00
return * _data . _transform ;
2021-05-05 12:44:11 +02:00
} else if ( type = = BASIS ) {
2017-03-05 16:44:50 +01:00
return Transform ( * _data . _basis , Vector3 ( ) ) ;
2021-05-05 12:44:11 +02:00
} else if ( type = = QUAT ) {
2017-03-05 16:44:50 +01:00
return Transform ( Basis ( * reinterpret_cast < const Quat * > ( _data . _mem ) ) , Vector3 ( ) ) ;
2021-05-05 12:44:11 +02:00
} else if ( type = = TRANSFORM2D ) {
2018-11-26 05:57:40 +01:00
const Transform2D & t = * _data . _transform2d ;
Transform m ;
m . basis . elements [ 0 ] [ 0 ] = t . elements [ 0 ] [ 0 ] ;
m . basis . elements [ 1 ] [ 0 ] = t . elements [ 0 ] [ 1 ] ;
m . basis . elements [ 0 ] [ 1 ] = t . elements [ 1 ] [ 0 ] ;
m . basis . elements [ 1 ] [ 1 ] = t . elements [ 1 ] [ 1 ] ;
m . origin [ 0 ] = t . elements [ 2 ] [ 0 ] ;
m . origin [ 1 ] = t . elements [ 2 ] [ 1 ] ;
return m ;
2021-05-05 12:44:11 +02:00
} else {
2014-02-10 02:10:30 +01:00
return Transform ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : operator Transform2D ( ) const {
if ( type = = TRANSFORM2D ) {
return * _data . _transform2d ;
} else if ( type = = TRANSFORM ) {
const Transform & t = * _data . _transform ;
Transform2D m ;
m . elements [ 0 ] [ 0 ] = t . basis . elements [ 0 ] [ 0 ] ;
m . elements [ 0 ] [ 1 ] = t . basis . elements [ 1 ] [ 0 ] ;
m . elements [ 1 ] [ 0 ] = t . basis . elements [ 0 ] [ 1 ] ;
m . elements [ 1 ] [ 1 ] = t . basis . elements [ 1 ] [ 1 ] ;
m . elements [ 2 ] [ 0 ] = t . origin [ 0 ] ;
m . elements [ 2 ] [ 1 ] = t . origin [ 1 ] ;
return m ;
2021-05-05 12:44:11 +02:00
} else {
2017-03-05 16:44:50 +01:00
return Transform2D ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
Variant : : operator Color ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = COLOR ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Color * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else if ( type = = STRING ) {
2017-03-05 16:44:50 +01:00
return Color : : html ( operator String ( ) ) ;
2021-05-05 12:44:11 +02:00
} else if ( type = = INT ) {
2017-03-05 16:44:50 +01:00
return Color : : hex ( operator int ( ) ) ;
2021-05-05 12:44:11 +02:00
} else {
2014-02-10 02:10:30 +01:00
return Color ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
Variant : : operator NodePath ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = NODE_PATH ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const NodePath * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else if ( type = = STRING ) {
2014-02-10 02:10:30 +01:00
return NodePath ( operator String ( ) ) ;
2021-05-05 12:44:11 +02:00
} else {
2014-02-10 02:10:30 +01:00
return NodePath ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
Variant : : operator RefPtr ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = OBJECT ) {
2014-02-10 02:10:30 +01:00
return _get_obj ( ) . ref ;
2021-05-05 12:44:11 +02:00
} else {
2014-02-10 02:10:30 +01:00
return RefPtr ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
Variant : : operator RID ( ) const {
2020-04-23 12:40:06 +02:00
if ( type = = _RID ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const RID * > ( _data . _mem ) ;
2020-04-23 12:40:06 +02:00
} else if ( type = = OBJECT ) {
if ( ! _get_obj ( ) . ref . is_null ( ) ) {
return _get_obj ( ) . ref . get_rid ( ) ;
} else {
2021-05-04 16:00:45 +02:00
Object * obj = likely ( _get_obj ( ) . rc ) ? _get_obj ( ) . rc - > get_ptr ( ) : nullptr ;
2020-04-23 12:40:06 +02:00
if ( unlikely ( ! obj ) ) {
2021-09-21 10:30:34 +02:00
if ( _get_obj ( ) . rc ) {
2021-04-20 11:33:26 +02:00
ERR_PRINT ( " Attempted get RID on a deleted object. " ) ;
2020-04-23 12:40:06 +02:00
}
2020-04-30 10:23:30 +02:00
return RID ( ) ;
2020-04-23 12:40:06 +02:00
}
Variant : : CallError ce ;
2021-05-04 16:00:45 +02:00
Variant ret = obj - > call ( CoreStringNames : : get_singleton ( ) - > get_rid , nullptr , 0 , ce ) ;
2020-04-23 12:40:06 +02:00
if ( ce . error = = Variant : : CallError : : CALL_OK & & ret . get_type ( ) = = Variant : : _RID ) {
return ret ;
} else {
return RID ( ) ;
}
2015-04-25 01:45:07 +02:00
}
} else {
return RID ( ) ;
}
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : operator Object * ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = OBJECT ) {
2020-04-23 12:40:06 +02:00
return _OBJ_PTR ( * this ) ;
2021-05-05 12:44:11 +02:00
} else {
2021-05-04 16:00:45 +02:00
return nullptr ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : operator Node * ( ) const {
2020-04-23 12:40:06 +02:00
if ( type = = OBJECT ) {
2021-05-04 16:00:45 +02:00
Object * obj = _get_obj ( ) . rc ? _get_obj ( ) . rc - > get_ptr ( ) : nullptr ;
2020-04-23 12:40:06 +02:00
return Object : : cast_to < Node > ( obj ) ;
}
2021-05-04 16:00:45 +02:00
return nullptr ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : operator Control * ( ) const {
2020-04-23 12:40:06 +02:00
if ( type = = OBJECT ) {
2021-05-04 16:00:45 +02:00
Object * obj = _get_obj ( ) . rc ? _get_obj ( ) . rc - > get_ptr ( ) : nullptr ;
2020-04-23 12:40:06 +02:00
return Object : : cast_to < Control > ( obj ) ;
}
2021-05-04 16:00:45 +02:00
return nullptr ;
2014-02-10 02:10:30 +01:00
}
Variant : : operator Dictionary ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = DICTIONARY ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Dictionary * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else {
2014-02-10 02:10:30 +01:00
return Dictionary ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
template < class DA , class SA >
inline DA _convert_array ( const SA & p_array ) {
2014-02-10 02:10:30 +01:00
DA da ;
da . resize ( p_array . size ( ) ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_array . size ( ) ; i + + ) {
da . set ( i , Variant ( p_array . get ( i ) ) ) ;
2014-02-10 02:10:30 +01:00
}
return da ;
}
2017-03-05 16:44:50 +01:00
template < class DA >
inline DA _convert_array_from_variant ( const Variant & p_variant ) {
switch ( p_variant . get_type ( ) ) {
case Variant : : ARRAY : {
return _convert_array < DA , Array > ( p_variant . operator Array ( ) ) ;
}
case Variant : : POOL_BYTE_ARRAY : {
2021-05-04 14:20:36 +02:00
return _convert_array < DA , PoolVector < uint8_t > > ( p_variant . operator PoolVector < uint8_t > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
case Variant : : POOL_INT_ARRAY : {
2021-05-04 14:20:36 +02:00
return _convert_array < DA , PoolVector < int > > ( p_variant . operator PoolVector < int > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
case Variant : : POOL_REAL_ARRAY : {
2021-05-04 14:20:36 +02:00
return _convert_array < DA , PoolVector < real_t > > ( p_variant . operator PoolVector < real_t > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
case Variant : : POOL_STRING_ARRAY : {
2021-05-04 14:20:36 +02:00
return _convert_array < DA , PoolVector < String > > ( p_variant . operator PoolVector < String > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
case Variant : : POOL_VECTOR2_ARRAY : {
2021-05-04 14:20:36 +02:00
return _convert_array < DA , PoolVector < Vector2 > > ( p_variant . operator PoolVector < Vector2 > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
case Variant : : POOL_VECTOR3_ARRAY : {
2021-05-04 14:20:36 +02:00
return _convert_array < DA , PoolVector < Vector3 > > ( p_variant . operator PoolVector < Vector3 > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
case Variant : : POOL_COLOR_ARRAY : {
2021-05-04 14:20:36 +02:00
return _convert_array < DA , PoolVector < Color > > ( p_variant . operator PoolVector < Color > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
2019-04-09 17:08:36 +02:00
default : {
return DA ( ) ;
}
2014-02-10 02:10:30 +01:00
}
}
Variant : : operator Array ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = ARRAY ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const Array * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else {
2017-03-05 16:44:50 +01:00
return _convert_array_from_variant < Array > ( * this ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-01-07 22:25:37 +01:00
Variant : : operator PoolVector < uint8_t > ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = POOL_BYTE_ARRAY ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const PoolVector < uint8_t > * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else {
2021-05-04 14:20:36 +02:00
return _convert_array_from_variant < PoolVector < uint8_t > > ( * this ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-01-07 22:25:37 +01:00
Variant : : operator PoolVector < int > ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = POOL_INT_ARRAY ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const PoolVector < int > * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else {
2021-05-04 14:20:36 +02:00
return _convert_array_from_variant < PoolVector < int > > ( * this ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-01-07 22:25:37 +01:00
Variant : : operator PoolVector < real_t > ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = POOL_REAL_ARRAY ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const PoolVector < real_t > * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else {
2021-05-04 14:20:36 +02:00
return _convert_array_from_variant < PoolVector < real_t > > ( * this ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-01-07 22:25:37 +01:00
Variant : : operator PoolVector < String > ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = POOL_STRING_ARRAY ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const PoolVector < String > * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else {
2021-05-04 14:20:36 +02:00
return _convert_array_from_variant < PoolVector < String > > ( * this ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-01-07 22:25:37 +01:00
Variant : : operator PoolVector < Vector3 > ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = POOL_VECTOR3_ARRAY ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const PoolVector < Vector3 > * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else {
2021-05-04 14:20:36 +02:00
return _convert_array_from_variant < PoolVector < Vector3 > > ( * this ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-01-07 22:25:37 +01:00
Variant : : operator PoolVector < Vector2 > ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = POOL_VECTOR2_ARRAY ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const PoolVector < Vector2 > * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else {
2021-05-04 14:20:36 +02:00
return _convert_array_from_variant < PoolVector < Vector2 > > ( * this ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-01-07 22:25:37 +01:00
Variant : : operator PoolVector < Color > ( ) const {
2021-05-05 12:44:11 +02:00
if ( type = = POOL_COLOR_ARRAY ) {
2017-03-05 16:44:50 +01:00
return * reinterpret_cast < const PoolVector < Color > * > ( _data . _mem ) ;
2021-05-05 12:44:11 +02:00
} else {
2021-05-04 14:20:36 +02:00
return _convert_array_from_variant < PoolVector < Color > > ( * this ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
/* helpers */
Variant : : operator Vector < RID > ( ) const {
2017-03-05 16:44:50 +01:00
Array va = operator Array ( ) ;
2014-02-10 02:10:30 +01:00
Vector < RID > rids ;
rids . resize ( va . size ( ) ) ;
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < rids . size ( ) ; i + + ) {
2018-07-25 03:11:03 +02:00
rids . write [ i ] = va [ i ] ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
return rids ;
}
Variant : : operator Vector < Vector2 > ( ) const {
2017-03-05 16:44:50 +01:00
PoolVector < Vector2 > from = operator PoolVector < Vector2 > ( ) ;
2014-02-10 02:10:30 +01:00
Vector < Vector2 > to ;
2017-03-05 16:44:50 +01:00
int len = from . size ( ) ;
2021-05-05 12:44:11 +02:00
if ( len = = 0 ) {
2014-02-10 02:10:30 +01:00
return Vector < Vector2 > ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
to . resize ( len ) ;
2017-01-07 22:25:37 +01:00
PoolVector < Vector2 > : : Read r = from . read ( ) ;
2018-07-25 03:11:03 +02:00
Vector2 * w = to . ptrw ( ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < len ; i + + ) {
w [ i ] = r [ i ] ;
2014-02-10 02:10:30 +01:00
}
return to ;
}
2017-01-07 22:25:37 +01:00
Variant : : operator PoolVector < Plane > ( ) const {
2017-03-05 16:44:50 +01:00
Array va = operator Array ( ) ;
2017-01-07 22:25:37 +01:00
PoolVector < Plane > planes ;
2017-03-05 16:44:50 +01:00
int va_size = va . size ( ) ;
2021-05-05 12:44:11 +02:00
if ( va_size = = 0 ) {
2014-02-10 02:10:30 +01:00
return planes ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
planes . resize ( va_size ) ;
2017-01-07 22:25:37 +01:00
PoolVector < Plane > : : Write w = planes . write ( ) ;
2014-02-10 02:10:30 +01:00
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < va_size ; i + + ) {
2017-03-05 16:44:50 +01:00
w [ i ] = va [ i ] ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
return planes ;
}
2017-01-07 22:25:37 +01:00
Variant : : operator PoolVector < Face3 > ( ) const {
2017-03-05 16:44:50 +01:00
PoolVector < Vector3 > va = operator PoolVector < Vector3 > ( ) ;
2017-01-07 22:25:37 +01:00
PoolVector < Face3 > faces ;
2017-03-05 16:44:50 +01:00
int va_size = va . size ( ) ;
2021-05-05 12:44:11 +02:00
if ( va_size = = 0 ) {
2014-02-10 02:10:30 +01:00
return faces ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
faces . resize ( va_size / 3 ) ;
2017-01-07 22:25:37 +01:00
PoolVector < Face3 > : : Write w = faces . write ( ) ;
PoolVector < Vector3 > : : Read r = va . read ( ) ;
2014-02-10 02:10:30 +01:00
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < va_size ; i + + ) {
2017-03-05 16:44:50 +01:00
w [ i / 3 ] . vertex [ i % 3 ] = r [ i ] ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
return faces ;
}
Variant : : operator Vector < Plane > ( ) const {
2017-03-05 16:44:50 +01:00
Array va = operator Array ( ) ;
2014-02-10 02:10:30 +01:00
Vector < Plane > planes ;
2017-03-05 16:44:50 +01:00
int va_size = va . size ( ) ;
2021-05-05 12:44:11 +02:00
if ( va_size = = 0 ) {
2014-02-10 02:10:30 +01:00
return planes ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
planes . resize ( va_size ) ;
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < va_size ; i + + ) {
2018-07-25 03:11:03 +02:00
planes . write [ i ] = va [ i ] ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
return planes ;
}
Variant : : operator Vector < Variant > ( ) const {
2017-03-05 16:44:50 +01:00
Array from = operator Array ( ) ;
2014-02-10 02:10:30 +01:00
Vector < Variant > to ;
2017-03-05 16:44:50 +01:00
int len = from . size ( ) ;
2014-02-10 02:10:30 +01:00
to . resize ( len ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < len ; i + + ) {
2018-07-25 03:11:03 +02:00
to . write [ i ] = from [ i ] ;
2014-02-10 02:10:30 +01:00
}
return to ;
}
Variant : : operator Vector < uint8_t > ( ) const {
2017-03-05 16:44:50 +01:00
PoolVector < uint8_t > from = operator PoolVector < uint8_t > ( ) ;
2014-02-10 02:10:30 +01:00
Vector < uint8_t > to ;
2017-03-05 16:44:50 +01:00
int len = from . size ( ) ;
2014-02-10 02:10:30 +01:00
to . resize ( len ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < len ; i + + ) {
2018-07-25 03:11:03 +02:00
to . write [ i ] = from [ i ] ;
2014-02-10 02:10:30 +01:00
}
return to ;
}
Variant : : operator Vector < int > ( ) const {
2017-03-05 16:44:50 +01:00
PoolVector < int > from = operator PoolVector < int > ( ) ;
2014-02-10 02:10:30 +01:00
Vector < int > to ;
2017-03-05 16:44:50 +01:00
int len = from . size ( ) ;
2014-02-10 02:10:30 +01:00
to . resize ( len ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < len ; i + + ) {
2018-07-25 03:11:03 +02:00
to . write [ i ] = from [ i ] ;
2014-02-10 02:10:30 +01:00
}
return to ;
}
Variant : : operator Vector < real_t > ( ) const {
2017-03-05 16:44:50 +01:00
PoolVector < real_t > from = operator PoolVector < real_t > ( ) ;
2014-02-10 02:10:30 +01:00
Vector < real_t > to ;
2017-03-05 16:44:50 +01:00
int len = from . size ( ) ;
2014-02-10 02:10:30 +01:00
to . resize ( len ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < len ; i + + ) {
2018-07-25 03:11:03 +02:00
to . write [ i ] = from [ i ] ;
2014-02-10 02:10:30 +01:00
}
return to ;
}
Variant : : operator Vector < String > ( ) const {
2017-03-05 16:44:50 +01:00
PoolVector < String > from = operator PoolVector < String > ( ) ;
2014-02-10 02:10:30 +01:00
Vector < String > to ;
2017-03-05 16:44:50 +01:00
int len = from . size ( ) ;
2014-02-10 02:10:30 +01:00
to . resize ( len ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < len ; i + + ) {
2018-07-25 03:11:03 +02:00
to . write [ i ] = from [ i ] ;
2014-02-10 02:10:30 +01:00
}
return to ;
}
2018-06-25 21:21:57 +02:00
Variant : : operator Vector < StringName > ( ) const {
PoolVector < String > from = operator PoolVector < String > ( ) ;
Vector < StringName > to ;
int len = from . size ( ) ;
to . resize ( len ) ;
for ( int i = 0 ; i < len ; i + + ) {
2018-07-25 03:11:03 +02:00
to . write [ i ] = from [ i ] ;
2018-06-25 21:21:57 +02:00
}
return to ;
}
2014-02-10 02:10:30 +01:00
Variant : : operator Vector < Vector3 > ( ) const {
2017-03-05 16:44:50 +01:00
PoolVector < Vector3 > from = operator PoolVector < Vector3 > ( ) ;
2014-02-10 02:10:30 +01:00
Vector < Vector3 > to ;
2017-03-05 16:44:50 +01:00
int len = from . size ( ) ;
2021-05-05 12:44:11 +02:00
if ( len = = 0 ) {
2014-02-10 02:10:30 +01:00
return Vector < Vector3 > ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
to . resize ( len ) ;
2017-01-07 22:25:37 +01:00
PoolVector < Vector3 > : : Read r = from . read ( ) ;
2018-07-25 03:11:03 +02:00
Vector3 * w = to . ptrw ( ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < len ; i + + ) {
w [ i ] = r [ i ] ;
2014-02-10 02:10:30 +01:00
}
return to ;
}
Variant : : operator Vector < Color > ( ) const {
2017-03-05 16:44:50 +01:00
PoolVector < Color > from = operator PoolVector < Color > ( ) ;
2014-02-10 02:10:30 +01:00
Vector < Color > to ;
2017-03-05 16:44:50 +01:00
int len = from . size ( ) ;
2021-05-05 12:44:11 +02:00
if ( len = = 0 ) {
2014-02-10 02:10:30 +01:00
return Vector < Color > ( ) ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
to . resize ( len ) ;
2017-01-07 22:25:37 +01:00
PoolVector < Color > : : Read r = from . read ( ) ;
2018-07-25 03:11:03 +02:00
Color * w = to . ptrw ( ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < len ; i + + ) {
w [ i ] = r [ i ] ;
2014-02-10 02:10:30 +01:00
}
return to ;
}
Variant : : operator Margin ( ) const {
2017-03-05 16:44:50 +01:00
return ( Margin ) operator int ( ) ;
2014-02-10 02:10:30 +01:00
}
Variant : : operator Orientation ( ) const {
2017-03-05 16:44:50 +01:00
return ( Orientation ) operator int ( ) ;
2014-02-10 02:10:30 +01:00
}
Variant : : operator IP_Address ( ) const {
2017-03-05 16:44:50 +01:00
if ( type = = POOL_REAL_ARRAY | | type = = POOL_INT_ARRAY | | type = = POOL_BYTE_ARRAY ) {
PoolVector < int > addr = operator PoolVector < int > ( ) ;
if ( addr . size ( ) = = 4 ) {
return IP_Address ( addr . get ( 0 ) , addr . get ( 1 ) , addr . get ( 2 ) , addr . get ( 3 ) ) ;
2014-02-10 02:10:30 +01:00
}
}
2017-03-05 16:44:50 +01:00
return IP_Address ( operator String ( ) ) ;
2014-02-10 02:10:30 +01:00
}
Variant : : Variant ( bool p_bool ) {
2017-03-05 16:44:50 +01:00
type = BOOL ;
_data . _bool = p_bool ;
2014-02-10 02:10:30 +01:00
}
/*
Variant : : Variant ( long unsigned int p_long ) {
type = INT ;
_data . _int = p_long ;
} ;
*/
Variant : : Variant ( signed int p_int ) {
2017-03-05 16:44:50 +01:00
type = INT ;
_data . _int = p_int ;
2014-02-10 02:10:30 +01:00
}
Variant : : Variant ( unsigned int p_int ) {
2017-03-05 16:44:50 +01:00
type = INT ;
_data . _int = p_int ;
2014-02-10 02:10:30 +01:00
}
# ifdef NEED_LONG_INT
Variant : : Variant ( signed long p_int ) {
2017-03-05 16:44:50 +01:00
type = INT ;
_data . _int = p_int ;
2014-02-10 02:10:30 +01:00
}
Variant : : Variant ( unsigned long p_int ) {
2017-03-05 16:44:50 +01:00
type = INT ;
_data . _int = p_int ;
2014-02-10 02:10:30 +01:00
}
# endif
Variant : : Variant ( int64_t p_int ) {
2017-03-05 16:44:50 +01:00
type = INT ;
_data . _int = p_int ;
2014-02-10 02:10:30 +01:00
}
Variant : : Variant ( uint64_t p_int ) {
2017-03-05 16:44:50 +01:00
type = INT ;
_data . _int = p_int ;
2014-02-10 02:10:30 +01:00
}
Variant : : Variant ( signed short p_short ) {
2017-03-05 16:44:50 +01:00
type = INT ;
_data . _int = p_short ;
2014-02-10 02:10:30 +01:00
}
Variant : : Variant ( unsigned short p_short ) {
2017-03-05 16:44:50 +01:00
type = INT ;
_data . _int = p_short ;
2014-02-10 02:10:30 +01:00
}
Variant : : Variant ( signed char p_char ) {
2017-03-05 16:44:50 +01:00
type = INT ;
_data . _int = p_char ;
2014-02-10 02:10:30 +01:00
}
Variant : : Variant ( unsigned char p_char ) {
2017-03-05 16:44:50 +01:00
type = INT ;
_data . _int = p_char ;
2014-02-10 02:10:30 +01:00
}
Variant : : Variant ( float p_float ) {
2017-03-05 16:44:50 +01:00
type = REAL ;
_data . _real = p_float ;
2014-02-10 02:10:30 +01:00
}
Variant : : Variant ( double p_double ) {
2017-03-05 16:44:50 +01:00
type = REAL ;
_data . _real = p_double ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const StringName & p_string ) {
type = STRING ;
memnew_placement ( _data . _mem , String ( p_string . operator String ( ) ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const String & p_string ) {
type = STRING ;
memnew_placement ( _data . _mem , String ( p_string ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const char * const p_cstring ) {
type = STRING ;
memnew_placement ( _data . _mem , String ( ( const char * ) p_cstring ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const CharType * p_wstring ) {
type = STRING ;
memnew_placement ( _data . _mem , String ( p_wstring ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector3 & p_vector3 ) {
type = VECTOR3 ;
memnew_placement ( _data . _mem , Vector3 ( p_vector3 ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector2 & p_vector2 ) {
type = VECTOR2 ;
memnew_placement ( _data . _mem , Vector2 ( p_vector2 ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Rect2 & p_rect2 ) {
type = RECT2 ;
memnew_placement ( _data . _mem , Rect2 ( p_rect2 ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Plane & p_plane ) {
type = PLANE ;
memnew_placement ( _data . _mem , Plane ( p_plane ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-11-17 03:09:00 +01:00
Variant : : Variant ( const : : AABB & p_aabb ) {
type = AABB ;
_data . _aabb = memnew ( : : AABB ( p_aabb ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Basis & p_matrix ) {
type = BASIS ;
_data . _basis = memnew ( Basis ( p_matrix ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Quat & p_quat ) {
type = QUAT ;
memnew_placement ( _data . _mem , Quat ( p_quat ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Transform & p_transform ) {
type = TRANSFORM ;
_data . _transform = memnew ( Transform ( p_transform ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Transform2D & p_transform ) {
type = TRANSFORM2D ;
_data . _transform2d = memnew ( Transform2D ( p_transform ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Color & p_color ) {
type = COLOR ;
memnew_placement ( _data . _mem , Color ( p_color ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const NodePath & p_node_path ) {
type = NODE_PATH ;
memnew_placement ( _data . _mem , NodePath ( p_node_path ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const RefPtr & p_resource ) {
type = OBJECT ;
memnew_placement ( _data . _mem , ObjData ) ;
2021-05-04 16:00:45 +02:00
_get_obj ( ) . rc = nullptr ;
2017-03-05 16:44:50 +01:00
_get_obj ( ) . ref = p_resource ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const RID & p_rid ) {
type = _RID ;
memnew_placement ( _data . _mem , RID ( p_rid ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Object * p_object ) {
type = OBJECT ;
2020-10-24 13:50:58 +02:00
Object * obj = const_cast < Object * > ( p_object ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , ObjData ) ;
2020-10-24 13:50:58 +02:00
Reference * ref = Object : : cast_to < Reference > ( obj ) ;
if ( unlikely ( ref ) ) {
* reinterpret_cast < Ref < Reference > * > ( _get_obj ( ) . ref . get_data ( ) ) = Ref < Reference > ( ref ) ;
2021-05-04 16:00:45 +02:00
_get_obj ( ) . rc = nullptr ;
2020-10-24 13:50:58 +02:00
} else {
2021-05-04 16:00:45 +02:00
_get_obj ( ) . rc = likely ( obj ) ? obj - > _use_rc ( ) : nullptr ;
2020-10-24 13:50:58 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Dictionary & p_dictionary ) {
type = DICTIONARY ;
2019-07-20 08:09:57 +02:00
memnew_placement ( _data . _mem , Dictionary ( p_dictionary ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Array & p_array ) {
type = ARRAY ;
memnew_placement ( _data . _mem , Array ( p_array ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const PoolVector < Plane > & p_array ) {
type = ARRAY ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
Array * plane_array = memnew_placement ( _data . _mem , Array ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
plane_array - > resize ( p_array . size ( ) ) ;
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_array . size ( ) ; i + + ) {
plane_array - > operator [ ] ( i ) = Variant ( p_array [ i ] ) ;
2014-02-10 02:10:30 +01:00
}
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector < Plane > & p_array ) {
type = ARRAY ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
Array * plane_array = memnew_placement ( _data . _mem , Array ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
plane_array - > resize ( p_array . size ( ) ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_array . size ( ) ; i + + ) {
plane_array - > operator [ ] ( i ) = Variant ( p_array [ i ] ) ;
2014-02-10 02:10:30 +01:00
}
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector < RID > & p_array ) {
type = ARRAY ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
Array * rid_array = memnew_placement ( _data . _mem , Array ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
rid_array - > resize ( p_array . size ( ) ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_array . size ( ) ; i + + ) {
rid_array - > set ( i , Variant ( p_array [ i ] ) ) ;
2014-02-10 02:10:30 +01:00
}
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector < Vector2 > & p_array ) {
type = NIL ;
2017-01-07 22:25:37 +01:00
PoolVector < Vector2 > v ;
2017-03-05 16:44:50 +01:00
int len = p_array . size ( ) ;
if ( len > 0 ) {
2014-02-10 02:10:30 +01:00
v . resize ( len ) ;
2017-01-07 22:25:37 +01:00
PoolVector < Vector2 > : : Write w = v . write ( ) ;
2014-02-10 02:10:30 +01:00
const Vector2 * r = p_array . ptr ( ) ;
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < len ; i + + ) {
2017-03-05 16:44:50 +01:00
w [ i ] = r [ i ] ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
* this = v ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const PoolVector < uint8_t > & p_raw_array ) {
type = POOL_BYTE_ARRAY ;
memnew_placement ( _data . _mem , PoolVector < uint8_t > ( p_raw_array ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const PoolVector < int > & p_int_array ) {
type = POOL_INT_ARRAY ;
memnew_placement ( _data . _mem , PoolVector < int > ( p_int_array ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const PoolVector < real_t > & p_real_array ) {
type = POOL_REAL_ARRAY ;
memnew_placement ( _data . _mem , PoolVector < real_t > ( p_real_array ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const PoolVector < String > & p_string_array ) {
type = POOL_STRING_ARRAY ;
memnew_placement ( _data . _mem , PoolVector < String > ( p_string_array ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const PoolVector < Vector3 > & p_vector3_array ) {
type = POOL_VECTOR3_ARRAY ;
memnew_placement ( _data . _mem , PoolVector < Vector3 > ( p_vector3_array ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const PoolVector < Vector2 > & p_vector2_array ) {
type = POOL_VECTOR2_ARRAY ;
memnew_placement ( _data . _mem , PoolVector < Vector2 > ( p_vector2_array ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const PoolVector < Color > & p_color_array ) {
type = POOL_COLOR_ARRAY ;
memnew_placement ( _data . _mem , PoolVector < Color > ( p_color_array ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const PoolVector < Face3 > & p_face_array ) {
2017-01-07 22:25:37 +01:00
PoolVector < Vector3 > vertices ;
2017-03-05 16:44:50 +01:00
int face_count = p_face_array . size ( ) ;
vertices . resize ( face_count * 3 ) ;
2014-02-10 02:10:30 +01:00
if ( face_count ) {
2017-01-07 22:25:37 +01:00
PoolVector < Face3 > : : Read r = p_face_array . read ( ) ;
PoolVector < Vector3 > : : Write w = vertices . write ( ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < face_count ; i + + ) {
2021-05-05 12:44:11 +02:00
for ( int j = 0 ; j < 3 ; j + + ) {
2017-03-05 16:44:50 +01:00
w [ i * 3 + j ] = r [ i ] . vertex [ j ] ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
}
type = NIL ;
* this = vertices ;
}
/* helpers */
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector < Variant > & p_array ) {
type = NIL ;
2014-02-10 02:10:30 +01:00
Array v ;
2017-03-05 16:44:50 +01:00
int len = p_array . size ( ) ;
2014-02-10 02:10:30 +01:00
v . resize ( len ) ;
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < len ; i + + ) {
2017-03-05 16:44:50 +01:00
v . set ( i , p_array [ i ] ) ;
2021-05-05 12:44:11 +02:00
}
2017-03-05 16:44:50 +01:00
* this = v ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector < uint8_t > & p_array ) {
type = NIL ;
2017-01-07 22:25:37 +01:00
PoolVector < uint8_t > v ;
2017-03-05 16:44:50 +01:00
int len = p_array . size ( ) ;
2014-02-10 02:10:30 +01:00
v . resize ( len ) ;
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < len ; i + + ) {
2017-03-05 16:44:50 +01:00
v . set ( i , p_array [ i ] ) ;
2021-05-05 12:44:11 +02:00
}
2017-03-05 16:44:50 +01:00
* this = v ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector < int > & p_array ) {
type = NIL ;
2017-01-07 22:25:37 +01:00
PoolVector < int > v ;
2017-03-05 16:44:50 +01:00
int len = p_array . size ( ) ;
2014-02-10 02:10:30 +01:00
v . resize ( len ) ;
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < len ; i + + ) {
2017-03-05 16:44:50 +01:00
v . set ( i , p_array [ i ] ) ;
2021-05-05 12:44:11 +02:00
}
2017-03-05 16:44:50 +01:00
* this = v ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector < real_t > & p_array ) {
type = NIL ;
2017-01-07 22:25:37 +01:00
PoolVector < real_t > v ;
2017-03-05 16:44:50 +01:00
int len = p_array . size ( ) ;
2014-02-10 02:10:30 +01:00
v . resize ( len ) ;
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < len ; i + + ) {
2017-03-05 16:44:50 +01:00
v . set ( i , p_array [ i ] ) ;
2021-05-05 12:44:11 +02:00
}
2017-03-05 16:44:50 +01:00
* this = v ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector < String > & p_array ) {
type = NIL ;
2017-01-07 22:25:37 +01:00
PoolVector < String > v ;
2017-03-05 16:44:50 +01:00
int len = p_array . size ( ) ;
2014-02-10 02:10:30 +01:00
v . resize ( len ) ;
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < len ; i + + ) {
2017-03-05 16:44:50 +01:00
v . set ( i , p_array [ i ] ) ;
2021-05-05 12:44:11 +02:00
}
2018-06-25 21:21:57 +02:00
* this = v ;
}
Variant : : Variant ( const Vector < StringName > & p_array ) {
type = NIL ;
PoolVector < String > v ;
int len = p_array . size ( ) ;
v . resize ( len ) ;
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < len ; i + + ) {
2018-06-25 21:21:57 +02:00
v . set ( i , p_array [ i ] ) ;
2021-05-05 12:44:11 +02:00
}
2017-03-05 16:44:50 +01:00
* this = v ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector < Vector3 > & p_array ) {
type = NIL ;
2017-01-07 22:25:37 +01:00
PoolVector < Vector3 > v ;
2017-03-05 16:44:50 +01:00
int len = p_array . size ( ) ;
if ( len > 0 ) {
2014-02-10 02:10:30 +01:00
v . resize ( len ) ;
2017-01-07 22:25:37 +01:00
PoolVector < Vector3 > : : Write w = v . write ( ) ;
2014-02-10 02:10:30 +01:00
const Vector3 * r = p_array . ptr ( ) ;
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < len ; i + + ) {
2017-03-05 16:44:50 +01:00
w [ i ] = r [ i ] ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
* this = v ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector < Color > & p_array ) {
type = NIL ;
2017-01-07 22:25:37 +01:00
PoolVector < Color > v ;
2017-03-05 16:44:50 +01:00
int len = p_array . size ( ) ;
2014-02-10 02:10:30 +01:00
v . resize ( len ) ;
2021-05-05 12:44:11 +02:00
for ( int i = 0 ; i < len ; i + + ) {
2017-03-05 16:44:50 +01:00
v . set ( i , p_array [ i ] ) ;
2021-05-05 12:44:11 +02:00
}
2017-03-05 16:44:50 +01:00
* this = v ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
void Variant : : operator = ( const Variant & p_variant ) {
2021-05-05 12:44:11 +02:00
if ( unlikely ( this = = & p_variant ) ) {
2017-09-19 01:46:48 +02:00
return ;
2021-05-05 12:44:11 +02:00
}
2017-09-19 01:46:48 +02:00
2017-09-20 11:04:50 +02:00
if ( unlikely ( type ! = p_variant . type ) ) {
2017-09-19 01:46:48 +02:00
reference ( p_variant ) ;
return ;
}
switch ( p_variant . type ) {
case NIL : {
// none
} break ;
// atomic types
case BOOL : {
_data . _bool = p_variant . _data . _bool ;
} break ;
case INT : {
_data . _int = p_variant . _data . _int ;
} break ;
case REAL : {
_data . _real = p_variant . _data . _real ;
} break ;
case STRING : {
* reinterpret_cast < String * > ( _data . _mem ) = * reinterpret_cast < const String * > ( p_variant . _data . _mem ) ;
} break ;
2017-11-20 22:41:22 +01:00
// math types
2017-09-19 01:46:48 +02:00
case VECTOR2 : {
* reinterpret_cast < Vector2 * > ( _data . _mem ) = * reinterpret_cast < const Vector2 * > ( p_variant . _data . _mem ) ;
} break ;
case RECT2 : {
* reinterpret_cast < Rect2 * > ( _data . _mem ) = * reinterpret_cast < const Rect2 * > ( p_variant . _data . _mem ) ;
} break ;
case TRANSFORM2D : {
* _data . _transform2d = * ( p_variant . _data . _transform2d ) ;
} break ;
case VECTOR3 : {
* reinterpret_cast < Vector3 * > ( _data . _mem ) = * reinterpret_cast < const Vector3 * > ( p_variant . _data . _mem ) ;
} break ;
case PLANE : {
* reinterpret_cast < Plane * > ( _data . _mem ) = * reinterpret_cast < const Plane * > ( p_variant . _data . _mem ) ;
} break ;
2017-11-17 03:09:00 +01:00
case AABB : {
* _data . _aabb = * ( p_variant . _data . _aabb ) ;
2017-09-19 01:46:48 +02:00
} break ;
case QUAT : {
* reinterpret_cast < Quat * > ( _data . _mem ) = * reinterpret_cast < const Quat * > ( p_variant . _data . _mem ) ;
} break ;
case BASIS : {
* _data . _basis = * ( p_variant . _data . _basis ) ;
} break ;
case TRANSFORM : {
* _data . _transform = * ( p_variant . _data . _transform ) ;
} break ;
// misc types
case COLOR : {
* reinterpret_cast < Color * > ( _data . _mem ) = * reinterpret_cast < const Color * > ( p_variant . _data . _mem ) ;
} break ;
case _RID : {
* reinterpret_cast < RID * > ( _data . _mem ) = * reinterpret_cast < const RID * > ( p_variant . _data . _mem ) ;
} break ;
case OBJECT : {
2020-06-28 01:27:03 +02:00
if ( likely ( _get_obj ( ) . rc ) ) {
if ( unlikely ( _get_obj ( ) . rc - > decrement ( ) ) ) {
memdelete ( _get_obj ( ) . rc ) ;
}
}
2017-09-19 01:46:48 +02:00
* reinterpret_cast < ObjData * > ( _data . _mem ) = p_variant . _get_obj ( ) ;
2020-06-28 01:27:03 +02:00
if ( likely ( _get_obj ( ) . rc ) ) {
2020-04-23 12:40:06 +02:00
_get_obj ( ) . rc - > increment ( ) ;
}
2017-09-19 01:46:48 +02:00
} break ;
case NODE_PATH : {
* reinterpret_cast < NodePath * > ( _data . _mem ) = * reinterpret_cast < const NodePath * > ( p_variant . _data . _mem ) ;
} break ;
case DICTIONARY : {
* reinterpret_cast < Dictionary * > ( _data . _mem ) = * reinterpret_cast < const Dictionary * > ( p_variant . _data . _mem ) ;
} break ;
case ARRAY : {
* reinterpret_cast < Array * > ( _data . _mem ) = * reinterpret_cast < const Array * > ( p_variant . _data . _mem ) ;
} break ;
// arrays
case POOL_BYTE_ARRAY : {
* reinterpret_cast < PoolVector < uint8_t > * > ( _data . _mem ) = * reinterpret_cast < const PoolVector < uint8_t > * > ( p_variant . _data . _mem ) ;
} break ;
case POOL_INT_ARRAY : {
* reinterpret_cast < PoolVector < int > * > ( _data . _mem ) = * reinterpret_cast < const PoolVector < int > * > ( p_variant . _data . _mem ) ;
} break ;
case POOL_REAL_ARRAY : {
* reinterpret_cast < PoolVector < real_t > * > ( _data . _mem ) = * reinterpret_cast < const PoolVector < real_t > * > ( p_variant . _data . _mem ) ;
} break ;
case POOL_STRING_ARRAY : {
* reinterpret_cast < PoolVector < String > * > ( _data . _mem ) = * reinterpret_cast < const PoolVector < String > * > ( p_variant . _data . _mem ) ;
} break ;
case POOL_VECTOR2_ARRAY : {
* reinterpret_cast < PoolVector < Vector2 > * > ( _data . _mem ) = * reinterpret_cast < const PoolVector < Vector2 > * > ( p_variant . _data . _mem ) ;
} break ;
case POOL_VECTOR3_ARRAY : {
* reinterpret_cast < PoolVector < Vector3 > * > ( _data . _mem ) = * reinterpret_cast < const PoolVector < Vector3 > * > ( p_variant . _data . _mem ) ;
} break ;
case POOL_COLOR_ARRAY : {
* reinterpret_cast < PoolVector < Color > * > ( _data . _mem ) = * reinterpret_cast < const PoolVector < Color > * > ( p_variant . _data . _mem ) ;
} break ;
2019-04-09 17:08:36 +02:00
default : {
}
2017-09-19 01:46:48 +02:00
}
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const IP_Address & p_address ) {
type = STRING ;
memnew_placement ( _data . _mem , String ( p_address ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Variant & p_variant ) {
type = NIL ;
2014-02-10 02:10:30 +01:00
reference ( p_variant ) ;
}
/*
Variant : : ~ Variant ( ) {
clear ( ) ;
} */
uint32_t Variant : : hash ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2014-02-10 02:10:30 +01:00
case NIL : {
return 0 ;
} break ;
case BOOL : {
2017-03-05 16:44:50 +01:00
return _data . _bool ? 1 : 0 ;
2014-02-10 02:10:30 +01:00
} break ;
case INT : {
return _data . _int ;
} break ;
case REAL : {
2017-02-15 14:41:16 +01:00
return hash_djb2_one_float ( _data . _real ) ;
2014-02-10 02:10:30 +01:00
} break ;
case STRING : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const String * > ( _data . _mem ) - > hash ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-12-06 21:36:34 +01:00
// math types
2014-02-10 02:10:30 +01:00
case VECTOR2 : {
2017-03-05 16:44:50 +01:00
uint32_t hash = hash_djb2_one_float ( reinterpret_cast < const Vector2 * > ( _data . _mem ) - > x ) ;
return hash_djb2_one_float ( reinterpret_cast < const Vector2 * > ( _data . _mem ) - > y , hash ) ;
2014-02-10 02:10:30 +01:00
} break ;
case RECT2 : {
2017-06-04 00:25:13 +02:00
uint32_t hash = hash_djb2_one_float ( reinterpret_cast < const Rect2 * > ( _data . _mem ) - > position . x ) ;
hash = hash_djb2_one_float ( reinterpret_cast < const Rect2 * > ( _data . _mem ) - > position . y , hash ) ;
2017-03-05 16:44:50 +01:00
hash = hash_djb2_one_float ( reinterpret_cast < const Rect2 * > ( _data . _mem ) - > size . x , hash ) ;
return hash_djb2_one_float ( reinterpret_cast < const Rect2 * > ( _data . _mem ) - > size . y , hash ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
2014-02-10 02:10:30 +01:00
uint32_t hash = 5831 ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < 3 ; i + + ) {
for ( int j = 0 ; j < 2 ; j + + ) {
hash = hash_djb2_one_float ( _data . _transform2d - > elements [ i ] [ j ] , hash ) ;
2014-02-10 02:10:30 +01:00
}
}
return hash ;
} break ;
case VECTOR3 : {
2017-03-05 16:44:50 +01:00
uint32_t hash = hash_djb2_one_float ( reinterpret_cast < const Vector3 * > ( _data . _mem ) - > x ) ;
hash = hash_djb2_one_float ( reinterpret_cast < const Vector3 * > ( _data . _mem ) - > y , hash ) ;
return hash_djb2_one_float ( reinterpret_cast < const Vector3 * > ( _data . _mem ) - > z , hash ) ;
2014-02-10 02:10:30 +01:00
} break ;
case PLANE : {
2017-03-05 16:44:50 +01:00
uint32_t hash = hash_djb2_one_float ( reinterpret_cast < const Plane * > ( _data . _mem ) - > normal . x ) ;
hash = hash_djb2_one_float ( reinterpret_cast < const Plane * > ( _data . _mem ) - > normal . y , hash ) ;
hash = hash_djb2_one_float ( reinterpret_cast < const Plane * > ( _data . _mem ) - > normal . z , hash ) ;
return hash_djb2_one_float ( reinterpret_cast < const Plane * > ( _data . _mem ) - > d , hash ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-03-05 16:44:50 +01:00
/*
2014-02-10 02:10:30 +01:00
case QUAT : {
} break ; */
2017-11-17 03:09:00 +01:00
case AABB : {
2014-02-10 02:10:30 +01:00
uint32_t hash = 5831 ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < 3 ; i + + ) {
2017-11-17 03:09:00 +01:00
hash = hash_djb2_one_float ( _data . _aabb - > position [ i ] , hash ) ;
hash = hash_djb2_one_float ( _data . _aabb - > size [ i ] , hash ) ;
2014-02-10 02:10:30 +01:00
}
return hash ;
} break ;
case QUAT : {
2017-03-05 16:44:50 +01:00
uint32_t hash = hash_djb2_one_float ( reinterpret_cast < const Quat * > ( _data . _mem ) - > x ) ;
hash = hash_djb2_one_float ( reinterpret_cast < const Quat * > ( _data . _mem ) - > y , hash ) ;
hash = hash_djb2_one_float ( reinterpret_cast < const Quat * > ( _data . _mem ) - > z , hash ) ;
return hash_djb2_one_float ( reinterpret_cast < const Quat * > ( _data . _mem ) - > w , hash ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case BASIS : {
2014-02-10 02:10:30 +01:00
uint32_t hash = 5831 ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < 3 ; i + + ) {
for ( int j = 0 ; j < 3 ; j + + ) {
hash = hash_djb2_one_float ( _data . _basis - > elements [ i ] [ j ] , hash ) ;
2014-02-10 02:10:30 +01:00
}
}
return hash ;
} break ;
case TRANSFORM : {
uint32_t hash = 5831 ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < 3 ; i + + ) {
for ( int j = 0 ; j < 3 ; j + + ) {
hash = hash_djb2_one_float ( _data . _transform - > basis . elements [ i ] [ j ] , hash ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
hash = hash_djb2_one_float ( _data . _transform - > origin [ i ] , hash ) ;
2014-02-10 02:10:30 +01:00
}
return hash ;
} break ;
2017-03-05 16:44:50 +01:00
// misc types
2014-02-10 02:10:30 +01:00
case COLOR : {
2017-03-05 16:44:50 +01:00
uint32_t hash = hash_djb2_one_float ( reinterpret_cast < const Color * > ( _data . _mem ) - > r ) ;
hash = hash_djb2_one_float ( reinterpret_cast < const Color * > ( _data . _mem ) - > g , hash ) ;
hash = hash_djb2_one_float ( reinterpret_cast < const Color * > ( _data . _mem ) - > b , hash ) ;
return hash_djb2_one_float ( reinterpret_cast < const Color * > ( _data . _mem ) - > a , hash ) ;
2014-02-10 02:10:30 +01:00
} break ;
case _RID : {
2017-03-05 16:44:50 +01:00
return hash_djb2_one_64 ( reinterpret_cast < const RID * > ( _data . _mem ) - > get_id ( ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
case OBJECT : {
2020-09-08 19:47:39 +02:00
return hash_djb2_one_64 ( make_uint64_t ( _UNSAFE_OBJ_PROXY_PTR ( * this ) ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
case NODE_PATH : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const NodePath * > ( _data . _mem ) - > hash ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case DICTIONARY : {
2017-03-05 16:44:50 +01:00
return reinterpret_cast < const Dictionary * > ( _data . _mem ) - > hash ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
case ARRAY : {
2017-03-05 16:44:50 +01:00
const Array & arr = * reinterpret_cast < const Array * > ( _data . _mem ) ;
2014-02-10 02:10:30 +01:00
return arr . hash ( ) ;
} break ;
2017-01-11 04:52:51 +01:00
case POOL_BYTE_ARRAY : {
2017-03-05 16:44:50 +01:00
const PoolVector < uint8_t > & arr = * reinterpret_cast < const PoolVector < uint8_t > * > ( _data . _mem ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
PoolVector < uint8_t > : : Read r = arr . read ( ) ;
return hash_djb2_buffer ( ( uint8_t * ) & r [ 0 ] , len ) ;
} else {
return hash_djb2_one_64 ( 0 ) ;
}
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_INT_ARRAY : {
2017-03-05 16:44:50 +01:00
const PoolVector < int > & arr = * reinterpret_cast < const PoolVector < int > * > ( _data . _mem ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
PoolVector < int > : : Read r = arr . read ( ) ;
return hash_djb2_buffer ( ( uint8_t * ) & r [ 0 ] , len * sizeof ( int ) ) ;
} else {
return hash_djb2_one_64 ( 0 ) ;
}
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_REAL_ARRAY : {
2017-03-05 16:44:50 +01:00
const PoolVector < real_t > & arr = * reinterpret_cast < const PoolVector < real_t > * > ( _data . _mem ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
PoolVector < real_t > : : Read r = arr . read ( ) ;
return hash_djb2_buffer ( ( uint8_t * ) & r [ 0 ] , len * sizeof ( real_t ) ) ;
} else {
return hash_djb2_one_float ( 0.0 ) ;
}
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case POOL_STRING_ARRAY : {
2017-03-05 16:44:50 +01:00
uint32_t hash = 5831 ;
const PoolVector < String > & arr = * reinterpret_cast < const PoolVector < String > * > ( _data . _mem ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
PoolVector < String > : : Read r = arr . read ( ) ;
for ( int i = 0 ; i < len ; i + + ) {
hash = hash_djb2_one_32 ( r [ i ] . hash ( ) , hash ) ;
}
2014-02-10 02:10:30 +01:00
}
return hash ;
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR2_ARRAY : {
2017-03-05 16:44:50 +01:00
uint32_t hash = 5831 ;
const PoolVector < Vector2 > & arr = * reinterpret_cast < const PoolVector < Vector2 > * > ( _data . _mem ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
PoolVector < Vector2 > : : Read r = arr . read ( ) ;
for ( int i = 0 ; i < len ; i + + ) {
hash = hash_djb2_one_float ( r [ i ] . x , hash ) ;
hash = hash_djb2_one_float ( r [ i ] . y , hash ) ;
}
2014-02-10 02:10:30 +01:00
}
return hash ;
} break ;
2017-01-11 04:52:51 +01:00
case POOL_VECTOR3_ARRAY : {
2017-03-05 16:44:50 +01:00
uint32_t hash = 5831 ;
const PoolVector < Vector3 > & arr = * reinterpret_cast < const PoolVector < Vector3 > * > ( _data . _mem ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
PoolVector < Vector3 > : : Read r = arr . read ( ) ;
for ( int i = 0 ; i < len ; i + + ) {
hash = hash_djb2_one_float ( r [ i ] . x , hash ) ;
hash = hash_djb2_one_float ( r [ i ] . y , hash ) ;
hash = hash_djb2_one_float ( r [ i ] . z , hash ) ;
}
2014-02-10 02:10:30 +01:00
}
return hash ;
} break ;
2017-01-11 04:52:51 +01:00
case POOL_COLOR_ARRAY : {
2017-03-05 16:44:50 +01:00
uint32_t hash = 5831 ;
const PoolVector < Color > & arr = * reinterpret_cast < const PoolVector < Color > * > ( _data . _mem ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
PoolVector < Color > : : Read r = arr . read ( ) ;
for ( int i = 0 ; i < len ; i + + ) {
hash = hash_djb2_one_float ( r [ i ] . r , hash ) ;
hash = hash_djb2_one_float ( r [ i ] . g , hash ) ;
hash = hash_djb2_one_float ( r [ i ] . b , hash ) ;
hash = hash_djb2_one_float ( r [ i ] . a , hash ) ;
}
2014-02-10 02:10:30 +01:00
}
return hash ;
} break ;
2019-04-09 17:08:36 +02:00
default : {
}
2017-03-05 16:44:50 +01:00
}
2014-02-10 02:10:30 +01:00
return 0 ;
}
2017-03-05 16:44:50 +01:00
# define hash_compare_scalar(p_lhs, p_rhs) \
2017-04-14 11:28:51 +02:00
( ( p_lhs ) = = ( p_rhs ) ) | | ( Math : : is_nan ( p_lhs ) & & Math : : is_nan ( p_rhs ) )
2017-02-15 14:41:16 +01:00
2017-03-05 16:44:50 +01:00
# define hash_compare_vector2(p_lhs, p_rhs) \
2017-02-15 14:41:16 +01:00
( hash_compare_scalar ( ( p_lhs ) . x , ( p_rhs ) . x ) ) & & \
2017-03-05 16:44:50 +01:00
( hash_compare_scalar ( ( p_lhs ) . y , ( p_rhs ) . y ) )
# define hash_compare_vector3(p_lhs, p_rhs) \
( hash_compare_scalar ( ( p_lhs ) . x , ( p_rhs ) . x ) ) & & \
( hash_compare_scalar ( ( p_lhs ) . y , ( p_rhs ) . y ) ) & & \
( hash_compare_scalar ( ( p_lhs ) . z , ( p_rhs ) . z ) )
# define hash_compare_quat(p_lhs, p_rhs) \
( hash_compare_scalar ( ( p_lhs ) . x , ( p_rhs ) . x ) ) & & \
( hash_compare_scalar ( ( p_lhs ) . y , ( p_rhs ) . y ) ) & & \
( hash_compare_scalar ( ( p_lhs ) . z , ( p_rhs ) . z ) ) & & \
( hash_compare_scalar ( ( p_lhs ) . w , ( p_rhs ) . w ) )
# define hash_compare_color(p_lhs, p_rhs) \
( hash_compare_scalar ( ( p_lhs ) . r , ( p_rhs ) . r ) ) & & \
( hash_compare_scalar ( ( p_lhs ) . g , ( p_rhs ) . g ) ) & & \
( hash_compare_scalar ( ( p_lhs ) . b , ( p_rhs ) . b ) ) & & \
( hash_compare_scalar ( ( p_lhs ) . a , ( p_rhs ) . a ) )
# define hash_compare_pool_array(p_lhs, p_rhs, p_type, p_compare_func) \
const PoolVector < p_type > & l = * reinterpret_cast < const PoolVector < p_type > * > ( p_lhs ) ; \
const PoolVector < p_type > & r = * reinterpret_cast < const PoolVector < p_type > * > ( p_rhs ) ; \
\
if ( l . size ( ) ! = r . size ( ) ) \
return false ; \
\
PoolVector < p_type > : : Read lr = l . read ( ) ; \
PoolVector < p_type > : : Read rr = r . read ( ) ; \
\
for ( int i = 0 ; i < l . size ( ) ; + + i ) { \
if ( ! p_compare_func ( ( lr [ i ] ) , ( rr [ i ] ) ) ) \
return false ; \
} \
\
return true
bool Variant : : hash_compare ( const Variant & p_variant ) const {
2021-05-05 12:44:11 +02:00
if ( type ! = p_variant . type ) {
2017-02-15 14:41:16 +01:00
return false ;
2021-05-05 12:44:11 +02:00
}
2017-02-15 14:41:16 +01:00
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-10-08 10:08:27 +02:00
case INT : {
return _data . _int = = p_variant . _data . _int ;
} break ;
2017-02-15 14:41:16 +01:00
case REAL : {
return hash_compare_scalar ( _data . _real , p_variant . _data . _real ) ;
} break ;
2021-10-08 10:08:27 +02:00
case STRING : {
return * reinterpret_cast < const String * > ( _data . _mem ) = = * reinterpret_cast < const String * > ( p_variant . _data . _mem ) ;
} break ;
2017-02-15 14:41:16 +01:00
case VECTOR2 : {
2017-03-05 16:44:50 +01:00
const Vector2 * l = reinterpret_cast < const Vector2 * > ( _data . _mem ) ;
const Vector2 * r = reinterpret_cast < const Vector2 * > ( p_variant . _data . _mem ) ;
2017-02-15 14:41:16 +01:00
return hash_compare_vector2 ( * l , * r ) ;
} break ;
case RECT2 : {
2017-03-05 16:44:50 +01:00
const Rect2 * l = reinterpret_cast < const Rect2 * > ( _data . _mem ) ;
const Rect2 * r = reinterpret_cast < const Rect2 * > ( p_variant . _data . _mem ) ;
2017-02-15 14:41:16 +01:00
2017-06-04 00:25:13 +02:00
return ( hash_compare_vector2 ( l - > position , r - > position ) ) & &
2021-10-28 13:23:24 +02:00
( hash_compare_vector2 ( l - > size , r - > size ) ) ;
2017-02-15 14:41:16 +01:00
} break ;
case TRANSFORM2D : {
2017-03-05 16:44:50 +01:00
Transform2D * l = _data . _transform2d ;
Transform2D * r = p_variant . _data . _transform2d ;
2017-02-15 14:41:16 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < 3 ; i + + ) {
2021-05-05 12:44:11 +02:00
if ( ! ( hash_compare_vector2 ( l - > elements [ i ] , r - > elements [ i ] ) ) ) {
2017-02-15 14:41:16 +01:00
return false ;
2021-05-05 12:44:11 +02:00
}
2017-02-15 14:41:16 +01:00
}
return true ;
} break ;
case VECTOR3 : {
2017-03-05 16:44:50 +01:00
const Vector3 * l = reinterpret_cast < const Vector3 * > ( _data . _mem ) ;
const Vector3 * r = reinterpret_cast < const Vector3 * > ( p_variant . _data . _mem ) ;
2017-02-15 14:41:16 +01:00
return hash_compare_vector3 ( * l , * r ) ;
} break ;
case PLANE : {
2017-03-05 16:44:50 +01:00
const Plane * l = reinterpret_cast < const Plane * > ( _data . _mem ) ;
const Plane * r = reinterpret_cast < const Plane * > ( p_variant . _data . _mem ) ;
2017-02-15 14:41:16 +01:00
return ( hash_compare_vector3 ( l - > normal , r - > normal ) ) & &
2021-10-28 13:23:24 +02:00
( hash_compare_scalar ( l - > d , r - > d ) ) ;
2017-02-15 14:41:16 +01:00
} break ;
2017-11-17 03:09:00 +01:00
case AABB : {
const : : AABB * l = _data . _aabb ;
const : : AABB * r = p_variant . _data . _aabb ;
2017-02-15 14:41:16 +01:00
2017-06-06 20:33:51 +02:00
return ( hash_compare_vector3 ( l - > position , r - > position ) & &
2017-02-15 14:41:16 +01:00
( hash_compare_vector3 ( l - > size , r - > size ) ) ) ;
} break ;
case QUAT : {
2017-03-05 16:44:50 +01:00
const Quat * l = reinterpret_cast < const Quat * > ( _data . _mem ) ;
const Quat * r = reinterpret_cast < const Quat * > ( p_variant . _data . _mem ) ;
2017-02-15 14:41:16 +01:00
return hash_compare_quat ( * l , * r ) ;
} break ;
case BASIS : {
2017-03-05 16:44:50 +01:00
const Basis * l = _data . _basis ;
const Basis * r = p_variant . _data . _basis ;
2017-02-15 14:41:16 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < 3 ; i + + ) {
2021-05-05 12:44:11 +02:00
if ( ! ( hash_compare_vector3 ( l - > elements [ i ] , r - > elements [ i ] ) ) ) {
2017-02-15 14:41:16 +01:00
return false ;
2021-05-05 12:44:11 +02:00
}
2017-02-15 14:41:16 +01:00
}
return true ;
} break ;
case TRANSFORM : {
2017-03-05 16:44:50 +01:00
const Transform * l = _data . _transform ;
const Transform * r = p_variant . _data . _transform ;
2017-02-15 14:41:16 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < 3 ; i + + ) {
2021-05-05 12:44:11 +02:00
if ( ! ( hash_compare_vector3 ( l - > basis . elements [ i ] , r - > basis . elements [ i ] ) ) ) {
2017-02-15 14:41:16 +01:00
return false ;
2021-05-05 12:44:11 +02:00
}
2017-02-15 14:41:16 +01:00
}
return hash_compare_vector3 ( l - > origin , r - > origin ) ;
} break ;
case COLOR : {
2017-03-05 16:44:50 +01:00
const Color * l = reinterpret_cast < const Color * > ( _data . _mem ) ;
const Color * r = reinterpret_cast < const Color * > ( p_variant . _data . _mem ) ;
2017-02-15 14:41:16 +01:00
return hash_compare_color ( * l , * r ) ;
} break ;
case ARRAY : {
2017-03-05 16:44:50 +01:00
const Array & l = * ( reinterpret_cast < const Array * > ( _data . _mem ) ) ;
const Array & r = * ( reinterpret_cast < const Array * > ( p_variant . _data . _mem ) ) ;
2017-02-15 14:41:16 +01:00
2021-05-05 12:44:11 +02:00
if ( l . size ( ) ! = r . size ( ) ) {
2017-02-15 14:41:16 +01:00
return false ;
2021-05-05 12:44:11 +02:00
}
2017-02-15 14:41:16 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < l . size ( ) ; + + i ) {
2021-05-05 12:44:11 +02:00
if ( ! l [ i ] . hash_compare ( r [ i ] ) ) {
2017-02-15 14:41:16 +01:00
return false ;
2021-05-05 12:44:11 +02:00
}
2017-02-15 14:41:16 +01:00
}
return true ;
} break ;
case POOL_REAL_ARRAY : {
hash_compare_pool_array ( _data . _mem , p_variant . _data . _mem , real_t , hash_compare_scalar ) ;
} break ;
case POOL_VECTOR2_ARRAY : {
hash_compare_pool_array ( _data . _mem , p_variant . _data . _mem , Vector2 , hash_compare_vector2 ) ;
} break ;
case POOL_VECTOR3_ARRAY : {
hash_compare_pool_array ( _data . _mem , p_variant . _data . _mem , Vector3 , hash_compare_vector3 ) ;
} break ;
case POOL_COLOR_ARRAY : {
hash_compare_pool_array ( _data . _mem , p_variant . _data . _mem , Color , hash_compare_color ) ;
} break ;
default :
bool v ;
Variant r ;
2017-03-05 16:44:50 +01:00
evaluate ( OP_EQUAL , * this , p_variant , r , v ) ;
2017-02-15 14:41:16 +01:00
return r ;
2017-03-05 16:44:50 +01:00
}
2017-02-15 14:41:16 +01:00
return false ;
}
2014-02-10 02:10:30 +01:00
bool Variant : : is_ref ( ) const {
2017-03-05 16:44:50 +01:00
return type = = OBJECT & & ! _get_obj ( ) . ref . is_null ( ) ;
2014-02-10 02:10:30 +01:00
}
Vector < Variant > varray ( ) {
return Vector < Variant > ( ) ;
}
2017-03-05 16:44:50 +01:00
Vector < Variant > varray ( const Variant & p_arg1 ) {
2014-02-10 02:10:30 +01:00
Vector < Variant > v ;
v . push_back ( p_arg1 ) ;
return v ;
}
2017-03-05 16:44:50 +01:00
Vector < Variant > varray ( const Variant & p_arg1 , const Variant & p_arg2 ) {
2014-02-10 02:10:30 +01:00
Vector < Variant > v ;
v . push_back ( p_arg1 ) ;
v . push_back ( p_arg2 ) ;
return v ;
}
2017-03-05 16:44:50 +01:00
Vector < Variant > varray ( const Variant & p_arg1 , const Variant & p_arg2 , const Variant & p_arg3 ) {
2014-02-10 02:10:30 +01:00
Vector < Variant > v ;
v . push_back ( p_arg1 ) ;
v . push_back ( p_arg2 ) ;
v . push_back ( p_arg3 ) ;
return v ;
}
2017-03-05 16:44:50 +01:00
Vector < Variant > varray ( const Variant & p_arg1 , const Variant & p_arg2 , const Variant & p_arg3 , const Variant & p_arg4 ) {
2014-02-10 02:10:30 +01:00
Vector < Variant > v ;
v . push_back ( p_arg1 ) ;
v . push_back ( p_arg2 ) ;
v . push_back ( p_arg3 ) ;
v . push_back ( p_arg4 ) ;
return v ;
}
2017-03-05 16:44:50 +01:00
Vector < Variant > varray ( const Variant & p_arg1 , const Variant & p_arg2 , const Variant & p_arg3 , const Variant & p_arg4 , const Variant & p_arg5 ) {
2014-02-10 02:10:30 +01:00
Vector < Variant > v ;
v . push_back ( p_arg1 ) ;
v . push_back ( p_arg2 ) ;
v . push_back ( p_arg3 ) ;
v . push_back ( p_arg4 ) ;
v . push_back ( p_arg5 ) ;
return v ;
}
2017-03-05 16:44:50 +01:00
void Variant : : static_assign ( const Variant & p_variant ) {
2014-02-10 02:10:30 +01:00
}
bool Variant : : is_shared ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2021-05-04 14:35:44 +02:00
case OBJECT :
return true ;
case ARRAY :
return true ;
case DICTIONARY :
return true ;
2019-04-09 17:08:36 +02:00
default : {
}
2017-03-05 16:44:50 +01:00
}
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
return false ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant Variant : : call ( const StringName & p_method , VARIANT_ARG_DECLARE ) {
2014-02-10 02:10:30 +01:00
VARIANT_ARGPTRS ;
2017-03-05 16:44:50 +01:00
int argc = 0 ;
for ( int i = 0 ; i < VARIANT_ARG_MAX ; i + + ) {
2021-05-05 12:44:11 +02:00
if ( argptr [ i ] - > get_type ( ) = = Variant : : NIL ) {
2014-02-10 02:10:30 +01:00
break ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
argc + + ;
}
CallError error ;
2017-03-05 16:44:50 +01:00
Variant ret = call ( p_method , argptr , argc , error ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
switch ( error . error ) {
2014-02-10 02:10:30 +01:00
case CallError : : CALL_ERROR_INVALID_ARGUMENT : {
2017-03-05 16:44:50 +01:00
String err = " Invalid type for argument # " + itos ( error . argument ) + " , expected ' " + Variant : : get_type_name ( error . expected ) + " '. " ;
2014-02-10 02:10:30 +01:00
ERR_PRINT ( err . utf8 ( ) . get_data ( ) ) ;
} break ;
case CallError : : CALL_ERROR_INVALID_METHOD : {
2017-03-05 16:44:50 +01:00
String err = " Invalid method ' " + p_method + " ' for type ' " + Variant : : get_type_name ( type ) + " '. " ;
2014-02-10 02:10:30 +01:00
ERR_PRINT ( err . utf8 ( ) . get_data ( ) ) ;
} break ;
case CallError : : CALL_ERROR_TOO_MANY_ARGUMENTS : {
2017-03-05 16:44:50 +01:00
String err = " Too many arguments for method ' " + p_method + " ' " ;
2014-02-10 02:10:30 +01:00
ERR_PRINT ( err . utf8 ( ) . get_data ( ) ) ;
} break ;
2019-04-09 17:08:36 +02:00
default : {
}
2014-02-10 02:10:30 +01:00
}
return ret ;
}
2017-03-05 16:44:50 +01:00
void Variant : : construct_from_string ( const String & p_string , Variant & r_value , ObjectConstruct p_obj_construct , void * p_construct_ud ) {
r_value = Variant ( ) ;
2015-02-15 05:19:46 +01:00
}
2014-12-17 02:31:57 +01:00
2015-12-31 04:54:00 +01:00
String Variant : : get_construct_string ( ) const {
String vars ;
2017-03-05 16:44:50 +01:00
VariantWriter : : write_to_string ( * this , vars ) ;
2014-12-17 02:31:57 +01:00
2015-12-31 04:54:00 +01:00
return vars ;
2014-12-17 02:31:57 +01:00
}
2016-01-04 13:35:21 +01:00
2017-03-05 16:44:50 +01:00
String Variant : : get_call_error_text ( Object * p_base , const StringName & p_method , const Variant * * p_argptrs , int p_argcount , const Variant : : CallError & ce ) {
2016-01-04 13:35:21 +01:00
String err_text ;
2017-03-05 16:44:50 +01:00
if ( ce . error = = Variant : : CallError : : CALL_ERROR_INVALID_ARGUMENT ) {
int errorarg = ce . argument ;
2018-04-30 21:04:30 +02:00
if ( p_argptrs ) {
err_text = " Cannot convert argument " + itos ( errorarg + 1 ) + " from " + Variant : : get_type_name ( p_argptrs [ errorarg ] - > get_type ( ) ) + " to " + Variant : : get_type_name ( ce . expected ) + " . " ;
} else {
err_text = " Cannot convert argument " + itos ( errorarg + 1 ) + " from [missing argptr, type unknown] to " + Variant : : get_type_name ( ce . expected ) + " . " ;
}
2017-03-05 16:44:50 +01:00
} else if ( ce . error = = Variant : : CallError : : CALL_ERROR_TOO_MANY_ARGUMENTS ) {
err_text = " Method expected " + itos ( ce . argument ) + " arguments, but called with " + itos ( p_argcount ) + " . " ;
} else if ( ce . error = = Variant : : CallError : : CALL_ERROR_TOO_FEW_ARGUMENTS ) {
err_text = " Method expected " + itos ( ce . argument ) + " arguments, but called with " + itos ( p_argcount ) + " . " ;
} else if ( ce . error = = Variant : : CallError : : CALL_ERROR_INVALID_METHOD ) {
err_text = " Method not found. " ;
} else if ( ce . error = = Variant : : CallError : : CALL_ERROR_INSTANCE_IS_NULL ) {
err_text = " Instance is null " ;
} else if ( ce . error = = Variant : : CallError : : CALL_OK ) {
2016-01-04 13:35:21 +01:00
return " Call OK " ;
}
2017-01-03 03:03:46 +01:00
String class_name = p_base - > get_class ( ) ;
2016-01-04 13:35:21 +01:00
Ref < Script > script = p_base - > get_script ( ) ;
if ( script . is_valid ( ) & & script - > get_path ( ) . is_resource_file ( ) ) {
2017-03-05 16:44:50 +01:00
class_name + = " ( " + script - > get_path ( ) . get_file ( ) + " ) " ;
2016-01-04 13:35:21 +01:00
}
2017-03-05 16:44:50 +01:00
return " ' " + class_name + " :: " + String ( p_method ) + " ': " + err_text ;
2016-01-04 13:35:21 +01:00
}
2016-05-17 23:27:15 +02:00
2017-03-05 16:44:50 +01:00
String vformat ( const String & p_text , const Variant & p1 , const Variant & p2 , const Variant & p3 , const Variant & p4 , const Variant & p5 ) {
2016-05-17 23:27:15 +02:00
Array args ;
2017-03-05 16:44:50 +01:00
if ( p1 . get_type ( ) ! = Variant : : NIL ) {
2016-05-17 23:27:15 +02:00
args . push_back ( p1 ) ;
2017-03-05 16:44:50 +01:00
if ( p2 . get_type ( ) ! = Variant : : NIL ) {
2016-05-17 23:27:15 +02:00
args . push_back ( p2 ) ;
2017-03-05 16:44:50 +01:00
if ( p3 . get_type ( ) ! = Variant : : NIL ) {
2016-05-17 23:27:15 +02:00
args . push_back ( p3 ) ;
2017-03-05 16:44:50 +01:00
if ( p4 . get_type ( ) ! = Variant : : NIL ) {
2016-05-17 23:27:15 +02:00
args . push_back ( p4 ) ;
2017-03-05 16:44:50 +01:00
if ( p5 . get_type ( ) ! = Variant : : NIL ) {
2016-05-17 23:27:15 +02:00
args . push_back ( p5 ) ;
}
}
}
}
}
2017-03-05 16:44:50 +01:00
bool error = false ;
String fmt = p_text . sprintf ( args , & error ) ;
2016-05-17 23:27:15 +02:00
2019-10-24 14:14:55 +02:00
ERR_FAIL_COND_V_MSG ( error , String ( ) , fmt ) ;
2016-05-17 23:27:15 +02:00
return fmt ;
}