]> git.mxchange.org Git - flightgear.git/commitdiff
More work on the external view panning.
authorcurt <curt>
Fri, 13 Jul 2001 16:50:35 +0000 (16:50 +0000)
committercurt <curt>
Fri, 13 Jul 2001 16:50:35 +0000 (16:50 +0000)
src/GUI/sgVec3Slider.cxx
src/GUI/sgVec3Slider.hxx

index 20a16a81a31745ebf25fc02adbbdffcd748c9414..89204ac1cb2a847aa978d9eb91a25667f3de2c36 100644 (file)
  */
 
 #include "sgVec3Slider.hxx"
+#include <simgear/sg_inlines.h>
 
 class FloatSlider : public puSlider
 {
 
-        protected:
-                float maxValue;
-                float origValue;
-                float Adjust;
-                float MyValue;
-                float TmpValue;
-                float SaveValue;
-                char buf[8];
-                char _title[32];
-                char _text[16];
-        public:
-                FloatSlider ( int x, int y, int sz, float f, const char *title,
-                                          float max = 100.0f );
-
-                ~FloatSlider () {;}
-
-                static void adj( puObject *);
-
-                void updateText() {
-                        sprintf( _text, "%05.2f", MyValue );
-                }
-
-                float get() { return( MyValue ); }
-                void  set() { MyValue = ((2.0*maxValue) * (TmpValue - 0.5f)) - maxValue; }
-
-                float *getTmp() { return( &TmpValue ); }
-                void   setTmp() { TmpValue += 0.5f; }
-
-                // double the range from -max <-> max
-                void init( float f ) {
-                        Adjust   = 0.5f / maxValue;
-                        setValue((f * Adjust) + 0.5f);
-                        adj( this );
-                }
-
-                void reinit() { init( origValue ); }
-
-                void cancel() { MyValue = TmpValue; }
-                void reset () { init( origValue ); }
+protected:
+       float maxValue;
+       float origValue;
+       float Adjust;
+       float MyValue;
+       float TmpValue;
+       float SaveValue;
+       char buf[8];
+       char _title[32];
+       char _text[16];
+public:
+       FloatSlider ( int x, int y, int sz, float f, const char *title,
+                                 float max = 90.0f );
+
+       ~FloatSlider () {;}
+               
+       static void adj( puObject *);
+
+       void updateText() {
+               sprintf( _text, "%05.2f", MyValue );
+       }
+
+       float get() { return( MyValue ); }
+       void  set() { MyValue = ((2.0*maxValue) * (TmpValue - 0.5f)) - maxValue; }
+
+       float *getTmp() { return( &TmpValue ); }
+       void   setTmp() { TmpValue += 0.5f; }
+
+       // double the range from -max <-> max
+       void init( float f ) {
+               Adjust   = 0.5f / maxValue;
+               setValue((f * Adjust) + 0.5f);
+               adj( this );
+       }
+
+       void reinit() { init( origValue ); }
+       void cancel() { MyValue = TmpValue; }
+       void reset () { init( origValue ); }
 
 };
 
 void FloatSlider::adj( puObject *hs )
 {
-        FloatSlider *slider = (FloatSlider *)hs->getUserData();
-        slider->getValue ( slider->getTmp() );
-        slider->setTmp();
-        slider->set();
-        slider->updateText();
+       FloatSlider *slider = (FloatSlider *)hs->getUserData();
+       slider->getValue ( slider->getTmp() );
+       slider->setTmp();
+       slider->set();
+       slider->updateText();
 }
 
 FloatSlider::FloatSlider ( int x, int y, int sz, float f, const char *title,
                                                    float max ) :  puSlider( x, y, sz, FALSE )
 {
-        setUserData( this );
-        maxValue = max;
-        origValue = f;
-        init(f);
-        setDelta    ( 0.01 );
-        setCBMode   ( PUSLIDER_DELTA ) ;
-        setCallback ( adj ) ;
-        strcpy      ( _title, title);
-        setLabel    ( _title );
-        setLabelPlace ( PUPLACE_LEFT  );
-        setLegend(_text);
-        // setLegendPlace( PUPLACE_RIGHT );
+       setUserData( this );
+       maxValue = max;
+       origValue = f;
+       init(f);
+       setDelta    ( 0.01 );
+       setCBMode   ( PUSLIDER_DELTA ) ;
+       setCallback ( adj ) ;
+       strcpy      ( _title, title);
+       setLabel    ( _title );
+       setLabelPlace ( PUPLACE_LEFT  );
+       setLegend(_text);
+       // setLegendPlace( PUPLACE_RIGHT );
 }
 
 
