/*************************************************************************** * Copyright (c) 2014 Jürgen Riegel * * * * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License as published by the Free Software Foundation; either * * version 2 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this library; see the file COPYING.LIB. If not, * * write to the Free Software Foundation, Inc., 59 Temple Place, * * Suite 330, Boston, MA 02111-1307, USA * * * ***************************************************************************/ #if BUILD_VR # include # include # include "View3DInventorRiftViewer.h" using namespace Gui; View3DInventorRiftViewer::View3DInventorRiftViewer() : CoinRiftWidget() { workplace = new SoGroup(); // translation = new SoTranslation ; // translation->translation.setValue(0,-1,0); // workplace->addChild(translation); rotation1 = new SoRotationXYZ; rotation1->axis.setValue(SoRotationXYZ::X); rotation1->angle.setValue(-std::numbers::pi / 2); workplace->addChild(rotation1); rotation2 = new SoRotationXYZ; rotation2->axis.setValue(SoRotationXYZ::Z); rotation2->angle.setValue(0); workplace->addChild(rotation2); scale = new SoScale; scale->scaleFactor.setValue(0.001f, 0.001f, 0.001f); // scale from mm to m as needed by the Rift workplace->addChild(scale); ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath( "User parameter:BaseApp/Preferences/Oculus" ); this->setGeometry( hGrp->GetInt("RenderWindowPosX", 100), hGrp->GetInt("RenderWindowPosY", 100), hGrp->GetInt("RenderWindowSizeW", 1920), hGrp->GetInt("RenderWindowSizeH", 1080) ); setBackgroundColor(SbColor(51, 51, 101)); basePosition = SbVec3f(0.0f, 0.5f, 0.8f); } // void saveWinPosition(void) //{ // // // // } View3DInventorRiftViewer::~View3DInventorRiftViewer() { ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath( "User parameter:BaseApp/Preferences/Oculus" ); // remember last position on close hGrp->SetInt("RenderWindowPosX", pos().x()); hGrp->SetInt("RenderWindowPosY", pos().y()); hGrp->SetInt("RenderWindowSizeW", size().width()); hGrp->SetInt("RenderWindowSizeH", size().height()); Base::Console() .log("pos: %d %d size: %d %d \n", pos().x(), pos().y(), size().width(), size().height()); } void View3DInventorRiftViewer::setSceneGraph(SoNode* sceneGraph) { workplace->addChild(sceneGraph); CoinRiftWidget::setSceneGraph(workplace); } void View3DInventorRiftViewer::keyPressEvent(QKeyEvent* event) { static const float increment = 0.02; // move two centimeter per key static const float rotIncrement = std::numbers::pi / 4; // move two 90° per key if (event->key() == Qt::Key_Plus) { scale->scaleFactor.setValue(scale->scaleFactor.getValue() * 2.0f); } else if (event->key() == Qt::Key_Minus) { scale->scaleFactor.setValue(scale->scaleFactor.getValue() * 0.2f); } else if (event->key() == Qt::Key_S) { basePosition += SbVec3f(0, 0, increment); } else if (event->key() == Qt::Key_W) { basePosition += SbVec3f(0, 0, -increment); } else if (event->key() == Qt::Key_Up) { basePosition += SbVec3f(0, -increment, 0); } else if (event->key() == Qt::Key_Down) { basePosition += SbVec3f(0, increment, 0); } else if (event->key() == Qt::Key_Left) { rotation2->angle.setValue(rotation2->angle.getValue() + rotIncrement); } else if (event->key() == Qt::Key_Right) { rotation2->angle.setValue(rotation2->angle.getValue() - rotIncrement); } else if (event->key() == Qt::Key_A) { basePosition += SbVec3f(-increment, 0, 0); } else if (event->key() == Qt::Key_D) { basePosition += SbVec3f(increment, 0, 0); } else { CoinRiftWidget::keyPressEvent(event); } } // static test code ================================================================================ static View3DInventorRiftViewer* window = 0; void oculusSetTestScene(View3DInventorRiftViewer* window) { assert(window); // An example scene. static const char* inlineSceneGraph[] = { "#Inventor V2.1 ascii\n", "\n", "Separator {\n", " Rotation { rotation 1 0 0 0.3 }\n", " Cone { }\n", " BaseColor { rgb 1 0 0 }\n", " Scale { scaleFactor .7 .7 .7 }\n", " Cube { }\n", "\n", " DrawStyle { style LINES }\n", " ShapeHints { vertexOrdering COUNTERCLOCKWISE }\n", " Coordinate3 {\n", " point [\n", " -2 -2 1.1, -2 -1 1.1, -2 1 1.1, -2 2 1.1,\n", " -1 -2 1.1, -1 -1 1.1, -1 1 1.1, -1 2 1.1\n", " 1 -2 1.1, 1 -1 1.1, 1 1 1.1, 1 2 1.1\n", " 2 -2 1.1, 2 -1 1.1, 2 1 1.1, 2 2 1.1\n", " ]\n", " }\n", "\n", " Complexity { value 0.7 }\n", " NurbsSurface {\n", " numUControlPoints 4\n", " numVControlPoints 4\n", " uKnotVector [ 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0 ]\n", " vKnotVector [ 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0 ]\n", " }\n", "}\n", NULL }; SoInput in; in.setStringArray(inlineSceneGraph); window->setSceneGraph(SoDB::readAll(&in)); } void oculusStop() { // SoDB::finish(); if (window) { delete window; window = 0; ovr_Shutdown(); } } bool oculusUp(void) { return window != 0; } View3DInventorRiftViewer* oculusStart(void) { // SoDB::init(); // QApplication app(argc, argv); // qAddPostRoutine(cleanup); // Moved here because of // https://developer.oculusvr.com/forums/viewtopic.php?f=17&t=7915&p=108503#p108503 Init libovr. if (!ovr_Initialize()) { qDebug() << "Could not initialize Oculus SDK."; return 0; } if (window) { return window; } window = new View3DInventorRiftViewer; window->show(); return window; // return app.exec(); } #endif // BUILD_VR