Explorar el Código

Show steamvr thread in 3d view

Johannes Kreutz hace 2 años
padre
commit
008229ff2b

+ 2 - 0
trackpoint-app/CMakeLists.txt

@@ -75,6 +75,7 @@ QT_ADD_EXECUTABLE(TrackpointApp
   src/PointShape.cpp
   src/HudCallback.cpp
   src/STLImport.cpp
+  src/MeshTools.cpp
 )
 
 if(NOT BUILD_STATIC_RELEASE)
@@ -107,6 +108,7 @@ INCLUDE_DIRECTORIES(
   ${CMAKE_CURRENT_LIST_DIR}/thirdparty/stl_reader/install
   include
   gui
+  resources
 )
 
 TARGET_LINK_LIBRARIES(TrackpointApp PRIVATE

+ 1 - 0
trackpoint-app/include/MainWindow.hpp

@@ -28,6 +28,7 @@ private:
   void load();
   void save();
   void saveAs();
+  void loadStaticMeshes();
   Ui::MainWindow* ui;
   OSGWidget* osgWidget;
   NoMeshWidget* noMeshWidget;

+ 10 - 0
trackpoint-app/include/MeshTools.hpp

@@ -0,0 +1,10 @@
+#pragma once
+
+// Include dependencies
+#include "lib3mf_implicit.hpp"
+#include <osg/Array>
+
+class MeshTools {
+public:
+  static void calculateNormals(const std::vector<Lib3MF::sPosition> verticesBuffer, const std::vector<Lib3MF::sTriangle> triangleBuffer, osg::ref_ptr<osg::Vec3Array> vertices, osg::ref_ptr<osg::Vec3Array> normals);
+};

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

@@ -33,6 +33,7 @@ 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> _geode;
   osg::Vec3f _normalModifier;

+ 66 - 0
trackpoint-app/resources/generate.py

@@ -0,0 +1,66 @@
+#!/usr/bin/env python3
+
+from stl import mesh
+
+files = ["steamvrthread.stl"]
+
+fileData = {}
+
+def getVertexId(vertices, vertex):
+    i = 0
+    for v in vertices:
+        if v[0] == vertex[0] and v[1] == vertex[1] and v[2] == vertex[2]:
+            return i
+        i += 1
+    return -1
+
+for file in files:
+    current = mesh.Mesh.from_file(file)
+    vertices = []
+    triangles = []
+    vId = 0
+    for triangle in current.points:
+        t = [0, 0, 0]
+        point = 0
+        for i in [0, 3, 6]:
+            v = (triangle[i], triangle[i + 1], triangle[i + 2])
+            vertexId = getVertexId(vertices, v)
+            if vertexId >= 0:
+                t[point] = vertexId
+            else:
+                t[point] = vId
+                vertices.append(v)
+            point += 1
+        triangles.append(t)
+        vId += 1
+    id = file[0:-4]
+    fileData[id] = (vertices, triangles)
+
+with open("resources.hpp", "w") as f:
+    f.write("#pragma once\n");
+    f.write("// AUTOGENERATED FILE - DO NOT EDIT\n");
+    for key, data in fileData.items():
+        vString = "{"
+        tString = "{"
+        vLength = 0
+        tLength = 0
+        first = True
+        for vertex in data[0]:
+            for v in vertex:
+                if not first:
+                    vString += ", "
+                first = False
+                vString += str(v)
+                vLength += 1
+        first = True
+        for triangle in data[1]:
+            for t in triangle:
+                if not first:
+                    tString += ", "
+                first = False
+                tString += str(t)
+                tLength += 1
+        vString += "}"
+        tString += "}"
+        f.write("const float " + key + "_VERTICES[" + str(vLength) + "] " + vString + ";\n");
+        f.write("const unsigned int " + key + "_TRIANGLES[" + str(tLength) + "] " + tString + ";\n");

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 2 - 0
trackpoint-app/resources/resources.hpp


+ 4 - 0
trackpoint-app/src/MainWindow.cpp

@@ -113,3 +113,7 @@ void MainWindow::saveAs() {
     // TODO: Show error popup
   }
 }
+
+void MainWindow::loadStaticMeshes() {
+  
+}

+ 22 - 0
trackpoint-app/src/MeshTools.cpp

@@ -0,0 +1,22 @@
+// Include own header
+#include "MeshTools.hpp"
+
+void MeshTools::calculateNormals(const std::vector<Lib3MF::sPosition> verticesBuffer, const std::vector<Lib3MF::sTriangle> triangleBuffer, osg::ref_ptr<osg::Vec3Array> vertices, osg::ref_ptr<osg::Vec3Array> normals) {
+  for (const Lib3MF::sTriangle triangle: triangleBuffer) {
+    // Create osg vectors
+    osg::Vec3 vertex[3] = {};
+    for (char i = 0; i < 3; i++) {
+      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]);
+    }
+    // Calculate normal
+    osg::Vec3 edgeOne = vertex[1].operator-(vertex[0]);
+    osg::Vec3 edgeTwo = vertex[2].operator-(vertex[0]);
+    osg::Vec3 normal = edgeOne.operator^(edgeTwo);
+    normal.normalize();
+    // Store them
+    for (int i = 0; i < 3; i++) {
+      vertices->push_back(vertex[i]);
+      normals->push_back(normal);
+    }
+  }
+}

