static naRef f_getType(naContext c, naRef me, int argc, naRef* args)
{
- using namespace simgear::props;
+ using namespace simgear;
NODEARG();
const char* t = "unknown";
switch((*node)->getType()) {
- case NONE: t = "NONE"; break;
- case ALIAS: t = "ALIAS"; break;
- case BOOL: t = "BOOL"; break;
- case INT: t = "INT"; break;
- case LONG: t = "LONG"; break;
- case FLOAT: t = "FLOAT"; break;
- case DOUBLE: t = "DOUBLE"; break;
- case STRING: t = "STRING"; break;
- case UNSPECIFIED: t = "UNSPECIFIED"; break;
+ case props::NONE: t = "NONE"; break;
+ case props::ALIAS: t = "ALIAS"; break;
+ case props::BOOL: t = "BOOL"; break;
+ case props::INT: t = "INT"; break;
+ case props::LONG: t = "LONG"; break;
+ case props::FLOAT: t = "FLOAT"; break;
+ case props::DOUBLE: t = "DOUBLE"; break;
+ case props::STRING: t = "STRING"; break;
+ case props::UNSPECIFIED: t = "UNSPECIFIED"; break;
+ case props::VEC3D: t = "VEC3D"; break;
+ case props::VEC4D: t = "VEC4D"; break;
+ case props::EXTENDED: t = "EXTENDED"; break; // shouldn't happen
}
return NASTR(t);
}
return naNum((*node)->getIndex());
}
+template<typename T>
+naRef makeVectorFromVec(naContext c, const T& vec)
+{
+ const int 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;
+ using namespace simgear;
NODEARG();
switch((*node)->getType()) {
- case BOOL: case INT:
- case LONG: case FLOAT:
- case DOUBLE:
+ case props::BOOL: case props::INT:
+ case props::LONG: case props::FLOAT:
+ case props::DOUBLE:
return naNum((*node)->getDoubleValue());
- case STRING:
- case UNSPECIFIED:
+ case props::STRING:
+ case props::UNSPECIFIED:
return NASTR((*node)->getStringValue());
+ case props::VEC3D:
+ return makeVectorFromVec(c, (*node)->getValue<SGVec3d>());
+ case props::VEC4D:
+ return makeVectorFromVec(c, (*node)->getValue<SGVec4d>());
default:
return naNil();
}
}
+template<typename T>
+T makeVecFromVector(naRef vector)
+{
+ T vec;
+ const int 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<SGVec3d>(val));
+ else if(naVec_size(val) == 4)
+ result = (*node)->setValue(makeVecFromVector<SGVec4d>(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");