]> git.mxchange.org Git - flightgear.git/commitdiff
Added a GUI vec3 pilot offset control contributed by Norman Vine.
authorcurt <curt>
Mon, 29 Jan 2001 05:08:00 +0000 (05:08 +0000)
committercurt <curt>
Mon, 29 Jan 2001 05:08:00 +0000 (05:08 +0000)
src/GUI/Makefile.am
src/GUI/gui.cxx
src/GUI/sgVec3Slider.cxx [new file with mode: 0644]
src/GUI/sgVec3Slider.hxx [new file with mode: 0644]
src/Main/main.cxx

index 22ec44d2fe61a8240c2bc209676dfe2e9563aba8..7165a56543c1c97183bcc9b3bca9eba155a104db 100644 (file)
@@ -6,6 +6,7 @@ libGUI_a_SOURCES = \
        gui_local.cxx gui_local.hxx \
        mouse.cxx \
        net_dlg.cxx net_dlg.hxx \
+       sgVec3Slider.cxx sgVec3Slider.hxx \
        trackball.c trackball.h
 
 INCLUDES += -I$(top_srcdir) -I$(top_srcdir)/src
index 7d08b547a7a0ed6c373f8caee5a558548173a67e..d86fd3e69b58caca1315d07802c00351bce3a8d9 100644 (file)
@@ -83,6 +83,7 @@
 #include "gui_local.hxx"
 #include "apt_dlg.hxx"
 #include "net_dlg.hxx"
+#include "sgVec3Slider.hxx"
 
 FG_USING_STD(string);
 
@@ -635,11 +636,13 @@ puCallback editSubmenuCb        [] = {
 extern void fgHUDalphaAdjust( puObject * );
 char *viewSubmenu               [] = {
     "HUD Alpha",
+    "Pilot Offset",
     /* "Cockpit View > ", "View >","------------", */
     "Toggle Panel...", NULL
 };
 puCallback viewSubmenuCb        [] = {
     fgHUDalphaAdjust,
+    PilotOffsetAdjust,
     /* notCb, notCb, NULL, */
     guiTogglePanel, NULL
 };
diff --git a/src/GUI/sgVec3Slider.cxx b/src/GUI/sgVec3Slider.cxx
new file mode 100644 (file)
index 0000000..602031f
--- /dev/null
@@ -0,0 +1,282 @@
+/**
+ *      sgVec3Slider.cxx
+ *
+ *      Simple PUI wrapper around sgVec3 class
+ *
+ *      Created by: Norman Vine [NHV]
+ *         nhv@yahoo.com, nhv@cape.com
+ *
+ *      Revision History
+ *      ---------------- 
+ *  Started 12:53 01/28/2001
+ *
+ */
+
+#include "sgVec3Slider.hxx"
+
+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 ); }
+
+};
+
+void FloatSlider::adj( puObject *hs )
+{
+        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 );
+}
+
+
+/***********************************************/
+
+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);
+};
+
+sgVec3Slider::sgVec3Slider ( int x, int y, sgVec3 vec, const char *title,
+                                                                   const char *Xtitle = "X",
+                                                                   const char *Ytitle = "Y",
+                                                                   const char *Ztitle = "Z"     )
+                                        : puDialogBox ( x, y )
+{
+        int DialogX = x;
+        int DialogY = y;
+        int fudge = 20;
+        static const int DialogWidth = 230 + fudge;
+
+        sgCopyVec3(SaveVec, vec);
+        sgCopyVec3(Vec, vec);
+        strcpy( Label, title );
+
+        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;
+
+        puFont LegendFont, LabelFont;
+        puGetDefaultFonts ( &LegendFont, &LabelFont );
+
+        int horiz_slider_height = puGetStringHeight    (&LabelFont) +
+                                                          puGetStringDescender (&LabelFont) +
+                                                          PUSTR_TGAP + PUSTR_BGAP + 5;
+
+        // HACKS
+        setUserData( this );
+        horiz_slider_height += 10;
+
+        new puFrame ( 0, 0,
+                                  DialogWidth,
+                                  85 + nSliders * horiz_slider_height );
+
+        setLabelPlace( PUPLACE_DEFAULT /*PUPLACE_CENTERED*/ );
+        setLabel( Label );
+
+        HS2 = new FloatSlider (  slider_x, slider_y, slider_width, vec[2], Ztitle );
+        slider_y += horiz_slider_height;
+
+        HS1 = new FloatSlider (  slider_x, slider_y, slider_width, vec[1], Ytitle );
+        slider_y += horiz_slider_height;
+
+        HS0 = new FloatSlider (  slider_x, slider_y, slider_width, vec[0], Xtitle );
+
+        OkButton = new puOneShot ( 10+fudge, 10, 60+fudge, 50 );
+        OkButton-> setUserData( this );
+        OkButton-> setLegend ( gui_msg_OK );
+        OkButton-> makeReturnDefault ( TRUE );
+        OkButton-> setCallback ( goAway );
+
+        CancelButton = new puOneShot ( 70+fudge, 10, 150+fudge, 50 );
+        CancelButton-> setUserData( this );
+        CancelButton-> setLegend ( gui_msg_CANCEL );
+        CancelButton-> setCallback ( cancel );
+
+        ResetButton = new puOneShot ( 160+fudge, 10, 220+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 );
+};
+
+void sgVec3Slider::reset(puObject *p_obj)
+{
+        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[0]);
+        me->HS1->init(vec[1]);
+        me->HS2->init(vec[2]);
+        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();
+};
+
+void sgVec3SliderAdjust( puObject *p_obj )
+{
+        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 vec )
+{
+        // 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 );
+}
+
+sgVec3 *PilotOffsetGet()
+{
+        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();
+        return( me -> getVec() );
+}
diff --git a/src/GUI/sgVec3Slider.hxx b/src/GUI/sgVec3Slider.hxx
new file mode 100644 (file)
index 0000000..06739cd
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef _VEC3_SLIDER_H
+#define  _VEC3_SLIDER_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <simgear/compiler.h>
+
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+
+#include <stdio.h>
+#include "gui.h"
+
+void PilotOffsetInit( sgVec3 vec );
+void PilotOffsetAdjust( puObject * );
+//void PilotOffsetGet( float *po );
+sgVec3 *PilotOffsetGet();
+#endif // _VEC3_SLIDER_H
index 34edfd7fba47480f7b89c1f4b46dac797e2b8af9..419614ed303a4fff1afd412bb1d99adbe61cdcf4 100644 (file)
@@ -81,6 +81,7 @@
 
 #include <FDM/UIUCModel/uiuc_aircraftdir.h>
 #include <GUI/gui.h>
+#include <GUI/sgVec3Slider.hxx>
 #include <Joystick/joystick.hxx>
 #ifdef FG_NETWORK_OLK
 #include <NetworkOLK/network.h>
@@ -377,7 +378,8 @@ void fgRenderFrame( void ) {
                       cur_fdm_state->get_Psi() * RAD_TO_DEG,
                       wup );
        sgVec3 npo;             // new pilot offset after rotation
-       sgXformVec3( po, po, pilot_view->get_UP() );
+        sgVec3 *pPO = PilotOffsetGet();
+       sgXformVec3( po, *pPO, pilot_view->get_UP() );
        sgXformVec3( npo, po, CXFM );
 
        chase_view->set_geod_view_pos( cur_fdm_state->get_Longitude(),