| 317 | } |
| 318 | |
| 319 | void SceneLoader::readTetModels(const nlohmann::json &j, const std::string &key, const std::string &basePath, SceneData &sceneData) |
| 320 | { |
| 321 | const nlohmann::json &child = j[key]; |
| 322 | |
| 323 | for (auto& tetModel : child) |
| 324 | { |
| 325 | std::string nodeFileName, eleFileName; |
| 326 | if (readValue<std::string>(tetModel, "nodeFile", nodeFileName) && |
| 327 | readValue<std::string>(tetModel, "eleFile", eleFileName)) |
| 328 | { |
| 329 | if (FileSystem::isRelativePath(nodeFileName)) |
| 330 | { |
| 331 | nodeFileName = basePath + "/" + nodeFileName; |
| 332 | } |
| 333 | |
| 334 | if (FileSystem::isRelativePath(eleFileName)) |
| 335 | { |
| 336 | eleFileName = basePath + "/" + eleFileName; |
| 337 | } |
| 338 | |
| 339 | std::string visFileName = ""; |
| 340 | if (readValue<std::string>(tetModel, "visFile", visFileName)) |
| 341 | { |
| 342 | if (FileSystem::isRelativePath(visFileName)) |
| 343 | { |
| 344 | visFileName = basePath + "/" + visFileName; |
| 345 | } |
| 346 | } |
| 347 | |
| 348 | sceneData.m_tetModelData.emplace_back(TetModelData()); |
| 349 | TetModelData &data = sceneData.m_tetModelData.back(); |
| 350 | data.m_modelFileNodes = nodeFileName; |
| 351 | data.m_modelFileElements = eleFileName; |
| 352 | data.m_modelFileVis = visFileName; |
| 353 | |
| 354 | // id |
| 355 | data.m_id = 0; |
| 356 | readValue(tetModel, "id", data.m_id); |
| 357 | |
| 358 | // translation |
| 359 | data.m_x.setZero(); |
| 360 | readVector(tetModel, "translation", data.m_x); |
| 361 | |
| 362 | // rotation axis |
| 363 | Vector3r axis; |
| 364 | axis.setZero(); |
| 365 | Real angle = 0.0; |
| 366 | if (readVector(tetModel, "rotationAxis", axis) && |
| 367 | readValue<Real>(tetModel, "rotationAngle", angle)) |
| 368 | { |
| 369 | axis.normalize(); |
| 370 | data.m_q = Quaternionr(AngleAxisr(angle, axis)); |
| 371 | } |
| 372 | else |
| 373 | data.m_q = Quaternionr(1.0, 0.0, 0.0, 0.0); |
| 374 | |
| 375 | // scale |
| 376 | data.m_scale = Vector3r(1.0, 1.0, 1.0); |