|
Katana Plug-in APIs 0.1
|
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
1.7.3