@@ -90,193 +90,241 @@ FloatSlider::FloatSlider ( int x, int y, int sz, float f, const char *title,
 
 class sgVec3Slider : public puDialogBox
 {
-        static void goAway(puObject *p_obj);
-        static void reset(puObject *p_obj);
-        static void cancel(puObject *p_obj);
-
-        protected:
-                char Label[64];
-                FloatSlider *HS0;
-                FloatSlider *HS1;
-                FloatSlider *HS2;
-                puOneShot *OkButton;
-                puOneShot *ResetButton;
-                puOneShot *CancelButton;
-                sgVec3 Vec, SaveVec;
-        public:
-
-                sgVec3Slider ( int x, int y, sgVec3 vec,
-                                           const char *title = "Vector Adjuster",
-                                           const char *Xtitle = "X",
-                                           const char *Ytitle = "Y",
-                                           const char *Ztitle = "Z" );
-
-                ~sgVec3Slider () {;}
-
-                // ???
-                void setVec() {
-                        Vec[0] = HS2->get();
-                        Vec[1] = HS1->get();
-                        Vec[2] = HS0->get();
-                }
-
-                sgVec3 *getVec() { setVec(); return &Vec; };
-
-                sgVec3 *getStashVec() { return &SaveVec; }
-                void stashVec() { sgCopyVec3( SaveVec, Vec ); }
-
-                FloatSlider *getHS0() { return HS0; }
-                FloatSlider *getHS1() { return HS1; }
-                FloatSlider *getHS2() { return HS2; }
-
-                static void adjust(puObject *p_obj);
+       static void goAway(puObject *p_obj);
+       static void reset(puObject *p_obj);
+       static void cancel(puObject *p_obj);
+
+protected:
+       char Label[64];
+       FloatSlider *HS0;
+       FloatSlider *HS1;
+       FloatSlider *HS2;
+       puOneShot *OkButton;
+       puOneShot *ResetButton;
+       puOneShot *CancelButton;
+       sgVec3 Vec, SaveVec;
+       
+public:
+
+       sgVec3Slider ( int x, int y, sgVec3 vec,
+                                  const char *title = "Vector Adjuster",
+                                  const char *Xtitle = "Heading",
+                                  const char *Ytitle = "Pitch",
+                                  const char *Ztitle = "Radius" );
+
+       ~sgVec3Slider () {;}
+
+       // ???
+       void setVec()
+       {
+               Vec3FromHeadingPitchRadius( Vec,
+                                                                       (HS0->get() + 90) * 2,
+                                                                       HS1->get(),
+                                                                       HS2->get() );
+       }
+
+       sgVec3 *getVec() { setVec(); return &Vec; };
+
+       sgVec3 *getStashVec() { return &SaveVec; }
+       void stashVec() { 
+               SaveVec[2] = HS0->get();
+               SaveVec[1] = HS1->get();
+               SaveVec[0] = HS2->get();
+       }
+
+       FloatSlider *getHS0() { return HS0; }
+       FloatSlider *getHS1() { return HS1; }
+       FloatSlider *getHS2() { return HS2; }
+
+       static void adjust(puObject *p_obj);
 };
 
 sgVec3Slider::sgVec3Slider ( int x, int y, sgVec3 vec, const char *title,
                              const char *Xtitle,
                              const char *Ytitle,
-                             const char *Ztitle )
-    : puDialogBox ( x, y )
+                             const char *Ztitle ): puDialogBox ( x, y )
 {
-        // int DialogX = x;
-        // int DialogY = y;
-        int fudge = 20;
-        static const int DialogWidth = 230 + fudge;
+       puFont LegendFont, LabelFont;
+       puGetDefaultFonts ( &LegendFont, &LabelFont );
 
-        sgCopyVec3(SaveVec, vec);
-        sgCopyVec3(Vec, vec);
-        strcpy( Label, title );
+       int fudge = 20;
 
-        static const int nSliders = 3;
-        static const int slider_x = 10+fudge;
-        int slider_y = 55;
-        static const int slider_width = 210;
-        // static const int slider_title_x = 15;
-        // static const int slider_value_x = 160;
+       int labelW = LabelFont.getStringWidth(Xtitle);
+       labelW = SG_MAX2( labelW, LabelFont.getStringWidth(Ytitle));
+       labelW = SG_MAX2( labelW, LabelFont.getStringWidth(Ztitle));
+               
+       int DialogWidth = 300 + fudge + labelW;
 
-        puFont LegendFont, LabelFont;
-        puGetDefaultFonts ( &LegendFont, &LabelFont );
+       sgCopyVec3(SaveVec, vec);
+       sgCopyVec3(Vec, vec);
+       strcpy( Label, title );
 
-        int horiz_slider_height = puGetStringHeight    (&LabelFont) +
-                                                          puGetStringDescender (&LabelFont) +
-                                                          PUSTR_TGAP + PUSTR_BGAP + 5;
+       int nSliders = 3;
+       int slider_x = 70+fudge;
+       int slider_y = 55;
+       int slider_width = 240;
 
-        // HACKS
-        setUserData( this );
-        horiz_slider_height += 10;
+       int horiz_slider_height = puGetStringHeight    (&LabelFont) +
+                                                         puGetStringDescender (&LabelFont) +
+                                                         PUSTR_TGAP + PUSTR_BGAP + 5;
 
-        new puFrame ( 0, 0,
-                                  DialogWidth,
-                                  85 + nSliders * horiz_slider_height );
+       // HACKS
+       setUserData( this );
+       horiz_slider_height += 10;
 
-        setLabelPlace( PUPLACE_DEFAULT /*PUPLACE_CENTERED*/ );
-        setLabel( Label );
+       new puFrame ( 0, 0,
+                                 DialogWidth,
+                                 85 + nSliders * horiz_slider_height );
 
-        HS2 = new FloatSlider (  slider_x, slider_y, slider_width, vec[2], Ztitle );
-        slider_y += horiz_slider_height;
+       setLabelPlace( PUPLACE_DEFAULT /*PUPLACE_CENTERED*/ );
+       setLabel( Label );
 
-        HS1 = new FloatSlider (  slider_x, slider_y, slider_width, vec[1], Ytitle );
-        slider_y += horiz_slider_height;
+       HS2 = new FloatSlider (  slider_x, slider_y, slider_width, vec[2], Ztitle );
+       slider_y += horiz_slider_height;
 
-        HS0 = new FloatSlider (  slider_x, slider_y, slider_width, vec[0], Xtitle );
+       HS1 = new FloatSlider (  slider_x, slider_y, slider_width, vec[1], Ytitle );
+       slider_y += horiz_slider_height;
 
-        OkButton = new puOneShot ( 10+fudge, 10, 60+fudge, 50 );
-        OkButton-> setUserData( this );
-        OkButton-> setLegend ( gui_msg_OK );
-        OkButton-> makeReturnDefault ( TRUE );
-        OkButton-> setCallback ( goAway );
+       HS0 = new FloatSlider (  slider_x, slider_y, slider_width, vec[0], Xtitle );
 
-        CancelButton = new puOneShot ( 70+fudge, 10, 150+fudge, 50 );
-        CancelButton-> setUserData( this );
-        CancelButton-> setLegend ( gui_msg_CANCEL );
-        CancelButton-> setCallback ( cancel );
+       OkButton = new puOneShot ( 70+fudge, 10, 120+fudge, 50 );
+       OkButton-> setUserData( this );
+       OkButton-> setLegend ( gui_msg_OK );
+       OkButton-> makeReturnDefault ( TRUE );
+       OkButton-> setCallback ( goAway );
 
-        ResetButton = new puOneShot ( 160+fudge, 10, 220+fudge, 50 );
-        ResetButton-> setUserData( this );
-        ResetButton-> setLegend ( gui_msg_RESET );
-        ResetButton-> setCallback ( reset );
+       CancelButton = new puOneShot ( 130+fudge, 10, 210+fudge, 50 );
+       CancelButton-> setUserData( this );
+       CancelButton-> setLegend ( gui_msg_CANCEL );
+       CancelButton-> setCallback ( cancel );
 
-        FG_FINALIZE_PUI_DIALOG( this );
+       ResetButton = new puOneShot ( 220+fudge, 10, 280+fudge, 50 );
+       ResetButton-> setUserData( this );
+       ResetButton-> setLegend ( gui_msg_RESET );
+       ResetButton-> setCallback ( reset );
 
+       FG_FINALIZE_PUI_DIALOG( this );
 }
 
 
 void sgVec3Slider::goAway(puObject *p_obj)
 {
-        sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
-        FG_POP_PUI_DIALOG( me );
+       sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
+       FG_POP_PUI_DIALOG( me );
 };
 
 void sgVec3Slider::reset(puObject *p_obj)
 {
-        sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
-        me->HS0->reinit();
-        me->HS1->reinit();
-        me->HS2->reinit();
+       sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
+       me->HS0->reinit();
+       me->HS1->reinit();
+       me->HS2->reinit();
 };
 
 void sgVec3Slider::cancel(puObject *p_obj)
 {
-        sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
-        sgVec3 vec;
-        sgVec3 *pvec = me -> getStashVec();
-        sgCopyVec3( vec, *pvec );
-        me->HS0->init(vec[2]);
-        me->HS1->init(vec[1]);
-        me->HS2->init(vec[0]);
-        FG_POP_PUI_DIALOG( me );
+       sgVec3 vec;
+       sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
+       sgVec3 *pvec = me -> getStashVec();
+       sgCopyVec3( vec, *pvec );
+       me->HS0->init(vec[2]);
+       me->HS1->init(vec[1]);
+       me->HS2->init(vec[0]);
+       me->setVec();
+       FG_POP_PUI_DIALOG( me );
 };
 
 void sgVec3Slider::adjust(puObject *p_obj)
 {
-        sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
-        me -> getHS0() -> adj((puObject *)me -> getHS0());
-        me -> getHS1() -> adj((puObject *)me -> getHS1());
-        me -> getHS2() -> adj((puObject *)me -> getHS2());
-        me -> setVec();
+       sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
+       me -> getHS0() -> adj((puObject *)me -> getHS0());
+       me -> getHS1() -> adj((puObject *)me -> getHS1());
+       me -> getHS2() -> adj((puObject *)me -> getHS2());
+       me -> setVec();
 };
 
 void sgVec3SliderAdjust( puObject *p_obj )
 {
-        sgVec3Slider *me = (sgVec3Slider *)p_obj -> getUserData();
-        me -> adjust( me );
-        FG_PUSH_PUI_DIALOG( me );
+       sgVec3Slider *me = (sgVec3Slider *)p_obj -> getUserData();
+       me -> adjust( me );
+       FG_PUSH_PUI_DIALOG( me );
 }
 
 // These are globals for now
 static puObject *PO_vec = 0;
 
