plumageRender/base/renderConfig.cpp

192 lines
8.0 KiB
C++
Raw Normal View History

2024-04-17 11:26:38 +08:00
#include "renderConfig.h"
2024-04-19 18:08:16 +08:00
void PlumageConfig::PlumageConfiguration::readConfigurationFromToml(std::string configFilePath,Settings& settings)
2024-04-17 11:26:38 +08:00
{
2024-04-28 15:28:46 +08:00
/*
parse config file
*/
2024-04-18 18:26:07 +08:00
auto config = toml::parse(configFilePath);
2024-04-28 15:28:46 +08:00
// get settings
2024-04-18 18:26:07 +08:00
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");
2024-04-28 15:28:46 +08:00
/*
get settings.camera
*/
2024-04-19 18:08:16 +08:00
auto& camera = toml::find(tomlSettings, "camera");
2024-04-22 18:19:55 +08:00
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");
2024-04-19 18:08:16 +08:00
std::string cX = toml::find<std::string>(camera, "cX");
std::string cY = toml::find<std::string>(camera, "cY");
2024-04-28 15:28:46 +08:00
std::vector<float> pedestledModelTopCenter = toml::find<std::vector<float>>(camera, "pedestledModelTopCenter");
2024-04-19 18:08:16 +08:00
std::vector<float> bottomCenter = toml::find<std::vector<float>>(camera, "bottomCenter");
2024-04-28 00:41:08 +08:00
std::vector<int> bottomNormal = toml::find<std::vector<int>>(camera, "bottomNormal");
2024-04-23 16:56:42 +08:00
std::vector<float> cameraFixation = toml::find<std::vector<float>>(camera, "center");
2024-04-19 18:08:16 +08:00
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");
2024-04-23 16:56:42 +08:00
2024-04-28 15:28:46 +08:00
/*
get settings.debug
*/
2024-04-19 18:08:16 +08:00
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");
2024-04-28 18:15:35 +08:00
/*
get filePath
2024-04-28 18:15:35 +08:00
*/
auto& tomlFilePath = toml::find(config, "FilePath");
//gltf model path
filePath.glTFModelFilePath = setFilePathFromToml(tomlFilePath, "glTFModelFilePath");
filePath.envMapFilePath = setFilePathFromToml(tomlFilePath,"envMapFilePath");
filePath.imageOutputPath = setFilePathFromToml(tomlFilePath, "imageOutputPath");
filePath.videoOutputPath = setFilePathFromToml(tomlFilePath, "videoOutputPath");
//filePath. = setFilePathFromToml(tomlFilePath, );
//filePath. = setFilePathFromToml(tomlFilePath, );
//filePath. = setFilePathFromToml(tomlFilePath, );
//filePath.imageOutputPath = setFilePathFromToml(tomlFilePath, "imageOutputPath");
//filePath.videoOutputPath = setFilePathFromToml(tomlFilePath, "videoOutputPath");
2024-04-28 18:15:35 +08:00
2024-04-19 18:08:16 +08:00
/*
2024-04-25 18:08:20 +08:00
conversion: type and coordinate system
2024-04-19 18:08:16 +08:00
*/
2024-04-23 16:56:42 +08:00
2024-04-19 18:08:16 +08:00
size_t sz;
2024-04-22 18:19:55 +08:00
settings.fX = std::stof(fX, &sz);
settings.fY = std::stof(fY, &sz);
2024-04-19 18:08:16 +08:00
settings.cX = std::stof(cX, &sz);
settings.cY = std::stof(cY, &sz);
2024-04-28 15:28:46 +08:00
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;
2024-04-19 18:08:16 +08:00
auto cameraTracksAndAngleSize = std::min(cameraTracks.size(), cameraAngle.size());
settings.cameraTracks.resize(cameraTracksAndAngleSize);
settings.cameraAngle.resize(cameraTracksAndAngleSize);
2024-04-28 15:28:46 +08:00
cameraTrackToFixation.resize(cameraTracksAndAngleSize);
2024-04-19 18:08:16 +08:00
for (uint64_t i = 0; i < cameraTracksAndAngleSize; i++)
{
2024-04-28 15:28:46 +08:00
settings.cameraTracks[i] = glm::vec3(cameraTracks[i][0], -cameraTracks[i][1] , cameraTracks[i][2]);
2024-04-27 17:13:59 +08:00
cameraTrackToFixation[i] = settings.cameraTracks[i] - settings.bottomCenter;
2024-04-25 18:08:20 +08:00
2024-04-28 00:41:08 +08:00
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]));
2024-04-19 18:08:16 +08:00
2024-04-25 18:08:20 +08:00
2024-04-19 18:08:16 +08:00
}
2024-04-25 18:08:20 +08:00
glm::vec3 cameraTracksVecA = settings.cameraTracks[cameraTracksAndAngleSize / 4] - settings.cameraTracks[0];
glm::vec3 cameraTracksVecB = settings.cameraTracks[cameraTracksAndAngleSize / 2] - settings.cameraTracks[0] ;
2024-04-26 18:22:30 +08:00
//glm::vec3 cameraTrackFixation = settings.cameraTracks[cameraTracksAndAngleSize / 4] - settings.cameraFixation;
2024-04-25 18:08:20 +08:00
2024-04-26 18:22:30 +08:00
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);
2024-04-25 18:08:20 +08:00
2024-04-28 11:24:37 +08:00
glm::vec3 translate =glm::vec3(0.f,0.f,0.f) - settings.bottomCenter;
2024-04-26 18:22:30 +08:00
glm::mat4 trans = glm::mat4(1.0f);
trans = glm::translate(trans, translate);
settings.cameraFixation = trans * glm::vec4(settings.cameraFixation, 1.0f);
2024-04-25 18:08:20 +08:00
for (uint64_t i = 0; i < cameraTracksAndAngleSize; i++)
2024-04-26 18:22:30 +08:00
{
2024-04-27 17:13:59 +08:00
cameraTrackToFixation[i] = cameraTracksRotationMatrix * glm::vec4(cameraTrackToFixation[i], 1.0f);
cameraTrackToFixation[i] = trans * glm::vec4(cameraTrackToFixation[i], 1.0f);
2024-04-28 15:28:46 +08:00
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);
2024-04-27 17:13:59 +08:00
settings.cameraTracks[i] = settings.bottomCenter + cameraTrackToFixation[i] ;
2024-04-26 18:22:30 +08:00
settings.cameraAngle[i] = cameraTracksRotationMatrix * glm::mat4(settings.cameraAngle[i]) ;
}
2024-04-25 18:08:20 +08:00
}
/**/
std::string PlumageConfig::PlumageConfiguration::setFilePathFromToml(toml::value & tomlValue,std::string tomlValueName)
2024-04-28 18:15:35 +08:00
{
std::string filePathFromToml = toml::find<std::string>(tomlValue,tomlValueName);
std::string pattern = "https?://[a-zA-Z0-9-]+\\.cos\\.ap-guangzhou\\.myqcloud\\.com";
std::regex urlRegex(pattern);
std::filesystem::path filesystemConfigFilePath ;
if (std::regex_search(filePathFromToml,urlRegex))
2024-04-28 18:15:35 +08:00
{
filesystemConfigFilePath = filePathFromToml;
2024-04-28 18:15:35 +08:00
return filesystemConfigFilePath.generic_string();
}
else
{
if (std::filesystem::exists(filesystemConfigFilePath))
{
return filesystemConfigFilePath.generic_string();
}
else
{
std::filesystem::path assetPath = getAssetPath();
assetPath += filesystemConfigFilePath;
2024-04-30 18:09:07 +08:00
if (std::filesystem::exists(assetPath))
{
return assetPath.generic_string();
}
else
{
}
}
2024-04-28 18:15:35 +08:00
}
2024-04-28 18:15:35 +08:00
}
2024-04-26 18:22:30 +08:00
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));
}
2024-04-25 18:08:20 +08:00
glm::mat4 PlumageConfig::PlumageConfiguration::getVectorRotationMatrix(glm::vec3 vectorBefore, glm::vec3 vectorAfter)
{
2024-04-26 18:22:30 +08:00
glm::vec3 rotationAxis = glm::normalize(glm::cross(vectorAfter, vectorBefore));
2024-04-25 18:08:20 +08:00
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);
2024-04-17 11:26:38 +08:00
}
PlumageConfig::PlumageConfiguration::PlumageConfiguration()
{
2024-04-19 18:08:16 +08:00
readConfigurationFromToml(filePath.configFilePath, settings);
2024-04-17 11:26:38 +08:00
}
PlumageConfig::PlumageConfiguration::~PlumageConfiguration()
{
}