OverviewFilesCommitsIssuesDocsReleasesPeers

proc-nodes / src / graph / socket_value.cpp

157 lines · cpp ref:
#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