#include "socket_value.h"
namespace godot {
const char *socket_type_name(SocketType p_type) {
switch (p_type) {
case SocketType::Float: return "Float";
case SocketType::Int: return "Int";
case SocketType::Bool: return "Bool";
case SocketType::Vector: return "Vector";
case SocketType::Color: return "Color";
case SocketType::String: return "String";
case SocketType::Geometry: return "Geometry";
case SocketType::Object: return "Object";
case SocketType::Rotation: return "Rotation";
case SocketType::Matrix: return "Matrix";
}
return "Unknown";
}
float SocketValue::to_float() const {
switch (type) {
case SocketType::Float: return f;
case SocketType::Int: return static_cast<float>(i);
case SocketType::Bool: return b ? 1.0f : 0.0f;
case SocketType::Vector: return vec.x;
case SocketType::Color: return color.r;
default: return 0.0f;
}
}
int32_t SocketValue::to_int() const {
switch (type) {
case SocketType::Float: return static_cast<int32_t>(f);
case SocketType::Int: return i;
case SocketType::Bool: return b ? 1 : 0;
case SocketType::Vector: return static_cast<int32_t>(vec.x);
default: return 0;
}
}
bool SocketValue::to_bool() const {
switch (type) {
case SocketType::Float: return f != 0.0f;
case SocketType::Int: return i != 0;
case SocketType::Bool: return b;
default: return false;
}
}
Vector3 SocketValue::to_vector() const {
switch (type) {
case SocketType::Float: return Vector3(f, f, f);
case SocketType::Int: return Vector3(i, i, i);
case SocketType::Vector: return vec;
case SocketType::Color: return Vector3(color.r, color.g, color.b);
default: return Vector3();
}
}
Color SocketValue::to_color() const {
switch (type) {
case SocketType::Float: return Color(f, f, f, 1.0f);
case SocketType::Vector: return Color(vec.x, vec.y, vec.z, 1.0f);
case SocketType::Color: return color;
default: return Color();
}
}
Variant SocketValue::to_variant() const {
switch (type) {
case SocketType::Float: return f;
case SocketType::Int: return i;
case SocketType::Bool: return b;
case SocketType::Vector: return vec;
case SocketType::Color: return color;
case SocketType::String: return str;
case SocketType::Geometry: return geometry;
case SocketType::Rotation: return quat;
case SocketType::Matrix: return mat;
default: return Variant();
}
}
SocketValue SocketValue::from_variant(const Variant &p_val, SocketType p_type) {
SocketValue sv;
sv.type = p_type;
switch (p_type) {
case SocketType::Float:
sv.f = p_val.operator float();
break;
case SocketType::Int:
sv.i = p_val.operator int32_t();
break;
case SocketType::Bool:
sv.b = p_val.operator bool();
break;
case SocketType::Vector:
sv.vec = p_val.operator Vector3();
break;
case SocketType::Color:
sv.color = p_val.operator Color();
break;
case SocketType::String:
sv.str = p_val.operator String();
break;
case SocketType::Geometry:
sv.geometry = p_val;
break;
case SocketType::Rotation:
sv.quat = p_val.operator Quaternion();
break;
case SocketType::Matrix:
sv.mat = p_val.operator Projection();
break;
default:
break;
}
return sv;
}
SocketType socket_type_from_cd_prop(int p_cd, Variant &r_zero) {
switch (p_cd) {
case 11: // INT
case 45: // INT8
r_zero = 0;
return SocketType::Int;
case 50: // BOOLEAN
r_zero = false;
return SocketType::Bool;
case 48: // FLOAT_VECTOR
case 49: // FLOAT2
r_zero = Vector3();
return SocketType::Vector;
case 47: // FLOAT_COLOR
case 17: // BYTE_COLOR
r_zero = Color(0, 0, 0, 1);
return SocketType::Color;
case 52: // QUATERNION
r_zero = Quaternion();
return SocketType::Rotation;
case 20: // FLOAT4X4
r_zero = Projection();
return SocketType::Matrix;
// GEOMETRY is not a CD_PROP code -- Blender's item lists spell it with
// the socket-type vocabulary instead, and the bridge sends -1 for it.
case -1:
r_zero = Variant();
return SocketType::Geometry;
default: // FLOAT 10 and anything unrecognised
r_zero = 0.0f;
return SocketType::Float;
}
}
} // namespace godot