From: timoore Date: Wed, 15 Jul 2009 23:15:57 +0000 (+0000) Subject: Support for VEC3D and VEC4D properties. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=5cf18d30c6176ecf04e2f0856c22db7fd437d3d2;p=flightgear.git Support for VEC3D and VEC4D properties. Tiny update to property_list for extended properties. New property types in nasal. --- diff --git a/src/GUI/property_list.cxx b/src/GUI/property_list.cxx index d1e93174e..d711d3023 100644 --- a/src/GUI/property_list.cxx +++ b/src/GUI/property_list.cxx @@ -64,6 +64,10 @@ static string getValueTypeString(const SGPropertyNode *node) result = "double"; else if (type == STRING) result = "string"; + else if (type == VEC3D) + result = "vec3d"; + else if (type == VEC4D) + result = "vec4d"; return result; } @@ -88,14 +92,18 @@ static void dumpProperties(const SGPropertyNode *node) switch (c->getType()) { case DOUBLE: case FLOAT: - cout << std::setprecision(15) << c->getDoubleValue(); + case VEC3D: + case VEC4D: + { + streamsize precision = cout.precision(15); + c->printOn(cout); + cout.precision(precision); + } break; case LONG: case INT: - cout << c->getLongValue(); - break; case BOOL: - cout << (c->getBoolValue() ? "true" : "false"); + c->printOn(cout); break; case STRING: cout << '"' << c->getStringValue() << '"'; diff --git a/src/Scripting/nasal-props.cxx b/src/Scripting/nasal-props.cxx index 4d064a26c..ab21f2a24 100644 --- a/src/Scripting/nasal-props.cxx +++ b/src/Scripting/nasal-props.cxx @@ -71,6 +71,8 @@ static naRef f_getType(naContext c, naRef me, int argc, naRef* args) case DOUBLE: t = "DOUBLE"; break; case STRING: t = "STRING"; break; case UNSPECIFIED: t = "UNSPECIFIED"; break; + case VEC3D: t = "VEC3D"; break; + case VEC4D: t = "VEC4D"; break; } return NASTR(t); } @@ -141,6 +143,18 @@ static naRef f_getIndex(naContext c, naRef me, int argc, naRef* args) return naNum((*node)->getIndex()); } +template +naRef makeVectorFromVec(naContext c, const T& vec) +{ + const unsigned num_components + = sizeof(vec.data()) / sizeof(typename T::value_type); + naRef vector = naNewVector(c); + naVec_setsize(vector, num_components); + for (int i = 0; i < num_components; ++i) + naVec_set(vector, i, naNum(vec[i])); + return vector; +} + static naRef f_getValue(naContext c, naRef me, int argc, naRef* args) { using namespace simgear::props; @@ -153,18 +167,47 @@ static naRef f_getValue(naContext c, naRef me, int argc, naRef* args) case STRING: case UNSPECIFIED: return NASTR((*node)->getStringValue()); + case VEC3D: + return makeVectorFromVec(c, (*node)->getValue()); + case VEC4D: + return makeVectorFromVec(c, (*node)->getValue()); default: return naNil(); } } +template +T makeVecFromVector(naRef vector) +{ + T vec; + const unsigned num_components + = sizeof(vec.data()) / sizeof(typename T::value_type); + int size = naVec_size(vector); + + for (int i = 0; i < num_components && i < size; ++i) { + naRef element = naVec_get(vector, i); + naRef n = naNumValue(element); + if (!naIsNil(n)) + vec[i] = n.num; + } + return vec; +} + static naRef f_setValue(naContext c, naRef me, int argc, naRef* args) { NODEARG(); naRef val = naVec_get(argv, 0); bool result = false; - if(naIsString(val)) result = (*node)->setStringValue(naStr_data(val)); - else { + if(naIsString(val)) { + result = (*node)->setStringValue(naStr_data(val)); + } else if(naIsVector(val)) { + if(naVec_size(val) == 3) + result = (*node)->setValue(makeVecFromVector(val)); + else if(naVec_size(val) == 4) + result = (*node)->setValue(makeVecFromVector(val)); + else + naRuntimeError(c, "props.setValue() vector value has wrong size"); + } else { naRef n = naNumValue(val); if(naIsNil(n)) naRuntimeError(c, "props.setValue() with non-number");