4 * Simple PUI wrapper around sgVec3 class
6 * Created by: Norman Vine [NHV]
7 * nhv@yahoo.com, nhv@cape.com
11 * Started 12:53 01/28/2001
15 #include "sgVec3Slider.hxx"
16 #include <simgear/sg_inlines.h>
18 class FloatSlider : public puSlider
32 FloatSlider ( int x, int y, int sz, float f, const char *title,
37 static void adj( puObject *);
40 sprintf( _text, "%05.2f", MyValue );
43 float get() { return( MyValue ); }
44 void set() { MyValue = ((2.0*maxValue) * (TmpValue - 0.5f)) - maxValue; }
46 float *getTmp() { return( &TmpValue ); }
47 void setTmp() { TmpValue += 0.5f; }
49 // double the range from -max <-> max
50 void init( float f ) {
51 Adjust = 0.5f / maxValue;
52 setValue((f * Adjust) + 0.5f);
56 void reinit() { init( origValue ); }
57 void cancel() { MyValue = TmpValue; }
58 void reset () { init( origValue ); }
62 void FloatSlider::adj( puObject *hs )
64 FloatSlider *slider = (FloatSlider *)hs->getUserData();
65 slider->getValue ( slider->getTmp() );
71 FloatSlider::FloatSlider ( int x, int y, int sz, float f, const char *title,
72 float max ) : puSlider( x, y, sz, FALSE )
79 setCBMode ( PUSLIDER_DELTA ) ;
81 strcpy ( _title, title);
83 setLabelPlace ( PUPLACE_LEFT );
85 // setLegendPlace( PUPLACE_RIGHT );
89 /***********************************************/
91 class sgVec3Slider : public puDialogBox
93 static void goAway(puObject *p_obj);
94 static void reset(puObject *p_obj);
95 static void cancel(puObject *p_obj);
103 puOneShot *ResetButton;
104 puOneShot *CancelButton;
109 sgVec3Slider ( int x, int y, sgVec3 vec,
110 const char *title = "Vector Adjuster",
111 const char *Xtitle = "Heading",
112 const char *Ytitle = "Pitch",
113 const char *Ztitle = "Radius" );
120 Vec3FromHeadingPitchRadius( Vec,
121 (HS0->get() + 90) * 2,
126 sgVec3 *getVec() { setVec(); return &Vec; };
128 sgVec3 *getStashVec() { return &SaveVec; }
130 SaveVec[2] = HS0->get();
131 SaveVec[1] = HS1->get();
132 SaveVec[0] = HS2->get();
135 FloatSlider *getHS0() { return HS0; }
136 FloatSlider *getHS1() { return HS1; }
137 FloatSlider *getHS2() { return HS2; }
139 static void adjust(puObject *p_obj);
142 sgVec3Slider::sgVec3Slider ( int x, int y, sgVec3 vec, const char *title,
145 const char *Ztitle ): puDialogBox ( x, y )
147 puFont LegendFont, LabelFont;
148 puGetDefaultFonts ( &LegendFont, &LabelFont );
152 int labelW = LabelFont.getStringWidth(Xtitle);
153 labelW = SG_MAX2( labelW, LabelFont.getStringWidth(Ytitle));
154 labelW = SG_MAX2( labelW, LabelFont.getStringWidth(Ztitle));
156 int DialogWidth = 300 + fudge + labelW;
158 sgCopyVec3(SaveVec, vec);
159 sgCopyVec3(Vec, vec);
160 strcpy( Label, title );
163 int slider_x = 70+fudge;
165 int slider_width = 240;
167 int horiz_slider_height = LabelFont.getStringHeight()
168 + LabelFont.getStringDescender()
169 + PUSTR_TGAP + PUSTR_BGAP + 5;
173 horiz_slider_height += 10;
177 85 + nSliders * horiz_slider_height );
179 setLabelPlace( PUPLACE_DEFAULT /*PUPLACE_CENTERED*/ );
182 HS2 = new FloatSlider ( slider_x, slider_y, slider_width, vec[2], Ztitle );
183 slider_y += horiz_slider_height;
185 HS1 = new FloatSlider ( slider_x, slider_y, slider_width, vec[1], Ytitle );
186 slider_y += horiz_slider_height;
188 HS0 = new FloatSlider ( slider_x, slider_y, slider_width, vec[0], Xtitle );
190 OkButton = new puOneShot ( 70+fudge, 10, 120+fudge, 50 );
191 OkButton-> setUserData( this );
192 OkButton-> setLegend ( gui_msg_OK );
193 OkButton-> makeReturnDefault ( TRUE );
194 OkButton-> setCallback ( goAway );
196 CancelButton = new puOneShot ( 130+fudge, 10, 210+fudge, 50 );
197 CancelButton-> setUserData( this );
198 CancelButton-> setLegend ( gui_msg_CANCEL );
199 CancelButton-> setCallback ( cancel );
201 ResetButton = new puOneShot ( 220+fudge, 10, 280+fudge, 50 );
202 ResetButton-> setUserData( this );
203 ResetButton-> setLegend ( gui_msg_RESET );
204 ResetButton-> setCallback ( reset );
206 FG_FINALIZE_PUI_DIALOG( this );
210 void sgVec3Slider::goAway(puObject *p_obj)
212 sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
213 FG_POP_PUI_DIALOG( me );
216 void sgVec3Slider::reset(puObject *p_obj)
218 sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
224 void sgVec3Slider::cancel(puObject *p_obj)
227 sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
228 sgVec3 *pvec = me -> getStashVec();
229 sgCopyVec3( vec, *pvec );
230 me->HS0->init(vec[2]);
231 me->HS1->init(vec[1]);
232 me->HS2->init(vec[0]);
234 FG_POP_PUI_DIALOG( me );
237 void sgVec3Slider::adjust(puObject *p_obj)
239 sgVec3Slider *me = (sgVec3Slider *)p_obj->getUserData();
240 me -> getHS0() -> adj((puObject *)me -> getHS0());
241 me -> getHS1() -> adj((puObject *)me -> getHS1());
242 me -> getHS2() -> adj((puObject *)me -> getHS2());
246 void sgVec3SliderAdjust( puObject *p_obj )
248 sgVec3Slider *me = (sgVec3Slider *)p_obj -> getUserData();
250 FG_PUSH_PUI_DIALOG( me );
253 // These are globals for now
254 static puObject *PO_vec = 0;
256 void PilotOffsetInit() {
258 sgSetVec3(v,0.0,0.0,20.0);
262 void PilotOffsetInit( sgVec3 vec )
264 // Only one of these things for now
266 sgVec3Slider *PO = new sgVec3Slider ( 200, 200, vec, "Pilot Offset" );
271 void PilotOffsetAdjust( puObject * )
276 sgVec3Slider *me = (sgVec3Slider *)PO_vec -> getUserData();
279 FG_PUSH_PUI_DIALOG( me );
282 sgVec3 *PilotOffsetGet()
287 sgVec3Slider *me = (sgVec3Slider *)PO_vec -> getUserData();
288 return( me -> getVec() );
292 // Heading == longitude of point on sphere
293 // Pitch == latitude of point on sphere
294 // Radius == radius of sphere
296 #define MIN_VIEW_OFFSET 5.0
297 void Vec3FromHeadingPitchRadius ( sgVec3 vec3, float heading, float pitch,
300 double ch, sh, cp, sp;
302 if ( heading == SG_ZERO )
309 sh = sin( (double)( heading * SG_DEGREES_TO_RADIANS )) ;
310 ch = cos( (double)( heading * SG_DEGREES_TO_RADIANS )) ;
313 if ( pitch == SG_ZERO )
320 sp = sin( (double)( pitch * SG_DEGREES_TO_RADIANS )) ;
321 cp = cos( (double)( pitch * SG_DEGREES_TO_RADIANS )) ;
324 if ( radius < MIN_VIEW_OFFSET )
325 radius = MIN_VIEW_OFFSET ;
327 vec3[2] = (SGfloat)( ch * cp ) * radius ; // X
328 vec3[1] = (SGfloat)( sh * cp ) * radius ; // Y
329 vec3[0] = (SGfloat)( sp ) * radius ; // Z