+ 40 - 7
trackpoint-app/src/PointShape.cpp

@@ -4,21 +4,24 @@
 // Include modules
 #include "OSGWidget.hpp"
 #include "defaults.hpp"
+#include "resources.hpp"
+#include "MeshTools.hpp"
 
 // Include dependencies
-#include <osgDB/ReadFile>
+#include <osgUtil/MeshOptimizers>
+#include "lib3mf_implicit.hpp"
 
 PointShape::PointShape(const osg::ref_ptr<osg::Group> renderRoot, const ActiveTrackingSystem activeTrackingSystem, osg::Vec3f point, osg::Vec3f normal, osg::Vec3f normalModifier) {
   _renderRoot = renderRoot;
   _activeTrackingSystem = activeTrackingSystem;
 
-  _selectionRotateGroup = new osg::MatrixTransform;
-
   _screwMove = new osg::MatrixTransform;
 
+  _selectionRotateGroup = new osg::MatrixTransform;
+  _selectionRotateGroup->addChild(_screwMove.get());
+
   _selectionMoveToEndGroup = new osg::MatrixTransform;
   _selectionMoveToEndGroup->addChild(_selectionRotateGroup.get());
-  _selectionMoveToEndGroup->addChild(_screwMove.get());
 
   _selectionTranslateGroup = new osg::MatrixTransform;
   _selectionTranslateGroup->addChild(_selectionMoveToEndGroup.get());
@@ -54,7 +57,7 @@ void PointShape::rotateToNormalVector(osg::Vec3f normal) {
     _selectionMoveToEndGroup->setMatrix(osg::Matrix::translate(movementVector));
   }
   if (_activeTrackingSystem == SteamVRTrack) {
-    osg::Vec3f movementVector = normal.operator*(_optiTrackSteamVRLength);
+    osg::Vec3f movementVector = osg::Vec3f(0.0f, 0.0f, 1.0f).operator*(_optiTrackSteamVRLength / 2);
     _screwMove->setMatrix(osg::Matrix::translate(movementVector));
   }
 }
@@ -65,6 +68,9 @@ void PointShape::setVisibility(bool mode) {
 
 void PointShape::setColor(osg::Vec4 color) {
   _shape->setColor(color);
+  if (_threadMesh) {
+    _threadMesh->setColor(color);
+  }
 }
 
 void PointShape::setupOptiTrack(OptiTrackSettings optiTrackSettings) {
@@ -88,8 +94,35 @@ void PointShape::setupSteamVRTrack(SteamVRTrackSettings steamVrTrackSettings) {
     _shape->setShape(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, 0.0f), STEAMVR_CONSTANT_RADIUS, steamVrTrackSettings.length));
     _shape->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.2f));
     _geode->addDrawable(_shape.get());
-    osg::ref_ptr<osg::Node> screw = osgDB::readNodeFile("../resources/steamvrthread.stl");
-    _screwMove->addChild(screw.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());
+
     OSGWidget::fixMaterialState(_geode);
     _selectionRotateGroup->addChild(_geode.get());
   }

+ 2 - 17
trackpoint-app/src/ProjectStore.cpp

@@ -7,6 +7,7 @@
 #include "TrackPointRenderer.hpp"
 #include "PlatformSupport.hpp"
 #include "STLImport.hpp"
+#include "MeshTools.hpp"
 
 // Include dependencies
 #include <typeinfo>
@@ -310,23 +311,7 @@ void ProjectStore::render3MFMesh() {
   osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
   osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
   // Convert data to osg format and calculate vertex normals
-  for (const Lib3MF::sTriangle triangle: triangleBuffer) {
-    // Create osg vectors
-    osg::Vec3 vertex[3] = {};
-    for (char i = 0; i < 3; i++) {
-      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]);
-    }
-    // Calculate normal
-    osg::Vec3 edgeOne = vertex[1].operator-(vertex[0]);
-    osg::Vec3 edgeTwo = vertex[2].operator-(vertex[0]);
-    osg::Vec3 normal = edgeOne.operator^(edgeTwo);
-    normal.normalize();
-    // Store them
-    for (int i = 0; i < 3; i++) {
-      vertices->push_back(vertex[i]);
-      normals->push_back(normal);
-    }
-  }
+  MeshTools::calculateNormals(verticesBuffer, triangleBuffer, vertices, normals);
   // Call renderer
   MainWindow* mainWindow = MainWindow::getInstance();
   mainWindow->getOsgWidget()->renderBaseMesh(vertices, normals);

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio