void Viewer::trackballRotate(const QVector2D& startCoords, const QVector2D& endCoords, QMatrix4x4* mat) { // TODO: We could get these from a common location QVector2D trackballCenter(width() / 2.0, height() / 2.0); auto diam = std::min(width(), height()) / 2.0; // Convert into coordinates centered at trackball center auto start = (startCoords - trackballCenter); auto end = (endCoords - trackballCenter); // Y coordinates are upside down start[1] *= -1; end[1] *= -1; end *= 2.0 / diam; start *= 2.0 / diam; // Vectors from center of "trackball" to points QVector3D endVector(end[0], end[1], 1 - end[0]*end[0] - end[1]*end[1]); QVector3D startVector(start[0], start[1], 1 - start[0]*start[0] - start[1]*start[1]); // Cheat because vector would be const for (auto vp : {&endVector, &startVector}) { auto& v = *vp; if (v[2] < 0) { // Mouse outside trackball: rotation about Z v /= std::sqrt(1 - v[2]); v[2] = 0; } else { v[2] = std::sqrt(v[2]); } } // Vector to rotate about. Length of vector is angle of rotation in radians. auto rotationVector = QVector3D::crossProduct(startVector, endVector); auto angleDeg = rotationVector.length() / (2 * M_PI) * 360; rotationVector.normalize(); // Qt rotates on the right. We want the left. QMatrix4x4 rotMat; rotMat.rotate(angleDeg, rotationVector); *mat = rotMat * *mat; }
XDMFBINARYCONTROLLER * XdmfBinaryControllerNewHyperslab(char * filePath, int type, int endian, unsigned int seek, unsigned int * start, unsigned int * stride, unsigned int * dimensions, unsigned int * dataspaceDimensions, unsigned int numDims, int * status) { XDMF_ERROR_WRAP_START(status) std::vector<unsigned int> startVector(start, start + numDims); std::vector<unsigned int> strideVector(stride, stride + numDims); std::vector<unsigned int> dimVector(dimensions, dimensions + numDims); std::vector<unsigned int> dataspaceVector(dataspaceDimensions, dataspaceDimensions + numDims); shared_ptr<const XdmfArrayType> buildType = shared_ptr<XdmfArrayType>(); switch (type) { case XDMF_ARRAY_TYPE_UINT8: buildType = XdmfArrayType::UInt8(); break; case XDMF_ARRAY_TYPE_UINT16: buildType = XdmfArrayType::UInt16(); break; case XDMF_ARRAY_TYPE_UINT32: buildType = XdmfArrayType::UInt32(); break; case XDMF_ARRAY_TYPE_INT8: buildType = XdmfArrayType::Int8(); break; case XDMF_ARRAY_TYPE_INT16: buildType = XdmfArrayType::Int16(); break; case XDMF_ARRAY_TYPE_INT32: buildType = XdmfArrayType::Int32(); break; case XDMF_ARRAY_TYPE_INT64: buildType = XdmfArrayType::Int64(); break; case XDMF_ARRAY_TYPE_FLOAT32: buildType = XdmfArrayType::Float32(); break; case XDMF_ARRAY_TYPE_FLOAT64: buildType = XdmfArrayType::Float64(); break; default: XdmfError::message(XdmfError::FATAL, "Error: Invalid ArrayType."); break; } XdmfBinaryController::Endian buildEndian = XdmfBinaryController::NATIVE; switch (endian) { case XDMF_BINARY_CONTROLLER_ENDIAN_BIG: buildEndian = XdmfBinaryController::BIG; break; case XDMF_BINARY_CONTROLLER_ENDIAN_LITTLE: buildEndian = XdmfBinaryController::LITTLE; break; case XDMF_BINARY_CONTROLLER_ENDIAN_NATIVE: buildEndian = XdmfBinaryController::NATIVE; break; default: XdmfError::message(XdmfError::FATAL, "Error: Invalid Endian."); break; } shared_ptr<XdmfBinaryController> generatedController = XdmfBinaryController::New(std::string(filePath), buildType, buildEndian, seek, startVector, strideVector, dimVector, dataspaceVector); return (XDMFBINARYCONTROLLER *)((void *)(new XdmfBinaryController(*generatedController.get()))); XDMF_ERROR_WRAP_END(status) return NULL; }