From: curt Date: Mon, 29 Jan 2001 05:08:00 +0000 (+0000) Subject: Added a GUI vec3 pilot offset control contributed by Norman Vine. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=97f526f7a6ac76f2740265c00e44597345cafdf6;p=flightgear.git Added a GUI vec3 pilot offset control contributed by Norman Vine. --- diff --git a/src/GUI/Makefile.am b/src/GUI/Makefile.am index 22ec44d2f..7165a5654 100644 --- a/src/GUI/Makefile.am +++ b/src/GUI/Makefile.am @@ -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 diff --git a/src/GUI/gui.cxx b/src/GUI/gui.cxx index 7d08b547a..d86fd3e69 100644 --- a/src/GUI/gui.cxx +++ b/src/GUI/gui.cxx @@ -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 index 000000000..602031f6a --- /dev/null +++ b/src/GUI/sgVec3Slider.cxx @@ -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 index 000000000..06739cd20 --- /dev/null +++ b/src/GUI/sgVec3Slider.hxx @@ -0,0 +1,21 @@ +#ifndef _VEC3_SLIDER_H +#define _VEC3_SLIDER_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#ifdef HAVE_WINDOWS_H +#include +#endif + +#include +#include "gui.h" + +void PilotOffsetInit( sgVec3 vec ); +void PilotOffsetAdjust( puObject * ); +//void PilotOffsetGet( float *po ); +sgVec3 *PilotOffsetGet(); +#endif // _VEC3_SLIDER_H diff --git a/src/Main/main.cxx b/src/Main/main.cxx index 34edfd7fb..419614ed3 100644 --- a/src/Main/main.cxx +++ b/src/Main/main.cxx @@ -81,6 +81,7 @@ #include #include +#include #include #ifdef FG_NETWORK_OLK #include @@ -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(),