From c17c272b7750a55ba8d08a001f4f52602ebaa490 Mon Sep 17 00:00:00 2001 From: caseymcc Date: Mon, 26 Jun 2017 09:42:22 -0500 Subject: [PATCH 1/2] add windows support and remove folly support --- surround360_render/CMakeLists.txt | 5 + .../source/calibration/ColorCalibration.h | 96 ++++----- .../calibration/GeometricCalibration.cpp | 56 ++--- .../optical_flow/OpticalFlowVisualization.cpp | 6 + surround360_render/source/render/Camera.cpp | 197 ++++++++++-------- surround360_render/source/render/Camera.h | 83 ++------ .../source/test/TestHyperPreview.cpp | 20 +- .../source/test/TestVignettingCalibration.cpp | 23 +- .../test/TestVignettingDataAcquisition.cpp | 32 ++- surround360_render/source/util/MathUtil.h | 3 + surround360_render/source/util/SystemUtil.cpp | 11 + surround360_render/source/util/SystemUtil.h | 33 ++- 12 files changed, 290 insertions(+), 275 deletions(-) diff --git a/surround360_render/CMakeLists.txt b/surround360_render/CMakeLists.txt index 1ee7c391..22e41505 100644 --- a/surround360_render/CMakeLists.txt +++ b/surround360_render/CMakeLists.txt @@ -12,9 +12,14 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/source/optical_flow) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/source/camera_isp) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/source/calibration) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/source/render) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/source/thirdparty/supereasyjson) INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) INCLUDE_DIRECTORIES(/usr/local/include/eigen3) +if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + add_definitions("-DLINUX") +endif() + if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") # required for clang, including AppleClang LINK_DIRECTORIES(/usr/local/lib) diff --git a/surround360_render/source/calibration/ColorCalibration.h b/surround360_render/source/calibration/ColorCalibration.h index cf9d90b0..8070db97 100644 --- a/surround360_render/source/calibration/ColorCalibration.h +++ b/surround360_render/source/calibration/ColorCalibration.h @@ -41,55 +41,55 @@ const vector rgbGrayLinearMacbeth = {6, 21, 49, 92, 150, 233}; // Danny Pascale, "RGB coordinates of the Macbeth ColorChecker", The BabelColor Company, June 2006 map > > const labMacbeth { {"D50", { - {37.99, 13.56, 14.06}, - {65.71, 18.13, 17.81}, - {49.93, -4.88, -21.93}, - {43.14, -13.10, 21.91}, - {55.11, 8.84, -25.40}, - {70.72, -33.40, -0.199}, - {62.66, 36.07, 57.10}, - {40.02, 10.41, -45.96}, - {51.12, 48.24, 16.25}, - {30.33, 22.98, -21.59}, - {72.53, -23.71, 57.26}, - {71.94, 19.36, 67.86}, - {28.78, 14.18, -50.30}, - {55.26, -38.34, 31.37}, - {42.10, 53.38, 28.19}, - {81.73, 4.04, 79.82}, - {51.94, 49.99, -14.57}, - {51.04, -28.63, -28.64}, - {96.54, -0.425, 1.186}, - {81.26, -0.638, -0.335}, - {66.77, -0.734, -0.504}, - {50.87, -0.153, -0.270}, - {35.66, -0.421, -1.231}, - {20.46, -0.079, -0.973}}}, + {37.99f, 13.56f, 14.06f}, + {65.71f, 18.13f, 17.81f}, + {49.93f, -4.88f, -21.93f}, + {43.14f, -13.10f, 21.91f}, + {55.11f, 8.84f, -25.40f}, + {70.72f, -33.40f, -0.199f}, + {62.66f, 36.07f, 57.10f}, + {40.02f, 10.41f, -45.96f}, + {51.12f, 48.24f, 16.25f}, + {30.33f, 22.98f, -21.59f}, + {72.53f, -23.71f, 57.26f}, + {71.94f, 19.36f, 67.86f}, + {28.78f, 14.18f, -50.30f}, + {55.26f, -38.34f, 31.37f}, + {42.10f, 53.38f, 28.19f}, + {81.73f, 4.04f, 79.82f}, + {51.94f, 49.99f, -14.57f}, + {51.04f, -28.63f, -28.64f}, + {96.54f, -0.425f, 1.186f}, + {81.26f, -0.638f, -0.335f}, + {66.77f, -0.734f, -0.504f}, + {50.87f, -0.153f, -0.270f}, + {35.66f, -0.421f, -1.231f}, + {20.46f, -0.079f, -0.973f}}}, {"D65", { - {37.85, 12.72, 14.07}, - {65.43, 17.18, 17.21}, - {50.15, -1.91, -21.79}, - {43.17, -15.08, 22.44}, - {55.40, 11.58, -25.06}, - {70.92, -33.22, 0.29}, - {62.06, 33.37, 56.24}, - {40.59, 16.15, -45.14}, - {50.58, 47.55, 15.17}, - {30.51, 25.11, -21.74}, - {72.31, -27.84, 57.83}, - {71.43, 15.50, 67.80}, - {29.46, 20.74, -49.34}, - {55.26, -41.23, 32.03}, - {41.53, 52.67, 26.92}, - {81.08, -0.33, 80.10}, - {51.74, 51.26, -15.48}, - {52.41, -18.46, -26.64}, - {96.49, -0.35, 0.96}, - {81.17, -0.69, -0.24}, - {66.84, -0.71, -0.25}, - {50.86, 0.20, -0.55}, - {35.61, -0.36, -1.44}, - {20.40, 0.47, -1.27}} + {37.85f, 12.72f, 14.07f}, + {65.43f, 17.18f, 17.21f}, + {50.15f, -1.91f, -21.79f}, + {43.17f, -15.08f, 22.44f}, + {55.40f, 11.58f, -25.06f}, + {70.92f, -33.22f, 0.29f}, + {62.06f, 33.37f, 56.24f}, + {40.59f, 16.15f, -45.14f}, + {50.58f, 47.55f, 15.17f}, + {30.51f, 25.11f, -21.74f}, + {72.31f, -27.84f, 57.83f}, + {71.43f, 15.50f, 67.80f}, + {29.46f, 20.74f, -49.34f}, + {55.26f, -41.23f, 32.03f}, + {41.53f, 52.67f, 26.92f}, + {81.08f, -0.33f, 80.10f}, + {51.74f, 51.26f, -15.48f}, + {52.41f, -18.46f, -26.64f}, + {96.49f, -0.35f, 0.96f}, + {81.17f, -0.69f, -0.24f}, + {66.84f, -0.71f, -0.25f}, + {50.86f, 0.20f, -0.55f}, + {35.61f, -0.36f, -1.44f}, + {20.40f, 0.47f, -1.27f}} } }; diff --git a/surround360_render/source/calibration/GeometricCalibration.cpp b/surround360_render/source/calibration/GeometricCalibration.cpp index fa73e0d1..510dafcb 100644 --- a/surround360_render/source/calibration/GeometricCalibration.cpp +++ b/surround360_render/source/calibration/GeometricCalibration.cpp @@ -1,10 +1,9 @@ #include #include #include +#include #define BOOST_FILESYSTEM_NO_DEPRECATED #include -#include -#include #include "opencv2/opencv.hpp" #include "opencv2/stitching/detail/matchers.hpp" #include "ceres/ceres.h" @@ -61,16 +60,16 @@ void buildCameraIndexMaps(const Camera::Rig& rig) { std::string getCameraIdFromPath(const boost::filesystem::path& image) { if (kStemIsCameraId) { - return image.stem().native(); + return image.stem().string(); } - return image.parent_path().filename().native(); + return image.parent_path().filename().string(); } int getFrameIndexFromPath(const boost::filesystem::path& image) { if (kStemIsCameraId) { - return std::stoi(image.begin()->native()); + return std::stoi(image.begin()->string()); } - return std::stoi(image.stem().native()); + return std::stoi(image.stem().string()); } bool hasCameraIndex(const boost::filesystem::path& image) { @@ -87,14 +86,19 @@ std::string makeArtificialPath(int frame, const std::string id) { } cv::Mat loadImage(const boost::filesystem::path& path) { - return cv::imread((FLAGS_frames / path).native()); + return cv::imread((FLAGS_frames / path).string()); } -folly::dynamic parseJsonFile(const std::string& path) { - std::string json; - folly::readFile(path.c_str(), json); - CHECK(!json.empty()) << "could not read JSON file: " << path; - return folly::parseJson(json); +json::Value parseJsonFile(const std::string& path) { + std::string json; + + std::ifstream fileStream(path); + std::stringstream stream; + + stream< @@ -139,20 +143,20 @@ struct Keypoint { using KeypointMap = std::unordered_map>; -KeypointMap loadKeypointMap(const folly::dynamic& parsed) { +KeypointMap loadKeypointMap(const json::Value &parsed) { std::unordered_map> result; - for (const auto& image : parsed["images"].items()) { - const std::string path = image.first.getString(); + for (const auto& image : parsed["images"].ToObject()) { + const std::string path = image.first; if (!hasCameraIndex(path)) { continue; } auto& keypoints = result[path]; - for (const auto& keypoint : image.second) { + for (const auto& keypoint : image.second.ToArray()) { keypoints.emplace_back( - Camera::Vector2(keypoint["x"].asDouble(), keypoint["y"].asDouble()), - keypoint["scale"].asDouble(), - keypoint["orientation"].asDouble() + Camera::Vector2(keypoint["x"].ToDouble(), keypoint["y"].ToDouble()), + keypoint["scale"].ToDouble(), + keypoint["orientation"].ToDouble() ); } } @@ -186,21 +190,21 @@ struct Overlap { } }; -std::vector loadOverlaps(const folly::dynamic& parsed) { +std::vector loadOverlaps(const json::Value &parsed) { std::vector result; size_t count = 0; - for (const auto& overlap : parsed["all_matches"]) { - std::string path0 = overlap["image1"].getString(); - std::string path1 = overlap["image2"].getString(); + for (const auto& overlap : parsed["all_matches"].ToArray()) { + std::string path0 = overlap["image1"].ToString(); + std::string path1 = overlap["image2"].ToString(); if (!hasCameraIndex(path0) || !hasCameraIndex(path1)) { continue; } result.emplace_back(path0, path1); - for (const auto& match : overlap["matches"]) { + for (const auto& match : overlap["matches"].ToArray()) { result.back().matches.push_back({{ - size_t(match["idx1"].asInt()), - size_t(match["idx2"].asInt()) }}); + size_t(match["idx1"].ToInt()), + size_t(match["idx2"].ToInt()) }}); } count += 2 * result.back().matches.size(); } diff --git a/surround360_render/source/optical_flow/OpticalFlowVisualization.cpp b/surround360_render/source/optical_flow/OpticalFlowVisualization.cpp index 082d5c08..407d9dfd 100644 --- a/surround360_render/source/optical_flow/OpticalFlowVisualization.cpp +++ b/surround360_render/source/optical_flow/OpticalFlowVisualization.cpp @@ -9,6 +9,12 @@ #include "OpticalFlowVisualization.h" +#ifdef _WINDOWS +#define _USE_MATH_DEFINES +#endif +#include + + namespace surround360 { namespace optical_flow { diff --git a/surround360_render/source/render/Camera.cpp b/surround360_render/source/render/Camera.cpp index e2dc04ec..248ff5a1 100644 --- a/surround360_render/source/render/Camera.cpp +++ b/surround360_render/source/render/Camera.cpp @@ -8,6 +8,8 @@ */ #include "Camera.h" +#include +#include namespace surround360 { @@ -41,10 +43,10 @@ Camera::Camera(const Type type, const Vector2& res, const Vector2& focal): setDefaultFov(); } -Camera::Camera(const dynamic& json) { - CHECK_GE(json["version"].asDouble(), 1.0); +Camera::Camera(const json::Value &json) { + CHECK_GE(json["version"].ToDouble(), 1); - id = json["id"].getString(); + id = json["id"].ToString(); type = deserializeType(json["type"]); @@ -57,60 +59,53 @@ Camera::Camera(const dynamic& json) { resolution = deserializeVector<2>(json["resolution"]); - if (json.count("principal")) { + if (json.HasKey("principal")) principal = deserializeVector<2>(json["principal"]); - } else { + else principal = resolution / 2; - } - - if (json.count("distortion")) { + + if (json.HasKey("distortion")) distortion = deserializeVector<2>(json["distortion"]); - } else { + else distortion.setZero(); - } - if (json.count("fov")) { - setFov(json["fov"].asDouble()); - } else { + if (json.HasKey("fov")) + setFov(json["fov"].ToDouble()); + else setDefaultFov(); - } focal = deserializeVector<2>(json["focal"]); - if (json.count("group")) { - group = json["group"].getString(); + if (json.HasKey("group")) { + group = json["group"].ToString(); } } -#ifndef SUPPRESS_RIG_IO - -dynamic Camera::serialize() const { - dynamic result = dynamic::object - ("version", 1) - ("type", serializeType(type)) - ("origin", serializeVector(position)) - ("forward", serializeVector(forward())) - ("up", serializeVector(up())) - ("right", serializeVector(right())) - ("resolution", serializeVector(resolution)) - ("principal", serializeVector(principal)) - ("focal", serializeVector(focal)) - ("id", id); - if (!distortion.isZero()) { - result["distortion"] = serializeVector(distortion); - } - if (!isDefaultFov()) { - result["fov"] = getFov(); - } - if (!group.empty()) { - result["group"] = group; - } - return result; +json::Value Camera::serialize() const { + json::Object result; + + result["version"]=1; + result["type"]=serializeType(type); + result["origin"]=serializeVector(position); + result["forward"]=serializeVector(forward()); + result["up"]=serializeVector(up()); + result["right"]=serializeVector(right()); + result["resolution"]=serializeVector(resolution); + result["principal"]=serializeVector(principal); + result["focal"]=serializeVector(focal); + result["id"]=id; + + if (!distortion.isZero()) + result["distortion"] = serializeVector(distortion); + if (!isDefaultFov()) + result["fov"] = getFov(); + if (!group.empty()) + result["group"] = group; + + return result; } -#endif // SUPPRESS_RIG_IO - void Camera::setRotation(const Vector3& angleAxis) { // convert angle * axis to rotation matrix Real angle = angleAxis.norm(); @@ -225,47 +220,43 @@ Camera::Vector3 midpoint( return (pa + pb) / 2; } -#ifdef WIN32 - -Camera::Rig Camera::loadRig(const std::string& filename) { - boost::property_tree::ptree tree; - boost::property_tree::json_parser::read_json(std::ifstream(filename), tree); - - Camera::Rig rig; - for (const auto& camera : tree.get_child("cameras")) { - rig.emplace_back(camera.second); - } - return rig; -} - -#else // WIN32 - -std::vector Camera::loadRig(const std::string& filename) { +std::vector Camera::loadRig(const std::string& filename) +{ std::string json; - folly::readFile(filename.c_str(), json); + std::ifstream fileStream(filename); + std::stringstream stream; + + stream< cameras; - for (const auto& camera : dynamic["cameras"]) { + for (const auto& camera : dynamic["cameras"].ToArray()) { cameras.emplace_back(camera); } return cameras; } -#endif // WIN32 - -#ifndef SUPPRESS_RIG_IO void Camera::saveRig( const std::string& filename, const std::vector& cameras) { - dynamic dynamic = dynamic::object( - "cameras", dynamic::array()); + json::Array cameraArray; + for (const auto& camera : cameras) { - dynamic["cameras"].push_back(camera.serialize()); + cameraArray.push_back(camera.serialize()); } - folly::writeFile(folly::toPrettyJson(dynamic), filename.c_str()); + json::Object dynamic; + + dynamic["camera"]=cameraArray; + std::string output=json::Serialize(dynamic); + + std::ofstream out(filename); + + out< #include - +#include #include -#ifndef WIN32 - -#include -#include -#include - -using folly::dynamic; - -#else // WIN32 - -#ifndef M_PI -#define M_PI EIGEN_PI +#ifdef _WINDOWS +#define _USE_MATH_DEFINES #endif -// windows doesn't need the full rig i/o functionality -#define SUPPRESS_RIG_IO - -// dynamic is an interposer that mimics folly::dynamic - -#include - -struct dynamic : public boost::property_tree::ptree { - dynamic(const boost::property_tree::ptree& tree) : boost::property_tree::ptree(tree) {} - - dynamic operator[](const char* key) const { - return get_child(key); - } - - dynamic operator[](const std::size_t index) const { - auto it = begin(); - for (int i = 0; i < index; ++i) { - CHECK(it != end()); - ++it; - } - return it->second; - } - - std::string getString() const { - return get_value(); - } - - double asDouble() const { - return get_value(); - } - - friend std::ostream& operator<<(std::ostream& s, const dynamic& dyn) { - for (const auto& pair : dyn) { - s << pair.first << "->" << pair.second.get_value() << ", "; - } - return s; - } -}; - -#endif // WIN32 +#include namespace surround360 { @@ -99,8 +50,9 @@ struct Camera { // construction and de/serialization Camera(const Type type, const Vector2& resolution, const Vector2& focal); - Camera(const dynamic& json); - dynamic serialize() const; + Camera(const json::Value &json); + json::Value serialize() const; + static Rig loadRig(const std::string& filename); static void saveRig(const std::string& filename, const Rig& rig); static Camera createRescaledCamera(const Camera& cam, const float scale); @@ -290,18 +242,21 @@ struct Camera { return sensorToCamera(sensor); } - template - static dynamic serializeVector(const V& v) { - return dynamic(v.data(), v.data() + v.size()); + template + static json::Value serializeVector(const V& v) { + json::Array values; + + for(size_t i=0; i - static Eigen::Matrix deserializeVector( - const dynamic& json) { - CHECK_EQ(kSize, json.size()) << "bad vector" << json; + static Eigen::Matrix deserializeVector(const json::Array &json) { + CHECK_EQ(kSize, json.size()) << "bad vector"; Eigen::Matrix result; for (int i = 0; i < kSize; ++i) { - result[i] = json[i].asDouble(); + result[i] = json[i].ToDouble(); } return result; } @@ -315,9 +270,9 @@ struct Camera { } } - static Type deserializeType(const dynamic& json) { + static Type deserializeType(const json::Value &json) { for (int i = 0; ; ++i) { - if (serializeType(Type(i)) == json.getString()) { + if (serializeType(Type(i)) == json.ToString()) { return Type(i); } } diff --git a/surround360_render/source/test/TestHyperPreview.cpp b/surround360_render/source/test/TestHyperPreview.cpp index c36bd551..15c187d9 100644 --- a/surround360_render/source/test/TestHyperPreview.cpp +++ b/surround360_render/source/test/TestHyperPreview.cpp @@ -10,7 +10,13 @@ #include #include #include +#ifdef _WINDOWS +#include +#define open _open +#define pread(x, y, z, w) _read(x, y, z) +#else #include +#endif // _WINDOWS #include #include @@ -196,7 +202,7 @@ int main(int argc, char** argv) { uint32_t imageHeight; uint32_t nBits; - int fd[FLAGS_file_count]; + std::vector fd(FLAGS_file_count); vector binFilenames; for (int i = 0; i < FLAGS_file_count; ++i) { string fileName(FLAGS_binary_prefix + "/" + to_string(i) + ".bin"); @@ -210,7 +216,7 @@ int main(int argc, char** argv) { } cameraCount = 0; - uint32_t timestamps[FLAGS_file_count]; + std::vector timestamps(FLAGS_file_count); for (uint32_t i = 0; i < FLAGS_file_count; ++i) { static const int kNbitsMetadata = 4096 * CHAR_BIT; std::vector imgbufMetadata(kNbitsMetadata); @@ -258,12 +264,12 @@ int main(int argc, char** argv) { void* outputPtr = outImage.ptr(0); // Read raw bytes and assemble them into images - off_t pos[FLAGS_file_count]; - off_t posInit[FLAGS_file_count]; + std::vector pos(FLAGS_file_count); + std::vector posInit(FLAGS_file_count); // Each bin file can have different number of frames - int frameCount[FLAGS_file_count]; - size_t readCount[FLAGS_file_count]; + std::vector frameCount(FLAGS_file_count); + std::vector readCount(FLAGS_file_count); // Total number of frames is properly updated later if FLAGS_frame_count is 0 int totalFrameCount = FLAGS_frame_count * cameraCount; @@ -355,7 +361,7 @@ int main(int argc, char** argv) { // Check if we reached EOF (read returns 0) if (readCount[idx] == 0) { // Check if all the files have reached EOF - if (!std::all_of(readCount, readCount + FLAGS_file_count, [](int x){ return x == 0; })) { + if (!std::all_of(readCount.begin(), readCount.begin() + FLAGS_file_count, [](int x){ return x == 0; })) { continue; } diff --git a/surround360_render/source/test/TestVignettingCalibration.cpp b/surround360_render/source/test/TestVignettingCalibration.cpp index 7797ae31..eb5b442f 100644 --- a/surround360_render/source/test/TestVignettingCalibration.cpp +++ b/surround360_render/source/test/TestVignettingCalibration.cpp @@ -22,8 +22,6 @@ #include "VrCamException.h" #include "ceres/ceres.h" -#include -#include #include #include @@ -152,27 +150,28 @@ int main(int argc, char** argv) { // "rgbmedian" : [rN, gN, bN] // } // ] + std::ifstream jsonFile(FLAGS_data_path); + std::string json((std::istreambuf_iterator(jsonFile)), + std::istreambuf_iterator()); - string json; - folly::readFile(FLAGS_data_path.c_str(), json); if (json.empty()) { throw VrCamException("Failed to load JSON file: " + FLAGS_data_path); } vector vignetteMapLocs; vector vignetteMapRGBValues; - folly::dynamic data = folly::parseJson(json); + json::Value data = json::Deserialize(json); static const int kNumChannels = 3; vector minRGB(kNumChannels, INT_MAX); vector maxRGB(kNumChannels, 0); - for (const auto& sample : data) { - const folly::dynamic loc = sample["location"]; - const folly::dynamic median = sample["rgbmedian"]; - vignetteMapLocs.push_back(Point2f(loc[0].asDouble(), loc[1].asDouble())); + for (const json::Value &sample : data.ToArray()) { + const json::Array loc = sample["location"].ToArray(); + const json::Array median = sample["rgbmedian"].ToArray(); + vignetteMapLocs.push_back(Point2f(loc[0].ToDouble(), loc[1].ToDouble())); const Vec3f v = Vec3f( - median[0].asDouble(), - median[1].asDouble(), - median[2].asDouble()); + median[0].ToDouble(), + median[1].ToDouble(), + median[2].ToDouble()); vignetteMapRGBValues.push_back(v); // Find min and max of each channel as we load data diff --git a/surround360_render/source/test/TestVignettingDataAcquisition.cpp b/surround360_render/source/test/TestVignettingDataAcquisition.cpp index 0fe3e7f5..64e0c3ae 100644 --- a/surround360_render/source/test/TestVignettingDataAcquisition.cpp +++ b/surround360_render/source/test/TestVignettingDataAcquisition.cpp @@ -18,8 +18,6 @@ #include "SystemUtil.h" #include "VrCamException.h" -#include -#include #include #include @@ -42,18 +40,34 @@ void saveToJson( const vector& medians, const string& filename) { - folly::dynamic serialized = folly::dynamic::array; + json::Array serialized; for (int i = 0; i < locations.size(); ++i) { const Point2f& loc = locations[i]; const Vec3f& median = medians[i]; - folly::dynamic properties = - folly::dynamic::object - ("image_id", imageIds[i]) - ("location", folly::dynamic::array(loc.x, loc.y)) - ("rgbmedian", folly::dynamic::array(median[0], median[1], median[2])); + json::Object properties; + + properties["image_id"]=imageIds[i]; + + json::Array location; + + location.push_back(loc.x); + location.push_back(loc.y); + + properties["location"]=location; + + json::Array rgbmedian; + + rgbmedian.push_back(median[0]); + rgbmedian.push_back(median[1]); + rgbmedian.push_back(median[2]); + + properties["rgbmedian"]=rgbmedian; serialized.push_back(properties); } - folly::writeFile(folly::toPrettyJson(serialized), filename.c_str()); + + std::ofstream out(filename); + out< #include #include diff --git a/surround360_render/source/util/SystemUtil.cpp b/surround360_render/source/util/SystemUtil.cpp index bbd50732..1330fbdb 100644 --- a/surround360_render/source/util/SystemUtil.cpp +++ b/surround360_render/source/util/SystemUtil.cpp @@ -9,7 +9,10 @@ #include "SystemUtil.h" +#ifdef LINUX #include +#endif + #include #include @@ -29,6 +32,9 @@ namespace util { using namespace std; void printStacktrace() { +#ifdef _WINDOWS + LOG(ERROR)<<"Stack trace not currently supported on Windows"; +#else const size_t maxStackDepth = 128; void* stack[maxStackDepth]; size_t stackDepth = backtrace(stack, maxStackDepth); @@ -37,6 +43,7 @@ void printStacktrace() { LOG(ERROR) << stackStrings[i]; } free(stackStrings); +#endif } void terminateHandler() { @@ -61,7 +68,9 @@ void terminateHandler() { } void sigHandler(int signal) { +#ifndef _WINDOWS LOG(ERROR) << strsignal(signal); +#endif printStacktrace(); abort(); } @@ -79,6 +88,7 @@ void initSurround360(int argc, char** argv) { // setup signal and termination handlers set_terminate(terminateHandler); +#ifndef _WINDOWS // terminate process: terminal line hangup signal(SIGHUP, sigHandler); @@ -114,6 +124,7 @@ void initSurround360(int argc, char** argv) { // terminate process: software termination signal signal(SIGTERM, sigHandler); +#endif } } // namespace util diff --git a/surround360_render/source/util/SystemUtil.h b/surround360_render/source/util/SystemUtil.h index d76e76ad..4341b665 100644 --- a/surround360_render/source/util/SystemUtil.h +++ b/surround360_render/source/util/SystemUtil.h @@ -10,7 +10,6 @@ #pragma once #include -#include #include #include @@ -20,6 +19,8 @@ #include #include +#include + #include "CvUtil.h" #include "StringUtil.h" #include "VrCamException.h" @@ -71,25 +72,23 @@ static vector getFilesInDir( const bool fullPath, int numFilesToReturn = -1) { - DIR* dir = opendir(srcDir.c_str()); - if (!dir) { return vector(); } + boost::filesystem::path dir(srcDir.c_str()); + + if(!boost::filesystem::is_directory(dir)) + { return vector();} vector out_file_names; - dirent* dent; - while (true) { - dent = readdir(dir); - if (!dent) break; - // skip hidden files and/or links to parent dir - if (string(dent->d_name)[0] == '.') continue; - if (fullPath) { - out_file_names.push_back(srcDir + "/" + string(dent->d_name)); - } else { - out_file_names.push_back(string(dent->d_name)); - } - if (--numFilesToReturn == 0) { - break; - } + for(boost::filesystem::directory_entry & dent:boost::filesystem::directory_iterator(dir)) + { + if(!boost::filesystem::is_regular_file(dent)) + continue; + + if(fullPath) + out_file_names.push_back(dent.path().string()); + else + out_file_names.push_back(dent.path().relative_path().string()); } + return out_file_names; } From 33bb66c8e9875fe7463f2c6fc6662b33e9896f40 Mon Sep 17 00:00:00 2001 From: caseymcc Date: Mon, 26 Jun 2017 09:43:44 -0500 Subject: [PATCH 2/2] hunterize --- surround360_render/CMakeLists.txt | 225 +++++--- .../cmake/Hunter/HunterGate.cmake | 508 ++++++++++++++++++ surround360_render/cmake/Hunter/config.cmake | 4 + 3 files changed, 657 insertions(+), 80 deletions(-) create mode 100644 surround360_render/cmake/Hunter/HunterGate.cmake create mode 100644 surround360_render/cmake/Hunter/config.cmake diff --git a/surround360_render/CMakeLists.txt b/surround360_render/CMakeLists.txt index 1ee7c391..3165b6ae 100644 --- a/surround360_render/CMakeLists.txt +++ b/surround360_render/CMakeLists.txt @@ -1,9 +1,52 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.2) -PROJECT(Surround360Render CXX) +OPTION(USE_HUNTER "Enable Hunter CMake package handler, auto downloads and compiles require packages" OFF) -FIND_PACKAGE(OpenCV) -FIND_PACKAGE(Ceres REQUIRED) +IF(USE_HUNTER) + include(${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/HunterGate.cmake) + + HunterGate( + URL "https://github.com/ruslo/hunter/archive/v0.18.30.tar.gz" + SHA1 "6fc9258f984aed303eb960a95e36e19f2e7e83be" + LOCAL + ) +ENDIF() + +PROJECT(Surround360Render) + +IF(USE_HUNTER) + HUNTER_ADD_PACKAGE(Boost COMPONENTS system filesystem) + HUNTER_ADD_PACKAGE(gflags) + HUNTER_ADD_PACKAGE(glog) + HUNTER_ADD_PACKAGE(Eigen) + HUNTER_ADD_PACKAGE(OpenCV) + HUNTER_ADD_PACKAGE(ceres-solver) + + add_definitions("-DBOOST_ALL_NO_LIB") #remove auto linking from boost + + FIND_PACKAGE(Boost CONFIG REQUIRED system filesystem) + FIND_PACKAGE(gflags CONFIG REQUIRED) + FIND_PACKAGE(glog CONFIG REQUIRED) + FIND_PACKAGE(Eigen3 CONFIG REQUIRED) + FIND_PACKAGE(Ceres CONFIG REQUIRED) + + SET(GLOG_LIBS glog::glog) + SET(GFLAGS_LIBS gflags-static) + SET(BOOST_LIBS Boost::system Boost::filesystem) + set(EIGEN_LIBS Eigen3::Eigen) + SET(DOUBLE_CONVERSION_LIBS "") +ELSE() + FIND_PACKAGE(Ceres REQUIRED) + INCLUDE_DIRECTORIES(/usr/local/include/eigen3) + + SET(GLOG_LIBs glog) + SET(GFLAGS_LIBS gflags) + SET(BOOST_LIBS boost_filesystem boost_system) + set(EIGEN_LIBS "") + SET(DOUBLE_CONVERSION_LIBS double-conversion) +ENDIF() + +FIND_PACKAGE(OpenCV REQUIRED) INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/source) @@ -12,8 +55,8 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/source/optical_flow) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/source/camera_isp) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/source/calibration) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/source/render) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/source/thirdparty/supereasyjson) INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) -INCLUDE_DIRECTORIES(/usr/local/include/eigen3) if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") # required for clang, including AppleClang @@ -98,7 +141,19 @@ ADD_LIBRARY( ${render_SRC} ${util_SRC} ) + TARGET_COMPILE_FEATURES(LibVrCamera PRIVATE cxx_range_for) +IF(USE_HUNTER) +TARGET_LINK_LIBRARIES( + LibVrCamera + Eigen3::Eigen + Boost::system + Boost::filesystem + glog::glog + gflags-static + LibJSON +) +ENDIF() ### Raw2Rgb ### @@ -125,46 +180,61 @@ IF (DEFINED HALIDE_DIR) IF(NOT APPLE AND NOT MSVC) TARGET_LINK_LIBRARIES( Raw2Rgb - "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGenFast8${CMAKE_STATIC_LIBRARY_SUFFIX}" - "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen8${CMAKE_STATIC_LIBRARY_SUFFIX}" - "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGenFast16${CMAKE_STATIC_LIBRARY_SUFFIX}" - "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen16${CMAKE_STATIC_LIBRARY_SUFFIX}" - LibVrCamera - LibJSON - glog - gflags - ${OpenCV_LIBS} - Halide - dl - tinfo - z) + "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGenFast8${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen8${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGenFast16${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen16${CMAKE_STATIC_LIBRARY_SUFFIX}" + LibVrCamera + LibJSON + ${GLOG_LIBS} + ${GFLAG_LIBS} + ${OpenCV_LIBS} + Halide + dl + tinfo + z + ) ELSE() TARGET_LINK_LIBRARIES( Raw2Rgb - "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGenFast8${CMAKE_STATIC_LIBRARY_SUFFIX}" - "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen8${CMAKE_STATIC_LIBRARY_SUFFIX}" - "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGenFast16${CMAKE_STATIC_LIBRARY_SUFFIX}" - "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen16${CMAKE_STATIC_LIBRARY_SUFFIX}" - LibVrCamera - LibJSON - glog - gflags - ${OpenCV_LIBS} - Halide - dl) + "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGenFast8${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen8${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGenFast16${CMAKE_STATIC_LIBRARY_SUFFIX}" + "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen16${CMAKE_STATIC_LIBRARY_SUFFIX}" + LibVrCamera + LibJSON + ${GLOG_LIBS} + ${GFLAG_LIBS} + ${OpenCV_LIBS} + Halide + dl + ) ENDIF() ELSE() ADD_EXECUTABLE(Raw2Rgb source/camera_isp/Raw2Rgb.cpp) + +if(USE_HUNTER) #dl and z not supported in hunter yet TARGET_LINK_LIBRARIES( Raw2Rgb - LibVrCamera - LibJSON - glog - gflags - dl - z - ${OpenCV_LIBS} + LibVrCamera + LibJSON + ${GLOG_LIBS} + ${GFLAG_LIBS} + ${OpenCV_LIBS} ) +else() + TARGET_LINK_LIBRARIES( + Raw2Rgb + LibVrCamera + LibJSON + ${GLOG_LIBS} + ${GFLAG_LIBS} + dl + z + ${OpenCV_LIBS} + ) +endif() + ENDIF() ### TestRenderStereoPanorama ### @@ -178,9 +248,8 @@ TARGET_LINK_LIBRARIES( TestRenderStereoPanorama LibVrCamera LibJSON - folly - glog - gflags + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} ${PLATFORM_SPECIFIC_LIBS} ) @@ -196,8 +265,10 @@ TARGET_LINK_LIBRARIES( TestJson LibVrCamera LibJSON - glog - gflags + ${GLOG_LIBS} + ${GFLAG_LIBS} + ${BOOST_LIBS} + ${OpenCV_LIBS} ) ### TestOpticalFlow ### @@ -211,8 +282,9 @@ TARGET_LINK_LIBRARIES( TestOpticalFlow LibVrCamera LibJSON - glog - gflags + ${GLOG_LIBS} + ${GFLAG_LIBS} + ${BOOST_LIBS} ${OpenCV_LIBS} ${PLATFORM_SPECIFIC_LIBS} ) @@ -227,8 +299,8 @@ TARGET_COMPILE_FEATURES(TestLogger PRIVATE cxx_range_for) TARGET_LINK_LIBRARIES( TestLogger LibVrCamera - glog - gflags + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} ) @@ -249,8 +321,8 @@ IF (DEFINED HALIDE_DIR) Unpacker LibVrCamera LibJSON - glog - gflags + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGenFast8${CMAKE_STATIC_LIBRARY_SUFFIX}" "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen8${CMAKE_STATIC_LIBRARY_SUFFIX}" @@ -268,8 +340,8 @@ IF (DEFINED HALIDE_DIR) Unpacker LibVrCamera LibJSON - glog - gflags + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGenFast8${CMAKE_STATIC_LIBRARY_SUFFIX}" "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen8${CMAKE_STATIC_LIBRARY_SUFFIX}" @@ -296,9 +368,8 @@ TARGET_LINK_LIBRARIES( TestHyperPreview LibVrCamera LibJSON - folly - glog - gflags + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} ${PLATFORM_SPECIFIC_LIBS} ) @@ -314,9 +385,8 @@ TARGET_LINK_LIBRARIES( TestPoleRemoval LibVrCamera LibJSON - folly - gflags - glog + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} ${PLATFORM_SPECIFIC_LIBS} ) @@ -332,8 +402,8 @@ TARGET_LINK_LIBRARIES( TestExtractAlphaChannel LibVrCamera LibJSON - gflags - glog + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} ${PLATFORM_SPECIFIC_LIBS} ) @@ -358,8 +428,8 @@ IF (DEFINED HALIDE_DIR) "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen16${CMAKE_STATIC_LIBRARY_SUFFIX}" LibVrCamera LibJSON - gflags - glog + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} ${CERES_LIBRARIES} Halide @@ -376,8 +446,8 @@ IF (DEFINED HALIDE_DIR) "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen16${CMAKE_STATIC_LIBRARY_SUFFIX}" LibVrCamera LibJSON - gflags - glog + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} ${CERES_LIBRARIES} Halide @@ -394,8 +464,8 @@ ELSE() TestColorCalibration LibVrCamera LibJSON - gflags - glog + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} ${CERES_LIBRARIES} ${PLATFORM_SPECIFIC_LIBS} @@ -421,9 +491,8 @@ IF (DEFINED HALIDE_DIR) "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen16${CMAKE_STATIC_LIBRARY_SUFFIX}" LibVrCamera LibJSON - gflags - glog - folly + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} ${CERES_LIBRARIES} Halide @@ -440,9 +509,8 @@ IF (DEFINED HALIDE_DIR) "${CMAKE_CURRENT_BINARY_DIR}/CameraIspGen16${CMAKE_STATIC_LIBRARY_SUFFIX}" LibVrCamera LibJSON - gflags - glog - folly + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} ${CERES_LIBRARIES} Halide @@ -459,9 +527,8 @@ ELSE() TestVignettingCalibration LibVrCamera LibJSON - gflags - glog - folly + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} ${CERES_LIBRARIES} ${PLATFORM_SPECIFIC_LIBS} @@ -478,9 +545,8 @@ TARGET_LINK_LIBRARIES( TestVignettingDataAcquisition LibVrCamera LibJSON - gflags - glog - folly + ${GLOG_LIBS} + ${GFLAG_LIBS} ${OpenCV_LIBS} ${CERES_LIBRARIES} ${PLATFORM_SPECIFIC_LIBS} @@ -496,12 +562,11 @@ TARGET_LINK_LIBRARIES( GeometricCalibration LibVrCamera LibJSON - gflags - glog - folly - boost_filesystem - boost_system - double-conversion + ${GLOG_LIBS} + ${GFLAG_LIBS} + ${EIGEN_LIBS} + ${BOOST_LIBS} + ${DOUBLE_CONVERSION_LIBS} ${OpenCV_LIBS} ${PLATFORM_SPECIFIC_LIBS} ${CERES_LIBRARIES} diff --git a/surround360_render/cmake/Hunter/HunterGate.cmake b/surround360_render/cmake/Hunter/HunterGate.cmake new file mode 100644 index 00000000..99882d24 --- /dev/null +++ b/surround360_render/cmake/Hunter/HunterGate.cmake @@ -0,0 +1,508 @@ +# Copyright (c) 2013-2015, Ruslan Baratov +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This is a gate file to Hunter package manager. +# Include this file using `include` command and add package you need, example: +# +# cmake_minimum_required(VERSION 3.0) +# +# include("cmake/HunterGate.cmake") +# HunterGate( +# URL "https://github.com/path/to/hunter/archive.tar.gz" +# SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d" +# ) +# +# project(MyProject) +# +# hunter_add_package(Foo) +# hunter_add_package(Boo COMPONENTS Bar Baz) +# +# Projects: +# * https://github.com/hunter-packages/gate/ +# * https://github.com/ruslo/hunter + +cmake_minimum_required(VERSION 3.0) # Minimum for Hunter +include(CMakeParseArguments) # cmake_parse_arguments + +option(HUNTER_ENABLED "Enable Hunter package manager support" ON) +option(HUNTER_STATUS_PRINT "Print working status" ON) +option(HUNTER_STATUS_DEBUG "Print a lot info" OFF) + +set(HUNTER_WIKI "https://github.com/ruslo/hunter/wiki") + +function(hunter_gate_status_print) + foreach(print_message ${ARGV}) + if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG) + message(STATUS "[hunter] ${print_message}") + endif() + endforeach() +endfunction() + +function(hunter_gate_status_debug) + foreach(print_message ${ARGV}) + if(HUNTER_STATUS_DEBUG) + string(TIMESTAMP timestamp) + message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}") + endif() + endforeach() +endfunction() + +function(hunter_gate_wiki wiki_page) + message("------------------------------ WIKI -------------------------------") + message(" ${HUNTER_WIKI}/${wiki_page}") + message("-------------------------------------------------------------------") + message("") + message(FATAL_ERROR "") +endfunction() + +function(hunter_gate_internal_error) + message("") + foreach(print_message ${ARGV}) + message("[hunter ** INTERNAL **] ${print_message}") + endforeach() + message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") + message("") + hunter_gate_wiki("error.internal") +endfunction() + +function(hunter_gate_fatal_error) + cmake_parse_arguments(hunter "" "WIKI" "" "${ARGV}") + string(COMPARE EQUAL "${hunter_WIKI}" "" have_no_wiki) + if(have_no_wiki) + hunter_gate_internal_error("Expected wiki") + endif() + message("") + foreach(x ${hunter_UNPARSED_ARGUMENTS}) + message("[hunter ** FATAL ERROR **] ${x}") + endforeach() + message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") + message("") + hunter_gate_wiki("${hunter_WIKI}") +endfunction() + +function(hunter_gate_user_error) + hunter_gate_fatal_error(${ARGV} WIKI "error.incorrect.input.data") +endfunction() + +function(hunter_gate_self root version sha1 result) + string(COMPARE EQUAL "${root}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("root is empty") + endif() + + string(COMPARE EQUAL "${version}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("version is empty") + endif() + + string(COMPARE EQUAL "${sha1}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("sha1 is empty") + endif() + + string(SUBSTRING "${sha1}" 0 7 archive_id) + + if(EXISTS "${root}/cmake/Hunter") + set(hunter_self "${root}") + else() + set( + hunter_self + "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked" + ) + endif() + + set("${result}" "${hunter_self}" PARENT_SCOPE) +endfunction() + +# Set HUNTER_GATE_ROOT cmake variable to suitable value. +function(hunter_gate_detect_root) + # Check CMake variable + string(COMPARE NOTEQUAL "${HUNTER_ROOT}" "" not_empty) + if(not_empty) + set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable") + return() + endif() + + # Check environment variable + string(COMPARE NOTEQUAL "$ENV{HUNTER_ROOT}" "" not_empty) + if(not_empty) + set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT detected by environment variable") + return() + endif() + + # Check HOME environment variable + string(COMPARE NOTEQUAL "$ENV{HOME}" "" result) + if(result) + set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable") + return() + endif() + + # Check SYSTEMDRIVE and USERPROFILE environment variable (windows only) + if(WIN32) + string(COMPARE NOTEQUAL "$ENV{SYSTEMDRIVE}" "" result) + if(result) + set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug( + "HUNTER_ROOT set using SYSTEMDRIVE environment variable" + ) + return() + endif() + + string(COMPARE NOTEQUAL "$ENV{USERPROFILE}" "" result) + if(result) + set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug( + "HUNTER_ROOT set using USERPROFILE environment variable" + ) + return() + endif() + endif() + + hunter_gate_fatal_error( + "Can't detect HUNTER_ROOT" + WIKI "error.detect.hunter.root" + ) +endfunction() + +macro(hunter_gate_lock dir) + if(NOT HUNTER_SKIP_LOCK) + if("${CMAKE_VERSION}" VERSION_LESS "3.2") + hunter_gate_fatal_error( + "Can't lock, upgrade to CMake 3.2 or use HUNTER_SKIP_LOCK" + WIKI "error.can.not.lock" + ) + endif() + hunter_gate_status_debug("Locking directory: ${dir}") + file(LOCK "${dir}" DIRECTORY GUARD FUNCTION) + hunter_gate_status_debug("Lock done") + endif() +endmacro() + +function(hunter_gate_download dir) + string( + COMPARE + NOTEQUAL + "$ENV{HUNTER_DISABLE_AUTOINSTALL}" + "" + disable_autoinstall + ) + if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL) + hunter_gate_fatal_error( + "Hunter not found in '${dir}'" + "Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'" + "Settings:" + " HUNTER_ROOT: ${HUNTER_GATE_ROOT}" + " HUNTER_SHA1: ${HUNTER_GATE_SHA1}" + WIKI "error.run.install" + ) + endif() + string(COMPARE EQUAL "${dir}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("Empty 'dir' argument") + endif() + + string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("HUNTER_GATE_SHA1 empty") + endif() + + string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("HUNTER_GATE_URL empty") + endif() + + set(done_location "${dir}/DONE") + set(sha1_location "${dir}/SHA1") + + set(build_dir "${dir}/Build") + set(cmakelists "${dir}/CMakeLists.txt") + + hunter_gate_lock("${dir}") + if(EXISTS "${done_location}") + # while waiting for lock other instance can do all the job + hunter_gate_status_debug("File '${done_location}' found, skip install") + return() + endif() + + file(REMOVE_RECURSE "${build_dir}") + file(REMOVE_RECURSE "${cmakelists}") + + file(MAKE_DIRECTORY "${build_dir}") # check directory permissions + + # Disabling languages speeds up a little bit, reduces noise in the output + # and avoids path too long windows error + file( + WRITE + "${cmakelists}" + "cmake_minimum_required(VERSION 3.0)\n" + "project(HunterDownload LANGUAGES NONE)\n" + "include(ExternalProject)\n" + "ExternalProject_Add(\n" + " Hunter\n" + " URL\n" + " \"${HUNTER_GATE_URL}\"\n" + " URL_HASH\n" + " SHA1=${HUNTER_GATE_SHA1}\n" + " DOWNLOAD_DIR\n" + " \"${dir}\"\n" + " SOURCE_DIR\n" + " \"${dir}/Unpacked\"\n" + " CONFIGURE_COMMAND\n" + " \"\"\n" + " BUILD_COMMAND\n" + " \"\"\n" + " INSTALL_COMMAND\n" + " \"\"\n" + ")\n" + ) + + if(HUNTER_STATUS_DEBUG) + set(logging_params "") + else() + set(logging_params OUTPUT_QUIET) + endif() + + hunter_gate_status_debug("Run generate") + + # Need to add toolchain file too. + # Otherwise on Visual Studio + MDD this will fail with error: + # "Could not find an appropriate version of the Windows 10 SDK installed on this machine" + if(EXISTS "${CMAKE_TOOLCHAIN_FILE}") + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}") + else() + # 'toolchain_arg' can't be empty + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=") + endif() + + execute_process( + COMMAND "${CMAKE_COMMAND}" "-H${dir}" "-B${build_dir}" "-G${CMAKE_GENERATOR}" "${toolchain_arg}" + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error("Configure project failed") + endif() + + hunter_gate_status_print( + "Initializing Hunter workspace (${HUNTER_GATE_SHA1})" + " ${HUNTER_GATE_URL}" + " -> ${dir}" + ) + execute_process( + COMMAND "${CMAKE_COMMAND}" --build "${build_dir}" + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error("Build project failed") + endif() + + file(REMOVE_RECURSE "${build_dir}") + file(REMOVE_RECURSE "${cmakelists}") + + file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}") + file(WRITE "${done_location}" "DONE") + + hunter_gate_status_debug("Finished") +endfunction() + +# Must be a macro so master file 'cmake/Hunter' can +# apply all variables easily just by 'include' command +# (otherwise PARENT_SCOPE magic needed) +macro(HunterGate) + if(HUNTER_GATE_DONE) + # variable HUNTER_GATE_DONE set explicitly for external project + # (see `hunter_download`) + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() + + # First HunterGate command will init Hunter, others will be ignored + get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET) + + if(NOT HUNTER_ENABLED) + # Empty function to avoid error "unknown function" + function(hunter_add_package) + endfunction() + elseif(_hunter_gate_done) + hunter_gate_status_debug("Secondary HunterGate (use old settings)") + hunter_gate_self( + "${HUNTER_CACHED_ROOT}" + "${HUNTER_VERSION}" + "${HUNTER_SHA1}" + _hunter_self + ) + include("${_hunter_self}/cmake/Hunter") + else() + set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_LIST_DIR}") + + string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name) + if(_have_project_name) + hunter_gate_fatal_error( + "Please set HunterGate *before* 'project' command. " + "Detected project: ${PROJECT_NAME}" + WIKI "error.huntergate.before.project" + ) + endif() + + cmake_parse_arguments( + HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV} + ) + + string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1) + string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url) + string( + COMPARE + NOTEQUAL + "${HUNTER_GATE_UNPARSED_ARGUMENTS}" + "" + _have_unparsed + ) + string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global) + string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath) + + if(_have_unparsed) + hunter_gate_user_error( + "HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}" + ) + endif() + if(_empty_sha1) + hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory") + endif() + if(_empty_url) + hunter_gate_user_error("URL suboption of HunterGate is mandatory") + endif() + if(_have_global) + if(HUNTER_GATE_LOCAL) + hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)") + endif() + if(_have_filepath) + hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)") + endif() + endif() + if(HUNTER_GATE_LOCAL) + if(_have_global) + hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)") + endif() + if(_have_filepath) + hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)") + endif() + endif() + if(_have_filepath) + if(_have_global) + hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)") + endif() + if(HUNTER_GATE_LOCAL) + hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)") + endif() + endif() + + hunter_gate_detect_root() # set HUNTER_GATE_ROOT + + # Beautify path, fix probable problems with windows path slashes + get_filename_component( + HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE + ) + hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}") + if(NOT HUNTER_ALLOW_SPACES_IN_PATH) + string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces) + if(NOT _contain_spaces EQUAL -1) + hunter_gate_fatal_error( + "HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces." + "Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error" + "(Use at your own risk!)" + WIKI "error.spaces.in.hunter.root" + ) + endif() + endif() + + string( + REGEX + MATCH + "[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*" + HUNTER_GATE_VERSION + "${HUNTER_GATE_URL}" + ) + string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty) + if(_is_empty) + set(HUNTER_GATE_VERSION "unknown") + endif() + + hunter_gate_self( + "${HUNTER_GATE_ROOT}" + "${HUNTER_GATE_VERSION}" + "${HUNTER_GATE_SHA1}" + _hunter_self + ) + + set(_master_location "${_hunter_self}/cmake/Hunter") + if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter") + # Hunter downloaded manually (e.g. by 'git clone') + set(_unused "xxxxxxxxxx") + set(HUNTER_GATE_SHA1 "${_unused}") + set(HUNTER_GATE_VERSION "${_unused}") + else() + get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE) + set(_done_location "${_archive_id_location}/DONE") + set(_sha1_location "${_archive_id_location}/SHA1") + + # Check Hunter already downloaded by HunterGate + if(NOT EXISTS "${_done_location}") + hunter_gate_download("${_archive_id_location}") + endif() + + if(NOT EXISTS "${_done_location}") + hunter_gate_internal_error("hunter_gate_download failed") + endif() + + if(NOT EXISTS "${_sha1_location}") + hunter_gate_internal_error("${_sha1_location} not found") + endif() + file(READ "${_sha1_location}" _sha1_value) + string(COMPARE EQUAL "${_sha1_value}" "${HUNTER_GATE_SHA1}" _is_equal) + if(NOT _is_equal) + hunter_gate_internal_error( + "Short SHA1 collision:" + " ${_sha1_value} (from ${_sha1_location})" + " ${HUNTER_GATE_SHA1} (HunterGate)" + ) + endif() + if(NOT EXISTS "${_master_location}") + hunter_gate_user_error( + "Master file not found:" + " ${_master_location}" + "try to update Hunter/HunterGate" + ) + endif() + endif() + include("${_master_location}") + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() +endmacro() diff --git a/surround360_render/cmake/Hunter/config.cmake b/surround360_render/cmake/Hunter/config.cmake new file mode 100644 index 00000000..8ca1e902 --- /dev/null +++ b/surround360_render/cmake/Hunter/config.cmake @@ -0,0 +1,4 @@ +hunter_config(OpenCV + VERSION ${HUNTER_OpenCV_VERSION} + CMAKE_ARGS WITH_CUDA=OFF +)