/* * Copyright (c) 2025. MadVoxel AG * All rights reserved. */ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "XmpBuilder.hpp" #include "Extensions/FmtFormatter.hpp" namespace OpenVulkano::Image { XmpBuilder::XmpBuilder() { xmpData << "\n"; // XMP Wrapper xmpData << ""; } std::string XmpBuilder::Finalize() { if (!complete) { // Finalize xmpData << ""; xmpData << ""; // XMP Wrapper complete = true; } return xmpData.str(); } [[maybe_unused]] XmpBuilder& XmpBuilder::SetCameraIntrinsic(const Math::CameraIntrinsicWithResolution& intrinsic) { // Calibration matrix in row-major format const auto& mat = intrinsic.GetMatrix(); xmpData << fmt::format("{} {} {} {} {} {} {} {} {}", mat[0][0], mat[1][0], mat[2][0], mat[0][1], mat[1][1], mat[2][1], mat[0][2], mat[1][2], mat[2][2]); xmpData << fmt::format("" "{}{}" "{}{}" "", intrinsic.Fx(), intrinsic.Fy(), intrinsic.Cx(), intrinsic.Cy() ); // Field of View xmpData << fmt::format("" "{}{}" "", Math::Utils::degrees(intrinsic.GetFovX()), Math::Utils::degrees(intrinsic.GetFovY())); return *this; } [[maybe_unused]] XmpBuilder& XmpBuilder::SetPosition(const Math::Vector3f& position) { xmpData << fmt::format("" "{}{}{}" "", position.x, position.y, position.z); return *this; } [[maybe_unused]] XmpBuilder& XmpBuilder::SetOrientation(const Math::Vector3f& orientation) { Math::Vector3f ori = Math::Utils::degrees(orientation); xmpData << fmt::format("" "{}{}{}" "", ori.x, ori.y, ori.z); return *this; } [[maybe_unused]] XmpBuilder& XmpBuilder::SetSensorSize(const Math::Vector2f& sensorSize) { xmpData << fmt::format("" "{}{}" "", sensorSize.x, sensorSize.y); return *this; } [[maybe_unused]] XmpBuilder& XmpBuilder::SetFocalLength(const float focalLengthMM) { xmpData << "" << focalLengthMM << ""; return *this; } [[maybe_unused]] XmpBuilder& XmpBuilder::SetExposureTime(double exposureTime) { xmpData << fmt::format("{0}{0}", exposureTime); return *this; } [[maybe_unused]] XmpBuilder& XmpBuilder::SetCreateDateNow() { return SetCreateDate(fmt::format("{:%FT%T%Ez}", std::chrono::system_clock::now())); } [[maybe_unused]] XmpBuilder& XmpBuilder::SetCreateDate(const std::time_t time) { #ifdef WIN32 return SetCreateDate(fmt::format("{:%FT%T%Ez}", std::chrono::system_clock::from_time_t(time))); #else return SetCreateDate(fmt::format("{:%FT%T%Ez}", fmt::localtime(time))); #endif } [[maybe_unused]] XmpBuilder& XmpBuilder::SetCreateDate(const std::string& createDate) { xmpData << "" << createDate << ""; return *this; } }