Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members

Differential_Motion_Handler.hxx

00001 
00002 // 
00003 // Copyright (C) 2006 James M. Lawrence.  All rights reserved.
00004 // 
00005 // software: esve-1.0.3
00006 // file: esve/components/dimn/Differential_Motion_Handler.hxx
00007 // 
00008 // Redistribution and use in source and binary forms, with or without
00009 // modification, are permitted provided that the following conditions
00010 // are met:
00011 // 
00012 // 1. Redistributions of source code must retain the above copyright
00013 //    notice, this list of conditions and the following disclaimer.
00014 // 
00015 // 2. The origin of this software must not be misrepresented; you must
00016 //    not claim that you wrote the original software.  If you use this
00017 //    software in a product, an acknowledgment in the product 
00018 //    documentation would be appreciated but is not required.
00019 // 
00020 // 3. Altered source versions must be plainly marked as such, and must
00021 //    not be misrepresented as being the original software.
00022 // 
00023 // 4. The name of the author may not be used to endorse or promote
00024 //    products derived from this software without specific prior written
00025 //    permission.
00026 // 
00027 // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY,
00028 // AND WITH NO CLAIM AS TO ITS SUITABILITY FOR ANY PURPOSE.  IN NO EVENT
00029 // SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM WHATSOEVER MADE IN CONNECTION
00030 // TO THIS SOFTWARE.
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         // the basis in which the motion is created
00060         const Transform* basis ;
00061 
00062         // for each motion we keep the transform from which it came
00063         impl_Transform motion_basis ;
00064 
00065         // mini frame hierarchy
00066         impl_Transform frame ;
00067 
00068         // whether motion is on
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 }}} // namespace esve::components::dimn
00152 
00153 #include <esve/components/dimn/Differential_Motion_Handler.template.cxx>
00154 
00155 #endif
00156 

Generated on Tue May 30 11:40:52 2006 for esve by doxygen 1.3.4