ProjectStore.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. // Include own headers
  2. #include "ProjectStore.hpp"
  3. // Include modules
  4. #include "MainWindow.hpp"
  5. #include "StringBasics.hpp"
  6. // Include dependencies
  7. #include <typeinfo>
  8. #include <iostream>
  9. ProjectStore::ProjectStore() {
  10. projectLoaded = false;
  11. load3mfLib();
  12. }
  13. ProjectStore::~ProjectStore() {
  14. }
  15. void ProjectStore::loadMesh(std::string meshFile) {
  16. if (StringBasics::endsWithCaseInsensitive(meshFile, ".STL")) {
  17. printf("Currently unsupported.\n");
  18. } else if (StringBasics::endsWithCaseInsensitive(meshFile, ".3MF")) {
  19. projectLoaded = true;
  20. // Read 3MF file
  21. Lib3MF::PReader reader = _project->QueryReader("3mf");
  22. reader->ReadFromFile(meshFile);
  23. // Get meshes
  24. Lib3MF::PMeshObjectIterator meshIterator = _project->GetMeshObjects();
  25. // Our use case supports just a single mesh per project
  26. if (meshIterator->Count() != 1) {
  27. // TODO: Show error popup
  28. printf("Not 1 mesh: %llu\n", meshIterator->Count());
  29. return;
  30. }
  31. meshIterator->MoveNext();
  32. Lib3MF::PMeshObject mesh = meshIterator->GetCurrentMeshObject();
  33. // Load vertices and triangles and render them
  34. std::vector<Lib3MF::sPosition> verticesBuffer;
  35. mesh->GetVertices(verticesBuffer);
  36. std::vector<Lib3MF::sTriangle> triangleBuffer;
  37. mesh->GetTriangleIndices(triangleBuffer);
  38. render3MFMesh(verticesBuffer, triangleBuffer);
  39. MainWindow* mainWindow = MainWindow::getInstance();
  40. mainWindow->renderView(Edit);
  41. } else {
  42. // TODO: Show error popup
  43. printf("Unsupported file type.\n");
  44. }
  45. }
  46. bool ProjectStore::loadProject(std::string projectFile) {
  47. if (!projectLoaded) {
  48. Lib3MF::PReader reader = _project->QueryReader("3mf");
  49. reader->ReadFromFile(projectFile);
  50. projectLoaded = true;
  51. return true;
  52. }
  53. return false;
  54. }
  55. bool ProjectStore::saveProject() {
  56. if (_projectFile != "") {
  57. Lib3MF::PWriter writer = _project->QueryWriter("3mf");
  58. writer->WriteToFile(_projectFile);
  59. return true;
  60. }
  61. return false;
  62. }
  63. bool ProjectStore::saveProject(std::string path) {
  64. Lib3MF::PWriter writer = _project->QueryWriter("3mf");
  65. writer->WriteToFile(path);
  66. return true;
  67. }
  68. bool ProjectStore::exportProject(std::string path, ExportSettings settings) {
  69. return false; // TODO
  70. }
  71. void ProjectStore::updateNormalModifier(osg::Vec3 modifier) {
  72. _normalModifier = modifier;
  73. }
  74. osg::Vec3 ProjectStore::getNormalModifier() {
  75. return _normalModifier;
  76. }
  77. std::vector<OptiTrackPoint*> ProjectStore::getOptiTrackPoints() {
  78. return _optiTrackPoints;
  79. }
  80. void ProjectStore::addOptiTrackPoint(osg::Vec3 point, osg::Vec3 normal) {
  81. OptiTrackPoint* optiTrackPoint = new OptiTrackPoint(point, normal, _normalModifier, _optiTrackSettings.length, _optiTrackSettings.radius);
  82. _optiTrackPoints.push_back(optiTrackPoint);
  83. }
  84. void ProjectStore::removeOptiTrackPoint() {
  85. // TODO
  86. }
  87. void ProjectStore::updateOptiTrackSettings(OptiTrackSettings optiTrackSettings) {
  88. _optiTrackSettings = optiTrackSettings;
  89. }
  90. OptiTrackSettings ProjectStore::getOptiTrackSettings() {
  91. return _optiTrackSettings;
  92. }
  93. void ProjectStore::load3mfLib() {
  94. _wrapper = Lib3MF::CWrapper::loadLibrary();
  95. _project = _wrapper->CreateModel();
  96. }
  97. void ProjectStore::render3MFMesh(const std::vector<Lib3MF::sPosition> verticesBuffer, const std::vector<Lib3MF::sTriangle> triangleBuffer) {
  98. // Create osg style arrays
  99. osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
  100. osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
  101. // Convert data to osg format and calculate vertex normals
  102. for (const Lib3MF::sTriangle triangle: triangleBuffer) {
  103. // Create osg vectors
  104. osg::Vec3 vertex[3] = {};
  105. for (char i = 0; i < 3; i++) {
  106. vertex[i] = osg::Vec3(verticesBuffer[triangle.m_Indices[i]].m_Coordinates[0], verticesBuffer[triangle.m_Indices[i]].m_Coordinates[1], verticesBuffer[triangle.m_Indices[i]].m_Coordinates[2]);
  107. }
  108. // Calculate normal
  109. osg::Vec3 edgeOne = vertex[1].operator-(vertex[0]);
  110. osg::Vec3 edgeTwo = vertex[2].operator-(vertex[0]);
  111. osg::Vec3 normal = edgeOne.operator^(edgeTwo);
  112. normal.normalize();
  113. // Store them
  114. for (int i = 0; i < 3; i++) {
  115. vertices->push_back(vertex[i]);
  116. normals->push_back(normal);
  117. }
  118. }
  119. // Call renderer
  120. MainWindow* mainWindow = MainWindow::getInstance();
  121. mainWindow->getOsgWidget()->renderBaseMesh(vertices, normals);
  122. }
  123. void ProjectStore::exportMetaData() {
  124. }