00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "DisplayFltkMenu.h"
00022 #include "Command.h"
00023 #include "VMDApp.h"
00024 #include "DisplayDevice.h"
00025 #include "FL/forms.H"
00026
00027 DisplayFltkMenu::DisplayFltkMenu(VMDApp *anApp)
00028 : VMDFltkMenu("display", "Display Settings", anApp) {
00029 make_window();
00030 update_settings();
00031 command_wanted(Command::DISP_EYESEP);
00032 command_wanted(Command::DISP_FOCALLEN);
00033 command_wanted(Command::DISP_CLIP);
00034 command_wanted(Command::DISP_SCRHEIGHT);
00035 command_wanted(Command::DISP_SCRDIST);
00036 command_wanted(Command::DISP_CUEMODE);
00037 command_wanted(Command::DISP_CUESTART);
00038 command_wanted(Command::DISP_CUEEND);
00039 command_wanted(Command::DISP_CUEDENSITY);
00040 command_wanted(Command::DISP_AO);
00041 command_wanted(Command::DISP_AO_AMBIENT);
00042 command_wanted(Command::DISP_AO_DIRECT);
00043 command_wanted(Command::DISP_DOF);
00044 command_wanted(Command::DISP_DOF_FNUMBER);
00045 command_wanted(Command::DISP_DOF_FOCALDIST);
00046 }
00047
00048
00049 static void nearclip_cb(Fl_Widget *w, void *v) {
00050 float value = (float)((Fl_Valuator *)w)->value();
00051 VMDApp *app = (VMDApp *)v;
00052 app->display_set_nearclip(value, 0);
00053 }
00054 static void farclip_cb(Fl_Widget *w, void *v) {
00055 float value = (float)((Fl_Valuator *)w)->value();
00056 VMDApp *app = (VMDApp *)v;
00057 app->display_set_farclip(value, 0);
00058 }
00059 static void eyesep_cb(Fl_Widget *w, void *v) {
00060 float value = (float)((Fl_Valuator *)w)->value();
00061 VMDApp *app = (VMDApp *)v;
00062 app->display_set_eyesep(value);
00063 }
00064 static void focal_cb(Fl_Widget *w, void *v) {
00065 float value = (float)((Fl_Valuator *)w)->value();
00066 VMDApp *app = (VMDApp *)v;
00067 app->display_set_focallen(value);
00068 }
00069 static void screenh_cb(Fl_Widget *w, void *v) {
00070 float value = (float)((Fl_Valuator *)w)->value();
00071 VMDApp *app = (VMDApp *)v;
00072 app->display_set_screen_height(value);
00073 }
00074 static void screend_cb(Fl_Widget *w, void *v) {
00075 float value = (float)((Fl_Valuator *)w)->value();
00076 VMDApp *app = (VMDApp *)v;
00077 app->display_set_screen_distance(value);
00078 }
00079
00080
00081 static void cuemode_cb(Fl_Widget *w, void *v) {
00082 const char *mode = ((Fl_Choice *)w)->text();
00083 VMDApp *app = (VMDApp *)v;
00084 app->depthcue_set_mode(mode);
00085 }
00086 static void cuestart_cb(Fl_Widget *w, void *v) {
00087 float value = (float)((Fl_Valuator *)w)->value();
00088 VMDApp *app = (VMDApp *)v;
00089 app->depthcue_set_start(value);
00090 }
00091 static void cueend_cb(Fl_Widget *w, void *v) {
00092 float value = (float)((Fl_Valuator *)w)->value();
00093 VMDApp *app = (VMDApp *)v;
00094 app->depthcue_set_end(value);
00095 }
00096 static void cuedensity_cb(Fl_Widget *w, void *v) {
00097 float value = (float)((Fl_Valuator *)w)->value();
00098 VMDApp *app = (VMDApp *)v;
00099 app->depthcue_set_density(value);
00100 }
00101
00102
00103 static void shadowmode_cb(Fl_Widget *w, void *v) {
00104 const char *mode = ((Fl_Choice *)w)->text();
00105 VMDApp *app = (VMDApp *)v;
00106 if (!strcmp(mode, "On")) {
00107 app->display_set_shadows(1);
00108 } else {
00109 app->display_set_shadows(0);
00110 }
00111 }
00112
00113
00114 static void aomode_cb(Fl_Widget *w, void *v) {
00115 const char *mode = ((Fl_Choice *)w)->text();
00116 VMDApp *app = (VMDApp *)v;
00117 if (!strcmp(mode, "On")) {
00118 app->display_set_ao(1);
00119 } else {
00120 app->display_set_ao(0);
00121 }
00122 }
00123 static void aoambient_cb(Fl_Widget *w, void *v) {
00124 float value = (float)((Fl_Valuator *)w)->value();
00125 VMDApp *app = (VMDApp *)v;
00126 app->display_set_ao_ambient(value);
00127 }
00128 static void aodirect_cb(Fl_Widget *w, void *v) {
00129 float value = (float)((Fl_Valuator *)w)->value();
00130 VMDApp *app = (VMDApp *)v;
00131 app->display_set_ao_direct(value);
00132 }
00133
00134
00135 static void dofmode_cb(Fl_Widget *w, void *v) {
00136 const char *mode = ((Fl_Choice *)w)->text();
00137 VMDApp *app = (VMDApp *)v;
00138 if (!strcmp(mode, "On")) {
00139 app->display_set_dof(1);
00140 } else {
00141 app->display_set_dof(0);
00142 }
00143 }
00144 static void doffnumber_cb(Fl_Widget *w, void *v) {
00145 float value = (float)((Fl_Valuator *)w)->value();
00146 VMDApp *app = (VMDApp *)v;
00147 app->display_set_dof_fnumber(value);
00148 }
00149 static void doffocaldist_cb(Fl_Widget *w, void *v) {
00150 float value = (float)((Fl_Valuator *)w)->value();
00151 VMDApp *app = (VMDApp *)v;
00152 app->display_set_dof_focal_dist(value);
00153 }
00154
00155
00156 void DisplayFltkMenu::make_window() {
00157 size(235, 530);
00158 {
00159 { Fl_Counter* o = nearclip = new Fl_Counter(105, 25, 110, 25, "Near Clip");
00160 o->align(FL_ALIGN_LEFT);
00161 o->range(0.01, 1000.0);
00162 o->step(0.05);
00163 o->lstep(0.5);
00164 o->precision(2);
00165 o->callback(nearclip_cb, app);
00166 VMDFLTKTOOLTIP(o, "Set near clipping plane (OpenGL display only)")
00167 }
00168 { Fl_Counter* o = farclip = new Fl_Counter(105, 50, 110, 25, "Far Clip");
00169 o->align(FL_ALIGN_LEFT);
00170 o->range(0.01, 1000.0);
00171 o->step(0.05);
00172 o->lstep(0.5);
00173 o->precision(2);
00174 o->callback(farclip_cb, app);
00175 VMDFLTKTOOLTIP(o, "Set far clipping plane (OpenGL display only)")
00176 }
00177 { Fl_Counter* o = eyesep = new Fl_Counter(105, 75, 110, 25, "Eye Sep");
00178 o->align(FL_ALIGN_LEFT);
00179 o->range(0.0, 100.0);
00180 o->step(0.01);
00181 o->lstep(0.1);
00182 o->precision(2);
00183 o->callback(eyesep_cb, app);
00184 VMDFLTKTOOLTIP(o, "Set stereo eye separation")
00185 }
00186 { Fl_Counter* o = focal = new Fl_Counter(105, 100, 110, 25, "Focal Length");
00187 o->align(FL_ALIGN_LEFT);
00188 o->range(0.01, 1000.0);
00189 o->step(0.05);
00190 o->lstep(0.5);
00191 o->precision(2);
00192 o->callback(focal_cb, app);
00193 VMDFLTKTOOLTIP(o, "Set stereo focal point")
00194 }
00195 { Fl_Counter* o = screenh = new Fl_Counter(105, 135, 110, 25, "Screen Hgt");
00196 o->align(FL_ALIGN_LEFT);
00197 o->range(0.0, 100000.0);
00198 o->step(0.1);
00199 o->lstep(1.0);
00200 o->precision(1);
00201 o->callback(screenh_cb, app);
00202 VMDFLTKTOOLTIP(o, "Set viewing frustum height")
00203 }
00204 { Fl_Counter* o = screend = new Fl_Counter(105, 160, 110, 25, "Screen Dist");
00205 o->align(FL_ALIGN_LEFT);
00206 o->range(-100000.0, 100000.0);
00207 o->step(0.1);
00208 o->lstep(1.0);
00209 o->precision(1);
00210 o->callback(screend_cb, app);
00211 VMDFLTKTOOLTIP(o, "Set viewing frustum distance")
00212 }
00213
00214 { Fl_Choice* o = cuemode = new Fl_Choice(105, 195, 110, 25, "Cue Mode");
00215 o->color(VMDMENU_CHOOSER_BG);
00216 o->selection_color(VMDMENU_CHOOSER_SEL);
00217 o->box(FL_THIN_UP_BOX);
00218 o->align(FL_ALIGN_LEFT);
00219 o->callback(cuemode_cb, app);
00220 VMDFLTKTOOLTIP(o, "Set depth cueing mode")
00221 for (int m=0; m<app->display->num_cue_modes(); m++)
00222 cuemode->add(app->display->cue_mode_name(m));
00223 }
00224 { Fl_Counter* o = cuestart = new Fl_Counter(105, 220, 110, 25, "Cue Start");
00225 o->align(FL_ALIGN_LEFT);
00226 o->range(0.001, 1000.0);
00227 o->step(0.05);
00228 o->lstep(0.25);
00229 o->precision(2);
00230 o->callback(cuestart_cb, app);
00231 VMDFLTKTOOLTIP(o, "Set linear depth cueing starting distance")
00232 }
00233 { Fl_Counter* o = cueend = new Fl_Counter(105, 245, 110, 25, "Cue End");
00234 o->align(FL_ALIGN_LEFT);
00235 o->range(0.001, 1000.0);
00236 o->step(0.05);
00237 o->lstep(0.25);
00238 o->precision(2);
00239 o->callback(cueend_cb, app);
00240 VMDFLTKTOOLTIP(o, "Set linear depth cueing end distance")
00241 }
00242 { Fl_Counter* o = cuedensity = new Fl_Counter(105, 270, 110, 25, "Cue Density");
00243 o->align(FL_ALIGN_LEFT);
00244 o->range(0.001, 1000.0);
00245 o->step(0.05);
00246 o->lstep(0.1);
00247 o->precision(2);
00248 o->callback(cuedensity_cb, app);
00249 VMDFLTKTOOLTIP(o, "Set exponential depth cueing density")
00250 }
00251
00252 new Fl_Box(35, 305, 170, 25, "Ray Tracing Options");
00253 { Fl_Choice* o = shadowmode = new Fl_Choice(105, 330, 110, 25, "Shadows");
00254 o->color(VMDMENU_CHOOSER_BG);
00255 o->selection_color(VMDMENU_CHOOSER_SEL);
00256 o->box(FL_THIN_UP_BOX);
00257 o->align(FL_ALIGN_LEFT);
00258 o->callback(shadowmode_cb, app);
00259 VMDFLTKTOOLTIP(o, "Enable shadows in external renderers")
00260 shadowmode->add("Off");
00261 shadowmode->add("On");
00262 }
00263 { Fl_Choice* o = aomode = new Fl_Choice(105, 355, 110, 25, "Amb. Occl.");
00264 o->color(VMDMENU_CHOOSER_BG);
00265 o->selection_color(VMDMENU_CHOOSER_SEL);
00266 o->box(FL_THIN_UP_BOX);
00267 o->align(FL_ALIGN_LEFT);
00268 o->callback(aomode_cb, app);
00269 VMDFLTKTOOLTIP(o, "Enable ambient occlusion lighting in external renderers")
00270 aomode->add("Off");
00271 aomode->add("On");
00272 }
00273 { Fl_Counter* o = aoambient = new Fl_Counter(105, 380, 110, 25, "AO Ambient");
00274 o->align(FL_ALIGN_LEFT);
00275 o->range(0.0, 1.0);
00276 o->step(0.01);
00277 o->lstep(0.10);
00278 o->precision(2);
00279 o->callback(aoambient_cb, app);
00280 VMDFLTKTOOLTIP(o, "Ambient occlusion lighting coefficient")
00281 }
00282 { Fl_Counter* o = aodirect = new Fl_Counter(105, 405, 110, 25, "AO Direct");
00283 o->align(FL_ALIGN_LEFT);
00284 o->range(0.0, 1.0);
00285 o->step(0.01);
00286 o->lstep(0.10);
00287 o->precision(2);
00288 o->callback(aodirect_cb, app);
00289 VMDFLTKTOOLTIP(o, "Direct lighting rescaling coefficient")
00290 }
00291
00292
00293 { Fl_Choice* o = dofmode = new Fl_Choice(105, 430, 110, 25, "DoF");
00294 o->color(VMDMENU_CHOOSER_BG);
00295 o->selection_color(VMDMENU_CHOOSER_SEL);
00296 o->box(FL_THIN_UP_BOX);
00297 o->align(FL_ALIGN_LEFT);
00298 o->callback(dofmode_cb, app);
00299 VMDFLTKTOOLTIP(o, "Enable depth of field focal blur in external renderers")
00300 dofmode->add("Off");
00301 dofmode->add("On");
00302 }
00303 { Fl_Counter* o = doffnumber = new Fl_Counter(105, 455, 110, 25, "DoF f/stop");
00304 o->align(FL_ALIGN_LEFT);
00305 o->range(1.0, 500.0);
00306 o->step(0.05);
00307 o->lstep(1.0);
00308 o->precision(2);
00309 o->callback(doffnumber_cb, app);
00310 VMDFLTKTOOLTIP(o, "Depth of field focal blur aperture")
00311 }
00312 { Fl_Counter* o = doffocaldist = new Fl_Counter(105, 480, 110, 25, "DoF Foc. Dist");
00313 o->align(FL_ALIGN_LEFT);
00314 o->range(0.01, 100.0);
00315 o->step(0.01);
00316 o->lstep(0.2);
00317 o->precision(2);
00318 o->callback(doffocaldist_cb, app);
00319 VMDFLTKTOOLTIP(o, "Depth of field focal plane distance")
00320 }
00321
00322
00323 Fl_Box *box1 = new Fl_Box(10, 10, 215, 120);
00324 box1->box(FL_ENGRAVED_FRAME);
00325 Fl_Box *box2 = new Fl_Box(10, 130, 215, 65);
00326 box2->box(FL_ENGRAVED_FRAME);
00327 Fl_Box *box3 = new Fl_Box(10, 190, 215, 110);
00328 box3->box(FL_ENGRAVED_FRAME);
00329 Fl_Box *box4 = new Fl_Box(10, 300, 215, 210);
00330 box4->box(FL_ENGRAVED_FRAME);
00331 end();
00332 end();
00333 }
00334 }
00335
00336 int DisplayFltkMenu::act_on_command(int, Command *) {
00337 update_settings();
00338 return 0;
00339 }
00340
00341 void DisplayFltkMenu::update_settings() {
00342 nearclip->value(app->display->near_clip());
00343 farclip->value(app->display->far_clip());
00344 eyesep->value(app->display->eyesep());
00345 focal->value(app->display->eye_dist());
00346 screenh->value(app->display->screen_height());
00347 screend->value(app->display->distance_to_screen());
00348 const char *curmode = app->display->get_cue_mode();
00349 for (int m=0; m<cuemode->size(); m++) {
00350 if (!strcmp(curmode, cuemode->text(m))) {
00351 cuemode->value(m);
00352 if (m==0) {
00353 cuestart->activate();
00354 cueend->activate();
00355 cuedensity->deactivate();
00356 } else {
00357 cuestart->deactivate();
00358 cueend->deactivate();
00359 cuedensity->activate();
00360 }
00361 break;
00362 }
00363 }
00364 cuestart->value(app->display->get_cue_start());
00365 cueend->value(app->display->get_cue_end());
00366 cuedensity->value(app->display->get_cue_density());
00367
00368 shadowmode->value(app->display->shadows_enabled());
00369
00370 aomode->value(app->display->ao_enabled());
00371 aoambient->value(app->display->get_ao_ambient());
00372 aodirect->value(app->display->get_ao_direct());
00373 if (app->display->ao_enabled()) {
00374 aoambient->activate();
00375 aodirect->activate();
00376 } else {
00377 aoambient->deactivate();
00378 aodirect->deactivate();
00379 }
00380
00381 dofmode->value(app->display->dof_enabled());
00382 doffnumber->value(app->display->get_dof_fnumber());
00383 doffocaldist->value(app->display->get_dof_focal_dist());
00384 if (app->display->dof_enabled()) {
00385 doffnumber->activate();
00386 doffocaldist->activate();
00387 } else {
00388 doffnumber->deactivate();
00389 doffocaldist->deactivate();
00390 }
00391
00392 }
00393
00394