Browse Source

Fix steamvr thread renderning

Johannes Kreutz 2 years ago
parent
commit
0aaf624591

+ 5 - 1
trackpoint-app/include/OSGWidget.hpp

@@ -29,13 +29,15 @@ class OSGWidget : public QOpenGLWidget {
   Q_OBJECT
 
 public:
-  static void fixMaterialState(osg::ref_ptr<osg::Node> node);
+  static void fixMaterialState(osg::ref_ptr<osg::Node> node, osg::Vec4* color = nullptr);
   OSGWidget(QWidget* parent = nullptr);
   virtual ~OSGWidget();
   void renderBaseMesh(const osg::ref_ptr<osg::Vec3Array> vertices, const osg::ref_ptr<osg::Vec3Array> normals);
   osg::ref_ptr<osg::Geode> getMesh();
   PickHandler* getPicker();
   TrackPointRenderer* getPointRenderer();
+  void loadSteamvrThread();
+  osg::ref_ptr<osg::Geometry> _steamvrThreadMesh;
 
 protected:
   virtual void paintEvent(QPaintEvent* paintEvent);
@@ -75,4 +77,6 @@ private:
 
   bool selectionActive_;
   bool selectionFinished_;
+
+  bool _steamvrLoaded = false;
 };

+ 3 - 1
trackpoint-app/include/PointShape.hpp

@@ -11,9 +11,11 @@
 #include <osg/ShapeDrawable>
 #include <osg/Switch>
 #include <osg/Geode>
+#include "lib3mf_implicit.hpp"
 
 class PointShape {
 public:
+  static void loadSteamvrThread();
   PointShape(const osg::ref_ptr<osg::Group> renderRoot, const ActiveTrackingSystem activeTrackingSystem, osg::Vec3f point, osg::Vec3f normal, osg::Vec3f normalModifier);
   ~PointShape();
   void moveTo(osg::Vec3f position);
@@ -33,8 +35,8 @@ private:
   osg::ref_ptr<osg::MatrixTransform> _selectionMoveToEndGroup;
   osg::ref_ptr<osg::MatrixTransform> _screwMove;
   osg::ref_ptr<osg::Group> _renderRoot;
-  osg::ref_ptr<osg::Geometry> _threadMesh;
   osg::ref_ptr<osg::ShapeDrawable> _shape;
+  osg::ref_ptr<osg::Geode> _thread;
   osg::ref_ptr<osg::Geode> _geode;
   osg::Vec3f _normalModifier;
   double _optiTrackSteamVRLength;

+ 1 - 1
trackpoint-app/resources/generate.py

@@ -30,9 +30,9 @@ for file in files:
             else:
                 t[point] = vId
                 vertices.append(v)
+                vId += 1
             point += 1
         triangles.append(t)
-        vId += 1
     id = file[0:-4]
     fileData[id] = (vertices, triangles)
 

File diff suppressed because it is too large
+ 0 - 0
trackpoint-app/resources/resources.hpp


+ 32 - 2
trackpoint-app/src/OSGWidget.cpp

@@ -5,6 +5,8 @@
 #include "PickHandler.hpp"
 #include "TrackPointRenderer.hpp"
 #include "HudCallback.hpp"
+#include "resources.hpp"
+#include "MeshTools.hpp"
 
 // Include dependencies
 #include <osgViewer/Viewer>
@@ -49,12 +51,14 @@ namespace osgWidget {
   }
 }
 
