Katana Plug-in APIs 0.1

FnViewportCamera.h

00001 // Copyright (c) 2017 The Foundry Visionmongers Ltd. All Rights Reserved.
00002 
00003 #ifndef FNVIEWER_VIEWPORTCAMERA_H
00004 #define FNVIEWER_VIEWPORTCAMERA_H
00005 
00006 #include <FnViewer/plugin/FnEventWrapper.h>
00007 #include <FnViewer/plugin/FnViewport.h>
00008 #include <FnViewer/suite/FnViewportCameraSuite.h>
00009 #include <FnViewer/plugin/FnOptionIdGenerator.h>
00010 #include <FnViewer/plugin/FnMathTypes.h>
00011 
00012 #include <FnPluginSystem/FnPluginSystem.h>
00013 #include <FnPluginSystem/FnPlugin.h>
00014 #include <FnAttribute/FnAttribute.h>
00015 
00016 #include <map>
00017 #include <string>
00018 #include <iostream>
00019 #include <memory>
00020 
00021 // Built-in camera types
00022 #define kFnViewportCameraTypeUnknown 0
00023 #define kFnViewportCameraTypePerspective 1
00024 #define kFnViewportCameraTypeOrthographic 2
00025 #define kFnViewportCameraTypeSpherical 3
00026 
00027 namespace Foundry
00028 {
00029 namespace Katana
00030 {
00031 namespace ViewerAPI
00032 {
00033 
00072 class ViewportCameraPluginBase
00073 {
00074 public:
00075     enum CameraDirtyBits
00076     {
00077         Clean = 0,
00078         DirtyParams = 1 << 0,
00079         AllDirty = (DirtyParams)
00080     };
00081 
00082 public:
00083     // API methods (to be implemented / used by sub-classes)
00084 
00085     ViewportCameraPluginBase();
00086     virtual ~ViewportCameraPluginBase();
00087 public: /* Methods to be called by the plugin. */
00088 
00094     ViewportWrapperPtr getViewport();
00095 
00101     const double* getViewMatrix();
00102 
00108     Matrix44d getViewMatrix44d();
00109 
00115     void setViewMatrix(const double* matrix);
00116 
00122     const double* getProjectionMatrix();
00123 
00129     Matrix44d getProjectionMatrix44d();
00130 
00136     void setProjectionMatrix(const double* matrix);
00137 
00144     double getCenterOfInterest();
00145 
00152     void setCenterOfInterest(double coi);
00153 
00155     double getFOV();
00156 
00162     void setFOV(double fov);
00163 
00169     double getOrthographicWidth();
00170 
00176     void setOrthographicWidth(double width);
00177 
00184     void getNearFar(double &near, double &far);
00185 
00192     void setNearFar(double near, double far);
00193 
00202     void getScreenWindow(double &left, double &right, double &bottom, double &top);
00203 
00212     void setScreenWindow(double left, double right, double bottom, double top);
00213 
00220     bool hasLocationPath();
00221 
00231     std::string getLocationPath();
00232 
00239     void setLocationPath(const std::string& locationPath);
00240 
00242     Vec3d getOrigin();
00243 
00245     Vec3d getDirection();
00246 
00248     Vec3d getUp();
00249 
00251     Vec3d getLeft();
00252 
00261     bool isInteractionDisabled();
00262 
00269     void disableInteraction(bool disabled);
00270 
00272 public:
00273     static FnPlugStatus setHost(FnPluginHost* host);
00274     static FnPluginHost* getHost();
00275 
00276     FnViewportCameraHostHandle getCameraHostHandle() const {
00277         return m_hostHandle;
00278     }
00279 
00280 protected:
00281     FnViewportCameraHostSuite_v2* m_hostSuite;
00282     FnViewportCameraHostHandle m_hostHandle;
00283 
00284     static FnPluginHost* m_host;
00285 
00286 private:
00287     ViewportWrapperPtr m_viewportWrapper;
00288 
00290 };
00291 
00292 
00294 class ViewportCamera : public ViewportCameraPluginBase
00295 {
00296 public:
00297     ViewportCamera();
00298     virtual ~ViewportCamera();
00299 
00300 public: /* Virtual functions to be extended by the plugin. */
00301 
00309     static void flush() {}
00310 
00319     virtual int getCameraTypeID() = 0;
00320 
00330     virtual void setViewportDimensions(unsigned int width, unsigned int height) = 0;
00331 
00343     virtual void setOption(OptionIdGenerator::value_type optionId,
00344         FnAttribute::Attribute attr) {}
00345 
00357     virtual FnAttribute::Attribute getOption(
00358         OptionIdGenerator::value_type optionId);
00359 
00373     void setOption(const std::string& name, FnAttribute::Attribute attr);
00374 
00387     FnAttribute::Attribute getOption(const std::string& name);
00388 
00398     virtual void startInteraction() = 0;
00399 
00411     virtual void endInteraction() = 0;
00412 
00423     virtual void translate(double x, double y, double z) = 0;
00424 
00435     virtual void rotate(double x, double y, double z) = 0;
00436 
00445     virtual void setup(FnAttribute::GroupAttribute attr) = 0;
00446 
00457     virtual FnAttribute::GroupAttribute asAttribute() = 0;
00458 
00471     virtual bool getPointOnPlane(int x, int y,
00472         const Vec3d& planeOrigin,
00473         const Vec3d& planeNormal, Vec3d& intersection) = 0;
00474 
00484     virtual void getRay(int x, int y, Vec3d& pos, Vec3d& dir) = 0;
00485 
00495     virtual Vec3d projectObjectIntoWindow(Vec3d point) = 0;
00496 
00508     virtual Vec3d projectWindowIntoObject(Vec3d point) = 0;
00509 
00531     virtual void* getPrivateData(void* inputData) { return 0x0; }
00532 
00542     virtual void setDirty(CameraDirtyBits dirtyBits) = 0;
00543 
00545 public:
00546     static FnViewportCameraPluginSuite_v2 createSuite(
00547         FnViewportCameraPluginHandle (*create)(
00548             FnViewportCameraHostHandle hostHandle));
00549     static FnViewportCameraPluginHandle newViewportCameraHandle(
00550         ViewportCamera* viewportCamera);
00551 
00552     static unsigned int _apiVersion;
00553     static const char*  _apiName;
00554 
00555     void setHostHandle(FnViewportCameraHostHandle m_hostHandle);
00556     FnViewportCameraHostHandle getHostHandle();
00557 
00559 };
00560 
00562 class ViewportCameraWrapper : public ViewportCameraPluginBase
00563 {
00564 public:
00565     ViewportCameraWrapper(
00566         FnPluginHost* host,
00567         FnViewportCameraHostHandle hostHandle,
00568         FnViewportCameraPluginHandle pluginHandle,
00569         FnViewportCameraPluginSuite_v2* pluginSuite);
00570 
00571     ~ViewportCameraWrapper();
00572 
00590     template<class T> T* getPluginInstance()
00591     {
00592         return dynamic_cast<T*>(getPluginPointer());
00593     }
00594 
00596     int getCameraTypeID();
00598     void setViewportDimensions(unsigned int width, unsigned int height);
00600     void setOption(OptionIdGenerator::value_type optionId, FnAttribute::Attribute attr);
00602     FnAttribute::Attribute getOption(OptionIdGenerator::value_type optionId);
00604     void setOption(const std::string& name, FnAttribute::Attribute attr);
00606     FnAttribute::Attribute getOption(const std::string& name);
00608     void translate(double x, double y, double z);
00610     void rotate(double x, double y, double z);
00612     void startInteraction();
00614     void endInteraction();
00616     void setup(FnAttribute::GroupAttribute attr);
00618     FnAttribute::GroupAttribute asAttribute();
00623     bool getPointOnPlane(int x, int y, const Vec3d& planeOrigin,
00624                          const Vec3d& planeNormal, Vec3d& intersection);
00629     void getRay(int x, int y, Vec3d& pos, Vec3d& dir);
00631     Vec3d projectObjectIntoWindow(Vec3d point);
00633     Vec3d projectWindowIntoObject(Vec3d point);
00635     void setDirty(CameraDirtyBits dirtyBits);
00636 
00638 private:
00639     ViewportCamera* getPluginPointer();
00640 
00642     FnViewportCameraPluginSuite_v2* m_pluginSuite;
00643     FnViewportCameraPluginHandle m_pluginHandle;
00644 
00646 };
00647 
00648 typedef std::shared_ptr<ViewportCameraWrapper> ViewportCameraWrapperPtr;
00649 
00652 } // ViewerAPI
00653 } // Katana
00654 } // Foundry
00655 
00656 
00657 
00659 
00660 // Plugin-side structure to be pointed by the plugin handles.
00661 struct FnViewportCameraPluginStruct
00662 {
00663 public:
00664     FnViewportCameraPluginStruct(
00665         Foundry::Katana::ViewerAPI::ViewportCamera* viewportCamera)
00666     : m_viewportCamera(viewportCamera)
00667     {}
00668 
00669     ~FnViewportCameraPluginStruct()
00670     {};
00671 
00672     Foundry::Katana::ViewerAPI::ViewportCamera* getViewportCamera()
00673     {
00674         return m_viewportCamera.get();
00675     }
00676 
00677 private:
00678     std::shared_ptr<Foundry::Katana::ViewerAPI::ViewportCamera>
00679         m_viewportCamera;
00680 };
00681 
00682 
00683 // Plugin Registering Macro.
00684 #define DEFINE_VIEWPORT_CAMERA_PLUGIN(VIEWPORT_CAMERA_CLASS)                    \
00685                                                                               \
00686     FnPlugin VIEWPORT_CAMERA_CLASS##_plugin;                                   \
00687                                                                               \
00688     FnViewportCameraPluginHandle VIEWPORT_CAMERA_CLASS##_create(                \
00689         FnViewportCameraHostHandle hostHandle)                                 \
00690     {                                                                         \
00691         Foundry::Katana::ViewerAPI::ViewportCamera* viewportCamera =            \
00692             VIEWPORT_CAMERA_CLASS::create();                                   \
00693                                                                               \
00694         viewportCamera->setHostHandle(hostHandle);                             \
00695         return Foundry::Katana::ViewerAPI::ViewportCamera::newViewportCameraHandle(viewportCamera); \
00696     }                                                                         \
00697                                                                               \
00698     FnViewportCameraPluginSuite_v2 VIEWPORT_CAMERA_CLASS##_suite =              \
00699             Foundry::Katana::ViewerAPI::ViewportCamera::createSuite(           \
00700                     VIEWPORT_CAMERA_CLASS##_create);                           \
00701                                                                               \
00702     const void* VIEWPORT_CAMERA_CLASS##_getSuite()                             \
00703     {                                                                         \
00704         return &VIEWPORT_CAMERA_CLASS##_suite;                                 \
00705     }
00706 
00708 
00709 #endif
 All Classes Functions Variables Typedefs Enumerations Enumerator