1 /*************************************************************************/
2 /*  fieldwise.cpp                                                        */
3 /*************************************************************************/
4 /*                       This file is part of:                           */
5 /*                           GODOT ENGINE                                */
6 /*                      https://godotengine.org                          */
7 /*************************************************************************/
8 /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.                 */
9 /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)    */
10 /*                                                                       */
11 /* Permission is hereby granted, free of charge, to any person obtaining */
12 /* a copy of this software and associated documentation files (the       */
13 /* "Software"), to deal in the Software without restriction, including   */
14 /* without limitation the rights to use, copy, modify, merge, publish,   */
15 /* distribute, sublicense, and/or sell copies of the Software, and to    */
16 /* permit persons to whom the Software is furnished to do so, subject to */
17 /* the following conditions:                                             */
18 /*                                                                       */
19 /* The above copyright notice and this permission notice shall be        */
20 /* included in all copies or substantial portions of the Software.       */
21 /*                                                                       */
22 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
23 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
24 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
25 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
26 /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
27 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
28 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
29 /*************************************************************************/
30 
31 #ifdef TOOLS_ENABLED
32 
33 #include "core/helper/math_fieldwise.h"
34 
35 #define SETUP_TYPE(m_type)    \
36 	m_type source = p_source; \
37 	m_type target = p_target;
38 #define TRY_TRANSFER_FIELD(m_name, m_member) \
39 	if (p_field == m_name) {                 \
40 		target.m_member = source.m_member;   \
41 	}
42 
fieldwise_assign(const Variant & p_target,const Variant & p_source,const String & p_field)43 Variant fieldwise_assign(const Variant &p_target, const Variant &p_source, const String &p_field) {
44 
45 	ERR_FAIL_COND_V(p_target.get_type() != p_source.get_type(), p_target);
46 
47 	switch (p_source.get_type()) {
48 
49 		case Variant::VECTOR2: {
50 
51 			SETUP_TYPE(Vector2)
52 
53 			/**/ TRY_TRANSFER_FIELD("x", x) else TRY_TRANSFER_FIELD("y", y)
54 
55 					return target;
56 		}
57 
58 		case Variant::RECT2: {
59 
60 			SETUP_TYPE(Rect2)
61 
62 			/**/ TRY_TRANSFER_FIELD("x", pos.x) else TRY_TRANSFER_FIELD("y", pos.y) else TRY_TRANSFER_FIELD("w", size.x) else TRY_TRANSFER_FIELD("h", size.y)
63 
64 					return target;
65 		}
66 
67 		case Variant::VECTOR3: {
68 
69 			SETUP_TYPE(Vector3)
70 
71 			/**/ TRY_TRANSFER_FIELD("x", x) else TRY_TRANSFER_FIELD("y", y) else TRY_TRANSFER_FIELD("z", z)
72 
73 					return target;
74 		}
75 
76 		case Variant::PLANE: {
77 
78 			SETUP_TYPE(Plane)
79 
80 			/**/ TRY_TRANSFER_FIELD("x", normal.x) else TRY_TRANSFER_FIELD("y", normal.y) else TRY_TRANSFER_FIELD("z", normal.z) else TRY_TRANSFER_FIELD("d", d)
81 
82 					return target;
83 		}
84 
85 		case Variant::QUAT: {
86 
87 			SETUP_TYPE(Quat)
88 
89 			/**/ TRY_TRANSFER_FIELD("x", x) else TRY_TRANSFER_FIELD("y", y) else TRY_TRANSFER_FIELD("z", z) else TRY_TRANSFER_FIELD("w", w)
90 
91 					return target;
92 		}
93 
94 		case Variant::_AABB: {
95 
96 			SETUP_TYPE(AABB)
97 
98 			/**/ TRY_TRANSFER_FIELD("px", pos.x) else TRY_TRANSFER_FIELD("py", pos.y) else TRY_TRANSFER_FIELD("pz", pos.z) else TRY_TRANSFER_FIELD("sx", size.x) else TRY_TRANSFER_FIELD("sy", size.y) else TRY_TRANSFER_FIELD("sz", size.z)
99 
100 					return target;
101 		}
102 
103 		case Variant::MATRIX32: {
104 
105 			SETUP_TYPE(Matrix32)
106 
107 			/**/ TRY_TRANSFER_FIELD("xx", elements[0][0]) else TRY_TRANSFER_FIELD("xy", elements[0][1]) else TRY_TRANSFER_FIELD("yx", elements[1][0]) else TRY_TRANSFER_FIELD("yy", elements[1][1]) else TRY_TRANSFER_FIELD("ox", elements[2][0]) else TRY_TRANSFER_FIELD("oy", elements[2][1])
108 
109 					return target;
110 		}
111 
112 		case Variant::MATRIX3: {
113 
114 			SETUP_TYPE(Matrix3)
115 
116 			/**/ TRY_TRANSFER_FIELD("xx", elements[0][0]) else TRY_TRANSFER_FIELD("xy", elements[0][1]) else TRY_TRANSFER_FIELD("xz", elements[0][2]) else TRY_TRANSFER_FIELD("yx", elements[1][0]) else TRY_TRANSFER_FIELD("yy", elements[1][1]) else TRY_TRANSFER_FIELD("yz", elements[1][2]) else TRY_TRANSFER_FIELD("zx", elements[2][0]) else TRY_TRANSFER_FIELD("zy", elements[2][1]) else TRY_TRANSFER_FIELD("zz", elements[2][2])
117 
118 					return target;
119 		}
120 
121 		case Variant::TRANSFORM: {
122 
123 			SETUP_TYPE(Transform)
124 
125 			/**/ TRY_TRANSFER_FIELD("xx", basis.elements[0][0]) else TRY_TRANSFER_FIELD("xy", basis.elements[0][1]) else TRY_TRANSFER_FIELD("xz", basis.elements[0][2]) else TRY_TRANSFER_FIELD("yx", basis.elements[1][0]) else TRY_TRANSFER_FIELD("yy", basis.elements[1][1]) else TRY_TRANSFER_FIELD("yz", basis.elements[1][2]) else TRY_TRANSFER_FIELD("zx", basis.elements[2][0]) else TRY_TRANSFER_FIELD("zy", basis.elements[2][1]) else TRY_TRANSFER_FIELD("zz", basis.elements[2][2]) else TRY_TRANSFER_FIELD("xo", origin.x) else TRY_TRANSFER_FIELD("yo", origin.y) else TRY_TRANSFER_FIELD("zo", origin.z)
126 
127 					return target;
128 		}
129 
130 		default: {
131 			ERR_FAIL_V(p_target);
132 		}
133 	}
134 }
135 
136 #endif // TOOLS_ENABLED
137