/*
* 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::string& createDate)
{
xmpData << "" << createDate << "";
return *this;
}
}