Added a GUI vec3 pilot offset control contributed by Norman Vine.
This commit is contained in:
parent
f023440a5f
commit
97f526f7a6
5 changed files with 310 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
282
src/GUI/sgVec3Slider.cxx
Normal file
282
src/GUI/sgVec3Slider.cxx
Normal file
|
@ -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() );
|
||||
}
|
21
src/GUI/sgVec3Slider.hxx
Normal file
21
src/GUI/sgVec3Slider.hxx
Normal file
|
@ -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
|
|
@ -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(),
|
||||
|
|
Loading…
Add table
Reference in a new issue