/** * @ingroup VuoTransform * Encodes @c value as a JSON object. */ json_object * VuoTransform_jsonFromValue(const VuoTransform value) { if (VuoTransform_isIdentity(value)) return json_object_new_string("identity"); json_object *js = json_object_new_object(); { json_object * o = json_object_new_array(); json_object_array_add(o,json_object_new_double(cook(value.translation.x))); json_object_array_add(o,json_object_new_double(cook(value.translation.y))); json_object_array_add(o,json_object_new_double(cook(value.translation.z))); json_object_object_add(js, "translation", o); } // Don't store value.rotation, since we can calculate it from the source rotation. if (value.type == VuoTransformTypeQuaternion) { json_object * o = json_object_new_array(); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.quaternion.x))); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.quaternion.y))); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.quaternion.z))); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.quaternion.w))); json_object_object_add(js, "quaternionRotation", o); } else if (value.type == VuoTransformTypeEuler) { json_object * o = json_object_new_array(); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.euler.x))); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.euler.y))); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.euler.z))); json_object_object_add(js, "eulerRotation", o); } else { json_object * o = json_object_new_array(); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.target.x))); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.target.y))); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.target.z))); json_object_object_add(js, "target", o); o = json_object_new_array(); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.upDirection.x))); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.upDirection.y))); json_object_array_add(o,json_object_new_double(cook(value.rotationSource.upDirection.z))); json_object_object_add(js, "upDirection", o); } if (value.type != VuoTransformTypeTargeted) { json_object * o = json_object_new_array(); json_object_array_add(o,json_object_new_double(cook(value.scale.x))); json_object_array_add(o,json_object_new_double(cook(value.scale.y))); json_object_array_add(o,json_object_new_double(cook(value.scale.z))); json_object_object_add(js, "scale", o); } return js; }
/** * @ingroup VuoTransform * Produces a brief human-readable summary of @c value. */ char * VuoTransform_summaryFromValue(const VuoTransform value) { if (VuoTransform_isIdentity(value)) return strdup("identity transform (no change)"); if (value.type == VuoTransformTypeTargeted) return VuoText_format("position (%g, %g, %g)<br>target (%g, %g, %g)<br>up (%g, %g, %g)", value.translation.x, value.translation.y, value.translation.z, value.rotationSource.target.x, value.rotationSource.target.y, value.rotationSource.target.z, value.rotationSource.upDirection.x, value.rotationSource.upDirection.y, value.rotationSource.upDirection.z); char *rotation; if (value.type == VuoTransformTypeQuaternion) rotation = VuoText_format("(%g, %g, %g, %g) quaternion", value.rotationSource.quaternion.x, value.rotationSource.quaternion.y, value.rotationSource.quaternion.z, value.rotationSource.quaternion.w); else { VuoPoint3d r = VuoPoint3d_multiply(value.rotationSource.euler, 180./M_PI); rotation = VuoText_format("(%g°, %g°, %g°) euler", r.x, r.y, r.z); } char *valueAsString = VuoText_format("translation (%g, %g, %g)<br>rotation %s<br>scale (%g, %g, %g)", value.translation.x, value.translation.y, value.translation.z, rotation, value.scale.x, value.scale.y, value.scale.z); free(rotation); return valueAsString; }
/** * @ingroup VuoTransform * Produces a brief human-readable summary of @c value. */ char * VuoTransform_summaryFromValue(const VuoTransform value) { if (VuoTransform_isIdentity(value)) return strdup("identity transform (no change)"); if (value.type == VuoTransformTypeTargeted) { const char *format = "position (%g, %g, %g)<br>target (%g, %g, %g)<br>up (%g, %g, %g)"; int size = snprintf(NULL, 0, format, value.translation.x, value.translation.y, value.translation.z, value.rotationSource.target.x, value.rotationSource.target.y, value.rotationSource.target.z, value.rotationSource.upDirection.x, value.rotationSource.upDirection.y, value.rotationSource.upDirection.z); char *valueAsString = (char *)malloc(size+1); snprintf(valueAsString, size+1, format, value.translation.x, value.translation.y, value.translation.z, value.rotationSource.target.x, value.rotationSource.target.y, value.rotationSource.target.z, value.rotationSource.upDirection.x, value.rotationSource.upDirection.y, value.rotationSource.upDirection.z); return valueAsString; } const char *format = "translation (%g, %g, %g)<br>rotation %s<br>scale (%g, %g, %g)"; char *rotation; if (value.type == VuoTransformTypeQuaternion) { const char *format = "(%g, %g, %g, %g) quaternion"; int size = snprintf(NULL, 0, format, value.rotationSource.quaternion.x, value.rotationSource.quaternion.y, value.rotationSource.quaternion.z, value.rotationSource.quaternion.w); rotation = (char *)malloc(size+1); snprintf(rotation, size+1, format, value.rotationSource.quaternion.x, value.rotationSource.quaternion.y, value.rotationSource.quaternion.z, value.rotationSource.quaternion.w); } else { const char *format = "(%g°, %g°, %g°) euler"; VuoPoint3d r = VuoPoint3d_multiply(value.rotationSource.euler, 180./M_PI); int size = snprintf(NULL, 0, format, r.x, r.y, r.z); rotation = (char *)malloc(size+1); snprintf(rotation, size+1, format, r.x, r.y, r.z); } int size = snprintf(NULL, 0, format, value.translation.x, value.translation.y, value.translation.z, rotation, value.scale.x, value.scale.y, value.scale.z); char * valueAsString = (char *)malloc(size+1); snprintf(valueAsString, size+1, format, value.translation.x, value.translation.y, value.translation.z, rotation, value.scale.x, value.scale.y, value.scale.z); free(rotation); return valueAsString; }