ProjectStore.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  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. json trackpointData = json::array();
  109. for (OptiTrackPoint* point: _optiTrackPoints) {
  110. osg::Vec3 trackPoint = point->getTrackPoint();
  111. osg::Vec3 trackNormal = point->getNormal();
  112. json pointData = {
  113. {"point", {trackPoint.x(), trackPoint.y(), trackPoint.z()}},
  114. {"normal", {trackNormal.x(), trackNormal.y(), trackNormal.z()}}
  115. };
  116. trackpointData.push_back(pointData);
  117. }
  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. json trackpointData = json::array();
  143. for (SteamVRTrackPoint* point: _steamVrTrackPoints) {
  144. osg::Vec3 trackPoint = point->getTrackPoint();
  145. osg::Vec3 trackNormal = point->getNormal();
  146. json pointData = {
  147. {"point", {trackPoint.x(), trackPoint.y(), trackPoint.z()}},
  148. {"normal", {trackNormal.x(), trackNormal.y(), trackNormal.z()}}
  149. };
  150. trackpointData.push_back(pointData);
  151. }
  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. json actionPointData;
  159. for (ActionPoint* point: _actionPoints) {
  160. osg::Vec3 translation = point->getTranslation();
  161. osg::Vec3 normal = point->getNormal();
  162. actionPointData[point->getIdentifier()] = {
  163. {"point", {translation.x(), translation.y(), translation.z()}},
  164. {"normal", {normal.x(), normal.y(), normal.z()}}
  165. };
  166. }
  167. metaData->AddMetaData(META_NAMESPACE, "trackpoints-actionpoints", actionPointData.dump(), "string", true);
  168. Lib3MF::PWriter exportWriter = exportModel->QueryWriter("3mf");
  169. exportWriter->WriteToFile(path);
  170. return true;
  171. }
  172. bool ProjectStore::isProjectOpen() {
  173. return _projectLoaded;
  174. }
  175. void ProjectStore::closeProject() {
  176. _projectLoaded = false;
  177. reset();
  178. }
  179. bool ProjectStore::isModified() {
  180. return _projectModified;
  181. }
  182. void ProjectStore::projectModified() {
  183. _projectModified = true;
  184. }
  185. TrackPoint* ProjectStore::getTrackPointById(int id, ActiveTrackingSystem activeTrackingSystem) {
  186. switch(activeTrackingSystem) {
  187. case OptiTrack: {
  188. return _optiTrackPoints[id];
  189. };
  190. case EMFTrack: {
  191. break;
  192. };
  193. case SteamVRTrack: {
  194. return _steamVrTrackPoints[id];
  195. };
  196. case ActionPoints: {
  197. return _actionPoints[id];
  198. };
  199. }
  200. }
  201. void ProjectStore::addTrackPoint(osg::Vec3 point, osg::Vec3 normal, ActiveTrackingSystem activeTrackingSystem) {
  202. switch(activeTrackingSystem) {
  203. case OptiTrack: {
  204. OptiTrackPoint* optiTrackPoint = new OptiTrackPoint(point, normal, _normalModifier, _optiTrackSettings.length, _optiTrackSettings.radius);
  205. _optiTrackPoints.push_back(optiTrackPoint);
  206. break;
  207. }
  208. case EMFTrack: {
  209. break;
  210. }
  211. case SteamVRTrack: {
  212. SteamVRTrackPoint* steamVrTrackPoint = new SteamVRTrackPoint(point, normal, _normalModifier, _steamVrTrackSettings.length);
  213. _steamVrTrackPoints.push_back(steamVrTrackPoint);
  214. break;
  215. }
  216. case ActionPoints: {
  217. ActionPoint* actionPoint = new ActionPoint(point, normal, _normalModifier, _actionPointSettings.identifier);
  218. _actionPoints.push_back(actionPoint);
  219. break;
  220. }
  221. }
  222. projectModified();
  223. MainWindow::getInstance()->getEditWiget()->updateTrackpointCount();
  224. }
  225. int ProjectStore::getCount(ActiveTrackingSystem activeTrackingSystem) {
  226. switch(activeTrackingSystem) {
  227. case OptiTrack: {
  228. return _optiTrackPoints.size();
  229. };
  230. case EMFTrack: {
  231. break;
  232. };
  233. case SteamVRTrack: {
  234. return _steamVrTrackPoints.size();
  235. };
  236. case ActionPoints: {
  237. return _actionPoints.size();
  238. };
  239. }
  240. }
  241. void ProjectStore::removeTrackPoint(int id, ActiveTrackingSystem activeTrackingSystem) {
  242. switch(activeTrackingSystem) {
  243. case OptiTrack: {
  244. _optiTrackPoints.erase(_optiTrackPoints.begin() + id);
  245. break;
  246. }
  247. case EMFTrack: {
  248. break;
  249. }
  250. case SteamVRTrack: {
  251. _steamVrTrackPoints.erase(_steamVrTrackPoints.begin() + id);
  252. break;
  253. }
  254. case ActionPoints: {
  255. _actionPoints.erase(_actionPoints.begin() + id);
  256. break;
  257. }
  258. }
  259. projectModified();
  260. MainWindow::getInstance()->getEditWiget()->updateTrackpointCount();
  261. }
  262. void ProjectStore::updateNormalModifier(osg::Vec3 modifier) {
  263. _normalModifier = modifier;
  264. }
  265. osg::Vec3 ProjectStore::getNormalModifier() {
  266. return _normalModifier;
  267. }
  268. std::vector<OptiTrackPoint*> ProjectStore::getOptiTrackPoints() {
  269. return _optiTrackPoints;
  270. }
  271. void ProjectStore::updateOptiTrackSettings(OptiTrackSettings optiTrackSettings) {
  272. _optiTrackSettings = optiTrackSettings;
  273. }
  274. OptiTrackSettings ProjectStore::getOptiTrackSettings() {
  275. return _optiTrackSettings;
  276. }
  277. std::vector<SteamVRTrackPoint*> ProjectStore::getSteamVRTrackPoints() {
  278. return _steamVrTrackPoints;
  279. }
  280. void ProjectStore::updateSteamVRTrackSettings(SteamVRTrackSettings steamVrTrackSettings) {
  281. _steamVrTrackSettings = steamVrTrackSettings;
  282. }
  283. SteamVRTrackSettings ProjectStore::getSteamVRTrackSettings() {
  284. return _steamVrTrackSettings;
  285. }
  286. std::vector<ActionPoint*> ProjectStore::getActionPoints() {
  287. return _actionPoints;
  288. }
  289. void ProjectStore::updateActionPointSettings(ActionPointSettings actionPointSettings) {
  290. _actionPointSettings = actionPointSettings;
  291. }
  292. ActionPointSettings ProjectStore::getActionPointSettings() {
  293. return _actionPointSettings;
  294. }
  295. unsigned int ProjectStore::actionPointIdentifierInUse(std::string candidate, int current) {
  296. unsigned int count = 0;
  297. int i = 0;
  298. for (ActionPoint* actionPoint: _actionPoints) {
  299. if (i != current && candidate.compare(actionPoint->getIdentifier()) == 0) {
  300. count++;
  301. }
  302. i++;
  303. }
  304. return count;
  305. }
  306. void ProjectStore::load3mfLib() {
  307. _wrapper = Lib3MF::CWrapper::loadLibrary();
  308. _project = _wrapper->CreateModel();
  309. }
  310. void ProjectStore::reset() {
  311. _project = _wrapper->CreateModel();
  312. _optiTrackPoints.clear();
  313. _steamVrTrackPoints.clear();
  314. _actionPoints.clear();
  315. _optiTrackSettings = OptiTrackSettings {OPTITRACK_DEFAULT_LENGTH, OPTITRACK_DEFAULT_RADIUS};
  316. _steamVrTrackSettings = SteamVRTrackSettings {STEAMVR_DEFAULT_LENGTH};
  317. _actionPointSettings = ActionPointSettings {ACTIONPOINT_DEFAULT_IDENFIFIER};
  318. _normalModifier = osg::Vec3(0.0f, 0.0f, 0.0f);
  319. }
  320. void ProjectStore::render3MFMesh() {
  321. // Get meshes
  322. Lib3MF::PMeshObjectIterator meshIterator = _project->GetMeshObjects();
  323. // Our use case supports just a single mesh per project
  324. if (meshIterator->Count() != 1) {
  325. // TODO: Show error popup
  326. printf("Not 1 mesh: %llu\n", meshIterator->Count());
  327. return;
  328. }
  329. meshIterator->MoveNext();
  330. Lib3MF::PMeshObject mesh = meshIterator->GetCurrentMeshObject();
  331. // Load vertices and triangles and render them
  332. std::vector<Lib3MF::sPosition> verticesBuffer;
  333. mesh->GetVertices(verticesBuffer);
  334. std::vector<Lib3MF::sTriangle> triangleBuffer;
  335. mesh->GetTriangleIndices(triangleBuffer);
  336. // Create osg style arrays
  337. osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
  338. osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
  339. // Convert data to osg format and calculate vertex normals
  340. MeshTools::calculateNormals(verticesBuffer, triangleBuffer, vertices, normals);
  341. // Call renderer
  342. MainWindow* mainWindow = MainWindow::getInstance();
  343. mainWindow->getOsgWidget()->renderBaseMesh(vertices, normals);
  344. }
  345. void ProjectStore::updateMetaData() {
  346. Lib3MF::PMetaDataGroup metaData = _project->GetMetaDataGroup();
  347. try {
  348. Lib3MF::PMetaData versionInformation = metaData->GetMetaDataByKey(META_NAMESPACE, "format");
  349. } catch (Lib3MF::ELib3MFException &e) {
  350. metaData->AddMetaData(META_NAMESPACE, "format", "1.0.0", "string", true);
  351. }
  352. json optiTrackData = json::array();
  353. for (OptiTrackPoint* optiTrackPoint: _optiTrackPoints) {
  354. optiTrackData.push_back({
  355. {"point", osgVecToStdVec(optiTrackPoint->getTranslation())},
  356. {"normal", osgVecToStdVec(optiTrackPoint->getNormal())},
  357. {"normalModifier", osgVecToStdVec(optiTrackPoint->getNormalModifier())},
  358. {"length", optiTrackPoint->getLength()},
  359. {"radius", optiTrackPoint->getRadius()}
  360. });
  361. }
  362. try {
  363. Lib3MF::PMetaData optiTrackPoints = metaData->GetMetaDataByKey(META_NAMESPACE, "optitrack");
  364. optiTrackPoints->SetValue(optiTrackData.dump());
  365. } catch (Lib3MF::ELib3MFException &e) {
  366. metaData->AddMetaData(META_NAMESPACE, "optitrack", optiTrackData.dump(), "string", true);
  367. }
  368. json steamVrTrackData = json::array();
  369. for (SteamVRTrackPoint* steamVrTrackPoint: _steamVrTrackPoints) {
  370. steamVrTrackData.push_back({
  371. {"point", osgVecToStdVec(steamVrTrackPoint->getTranslation())},
  372. {"normal", osgVecToStdVec(steamVrTrackPoint->getNormal())},
  373. {"normalModifier", osgVecToStdVec(steamVrTrackPoint->getNormalModifier())},
  374. {"length", steamVrTrackPoint->getLength()}
  375. });
  376. }
  377. try {
  378. Lib3MF::PMetaData steamVrTrackPoints = metaData->GetMetaDataByKey(META_NAMESPACE, "steamvrtrack");
  379. steamVrTrackPoints->SetValue(steamVrTrackData.dump());
  380. } catch (Lib3MF::ELib3MFException &e) {
  381. metaData->AddMetaData(META_NAMESPACE, "steamvrtrack", steamVrTrackData.dump(), "string", true);
  382. }
  383. json actionPointData = json::array();
  384. for (ActionPoint* actionPoint: _actionPoints) {
  385. actionPointData.push_back({
  386. {"point", osgVecToStdVec(actionPoint->getTranslation())},
  387. {"normal", osgVecToStdVec(actionPoint->getNormal())},
  388. {"normalModifier", osgVecToStdVec(actionPoint->getNormalModifier())},
  389. {"identifier", actionPoint->getIdentifier()}
  390. });
  391. }
  392. try {
  393. Lib3MF::PMetaData actionPoints = metaData->GetMetaDataByKey(META_NAMESPACE, "actionpoints");
  394. actionPoints->SetValue(actionPointData.dump());
  395. } catch (Lib3MF::ELib3MFException &e) {
  396. metaData->AddMetaData(META_NAMESPACE, "actionpoints", actionPointData.dump(), "string", true);
  397. }
  398. }
  399. void ProjectStore::loadMetaData() {
  400. Lib3MF::PMetaDataGroup metaData = _project->GetMetaDataGroup();
  401. try {
  402. Lib3MF::PMetaData versionInformation = metaData->GetMetaDataByKey(META_NAMESPACE, "format");
  403. } catch (Lib3MF::ELib3MFException &e) {
  404. // TODO: Alert not a TrackpointApp poject
  405. }
  406. Lib3MF::PMetaData optiTrackString;
  407. try {
  408. optiTrackString = metaData->GetMetaDataByKey(META_NAMESPACE, "optitrack");
  409. auto optiTrackData = json::parse(optiTrackString->GetValue());
  410. _optiTrackPoints.clear();
  411. for (const auto pointData: optiTrackData) {
  412. osg::Vec3f point = osg::Vec3f(pointData["point"][0], pointData["point"][1], pointData["point"][2]);
  413. osg::Vec3f normal = osg::Vec3f(pointData["normal"][0], pointData["normal"][1], pointData["normal"][2]);
  414. osg::Vec3f normalModifier = osg::Vec3f(pointData["normalModifier"][0], pointData["normalModifier"][1], pointData["normalModifier"][2]);
  415. OptiTrackPoint* optiTrackPoint = new OptiTrackPoint(point, normal, normalModifier, static_cast<double>(pointData["length"]), static_cast<double>(pointData["radius"]));
  416. _optiTrackPoints.push_back(optiTrackPoint);
  417. }
  418. } catch (Lib3MF::ELib3MFException &e) {
  419. // TODO: Something is wrong with the file
  420. }
  421. Lib3MF::PMetaData steamVrTrackString;
  422. try {
  423. steamVrTrackString = metaData->GetMetaDataByKey(META_NAMESPACE, "steamvrtrack");
  424. auto steamVrData = json::parse(steamVrTrackString->GetValue());
  425. _steamVrTrackPoints.clear();
  426. for (const auto pointData: steamVrData) {
  427. osg::Vec3f point = osg::Vec3f(pointData["point"][0], pointData["point"][1], pointData["point"][2]);
  428. osg::Vec3f normal = osg::Vec3f(pointData["normal"][0], pointData["normal"][1], pointData["normal"][2]);
  429. osg::Vec3f normalModifier = osg::Vec3f(pointData["normalModifier"][0], pointData["normalModifier"][1], pointData["normalModifier"][2]);
  430. SteamVRTrackPoint* steamVrTrackPoint = new SteamVRTrackPoint(point, normal, normalModifier, static_cast<double>(pointData["length"]));
  431. _steamVrTrackPoints.push_back(steamVrTrackPoint);
  432. }
  433. } catch (Lib3MF::ELib3MFException &e) {
  434. // TODO: Something is wrong with the file
  435. }
  436. Lib3MF::PMetaData actionPointString;
  437. try {
  438. actionPointString = metaData->GetMetaDataByKey(META_NAMESPACE, "actionpoints");
  439. auto actionPointData = json::parse(actionPointString->GetValue());
  440. _actionPoints.clear();
  441. for (const auto pointData: actionPointData) {
  442. osg::Vec3f point = osg::Vec3f(pointData["point"][0], pointData["point"][1], pointData["point"][2]);
  443. osg::Vec3f normal = osg::Vec3f(pointData["normal"][0], pointData["normal"][1], pointData["normal"][2]);
  444. osg::Vec3f normalModifier = osg::Vec3f(pointData["normalModifier"][0], pointData["normalModifier"][1], pointData["normalModifier"][2]);
  445. ActionPoint* actionPoint = new ActionPoint(point, normal, normalModifier, pointData["identifier"]);
  446. _actionPoints.push_back(actionPoint);
  447. }
  448. } catch (Lib3MF::ELib3MFException &e) {
  449. // TODO: Something is wrong with the file
  450. }
  451. render3MFMesh();
  452. MainWindow::getInstance()->renderView(Edit);
  453. MainWindow::getInstance()->getOsgWidget()->getPointRenderer()->render(MainWindow::getInstance()->getEditWiget()->getSelectedTrackingSystem());
  454. MainWindow::getInstance()->getEditWiget()->updateTrackpointCount();
  455. }
  456. std::vector<float> ProjectStore::osgVecToStdVec(osg::Vec3f input) {
  457. std::vector<float> vector;
  458. vector.push_back(input.x());
  459. vector.push_back(input.y());
  460. vector.push_back(input.z());
  461. return vector;
  462. }
  463. osg::Vec3f ProjectStore::stdVecToOsgVec(std::vector<float> input) {
  464. return osg::Vec3f(input[0], input[1], input[2]);
  465. }