#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(tomlSettings, "width"); settings.height = toml::find(tomlSettings, "height"); settings.multiSampling = toml::find(tomlSettings, "multiSampling"); auto sampleCount = toml::find(tomlSettings, "sampleCount"); settings.rotateModel = toml::find(tomlSettings, "rotateModel"); settings.modelRotateSpeed = toml::find(tomlSettings, "modelRotateSpeed"); settings.startFrameIndex = toml::find(tomlSettings, "startFrameIndex"); settings.endFrameIndex = toml::find(tomlSettings, "endFrameIndex"); settings.videoFrameRate = toml::find(tomlSettings, "videoFrameRate"); auto& camera = toml::find(tomlSettings, "camera"); settings.calibrationWidth = toml::find(camera, "cam_width"); settings.calibrationHeight = toml::find(camera, "cam_height"); std::string fX = toml::find(camera, "fx"); std::string fY = toml::find(camera, "fy"); std::string cX = toml::find(camera, "cX"); std::string cY = toml::find(camera, "cY"); std::vector bottomCenter = toml::find>(camera, "bottomCenter"); std::vector bottomNormal = toml::find>(camera, "bottomNormal"); std::vector cameraFixation = toml::find>(camera, "center"); std::vector> cameraTracks = toml::find>>(camera, "cameraTracks"); std::vector>> cameraAngle = toml::find>>>(camera, "cameraAngle"); auto& debug = toml::find(tomlSettings, "debug"); settings.validation = toml::find(debug, "validation"); settings.vsync = toml::find(debug, "vsync"); settings.headless = toml::find(debug, "headless"); settings.outputPNGimage = toml::find(debug, "outputPNGimage"); settings.debugMode = toml::find(debug, "debugMode"); //settings.cleanUpImageSequece = toml::find_or(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]); 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.f,0.f,0.f) - settings.bottomCenter; glm::mat4 trans = glm::mat4(1.0f); trans = glm::translate(trans, translate); settings.cameraFixation = trans * glm::vec4(settings.cameraFixation, 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() { }