-void OSGWidget::fixMaterialState(osg::ref_ptr<osg::Node> node) {
+void OSGWidget::fixMaterialState(osg::ref_ptr<osg::Node> node, osg::Vec4* color) {
   osg::StateSet* stateSet = node->getOrCreateStateSet();
   osg::Material* material = new osg::Material;
 
   material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
-
+  if (color) {
+    material->setDiffuse(osg::Material::FRONT_AND_BACK, *color);
+  }
   stateSet->setAttributeAndModes(material, osg::StateAttribute::ON);
   stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
 }
@@ -215,6 +219,32 @@ TrackPointRenderer* OSGWidget::getPointRenderer() {
   return _pointRenderer;
 }
 
+void OSGWidget::loadSteamvrThread() {
+  if (!_steamvrLoaded) {
+    std::vector<Lib3MF::sPosition> verticesBuffer;
+    std::vector<Lib3MF::sTriangle> triangleBuffer;
+    for (unsigned int i = 0; i < sizeof(steamvrthread_VERTICES) / sizeof(float); i += 3) {
+      Lib3MF::sPosition vertex = {steamvrthread_VERTICES[i], steamvrthread_VERTICES[i + 1], steamvrthread_VERTICES[i + 2]};
+      verticesBuffer.push_back(vertex);
+    }
+    for (unsigned int i = 0; i < sizeof(steamvrthread_TRIANGLES) / sizeof(unsigned int); i += 3) {
+      Lib3MF::sTriangle triangle = {steamvrthread_TRIANGLES[i], steamvrthread_TRIANGLES[i + 1], steamvrthread_TRIANGLES[i + 2]};
+      triangleBuffer.push_back(triangle);
+    }
+    osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
+    osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
+    MeshTools::calculateNormals(verticesBuffer, triangleBuffer, vertices, normals);
+
+    _steamvrThreadMesh = new osg::Geometry;
+    _steamvrThreadMesh->setVertexArray(vertices.get());
+    _steamvrThreadMesh->setNormalArray(normals.get(), osg::Array::BIND_PER_VERTEX);
+    _steamvrThreadMesh->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, 0, vertices->getNumElements()));
+    osgUtil::optimizeMesh(_steamvrThreadMesh.get());
+
+    _steamvrLoaded = true;
+  }
+}
+
 void OSGWidget::paintEvent(QPaintEvent*) {
   this->makeCurrent();
 

+ 8 - 31
trackpoint-app/src/PointShape.cpp

@@ -4,8 +4,7 @@
 // Include modules
 #include "OSGWidget.hpp"
 #include "defaults.hpp"
-#include "resources.hpp"
-#include "MeshTools.hpp"
+#include "MainWindow.hpp"
 
 // Include dependencies
 #include <osgUtil/MeshOptimizers>
@@ -68,8 +67,8 @@ void PointShape::setVisibility(bool mode) {
 
 void PointShape::setColor(osg::Vec4 color) {
   _shape->setColor(color);
-  if (_threadMesh) {
-    _threadMesh->setColor(color);
+  if (_thread) {
+    OSGWidget::fixMaterialState(_thread, &color);
   }
 }
 
@@ -95,33 +94,11 @@ void PointShape::setupSteamVRTrack(SteamVRTrackSettings steamVrTrackSettings) {
     _shape->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.2f));
     _geode->addDrawable(_shape.get());
 
-    std::vector<Lib3MF::sPosition> verticesBuffer;
-    std::vector<Lib3MF::sTriangle> triangleBuffer;
-    for (unsigned int i = 0; i < sizeof(steamvrthread_VERTICES) / sizeof(float); i += 3) {
-      Lib3MF::sPosition vertex = {steamvrthread_VERTICES[i], steamvrthread_VERTICES[i + 1], steamvrthread_VERTICES[i + 2]};
-      verticesBuffer.push_back(vertex);
-    }
-    for (unsigned int i = 0; i < sizeof(steamvrthread_TRIANGLES) / sizeof(unsigned int); i += 3) {
-      Lib3MF::sTriangle triangle = {steamvrthread_TRIANGLES[i], steamvrthread_TRIANGLES[i + 1], steamvrthread_TRIANGLES[i + 2]};
-      triangleBuffer.push_back(triangle);
-    }
-
-    // Create osg style arrays
-    osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
-    osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
-    MeshTools::calculateNormals(verticesBuffer, triangleBuffer, vertices, normals);
-
-    osg::ref_ptr<osg::Geode> thread = new osg::Geode;
-    _threadMesh = new osg::Geometry;
-    _threadMesh->setVertexArray(vertices.get());
-    _threadMesh->setNormalArray(normals.get(), osg::Array::BIND_PER_VERTEX);
-    _threadMesh->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, 0, vertices->getNumElements()));
-    _threadMesh->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.2f));
-    osgUtil::optimizeMesh(_threadMesh.get());
-
-    thread->addDrawable(_threadMesh.get());
-    OSGWidget::fixMaterialState(thread);
-    _screwMove->addChild(thread.get());
+    MainWindow::getInstance()->getOsgWidget()->loadSteamvrThread();
+    _thread = new osg::Geode;
+    _thread->addDrawable(MainWindow::getInstance()->getOsgWidget()->_steamvrThreadMesh.get());
+    OSGWidget::fixMaterialState(_thread);
+    _screwMove->addChild(_thread.get());
 
     OSGWidget::fixMaterialState(_geode);
     _selectionRotateGroup->addChild(_geode.get());

Some files were not shown because too many files changed in this diff