plumageRender/base/renderConfig.cpp

111 lines
4.8 KiB
C++

#include "renderConfig.h"
void PlumageConfig::PlumageConfiguration::readConfigurationFromToml(std::string configFilePath,Settings& settings)
{
auto config = toml::parse(configFilePath);
auto& tomlSettings = toml::find(config, "settings");
settings.width = toml::find<uint32_t>(tomlSettings, "width");
settings.height = toml::find<uint32_t>(tomlSettings, "height");
settings.multiSampling = toml::find<bool>(tomlSettings, "multiSampling");
auto sampleCount = toml::find<uint32_t>(tomlSettings, "sampleCount");
settings.rotateModel = toml::find<bool>(tomlSettings, "rotateModel");
settings.modelRotateSpeed = toml::find<float>(tomlSettings, "modelRotateSpeed");
settings.startFrameIndex = toml::find<uint32_t>(tomlSettings, "startFrameIndex");
settings.endFrameIndex = toml::find<uint32_t>(tomlSettings, "endFrameIndex");
settings.videoFrameRate = toml::find<uint32_t>(tomlSettings, "videoFrameRate");
auto& camera = toml::find(tomlSettings, "camera");
settings.calibrationWidth = toml::find<int>(camera, "cam_width");
settings.calibrationHeight = toml::find<int>(camera, "cam_height");
std::string fX = toml::find<std::string>(camera, "fx");
std::string fY = toml::find<std::string>(camera, "fy");
std::string cX = toml::find<std::string>(camera, "cX");
std::string cY = toml::find<std::string>(camera, "cY");
std::vector<float> bottomCenter = toml::find<std::vector<float>>(camera, "bottomCenter");
std::vector<float> bottomNormal = toml::find<std::vector<float>>(camera, "bottomNormal");
std::vector<float> cameraFixation = toml::find<std::vector<float>>(camera, "center");
std::vector<std::vector<float>> cameraTracks = toml::find<std::vector<std::vector<float>>>(camera, "cameraTracks");
std::vector<std::vector<std::vector<float>>> cameraAngle = toml::find<std::vector<std::vector<std::vector<float>>>>(camera, "cameraAngle");
auto& debug = toml::find(tomlSettings, "debug");
settings.validation = toml::find<bool>(debug, "validation");
settings.vsync = toml::find<bool>(debug, "vsync");
settings.headless = toml::find<bool>(debug, "headless");
settings.outputPNGimage = toml::find<bool>(debug, "outputPNGimage");
settings.debugMode = toml::find<bool>(debug, "debugMode");
//settings.cleanUpImageSequece = toml::find_or<bool>(debug, "cleanUpImageSequece");
/*
conversion: type and coordinate system
*/
size_t sz;
settings.fX = std::stof(fX, &sz);
settings.fY = std::stof(fY, &sz);
settings.cX = std::stof(cX, &sz);
settings.cY = std::stof(cY, &sz);
settings.bottomCenter = glm::vec3(bottomCenter[0], -bottomCenter[1], -bottomCenter[2]);
settings.bottomNormal = glm::vec3(bottomNormal[0], -bottomNormal[1], -bottomNormal[2]);
settings.cameraFixation = glm::vec3(cameraFixation[0], -cameraFixation[1], -cameraFixation[2]);
auto cameraTracksAndAngleSize = std::min(cameraTracks.size(), cameraAngle.size());
settings.cameraTracks.resize(cameraTracksAndAngleSize);
settings.cameraAngle.resize(cameraTracksAndAngleSize);
for (uint64_t i = 0; i < cameraTracksAndAngleSize; i++)
{
settings.cameraTracks[i] = glm::vec3(cameraTracks[i][0], -cameraTracks[i][1] , -cameraTracks[i][2]);
settings.cameraAngle[i] = glm::mat3(glm::vec3(cameraAngle[i][0][0], cameraAngle[i][0][1], cameraAngle[i][0][2]),
glm::vec3(cameraAngle[i][1][0], cameraAngle[i][1][1], cameraAngle[i][1][2]),
glm::vec3(cameraAngle[i][2][0], cameraAngle[i][2][1], cameraAngle[i][2][2]));
}
glm::vec3 cameraTracksVecA = settings.cameraTracks[cameraTracksAndAngleSize / 4] - settings.cameraTracks[0];
glm::vec3 cameraTracksVecB = settings.cameraTracks[cameraTracksAndAngleSize / 2] - settings.cameraTracks[0] ;
glm::vec3 cameraTracksCircleNormal = glm::cross(cameraTracksVecA, cameraTracksVecB);
glm::mat4 cameraTracksRotionMatrix = getVectorRotationMatrix(cameraTracksVecA, cameraTracksVecB);
for (uint64_t i = 0; i < cameraTracksAndAngleSize; i++)
{
settings.cameraTracks[i] = settings.cameraTracks[i] * cameraTracksRotionMatrix;
}
//float ratioX =(float)settings.width / (float)settings.calibrationWidth;
//float ratioY = (float)settings.height / (float)settings.calibrationHeight;
//settings.fX = settings.fX * ratioX;
//settings.fY = settings.fY * ratioY;
//settings.cX = settings.cX * ratioX;
//settings.cY = settings.cY * ratioY;
}
glm::mat4 PlumageConfig::PlumageConfiguration::getVectorRotationMatrix(glm::vec3 vectorBefore, glm::vec3 vectorAfter)
{
glm::vec3 rotationAxis = glm::normalize(glm::cross(glm::vec3(0.f, 1.f, 0.f), vectorBefore));
float cosTheta = glm::dot(vectorAfter, vectorBefore);
float angle = acos(cosTheta);
angle = angle * M_PI / 180;
glm::mat4 resultMatix = glm::rotate(glm::mat4(1.0f), angle, rotationAxis);
}
PlumageConfig::PlumageConfiguration::PlumageConfiguration()
{
readConfigurationFromToml(filePath.configFilePath, settings);
}
PlumageConfig::PlumageConfiguration::~PlumageConfiguration()
{
}