00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00033
00034 #ifndef esve_components_dimn_Differential_Motion_Handler_hxx
00035 #define esve_components_dimn_Differential_Motion_Handler_hxx
00036
00037 #include <esve/components/dimn/Supermouse_Motion_Handler.hxx>
00038 #include <esve/types/pure.hxx>
00039
00040 namespace esve { namespace components { namespace dimn {
00041
00049
00050 template< typename Transform, typename impl_Transform >
00051 class Differential_Motion_Handler
00052 : public Supermouse_Motion_Handler
00053 {
00054 private:
00055 typedef Supermouse_Motion_Handler super ;
00056
00057 struct m_Button_Data
00058 {
00059
00060 const Transform* basis ;
00061
00062
00063 impl_Transform motion_basis ;
00064
00065
00066 impl_Transform frame ;
00067
00068
00069 bool go ;
00070
00071 m_Button_Data() ;
00072
00073 private:
00074 m_Button_Data( const m_Button_Data & ) ;
00075 m_Button_Data & operator=( const m_Button_Data & ) ;
00076 } ;
00077
00078 Differential_Motion_Handler( const Differential_Motion_Handler & ) ;
00079 Differential_Motion_Handler &
00080 operator=( const Differential_Motion_Handler & ) ;
00081
00082 Transform* m_transform ;
00083 impl_Transform m_root ;
00084 m_Button_Data m_button[Supermouse::NUM_BUTTONS] ;
00085 double m_dt_since_drag ;
00086 bool m_reset_frames ;
00087
00088 public:
00090 explicit Differential_Motion_Handler( Transform & ) ;
00091
00096 void active_transform( Transform & ) ;
00097
00098 const Transform & active_transform() const
00099 {
00100 return *m_transform ;
00101 }
00103
00107 const Transform & basis( Button ) const ;
00108 void basis( Button, const Transform & basis ) ;
00110
00111 void stop() ;
00112
00113 void update( double dt ) ;
00114 using super::update ;
00115
00116 ~Differential_Motion_Handler() ;
00117
00118 protected:
00119 bool handle_supermouse_push( Button, const Supermouse & ) ;
00120 bool handle_supermouse_release( Button, const Supermouse & ) ;
00121 bool handle_check_awake( bool currently_awake ) ;
00122
00129 virtual void create_motion( Button, const types::pure & du_dt ) = 0 ;
00130
00135 virtual impl_Transform differential_motion( Button, types::real dt ) = 0 ;
00136
00138 virtual void stop_motion( Button ) = 0 ;
00139
00141 virtual bool has_motion( Button ) = 0 ;
00142
00148 virtual void normalize( impl_Transform & transform ) ;
00149 } ;
00150
00151 }}}
00152
00153 #include <esve/components/dimn/Differential_Motion_Handler.template.cxx>
00154
00155 #endif
00156