+void PilotOffsetInit() {
+       sgVec3 v;
+       sgSetVec3(v,0.0,0.0,20.0);
+       PilotOffsetInit(v);
+}
+
 void PilotOffsetInit( sgVec3 vec )
 {
-        // Only one of these things for now
-        if( PO_vec == 0 ) {
-                sgVec3Slider *PO = new sgVec3Slider ( 200, 200, vec, "Pilot Offset" );
-                PO_vec = PO;
-        }
+       // Only one of these things for now
+       if( PO_vec == 0 ) {
+               sgVec3Slider *PO = new sgVec3Slider ( 200, 200, vec, "Pilot Offset" );
+               PO_vec = PO;
+       }
 }
 
 void PilotOffsetAdjust( puObject * )
 {
-        if( PO_vec == 0 ) {
-                sgVec3 v;
-                // we seem to need the ~quite zero terms ???
-                sgSetVec3(v,15,0.0001,0.0001);
-                PilotOffsetInit(v);
-        }
-        sgVec3Slider *me = (sgVec3Slider *)PO_vec -> getUserData();
-        me -> stashVec();
-        me -> adjust( me );
-        FG_PUSH_PUI_DIALOG( me );
+       if( PO_vec == 0 ) {
+               PilotOffsetInit();
+       }
+       sgVec3Slider *me = (sgVec3Slider *)PO_vec -> getUserData();
+       me -> stashVec();
+       me -> adjust( me );
+       FG_PUSH_PUI_DIALOG( me );
 }
 
 sgVec3 *PilotOffsetGet()
 {
-        if( PO_vec == 0 ) {
-                sgVec3 v;
-                // we seem to need the ~quite zero terms ???
-                sgSetVec3(v,25,0.0001,0.0001);
-                PilotOffsetInit(v);
-        }
-        sgVec3Slider *me = (sgVec3Slider *)PO_vec -> getUserData();
-        return( me -> getVec() );
+       if( PO_vec == 0 ) {
+               PilotOffsetInit();
+       }
+       sgVec3Slider *me = (sgVec3Slider *)PO_vec -> getUserData();
+       return( me -> getVec() );
+}
+
+
+// Heading == longitude of point on sphere
+// Pitch      == latitude of point on sphere
+// Radius  == radius of sphere
+
+#define MIN_VIEW_OFFSET 5.0
+void Vec3FromHeadingPitchRadius ( sgVec3 vec3, float heading, float pitch,
+float radius )
+{
+  double ch, sh, cp, sp;
+
+  if ( heading == SG_ZERO )
+  {
+    ch = SGD_ONE ;
+    sh = SGD_ZERO ;
+  }
+  else
+  {
+    sh = sin( (double)( heading * SG_DEGREES_TO_RADIANS )) ;
+    ch = cos( (double)( heading * SG_DEGREES_TO_RADIANS )) ;
+  }
+
+  if ( pitch == SG_ZERO )
+  {
+    cp = SGD_ONE ;
+    sp = SGD_ZERO ;
+  }
+  else
+  {
+    sp = sin( (double)( pitch * SG_DEGREES_TO_RADIANS )) ;
+    cp = cos( (double)( pitch * SG_DEGREES_TO_RADIANS )) ;
+  }
+
+  if ( radius < MIN_VIEW_OFFSET )
+         radius = MIN_VIEW_OFFSET ;
+
+  vec3[2] = (SGfloat)( ch * cp ) * radius ; // X
+  vec3[1] = (SGfloat)( sh * cp ) * radius ; // Y
+  vec3[0] = (SGfloat)(  sp ) * radius ; // Z
 }
index 06739cd2078f83ca8739815ee0c32616b0df1bcb..b6d738ad9af2d834779da7261361ad82489b9311 100644 (file)
 #include <stdio.h>
 #include "gui.h"
 
+void PilotOffsetInit();
 void PilotOffsetInit( sgVec3 vec );
 void PilotOffsetAdjust( puObject * );
+void Vec3FromHeadingPitchRadius( sgVec3 vec3, float heading, float pitch, float radius );
 //void PilotOffsetGet( float *po );
 sgVec3 *PilotOffsetGet();
+
 #endif // _VEC3_SLIDER_H