ProjectStore.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. // Include own headers
  2. #include "ProjectStore.hpp"
  3. // Include modules
  4. #include "MainWindow.hpp"
  5. #include "StringBasics.hpp"
  6. #include "TrackPointRenderer.hpp"
  7. #include "PlatformSupport.hpp"
  8. #include "STLImport.hpp"
  9. #include "MeshTools.hpp"
  10. // Include dependencies
  11. #include <typeinfo>
  12. #include <iostream>
  13. #include <filesystem>
  14. #define META_NAMESPACE "tk-ar-tracking"
  15. ProjectStore::ProjectStore() {
  16. _projectLoaded = false;
  17. _projectModified = false;
  18. load3mfLib();
  19. }
  20. ProjectStore::~ProjectStore() {
  21. }
  22. void ProjectStore::loadMesh(std::string meshFile) {
  23. if (meshFile == "") {
  24. return;
  25. }
  26. if (StringBasics::endsWithCaseInsensitive(meshFile, ".STL")) {
  27. _projectLoaded = true;
  28. _projectModified = false;
  29. // Read STL file
  30. std::vector<Lib3MF::sPosition> verticesBuffer;
  31. std::vector<Lib3MF::sTriangle> triangleBuffer;
  32. STLImport::readSTL(meshFile, &verticesBuffer, &triangleBuffer);
  33. Lib3MF::PMeshObject baseMesh = _project->AddMeshObject();
  34. baseMesh->SetGeometry(verticesBuffer, triangleBuffer);
  35. render3MFMesh();
  36. MainWindow::getInstance()->renderView(Edit);
  37. } else if (StringBasics::endsWithCaseInsensitive(meshFile, ".3MF")) {
  38. _projectLoaded = true;
  39. _projectModified = false;
  40. // Read 3MF file
  41. Lib3MF::PReader reader = _project->QueryReader("3mf");
  42. reader->ReadFromFile(meshFile);
  43. render3MFMesh();
  44. MainWindow::getInstance()->renderView(Edit);
  45. } else {
  46. // TODO: Show error popup
  47. printf("Unsupported file type.\n");
  48. }
  49. }
  50. bool ProjectStore::loadProject(std::string projectFile) {
  51. if (projectFile == "") {
  52. return false;
  53. }
  54. if (!_projectLoaded) {
  55. Lib3MF::PReader reader = _project->QueryReader("3mf");
  56. reader->ReadFromFile(projectFile);
  57. _projectLoaded = true;
  58. _projectModified = false;
  59. _projectFile = projectFile;
  60. loadMetaData();
  61. return true;
  62. }
  63. return false;
  64. }
  65. bool ProjectStore::saveProject() {
  66. if (_projectFile != "") {
  67. return saveProject(_projectFile);
  68. }
  69. return false;
  70. }
  71. bool ProjectStore::saveProject(std::string path) {
  72. if (path == "") {
  73. return false;
  74. }
  75. updateMetaData();
  76. Lib3MF::PWriter writer = _project->QueryWriter("3mf");
  77. writer->WriteToFile(path);
  78. _projectFile = path;
  79. _projectModified = false;
  80. return true;
  81. }
  82. bool ProjectStore::exportProject(std::string path, ExportSettings settings) {
  83. OpenScadRenderer* renderer = new OpenScadRenderer();
  84. // Base for rendering mesh
  85. Lib3MF::PWriter writer = _project->QueryWriter("3mf");
  86. writer->WriteToFile(std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_export.3mf");
  87. // Export file
  88. Lib3MF::PModel exportModel = _wrapper->CreateModel();
  89. Lib3MF::PMetaDataGroup metaData = exportModel->GetMetaDataGroup();
  90. if (settings.OptiTrack) {
  91. renderer->renderOptiTrack(_optiTrackPoints);
  92. Lib3MF::PModel optiTrackModel = _wrapper->CreateModel();
  93. Lib3MF::PReader reader = optiTrackModel->QueryReader("3mf");
  94. reader->ReadFromFile(std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_render_optitrack.3mf");
  95. Lib3MF::PMeshObjectIterator meshIterator = optiTrackModel->GetMeshObjects();
  96. if (meshIterator->Count() != 1) {
  97. return false;
  98. }
  99. meshIterator->MoveNext();
  100. Lib3MF::PMeshObject renderedMesh = meshIterator->GetCurrentMeshObject();
  101. Lib3MF::PMeshObject exportMesh = exportModel->AddMeshObject();
  102. exportMesh->SetName("optitrack");
  103. std::vector<Lib3MF::sPosition> verticesBuffer;
  104. std::vector<Lib3MF::sTriangle> triangleBuffer;
  105. renderedMesh->GetVertices(verticesBuffer);
  106. renderedMesh->GetTriangleIndices(triangleBuffer);
  107. exportMesh->SetGeometry(verticesBuffer, triangleBuffer);
  108. std::vector<std::vector<float>> pointsList;
  109. for (OptiTrackPoint* point: _optiTrackPoints) {
  110. std::vector<float> pointData;
  111. osg::Vec3 trackPoint = point->getTrackPoint();
  112. pointData.push_back(trackPoint.x());
  113. pointData.push_back(trackPoint.y());
  114. pointData.push_back(trackPoint.z());
  115. pointsList.push_back(pointData);
  116. }
  117. json trackpointData = pointsList;
  118. Lib3MF::PMetaDataGroup optiMetaData = exportMesh->GetMetaDataGroup();
  119. optiMetaData->AddMetaData(META_NAMESPACE, "trackpoints-optitrack", trackpointData.dump(), "string", true);
  120. exportModel->AddBuildItem(exportMesh.get(), _wrapper->GetIdentityTransform());
  121. }
  122. if (settings.EMFTrack) {
  123. }
  124. if (settings.SteamVRTrack) {
  125. renderer->renderSteamVRTrack(_steamVrTrackPoints);
  126. Lib3MF::PModel steamVrTrackModel = _wrapper->CreateModel();
  127. Lib3MF::PReader reader = steamVrTrackModel->QueryReader("3mf");
  128. reader->ReadFromFile(std::filesystem::temp_directory_path().u8string() + fileDelimiter + "trackpointapp_render_steamvrtrack.3mf");
  129. Lib3MF::PMeshObjectIterator meshIterator = steamVrTrackModel->GetMeshObjects();
  130. if (meshIterator->Count() != 1) {
  131. return false;
  132. }
  133. meshIterator->MoveNext();
  134. Lib3MF::PMeshObject renderedMesh = meshIterator->GetCurrentMeshObject();
  135. Lib3MF::PMeshObject exportMesh = exportModel->AddMeshObject();
  136. exportMesh->SetName("steamvrtrack");
  137. std::vector<Lib3MF::sPosition> verticesBuffer;
  138. std::vector<Lib3MF::sTriangle> triangleBuffer;
  139. renderedMesh->GetVertices(verticesBuffer);
  140. renderedMesh->GetTriangleIndices(triangleBuffer);
  141. exportMesh->SetGeometry(verticesBuffer, triangleBuffer);
  142. std::vector<std::vector<float>> pointsList;
  143. for (SteamVRTrackPoint* point: _steamVrTrackPoints) {
  144. std::vector<float> pointData;
  145. osg::Vec3 trackPoint = point->getTrackPoint();
  146. pointData.push_back(trackPoint.x());
  147. pointData.push_back(trackPoint.y());
  148. pointData.push_back(trackPoint.z());
  149. pointsList.push_back(pointData);
  150. }
  151. json trackpointData = pointsList;
  152. Lib3MF::PMetaDataGroup steamVrMetaData = exportMesh->GetMetaDataGroup();
  153. steamVrMetaData->AddMetaData(META_NAMESPACE, "trackpoints-steamvrtrack", trackpointData.dump(), "string", true);
  154. exportModel->AddBuildItem(exportMesh.get(), _wrapper->GetIdentityTransform());
  155. }
  156. delete renderer;
  157. // Export action point metadata
  158. std::unordered_map<std::string, std::vector<std::vector<float>>> actionPointsList;
  159. for (ActionPoint* point: _actionPoints) {
  160. std::vector<float> pointData;
  161. std::vector<float> normalData;
  162. std::vector<std::vector<float>> combinatrion;
  163. osg::Vec3 translation = point->getTranslation();
  164. osg::Vec3 normal = point->getNormal();
  165. pointData.push_back(translation.x());
  166. pointData.push_back(translation.y());
  167. pointData.push_back(translation.z());
  168. normalData.push_back(normal.x());
  169. normalData.push_back(normal.y());
  170. normalData.push_back(normal.z());
  171. combinatrion.push_back(pointData);
  172. combinatrion.push_back(normalData);
  173. actionPointsList.insert({point->getIdentifier(), combinatrion});
  174. }
  175. json actionPointData = actionPointsList;
  176. metaData->AddMetaData(META_NAMESPACE, "trackpoints-actionpoints", actionPointData.dump(), "string", true);
  177. Lib3MF::PWriter exportWriter = exportModel->QueryWriter("3mf");
  178. exportWriter->WriteToFile(path);
  179. return true;
  180. }
  181. bool ProjectStore::isProjectOpen() {
  182. return _projectLoaded;
  183. }
  184. void ProjectStore::closeProject() {
  185. _projectLoaded = false;
  186. reset();
  187. }
  188. bool ProjectStore::isModified() {
  189. return _projectModified;
  190. }
  191. void ProjectStore::projectModified() {
  192. _projectModified = true;
  193. }
  194. TrackPoint* ProjectStore::getTrackPointById(int id, ActiveTrackingSystem activeTrackingSystem) {
  195. switch(activeTrackingSystem) {
  196. case OptiTrack: {
  197. return _optiTrackPoints[id];
  198. };
  199. case EMFTrack: {
  200. break;
  201. };
  202. case SteamVRTrack: {
  203. return _steamVrTrackPoints[id];
  204. };
  205. case ActionPoints: {
  206. return _actionPoints[id];
  207. };
  208. }
  209. }
  210. void ProjectStore::addTrackPoint(osg::Vec3 point, osg::Vec3 normal, ActiveTrackingSystem activeTrackingSystem) {
  211. switch(activeTrackingSystem) {
  212. case OptiTrack: {
  213. OptiTrackPoint* optiTrackPoint = new OptiTrackPoint(point, normal, _normalModifier, _optiTrackSettings.length, _optiTrackSettings.radius);
  214. _optiTrackPoints.push_back(optiTrackPoint);
  215. break;
  216. }
  217. case EMFTrack: {
  218. break;
  219. }
  220. case SteamVRTrack: {
  221. SteamVRTrackPoint* steamVrTrackPoint = new SteamVRTrackPoint(point, normal, _normalModifier, _steamVrTrackSettings.length);
  222. _steamVrTrackPoints.push_back(steamVrTrackPoint);
  223. break;
  224. }
  225. case ActionPoints: {
  226. ActionPoint* actionPoint = new ActionPoint(point, normal, _normalModifier, _actionPointSettings.identifier);
  227. _actionPoints.push_back(actionPoint);
  228. break;
  229. }
  230. }
  231. projectModified();
  232. MainWindow::getInstance()->getEditWiget()->updateTrackpointCount();
  233. }
  234. int ProjectStore::getCount(ActiveTrackingSystem activeTrackingSystem) {
  235. switch(activeTrackingSystem) {
  236. case OptiTrack: {
  237. return _optiTrackPoints.size();
  238. };
  239. case EMFTrack: {
  240. break;
  241. };
  242. case SteamVRTrack: {
  243. return _steamVrTrackPoints.size();
  244. };
  245. case ActionPoints: {
  246. return _actionPoints.size();
  247. };
  248. }
  249. }
  250. void ProjectStore::removeTrackPoint(int id, ActiveTrackingSystem activeTrackingSystem) {
  251. switch(activeTrackingSystem) {
  252. case OptiTrack: {
  253. _optiTrackPoints.erase(_optiTrackPoints.begin() + id);
  254. break;
  255. }
  256. case EMFTrack: {
  257. break;
  258. }
  259. case SteamVRTrack: {
  260. _steamVrTrackPoints.erase(_steamVrTrackPoints.begin() + id);
  261. break;
  262. }
  263. case ActionPoints: {
  264. _actionPoints.erase(_actionPoints.begin() + id);
  265. break;
  266. }
  267. }
  268. projectModified();
  269. MainWindow::getInstance()->getEditWiget()->updateTrackpointCount();
  270. }
  271. void ProjectStore::updateNormalModifier(osg::Vec3 modifier) {
  272. _normalModifier = modifier;
  273. }
  274. osg::Vec3 ProjectStore::getNormalModifier() {
  275. return _normalModifier;
  276. }
  277. std::vector<OptiTrackPoint*> ProjectStore::getOptiTrackPoints() {
  278. return _optiTrackPoints;
  279. }
  280. void ProjectStore::updateOptiTrackSettings(OptiTrackSettings optiTrackSettings) {
  281. _optiTrackSettings = optiTrackSettings;
  282. }
  283. OptiTrackSettings ProjectStore::getOptiTrackSettings() {
  284. return _optiTrackSettings;
  285. }
  286. std::vector<SteamVRTrackPoint*> ProjectStore::getSteamVRTrackPoints() {
  287. return _steamVrTrackPoints;
  288. }
  289. void ProjectStore::updateSteamVRTrackSettings(SteamVRTrackSettings steamVrTrackSettings) {
  290. _steamVrTrackSettings = steamVrTrackSettings;
  291. }
  292. SteamVRTrackSettings ProjectStore::getSteamVRTrackSettings() {
  293. return _steamVrTrackSettings;
  294. }
  295. std::vector<ActionPoint*> ProjectStore::getActionPoints() {
  296. return _actionPoints;
  297. }
  298. void ProjectStore::updateActionPointSettings(ActionPointSettings actionPointSettings) {
  299. _actionPointSettings = actionPointSettings;
  300. }
  301. ActionPointSettings ProjectStore::getActionPointSettings() {
  302. return _actionPointSettings;
  303. }
  304. unsigned int ProjectStore::actionPointIdentifierInUse(std::string candidate, int current) {
  305. unsigned int count = 0;
  306. int i = 0;
  307. for (ActionPoint* actionPoint: _actionPoints) {
  308. if (i != current && candidate.compare(actionPoint->getIdentifier()) == 0) {
  309. count++;
  310. }
  311. i++;
  312. }
  313. return count;
  314. }
  315. void ProjectStore::load3mfLib() {
  316. _wrapper = Lib3MF::CWrapper::loadLibrary();
  317. _project = _wrapper->CreateModel();
  318. }
  319. void ProjectStore::reset() {
  320. _project = _wrapper->CreateModel();
  321. _optiTrackPoints.clear();
  322. _steamVrTrackPoints.clear();
  323. _actionPoints.clear();
  324. _optiTrackSettings = OptiTrackSettings {OPTITRACK_DEFAULT_LENGTH, OPTITRACK_DEFAULT_RADIUS};
  325. _steamVrTrackSettings = SteamVRTrackSettings {STEAMVR_DEFAULT_LENGTH};
  326. _actionPointSettings = ActionPointSettings {ACTIONPOINT_DEFAULT_IDENFIFIER};
  327. _normalModifier = osg::Vec3(0.0f, 0.0f, 0.0f);
  328. }
  329. void ProjectStore::render3MFMesh() {
  330. // Get meshes
  331. Lib3MF::PMeshObjectIterator meshIterator = _project->GetMeshObjects();
  332. // Our use case supports just a single mesh per project
  333. if (meshIterator->Count() != 1) {
  334. // TODO: Show error popup
  335. printf("Not 1 mesh: %llu\n", meshIterator->Count());
  336. return;
  337. }
  338. meshIterator->MoveNext();
  339. Lib3MF::PMeshObject mesh = meshIterator->GetCurrentMeshObject();
  340. // Load vertices and triangles and render them
  341. std::vector<Lib3MF::sPosition> verticesBuffer;
  342. mesh->GetVertices(verticesBuffer);
  343. std::vector<Lib3MF::sTriangle> triangleBuffer;
  344. mesh->GetTriangleIndices(triangleBuffer);
  345. // Create osg style arrays
  346. osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
  347. osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
  348. // Convert data to osg format and calculate vertex normals
  349. MeshTools::calculateNormals(verticesBuffer, triangleBuffer, vertices, normals);
  350. // Call renderer
  351. MainWindow* mainWindow = MainWindow::getInstance();
  352. mainWindow->getOsgWidget()->renderBaseMesh(vertices, normals);
  353. }
  354. void ProjectStore::updateMetaData() {
  355. Lib3MF::PMetaDataGroup metaData = _project->GetMetaDataGroup();
  356. try {
  357. Lib3MF::PMetaData versionInformation = metaData->GetMetaDataByKey(META_NAMESPACE, "format");
  358. } catch (Lib3MF::ELib3MFException &e) {
  359. metaData->AddMetaData(META_NAMESPACE, "format", "1.0.0", "string", true);
  360. }
  361. json optiTrackData = json::array();
  362. for (OptiTrackPoint* optiTrackPoint: _optiTrackPoints) {
  363. optiTrackData.push_back({
  364. {"point", osgVecToStdVec(optiTrackPoint->getTranslation())},
  365. {"normal", osgVecToStdVec(optiTrackPoint->getNormal())},
  366. {"normalModifier", osgVecToStdVec(optiTrackPoint->getNormalModifier())},
  367. {"length", optiTrackPoint->getLength()},
  368. {"radius", optiTrackPoint->getRadius()}
  369. });
  370. }
  371. try {
  372. Lib3MF::PMetaData optiTrackPoints = metaData->GetMetaDataByKey(META_NAMESPACE, "optitrack");
  373. optiTrackPoints->SetValue(optiTrackData.dump());
  374. } catch (Lib3MF::ELib3MFException &e) {
  375. metaData->AddMetaData(META_NAMESPACE, "optitrack", optiTrackData.dump(), "string", true);
  376. }
  377. json steamVrTrackData = json::array();
  378. for (SteamVRTrackPoint* steamVrTrackPoint: _steamVrTrackPoints) {
  379. steamVrTrackData.push_back({
  380. {"point", osgVecToStdVec(steamVrTrackPoint->getTranslation())},
  381. {"normal", osgVecToStdVec(steamVrTrackPoint->getNormal())},
  382. {"normalModifier", osgVecToStdVec(steamVrTrackPoint->getNormalModifier())},
  383. {"length", steamVrTrackPoint->getLength()}
  384. });
  385. }
  386. try {
  387. Lib3MF::PMetaData steamVrTrackPoints = metaData->GetMetaDataByKey(META_NAMESPACE, "steamvrtrack");
  388. steamVrTrackPoints->SetValue(steamVrTrackData.dump());
  389. } catch (Lib3MF::ELib3MFException &e) {
  390. metaData->AddMetaData(META_NAMESPACE, "steamvrtrack", steamVrTrackData.dump(), "string", true);
  391. }
  392. json actionPointData = json::array();
  393. for (ActionPoint* actionPoint: _actionPoints) {
  394. actionPointData.push_back({
  395. {"point", osgVecToStdVec(actionPoint->getTranslation())},
  396. {"normal", osgVecToStdVec(actionPoint->getNormal())},
  397. {"normalModifier", osgVecToStdVec(actionPoint->getNormalModifier())},
  398. {"identifier", actionPoint->getIdentifier()}
  399. });
  400. }
  401. try {
  402. Lib3MF::PMetaData actionPoints = metaData->GetMetaDataByKey(META_NAMESPACE, "actionpoints");
  403. actionPoints->SetValue(actionPointData.dump());
  404. } catch (Lib3MF::ELib3MFException &e) {
  405. metaData->AddMetaData(META_NAMESPACE, "actionpoints", actionPointData.dump(), "string", true);
  406. }
  407. }
  408. void ProjectStore::loadMetaData() {
  409. Lib3MF::PMetaDataGroup metaData = _project->GetMetaDataGroup();
  410. try {
  411. Lib3MF::PMetaData versionInformation = metaData->GetMetaDataByKey(META_NAMESPACE, "format");
  412. } catch (Lib3MF::ELib3MFException &e) {
  413. // TODO: Alert not a TrackpointApp poject
  414. }
  415. Lib3MF::PMetaData optiTrackString;
  416. try {
  417. optiTrackString = metaData->GetMetaDataByKey(META_NAMESPACE, "optitrack");
  418. auto optiTrackData = json::parse(optiTrackString->GetValue());
  419. _optiTrackPoints.clear();
  420. for (const auto pointData: optiTrackData) {
  421. osg::Vec3f point = osg::Vec3f(pointData["point"][0], pointData["point"][1], pointData["point"][2]);
  422. osg::Vec3f normal = osg::Vec3f(pointData["normal"][0], pointData["normal"][1], pointData["normal"][2]);
  423. osg::Vec3f normalModifier = osg::Vec3f(pointData["normalModifier"][0], pointData["normalModifier"][1], pointData["normalModifier"][2]);
  424. OptiTrackPoint* optiTrackPoint = new OptiTrackPoint(point, normal, normalModifier, static_cast<double>(pointData["length"]), static_cast<double>(pointData["radius"]));
  425. _optiTrackPoints.push_back(optiTrackPoint);
  426. }
  427. } catch (Lib3MF::ELib3MFException &e) {
  428. // TODO: Something is wrong with the file
  429. }
  430. Lib3MF::PMetaData steamVrTrackString;
  431. try {
  432. steamVrTrackString = metaData->GetMetaDataByKey(META_NAMESPACE, "steamvrtrack");
  433. auto steamVrData = json::parse(steamVrTrackString->GetValue());
  434. _steamVrTrackPoints.clear();
  435. for (const auto pointData: steamVrData) {
  436. osg::Vec3f point = osg::Vec3f(pointData["point"][0], pointData["point"][1], pointData["point"][2]);
  437. osg::Vec3f normal = osg::Vec3f(pointData["normal"][0], pointData["normal"][1], pointData["normal"][2]);
  438. osg::Vec3f normalModifier = osg::Vec3f(pointData["normalModifier"][0], pointData["normalModifier"][1], pointData["normalModifier"][2]);
  439. SteamVRTrackPoint* steamVrTrackPoint = new SteamVRTrackPoint(point, normal, normalModifier, static_cast<double>(pointData["length"]));
  440. _steamVrTrackPoints.push_back(steamVrTrackPoint);
  441. }
  442. } catch (Lib3MF::ELib3MFException &e) {
  443. // TODO: Something is wrong with the file
  444. }
  445. Lib3MF::PMetaData actionPointString;
  446. try {
  447. actionPointString = metaData->GetMetaDataByKey(META_NAMESPACE, "actionpoints");
  448. auto actionPointData = json::parse(actionPointString->GetValue());
  449. _actionPoints.clear();
  450. for (const auto pointData: actionPointData) {
  451. osg::Vec3f point = osg::Vec3f(pointData["point"][0], pointData["point"][1], pointData["point"][2]);
  452. osg::Vec3f normal = osg::Vec3f(pointData["normal"][0], pointData["normal"][1], pointData["normal"][2]);
  453. osg::Vec3f normalModifier = osg::Vec3f(pointData["normalModifier"][0], pointData["normalModifier"][1], pointData["normalModifier"][2]);
  454. ActionPoint* actionPoint = new ActionPoint(point, normal, normalModifier, pointData["identifier"]);
  455. _actionPoints.push_back(actionPoint);
  456. }
  457. } catch (Lib3MF::ELib3MFException &e) {
  458. // TODO: Something is wrong with the file
  459. }
  460. render3MFMesh();
  461. MainWindow::getInstance()->renderView(Edit);
  462. MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(MainWindow::getInstance()->getEditWiget()->getSelectedTrackingSystem());
  463. MainWindow::getInstance()->getEditWiget()->updateTrackpointCount();
  464. }
  465. std::vector<float> ProjectStore::osgVecToStdVec(osg::Vec3f input) {
  466. std::vector<float> vector;
  467. vector.push_back(input.x());
  468. vector.push_back(input.y());
  469. vector.push_back(input.z());
  470. return vector;
  471. }
  472. osg::Vec3f ProjectStore::stdVecToOsgVec(std::vector<float> input) {
  473. return osg::Vec3f(input[0], input[1], input[2]);
  474. }