|
Katana Plug-in APIs 0.1
|
00001 // Copyright (c) 2016 The Foundry Visionmongers Ltd. All Rights Reserved. 00002 00003 #ifndef FNMANIPULATORHANDLE_H_ 00004 #define FNMANIPULATORHANDLE_H_ 00005 00006 #include <FnViewer/suite/FnManipulatorHandleSuite.h> 00007 #include <FnViewer/plugin/FnEventWrapper.h> 00008 #include <FnViewer/plugin/FnManipulator.h> 00009 #include <FnViewer/plugin/FnMathTypes.h> 00010 00011 #include <FnPluginSystem/FnPluginSystem.h> 00012 #include <FnPluginSystem/FnPlugin.h> 00013 #include <FnAttribute/FnAttribute.h> 00014 00015 #include <stdint.h> 00016 #include <string> 00017 #include <memory> 00018 00019 #ifndef FNKAT_UNUSED 00020 #define FNKAT_UNUSED(x) (void)x 00021 #endif 00022 00023 00024 00025 namespace Foundry 00026 { 00027 namespace Katana 00028 { 00029 namespace ViewerAPI 00030 { 00031 00069 class ManipulatorHandlePluginBase 00070 { 00071 public: 00072 00074 ManipulatorHandlePluginBase(); 00075 00077 virtual ~ManipulatorHandlePluginBase(); 00078 00079 public: /* Methods to be called by the plugin. */ 00080 00093 ManipulatorWrapperPtr getManipulator(); 00094 00102 Matrix44d getXform(); 00103 00110 void setLocalXform(const Matrix44d& xform); 00111 00117 Matrix44d getLocalXform(); 00118 00120 bool isActive(); 00121 00123 bool isHovered(); 00124 00126 public: 00127 static FnPlugStatus setHost(FnPluginHost* host); 00128 static FnPluginHost* getHost(); 00129 00130 protected: 00131 FnManipulatorHandleHostSuite_v1* m_hostSuite; 00132 FnManipulatorHandleHostHandle m_hostHandle; 00133 00134 static FnPluginHost* m_host; 00135 00136 private: 00137 ManipulatorWrapperPtr m_manipulatorWrapper; 00138 00140 }; 00141 00142 00144 class ManipulatorHandle : public ManipulatorHandlePluginBase 00145 { 00146 public: 00147 ManipulatorHandle(); 00148 virtual ~ManipulatorHandle(); 00149 00150 public: /* Virtual functions to be extended by the plugin. */ 00151 00158 virtual void cancelManipulation() = 0; 00159 00167 virtual void draw() = 0; 00168 00177 virtual void pickerDraw(int64_t pickerId) = 0; 00178 00190 virtual bool event(const FnEventWrapper& eventData); 00191 00213 virtual void* getPrivateData(void* inputData) { return 0x0; } 00214 00215 /* Options setting and getting. */ 00216 00228 virtual void setOption(OptionIdGenerator::value_type optionId, 00229 FnAttribute::Attribute attr) {} 00230 00242 virtual FnAttribute::Attribute getOption( 00243 OptionIdGenerator::value_type optionId); 00244 00258 void setOption(const std::string& name, FnAttribute::Attribute attr); 00259 00272 FnAttribute::Attribute getOption(const std::string& name); 00273 00275 public: 00276 static FnManipulatorHandlePluginSuite_v1 createSuite( 00277 FnManipulatorHandlePluginHandle (*create)( 00278 FnManipulatorHandleHostHandle hostHandle)); 00279 static FnManipulatorHandlePluginHandle newManipulatorHandleHandle( 00280 ManipulatorHandle* manipulatorHandle); 00281 00282 static unsigned int _apiVersion; 00283 static const char* _apiName; 00284 00285 void setHostHandle(FnManipulatorHandleHostHandle m_hostHandle); 00286 FnManipulatorHandleHostHandle getHostHandle(); 00287 00289 }; 00290 00291 00293 class ManipulatorHandleWrapper : public ManipulatorHandlePluginBase 00294 { 00295 public: 00296 ManipulatorHandleWrapper( 00297 FnPluginHost* host, 00298 FnManipulatorHandleHostHandle hostHandle, 00299 FnManipulatorHandlePluginHandle pluginHandle, 00300 FnManipulatorHandlePluginSuite_v1* pluginSuite); 00301 00302 ~ManipulatorHandleWrapper(); 00303 00322 template<class T> T* getPluginInstance() 00323 { 00324 return dynamic_cast<T*>(getPluginPointer()); 00325 } 00326 00328 void setActive(bool active); 00329 00331 void setHovered(bool hovered); 00332 00339 void cancelManipulation(); 00340 00347 void draw(); 00348 00355 bool event(FnEventWrapper eventData); 00356 00365 void pickerDraw(int64_t pickerId); 00366 00368 void setOption(OptionIdGenerator::value_type optionId, 00369 FnAttribute::Attribute attr); 00371 FnAttribute::Attribute getOption(OptionIdGenerator::value_type optionId); 00373 void setOption(const std::string& name, FnAttribute::Attribute attr); 00375 FnAttribute::Attribute getOption(const std::string& name); 00376 00378 private: 00379 ManipulatorHandle* getPluginPointer(); 00380 00382 FnManipulatorHandlePluginSuite_v1* m_pluginSuite; 00383 FnManipulatorHandlePluginHandle m_pluginHandle; 00384 00386 }; 00387 00388 typedef std::shared_ptr<ManipulatorHandleWrapper> ManipulatorHandleWrapperPtr; 00389 00392 } // ViewerAPI 00393 } // Katana 00394 } // Foundry 00395 00396 00397 00399 00400 // Plugin-side structure to be pointed by the plugin handles. 00401 struct FnManipulatorHandlePluginStruct 00402 { 00403 public: 00404 FnManipulatorHandlePluginStruct( 00405 Foundry::Katana::ViewerAPI::ManipulatorHandle* manipulatorHandle) 00406 : m_manipulatorHandle(manipulatorHandle) 00407 {} 00408 00409 ~FnManipulatorHandlePluginStruct() 00410 { 00411 if (m_manipulatorHandle) 00412 m_manipulatorHandle->cancelManipulation(); 00413 }; 00414 00415 Foundry::Katana::ViewerAPI::ManipulatorHandle* getManipulatorHandle() 00416 { 00417 return m_manipulatorHandle.get(); 00418 } 00419 00420 private: 00421 std::shared_ptr< 00422 Foundry::Katana::ViewerAPI::ManipulatorHandle> m_manipulatorHandle; 00423 }; 00424 00425 00426 // Plugin Registering Macro. 00427 #define DEFINE_MANIPULATOR_HANDLE_PLUGIN(MANIPULATOR_HANDLE_CLASS) \ 00428 \ 00429 FnPlugin MANIPULATOR_HANDLE_CLASS##_plugin; \ 00430 \ 00431 FnManipulatorHandlePluginHandle MANIPULATOR_HANDLE_CLASS##_create( \ 00432 FnManipulatorHandleHostHandle hostHandle) \ 00433 { \ 00434 Foundry::Katana::ViewerAPI::ManipulatorHandle* manipulatorHandle = \ 00435 MANIPULATOR_HANDLE_CLASS::create(); \ 00436 \ 00437 manipulatorHandle->setHostHandle(hostHandle); \ 00438 return Foundry::Katana::ViewerAPI::ManipulatorHandle::newManipulatorHandleHandle(manipulatorHandle); \ 00439 } \ 00440 \ 00441 FnManipulatorHandlePluginSuite_v1 MANIPULATOR_HANDLE_CLASS##_suite = \ 00442 Foundry::Katana::ViewerAPI::ManipulatorHandle::createSuite( \ 00443 MANIPULATOR_HANDLE_CLASS##_create); \ 00444 \ 00445 const void* MANIPULATOR_HANDLE_CLASS##_getSuite() \ 00446 { \ 00447 return &MANIPULATOR_HANDLE_CLASS##_suite; \ 00448 } 00449 00451 00452 #endif /* FNMANIPULATORHANDLE_H_ */
1.7.3