Katana Plug-in APIs 0.1

FnManipulatorHandle.h

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_ */
 All Classes Functions Variables Typedefs Enumerations Enumerator