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
/*************************************************************************/
2020-01-01 11:16:22 +01:00
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2020 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"
# 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 ) {
2016-03-09 00:00:52 +01:00
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR2I : {
return " Vector2i " ;
} break ;
2014-02-10 02:10:30 +01:00
case RECT2 : {
return " Rect2 " ;
} break ;
2020-02-22 04:26:41 +01:00
case RECT2I : {
return " Rect2i " ;
} break ;
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
2014-02-10 02:10:30 +01:00
2017-01-11 04:52:51 +01:00
return " Transform2D " ;
2014-02-10 02:10:30 +01:00
} break ;
case VECTOR3 : {
return " Vector3 " ;
} break ;
2020-02-22 04:26:41 +01:00
case VECTOR3I : {
return " Vector3i " ;
} break ;
2014-02-10 02:10:30 +01:00
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 : {
2014-02-10 02:10:30 +01:00
2017-11-17 03:09:00 +01:00
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 : {
2014-02-10 02:10:30 +01:00
2017-01-11 04:52:51 +01:00
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 ;
2020-02-19 20:27:19 +01:00
case CALLABLE : {
return " Callable " ;
} break ;
case SIGNAL : {
return " Signal " ;
} break ;
2020-02-20 22:58:05 +01:00
case STRING_NAME : {
return " StringName " ;
} break ;
2014-02-10 02:10:30 +01:00
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
2020-02-17 22:06:54 +01:00
case PACKED_BYTE_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
return " PackedByteArray " ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_INT_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
return " PackedIntArray " ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_REAL_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
return " PackedRealArray " ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_STRING_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
return " PackedStringArray " ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR2_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
return " PackedVector2Array " ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR3_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
return " PackedVector3Array " ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_COLOR_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
return " PackedColorArray " ;
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( p_type_from = = p_type_to )
2014-02-10 02:10:30 +01:00
return true ;
2017-03-05 16:44:50 +01: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 ;
if ( p_type_from = = NIL ) {
return ( p_type_to = = OBJECT ) ;
} ;
2017-03-05 16:44:50 +01:00
const Type * valid_types = NULL ;
const Type * invalid_types = NULL ;
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR2 : {
static const Type valid [ ] = {
VECTOR2I ,
NIL ,
} ;
valid_types = valid ;
} break ;
case VECTOR2I : {
static const Type valid [ ] = {
VECTOR2 ,
NIL ,
} ;
valid_types = valid ;
} break ;
case RECT2 : {
static const Type valid [ ] = {
RECT2I ,
NIL ,
} ;
valid_types = valid ;
} break ;
case RECT2I : {
static const Type valid [ ] = {
RECT2 ,
NIL ,
} ;
valid_types = valid ;
} break ;
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
2014-02-10 02:10:30 +01:00
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR3 : {
static const Type valid [ ] = {
VECTOR3I ,
NIL ,
} ;
valid_types = valid ;
} break ;
case VECTOR3I : {
static const Type valid [ ] = {
VECTOR3 ,
NIL ,
} ;
valid_types = valid ;
} break ;
2014-02-10 02:10:30 +01:00
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 : {
2014-02-10 02:10:30 +01:00
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 ;
2020-02-20 22:58:05 +01:00
case STRING_NAME : {
static const Type valid [ ] = {
STRING ,
NIL
} ;
valid_types = valid ;
} break ;
2015-05-04 23:30:57 +02:00
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 [ ] = {
2020-02-17 22:06:54 +01:00
PACKED_BYTE_ARRAY ,
PACKED_INT_ARRAY ,
PACKED_STRING_ARRAY ,
PACKED_REAL_ARRAY ,
PACKED_COLOR_ARRAY ,
PACKED_VECTOR2_ARRAY ,
PACKED_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
2020-02-17 22:06:54 +01:00
case PACKED_BYTE_ARRAY : {
2015-05-04 23:30:57 +02:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_INT_ARRAY : {
2015-05-04 23:30:57 +02:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_REAL_ARRAY : {
2015-05-04 23:30:57 +02:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_STRING_ARRAY : {
2015-05-04 23:30:57 +02:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR2_ARRAY : {
2015-05-04 23:30:57 +02:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR3_ARRAY : {
2015-05-04 23:30:57 +02:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_COLOR_ARRAY : {
2015-05-04 23:30:57 +02:00
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 ) {
2015-05-04 23:30:57 +02:00
2017-03-05 16:44:50 +01:00
if ( p_type_from = = valid_types [ i ] )
2015-05-04 23:30:57 +02:00
return true ;
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 ) {
2015-05-04 23:30:57 +02:00
2017-03-05 16:44:50 +01:00
if ( p_type_from = = invalid_types [ i ] )
2015-05-04 23:30:57 +02:00
return false ;
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 ) {
2015-05-04 23:30:57 +02:00
2017-03-05 16:44:50 +01:00
if ( p_type_from = = p_type_to )
2015-05-04 23:30:57 +02:00
return true ;
2017-03-05 16:44:50 +01: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 ;
if ( p_type_from = = NIL ) {
return ( p_type_to = = OBJECT ) ;
} ;
2017-03-05 16:44:50 +01:00
const Type * valid_types = NULL ;
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 ,
2020-02-20 22:58:05 +01:00
STRING_NAME ,
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR2 : {
static const Type valid [ ] = {
VECTOR2I ,
NIL ,
} ;
valid_types = valid ;
} break ;
case VECTOR2I : {
static const Type valid [ ] = {
VECTOR2 ,
NIL ,
} ;
valid_types = valid ;
} break ;
case RECT2 : {
static const Type valid [ ] = {
RECT2I ,
NIL ,
} ;
valid_types = valid ;
} break ;
case RECT2I : {
static const Type valid [ ] = {
RECT2 ,
NIL ,
} ;
valid_types = valid ;
} break ;
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
2015-05-04 23:30:57 +02:00
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR3 : {
static const Type valid [ ] = {
VECTOR3I ,
NIL ,
} ;
valid_types = valid ;
} break ;
case VECTOR3I : {
static const Type valid [ ] = {
VECTOR3 ,
NIL ,
} ;
valid_types = valid ;
} break ;
2015-05-04 23:30:57 +02:00
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 : {
2015-05-04 23:30:57 +02:00
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 ;
2020-02-20 22:58:05 +01:00
case STRING_NAME : {
static const Type valid [ ] = {
STRING ,
NIL
} ;
valid_types = valid ;
} break ;
2014-02-10 02:10:30 +01:00
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 [ ] = {
2020-02-17 22:06:54 +01:00
PACKED_BYTE_ARRAY ,
PACKED_INT_ARRAY ,
PACKED_STRING_ARRAY ,
PACKED_REAL_ARRAY ,
PACKED_COLOR_ARRAY ,
PACKED_VECTOR2_ARRAY ,
PACKED_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
2020-02-17 22:06:54 +01:00
case PACKED_BYTE_ARRAY : {
2014-02-10 02:10:30 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_INT_ARRAY : {
2014-02-10 02:10:30 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_REAL_ARRAY : {
2014-02-10 02:10:30 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_STRING_ARRAY : {
2014-02-10 02:10:30 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR2_ARRAY : {
2014-02-10 02:10:30 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR3_ARRAY : {
2014-02-10 02:10:30 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_COLOR_ARRAY : {
2014-02-10 02:10:30 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( p_type_from = = valid_types [ i ] )
2014-02-10 02:10:30 +01:00
return true ;
i + + ;
}
}
return false ;
}
2017-03-05 16:44:50 +01:00
bool Variant : : operator = = ( const Variant & p_variant ) const {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( type ! = p_variant . type ) //evaluation of operator== needs to be more strict
2014-02-10 02:10:30 +01:00
return false ;
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 {
2016-01-03 00:17:31 +01:00
2017-03-05 16:44:50 +01:00
if ( type ! = p_variant . type ) //evaluation of operator== needs to be more strict
2016-01-03 00:17:31 +01:00
return true ;
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 {
if ( type ! = p_variant . type ) //if types differ, then order by type first
return type < p_variant . type ;
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
2020-02-22 04:26:41 +01:00
} break ;
case VECTOR2I : {
return * reinterpret_cast < const Vector2i * > ( _data . _mem ) = = Vector2i ( ) ;
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
2020-02-22 04:26:41 +01:00
} break ;
case RECT2I : {
return * reinterpret_cast < const Rect2i * > ( _data . _mem ) = = Rect2i ( ) ;
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
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
2020-02-22 04:26:41 +01:00
} break ;
case VECTOR3I : {
return * reinterpret_cast < const Vector3i * > ( _data . _mem ) = = Vector3i ( ) ;
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 : {
2014-02-10 02:10:30 +01:00
2017-11-17 03:09:00 +01:00
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 : {
2014-02-10 02:10:30 +01:00
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 : {
2017-03-05 16:44:50 +01:00
return _get_obj ( ) . obj = = NULL ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-19 20:27:19 +01:00
case CALLABLE : {
return reinterpret_cast < const Callable * > ( _data . _mem ) - > is_null ( ) ;
} break ;
case SIGNAL : {
return reinterpret_cast < const Signal * > ( _data . _mem ) - > is_null ( ) ;
} break ;
2020-02-20 22:58:05 +01:00
case STRING_NAME : {
return * reinterpret_cast < const StringName * > ( _data . _mem ) ! = StringName ( ) ;
} break ;
2014-02-10 02:10:30 +01:00
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
2020-02-17 22:06:54 +01:00
case PACKED_BYTE_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-23 22:01:26 +01:00
return PackedArrayRef < uint8_t > : : get_array ( _data . packed_array ) . size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_INT_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-23 22:01:26 +01:00
return PackedArrayRef < int32_t > : : get_array ( _data . packed_array ) . size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_REAL_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-23 22:01:26 +01:00
return PackedArrayRef < real_t > : : get_array ( _data . packed_array ) . size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_STRING_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-23 22:01:26 +01:00
return PackedArrayRef < String > : : get_array ( _data . packed_array ) . size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR2_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-23 22:01:26 +01:00
return PackedArrayRef < Vector2 > : : get_array ( _data . packed_array ) . size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR3_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-23 22:01:26 +01:00
return PackedArrayRef < Vector3 > : : get_array ( _data . packed_array ) . size ( ) = = 0 ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_COLOR_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-23 22:01:26 +01:00
return PackedArrayRef < Color > : : get_array ( _data . packed_array ) . 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
2020-02-22 04:26:41 +01:00
} break ;
case VECTOR2I : {
return * reinterpret_cast < const Vector2i * > ( _data . _mem ) = = Vector2i ( 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
2020-02-22 04:26:41 +01:00
} break ;
case RECT2I : {
return * reinterpret_cast < const Rect2i * > ( _data . _mem ) = = Rect2i ( 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
2020-02-22 04:26:41 +01:00
} break ;
case VECTOR3I : {
return * reinterpret_cast < const Vector3i * > ( _data . _mem ) = = Vector3i ( 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 ;
}
2020-02-13 20:03:10 +01:00
bool Variant : : is_null ( ) const {
if ( type = = OBJECT & & _get_obj ( ) . obj ) {
return false ;
} else {
return true ;
}
}
2017-03-05 16:44:50 +01:00
void Variant : : reference ( const Variant & p_variant ) {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
// none
} break ;
2016-03-09 00:00:52 +01:00
// atomic types
2014-02-10 02:10:30 +01:00
case BOOL : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR2I : {
memnew_placement ( _data . _mem , Vector2i ( * reinterpret_cast < const Vector2i * > ( p_variant . _data . _mem ) ) ) ;
} break ;
2014-02-10 02:10:30 +01:00
case RECT2 : {
2016-03-09 00:00:52 +01:00
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 ;
2020-02-22 04:26:41 +01:00
case RECT2I : {
memnew_placement ( _data . _mem , Rect2i ( * reinterpret_cast < const Rect2i * > ( p_variant . _data . _mem ) ) ) ;
} break ;
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
2014-02-10 02:10:30 +01:00
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 : {
2016-03-09 00:00:52 +01:00
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR3I : {
memnew_placement ( _data . _mem , Vector3i ( * reinterpret_cast < const Vector3i * > ( p_variant . _data . _mem ) ) ) ;
} break ;
2014-02-10 02:10:30 +01:00
case PLANE : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
2017-11-17 03:09:00 +01:00
_data . _aabb = memnew ( : : AABB ( * p_variant . _data . _aabb ) ) ;
2014-02-10 02:10:30 +01:00
} break ;
case QUAT : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
2020-02-13 20:03:10 +01:00
memnew_placement ( _data . _mem , ObjData ) ;
if ( p_variant . _get_obj ( ) . obj & & p_variant . _get_obj ( ) . id . is_reference ( ) ) {
Reference * reference = static_cast < Reference * > ( p_variant . _get_obj ( ) . obj ) ;
if ( ! reference - > reference ( ) ) {
_get_obj ( ) . obj = nullptr ;
_get_obj ( ) . id = ObjectID ( ) ;
break ;
}
}
_get_obj ( ) . obj = const_cast < Object * > ( p_variant . _get_obj ( ) . obj ) ;
_get_obj ( ) . id = p_variant . _get_obj ( ) . id ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-19 20:27:19 +01:00
case CALLABLE : {
memnew_placement ( _data . _mem , Callable ( * reinterpret_cast < const Callable * > ( p_variant . _data . _mem ) ) ) ;
} break ;
case SIGNAL : {
memnew_placement ( _data . _mem , Signal ( * reinterpret_cast < const Signal * > ( p_variant . _data . _mem ) ) ) ;
} break ;
2020-02-20 22:58:05 +01:00
case STRING_NAME : {
memnew_placement ( _data . _mem , StringName ( * reinterpret_cast < const StringName * > ( p_variant . _data . _mem ) ) ) ;
} break ;
2014-02-10 02:10:30 +01:00
case NODE_PATH : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
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
2020-02-17 22:06:54 +01:00
case PACKED_BYTE_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-23 22:01:26 +01:00
_data . packed_array = static_cast < PackedArrayRef < uint8_t > * > ( p_variant . _data . packed_array ) - > reference ( ) ;
if ( ! _data . packed_array ) {
_data . packed_array = PackedArrayRef < uint8_t > : : create ( ) ;
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_INT_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-23 22:01:26 +01:00
_data . packed_array = static_cast < PackedArrayRef < int32_t > * > ( p_variant . _data . packed_array ) - > reference ( ) ;
if ( ! _data . packed_array ) {
_data . packed_array = PackedArrayRef < int32_t > : : create ( ) ;
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_REAL_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-23 22:01:26 +01:00
_data . packed_array = static_cast < PackedArrayRef < real_t > * > ( p_variant . _data . packed_array ) - > reference ( ) ;
if ( ! _data . packed_array ) {
_data . packed_array = PackedArrayRef < real_t > : : create ( ) ;
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_STRING_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-23 22:01:26 +01:00
_data . packed_array = static_cast < PackedArrayRef < String > * > ( p_variant . _data . packed_array ) - > reference ( ) ;
if ( ! _data . packed_array ) {
_data . packed_array = PackedArrayRef < String > : : create ( ) ;
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR2_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-23 22:01:26 +01:00
_data . packed_array = static_cast < PackedArrayRef < Vector2 > * > ( p_variant . _data . packed_array ) - > reference ( ) ;
if ( ! _data . packed_array ) {
_data . packed_array = PackedArrayRef < Vector2 > : : create ( ) ;
}
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR3_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-23 22:01:26 +01:00
_data . packed_array = static_cast < PackedArrayRef < Vector3 > * > ( p_variant . _data . packed_array ) - > reference ( ) ;
if ( ! _data . packed_array ) {
_data . packed_array = PackedArrayRef < Vector3 > : : create ( ) ;
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_COLOR_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-23 22:01:26 +01:00
_data . packed_array = static_cast < PackedArrayRef < Color > * > ( p_variant . _data . packed_array ) - > reference ( ) ;
if ( ! _data . packed_array ) {
_data . packed_array = PackedArrayRef < Color > : : create ( ) ;
}
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 ) {
2016-02-18 04:34:49 +01: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 ;
2017-03-05 16:44:50 +01:00
case VECTOR2 : * reinterpret_cast < Vector2 * > ( this - > _data . _mem ) = Vector2 ( ) ; break ;
2020-02-22 04:26:41 +01:00
case VECTOR2I : * reinterpret_cast < Vector2i * > ( this - > _data . _mem ) = Vector2i ( ) ; break ;
2017-03-05 16:44:50 +01:00
case RECT2 : * reinterpret_cast < Rect2 * > ( this - > _data . _mem ) = Rect2 ( ) ; break ;
2020-02-22 04:26:41 +01:00
case RECT2I : * reinterpret_cast < Rect2i * > ( this - > _data . _mem ) = Rect2i ( ) ; break ;
2017-03-05 16:44:50 +01:00
case VECTOR3 : * reinterpret_cast < Vector3 * > ( this - > _data . _mem ) = Vector3 ( ) ; break ;
2020-02-22 04:26:41 +01:00
case VECTOR3I : * reinterpret_cast < Vector3i * > ( this - > _data . _mem ) = Vector3i ( ) ; break ;
2017-03-05 16:44:50 +01:00
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 ;
2016-02-18 04:34:49 +01:00
default : this - > clear ( ) ; break ;
}
}
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 : {
2016-03-09 00:00:52 +01:00
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 : {
2014-02-10 02:10:30 +01:00
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 : {
2016-03-09 00:00:52 +01:00
2017-11-17 03:09:00 +01:00
memdelete ( _data . _aabb ) ;
2014-02-10 02:10:30 +01:00
} break ;
2017-01-11 04:52:51 +01:00
case BASIS : {
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
memdelete ( _data . _basis ) ;
2014-02-10 02:10:30 +01:00
} break ;
case TRANSFORM : {
2016-03-09 00:00:52 +01:00
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
2020-02-20 22:58:05 +01:00
// misc types
case STRING_NAME : {
reinterpret_cast < StringName * > ( _data . _mem ) - > ~ StringName ( ) ;
} break ;
2014-02-10 02:10:30 +01:00
case NODE_PATH : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
2020-02-13 20:03:10 +01:00
if ( _get_obj ( ) . id . is_reference ( ) ) {
//we are safe that there is a reference here
Reference * reference = static_cast < Reference * > ( _get_obj ( ) . obj ) ;
if ( reference - > unreference ( ) ) {
memdelete ( reference ) ;
}
}
2017-03-05 16:44:50 +01:00
_get_obj ( ) . obj = NULL ;
2020-02-13 20:03:10 +01:00
_get_obj ( ) . id = ObjectID ( ) ;
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 ;
2020-02-19 20:27:19 +01:00
case CALLABLE : {
reinterpret_cast < Callable * > ( _data . _mem ) - > ~ Callable ( ) ;
} break ;
case SIGNAL : {
reinterpret_cast < Signal * > ( _data . _mem ) - > ~ Signal ( ) ;
} break ;
2014-02-10 02:10:30 +01:00
case DICTIONARY : {
2016-03-09 00:00:52 +01:00
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 : {
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
reinterpret_cast < Array * > ( _data . _mem ) - > ~ Array ( ) ;
2014-02-10 02:10:30 +01:00
} break ;
// arrays
2020-02-17 22:06:54 +01:00
case PACKED_BYTE_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-23 22:01:26 +01:00
PackedArrayRefBase : : destroy ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_INT_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-23 22:01:26 +01:00
PackedArrayRefBase : : destroy ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_REAL_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-23 22:01:26 +01:00
PackedArrayRefBase : : destroy ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_STRING_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-23 22:01:26 +01:00
PackedArrayRefBase : : destroy ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR2_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-23 22:01:26 +01:00
PackedArrayRefBase : : destroy ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR3_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-23 22:01:26 +01:00
PackedArrayRefBase : : destroy ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_COLOR_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-23 22:01:26 +01:00
PackedArrayRefBase : : destroy ( _data . packed_array ) ;
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 ) {
2016-03-09 00:00:52 +01:00
case NIL : return 0 ;
2014-02-10 02:10:30 +01:00
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 : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
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 ) {
2016-03-09 00:00:52 +01:00
case NIL : return 0 ;
2014-02-10 02:10:30 +01:00
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 : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
case NIL : return 0 ;
case BOOL : return _data . _bool ? 1 : 0 ;
case INT : return _data . _int ;
case REAL : return _data . _real ;
2018-08-14 09:56:10 +02:00
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 ) {
2014-02-10 02:10:30 +01: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 ( ) ;
default : {
return 0 ;
}
}
}
2020-02-12 18:24:06 +01:00
Variant : : operator ObjectID ( ) const {
if ( type = = INT ) {
return ObjectID ( _data . _int ) ;
} else {
return ObjectID ( ) ;
}
}
2014-02-10 02:10:30 +01:00
# ifdef NEED_LONG_INT
Variant : : operator signed long ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2014-02-10 02:10:30 +01: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 ( ) ;
default : {
return 0 ;
}
}
return 0 ;
} ;
Variant : : operator unsigned long ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2014-02-10 02:10:30 +01: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 ( ) ;
default : {
return 0 ;
}
}
return 0 ;
} ;
# endif
Variant : : operator signed short ( ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2016-03-09 00:00:52 +01:00
case NIL : return 0 ;
2014-02-10 02:10:30 +01:00
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 : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
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 ) {
2016-03-09 00:00:52 +01:00
case NIL : return 0 ;
2014-02-10 02:10:30 +01:00
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 : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
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 ) {
2016-03-09 00:00:52 +01:00
case NIL : return 0 ;
2014-02-10 02:10:30 +01:00
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 : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
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 ) {
2016-03-09 00:00:52 +01:00
case NIL : return 0 ;
2014-02-10 02:10:30 +01:00
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 : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
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 ) {
2016-03-09 00:00:52 +01:00
case NIL : return 0 ;
2014-02-10 02:10:30 +01:00
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 ( ) ;
default : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
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 ) {
2016-03-09 00:00:52 +01:00
case NIL : return 0 ;
2014-02-10 02:10:30 +01:00
case BOOL : return _data . _bool ? 1.0 : 0.0 ;
2017-01-09 00:58:39 +01:00
case INT : return ( double ) _data . _int ;
2014-02-10 02:10:30 +01:00
case REAL : return _data . _real ;
case STRING : return operator String ( ) . to_double ( ) ;
default : {
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
return 0 ;
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
}
Variant : : operator StringName ( ) const {
2016-03-09 00:00:52 +01:00
2020-02-20 22:58:05 +01:00
if ( type = = STRING_NAME ) {
return * reinterpret_cast < const StringName * > ( _data . _mem ) ;
} else if ( type = = STRING ) {
return * reinterpret_cast < const String * > ( _data . _mem ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-20 22:58:05 +01:00
return StringName ( ) ;
2014-02-10 02:10:30 +01:00
}
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 ) ;
}
String Variant : : stringify ( List < const void * > & stack ) const {
2017-03-05 16:44:50 +01:00
switch ( type ) {
2016-03-09 00:00:52 +01:00
2017-01-08 21:23:04 +01:00
case NIL : return " Null " ;
2014-02-10 02:10:30 +01:00
case BOOL : return _data . _bool ? " True " : " False " ;
2017-01-09 00:58:39 +01:00
case INT : return itos ( _data . _int ) ;
case REAL : return rtos ( _data . _real ) ;
2017-03-05 16:44:50 +01:00
case STRING : return * reinterpret_cast < const String * > ( _data . _mem ) ;
case VECTOR2 : return " ( " + operator Vector2 ( ) + " ) " ;
2020-02-22 04:26:41 +01:00
case VECTOR2I : return " ( " + operator Vector2i ( ) + " ) " ;
2017-03-05 16:44:50 +01:00
case RECT2 : return " ( " + operator Rect2 ( ) + " ) " ;
2020-02-22 04:26:41 +01:00
case RECT2I : return " ( " + operator Rect2i ( ) + " ) " ;
2017-01-11 04:52:51 +01:00
case TRANSFORM2D : {
2016-07-28 14:41:15 +02:00
2017-01-11 04:52:51 +01:00
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 ;
2017-03-05 16:44:50 +01:00
case VECTOR3 : return " ( " + operator Vector3 ( ) + " ) " ;
2020-02-22 04:26:41 +01:00
case VECTOR3I : return " ( " + operator Vector3i ( ) + " ) " ;
2017-03-05 16:44:50 +01:00
case PLANE :
return operator Plane ( ) ;
2016-03-09 00:00:52 +01:00
//case QUAT:
2017-11-17 03:09:00 +01:00
case AABB : return operator : : AABB ( ) ;
2017-03-05 16:44:50 +01:00
case QUAT : return " ( " + operator Quat ( ) + " ) " ;
2017-01-11 04:52:51 +01:00
case BASIS : {
2016-07-28 14:41:15 +02:00
2017-01-11 04:52:51 +01:00
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 + + ) {
2016-07-28 14:41:15 +02:00
2017-03-05 16:44:50 +01:00
if ( i ! = 0 )
mtx + = " , " ;
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 + + ) {
2016-07-28 14:41:15 +02:00
2017-03-05 16:44:50 +01:00
if ( j ! = 0 )
mtx + = " , " ;
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 ;
2014-02-10 02:10:30 +01:00
case TRANSFORM : return operator Transform ( ) ;
2020-02-20 22:58:05 +01:00
case STRING_NAME : return operator StringName ( ) ;
2014-02-10 02:10:30 +01:00
case NODE_PATH : return operator NodePath ( ) ;
2017-03-05 16:44:50 +01:00
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 : {
2016-03-09 00:00:52 +01:00
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 + + ) {
if ( i > 0 )
str + = " , " ;
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
2014-02-10 02:10:30 +01:00
return str ;
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR2_ARRAY : {
2016-05-04 15:04:12 +02:00
2020-02-17 22:06:54 +01:00
Vector < Vector2 > vec = operator Vector < Vector2 > ( ) ;
2016-07-02 15:54:37 +02:00
String str ( " [ " ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < vec . size ( ) ; i + + ) {
2016-05-04 15:04:12 +02:00
2017-03-05 16:44:50 +01:00
if ( i > 0 )
str + = " , " ;
str = str + Variant ( vec [ i ] ) ;
2016-05-04 15:04:12 +02:00
}
2016-07-02 15:54:37 +02:00
str + = " ] " ;
2016-05-04 15:04:12 +02:00
return str ;
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR3_ARRAY : {
2016-03-09 00:00:52 +01:00
2020-02-17 22:06:54 +01:00
Vector < Vector3 > vec = operator Vector < Vector3 > ( ) ;
2016-07-02 15:54:37 +02:00
String str ( " [ " ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < vec . size ( ) ; i + + ) {
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
if ( i > 0 )
str + = " , " ;
str = str + Variant ( vec [ i ] ) ;
2014-02-10 02:10:30 +01:00
}
2016-07-02 15:54:37 +02:00
str + = " ] " ;
2014-02-10 02:10:30 +01:00
return str ;
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_STRING_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
Vector < String > vec = operator Vector < String > ( ) ;
2016-07-02 15:54:37 +02:00
String str ( " [ " ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < vec . size ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( i > 0 )
str + = " , " ;
str = str + vec [ i ] ;
2014-02-10 02:10:30 +01:00
}
2016-07-02 15:54:37 +02:00
str + = " ] " ;
2014-02-10 02:10:30 +01:00
return str ;
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_INT_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
Vector < int > vec = operator Vector < int > ( ) ;
2016-07-02 15:54:37 +02:00
String str ( " [ " ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < vec . size ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( i > 0 )
str + = " , " ;
str = str + itos ( vec [ i ] ) ;
2014-02-10 02:10:30 +01:00
}
2016-07-02 15:54:37 +02:00
str + = " ] " ;
2014-02-10 02:10:30 +01:00
return str ;
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_REAL_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
Vector < real_t > vec = operator Vector < real_t > ( ) ;
2016-07-02 15:54:37 +02:00
String str ( " [ " ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < vec . size ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( i > 0 )
str + = " , " ;
str = str + rtos ( vec [ i ] ) ;
2014-02-10 02:10:30 +01:00
}
2016-07-02 15:54:37 +02:00
str + = " ] " ;
2014-02-10 02:10:30 +01:00
return str ;
} 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 ( ) ) ;
2016-07-02 15:54:37 +02:00
String str ( " [ " ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < arr . size ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
if ( i )
2017-03-05 16:44:50 +01:00
str + = " , " ;
2019-04-20 01:57:29 +02:00
str + = arr [ i ] . stringify ( stack ) ;
}
2016-07-02 15:54:37 +02:00
str + = " ] " ;
2014-02-10 02:10:30 +01:00
return str ;
} break ;
case OBJECT : {
2015-09-04 04:24:55 +02:00
if ( _get_obj ( ) . obj ) {
2020-02-13 20:03:10 +01:00
if ( ! _get_obj ( ) . id . is_reference ( ) & & ObjectDB : : get_instance ( _get_obj ( ) . id ) = = nullptr ) {
return " [Freed Object] " ;
2017-03-05 16:44:50 +01:00
} ;
2020-02-13 20:03:10 +01:00
2019-04-10 07:07:40 +02:00
return _get_obj ( ) . obj - > to_string ( ) ;
2015-09-04 04:24:55 +02:00
} else
2014-02-10 02:10:30 +01:00
return " [Object:null] " ;
} break ;
2020-02-19 20:27:19 +01:00
case CALLABLE : {
const Callable & c = * reinterpret_cast < const Callable * > ( _data . _mem ) ;
return c ;
} break ;
case SIGNAL : {
const Signal & s = * reinterpret_cast < const Signal * > ( _data . _mem ) ;
return s ;
} break ;
case _RID : {
const RID & s = * reinterpret_cast < const RID * > ( _data . _mem ) ;
return " RID( " + itos ( s . get_id ( ) ) + " ) " ;
} break ;
2014-02-10 02:10:30 +01:00
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 {
2017-03-05 16:44:50 +01:00
if ( type = = VECTOR2 )
return * reinterpret_cast < const Vector2 * > ( _data . _mem ) ;
2020-02-22 04:26:41 +01:00
else if ( type = = VECTOR2I )
return * reinterpret_cast < const Vector2i * > ( _data . _mem ) ;
2017-03-05 16:44:50 +01:00
else if ( type = = VECTOR3 )
return Vector2 ( reinterpret_cast < const Vector3 * > ( _data . _mem ) - > x , reinterpret_cast < const Vector3 * > ( _data . _mem ) - > y ) ;
2020-02-22 04:26:41 +01:00
else if ( type = = VECTOR3I )
return Vector2 ( reinterpret_cast < const Vector3i * > ( _data . _mem ) - > x , reinterpret_cast < const Vector3i * > ( _data . _mem ) - > y ) ;
2014-02-10 02:10:30 +01:00
else
return Vector2 ( ) ;
}
2020-02-22 04:26:41 +01:00
Variant : : operator Vector2i ( ) const {
if ( type = = VECTOR2I )
return * reinterpret_cast < const Vector2i * > ( _data . _mem ) ;
else if ( type = = VECTOR2 )
return * reinterpret_cast < const Vector2 * > ( _data . _mem ) ;
else if ( type = = VECTOR3 )
return Vector2 ( reinterpret_cast < const Vector3 * > ( _data . _mem ) - > x , reinterpret_cast < const Vector3 * > ( _data . _mem ) - > y ) ;
else if ( type = = VECTOR3I )
return Vector2 ( reinterpret_cast < const Vector3i * > ( _data . _mem ) - > x , reinterpret_cast < const Vector3i * > ( _data . _mem ) - > y ) ;
else
return Vector2i ( ) ;
}
2014-02-10 02:10:30 +01:00
Variant : : operator Rect2 ( ) const {
2017-03-05 16:44:50 +01:00
if ( type = = RECT2 )
return * reinterpret_cast < const Rect2 * > ( _data . _mem ) ;
2020-02-22 04:26:41 +01:00
else if ( type = = RECT2I )
return * reinterpret_cast < const Rect2i * > ( _data . _mem ) ;
2014-02-10 02:10:30 +01:00
else
return Rect2 ( ) ;
}
2020-02-22 04:26:41 +01:00
Variant : : operator Rect2i ( ) const {
if ( type = = RECT2I )
return * reinterpret_cast < const Rect2i * > ( _data . _mem ) ;
else if ( type = = RECT2 )
return * reinterpret_cast < const Rect2 * > ( _data . _mem ) ;
else
return Rect2i ( ) ;
}
2014-02-10 02:10:30 +01:00
Variant : : operator Vector3 ( ) const {
2017-03-05 16:44:50 +01:00
if ( type = = VECTOR3 )
return * reinterpret_cast < const Vector3 * > ( _data . _mem ) ;
2020-02-22 04:26:41 +01:00
else if ( type = = VECTOR3I )
return * reinterpret_cast < const Vector3i * > ( _data . _mem ) ;
2018-02-21 13:38:21 +01:00
else if ( type = = VECTOR2 )
return Vector3 ( reinterpret_cast < const Vector2 * > ( _data . _mem ) - > x , reinterpret_cast < const Vector2 * > ( _data . _mem ) - > y , 0.0 ) ;
2020-02-22 04:26:41 +01:00
else if ( type = = VECTOR2I )
return Vector3 ( reinterpret_cast < const Vector2i * > ( _data . _mem ) - > x , reinterpret_cast < const Vector2i * > ( _data . _mem ) - > y , 0.0 ) ;
2014-02-10 02:10:30 +01:00
else
return Vector3 ( ) ;
}
2020-02-22 04:26:41 +01:00
Variant : : operator Vector3i ( ) const {
if ( type = = VECTOR3I )
return * reinterpret_cast < const Vector3i * > ( _data . _mem ) ;
else if ( type = = VECTOR3 )
return * reinterpret_cast < const Vector3 * > ( _data . _mem ) ;
else if ( type = = VECTOR2 )
return Vector3i ( reinterpret_cast < const Vector2 * > ( _data . _mem ) - > x , reinterpret_cast < const Vector2 * > ( _data . _mem ) - > y , 0.0 ) ;
else if ( type = = VECTOR2I )
return Vector3i ( reinterpret_cast < const Vector2i * > ( _data . _mem ) - > x , reinterpret_cast < const Vector2i * > ( _data . _mem ) - > y , 0.0 ) ;
else
return Vector3i ( ) ;
}
2014-02-10 02:10:30 +01:00
Variant : : operator Plane ( ) const {
2017-03-05 16:44:50 +01:00
if ( type = = PLANE )
return * reinterpret_cast < const Plane * > ( _data . _mem ) ;
2014-02-10 02:10:30 +01:00
else
return Plane ( ) ;
}
2017-11-17 03:09:00 +01:00
Variant : : operator : : AABB ( ) const {
2014-02-10 02:10:30 +01:00
2017-11-17 03:09:00 +01:00
if ( type = = AABB )
return * _data . _aabb ;
2014-02-10 02:10:30 +01:00
else
2017-11-17 03:09:00 +01:00
return : : AABB ( ) ;
2014-02-10 02:10:30 +01:00
}
2017-01-11 04:52:51 +01:00
Variant : : operator Basis ( ) const {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( type = = BASIS )
2017-01-11 04:52:51 +01:00
return * _data . _basis ;
2017-03-05 16:44:50 +01:00
else if ( type = = QUAT )
return * reinterpret_cast < const Quat * > ( _data . _mem ) ;
2017-11-20 22:41:22 +01:00
else if ( type = = VECTOR3 ) {
return Basis ( * reinterpret_cast < const Vector3 * > ( _data . _mem ) ) ;
} else if ( type = = TRANSFORM ) // unexposed in Variant::can_convert?
2014-05-14 06:22:15 +02:00
return _data . _transform - > basis ;
2014-02-10 02:10:30 +01:00
else
2017-01-11 04:52:51 +01:00
return Basis ( ) ;
2014-02-10 02:10:30 +01:00
}
Variant : : operator Quat ( ) const {
2017-03-05 16:44:50 +01:00
if ( type = = QUAT )
return * reinterpret_cast < const Quat * > ( _data . _mem ) ;
else if ( type = = BASIS )
return * _data . _basis ;
else if ( type = = TRANSFORM )
return _data . _transform - > basis ;
2014-02-10 02:10:30 +01:00
else
return Quat ( ) ;
}
Variant : : operator Transform ( ) const {
2017-03-05 16:44:50 +01:00
if ( type = = TRANSFORM )
2014-02-10 02:10:30 +01:00
return * _data . _transform ;
2017-03-05 16:44:50 +01:00
else if ( type = = BASIS )
return Transform ( * _data . _basis , Vector3 ( ) ) ;
else if ( type = = QUAT )
return Transform ( Basis ( * reinterpret_cast < const Quat * > ( _data . _mem ) ) , Vector3 ( ) ) ;
2018-11-26 05:57:40 +01:00
else if ( type = = TRANSFORM2D ) {
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 ;
} else
2014-02-10 02:10:30 +01:00
return Transform ( ) ;
}
2017-03-05 16:44:50 +01:00
Variant : : operator Transform2D ( ) const {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ;
} else
return Transform2D ( ) ;
2014-02-10 02:10:30 +01:00
}
Variant : : operator Color ( ) const {
2017-03-05 16:44:50 +01:00
if ( type = = COLOR )
return * reinterpret_cast < const Color * > ( _data . _mem ) ;
else if ( type = = STRING )
return Color : : html ( operator String ( ) ) ;
else if ( type = = INT )
return Color : : hex ( operator int ( ) ) ;
2014-02-10 02:10:30 +01:00
else
return Color ( ) ;
}
Variant : : operator NodePath ( ) const {
2017-03-05 16:44:50 +01:00
if ( type = = NODE_PATH )
return * reinterpret_cast < const NodePath * > ( _data . _mem ) ;
else if ( type = = STRING )
2014-02-10 02:10:30 +01:00
return NodePath ( operator String ( ) ) ;
else
return NodePath ( ) ;
}
Variant : : operator RID ( ) const {
2017-03-05 16:44:50 +01:00
if ( type = = _RID )
return * reinterpret_cast < const RID * > ( _data . _mem ) ;
2020-02-13 20:03:10 +01:00
else if ( type = = OBJECT & & _get_obj ( ) . obj = = nullptr ) {
return RID ( ) ;
2017-03-05 16:44:50 +01:00
} else if ( type = = OBJECT & & _get_obj ( ) . obj ) {
2019-01-26 19:41:26 +01:00
# ifdef DEBUG_ENABLED
if ( ScriptDebugger : : get_singleton ( ) ) {
2020-02-13 20:03:10 +01:00
ERR_FAIL_COND_V_MSG ( ObjectDB : : get_instance ( _get_obj ( ) . id ) = = nullptr , RID ( ) , " Invalid pointer (object was freed). " ) ;
2019-01-26 19:41:26 +01:00
} ;
# endif
2020-02-19 20:27:19 +01:00
Callable : : CallError ce ;
2017-03-05 16:44:50 +01:00
Variant ret = _get_obj ( ) . obj - > call ( CoreStringNames : : get_singleton ( ) - > get_rid , NULL , 0 , ce ) ;
2020-02-19 20:27:19 +01:00
if ( ce . error = = Callable : : CallError : : CALL_OK & & ret . get_type ( ) = = Variant : : _RID ) {
2015-04-25 01:45:07 +02:00
return ret ;
}
2014-02-10 02:10:30 +01:00
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 {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( type = = OBJECT )
2014-02-10 02:10:30 +01:00
return _get_obj ( ) . obj ;
else
return NULL ;
}
2020-02-13 20:03:10 +01:00
Object * Variant : : get_validated_object_with_check ( bool & r_previously_freed ) const {
if ( type = = OBJECT ) {
Object * instance = ObjectDB : : get_instance ( _get_obj ( ) . id ) ;
r_previously_freed = ! instance & & _get_obj ( ) . id ! = ObjectID ( ) ;
return instance ;
} else {
r_previously_freed = false ;
return NULL ;
}
}
Object * Variant : : get_validated_object ( ) const {
if ( type = = OBJECT )
return ObjectDB : : get_instance ( _get_obj ( ) . id ) ;
else
return NULL ;
}
2017-03-05 16:44:50 +01:00
Variant : : operator Node * ( ) const {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( type = = OBJECT )
2017-08-24 22:58:51 +02:00
return Object : : cast_to < Node > ( _get_obj ( ) . obj ) ;
2014-02-10 02:10:30 +01:00
else
return NULL ;
}
2017-03-05 16:44:50 +01:00
Variant : : operator Control * ( ) const {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( type = = OBJECT )
2017-08-24 22:58:51 +02:00
return Object : : cast_to < Control > ( _get_obj ( ) . obj ) ;
2014-02-10 02:10:30 +01:00
else
return NULL ;
}
Variant : : operator Dictionary ( ) const {
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
if ( type = = DICTIONARY )
return * reinterpret_cast < const Dictionary * > ( _data . _mem ) ;
2014-02-10 02:10:30 +01:00
else
return Dictionary ( ) ;
}
2020-02-19 20:27:19 +01:00
Variant : : operator Callable ( ) const {
if ( type = = CALLABLE )
return * reinterpret_cast < const Callable * > ( _data . _mem ) ;
else
return Callable ( ) ;
}
Variant : : operator Signal ( ) const {
if ( type = = SIGNAL )
return * reinterpret_cast < const Signal * > ( _data . _mem ) ;
else
return Signal ( ) ;
}
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 + + ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
switch ( p_variant . get_type ( ) ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
case Variant : : ARRAY : {
return _convert_array < DA , Array > ( p_variant . operator Array ( ) ) ;
}
2020-02-17 22:06:54 +01:00
case Variant : : PACKED_BYTE_ARRAY : {
return _convert_array < DA , Vector < uint8_t > > ( p_variant . operator Vector < uint8_t > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
2020-02-17 22:06:54 +01:00
case Variant : : PACKED_INT_ARRAY : {
return _convert_array < DA , Vector < int > > ( p_variant . operator Vector < int > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
2020-02-17 22:06:54 +01:00
case Variant : : PACKED_REAL_ARRAY : {
return _convert_array < DA , Vector < real_t > > ( p_variant . operator Vector < real_t > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
2020-02-17 22:06:54 +01:00
case Variant : : PACKED_STRING_ARRAY : {
return _convert_array < DA , Vector < String > > ( p_variant . operator Vector < String > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
2020-02-17 22:06:54 +01:00
case Variant : : PACKED_VECTOR2_ARRAY : {
return _convert_array < DA , Vector < Vector2 > > ( p_variant . operator Vector < Vector2 > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
2020-02-17 22:06:54 +01:00
case Variant : : PACKED_VECTOR3_ARRAY : {
return _convert_array < DA , Vector < Vector3 > > ( p_variant . operator Vector < Vector3 > ( ) ) ;
2017-03-05 16:44:50 +01:00
}
2020-02-17 22:06:54 +01:00
case Variant : : PACKED_COLOR_ARRAY : {
return _convert_array < DA , Vector < Color > > ( p_variant . operator Vector < 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 {
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
if ( type = = ARRAY )
return * reinterpret_cast < const Array * > ( _data . _mem ) ;
2016-03-09 00:00:52 +01:00
else
2017-03-05 16:44:50 +01:00
return _convert_array_from_variant < Array > ( * this ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : operator Vector < uint8_t > ( ) const {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
if ( type = = PACKED_BYTE_ARRAY )
2020-02-23 22:01:26 +01:00
return static_cast < PackedArrayRef < uint8_t > * > ( _data . packed_array ) - > array ;
2014-02-10 02:10:30 +01:00
else
2020-02-17 22:06:54 +01:00
return _convert_array_from_variant < Vector < uint8_t > > ( * this ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : operator Vector < int > ( ) const {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
if ( type = = PACKED_INT_ARRAY )
2020-02-23 22:01:26 +01:00
return static_cast < PackedArrayRef < int32_t > * > ( _data . packed_array ) - > array ;
2014-02-10 02:10:30 +01:00
else
2020-02-17 22:06:54 +01:00
return _convert_array_from_variant < Vector < int > > ( * this ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : operator Vector < real_t > ( ) const {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
if ( type = = PACKED_REAL_ARRAY )
2020-02-23 22:01:26 +01:00
return static_cast < PackedArrayRef < real_t > * > ( _data . packed_array ) - > array ;
2014-02-10 02:10:30 +01:00
else
2020-02-17 22:06:54 +01:00
return _convert_array_from_variant < Vector < real_t > > ( * this ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : operator Vector < String > ( ) const {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
if ( type = = PACKED_STRING_ARRAY )
2020-02-23 22:01:26 +01:00
return static_cast < PackedArrayRef < String > * > ( _data . packed_array ) - > array ;
2014-02-10 02:10:30 +01:00
else
2020-02-17 22:06:54 +01:00
return _convert_array_from_variant < Vector < String > > ( * this ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : operator Vector < Vector3 > ( ) const {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
if ( type = = PACKED_VECTOR3_ARRAY )
2020-02-23 22:01:26 +01:00
return static_cast < PackedArrayRef < Vector3 > * > ( _data . packed_array ) - > array ;
2014-02-10 02:10:30 +01:00
else
2020-02-17 22:06:54 +01:00
return _convert_array_from_variant < Vector < Vector3 > > ( * this ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : operator Vector < Vector2 > ( ) const {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
if ( type = = PACKED_VECTOR2_ARRAY )
2020-02-23 22:01:26 +01:00
return static_cast < PackedArrayRef < Vector2 > * > ( _data . packed_array ) - > array ;
2014-02-10 02:10:30 +01:00
else
2020-02-17 22:06:54 +01:00
return _convert_array_from_variant < Vector < Vector2 > > ( * this ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : operator Vector < Color > ( ) const {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
if ( type = = PACKED_COLOR_ARRAY )
2020-02-23 22:01:26 +01:00
return static_cast < PackedArrayRef < Color > * > ( _data . packed_array ) - > array ;
2014-02-10 02:10:30 +01:00
else
2020-02-17 22:06:54 +01:00
return _convert_array_from_variant < Vector < Color > > ( * this ) ;
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 ( ) ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < rids . size ( ) ; i + + )
2018-07-25 03:11:03 +02:00
rids . write [ i ] = va [ i ] ;
2014-02-10 02:10:30 +01:00
return rids ;
}
2020-02-17 22:06:54 +01:00
Variant : : operator Vector < Plane > ( ) const {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
Array va = operator Array ( ) ;
2020-02-17 22:06:54 +01:00
Vector < Plane > planes ;
2017-03-05 16:44:50 +01:00
int va_size = va . size ( ) ;
if ( va_size = = 0 )
2014-02-10 02:10:30 +01:00
return planes ;
planes . resize ( va_size ) ;
2020-02-17 22:06:54 +01:00
Plane * w = planes . ptrw ( ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < va_size ; i + + )
w [ i ] = va [ i ] ;
2014-02-10 02:10:30 +01:00
return planes ;
}
2020-02-17 22:06:54 +01:00
Variant : : operator Vector < Face3 > ( ) const {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
Vector < Vector3 > va = operator Vector < Vector3 > ( ) ;
Vector < Face3 > faces ;
2017-03-05 16:44:50 +01:00
int va_size = va . size ( ) ;
if ( va_size = = 0 )
2014-02-10 02:10:30 +01:00
return faces ;
2017-03-05 16:44:50 +01:00
faces . resize ( va_size / 3 ) ;
2020-02-17 22:06:54 +01:00
Face3 * w = faces . ptrw ( ) ;
const Vector3 * r = va . ptr ( ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < va_size ; i + + )
w [ i / 3 ] . vertex [ i % 3 ] = r [ i ] ;
2014-02-10 02:10:30 +01:00
return faces ;
}
2020-02-17 22:06:54 +01:00
Variant : : operator Vector < Variant > ( ) const {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
Array va = operator Array ( ) ;
2020-02-17 22:06:54 +01:00
Vector < Variant > variants ;
2017-03-05 16:44:50 +01:00
int va_size = va . size ( ) ;
if ( va_size = = 0 )
2020-02-17 22:06:54 +01:00
return variants ;
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
variants . resize ( va_size ) ;
Variant * w = variants . ptrw ( ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < va_size ; i + + )
2020-02-17 22:06:54 +01:00
w [ i ] = variants [ i ] ;
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
return variants ;
2014-02-10 02:10:30 +01:00
}
2018-06-25 21:21:57 +02:00
Variant : : operator Vector < StringName > ( ) const {
2020-02-17 22:06:54 +01:00
Vector < String > from = operator Vector < String > ( ) ;
2018-06-25 21:21:57 +02:00
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 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 {
2020-02-17 22:06:54 +01:00
if ( type = = PACKED_REAL_ARRAY | | type = = PACKED_INT_ARRAY | | type = = PACKED_BYTE_ARRAY ) {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
Vector < int > addr = operator Vector < int > ( ) ;
2017-03-05 16:44:50 +01:00
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 ) {
2016-03-09 00:00:52 +01:00
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 ) {
2016-03-09 00:00:52 +01:00
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
}
2020-02-12 18:24:06 +01:00
Variant : : Variant ( const ObjectID & p_id ) {
type = INT ;
_data . _int = p_id ;
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const StringName & p_string ) {
2016-03-09 00:00:52 +01:00
2020-02-20 22:58:05 +01:00
type = STRING_NAME ;
memnew_placement ( _data . _mem , StringName ( p_string ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const String & p_string ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
type = VECTOR3 ;
memnew_placement ( _data . _mem , Vector3 ( p_vector3 ) ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-22 04:26:41 +01:00
Variant : : Variant ( const Vector3i & p_vector3i ) {
type = VECTOR3I ;
memnew_placement ( _data . _mem , Vector3i ( p_vector3i ) ) ;
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Vector2 & p_vector2 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
type = VECTOR2 ;
memnew_placement ( _data . _mem , Vector2 ( p_vector2 ) ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-22 04:26:41 +01:00
Variant : : Variant ( const Vector2i & p_vector2i ) {
type = VECTOR2I ;
memnew_placement ( _data . _mem , Vector2i ( p_vector2i ) ) ;
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Rect2 & p_rect2 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
type = RECT2 ;
memnew_placement ( _data . _mem , Rect2 ( p_rect2 ) ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-22 04:26:41 +01:00
Variant : : Variant ( const Rect2i & p_rect2i ) {
type = RECT2I ;
memnew_placement ( _data . _mem , Rect2i ( p_rect2i ) ) ;
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Plane & p_plane ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-11-17 03:09:00 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 RID & p_rid ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
type = OBJECT ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
memnew_placement ( _data . _mem , ObjData ) ;
2020-02-13 20:03:10 +01:00
if ( p_object ) {
if ( p_object - > is_reference ( ) ) {
Reference * reference = const_cast < Reference * > ( static_cast < const Reference * > ( p_object ) ) ;
if ( ! reference - > init_ref ( ) ) {
_get_obj ( ) . obj = nullptr ;
_get_obj ( ) . id = ObjectID ( ) ;
return ;
}
}
_get_obj ( ) . obj = const_cast < Object * > ( p_object ) ;
_get_obj ( ) . id = p_object - > get_instance_id ( ) ;
} else {
_get_obj ( ) . obj = nullptr ;
_get_obj ( ) . id = ObjectID ( ) ;
}
2014-02-10 02:10:30 +01:00
}
2020-02-19 20:27:19 +01:00
Variant : : Variant ( const Callable & p_callable ) {
type = CALLABLE ;
memnew_placement ( _data . _mem , Callable ( p_callable ) ) ;
}
Variant : : Variant ( const Signal & p_callable ) {
type = SIGNAL ;
memnew_placement ( _data . _mem , Signal ( p_callable ) ) ;
}
2017-03-05 16:44:50 +01:00
Variant : : Variant ( const Dictionary & p_dictionary ) {
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 Vector < Plane > & p_array ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 + + ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 + + ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
rid_array - > set ( i , Variant ( p_array [ i ] ) ) ;
2014-02-10 02:10:30 +01:00
}
}
2020-02-17 22:06:54 +01:00
Variant : : Variant ( const Vector < uint8_t > & p_raw_array ) {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
type = PACKED_BYTE_ARRAY ;
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < uint8_t > : : create ( p_raw_array ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : Variant ( const Vector < int > & p_int_array ) {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
type = PACKED_INT_ARRAY ;
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < int32_t > : : create ( p_int_array ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : Variant ( const Vector < real_t > & p_real_array ) {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
type = PACKED_REAL_ARRAY ;
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < real_t > : : create ( p_real_array ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : Variant ( const Vector < String > & p_string_array ) {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
type = PACKED_STRING_ARRAY ;
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < String > : : create ( p_string_array ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : Variant ( const Vector < Vector3 > & p_vector3_array ) {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
type = PACKED_VECTOR3_ARRAY ;
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < Vector3 > : : create ( p_vector3_array ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : Variant ( const Vector < Vector2 > & p_vector2_array ) {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
type = PACKED_VECTOR2_ARRAY ;
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < Vector2 > : : create ( p_vector2_array ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : Variant ( const Vector < Color > & p_color_array ) {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
type = PACKED_COLOR_ARRAY ;
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < Color > : : create ( p_color_array ) ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : Variant ( const Vector < Face3 > & p_face_array ) {
2014-02-10 02:10:30 +01:00
2020-02-17 22:06:54 +01:00
Vector < 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 ) {
2020-02-17 22:06:54 +01:00
const Face3 * r = p_face_array . ptr ( ) ;
Vector3 * w = vertices . ptrw ( ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < face_count ; i + + ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < 3 ; j + + )
w [ i * 3 + j ] = r [ i ] . vertex [ j ] ;
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 ;
2020-02-17 22:06:54 +01:00
Array arr ;
arr . resize ( p_array . size ( ) ) ;
for ( int i = 0 ; i < p_array . size ( ) ; i + + ) {
arr [ i ] = p_array [ i ] ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
* this = arr ;
2014-02-10 02:10:30 +01:00
}
2020-02-17 22:06:54 +01:00
Variant : : Variant ( const Vector < StringName > & p_array ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
type = NIL ;
2020-02-17 22:06:54 +01:00
Vector < 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 ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < len ; i + + )
v . set ( i , p_array [ i ] ) ;
* 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 ) {
2014-02-10 02:10:30 +01:00
2017-09-20 11:04:50 +02:00
if ( unlikely ( this = = & p_variant ) )
2017-09-19 01:46:48 +02:00
return ;
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR2I : {
* reinterpret_cast < Vector2i * > ( _data . _mem ) = * reinterpret_cast < const Vector2i * > ( p_variant . _data . _mem ) ;
} break ;
2017-09-19 01:46:48 +02:00
case RECT2 : {
* reinterpret_cast < Rect2 * > ( _data . _mem ) = * reinterpret_cast < const Rect2 * > ( p_variant . _data . _mem ) ;
} break ;
2020-02-22 04:26:41 +01:00
case RECT2I : {
* reinterpret_cast < Rect2i * > ( _data . _mem ) = * reinterpret_cast < const Rect2i * > ( p_variant . _data . _mem ) ;
} break ;
2017-09-19 01:46:48 +02:00
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR3I : {
* reinterpret_cast < Vector3i * > ( _data . _mem ) = * reinterpret_cast < const Vector3i * > ( p_variant . _data . _mem ) ;
} break ;
2017-09-19 01:46:48 +02:00
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 : {
2017-09-19 01:46:48 +02:00
2017-11-17 03:09:00 +01:00
* _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-02-13 20:03:10 +01:00
if ( _get_obj ( ) . id . is_reference ( ) ) {
//we are safe that there is a reference here
Reference * reference = static_cast < Reference * > ( _get_obj ( ) . obj ) ;
if ( reference - > unreference ( ) ) {
memdelete ( reference ) ;
}
}
if ( p_variant . _get_obj ( ) . obj & & p_variant . _get_obj ( ) . id . is_reference ( ) ) {
Reference * reference = static_cast < Reference * > ( p_variant . _get_obj ( ) . obj ) ;
if ( ! reference - > reference ( ) ) {
_get_obj ( ) . obj = nullptr ;
_get_obj ( ) . id = ObjectID ( ) ;
break ;
}
}
_get_obj ( ) . obj = const_cast < Object * > ( p_variant . _get_obj ( ) . obj ) ;
_get_obj ( ) . id = p_variant . _get_obj ( ) . id ;
2017-09-19 01:46:48 +02:00
} break ;
2020-02-19 20:27:19 +01:00
case CALLABLE : {
* reinterpret_cast < Callable * > ( _data . _mem ) = * reinterpret_cast < const Callable * > ( p_variant . _data . _mem ) ;
} break ;
case SIGNAL : {
* reinterpret_cast < Signal * > ( _data . _mem ) = * reinterpret_cast < const Signal * > ( p_variant . _data . _mem ) ;
} break ;
2020-02-20 22:58:05 +01:00
case STRING_NAME : {
* reinterpret_cast < StringName * > ( _data . _mem ) = * reinterpret_cast < const StringName * > ( p_variant . _data . _mem ) ;
} break ;
2017-09-19 01:46:48 +02:00
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
2020-02-17 22:06:54 +01:00
case PACKED_BYTE_ARRAY : {
2017-09-19 01:46:48 +02:00
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < uint8_t > : : reference_from ( _data . packed_array , p_variant . _data . packed_array ) ;
2017-09-19 01:46:48 +02:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_INT_ARRAY : {
2017-09-19 01:46:48 +02:00
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < int32_t > : : reference_from ( _data . packed_array , p_variant . _data . packed_array ) ;
2017-09-19 01:46:48 +02:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_REAL_ARRAY : {
2017-09-19 01:46:48 +02:00
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < real_t > : : reference_from ( _data . packed_array , p_variant . _data . packed_array ) ;
2017-09-19 01:46:48 +02:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_STRING_ARRAY : {
2017-09-19 01:46:48 +02:00
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < String > : : reference_from ( _data . packed_array , p_variant . _data . packed_array ) ;
2017-09-19 01:46:48 +02:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR2_ARRAY : {
2017-09-19 01:46:48 +02:00
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < Vector2 > : : reference_from ( _data . packed_array , p_variant . _data . packed_array ) ;
2017-09-19 01:46:48 +02:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR3_ARRAY : {
2017-09-19 01:46:48 +02:00
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < Vector3 > : : reference_from ( _data . packed_array , p_variant . _data . packed_array ) ;
2017-09-19 01:46:48 +02:00
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_COLOR_ARRAY : {
2017-09-19 01:46:48 +02:00
2020-02-23 22:01:26 +01:00
_data . packed_array = PackedArrayRef < Color > : : reference_from ( _data . packed_array , p_variant . _data . packed_array ) ;
2017-09-19 01:46:48 +02:00
} 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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ) {
2017-03-05 16:20:07 +01:00
2017-03-05 16:44:50 +01:00
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR2I : {
uint32_t hash = hash_djb2_one_32 ( reinterpret_cast < const Vector2i * > ( _data . _mem ) - > x ) ;
return hash_djb2_one_32 ( reinterpret_cast < const Vector2i * > ( _data . _mem ) - > y , hash ) ;
} break ;
2014-02-10 02:10:30 +01:00
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 ;
2020-02-22 04:26:41 +01:00
case RECT2I : {
uint32_t hash = hash_djb2_one_32 ( reinterpret_cast < const Rect2i * > ( _data . _mem ) - > position . x ) ;
hash = hash_djb2_one_32 ( reinterpret_cast < const Rect2i * > ( _data . _mem ) - > position . y , hash ) ;
hash = hash_djb2_one_32 ( reinterpret_cast < const Rect2i * > ( _data . _mem ) - > size . x , hash ) ;
return hash_djb2_one_32 ( reinterpret_cast < const Rect2i * > ( _data . _mem ) - > size . y , hash ) ;
} 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 + + ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR3I : {
uint32_t hash = hash_djb2_one_32 ( reinterpret_cast < const Vector3i * > ( _data . _mem ) - > x ) ;
hash = hash_djb2_one_32 ( reinterpret_cast < const Vector3i * > ( _data . _mem ) - > y , hash ) ;
return hash_djb2_one_32 ( reinterpret_cast < const Vector3i * > ( _data . _mem ) - > z , hash ) ;
} break ;
2014-02-10 02:10:30 +01:00
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 + + ) {
2014-02-10 02:10:30 +01:00
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 + + ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 + + ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
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 : {
return hash_djb2_one_64 ( make_uint64_t ( _get_obj ( ) . obj ) ) ;
} break ;
2020-02-20 22:58:05 +01:00
case STRING_NAME : {
return reinterpret_cast < const StringName * > ( _data . _mem ) - > hash ( ) ;
} break ;
2014-02-10 02:10:30 +01:00
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 ;
2020-02-19 20:27:19 +01:00
case CALLABLE : {
return reinterpret_cast < const Callable * > ( _data . _mem ) - > hash ( ) ;
} break ;
case SIGNAL : {
const Signal & s = * reinterpret_cast < const Signal * > ( _data . _mem ) ;
uint32_t hash = s . get_name ( ) . hash ( ) ;
return hash_djb2_one_64 ( s . get_object_id ( ) , hash ) ;
} break ;
2014-02-10 02:10:30 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_BYTE_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-23 22:01:26 +01:00
const Vector < uint8_t > & arr = PackedArrayRef < uint8_t > : : get_array ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
2020-02-17 22:06:54 +01:00
const uint8_t * r = arr . ptr ( ) ;
2019-01-30 02:12:41 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_INT_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-23 22:01:26 +01:00
const Vector < int32_t > & arr = PackedArrayRef < int32_t > : : get_array ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
2020-02-17 22:06:54 +01:00
const int * r = arr . ptr ( ) ;
2019-01-30 02:12:41 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_REAL_ARRAY : {
2014-02-10 02:10:30 +01:00
2020-02-23 22:01:26 +01:00
const Vector < real_t > & arr = PackedArrayRef < real_t > : : get_array ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
2020-02-17 22:06:54 +01:00
const real_t * r = arr . ptr ( ) ;
2019-01-30 02:12:41 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_STRING_ARRAY : {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
uint32_t hash = 5831 ;
2020-02-23 22:01:26 +01:00
const Vector < String > & arr = PackedArrayRef < String > : : get_array ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
2020-02-17 22:06:54 +01:00
const String * r = arr . ptr ( ) ;
2019-01-30 02:12:41 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR2_ARRAY : {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
uint32_t hash = 5831 ;
2020-02-23 22:01:26 +01:00
const Vector < Vector2 > & arr = PackedArrayRef < Vector2 > : : get_array ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
2020-02-17 22:06:54 +01:00
const Vector2 * r = arr . ptr ( ) ;
2019-01-30 02:12:41 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR3_ARRAY : {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
uint32_t hash = 5831 ;
2020-02-23 22:01:26 +01:00
const Vector < Vector3 > & arr = PackedArrayRef < Vector3 > : : get_array ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
2020-02-17 22:06:54 +01:00
const Vector3 * r = arr . ptr ( ) ;
2019-01-30 02:12:41 +01:00
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 ;
2020-02-17 22:06:54 +01:00
case PACKED_COLOR_ARRAY : {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
uint32_t hash = 5831 ;
2020-02-23 22:01:26 +01:00
const Vector < Color > & arr = PackedArrayRef < Color > : : get_array ( _data . packed_array ) ;
2014-02-10 02:10:30 +01:00
int len = arr . size ( ) ;
2019-01-30 02:12:41 +01:00
if ( likely ( len ) ) {
2020-02-17 22:06:54 +01:00
const Color * r = arr . ptr ( ) ;
2019-01-30 02:12:41 +01:00
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 ) )
2020-02-17 22:06:54 +01:00
# define hash_compare_pool_array(p_lhs, p_rhs, p_type, p_compare_func) \
const Vector < p_type > & l = * reinterpret_cast < const Vector < p_type > * > ( p_lhs ) ; \
const Vector < p_type > & r = * reinterpret_cast < const Vector < p_type > * > ( p_rhs ) ; \
\
if ( l . size ( ) ! = r . size ( ) ) \
return false ; \
\
const p_type * lr = l . ptr ( ) ; \
const p_type * rr = r . ptr ( ) ; \
\
for ( int i = 0 ; i < l . size ( ) ; + + i ) { \
if ( ! p_compare_func ( ( lr [ i ] ) , ( rr [ i ] ) ) ) \
return false ; \
} \
\
2017-03-05 16:44:50 +01:00
return true
bool Variant : : hash_compare ( const Variant & p_variant ) const {
2017-02-15 14:41:16 +01:00
if ( type ! = p_variant . type )
return false ;
2017-03-05 16:44:50 +01:00
switch ( type ) {
2017-02-15 14:41:16 +01:00
case REAL : {
return hash_compare_scalar ( _data . _real , p_variant . _data . _real ) ;
} break ;
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR2I : {
const Vector2i * l = reinterpret_cast < const Vector2i * > ( _data . _mem ) ;
const Vector2i * r = reinterpret_cast < const Vector2i * > ( p_variant . _data . _mem ) ;
return * l = = * r ;
} break ;
2017-02-15 14:41:16 +01:00
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 ) ) & &
2017-03-05 16:44:50 +01:00
( hash_compare_vector2 ( l - > size , r - > size ) ) ;
2017-02-15 14:41:16 +01:00
} break ;
2020-02-22 04:26:41 +01:00
case RECT2I : {
const Rect2i * l = reinterpret_cast < const Rect2i * > ( _data . _mem ) ;
const Rect2i * r = reinterpret_cast < const Rect2i * > ( p_variant . _data . _mem ) ;
return * l = = * r ;
} break ;
2017-02-15 14:41:16 +01:00
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 + + ) {
if ( ! ( hash_compare_vector2 ( l - > elements [ i ] , r - > elements [ i ] ) ) )
2017-02-15 14:41:16 +01:00
return false ;
}
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 ;
2020-02-22 04:26:41 +01:00
case VECTOR3I : {
const Vector3i * l = reinterpret_cast < const Vector3i * > ( _data . _mem ) ;
const Vector3i * r = reinterpret_cast < const Vector3i * > ( p_variant . _data . _mem ) ;
return * l = = * r ;
} break ;
2017-02-15 14:41:16 +01:00
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 ) ) & &
2017-03-05 16:44:50 +01: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 + + ) {
if ( ! ( hash_compare_vector3 ( l - > elements [ i ] , r - > elements [ i ] ) ) )
2017-02-15 14:41:16 +01:00
return false ;
}
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 + + ) {
if ( ! ( hash_compare_vector3 ( l - > basis . elements [ i ] , r - > basis . elements [ i ] ) ) )
2017-02-15 14:41:16 +01:00
return false ;
}
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
2017-03-05 16:44:50 +01:00
if ( l . size ( ) ! = r . size ( ) )
2017-02-15 14:41:16 +01:00
return false ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < l . size ( ) ; + + i ) {
if ( ! l [ i ] . hash_compare ( r [ i ] ) )
2017-02-15 14:41:16 +01:00
return false ;
}
return true ;
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_REAL_ARRAY : {
2017-02-15 14:41:16 +01:00
hash_compare_pool_array ( _data . _mem , p_variant . _data . _mem , real_t , hash_compare_scalar ) ;
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR2_ARRAY : {
2017-02-15 14:41:16 +01:00
hash_compare_pool_array ( _data . _mem , p_variant . _data . _mem , Vector2 , hash_compare_vector2 ) ;
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_VECTOR3_ARRAY : {
2017-02-15 14:41:16 +01:00
hash_compare_pool_array ( _data . _mem , p_variant . _data . _mem , Vector3 , hash_compare_vector3 ) ;
} break ;
2020-02-17 22:06:54 +01:00
case PACKED_COLOR_ARRAY : {
2017-02-15 14:41:16 +01:00
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 {
2020-02-13 20:03:10 +01:00
return type = = OBJECT & & _get_obj ( ) . id . is_reference ( ) ;
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 ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01: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 + + ) {
if ( argptr [ i ] - > get_type ( ) = = Variant : : NIL )
2014-02-10 02:10:30 +01:00
break ;
argc + + ;
}
2020-02-19 20:27:19 +01:00
Callable : : CallError error ;
2014-02-10 02:10:30 +01:00
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
2020-02-19 20:27:19 +01:00
case Callable : : CallError : : CALL_ERROR_INVALID_ARGUMENT : {
2014-02-10 02:10:30 +01:00
2020-02-19 20:27:19 +01:00
String err = " Invalid type for argument # " + itos ( error . argument ) + " , expected ' " + Variant : : get_type_name ( Variant : : Type ( error . expected ) ) + " '. " ;
2014-02-10 02:10:30 +01:00
ERR_PRINT ( err . utf8 ( ) . get_data ( ) ) ;
} break ;
2020-02-19 20:27:19 +01:00
case Callable : : CallError : : CALL_ERROR_INVALID_METHOD : {
2014-02-10 02:10:30 +01:00
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 ;
2020-02-19 20:27:19 +01:00
case Callable : : CallError : : CALL_ERROR_TOO_MANY_ARGUMENTS : {
2014-02-10 02:10:30 +01:00
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 ) {
2015-02-15 05:19:46 +01:00
2017-03-05 16:44:50 +01:00
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 {
2014-12-17 02:31:57 +01:00
2015-12-31 04:54:00 +01:00
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
2020-02-19 20:27:19 +01:00
String Variant : : get_call_error_text ( Object * p_base , const StringName & p_method , const Variant * * p_argptrs , int p_argcount , const Callable : : CallError & ce ) {
2016-01-04 13:35:21 +01:00
String err_text ;
2020-02-19 20:27:19 +01:00
if ( ce . error = = Callable : : CallError : : CALL_ERROR_INVALID_ARGUMENT ) {
2017-03-05 16:44:50 +01:00
int errorarg = ce . argument ;
2018-04-30 21:04:30 +02:00
if ( p_argptrs ) {
2020-02-19 20:27:19 +01:00
err_text = " Cannot convert argument " + itos ( errorarg + 1 ) + " from " + Variant : : get_type_name ( p_argptrs [ errorarg ] - > get_type ( ) ) + " to " + Variant : : get_type_name ( Variant : : Type ( ce . expected ) ) + " . " ;
2018-04-30 21:04:30 +02:00
} else {
2020-02-19 20:27:19 +01:00
err_text = " Cannot convert argument " + itos ( errorarg + 1 ) + " from [missing argptr, type unknown] to " + Variant : : get_type_name ( Variant : : Type ( ce . expected ) ) + " . " ;
2018-04-30 21:04:30 +02:00
}
2020-02-19 20:27:19 +01:00
} else if ( ce . error = = Callable : : CallError : : CALL_ERROR_TOO_MANY_ARGUMENTS ) {
2017-03-05 16:44:50 +01:00
err_text = " Method expected " + itos ( ce . argument ) + " arguments, but called with " + itos ( p_argcount ) + " . " ;
2020-02-19 20:27:19 +01:00
} else if ( ce . error = = Callable : : CallError : : CALL_ERROR_TOO_FEW_ARGUMENTS ) {
2017-03-05 16:44:50 +01:00
err_text = " Method expected " + itos ( ce . argument ) + " arguments, but called with " + itos ( p_argcount ) + " . " ;
2020-02-19 20:27:19 +01:00
} else if ( ce . error = = Callable : : CallError : : CALL_ERROR_INVALID_METHOD ) {
2017-03-05 16:44:50 +01:00
err_text = " Method not found. " ;
2020-02-19 20:27:19 +01:00
} else if ( ce . error = = Callable : : CallError : : CALL_ERROR_INSTANCE_IS_NULL ) {
2017-03-05 16:44:50 +01:00
err_text = " Instance is null " ;
2020-02-19 20:27:19 +01:00
} else if ( ce . error = = Callable : : 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
2020-02-19 20:27:19 +01:00
String Variant : : get_callable_error_text ( const Callable & p_callable , const Variant * * p_argptrs , int p_argcount , const Callable : : CallError & ce ) {
String err_text ;
if ( ce . error = = Callable : : CallError : : CALL_ERROR_INVALID_ARGUMENT ) {
int errorarg = ce . argument ;
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 ( Variant : : Type ( ce . expected ) ) + " . " ;
} else {
err_text = " Cannot convert argument " + itos ( errorarg + 1 ) + " from [missing argptr, type unknown] to " + Variant : : get_type_name ( Variant : : Type ( ce . expected ) ) + " . " ;
}
} else if ( ce . error = = Callable : : CallError : : CALL_ERROR_TOO_MANY_ARGUMENTS ) {
err_text = " Method expected " + itos ( ce . argument ) + " arguments, but called with " + itos ( p_argcount ) + " . " ;
} else if ( ce . error = = Callable : : CallError : : CALL_ERROR_TOO_FEW_ARGUMENTS ) {
err_text = " Method expected " + itos ( ce . argument ) + " arguments, but called with " + itos ( p_argcount ) + " . " ;
} else if ( ce . error = = Callable : : CallError : : CALL_ERROR_INVALID_METHOD ) {
err_text = " Method not found. " ;
} else if ( ce . error = = Callable : : CallError : : CALL_ERROR_INSTANCE_IS_NULL ) {
err_text = " Instance is null " ;
} else if ( ce . error = = Callable : : CallError : : CALL_OK ) {
return " Call OK " ;
}
return String ( p_callable ) + " : " + err_text ;
}
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 ;
}