diff --git a/CMakeLists.txt b/CMakeLists.txt index 445623f709958c2cb2f8f3db471b6b5b40aa5a4c..231b2c55bf183b677172d7f2624ab5d44c2d8e90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -253,6 +253,7 @@ add_subdirectory(Geometry) add_subdirectory(Mesh) add_subdirectory(RenderDelegates) add_subdirectory(Rendering) +add_subdirectory(VtkRendering) add_subdirectory(Simulators) add_subdirectory(VirtualTools) add_subdirectory(Examples) diff --git a/Collision/SurfaceTree.hpp b/Collision/SurfaceTree.hpp index 70c2a653b8132a59e524afc0eca3141afe2dfe85..8e8cdf9acb3e1c48221356d3cf2c68f76f319043 100644 --- a/Collision/SurfaceTree.hpp +++ b/Collision/SurfaceTree.hpp @@ -25,7 +25,7 @@ #define SM_SMSURFACETREE_HPP // SimMedTK includes -#include "Rendering/Viewer.h" +#include "Rendering/OpenGLViewer.h" #include "Collision/SurfaceTreeIterator.h" #include "Event/KeyboardEvent.h" #include "Core/Factory.h" diff --git a/Collision/UnitTests/MeshCollisionModelSpec.cpp b/Collision/UnitTests/MeshCollisionModelSpec.cpp index 5624647d8c8c01716ccb1f61c09b8b3155d57ff0..dca190123149399eb0ae5b9a9651f9c95126d1de 100644 --- a/Collision/UnitTests/MeshCollisionModelSpec.cpp +++ b/Collision/UnitTests/MeshCollisionModelSpec.cpp @@ -54,7 +54,7 @@ go_bandit([](){ mesh->initVertexArrays(4); mesh->initTriangleArrays(2); - core::StdVector3d vertices; + std::vector<core::Vec3d> vertices; vertices.emplace_back(1.0,2.0,-1.0); vertices.emplace_back(2.0,3.0,1.0); vertices.emplace_back(2.0,1.0,-1.0); @@ -101,7 +101,7 @@ go_bandit([](){ mesh->initVertexArrays(4); mesh->initTriangleArrays(2); - core::StdVector3d vertices; + std::vector<core::Vec3d> vertices; vertices.emplace_back(1.0,2.0,-1.0); vertices.emplace_back(2.0,3.0,1.0); vertices.emplace_back(2.0,1.0,-1.0); @@ -147,7 +147,7 @@ go_bandit([](){ mesh->initVertexArrays(4); mesh->initTriangleArrays(2); - core::StdVector3d vertices; + std::vector<core::Vec3d> vertices; vertices.emplace_back(1.0,2.0,-1.0); vertices.emplace_back(2.0,3.0,1.0); vertices.emplace_back(2.0,1.0,-1.0); diff --git a/Collision/UnitTests/MeshToMeshCollisionSpec.cpp b/Collision/UnitTests/MeshToMeshCollisionSpec.cpp index 2337f28fff1728d84fae230c89e62de3300ed947..ffc56f6b09f95bceacddd40a05d559e83ac163b5 100644 --- a/Collision/UnitTests/MeshToMeshCollisionSpec.cpp +++ b/Collision/UnitTests/MeshToMeshCollisionSpec.cpp @@ -31,7 +31,7 @@ using namespace bandit; -std::shared_ptr<MeshCollisionModel> getModel(const core::StdVector3d &vertices) +std::shared_ptr<MeshCollisionModel> getModel(const std::vector<core::Vec3d> &vertices) { std::shared_ptr<MeshCollisionModel> model = std::make_shared<MeshCollisionModel>(); std::shared_ptr<Mesh> mesh = std::make_shared<SurfaceMesh>(); @@ -72,12 +72,12 @@ go_bandit([](){ it("performs collision detection ", []() { std::unique_ptr<CollisionDetection> meshToMeshCollision = make_unique<MeshToMeshCollision>(); - core::StdVector3d verticesA; + std::vector<core::Vec3d> verticesA; verticesA.emplace_back(1.0,2.0,0); verticesA.emplace_back(2.0,3.0,0); verticesA.emplace_back(2.0,1.0,0); - core::StdVector3d verticesB; + std::vector<core::Vec3d> verticesB; verticesB.emplace_back(1.0,2.0,0.5); verticesB.emplace_back(2.0,3.0,0); verticesB.emplace_back(2.0,1.0,0); diff --git a/Core/CoreClass.h b/Core/CoreClass.h index 52c0884bb5babf74b8e055bc5216fa090f8f84ab..3377be14e94c53c0cbe22f147ce714e97bfc39ac 100644 --- a/Core/CoreClass.h +++ b/Core/CoreClass.h @@ -40,7 +40,7 @@ class SDK; class CoreClass; class RenderDelegate; class ObjectSimulator; -class Viewer; +class OpenGLViewer; /// \brief simulator calls object and sends this structure struct SimulationParam diff --git a/Core/DataStructures.hpp b/Core/DataStructures.hpp index f33235b03a40d80c2c14cc6812bbf069e94f2e77..601422978e50b233b7a0e6ec78aa8ced5bfd4e6a 100644 --- a/Core/DataStructures.hpp +++ b/Core/DataStructures.hpp @@ -24,6 +24,8 @@ #ifndef SMDATASTUCTURES_HPP #define SMDATASTUCTURES_HPP +#include <iostream> + template<typename T> EntryList<T>::EntryList() { diff --git a/Core/Geometry.h b/Core/Geometry.h index 5db7788ba31ac72a74c7bcd9a830421cd66a78f1..afec193e1ec6d29c211002020a21999b428bf958 100644 --- a/Core/Geometry.h +++ b/Core/Geometry.h @@ -30,7 +30,7 @@ #include "Core/Matrix.h" #include "Core/Factory.h" -#include "Rendering/GLRenderer.h" +#include "Rendering/OpenGLRenderer.h" #include "RenderDelegate.h" //forward declaration diff --git a/Core/ObjectSimulator.cpp b/Core/ObjectSimulator.cpp index 546ddbbf63007fc11ef1a76a514170a6670e977b..b06d9c19fcadc8aea7b289dc6f8e4b90a9667057 100644 --- a/Core/ObjectSimulator.cpp +++ b/Core/ObjectSimulator.cpp @@ -23,7 +23,7 @@ #include "Core/ObjectSimulator.h" #include "Core/SDK.h" -#include "Rendering/Viewer.h" +#include "Rendering/OpenGLViewer.h" ObjectSimulator::ObjectSimulator(std::shared_ptr<ErrorLog> p_log) { diff --git a/Core/SDK.h b/Core/SDK.h index 53406d0114babe974bee7c2264bf114b314b353e..572eb0c099a853613ee32d5f0aceeb481212ebfb 100644 --- a/Core/SDK.h +++ b/Core/SDK.h @@ -32,7 +32,7 @@ #include "Core/Module.h" #include "Core/DataStructures.h" #include "Core/MakeUnique.h" -#include "Rendering/Viewer.h" +#include "Rendering/OpenGLViewer.h" /// \brief maximum entities in the framework #define SIMMEDTK_SDK_MAXMESHES 100 diff --git a/Core/Scene.h b/Core/Scene.h index 8828ade30f9f9b0616aa0da563e8362274ff1fcd..6f5219919497be2cd27ae24f0ed0b6f90a1103fb 100644 --- a/Core/Scene.h +++ b/Core/Scene.h @@ -143,6 +143,11 @@ public: /// \brief adds the objects in the local scene storage void copySceneToLocal(SceneLocal &p_local); + const std::vector<std::shared_ptr<SceneObject>> &getSceneObjects() const + { + return sceneObjects; + } + private: std::shared_ptr<Camera> camera; //Camera for the scene std::vector<std::shared_ptr<Light> > lights; //Lights in the scene diff --git a/Core/SceneObject.cpp b/Core/SceneObject.cpp index 319187bb9431104044c71fbfaee0d37382aa4697..812466d562ce65121bc07fdc3f2bbfc73273df54 100644 --- a/Core/SceneObject.cpp +++ b/Core/SceneObject.cpp @@ -77,7 +77,7 @@ UnifiedId::Pointer SceneObject::getObjectUnifiedID() return std::make_shared<UnifiedId>(); } -core::StdVector3d & SceneObject::getLocalVertices() +std::vector<core::Vec3d> & SceneObject::getLocalVertices() { return localVertices; } diff --git a/Core/SceneObject.h b/Core/SceneObject.h index 6714da957dac59a66f9263b6fff273e88df48fa9..247a7d35259c3a0d1cef410e57efa886945d9860 100644 --- a/Core/SceneObject.h +++ b/Core/SceneObject.h @@ -53,7 +53,7 @@ class SceneObject : public CoreClass { friend class SDK; friend class ViewerBase; - friend class Viewer; + friend class OpenGLViewer; friend class Scene; friend class ObjectSimulator; @@ -101,7 +101,7 @@ public: /// \brief get unified object id UnifiedId::Pointer getObjectUnifiedID(); - core::StdVector3d &getLocalVertices(); + std::vector<core::Vec3d> &getLocalVertices(); ObjectInitFlags &getFlags(); @@ -128,7 +128,7 @@ protected: private: std::shared_ptr<ObjectSimulator> objectSim; // object simulator that will simulate the object std::shared_ptr<CustomRenderer> customRender; - core::StdVector3d localVertices; // local copy of vertices + std::vector<core::Vec3d> localVertices; // local copy of vertices ObjectInitFlags flags; }; diff --git a/Core/ViewerBase.cpp b/Core/ViewerBase.cpp index db2e9d6ddbe2976d2f3dce587038004e6a61dd2a..956a0ff4e1eff6177a2584283b07af0342db857d 100644 --- a/Core/ViewerBase.cpp +++ b/Core/ViewerBase.cpp @@ -68,11 +68,11 @@ void ViewerBase::setUnlimitedFPS(bool p_enableFPS) void ViewerBase::initObjects() { - for (size_t i = 0; i < objectList.size(); i++) + for (const auto &i : this->objectList) { - if (objectList[i]->getType() != core::ClassType::Shader) + if (i->getType() != core::ClassType::Shader) { - objectList[i]->initDraw(); + i->initDraw(); } else { @@ -89,9 +89,8 @@ void ViewerBase::initScenes() SceneLocal sceneLocal; scene->initLights(); - scene->copySceneToLocal(sceneLocal); - for (auto sceneObject: sceneLocal.sceneObjects) + for (const auto &sceneObject : scene->getSceneObjects()) { //initialize the custom Render if there is any if ( sceneObject->customRender != nullptr && sceneObject->getType() != core::ClassType::Shader ) @@ -157,23 +156,28 @@ void ViewerBase::processRenderOperation(const RenderOperation &p_rop) } } -void ViewerBase::registerScene(std::shared_ptr<Scene> p_scene, - RenderTargetType p_target, - const std::string &p_fboName) +void ViewerBase::registerScene(std::shared_ptr<Scene> scene, + RenderTargetType target, + const std::string &fboName) { - RenderOperation rop; + if(!scene) + { + std::cerr << "Error: unvalid scene." << std::endl; + return; + } - //sanity checks - assert(p_scene); - if (p_target == SMRENDERTARGET_FBO) + if (target == SMRENDERTARGET_FBO && fboName.length() == 0) { - assert(p_fboName != ""); + std::cerr << "Error: unvalid FBO name." << std::endl; + return; } - rop.target = p_target; - rop.scene = p_scene; + RenderOperation rop; + + rop.target = target; + rop.scene = scene; - rop.fboName = p_fboName; + rop.fboName = fboName; renderOperations.push_back(rop); } diff --git a/Core/ViewerBase.h b/Core/ViewerBase.h index 98f0dc60cc19d9b19a94b342ef569432478c066d..abbbd7fe9e34d6f9d3ef6f117e52cfb0d14ab004 100644 --- a/Core/ViewerBase.h +++ b/Core/ViewerBase.h @@ -58,10 +58,15 @@ enum RenderTargetType struct RenderOperation { RenderOperation(); + RenderOperation(std::shared_ptr<Scene> s, const RenderTargetType &t, const std::string &fbName) : + scene(s), + target(t), + fboName(fbName) + {} std::shared_ptr<Scene> scene; ///< The scene full of objects to render FrameBuffer *fbo; ///< Only required if rendering to FBO, specifies the FBO to render to - std::string fboName; ///< Only required if rendering to FBO, named reference to look up the FBO pointer RenderTargetType target; ///< Specifies where the rendered result should be placed see RenderTargetType + std::string fboName; ///< Only required if rendering to FBO, named reference to look up the FBO pointer }; struct FboListItem @@ -100,6 +105,16 @@ public: float globalAxisLength; + /// \brief for exit viewer + virtual void exitViewer() = 0; + /// \brief add text for display + virtual void addText(std::string p_tag) = 0; + /// \brief update text + virtual void updateText(std::string p_tag, std::string p_string) = 0; + virtual void updateText(int p_handle, std::string p_string) = 0; + /// \brief enable/disable VSync + virtual void setVSync(bool sync) = 0; + virtual int height(void); virtual int width(void); virtual float aspectRatio(void); @@ -109,23 +124,14 @@ public: ViewerBase(); /// \brief initialization for viewer virtual void init() override; - /// \brief for exit viewer - virtual void exitViewer() = 0; /// \brief add object for rendering virtual void addObject(std::shared_ptr<CoreClass> object); - /// \brief add text for display - virtual void addText(std::string p_tag) = 0; - /// \brief update text - virtual void updateText(std::string p_tag, std::string p_string) = 0; - virtual void updateText(int p_handle, std::string p_string) = 0; /// \brief change window resolution virtual void setScreenResolution(int p_width, int p_height); /// \brief set the window title virtual void setWindowTitle(const std::string &str); - /// \brief enable/disable VSync - virtual void setVSync(bool sync) = 0; /// \brief Registers a scene for rendering with the viewer - virtual void registerScene(std::shared_ptr<Scene> p_scene, RenderTargetType p_target, const std::string &p_fboName); + virtual void registerScene(std::shared_ptr<Scene> scene, RenderTargetType target, const std::string &fboName = ""); /// \brief Adds an FBO to the viewer to allow rendering to it. /// /// \detail The FBO will be created an initialized in the viewer. @@ -147,40 +153,41 @@ public: Color defaultSpecularColor; protected: + /// \brief Renders the render operation to screen + virtual void renderToScreen(const RenderOperation &p_rop) = 0; + /// \brief Renders the render operation to an FBO + virtual void renderToFBO(const RenderOperation &p_rop) = 0; /// \brief Initializes rendering system (e.g., OpenGL) capabilities and flags virtual void initRenderingCapabilities() = 0; - /// \brief Initializes the internal objectList - virtual void initObjects(); - /// \brief Initializes FBOs, textures, shaders and VAOs - virtual void initResources() = 0; - /// \brief Initializes scenes in the sceneList - virtual void initScenes(); /// \brief Initilizes the rendering system (e.g., OpenGL) context, and window containing it virtual void initRenderingContext() = 0; /// \brief Cleans up after initGLContext() virtual void destroyRenderingContext() = 0; - /// \brief Cleanup function called on exit to ensure resources are cleaned up - virtual void cleanUp(); - /// \brief Renders the internal sceneList - void renderSceneList(); - /// \brief Processes a render operation - virtual void processRenderOperation(const RenderOperation &p_rop); + /// \brief Initializes FBOs, textures, shaders and VAOs + virtual void initResources() = 0; /// \brief Processes viewerRenderDetail options virtual void processViewerOptions() = 0; /// \brief Process window events and render as the major part of an event loop virtual void processWindowEvents() = 0; - /// \brief Renders the render operation to screen - virtual void renderToScreen(const RenderOperation &p_rop) = 0; - /// \brief Renders the render operation to an FBO - virtual void renderToFBO(const RenderOperation &p_rop) = 0; /// \brief Set the color and other viewer defaults virtual void setToDefaults() = 0; + /// \brief render depth texture for debugging + virtual void renderTextureOnView() = 0; + + /// \brief Initializes the internal objectList + virtual void initObjects(); + /// \brief Initializes scenes in the sceneList + virtual void initScenes(); + /// \brief Cleanup function called on exit to ensure resources are cleaned up + virtual void cleanUp(); + /// \brief Renders the internal sceneList + void renderSceneList(); + /// \brief Processes a render operation + virtual void processRenderOperation(const RenderOperation &p_rop); /// \brief draw routines virtual void render(); /// \brief adjust rendering FPS void adjustFPS(); - /// \brief render depth texture for debugging - virtual void renderTextureOnView() = 0; /// \brief initialize, run the event loop (processWindowEvents) and clean up. virtual void exec(); }; diff --git a/Devices/PhantomInterface.cpp b/Devices/PhantomInterface.cpp index ab2e2a199718b3bc466ea5eb9d3014d3ab6c036d..1ddd0973da32584732c2b93b8e2955f35539d15d 100644 --- a/Devices/PhantomInterface.cpp +++ b/Devices/PhantomInterface.cpp @@ -22,7 +22,7 @@ //--------------------------------------------------------------------------- #include "Devices/PhantomInterface.h" -#include "Rendering/GLRenderer.h" +#include "Rendering/OpenGLRenderer.h" #include "Core/Timer.h" #include <iostream> diff --git a/Examples/AlphaMap/AlphaMappingExample.h b/Examples/AlphaMap/AlphaMappingExample.h index a1dbc6527dfd60bcbd619bc5f4fb6fb13d3eaf80..6955c60c91697801ec5592c77e3c507fd46d9c2d 100644 --- a/Examples/AlphaMap/AlphaMappingExample.h +++ b/Examples/AlphaMap/AlphaMappingExample.h @@ -43,7 +43,7 @@ public: StaticSceneObject *object1; SDK* simmedtkSDK; Scene *scene1; - Viewer *viewer; + OpenGLViewer *viewer; PhantomInterface* hapticInterface; smHapticCameraTrans *motionTrans; diff --git a/Examples/AudioExample/AudioExample.cpp b/Examples/AudioExample/AudioExample.cpp index 0fe50450f358d0081d0fb27a9765241d16e759c9..cd707686c673e554736dd4f3bbaefc4936f93c0f 100644 --- a/Examples/AudioExample/AudioExample.cpp +++ b/Examples/AudioExample/AudioExample.cpp @@ -89,7 +89,7 @@ void AudioKeyboardController::handleEvent(std::shared_ptr<core::Event> event) void runAudioExample() { std::shared_ptr<SDK> sdk; - std::shared_ptr<Viewer> viewer; + std::shared_ptr<OpenGLViewer> viewer; std::shared_ptr<Audio> sound; std::shared_ptr<AudioKeyboardController> audioCtl; @@ -97,7 +97,7 @@ void runAudioExample() sdk = SDK::getInstance(); //Create a viewer to see the scene through - viewer = std::make_shared<Viewer>(); + viewer = std::make_shared<OpenGLViewer>(); sdk->addViewer(viewer); //Create the audio controller diff --git a/Examples/CollisionDetectionBVH/CollisionDetectionBVH.cpp b/Examples/CollisionDetectionBVH/CollisionDetectionBVH.cpp index e39bd22e75caabbaedc3df31bfb465a5dcf054f2..10549ccc7542f9e47c697c7db09de71e80978240 100644 --- a/Examples/CollisionDetectionBVH/CollisionDetectionBVH.cpp +++ b/Examples/CollisionDetectionBVH/CollisionDetectionBVH.cpp @@ -43,7 +43,7 @@ CollisionDetectionBVH::CollisionDetectionBVH() scene = sdk->createScene(); // Create viewer - viewer = std::make_shared<Viewer>(); + viewer = std::make_shared<OpenGLViewer>(); // Add our viewer to the SDK sdk->addViewer(viewer); diff --git a/Examples/CollisionDetectionBVH/CollisionDetectionBVH.h b/Examples/CollisionDetectionBVH/CollisionDetectionBVH.h index 64acfbfd785b7c30c9d162eed371b436fcbbfe53..a42937d4bdbe6f937f27fe63d4c1d32f115380f4 100644 --- a/Examples/CollisionDetectionBVH/CollisionDetectionBVH.h +++ b/Examples/CollisionDetectionBVH/CollisionDetectionBVH.h @@ -39,7 +39,7 @@ #include "Simulators/DummySimulator.h" #include "Collision/MeshCollisionModel.h" #include "Collision/MeshToMeshCollision.h" -#include "Rendering/Viewer.h" +#include "Rendering/OpenGLViewer.h" class CollisionDetectionBVH: public SimulationMain { @@ -56,7 +56,7 @@ public: std::shared_ptr<StaticSceneObject> modelA; std::shared_ptr<StaticSceneObject> modelB; std::shared_ptr<Scene> scene; - std::shared_ptr<Viewer> viewer; + std::shared_ptr<OpenGLViewer> viewer; std::shared_ptr<DummySimulator> defaultSimulator; std::shared_ptr<Simulator> simulator; std::shared_ptr<MeshToMeshCollision> collisionDetection; diff --git a/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.cpp b/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.cpp index c18c50207c5e4d8a6432ac74fbbe8569766782dc..b3e8fe02bd35f93f21a925dba6bebc2aef0fc994 100644 --- a/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.cpp +++ b/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.cpp @@ -42,7 +42,7 @@ CollisionDetectionSpatialHashing::CollisionDetectionSpatialHashing() scene = sdk->createScene(); // Create viewer - viewer = std::make_shared<Viewer>(); + viewer = std::make_shared<OpenGLViewer>(); // Add our viewer to the SDK sdk->addViewer(viewer); diff --git a/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.h b/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.h index 377cf405b6ea0b50a885f687b0b243ae78339d69..1e93016b893fed9d2ccd3b8de53d5c251e35e930 100644 --- a/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.h +++ b/Examples/CollisionDetectionSpatialHashing/CollisionDetectionSpatialHashing.h @@ -38,7 +38,7 @@ #include "Core/SceneObject.h" #include "Simulators/DummySimulator.h" #include "Collision/SpatialHashCollision.h" -#include "Rendering/Viewer.h" +#include "Rendering/OpenGLViewer.h" class CollisionDetectionSpatialHashing: public SimulationMain { @@ -56,7 +56,7 @@ public: std::shared_ptr<StaticSceneObject> modelA; std::shared_ptr<StaticSceneObject> modelB; std::shared_ptr<Scene> scene; - std::shared_ptr<Viewer> viewer; + std::shared_ptr<OpenGLViewer> viewer; std::shared_ptr<DummySimulator> defaultSimulator; std::shared_ptr<Simulator> simulator; std::shared_ptr<SpatialHashCollision> spatialHashing; diff --git a/Examples/MultipleObjects/MultipleObjects.h b/Examples/MultipleObjects/MultipleObjects.h index 5769334c23612d6a3cbf19301fe17eddd6c4654a..db5c9c582d208c2a13db4c10ad09399370ca1675 100644 --- a/Examples/MultipleObjects/MultipleObjects.h +++ b/Examples/MultipleObjects/MultipleObjects.h @@ -29,6 +29,6 @@ #include "Core/ErrorLog.h" #include "Core/CoreClass.h" #include "Core/SDK.h" -#include "Rendering/Viewer.h" +#include "Rendering/OpenGLViewer.h" #endif \ No newline at end of file diff --git a/Examples/renderCube/main.cpp b/Examples/renderCube/main.cpp index 5720501e04db6bc4819687c189d1a768f87f9ecc..7a883b837e8e7b7e9203382640862a5d133fda6b 100644 --- a/Examples/renderCube/main.cpp +++ b/Examples/renderCube/main.cpp @@ -36,7 +36,7 @@ int main() { SIMMEDTK_REGISTER_RENDER_DELEGATES(); std::shared_ptr<SDK> sdk; - std::shared_ptr<Viewer> viewer; + std::shared_ptr<OpenGLViewer> viewer; std::shared_ptr<Scene> scene1; std::shared_ptr<Light> light; std::shared_ptr<Camera> sceneCamera; @@ -51,7 +51,7 @@ int main() scene1 = sdk->createScene(); //Create a viewer to see the scene through - viewer = std::make_shared<Viewer>(); + viewer = std::make_shared<OpenGLViewer>(); sdk->addViewer(viewer); //Create the camera controller diff --git a/Examples/renderCubeToTexture/main.cpp b/Examples/renderCubeToTexture/main.cpp index c8938c5c0417c287911fe42aa4f73ac1c79e770e..463a7207f3e68bdf808643b13ebe6958f6a18947 100644 --- a/Examples/renderCubeToTexture/main.cpp +++ b/Examples/renderCubeToTexture/main.cpp @@ -33,7 +33,7 @@ int main() { std::shared_ptr<SDK> sdk; - std::shared_ptr<Viewer> viewer; + std::shared_ptr<OpenGLViewer> viewer; std::shared_ptr<Scene> scene1, scene2; std::shared_ptr<Light> light1, light2; std::shared_ptr<Camera> sceneCamera1, sceneCamera2; @@ -49,7 +49,7 @@ int main() scene2 = sdk->createScene(); //external scene containing square with scene1 mapped to it //Create a viewer to see the scene through - viewer = std::make_shared<Viewer>(); + viewer = std::make_shared<OpenGLViewer>(); sdk->addViewer(viewer); //Create the camera controller diff --git a/Examples/vegaFem/main.cpp b/Examples/vegaFem/main.cpp index f97380e10ab8acd0c3b952c18b0ce5f7103227dc..d218624eb9c068ac127794423ffe79b163246606 100644 --- a/Examples/vegaFem/main.cpp +++ b/Examples/vegaFem/main.cpp @@ -26,7 +26,7 @@ #include "Core/ErrorLog.h" #include "Core/CoreClass.h" #include "Core/SDK.h" -#include "Rendering/Viewer.h" +#include "Rendering/OpenGLViewer.h" #include "Core/SceneObject.h" // Include required types scene objects @@ -60,7 +60,7 @@ int main() std::shared_ptr<VegaFemSimulator> femSimulator; std::shared_ptr<DummySimulator> staticSimulator; std::shared_ptr<PlaneCollisionModel> plane; - std::shared_ptr<Viewer> viewer; + std::shared_ptr<OpenGLViewer> viewer; std::shared_ptr<Scene> scene; std::shared_ptr<Light> light; std::shared_ptr<Camera> sceneCamera; @@ -161,7 +161,7 @@ int main() //------------------------------------------------------- // Customize the viewer //------------------------------------------------------- - viewer = std::dynamic_pointer_cast<Viewer>(sdk->getViewerInstance()); + viewer = std::dynamic_pointer_cast<OpenGLViewer>(sdk->getViewerInstance()); viewer->viewerRenderDetail = viewer->viewerRenderDetail | SIMMEDTK_VIEWERRENDER_FADEBACKGROUND | diff --git a/Geometry/MeshModel.cpp b/Geometry/MeshModel.cpp index 62006068023b7607682fe916be1d932b87d90e73..c947dc0f4782a13e0126531b0ff9002cb9e69b67 100644 --- a/Geometry/MeshModel.cpp +++ b/Geometry/MeshModel.cpp @@ -71,7 +71,7 @@ std::array<core::Vec3d,3> MeshModel::getTrianglePositions(size_t i) const return vertices; } -const core::StdVector3d& MeshModel::getVertices() const +const std::vector<core::Vec3d>& MeshModel::getVertices() const { return mesh->getVertices(); } diff --git a/Geometry/MeshModel.h b/Geometry/MeshModel.h index 256e73599f576af5d7d75f388401522348abd4fc..1f718f27b16c0b8f43cfc427b7a1d5301e192fda 100644 --- a/Geometry/MeshModel.h +++ b/Geometry/MeshModel.h @@ -80,7 +80,7 @@ public: /// /// @brief Returns array of vertices /// - const core::StdVector3d &getVertices() const; + const std::vector<core::Vec3d> &getVertices() const; /// /// @brief Draw this mesh diff --git a/Geometry/UnitTests/MeshModelSpec.cpp b/Geometry/UnitTests/MeshModelSpec.cpp index 0a358c4194f23f340ebb4e6410c694a820c8463d..f09a0992586da0cbd0b76dd9ed01b864526c1d15 100644 --- a/Geometry/UnitTests/MeshModelSpec.cpp +++ b/Geometry/UnitTests/MeshModelSpec.cpp @@ -28,7 +28,7 @@ using namespace bandit; -std::shared_ptr<MeshModel> getModel(const core::StdVector3d &vertices) +std::shared_ptr<MeshModel> getModel(const std::vector<core::Vec3d> &vertices) { std::shared_ptr<MeshModel> model = std::make_shared<MeshModel>(); std::shared_ptr<Mesh> mesh = std::make_shared<SurfaceMesh>(); @@ -61,7 +61,7 @@ go_bandit([](){ }); it("can access mesh vertices", []() { - core::StdVector3d vertices; + std::vector<core::Vec3d> vertices; vertices.emplace_back(1.0,2.0,0); vertices.emplace_back(2.0,3.0,0); vertices.emplace_back(2.0,1.0,0); @@ -75,7 +75,7 @@ go_bandit([](){ }); it("can access mesh face normals", []() { - core::StdVector3d vertices; + std::vector<core::Vec3d> vertices; vertices.emplace_back(1.0,2.0,0); vertices.emplace_back(2.0,3.0,0); vertices.emplace_back(2.0,1.0,0); diff --git a/Mesh/Mesh.cpp b/Mesh/Mesh.cpp index f4234d7a2fdb71f7d8d678bfbda5acf556e84dba..97a013d92b7207d9ff691ca11862cb1870f7ccc6 100644 --- a/Mesh/Mesh.cpp +++ b/Mesh/Mesh.cpp @@ -29,9 +29,10 @@ #include "objMesh.h" // SimMedTK includes -#include "Rendering/GLRenderer.h" -#include "Rendering/Viewer.h" #include "Core/Factory.h" +#include "Rendering/OpenGLRenderer.h" +#include "Rendering/TextureManager.h" +#include "Rendering/OpenGLViewer.h" BaseMesh::BaseMesh() { diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h index 3fa4b1f6e957576db9129546f0f9d0274dcfc1e0..3a9ca5bcd2d587a7f2d88e696df4e1c48e18d87e 100644 --- a/Mesh/Mesh.h +++ b/Mesh/Mesh.h @@ -48,9 +48,6 @@ struct Tetrahedra; struct Edge; - -class Shader; - /// \brief !! struct TextureAttachment { @@ -95,7 +92,12 @@ public: /// \brief update the original texture vertices with the current void updateOriginalVertsWithCurrent(); - const core::StdVector3d &getVertices() const + const std::vector<core::Vec3d> &getVertices() const + { + return this->vertices; + } + + std::vector<core::Vec3d> &getVertices() { return this->vertices; } @@ -109,8 +111,8 @@ public: CollisionGroup collisionGroup; ///< !! GLint renderingID; ///< !! std::shared_ptr<ErrorLog> log; ///< record the log - core::StdVector3d vertices; ///< vertices co-ordinate data at time t - core::StdVector3d origVerts; ///< vertices co-ordinate data at time t=0 + std::vector<core::Vec3d> vertices; ///< vertices co-ordinate data at time t + std::vector<core::Vec3d> origVerts; ///< vertices co-ordinate data at time t=0 int nbrVertices; ///< number of vertices AABB aabb; ///< Axis aligned bounding box bool isTextureCoordAvailable; ///< true if the texture co-ordinate is available diff --git a/Mesh/VegaVolumetricMesh.cpp b/Mesh/VegaVolumetricMesh.cpp index eddd762ee245ca9b13979ff11547495a264e8189..b9569ceb0bea1082e606ebadb23fef3b3600ee39 100644 --- a/Mesh/VegaVolumetricMesh.cpp +++ b/Mesh/VegaVolumetricMesh.cpp @@ -67,7 +67,7 @@ size_t VegaVolumetricMesh::getNumberOfElements() const } void VegaVolumetricMesh::attachSurfaceMesh(std::shared_ptr<SurfaceMesh> surfaceMesh, const double &radius) { - const core::StdVector3d &meshVertices = surfaceMesh->getVertices(); + const std::vector<core::Vec3d> &meshVertices = surfaceMesh->getVertices(); int numElementVertices = this->mesh->getNumElementVertices(); size_t surfaceMeshSize = meshVertices.size(); diff --git a/Mesh/VolumeMesh.h b/Mesh/VolumeMesh.h index dce21b47389aa3828289a1cdd6cc89d7772f370a..f28be24dd897dd8b451cd434d205be19898680fd 100644 --- a/Mesh/VolumeMesh.h +++ b/Mesh/VolumeMesh.h @@ -86,7 +86,7 @@ public: int nbrTetra; ///< number of tetrahedra int nbrNodes; ///< total number of nodes of the volume mesh std::shared_ptr<ErrorLog> log_VM; ///< log the errors with volume mesh class - core::StdVector3d nodes; ///< data of nodal co-ordinates + std::vector<core::Vec3d> nodes; ///< data of nodal co-ordinates std::vector<Tetrahedra> tetra; ///< tetrahedra data std::vector<int> surfaceNodeIndex; ///< std::vector<bool> fixed; ///< indicates if the node is fixed or not diff --git a/RenderDelegates/MeshRenderDelegate.cpp b/RenderDelegates/MeshRenderDelegate.cpp index 18497a87784df3e69e63ca6fecfb137233a021a4..b47090017f0ba8f1488f1a77ed51703038a7b6a0 100644 --- a/RenderDelegates/MeshRenderDelegate.cpp +++ b/RenderDelegates/MeshRenderDelegate.cpp @@ -40,11 +40,11 @@ void MeshRenderDelegate::draw() const return; auto mesh = std::dynamic_pointer_cast<Mesh>(geom->shared_from_this()); - GLRenderer::drawSurfaceMeshTriangles(mesh, geom->getRenderDetail()); + OpenGLRenderer::drawSurfaceMeshTriangles(mesh, geom->getRenderDetail()); if (geom->getRenderDetail()->renderType & SIMMEDTK_RENDER_NORMALS) { - GLRenderer::drawNormals(mesh, + OpenGLRenderer::drawNormals(mesh, geom->getRenderDetail()->normalColor, geom->getRenderDetail()->normalLength); } diff --git a/RenderDelegates/PlaneRenderDelegate.cpp b/RenderDelegates/PlaneRenderDelegate.cpp index e6dbdfda39bc7ef462b2f973f9e2c6d8958a72cf..b03a855b1902b0e71862cff5e6eefe7ac3144b27 100644 --- a/RenderDelegates/PlaneRenderDelegate.cpp +++ b/RenderDelegates/PlaneRenderDelegate.cpp @@ -33,7 +33,7 @@ public: void PlaneRenderDelegate::draw() const { - GLRenderer::draw(*this->getSourceGeometryAs<Plane>()); + OpenGLRenderer::draw(*this->getSourceGeometryAs<Plane>()); // if (this->movedOrRotated) // { // updateDrawPoints(); diff --git a/Rendering/CMakeLists.txt b/Rendering/CMakeLists.txt index 477dfde0902d49e96b37789c4ae9f4e4307f7c24..3d28a8a042c5c5428ef7c02d70b2ad54afddd4e2 100644 --- a/Rendering/CMakeLists.txt +++ b/Rendering/CMakeLists.txt @@ -5,18 +5,18 @@ simmedtk_add_library(Rendering FrameBuffer.cpp GLUtils.cpp MetalShader.cpp - GLRenderer.cpp + OpenGLRenderer.cpp Shader.cpp SceneTextureShader.cpp TextureManager.cpp VAO.cpp VBO.cpp - Viewer.cpp + OpenGLViewer.cpp PUBLIC_HEADERS ConfigRendering.h CustomRenderer.h FrameBuffer.h - GLRenderer.h + OpenGLRenderer.h GLUtils.h MetalShader.h SceneTextureShader.h @@ -24,7 +24,7 @@ simmedtk_add_library(Rendering TextureManager.h VAO.h VBO.h - Viewer.h + OpenGLViewer.h ) target_link_libraries(Rendering diff --git a/Rendering/FrameBuffer.cpp b/Rendering/FrameBuffer.cpp index a98a6fc18f09aa3b5190ffcee7f38a143cdd2840..c2dfbf1422c38b214e633a00bd2968663b8a68c1 100644 --- a/Rendering/FrameBuffer.cpp +++ b/Rendering/FrameBuffer.cpp @@ -26,7 +26,7 @@ #include <string.h> #include "Core/Config.h" #include "Rendering/TextureManager.h" -#include "Rendering/GLRenderer.h" +#include "Rendering/OpenGLRenderer.h" bool FrameBuffer::checkStatus() { diff --git a/Rendering/MetalShader.cpp b/Rendering/MetalShader.cpp index d9f7e781ad9a029b5c7d7666162e9f0edbe3bf8b..06ecfe41ad17133bc01e32c67c937eb28104f52b 100644 --- a/Rendering/MetalShader.cpp +++ b/Rendering/MetalShader.cpp @@ -23,6 +23,8 @@ // SimMedTK includes #include "Rendering/MetalShader.h" + +#include "Rendering/TextureManager.h" #include "Core/Event.h" #include "Core/SDK.h" #include "Event/KeyboardEvent.h" diff --git a/Rendering/OculusViewer.cpp b/Rendering/OculusViewer.cpp index 4b856ae18b3b92c3079c4a5fbf52d8a50c7300dd..f74be02fd9065c9c36f92006353b44af531a57ce 100644 --- a/Rendering/OculusViewer.cpp +++ b/Rendering/OculusViewer.cpp @@ -24,7 +24,7 @@ #include <iostream> #include "Rendering/OculusViewer.h" -#include "Rendering/GLRenderer.h" +#include "Rendering/OpenGLRenderer.h" #include "Core/Quaternion.h" #ifdef _WIN32 || WIN32 @@ -56,7 +56,7 @@ static unsigned int next_pow2(unsigned int x) return x + 1; } -OculusViewer::OculusViewer() : Viewer() +OculusViewer::OculusViewer() : OpenGLViewer() { hmd = nullptr; fbWidth = 0; @@ -196,7 +196,7 @@ void OculusViewer::renderToScreen(const RenderOperation &p_rop) view = trans * view; //Render Scene - GLRenderer::renderScene(p_rop.scene, proj, view); + OpenGLRenderer::renderScene(p_rop.scene, proj, view); } //after drawing both eyes into the texture render target, revert to // drawing directly to the display, and we call ovrHmd_EndFrame, to let the diff --git a/Rendering/OculusViewer.h b/Rendering/OculusViewer.h index c9a3900b22789c7cfe7e16997985dd2649681a3f..b4a2c15b1ed3692330a640e3c6cb01d4af62696d 100644 --- a/Rendering/OculusViewer.h +++ b/Rendering/OculusViewer.h @@ -25,14 +25,14 @@ #define SMOCULUSVIEWER_H // SimMedTK includes -#include "Rendering/Viewer.h" +#include "Rendering/OpenGLViewer.h" // OculusSDK includes #include <OVR_CAPI_GL.h> /// \brief This viewer class allows content to be rendered to an Oculus Rift /// -class OculusViewer : public Viewer +class OculusViewer : public OpenGLViewer { public: OculusViewer(); diff --git a/Rendering/GLRenderer.cpp b/Rendering/OpenGLRenderer.cpp similarity index 94% rename from Rendering/GLRenderer.cpp rename to Rendering/OpenGLRenderer.cpp index 63d842a4256cbb6266032290851ef88cab9e760f..18fc86b370cb7cd27d0ca838848a986a76f6459a 100644 --- a/Rendering/GLRenderer.cpp +++ b/Rendering/OpenGLRenderer.cpp @@ -21,24 +21,25 @@ // Contact: //--------------------------------------------------------------------------- -#include "Rendering/GLRenderer.h" +#include "Rendering/OpenGLRenderer.h" #include "Mesh/Mesh.h" #include "Core/DataStructures.h" -#include "Rendering/Viewer.h" +#include "Rendering/OpenGLViewer.h" #include "Core/Quaternion.h" #include "Rendering/VAO.h" +#include "Rendering/TextureManager.h" #ifndef _MSC_VER # pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif -GLRenderer::GLRenderer() +OpenGLRenderer::OpenGLRenderer() { } #if 0 -void GLRenderer::drawLineMesh(std::shared_ptr<LineMesh> p_lineMesh, std::shared_ptr<RenderDetail> renderDetail) +void OpenGLRenderer::drawLineMesh(std::shared_ptr<LineMesh> p_lineMesh, std::shared_ptr<RenderDetail> renderDetail) { static core::Vec3d origin(0, 0, 0); static core::Vec3d xAxis(1, 0, 0); @@ -173,7 +174,7 @@ void GLRenderer::drawLineMesh(std::shared_ptr<LineMesh> p_lineMesh, std::shared_ } #endif // 0 -void GLRenderer::drawSurfaceMeshTriangles( +void OpenGLRenderer::drawSurfaceMeshTriangles( std::shared_ptr<Mesh> p_surfaceMesh, std::shared_ptr<RenderDetail> renderDetail) { @@ -301,7 +302,7 @@ void GLRenderer::drawSurfaceMeshTriangles( glLineWidth(1.0); } -void GLRenderer::drawNormals(std::shared_ptr<Mesh> p_mesh, Color p_color, float length) +void OpenGLRenderer::drawNormals(std::shared_ptr<Mesh> p_mesh, Color p_color, float length) { glDisable(GL_LIGHTING); @@ -332,13 +333,13 @@ void GLRenderer::drawNormals(std::shared_ptr<Mesh> p_mesh, Color p_color, float glEnable(GL_LIGHTING); } -void GLRenderer::beginTriangles() +void OpenGLRenderer::beginTriangles() { glBegin(GL_TRIANGLES); } -void GLRenderer::drawTriangle(core::Vec3d &p_1, core::Vec3d &p_2, core::Vec3d &p_3) +void OpenGLRenderer::drawTriangle(core::Vec3d &p_1, core::Vec3d &p_2, core::Vec3d &p_3) { glVertex3dv(p_1.data()); @@ -346,13 +347,13 @@ void GLRenderer::drawTriangle(core::Vec3d &p_1, core::Vec3d &p_2, core::Vec3d &p glVertex3dv(p_3.data()); } -void GLRenderer::endTriangles() +void OpenGLRenderer::endTriangles() { glEnd(); } -void GLRenderer::draw(AABB &aabb, Color p_color) +void OpenGLRenderer::draw(AABB &aabb, Color p_color) { glPushAttrib(GL_LIGHTING_BIT); @@ -404,7 +405,7 @@ void GLRenderer::draw(AABB &aabb, Color p_color) glPopAttrib(); } -void GLRenderer::drawArrow(const core::Vec3f &start, const core::Vec3f &end, const float D) +void OpenGLRenderer::drawArrow(const core::Vec3f &start, const core::Vec3f &end, const float D) { float x = end[0] - start[0]; float y = end[1] - start[1]; @@ -457,7 +458,7 @@ void GLRenderer::drawArrow(const core::Vec3f &start, const core::Vec3f &end, con } -void GLRenderer::drawAxes(const float length) +void OpenGLRenderer::drawAxes(const float length) { glDisable(GL_LIGHTING); @@ -483,7 +484,7 @@ void GLRenderer::drawAxes(const float length) glEnable(GL_LIGHTING); } -void GLRenderer::drawAxes(const Matrix33f &rotMat, const core::Vec3f &pos, const float length) +void OpenGLRenderer::drawAxes(const Matrix33f &rotMat, const core::Vec3f &pos, const float length) { glDisable(GL_LIGHTING); @@ -513,7 +514,7 @@ void GLRenderer::drawAxes(const Matrix33f &rotMat, const core::Vec3f &pos, const glEnable(GL_LIGHTING); } -void GLRenderer::draw(Plane &p_plane, float p_scale, Color p_color) +void OpenGLRenderer::draw(Plane &p_plane, float p_scale, Color p_color) { double angle; @@ -549,7 +550,7 @@ void GLRenderer::draw(Plane &p_plane, float p_scale, Color p_color) glEnable(GL_LIGHTING); } -void GLRenderer::renderScene(std::shared_ptr<Scene> p_scene) +void OpenGLRenderer::renderScene(std::shared_ptr<Scene> p_scene) { assert(p_scene); @@ -559,7 +560,7 @@ void GLRenderer::renderScene(std::shared_ptr<Scene> p_scene) renderScene(p_scene, proj, view); } -void GLRenderer::renderScene(std::shared_ptr<Scene> p_scene, +void OpenGLRenderer::renderScene(std::shared_ptr<Scene> p_scene, const Matrix44f &p_proj, const Matrix44f &p_view) { @@ -595,7 +596,7 @@ void GLRenderer::renderScene(std::shared_ptr<Scene> p_scene, glPopMatrix(); } -void GLRenderer::renderSceneObject(std::shared_ptr<SceneObject> p_sceneObject) +void OpenGLRenderer::renderSceneObject(std::shared_ptr<SceneObject> p_sceneObject) { RenderDetail::Ptr detail = p_sceneObject->getRenderDetail(); if (!detail || detail->getRenderType() & SIMMEDTK_RENDER_NONE) diff --git a/Rendering/GLRenderer.h b/Rendering/OpenGLRenderer.h similarity index 94% rename from Rendering/GLRenderer.h rename to Rendering/OpenGLRenderer.h index 307466be302946d5158e786a36bdc1335b1e7d82..fc425d4d4e59c9e23fe6f8eb43bd1cf9a8bead47 100644 --- a/Rendering/GLRenderer.h +++ b/Rendering/OpenGLRenderer.h @@ -36,17 +36,17 @@ class Mesh; class AABB; class LineMesh; -class Viewer; +class OpenGLViewer; class Plane; class Scene; struct RenderDetail; /// \brief gl rendering utilities -class GLRenderer: public CoreClass +class OpenGLRenderer: public CoreClass { public: /// \brief constructor - GLRenderer(); + OpenGLRenderer(); /// \brief draws surface mesh with given rendertdail and draw paramters static void drawSurfaceMeshTriangles(std::shared_ptr<Mesh> p_surfaceMesh, std::shared_ptr<RenderDetail> renderDetail); @@ -58,7 +58,7 @@ public: static void drawLineMesh(std::shared_ptr<LineMesh> p_lineMesh, std::shared_ptr<RenderDetail> renderDetail); /// \brief draw coordinate system - static void drawCoordSystem(std::shared_ptr<Viewer> viewer, std::string p_name, core::Vec3d p_pos, core::Vec3d dirX, core::Vec3d dirY, core::Vec3d dirZ); + static void drawCoordSystem(std::shared_ptr<OpenGLViewer> viewer, std::string p_name, core::Vec3d p_pos, core::Vec3d dirX, core::Vec3d dirY, core::Vec3d dirZ); /// \brief begin rendering triangle static void beginTriangles(); diff --git a/Rendering/Viewer.cpp b/Rendering/OpenGLViewer.cpp similarity index 85% rename from Rendering/Viewer.cpp rename to Rendering/OpenGLViewer.cpp index b5a06bd6e3ff0edbc1cdd405350361710292c723..13ac00571f3e45188996ec45ec8e94a0ee1c5a9e 100644 --- a/Rendering/Viewer.cpp +++ b/Rendering/OpenGLViewer.cpp @@ -21,50 +21,49 @@ // Contact: //--------------------------------------------------------------------------- -#include "Rendering/Viewer.h" -#include "Core/IOStream.h" -#include "Rendering/GLRenderer.h" -#include "Rendering/Shader.h" -#include "Core/DataStructures.h" -#include "Rendering/VBO.h" -#include "Rendering/VAO.h" -#include "External/tree.hh" +#include "Rendering/OpenGLViewer.h" #include "Core/EventHandler.h" +#include "Core/IOStream.h" #include "Event/KeyboardEvent.h" +#include "Event/KeySFMLInterface.h" #include "Event/MouseButtonEvent.h" #include "Event/MouseMoveEvent.h" -#include "Event/KeySFMLInterface.h" - +#include "Rendering/OpenGLRenderer.h" +#include "Rendering/Shader.h" +#include "Rendering/VAO.h" +#include "Rendering/VBO.h" +#include "Rendering/TextureManager.h" +#include "Rendering/FrameBuffer.h" #ifdef __linux__ -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <GL/glxew.h> -#include <GL/glxext.h> -#include <GL/glx.h> +# include <X11/Xlib.h> +# include <X11/Xutil.h> +# include <GL/glxew.h> +# include <GL/glxext.h> +# include <GL/glx.h> #endif #ifdef _WIN32 typedef bool (APIENTRY *PFNWGLSWAPINTERVALFARPROC)(int); #endif -void Viewer::setVSync(bool sync) +void OpenGLViewer::setVSync(bool sync) { this->sfmlWindow->setVerticalSyncEnabled(sync); } -Viewer::Viewer() +OpenGLViewer::OpenGLViewer() { this->windowOutput = std::make_shared<OpenGLWindowStream>(); } -void Viewer::exitViewer() +void OpenGLViewer::exitViewer() { } /// \brief Initializes OpenGL capabilities and flags -void Viewer::initRenderingCapabilities() +void OpenGLViewer::initRenderingCapabilities() { //use multiple fragment samples in computing the final color of a pixel glEnable(GL_MULTISAMPLE); @@ -98,7 +97,7 @@ void Viewer::initRenderingCapabilities() } /// \brief Initializes FBOs, textures, shaders and VAOs -void Viewer::initResources() +void OpenGLViewer::initResources() { TextureManager::initGLTextures(); Shader::initGLShaders(); @@ -108,7 +107,7 @@ void Viewer::initResources() } /// \brief Initializes the OpenGL context, and window containing it -void Viewer::initRenderingContext() +void OpenGLViewer::initRenderingContext() { // Init OpenGL context @@ -139,13 +138,13 @@ void Viewer::initRenderingContext() } /// \brief Cleans up after initGLContext() -void Viewer::destroyRenderingContext() +void OpenGLViewer::destroyRenderingContext() { //nothing to do } /// \brief render depth texture for debugging -void Viewer::renderTextureOnView() +void OpenGLViewer::renderTextureOnView() { glPushAttrib(GL_TEXTURE_BIT | GL_VIEWPORT_BIT | GL_LIGHTING_BIT); @@ -184,7 +183,7 @@ void Viewer::renderTextureOnView() /// \param p_depthTex A texture that will contain the fbo's depth texture. /// \param p_width The width of the fbo /// \param p_height The height of the fbo -void Viewer::addFBO(const std::string &p_fboName, +void OpenGLViewer::addFBO(const std::string &p_fboName, Texture *p_colorTex, Texture *p_depthTex, unsigned int p_width, unsigned int p_height) @@ -207,7 +206,7 @@ void Viewer::addFBO(const std::string &p_fboName, } /// \brief Initializes the FBOs in the FBO list -void Viewer::initFboListItems() +void OpenGLViewer::initFboListItems() { for (size_t i = 0; i < this->fboListItems.size(); i++) { @@ -234,7 +233,7 @@ void Viewer::initFboListItems() } /// \brief Destroys all the FBOs in the FBO list -void Viewer::destroyFboListItems() +void OpenGLViewer::destroyFboListItems() { for (size_t i = 0; i < this->fboListItems.size(); i++) { @@ -247,7 +246,7 @@ void Viewer::destroyFboListItems() } /// \brief Processes viewerRenderDetail options -void Viewer::processViewerOptions() +void OpenGLViewer::processViewerOptions() { if (viewerRenderDetail & SIMMEDTK_VIEWERRENDER_FADEBACKGROUND) { @@ -256,7 +255,7 @@ void Viewer::processViewerOptions() } ///\brief Render and then process window events until the event queue is empty. -void Viewer::processWindowEvents() +void OpenGLViewer::processWindowEvents() { sf::Event event; this->render(); @@ -265,7 +264,7 @@ void Viewer::processWindowEvents() } /// \brief Renders the render operation to an FBO -void Viewer::renderToFBO(const RenderOperation &p_rop) +void OpenGLViewer::renderToFBO(const RenderOperation &p_rop) { assert(p_rop.fbo); //Enable FBO for rendering @@ -276,13 +275,13 @@ void Viewer::renderToFBO(const RenderOperation &p_rop) processViewerOptions(); //Render Scene - GLRenderer::renderScene(p_rop.scene); + OpenGLRenderer::renderScene(p_rop.scene); //Disable FBO p_rop.fbo->disable(); } /// \brief Renders the render operation to screen -void Viewer::renderToScreen(const RenderOperation &p_rop) +void OpenGLViewer::renderToScreen(const RenderOperation &p_rop) { //Setup Viewport & Clear buffers glViewport(0, 0, this->width(), this->height()); @@ -290,7 +289,7 @@ void Viewer::renderToScreen(const RenderOperation &p_rop) processViewerOptions(); //Render Scene - GLRenderer::renderScene(p_rop.scene); + OpenGLRenderer::renderScene(p_rop.scene); //Render axis if (viewerRenderDetail & SIMMEDTK_VIEWERRENDER_GLOBAL_AXIS) @@ -309,7 +308,7 @@ void Viewer::renderToScreen(const RenderOperation &p_rop) p_rop.scene->enableLights(); p_rop.scene->placeLights(); - GLRenderer::drawAxes(this->globalAxisLength); + OpenGLRenderer::drawAxes(this->globalAxisLength); p_rop.scene->disableLights(); @@ -321,30 +320,8 @@ void Viewer::renderToScreen(const RenderOperation &p_rop) } } -/// \brief Registers a scene for rendering with the viewer -void Viewer::registerScene(std::shared_ptr<Scene> p_scene, - RenderTargetType p_target, - const std::string &p_fboName) -{ - RenderOperation rop; - - //sanity checks - assert(p_scene); - if (p_target == SMRENDERTARGET_FBO) - { - assert(p_fboName != ""); - } - - rop.target = p_target; - rop.scene = p_scene; - - rop.fboName = p_fboName; - - renderOperations.push_back(rop); -} - /// \brief Set the color and other viewer defaults -void Viewer::setToDefaults() +void OpenGLViewer::setToDefaults() { glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, defaultDiffuseColor.toGLColor()); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, defaultSpecularColor.toGLColor()); @@ -353,7 +330,7 @@ void Viewer::setToDefaults() } /// \brief Called at the beginning of each frame by the module -void Viewer::beginFrame() +void OpenGLViewer::beginFrame() { if (terminateExecution == true) { @@ -364,12 +341,12 @@ void Viewer::beginFrame() } ///\brief Called at the end of each frame by the module -void Viewer::endFrame() +void OpenGLViewer::endFrame() { this->sfmlWindow->display(); //swaps buffers } -void Viewer::processSFMLEvents(const sf::Event& p_event) +void OpenGLViewer::processSFMLEvents(const sf::Event& p_event) { switch(p_event.type) { @@ -428,41 +405,41 @@ void Viewer::processSFMLEvents(const sf::Event& p_event) } } -void Viewer::addObject(std::shared_ptr<CoreClass> object) +void OpenGLViewer::addObject(std::shared_ptr<CoreClass> object) { SDK::getInstance()->addRef(object); objectList.push_back(object); } -void Viewer::handleEvent(std::shared_ptr<core::Event> /*p_event*/ ) +void OpenGLViewer::handleEvent(std::shared_ptr<core::Event> /*p_event*/ ) { } -void Viewer::addText(std::string p_tag) +void OpenGLViewer::addText(std::string p_tag) { windowOutput->addText(p_tag, std::string("")); } -void Viewer::updateText(std::string p_tag, std::string p_string) +void OpenGLViewer::updateText(std::string p_tag, std::string p_string) { windowOutput->updateText(p_tag, p_string); } -void Viewer::updateText(int p_handle, std::string p_string) +void OpenGLViewer::updateText(int p_handle, std::string p_string) { windowOutput->updateText(p_handle, p_string); } -void Viewer::setWindowTitle(const std::string &str) +void OpenGLViewer::setWindowTitle(const std::string &str) { windowTitle = str; } -void Viewer::cleanUp() +void OpenGLViewer::cleanUp() { destroyFboListItems(); destroyRenderingContext(); @@ -473,6 +450,7 @@ void Viewer::cleanUp() SIMMEDTK_BEGIN_DYNAMIC_LOADER() SIMMEDTK_BEGIN_ONLOAD(register_rendering_viewer) - SIMMEDTK_REGISTER_CLASS(CoreClass,ViewerBase,Viewer,100); + SIMMEDTK_REGISTER_CLASS(CoreClass,ViewerBase,OpenGLViewer,100); SIMMEDTK_FINISH_ONLOAD() +OpenGLViewer::~OpenGLViewer() {} SIMMEDTK_FINISH_DYNAMIC_LOADER() diff --git a/Rendering/Viewer.h b/Rendering/OpenGLViewer.h similarity index 85% rename from Rendering/Viewer.h rename to Rendering/OpenGLViewer.h index f9e878638fb638067be83e836908598e037602f0..1885fc7cd97e76a0f71cf96e438fbaa61f90b333 100644 --- a/Rendering/Viewer.h +++ b/Rendering/OpenGLViewer.h @@ -29,29 +29,18 @@ // SimMedTK includes #include "Core/ViewerBase.h" -#include "Rendering/Shader.h" -#include "Rendering/GLUtils.h" -#include "Rendering/VBO.h" -#include "Simulators/PBDSceneObject.h" -#include "Core/DataStructures.h" -#include "Simulators/StylusObject.h" -#include "Rendering/FrameBuffer.h" -#include "Rendering/Camera.h" //forward declaration class OpenGLWindowStream; /// \brief Handles all rendering routines. -class Viewer : public ViewerBase +class OpenGLViewer : public ViewerBase { public: - std::unique_ptr<sf::Context> sfmlContext; - std::unique_ptr<sf::Window> sfmlWindow; - - std::shared_ptr<OpenGLWindowStream> windowOutput; - /// \brief default constructor - Viewer(); + OpenGLViewer(); + ~OpenGLViewer(); + /// \brief for exit viewer virtual void exitViewer() override; /// \brief add object for rendering @@ -67,15 +56,11 @@ public: void setWindowTitle(const std::string &str); /// \brief enable/disable VSync virtual void setVSync(bool sync) override; - virtual void registerScene(std::shared_ptr<Scene> p_scene, RenderTargetType p_target, const std::string &p_fboName); virtual void addFBO(const std::string &p_fboName, - Texture *p_colorTex, Texture *p_depthTex, - unsigned int p_width, unsigned int p_height); - - std::string windowTitle; - Color defaultDiffuseColor; - Color defaultAmbientColor; - Color defaultSpecularColor; + Texture *p_colorTex, + Texture *p_depthTex, + unsigned int p_width, + unsigned int p_height); protected: virtual void initRenderingCapabilities() override; @@ -91,8 +76,6 @@ protected: virtual void processWindowEvents() override; virtual void renderToScreen(const RenderOperation &p_rop) override; virtual void renderToFBO(const RenderOperation &p_rop) override; - virtual void initFboListItems(); - virtual void destroyFboListItems(); virtual void setToDefaults() override; virtual void beginFrame() override; virtual void endFrame() override; @@ -100,7 +83,18 @@ protected: /// \brief event handler virtual void handleEvent(std::shared_ptr<core::Event> p_event) override; /// \brief processes an SFML event + virtual void initFboListItems(); + virtual void destroyFboListItems(); void processSFMLEvents(const sf::Event& p_event); + +private: + std::unique_ptr<sf::Context> sfmlContext; + std::unique_ptr<sf::Window> sfmlWindow; + std::shared_ptr<OpenGLWindowStream> windowOutput; + std::string windowTitle; + Color defaultDiffuseColor; + Color defaultAmbientColor; + Color defaultSpecularColor; }; #endif diff --git a/Rendering/VAO.cpp b/Rendering/VAO.cpp index 9880bf06f00336a37b8eaf1da8dedf17bbf751c5..1773d9f6eab0e93af6f4e9c7bcc6d414fc0ebed8 100644 --- a/Rendering/VAO.cpp +++ b/Rendering/VAO.cpp @@ -23,7 +23,7 @@ #include "Rendering/VAO.h" #include "Rendering/Shader.h" -#include "Rendering/Viewer.h" +#include "Rendering/OpenGLViewer.h" std::unordered_map<int, std::shared_ptr<VAO>> VAO::VAOs; diff --git a/Simulators/PBDObjectSimulator.cpp b/Simulators/PBDObjectSimulator.cpp index 4ed303677769bb330d48f488911fb1ed62a73f5f..79a391052f1bb09d37ccc814a107423262f40178 100644 --- a/Simulators/PBDObjectSimulator.cpp +++ b/Simulators/PBDObjectSimulator.cpp @@ -23,7 +23,7 @@ #include "Simulators/PBDSceneObject.h" #include "Simulators/PBDObjectSimulator.h" -#include "Rendering/GLRenderer.h" +#include "Rendering/OpenGLRenderer.h" void PBDObjectSimulator::draw() { @@ -33,7 +33,7 @@ void PBDObjectSimulator::draw() for (size_t i = 0; i < objectsSimulated.size(); i++) { sceneObject = std::static_pointer_cast<PBDSurfaceSceneObject>(objectsSimulated[i]); - GLRenderer::draw(sceneObject->mesh->aabb); + OpenGLRenderer::draw(sceneObject->mesh->aabb); } } PBDObjectSimulator::PBDObjectSimulator( std::shared_ptr<ErrorLog> p_errorLog ) : ObjectSimulator( p_errorLog ) @@ -99,7 +99,7 @@ void PBDObjectSimulator::run() if ( sceneObj->getType() == core::ClassType::PbdSurfaceSceneObject ) { pbdSurfaceSceneObject = std::static_pointer_cast<PBDSurfaceSceneObject>(sceneObj); - core::StdVector3d &vertices = pbdSurfaceSceneObject->getLocalVertices(); + std::vector<core::Vec3d> &vertices = pbdSurfaceSceneObject->getLocalVertices(); if ( !pbdSurfaceSceneObject->getFlags().isSimulatorInit ) { diff --git a/Simulators/PBDSceneObject.h b/Simulators/PBDSceneObject.h index f0736300b0cdef30abef1eedcd4307cf2f19649b..26b362bcaf7585a8d45b3a2a1f6478d56d46b336 100644 --- a/Simulators/PBDSceneObject.h +++ b/Simulators/PBDSceneObject.h @@ -55,9 +55,9 @@ public: float Damp; ///< damping values int nbrMass; ///< number of masses int **massIdx; ///< !! - core::StdVector3d P; ///< !! position - core::StdVector3d V; ///< !! velocity - core::StdVector3d exF; ///< external force + std::vector<core::Vec3d> P; ///< !! position + std::vector<core::Vec3d> V; ///< !! velocity + std::vector<core::Vec3d> exF; ///< external force int nbrSpr; ///< !! number of spheres float *L0; ///< !! Initial length bool *fixedMass; ///< true if masses are fixed diff --git a/VtkRendering/CMakeLists.txt b/VtkRendering/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..07ec5789549b14afb46b2a3c05b5ed87d27c0947 --- /dev/null +++ b/VtkRendering/CMakeLists.txt @@ -0,0 +1,34 @@ + +find_package(VTK REQUIRED) + +include(${VTK_USE_FILE}) + +simmedtk_add_library(VtkRendering + SOURCES + VtkViewer.cpp + VtkMeshRenderDelegate.cpp + PUBLIC_HEADERS + VtkViewer.h +) +set(PRIVATE_LIBS + PRIVATE + Core + Mesh) +if(VTK_LIBRARIES) + target_link_libraries(VtkRendering + PUBLIC + ${VTK_LIBRARIES} + ${PRIVATE_LIBS} + ) +else() + target_link_libraries(VtkRendering + PUBLIC + vtkHybrid + ${PRIVATE_LIBS} + ) + +endif() + +if(BUILD_TESTING) + add_subdirectory(UnitTests) +endif() diff --git a/VtkRendering/MeshNodalCoordinates.h b/VtkRendering/MeshNodalCoordinates.h new file mode 100644 index 0000000000000000000000000000000000000000..0447ada485804895eaa74c40b0cc08dbe01730c5 --- /dev/null +++ b/VtkRendering/MeshNodalCoordinates.h @@ -0,0 +1,124 @@ +// This file is part of the SimMedTK project. +// Copyright (c) Center for Modeling, Simulation, and Imaging in Medicine, +// Rensselaer Polytechnic Institute +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//--------------------------------------------------------------------------- +// +// Authors: +// +// Contact: +//--------------------------------------------------------------------------- + + +#ifndef MESHNODALCOORDINATES_H +#define MESHNODALCOORDINATES_H + +#include "vtkMappedDataArray.h" +#include "vtkIOExodusModule.h" // For export macro + +#include "vtkTypeTemplate.h" // For templated vtkObject API +#include "vtkObjectFactory.h" // for vtkStandardNewMacro + +// SimMedTK includes +#include "Core/Vector.h" + +// STL includes +#include <array> + +template <class Scalar> +class MeshNodalCoordinates: + public vtkTypeTemplate<MeshNodalCoordinates<Scalar>, vtkMappedDataArray<Scalar>> +{ +public: + vtkMappedDataArrayNewInstanceMacro(MeshNodalCoordinates<Scalar>) + static MeshNodalCoordinates *New(); + virtual void PrintSelf(ostream &os, vtkIndent indent); + + // Description: + // Set the raw scalar arrays for the coordinate set. This class takes + // ownership of the arrays and deletes them with delete[]. + void SetVertexArray(std::vector<Vector3<Scalar>> &vertices); + + // Reimplemented virtuals -- see superclasses for descriptions: + void Initialize(); + void GetTuples(vtkIdList *ptIds, vtkAbstractArray *output); + void GetTuples(vtkIdType p1, vtkIdType p2, vtkAbstractArray *output); + void Squeeze(); + vtkArrayIterator *NewIterator(); + vtkIdType LookupValue(vtkVariant value); + void LookupValue(vtkVariant value, vtkIdList *ids); + vtkVariant GetVariantValue(vtkIdType idx); + void ClearLookup(); + double* GetTuple(vtkIdType i); + void GetTuple(vtkIdType i, double *tuple); + vtkIdType LookupTypedValue(Scalar value); + void LookupTypedValue(Scalar value, vtkIdList *ids); + Scalar GetValue(vtkIdType idx); + Scalar& GetValueReference(vtkIdType idx); + void GetTupleValue(vtkIdType idx, Scalar *t); + + // Description: + // This container is read only -- this method does nothing but print a + // warning. + int Allocate(vtkIdType sz, vtkIdType ext); + int Resize(vtkIdType numTuples); + void SetNumberOfTuples(vtkIdType number); + void SetTuple(vtkIdType i, vtkIdType j, vtkAbstractArray *source); + void SetTuple(vtkIdType i, const float *source); + void SetTuple(vtkIdType i, const double *source); + void InsertTuple(vtkIdType i, vtkIdType j, vtkAbstractArray *source); + void InsertTuple(vtkIdType i, const float *source); + void InsertTuple(vtkIdType i, const double *source); + void InsertTuples(vtkIdList *dstIds, vtkIdList *srcIds, + vtkAbstractArray *source); + void InsertTuples(vtkIdType dstStart, vtkIdType n, vtkIdType srcStart, + vtkAbstractArray* source); + vtkIdType InsertNextTuple(vtkIdType j, vtkAbstractArray *source); + vtkIdType InsertNextTuple(const float *source); + vtkIdType InsertNextTuple(const double *source); + void DeepCopy(vtkAbstractArray *aa); + void DeepCopy(vtkDataArray *da); + void InterpolateTuple(vtkIdType i, vtkIdList *ptIndices, + vtkAbstractArray* source, double* weights); + void InterpolateTuple(vtkIdType i, vtkIdType id1, vtkAbstractArray *source1, + vtkIdType id2, vtkAbstractArray *source2, double t); + void SetVariantValue(vtkIdType idx, vtkVariant value); + void RemoveTuple(vtkIdType id); + void RemoveFirstTuple(); + void RemoveLastTuple(); + void SetTupleValue(vtkIdType i, const Scalar *t); + void InsertTupleValue(vtkIdType i, const Scalar *t); + vtkIdType InsertNextTupleValue(const Scalar *t); + void SetValue(vtkIdType idx, Scalar value); + vtkIdType InsertNextValue(Scalar v); + void InsertValue(vtkIdType idx, Scalar v); + +protected: + MeshNodalCoordinates(); + ~MeshNodalCoordinates(); + + std::vector<Vector3<Scalar>> *vertexArray; + +private: + MeshNodalCoordinates(const MeshNodalCoordinates &); // Not implemented. + void operator=(const MeshNodalCoordinates &); // Not implemented. + + vtkIdType Lookup(const Scalar &val, vtkIdType startIndex); + std::array<double,3> TempDoubleArray; +}; + +#include "MeshNodalCoordinates.txx" + +#endif // MESHNODALCOORDINATES_H diff --git a/VtkRendering/MeshNodalCoordinates.txx b/VtkRendering/MeshNodalCoordinates.txx new file mode 100644 index 0000000000000000000000000000000000000000..5eb27e58c6948150893721db9572e56517534f0a --- /dev/null +++ b/VtkRendering/MeshNodalCoordinates.txx @@ -0,0 +1,509 @@ +/* + * // This file is part of the SimMedTK project. + * // Copyright (c) Center for Modeling, Simulation, and Imaging in Medicine, + * // Rensselaer Polytechnic Institute + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //--------------------------------------------------------------------------- + * // + * // Authors: + * // + * // Contact: + * //--------------------------------------------------------------------------- + */ + +/*========================================================================= + + Program: Visualization Toolkit + Module: MeshNodalCoordinates.txx + + Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen + All rights reserved. + See Copyright.txt or http://www.kitware.com/Copyright.htm for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +#include "MeshNodalCoordinates.h" + +#include "vtkIdList.h" +#include "vtkObjectFactory.h" +#include "vtkVariant.h" +#include "vtkVariantCast.h" + +//------------------------------------------------------------------------------ +// Can't use vtkStandardNewMacro with a template. +template <class Scalar> MeshNodalCoordinates<Scalar> * +MeshNodalCoordinates<Scalar>::New() +{ + VTK_STANDARD_NEW_BODY(MeshNodalCoordinates<Scalar>) +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::PrintSelf(ostream &os, vtkIndent indent) +{ + this->MeshNodalCoordinates<Scalar>::Superclass::PrintSelf( + os, indent); + + os << indent << "vertexArray : " << this->vertexArray << std::endl; + os << "TempDoubleArray : " << &this->TempDoubleArray << std::endl; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::Initialize() +{ + this->vertexArray = nullptr; + this->MaxId = -1; + this->Size = 0; + this->NumberOfComponents = 1; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::GetTuples(vtkIdList *ptIds, vtkAbstractArray *output) +{ + vtkDataArray *outArray = vtkDataArray::FastDownCast(output); + if(!outArray) + { + vtkWarningMacro( << "Input is not a vtkDataArray"); + return; + } + + vtkIdType numTuples = ptIds->GetNumberOfIds(); + + outArray->SetNumberOfComponents(this->NumberOfComponents); + outArray->SetNumberOfTuples(numTuples); + + const vtkIdType numPoints = ptIds->GetNumberOfIds(); + for(vtkIdType i = 0; i < numPoints; ++i) + { + outArray->SetTuple(i, this->GetTuple(ptIds->GetId(i))); + } +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::GetTuples(vtkIdType p1, vtkIdType p2, vtkAbstractArray *output) +{ + vtkDataArray *outArray = vtkDataArray::FastDownCast(output); + if(!outArray) + { + vtkErrorMacro( << "Input is not a vtkDataArray"); + return; + } + + if(outArray->GetNumberOfComponents() != this->GetNumberOfComponents()) + { + vtkErrorMacro( << "Incorrect number of components in input array."); + return; + } + + for(vtkIdType outArrayTupleId = 0; p1 <= p2; ++p1) + { + outArray->SetTuple(outArrayTupleId++, this->GetTuple(p1)); + } +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::Squeeze() +{ + // noop +} + +//------------------------------------------------------------------------------ +template <class Scalar> vtkArrayIterator* +MeshNodalCoordinates<Scalar>::NewIterator() +{ + vtkErrorMacro( << "Not implemented."); + return NULL; +} + +//------------------------------------------------------------------------------ +template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar> +::LookupValue(vtkVariant value) +{ + bool valid = true; + Scalar val = vtkVariantCast<Scalar>(value, &valid); + if(valid) + { + return this->Lookup(val, 0); + } + return -1; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::LookupValue(vtkVariant value, vtkIdList *ids) +{ + bool valid = true; + Scalar val = vtkVariantCast<Scalar>(value, &valid); + ids->Reset(); + if(valid) + { + vtkIdType index = 0; + while((index = this->Lookup(val, index)) >= 0) + { + ids->InsertNextId(index++); + } + } +} + +//------------------------------------------------------------------------------ +template <class Scalar> vtkVariant MeshNodalCoordinates<Scalar> +::GetVariantValue(vtkIdType idx) +{ + return vtkVariant(this->GetValueReference(idx)); +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::ClearLookup() +{ + // no-op, no fast lookup implemented. +} + +//------------------------------------------------------------------------------ +template <class Scalar> double* MeshNodalCoordinates<Scalar> +::GetTuple(vtkIdType i) +{ + this->GetTuple(i, this->TempDoubleArray.data()); + return this->TempDoubleArray.data(); +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::GetTuple(vtkIdType i, double *tuple) +{ + tuple[0] = static_cast<double>((*this->vertexArray)[i](0)); + tuple[1] = static_cast<double>((*this->vertexArray)[i](1)); + tuple[2] = static_cast<double>((*this->vertexArray)[i](2)); +} + +//------------------------------------------------------------------------------ +template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar> +::LookupTypedValue(Scalar value) +{ + return this->Lookup(value, 0); +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::LookupTypedValue(Scalar value, vtkIdList *ids) +{ + ids->Reset(); + vtkIdType index = 0; + while((index = this->Lookup(value, index)) >= 0) + { + ids->InsertNextId(index++); + } +} + +//------------------------------------------------------------------------------ +template <class Scalar> Scalar MeshNodalCoordinates<Scalar> +::GetValue(vtkIdType idx) +{ + return this->GetValueReference(idx); +} + +//------------------------------------------------------------------------------ +template <class Scalar> Scalar& MeshNodalCoordinates<Scalar> +::GetValueReference(vtkIdType idx) +{ + const vtkIdType tuple = idx / this->NumberOfComponents; + const vtkIdType comp = idx % this->NumberOfComponents; + switch(comp) + { + case 0: + return (*this->vertexArray)[tuple](0); + case 1: + return (*this->vertexArray)[tuple](1); + case 2: + return (*this->vertexArray)[tuple](2); + default: + vtkErrorMacro( << "Invalid number of components."); + static Scalar dummy(0); + return dummy; + } +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::GetTupleValue(vtkIdType tupleId, Scalar *tuple) +{ + tuple[0] = (*this->vertexArray)[tupleId](0); + tuple[1] = (*this->vertexArray)[tupleId](1); + tuple[2] = (*this->vertexArray)[tupleId](2); +} + +//------------------------------------------------------------------------------ +template <class Scalar> int MeshNodalCoordinates<Scalar> +::Allocate(vtkIdType, vtkIdType) +{ + vtkErrorMacro("Read only container.") + return 0; +} + +//------------------------------------------------------------------------------ +template <class Scalar> int MeshNodalCoordinates<Scalar> +::Resize(vtkIdType) +{ + vtkErrorMacro("Read only container.") + return 0; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::SetNumberOfTuples(vtkIdType) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::SetTuple(vtkIdType, vtkIdType, vtkAbstractArray *) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::SetTuple(vtkIdType, const float *) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::SetTuple(vtkIdType, const double *) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::InsertTuple(vtkIdType, vtkIdType, vtkAbstractArray *) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::InsertTuple(vtkIdType, const float *) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::InsertTuple(vtkIdType, const double *) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::InsertTuples(vtkIdList *, vtkIdList *, vtkAbstractArray *) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar> +::InsertNextTuple(vtkIdType, vtkAbstractArray *) +{ + vtkErrorMacro("Read only container.") + return -1; +} + +//------------------------------------------------------------------------------ +template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar> +::InsertNextTuple(const float *) +{ + + vtkErrorMacro("Read only container.") + return -1; +} + +//------------------------------------------------------------------------------ +template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar> +::InsertNextTuple(const double *) +{ + vtkErrorMacro("Read only container.") + return -1; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::DeepCopy(vtkAbstractArray *) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::DeepCopy(vtkDataArray *) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::InterpolateTuple(vtkIdType, vtkIdList *, vtkAbstractArray *, double *) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::InterpolateTuple(vtkIdType, vtkIdType, vtkAbstractArray*, vtkIdType, + vtkAbstractArray*, double) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::SetVariantValue(vtkIdType, vtkVariant) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::RemoveTuple(vtkIdType) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::RemoveFirstTuple() +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::RemoveLastTuple() +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::SetTupleValue(vtkIdType, const Scalar*) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::InsertTupleValue(vtkIdType, const Scalar*) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar> +::InsertNextTupleValue(const Scalar *) +{ + vtkErrorMacro("Read only container.") + return -1; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::SetValue(vtkIdType, Scalar) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar> +::InsertNextValue(Scalar) +{ + vtkErrorMacro("Read only container.") + return -1; +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::InsertValue(vtkIdType, Scalar) +{ + vtkErrorMacro("Read only container.") + return; +} + +//------------------------------------------------------------------------------ +template <class Scalar> MeshNodalCoordinates<Scalar> +::MeshNodalCoordinates() +{ +} + +//------------------------------------------------------------------------------ +template <class Scalar> MeshNodalCoordinates<Scalar> +::~MeshNodalCoordinates() +{ +} + +//------------------------------------------------------------------------------ +template <class Scalar> void MeshNodalCoordinates<Scalar> +::SetVertexArray(std::vector<Vector3<Scalar>> &vertices) +{ + Initialize(); + this->NumberOfComponents = 3; + this->Size = this->NumberOfComponents * vertices.size(); + this->MaxId = this->Size - 1; + this->vertexArray = &vertices; + this->Modified(); +} + +//------------------------------------------------------------------------------ +template <class Scalar> vtkIdType MeshNodalCoordinates<Scalar> +::Lookup(const Scalar &val, vtkIdType index) +{ + while(index <= this->MaxId) + { + if(this->GetValueReference(index++) == val) + { + return index; + } + } + return -1; +} diff --git a/VtkRendering/UnitTests/CMakeLists.txt b/VtkRendering/UnitTests/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..d561fcb59c523a984bb0509a7ce4495df23c6cfa --- /dev/null +++ b/VtkRendering/UnitTests/CMakeLists.txt @@ -0,0 +1,11 @@ +set(Module VtkRendering) + +add_executable(${Module}UnitTestRunner + ${BANDIT_RUNNER} + MeshNodalCoordinatesSpec.cpp +) + +target_compile_options(${Module}UnitTestRunner PRIVATE $<$<CXX_COMPILER_ID:GNU>:-Wno-old-style-cast -Wno-multichar -Wno-type-limits>) +target_link_libraries(${Module}UnitTestRunner Core Mesh VtkRendering) +simple_test(${Module} --reporter=xunit) + diff --git a/VtkRendering/UnitTests/MeshNodalCoordinatesSpec.cpp b/VtkRendering/UnitTests/MeshNodalCoordinatesSpec.cpp new file mode 100644 index 0000000000000000000000000000000000000000..37dc63144c47f739ba375a3a04bb9d15efc022b2 --- /dev/null +++ b/VtkRendering/UnitTests/MeshNodalCoordinatesSpec.cpp @@ -0,0 +1,45 @@ +// This file is part of the SimMedTK project. +// Copyright (c) Center for Modeling, Simulation, and Imaging in Medicine, +// Rensselaer Polytechnic Institute +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//--------------------------------------------------------------------------- +// +// Authors: +// +// Contact: +//--------------------------------------------------------------------------- + +#include <memory> + +// VTK includes +#include <vtkNew.h> +#include <vtkSmartPointer.h> + +// SimMedTK includes +#include "../MeshNodalCoordinates.h" + +#include <bandit/bandit.h> +using namespace bandit; + +go_bandit([](){ + + describe("VTK mapped array.", []() { + it("constructs", []() { + vtkNew<MeshNodalCoordinates<double>> meshMapper; + AssertThat(meshMapper.GetPointer() != nullptr, IsTrue()); + }); + }); +}); + diff --git a/VtkRendering/VtkMeshRenderDelegate.cpp b/VtkRendering/VtkMeshRenderDelegate.cpp new file mode 100644 index 0000000000000000000000000000000000000000..785fe1288df3bd7f0550de4a159105f5d3eab41f --- /dev/null +++ b/VtkRendering/VtkMeshRenderDelegate.cpp @@ -0,0 +1,133 @@ +// This file is part of the SimMedTK project. +// Copyright (c) Center for Modeling, Simulation, and Imaging in Medicine, +// Rensselaer Polytechnic Institute +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//--------------------------------------------------------------------------- +// +// Authors: +// +// Contact: +//--------------------------------------------------------------------------- + +#include <memory> + +#include "Core/Geometry.h" +#include "Core/RenderDelegate.h" +#include "Core/Factory.h" +#include "Mesh/Mesh.h" + +#include "VtkRendering/MeshNodalCoordinates.h" +#include "VtkRendering/VtkRenderDelegate.h" + +// Vtk incudes +#include <vtkSmartPointer.h> +#include <vtkNew.h> +#include <vtkActor.h> +#include <vtkUnstructuredGrid.h> +#include <vtkDataSetMapper.h> +#include <vtkPolyDataMapper.h> +#include <vtkPoints.h> +#include <vtkCellArray.h> +#include <vtkGeometryFilter.h> +#include <vtkPolyDataNormals.h> + + +class MeshRenderDelegate : public VtkRenderDelegate +{ +public: + MeshRenderDelegate(); + virtual bool isTargetTextured() const override; + + vtkActor *getActor() const; + void init(); + +private: + vtkSmartPointer<vtkActor> actor; + vtkSmartPointer<MeshNodalCoordinates<double>> mappedData; + vtkSmartPointer<vtkMapper> mapper; +}; + +MeshRenderDelegate::MeshRenderDelegate() +{ + actor = vtkActor::New(); + mappedData = MeshNodalCoordinates<double>::New(); + + vtkNew<vtkUnstructuredGrid> unstructuredMesh; + vtkNew<vtkPoints> vertices; + vtkNew<vtkCellArray> triangles; + + auto geom = this->getSourceGeometryAs<Mesh>(); + if (!geom) + { + return; + } + + auto mesh = std::dynamic_pointer_cast<Mesh>(geom->shared_from_this()); + + mappedData->SetVertexArray(mesh->getVertices()); + + for(int i = 0; i < mesh->nbrTriangles; ++i) + { + vtkIdType cell[3]; + cell[0] = mesh->triangles[i].vert[0]; + cell[1] = mesh->triangles[i].vert[1]; + cell[2] = mesh->triangles[i].vert[2]; + triangles->InsertNextCell(3,cell); + } + + vertices->SetNumberOfPoints(mesh->getVertices().size()); + vertices->SetData(mappedData.Get()); + unstructuredMesh->SetPoints(vertices.GetPointer()); + unstructuredMesh->SetCells(VTK_TRIANGLE,triangles.GetPointer()); + + if (geom->getRenderDetail()->renderType & SIMMEDTK_RENDER_NORMALS) + { + vtkSmartPointer<vtkGeometryFilter> geometry = vtkGeometryFilter::New(); + geometry->SetInputData(unstructuredMesh.GetPointer()); + + vtkSmartPointer<vtkPolyDataNormals> normals = vtkPolyDataNormals::New(); + normals->SetInputConnection(geometry->GetOutputPort()); + + mapper = vtkPolyDataMapper::New(); + mapper->SetInputConnection(normals->GetOutputPort()); + } + else + { + mapper = vtkDataSetMapper::New(); + mapper->SetInputDataObject(unstructuredMesh.GetPointer()); + } + + actor->SetMapper(mapper); +} + +bool MeshRenderDelegate::isTargetTextured() const +{ + auto geom = this->getSourceGeometryAs<Mesh>(); + if (!geom) + return false; + + return geom->isMeshTextured(); +} + +vtkActor *MeshRenderDelegate::getActor() const +{ + return this->actor.GetPointer(); +} + +SIMMEDTK_BEGIN_DYNAMIC_LOADER() +SIMMEDTK_BEGIN_ONLOAD(register_mesh_render_delegate) + SIMMEDTK_REGISTER_CLASS(RenderDelegate,RenderDelegate,MeshRenderDelegate,300); +SIMMEDTK_FINISH_ONLOAD() +SIMMEDTK_FINISH_DYNAMIC_LOADER() diff --git a/VtkRendering/VtkRenderDelegate.h b/VtkRendering/VtkRenderDelegate.h new file mode 100644 index 0000000000000000000000000000000000000000..454c4e513d9eef0dde1507b58b84a308a2ab1fe8 --- /dev/null +++ b/VtkRendering/VtkRenderDelegate.h @@ -0,0 +1,14 @@ +#ifndef VTKRENDERABLE_H +#define VTKRENDERABLE_H + +#include "Core/RenderDelegate.h" + +class vtkActor; + +class VtkRenderDelegate : public RenderDelegate +{ +public: + virtual vtkActor *getActor() const = 0; +}; + +#endif // SMRENDERABLE_H diff --git a/VtkRendering/VtkViewer.cpp b/VtkRendering/VtkViewer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ff6d1be164fd4912baa7ac91459ce686640b4781 --- /dev/null +++ b/VtkRendering/VtkViewer.cpp @@ -0,0 +1,119 @@ +/* + * // This file is part of the SimMedTK project. + * // Copyright (c) Center for Modeling, Simulation, and Imaging in Medicine, + * // Rensselaer Polytechnic Institute + * // + * // Licensed under the Apache License, Version 2.0 (the "License"); + * // you may not use this file except in compliance with the License. + * // You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, software + * // distributed under the License is distributed on an "AS IS" BASIS, + * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * // See the License for the specific language governing permissions and + * // limitations under the License. + * // + * //--------------------------------------------------------------------------- + * // + * // Authors: + * // + * // Contact: + * //--------------------------------------------------------------------------- + */ + +#include "VtkRendering/VtkViewer.h" +#include "VtkRendering/VtkRenderDelegate.h" + +/// +/// \brief Wrapper to the vtkRendering pipeline +/// +class VtkViewer::VtkRenderer +{ +public: + VtkRenderer(std::shared_ptr<VtkViewer> activeViewer) : + viewer(activeViewer), + renderWindow(vtkRenderWindow::New()), + renderWindowInteractor(vtkRenderWindowInteractor::New()) + { + } + + vtkSmartPointer<vtkRenderWindow> get() const + { + return this->renderWindow; + } + + void render() + { + this->viewer->adjustFPS(); + this->renderWindow->Render(); + this->renderWindowInteractor->Start(); + } + + void initRenderingContext() + { + // Create a new renderer and add actors to it. + vtkNew<vtkRenderer> renderer; + if (viewer->viewerRenderDetail & SIMMEDTK_VIEWERRENDER_FULLSCREEN) + { + this->renderWindow->FullScreenOn(); + } + + this->renderWindowInteractor->SetRenderWindow(renderWindow); + + // The actors are obtained from VtkRenderDelegates + std::shared_ptr<VtkRenderDelegate> delegate; + for(auto &ro : this->viewer->renderOperations) + { + for(const auto &object : ro.scene->getSceneObject()) + { + delegate = std::static_pointer_cast<VtkRenderDelegate>(object->getRenderDelegate()); + if (delegate) + { + renderer->AddActor(delegate->getActor()); + } + } + } + if(renderer->GetActors()->GetNumberOfItems() > 0) + { + this->renderWindow->AddRenderer(renderer.GetPointer()); + } + } + +private: + std::shared_ptr<VtkViewer> viewer; + vtkSmartPointer<vtkRenderWindow> renderWindow; + vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor; +}; + +VtkViewer::VtkViewer(const VtkViewer& /*other*/) +{ +} + +VtkViewer::~VtkViewer() +{ +} + +void VtkViewer::initRenderingContext() +{ + this->init(); + this->renderer->initRenderingContext(); +} +void VtkViewer::exec() +{ + this->render(); +} +void VtkViewer::render() +{ + if(viewerRenderDetail & SIMMEDTK_VIEWERRENDER_DISABLE) + { + return; + } + + beginModule(); + + this->renderer->render(); + + endModule(); +} diff --git a/VtkRendering/VtkViewer.h b/VtkRendering/VtkViewer.h new file mode 100644 index 0000000000000000000000000000000000000000..77f8df7b9dc3af9899bc1e7bf7549f5387eb98c2 --- /dev/null +++ b/VtkRendering/VtkViewer.h @@ -0,0 +1,138 @@ +// This file is part of the SimMedTK project. +// Copyright (c) Center for Modeling, Simulation, and Imaging in Medicine, +// Rensselaer Polytechnic Institute +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//--------------------------------------------------------------------------- +// +// Authors: +// +// Contact: +//--------------------------------------------------------------------------- + +#ifndef VTKVIEWER_H +#define VTKVIEWER_H + +#include "Core/ViewerBase.h" +#include "Core/MakeUnique.h" + +// VTK includes +#include <vtkNew.h> +#include <vtkSmartPointer.h> +#include <vtkRenderer.h> +#include <vtkRenderWindow.h> +#include <vtkRenderWindowInteractor.h> + +class VtkViewer : public ViewerBase +{ + +public: + VtkViewer() : renderer(make_unique<VtkRenderer>(safeDownCast<VtkViewer>())) + { + } + + ~VtkViewer(); + + bool operator==(const VtkViewer& other) const; + VtkViewer(const VtkViewer& other); + VtkViewer& operator=(const VtkViewer& other); + +public: + /// + /// \brief Execute when exit viewer + /// + virtual void exitViewer(){} + + /// + /// \brief add text for display + /// + virtual void addText(std::string /*tag*/){} + + /// + /// \brief update text + /// + virtual void updateText(std::string /*tag*/, std::string /*string*/){} + + /// + /// \brief update text + /// + virtual void updateText(int /*handle*/, std::string /*string*/){} + + /// + /// \brief enable/disable VSync + /// + virtual void setVSync(bool /*sync*/){} + +protected: + /// + /// \brief Renders the render operation to screen + /// + virtual void renderToScreen(const RenderOperation &/*rop*/){} + + /// + /// \brief Renders the render operation to an FBO + /// + virtual void renderToFBO(const RenderOperation &/*rop*/){} + + /// + /// \brief Initializes rendering system (e.g., OpenGL) capabilities and flags + /// + virtual void initRenderingCapabilities(){} + + /// + /// \brief Initilizes the rendering system (e.g., OpenGL) context, and window containing it + virtual void initRenderingContext(); + + /// + /// \brief Cleans up after initGLContext() + /// + virtual void destroyRenderingContext(){} + + /// + /// \brief Initializes FBOs, textures, shaders and VAOs + /// + virtual void initResources(){} + + /// + /// \brief Processes viewerRenderDetail options + /// + virtual void processViewerOptions(){} + + /// + /// \brief Process window events and render as the major part of an event loop + /// + virtual void processWindowEvents(){} + + /// + /// \brief Set the color and other viewer defaults + /// + virtual void setToDefaults(){} + + /// + /// \brief render depth texture for debugging + /// + virtual void renderTextureOnView(){} + + virtual void exec(); + + + void render(); + +private: + class VtkRenderer; + std::unique_ptr<VtkRenderer> renderer; +}; + + +#endif // VTKVIEWER_H