140 lines
6.8 KiB
C++
140 lines
6.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]);
|
|
std::vector<glm::vec3> cameraTrackToFixation;
|
|
auto cameraTracksAndAngleSize = std::min(cameraTracks.size(), cameraAngle.size());
|
|
settings.cameraTracks.resize(cameraTracksAndAngleSize);
|
|
settings.cameraAngle.resize(cameraTracksAndAngleSize);
|
|
cameraTrackToFixation.resize(cameraTracksAndAngleSize);
|
|
|
|
for (uint64_t i = 0; i < cameraTracksAndAngleSize; i++)
|
|
{
|
|
settings.cameraTracks[i] = glm::vec3(cameraTracks[i][0], -cameraTracks[i][1] , -cameraTracks[i][2]);
|
|
cameraTrackToFixation[i] = settings.cameraTracks[i] - settings.bottomCenter;
|
|
|
|
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 cameraTrackFixation = settings.cameraTracks[cameraTracksAndAngleSize / 4] - settings.cameraFixation;
|
|
|
|
|
|
glm::vec3 cameraTracksCircleNormal = glm::normalize( glm::cross(cameraTracksVecA, cameraTracksVecB));
|
|
glm::vec3 rotationAxis = glm::normalize(glm::cross(cameraTracksCircleNormal, glm::vec3(0.f, 1.f, 0.f)));
|
|
float rotationAngle = acos(glm::dot(cameraTracksCircleNormal, glm::vec3(0.f, 1.f, 0.f)));
|
|
glm::mat4 cameraTracksRotationMatrix = glm::rotate(glm::mat4(1.f), rotationAngle, rotationAxis);
|
|
settings.cameraFixation = cameraTracksRotationMatrix * glm::vec4(settings.cameraFixation, 1.0f);
|
|
settings.bottomCenter = cameraTracksRotationMatrix * glm::vec4(settings.bottomCenter, 1.0f);
|
|
|
|
glm::vec3 translate =glm::vec3(0.0f,0.0f,0.0f) - settings.bottomCenter;
|
|
glm::mat4 trans = glm::mat4(1.0f);
|
|
trans = glm::translate(trans, translate);
|
|
settings.cameraFixation = trans * glm::vec4(settings.cameraFixation, 1.0f);
|
|
settings.bottomCenter = trans * glm::vec4(settings.bottomCenter, 1.0f);
|
|
for (uint64_t i = 0; i < cameraTracksAndAngleSize; i++)
|
|
{
|
|
cameraTrackToFixation[i] = cameraTracksRotationMatrix * glm::vec4(cameraTrackToFixation[i], 1.0f);
|
|
cameraTrackToFixation[i] = trans * glm::vec4(cameraTrackToFixation[i], 1.0f);
|
|
cameraTrackToFixation[i] = glm::vec3(std::truncf(cameraTrackToFixation[i][0] * 10000) / 10000, -std::truncf(cameraTrackToFixation[i][1] * 10000)/10000, -std::truncf(cameraTrackToFixation[i][2] * 10000)/10000);
|
|
settings.cameraTracks[i] = settings.bottomCenter + cameraTrackToFixation[i] ;
|
|
settings.cameraAngle[i] = cameraTracksRotationMatrix * glm::mat4(settings.cameraAngle[i]) ;
|
|
}
|
|
//translate = settings.bottomCenter - ;
|
|
trans = glm::translate(trans, translate);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//settings.bottomNormal = cameraTracksRotationMatrix * glm::vec4(settings.bottomNormal, 1.0f);
|
|
//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::vec3 PlumageConfig::PlumageConfiguration::getTranslatedVector(glm::vec3 currentVector,glm::vec3 targetVector)
|
|
{
|
|
glm::vec3 translate = glm::vec3(0.f,0.f,0.f) - targetVector;
|
|
glm::mat4 trans = glm::mat4(1.0f);
|
|
trans = glm::translate(trans, translate);
|
|
return glm::vec3(trans * glm::vec4(currentVector, 1.0f));
|
|
}
|
|
|
|
glm::mat4 PlumageConfig::PlumageConfiguration::getVectorRotationMatrix(glm::vec3 vectorBefore, glm::vec3 vectorAfter)
|
|
{
|
|
glm::vec3 rotationAxis = glm::normalize(glm::cross(vectorAfter, 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()
|
|
{
|
|
} |