Katana Plug-in APIs 0.1

FnGLManipulator.h

00001 
00002 // Copyright (c) 2017 The Foundry Visionmongers Ltd. All Rights Reserved.
00003 
00004 #ifndef GLMANIPULATOR_H_
00005 #define GLMANIPULATOR_H_
00006 
00007 #include <FnViewer/plugin/FnManipulator.h>
00008 #include <FnViewer/plugin/FnManipulatorHandle.h>
00009 #include <FnViewer/plugin/FnMathTypes.h>
00010 #include <FnViewer/plugin/FnEventWrapper.h>
00011 #include <FnViewer/utils/FnGLShaderProgram.h>
00012 
00013 #include <stdint.h>
00014 #include <string>
00015 
00016 namespace Foundry
00017 {
00018 namespace Katana
00019 {
00020 namespace ViewerUtils
00021 {
00022 
00024 enum RenderMode
00025 {
00026     kPicking = 0,
00027     kShadingFlat = 1,
00028     kShading3D = 2,
00029     kLineStipple = 3,
00030     kTextured = 4,
00031 };
00032 
00033 // A lot of entities from the ViewerAPI namespace will be accessed.
00034 using namespace Foundry::Katana::ViewerAPI;
00035 
00047 class GLManipulator : public Manipulator
00048 {
00049 public:
00050 
00052     GLManipulator();
00053 
00055     virtual ~GLManipulator();
00056 
00063     static const std::string kTechnology;
00064 };
00065 
00079 class GLManipulatorHandle : public ManipulatorHandle
00080 {
00081 public:
00082 
00084     GLManipulatorHandle();
00085 
00087     virtual ~GLManipulatorHandle();
00088 
00095    virtual void cancelManipulation();
00096 
00107     virtual void draw();
00108 
00123     virtual void pickerDraw(int64_t pickerID);
00124 
00134     virtual bool event(const FnEventWrapper& eventData);
00135 
00141     virtual FnAttribute::Attribute getOption(
00142             Foundry::Katana::ViewerAPI::OptionIdGenerator::value_type);
00143 
00144 protected:
00146     GLManipulator* getGLManipulator();
00147 
00149     ViewportWrapperPtr getViewport();
00150 
00152     ViewerDelegateWrapperPtr getViewerDelegate();
00153 
00155     bool isDragging();
00156 
00158     bool hasBeenDragged();
00159 
00167     virtual bool getDraggingPlane(Vec3d& origin, Vec3d& normal);
00168 
00178     virtual void startDrag(const Vec3d& initialPointOnPlane,
00179                            const Vec2i& initialMousePosition);
00180 
00199     virtual void drag(const Vec3d& initialPointOnPlane,
00200                       const Vec3d& previousPointOnPlane,
00201                       const Vec3d& currentPointOnPlane,
00202                       const Vec2i& initialMousePosition,
00203                       const Vec2i& previousMousePosition,
00204                       const Vec2i& currentMousePosition,
00205                       bool isFinal);
00206 
00212     virtual void endDrag();
00213 
00222     virtual bool canProcessKeyboardModifiers(int modifiers) const
00223     {
00224         return modifiers == FnEventWrapper::kNoModifier;
00225     }
00226 
00228     void useDrawingShader(const Matrix44d& xform, const Vec4f& color,
00229                           bool isFlat);
00230 
00231     void useSnappingShader(const Matrix44d& xform);
00232 
00239     void useLineStippleDrawingShader(const Matrix44d& xform,
00240                                      const Vec4f& color, int pattern,
00241                                      float factor);
00242 
00244     void usePickingShader(const Matrix44d& xform, int handleId,
00245                           int handlePriority);
00246 
00249     int getLatestKeyboardModifiers() const
00250     {
00251         return m_latestKeyboardModifiers;
00252     }
00253 
00256     const Vec2i& getLatestMousePosition() const
00257     {
00258         return m_latestMousePosition;
00259     }
00260 
00261     const Matrix44d& getInitialHandleXform() const {
00262         return m_initialHandleXform;
00263     }
00264     const Vec3d& getInitialPointOnPlane() const {
00265         return m_initialPointOnPlane;
00266     }
00267     const Vec3d& getLastPointOnPlane() const {
00268         return m_previousPointOnPlane;
00269     }
00270     const Vec2i& getInitialMousePosition() const {
00271         return m_initialMousePosition;
00272     }
00273     const Vec2i& getLastMousePosition() const {
00274         return m_previousMousePosition;
00275     }
00276 
00277 private:
00279     static void useShader(ViewportWrapperPtr viewport, const Matrix44d& xform,
00280                           RenderMode renderMode,
00281                           GLShaderProgram& shaderProgram);
00282 
00285     bool m_processingManipulation;
00286 
00288     Matrix44d m_localXform;
00289 
00291     GLShaderProgram m_shaderProgram;
00292     GLShaderProgram m_shaderProgramLineStipple;
00293 
00295     Vec2i m_latestMousePosition;
00296 
00298     int m_latestKeyboardModifiers;
00299 
00301     Matrix44d m_initialHandleXform;
00302 
00304     Vec3d m_initialPointOnPlane;
00305     Vec3d m_previousPointOnPlane;
00306 
00308     Vec2i m_initialMousePosition;
00309     Vec2i m_previousMousePosition;
00310 
00312     bool m_isDragging;
00313 
00315     bool m_hasBeenDragged;
00316 };
00317 
00318 
00319 }
00320 }
00321 }
00322 
00323 #endif /* GLMANIPULATOR_H_ */
 All Classes Functions Variables Typedefs Enumerations Enumerator