00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <eventHandler.h>
00020 #include <projtexShader.h>
00021 #include <shaderTransition.h>
00022 #include <renderRelation.h>
00023 #include <nodeRelation.h>
00024 #include <chancfg.h>
00025 #include <string>
00026 #include <texGenTransition.h>
00027 #include <colorBlendTransition.h>
00028 #include <colorMaskTransition.h>
00029 #include <textureTransition.h>
00030 #include <texMatrixTransition.h>
00031 #include <spotlightShader.h>
00032 #include <light.h>
00033 #include <eggLoader.h>
00034 #include <look_at.h>
00035 #include <transformTransition.h>
00036 #include <geomNode.h>
00037 #include <lightTransition.h>
00038 #include <spotlight.h>
00039 #include <projtexShadower.h>
00040 #include <spheretexHighlighter.h>
00041 #include <spheretexReflector.h>
00042 #include <trackball.h>
00043 #include <transform2sg.h>
00044 #include <mouse.h>
00045 #include <graphicsWindow.h>
00046 #include <planarReflector.h>
00047 #include <stencilTransition.h>
00048 #include <plane.h>
00049 #include <renderBuffer.h>
00050 #include <outlineShader.h>
00051 #include <pt_NamedNode.h>
00052 #include <dataRelation.h>
00053 #include <geomLine.h>
00054
00055 #include <dconfig.h>
00056
00057 #ifdef SHADER_VERBOSE
00058 #include <indent.h>
00059 #endif
00060
00061 Configure(shader_test);
00062 ConfigureFn(shader_test) {
00063 }
00064
00065 PT(LensNode) tex_proj;
00066 PT(Trackball) tex_proj_trackball;
00067 PT(ProjtexShader) proj_shader;
00068 PT(ProjtexShadower) proj_shadow;
00069 PT(SpheretexShader) spheretex;
00070 PT(SpheretexHighlighter) highlight;
00071 PT(SpheretexReflector) sreflect;
00072 PT(PlanarReflector) preflect;
00073 PT(OutlineShader) outline_shader;
00074
00075 ShaderTransition shader_trans;
00076
00077 PT(Spotlight) tex_proj_spot;
00078 PT(Trackball) tex_spot_trackball;
00079 PT(SpotlightShader) spot_shader;
00080
00081 RenderRelation* room_arc;
00082 RenderRelation* spot_arc;
00083 RenderRelation* jack_arc;
00084 RenderRelation* camera_model_arc;
00085
00086 PT(LightTransition) light_transition;
00087
00088 extern PT_NamedNode render;
00089 extern NodeAttributes initial_state;
00090 extern RenderRelation* first_arc;
00091 extern PT_NamedNode lights;
00092 extern PT_NamedNode root;
00093 extern PT(GeomNode) geomnode;
00094 extern PT_NamedNode cameras;
00095 extern PT(MouseAndKeyboard) mak;
00096
00097 extern void set_alt_trackball(Node *trackball);
00098
00099 extern int framework_main(int argc, char *argv[]);
00100 extern void (*extra_display_func)();
00101 extern void (*define_keys)(EventHandler&);
00102
00103 extern PT(GraphicsWindow) main_win;
00104
00105 class SomeViz : public Shader::Visualize {
00106 public:
00107 SomeViz(void);
00108 virtual ~SomeViz(void);
00109 virtual void DisplayTexture(PT(Texture)&, Shader*);
00110 virtual void DisplayPixelBuffer(PT(PixelBuffer)&, Shader*);
00111 protected:
00112 typedef std::plist<PT(Texture) > texlist;
00113 typedef texlist::iterator texiter;
00114 typedef std::plist<PT(PixelBuffer) > pblist;
00115 typedef pblist::iterator pbiter;
00116
00117 texlist _texs;
00118 pblist _pbs;
00119 };
00120
00121 SomeViz::SomeViz(void) {}
00122
00123 SomeViz::~SomeViz(void) {}
00124
00125 void SomeViz::DisplayTexture(PT(Texture)& tex, Shader*) {
00126 if (tex->has_ram_image())
00127 _texs.push_back(tex);
00128 else {
00129 GraphicsStateGuardian* g = main_win->get_gsg();
00130 PT(PixelBuffer) pb(new PixelBuffer);
00131 g->texture_to_pixel_buffer(tex->prepare(g), pb);
00132 _pbs.push_back(pb);
00133 }
00134 }
00135
00136 void SomeViz::DisplayPixelBuffer(PT(PixelBuffer)& pb, Shader*) {
00137 _pbs.push_back(pb);
00138 }
00139
00140 class Oldviz : public SomeViz {
00141 public:
00142 Oldviz(PT(GraphicsWindow)&);
00143 virtual ~Oldviz(void);
00144 virtual void Flush(void);
00145 protected:
00146 PT(GraphicsWindow) _w;
00147 };
00148
00149 Oldviz::Oldviz(PT(GraphicsWindow)& win) : _w(win) {}
00150
00151 Oldviz::~Oldviz(void) {}
00152
00153 void Oldviz::Flush(void) {
00154 GraphicsStateGuardian* g = _w->get_gsg();
00155 const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00156 PT(DisplayRegion) d(_w->make_scratch_display_region(256, 256));
00157
00158 for (texiter i=_texs.begin(); i!=_texs.end(); ++i)
00159 (*i)->draw(g, d, r);
00160 for (pbiter j=_pbs.begin(); j!=_pbs.end(); ++j)
00161 (*j)->draw(g, d, r);
00162 _texs.erase(_texs.begin(), _texs.end());
00163 _pbs.erase(_pbs.begin(), _pbs.end());
00164 }
00165
00166 class Viztex : public SomeViz {
00167 public:
00168 Viztex(PT(GraphicsPipe)&);
00169 virtual ~Viztex(void);
00170 virtual void Flush(void);
00171 protected:
00172 typedef std::plist< PT(GraphicsWindow) > winlist;
00173 typedef winlist::iterator winiter;
00174
00175 winlist _wins;
00176 PT(GraphicsPipe) _pipe;
00177 };
00178
00179 Viztex::Viztex(PT(GraphicsPipe)& p) : _pipe(p) {}
00180
00181 Viztex::~Viztex(void) {}
00182
00183 void Viztex::Flush(void) {
00184 winiter _witer = _wins.begin();
00185
00186 for (texiter i=_texs.begin(); i!=_texs.end(); ++i) {
00187 GraphicsWindow* w;
00188
00189 if (_witer == _wins.end()) {
00190 ChanCfgOverrides override;
00191
00192 override.setField(ChanCfgOverrides::Mask,
00193 ((unsigned int)(W_SINGLE)));
00194 override.setField(ChanCfgOverrides::Title, "Multipass partial");
00195 override.setField(ChanCfgOverrides::SizeX, 256);
00196 override.setField(ChanCfgOverrides::SizeY, 256);
00197 override.setField(ChanCfgOverrides::Cameras, false);
00198
00199 w = ChanConfig(_pipe, "single", (Node *)NULL, render, override);
00200
00201 _wins.push_back(w);
00202 } else {
00203 w = *_witer;
00204 ++_witer;
00205 }
00206 GraphicsStateGuardian* g = w->get_gsg();
00207 const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00208 PT(DisplayRegion) d(w->make_scratch_display_region(w->get_width(),
00209 w->get_height()));
00210
00211 (*i)->draw(g, d, r);
00212 }
00213 for (pbiter j=_pbs.begin(); j!=_pbs.end(); ++j) {
00214 GraphicsWindow* w;
00215
00216 if (_witer == _wins.end()) {
00217 ChanCfgOverrides override;
00218
00219 override.setField(ChanCfgOverrides::Mask,
00220 ((unsigned int)(W_SINGLE)));
00221 override.setField(ChanCfgOverrides::Title, "Multipass partial");
00222 override.setField(ChanCfgOverrides::SizeX, 256);
00223 override.setField(ChanCfgOverrides::SizeY, 256);
00224 override.setField(ChanCfgOverrides::Cameras, false);
00225
00226 w = ChanConfig(_pipe, "single", cameras, render, override);
00227
00228 _wins.push_back(w);
00229 } else {
00230 w = *_witer;
00231 ++_witer;
00232 }
00233 GraphicsStateGuardian* g = w->get_gsg();
00234 const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00235 PT(DisplayRegion) d(w->make_scratch_display_region(w->get_width(),
00236 w->get_height()));
00237
00238 (*j)->draw(g, d, r);
00239 }
00240 _texs.erase(_texs.begin(), _texs.end());
00241 _pbs.erase(_pbs.begin(), _pbs.end());
00242 }
00243
00244 class Tiledviz : public Viztex {
00245 public:
00246 Tiledviz(PT(GraphicsPipe)&);
00247 virtual ~Tiledviz(void);
00248 virtual void Flush(void);
00249 };
00250
00251 Tiledviz::Tiledviz(PT(GraphicsPipe)& p) : Viztex(p) {}
00252
00253 Tiledviz::~Tiledviz(void) {}
00254
00255 void Tiledviz::Flush(void) {
00256 int count = 0;
00257
00258 int layer_count = 0;
00259 winiter _witer = _wins.begin();
00260
00261 #ifdef SHADER_VERBOSE
00262 int _level = 2;
00263 if (!_texs.empty())
00264 {
00265 nout << "Tiledvid::Flush:" << endl;
00266 }
00267 #endif
00268
00269 #ifdef SHADER_VERBOSE
00270 if (!_texs.empty())
00271 {
00272 indent(nout, _level) << "TexList Loop" << endl;
00273 }
00274 _level += 2;
00275 #endif
00276 for (texiter texi=_texs.begin(); texi!=_texs.end(); ++texi) {
00277 GraphicsWindow* w;
00278 DisplayRegion* d;
00279
00280 if (_witer == _wins.end()) {
00281 ChanCfgOverrides override;
00282
00283 override.setField(ChanCfgOverrides::Mask,
00284 ((unsigned int)(W_SINGLE)));
00285 override.setField(ChanCfgOverrides::Title, "Multipass partial");
00286 override.setField(ChanCfgOverrides::SizeX, 512);
00287 override.setField(ChanCfgOverrides::SizeY, 512);
00288 override.setField(ChanCfgOverrides::Cameras, false);
00289
00290 w = ChanConfig(_pipe, "multipass-tile", cameras, render, override);
00291
00292 _wins.push_back(w);
00293 _witer = --(_wins.end());
00294 } else
00295 w = *_witer;
00296
00297 int dridx;
00298 GraphicsStateGuardian* g = w->get_gsg();
00299 GraphicsChannel *chan = w->get_channel(0);
00300
00301 GraphicsLayer *layer = chan->get_layer(layer_count);
00302 const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00303
00304
00305
00306 #ifdef SHADER_VERBOSE
00307 indent(nout, _level) << "Getting display region " << count
00308 << " from graphics layer" << endl;
00309 #endif
00310 d = layer->get_dr(count);
00311 (*texi)->draw(g, d, r);
00312 ++count;
00313 if (count == layer->get_num_drs()) {
00314 count = 0;
00315 ++layer_count;
00316 }
00317
00318 if (layer_count == chan->get_num_layers())
00319 {
00320 layer_count = 0;
00321 ++_witer;
00322 }
00323 }
00324 #ifdef SHADER_VERBOSE
00325 _level -= 2;
00326 #endif
00327 for (pbiter pbi=_pbs.begin(); pbi!=_pbs.end(); ++pbi) {
00328 GraphicsWindow* w;
00329 DisplayRegion* d;
00330
00331 if (_witer == _wins.end()) {
00332 ChanCfgOverrides override;
00333
00334 override.setField(ChanCfgOverrides::Mask,
00335 ((unsigned int)(W_SINGLE)));
00336 override.setField(ChanCfgOverrides::Title, "Multipass partial");
00337 override.setField(ChanCfgOverrides::SizeX, 512);
00338 override.setField(ChanCfgOverrides::SizeY, 512);
00339 override.setField(ChanCfgOverrides::Cameras, false);
00340
00341 w = ChanConfig(_pipe, "multipass-tile", cameras, render, override);
00342
00343 _wins.push_back(w);
00344 _witer = --(_wins.end());
00345 } else
00346 w = *_witer;
00347
00348 int dridx;
00349 GraphicsStateGuardian* g = w->get_gsg();
00350 GraphicsChannel *chan = w->get_channel(0);
00351
00352 GraphicsLayer *layer = chan->get_layer(0);
00353 const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00354
00355
00356
00357 d = layer->get_dr(count);
00358
00359 (*pbi)->draw(g, d, r);
00360 ++count;
00361 if (count == 16) {
00362 count = 0;
00363 ++_witer;
00364 }
00365 }
00366 _texs.erase(_texs.begin(), _texs.end());
00367 _pbs.erase(_pbs.begin(), _pbs.end());
00368 }
00369
00370
00371 void shader_display_func(void) {
00372 Shader::Visualize* v = Shader::get_viz();
00373 if (v != (Shader::Visualize*)0L)
00374 v->Flush();
00375 }
00376
00377 void event_p(CPT_Event) {
00378
00379 static bool projtex_mode = false;
00380
00381 projtex_mode = !projtex_mode;
00382 if (!projtex_mode) {
00383
00384 clear_shader(room_arc, proj_shader);
00385 clear_shader(first_arc, proj_shader);
00386 clear_shader(jack_arc, proj_shader);
00387
00388 set_alt_trackball(NULL);
00389
00390 } else {
00391
00392 set_shader(room_arc, proj_shader);
00393 set_shader(first_arc, proj_shader);
00394 set_shader(jack_arc, proj_shader);
00395
00396 set_alt_trackball(tex_proj_trackball);
00397 }
00398 }
00399
00400 void event_s(CPT_Event) {
00401
00402 static bool projtexspot_mode = false;
00403
00404 projtexspot_mode = !projtexspot_mode;
00405 if (!projtexspot_mode) {
00406
00407 clear_shader(room_arc, spot_shader);
00408 set_alt_trackball(NULL);
00409
00410 } else {
00411
00412 set_shader(room_arc, spot_shader);
00413 set_alt_trackball(tex_spot_trackball);
00414 }
00415 }
00416
00417 void event_d(CPT_Event) {
00418
00419 static bool projtex_shadow_mode = false;
00420
00421 projtex_shadow_mode = !projtex_shadow_mode;
00422 if (!projtex_shadow_mode) {
00423
00424 clear_shader(room_arc, proj_shadow);
00425 set_alt_trackball(NULL);
00426
00427 } else {
00428 set_shader(room_arc, proj_shadow);
00429 set_alt_trackball(tex_spot_trackball);
00430 }
00431 }
00432
00433 void event_h(CPT_Event) {
00434
00435 static bool highlight_mode = false;
00436
00437 highlight_mode = !highlight_mode;
00438 if (!highlight_mode) {
00439
00440 clear_shader(first_arc, highlight);
00441
00442 } else {
00443 set_shader(first_arc, highlight);
00444 }
00445 }
00446
00447 void event_e(CPT_Event) {
00448
00449 static bool spheretex_mode = false;
00450
00451 spheretex_mode = !spheretex_mode;
00452 if (!spheretex_mode) {
00453
00454 clear_shader(first_arc, spheretex);
00455
00456 } else {
00457
00458 set_shader(first_arc, spheretex);
00459 }
00460 }
00461
00462 void event_m(CPT_Event) {
00463
00464 static bool sphere_reflect_mode = false;
00465
00466 sphere_reflect_mode = !sphere_reflect_mode;
00467 if (!sphere_reflect_mode) {
00468
00469 clear_shader(first_arc, sreflect);
00470
00471 } else {
00472
00473 set_shader(first_arc, sreflect);
00474 }
00475 }
00476
00477 void event_r(CPT_Event) {
00478
00479 static bool plane_reflect_mode = false;
00480
00481 plane_reflect_mode = !plane_reflect_mode;
00482 if (!plane_reflect_mode) {
00483
00484 clear_shader(first_arc, preflect);
00485
00486 } else {
00487
00488 set_shader(first_arc, preflect);
00489 }
00490 }
00491
00492 void event_n(CPT_Event) {
00493
00494 static bool spotlight_on = false;
00495 spotlight_on = !spotlight_on;
00496 if (!spotlight_on) {
00497 light_transition->set_off(tex_proj_spot.p());
00498 set_alt_trackball(NULL);
00499 } else {
00500 light_transition->set_on(tex_proj_spot.p());
00501 set_alt_trackball(tex_spot_trackball);
00502 }
00503 }
00504
00505 void event_o(CPT_Event) {
00506
00507 static bool outline_mode = false;
00508
00509 outline_mode = !outline_mode;
00510 if (!outline_mode) {
00511
00512 clear_shader(first_arc, outline_shader);
00513
00514 } else {
00515 set_shader(first_arc, outline_shader);
00516 }
00517 }
00518
00519 void shader_keys(EventHandler &eh) {
00520 eh.add_hook("p", event_p);
00521 eh.add_hook("s", event_s);
00522 eh.add_hook("d", event_d);
00523 eh.add_hook("h", event_h);
00524 eh.add_hook("e", event_e);
00525 eh.add_hook("m", event_m);
00526 eh.add_hook("r", event_r);
00527 eh.add_hook("n", event_n);
00528 eh.add_hook("o", event_o);
00529
00530 LPoint3f center_pos = LPoint3f::origin();
00531
00532
00533
00534 Texture* tex = new Texture;
00535 tex->read("smiley.rgba");
00536 tex->set_name("smiley.rgba");
00537
00538
00539 tex_proj = new LensNode("texture_projector");
00540 RenderRelation* proj_arc = new RenderRelation(render, tex_proj);
00541
00542
00543 tex_proj_trackball = new Trackball("tex_proj_trackball");
00544 tex_proj_trackball->set_invert(false);
00545 tex_proj_trackball->set_rel_to(cameras);
00546 Transform2SG *tball2cam = new Transform2SG("tball2cam");
00547 tball2cam->set_arc(proj_arc);
00548 new DataRelation(tex_proj_trackball, tball2cam);
00549
00550
00551 LMatrix4f proj_mat;
00552 LPoint3f proj_pos = LPoint3f::rfu(2., 3., 8.);
00553 LVector3f fwd_vec = proj_pos - center_pos;
00554 look_at(proj_mat, -fwd_vec);
00555 proj_mat.set_row(3, proj_pos);
00556 tex_proj_trackball->set_mat(proj_mat);
00557 proj_arc->set_transition(new TransformTransition(proj_mat));
00558
00559
00560 proj_shader = new ProjtexShader(tex);
00561 proj_shader->add_frustum(tex_proj);
00562
00563 #define DISPLAY_TEXPROJFRUST
00564 #ifdef DISPLAY_TEXPROJFRUST
00565
00566 PT(Geom) proj_geom =
00567 tex_proj->get_lens()->make_geometry();
00568 GeomNode* proj_geom_node = new GeomNode("proj_geometry");
00569
00570
00571 proj_geom_node->add_geom(proj_geom);
00572 RenderRelation *prr = new RenderRelation(tex_proj, proj_geom_node);
00573 LightTransition *plt = new LightTransition(LightTransition::all_off());
00574 prr->set_transition(plt);
00575 #endif
00576
00577
00578 tex_proj_spot = new Spotlight("tex_proj_spotlight");
00579 spot_arc = new RenderRelation(render, tex_proj_spot, 10);
00580
00581
00582 tex_spot_trackball = new Trackball("tex_spot_trackball");
00583 tex_spot_trackball->set_invert(false);
00584 tex_spot_trackball->set_rel_to(cameras);
00585 tball2cam = new Transform2SG("tball2cam");
00586 tball2cam->set_arc(spot_arc);
00587 new DataRelation(tex_spot_trackball, tball2cam);
00588
00589
00590 LMatrix4f spot_mat;
00591 LPoint3f spot_pos = LPoint3f::rfu(-4., -3., 8.);
00592 LVector3f spot_vec = spot_pos - center_pos;
00593 look_at(spot_mat, -spot_vec);
00594 spot_mat.set_row(3, spot_pos);
00595 tex_spot_trackball->set_mat(spot_mat);
00596 spot_arc->set_transition(new TransformTransition(spot_mat));
00597
00598
00599 spot_shader = new SpotlightShader;
00600 spot_shader->add_frustum(tex_proj_spot);
00601
00602 #define DISPLAY_TEXPROJSPOTFRUST
00603 #ifdef DISPLAY_TEXPROJSPOTFRUST
00604
00605 Colorf color_red(1., 0., 0., 1.);
00606 PT(Geom) frust_geom =
00607 tex_proj_spot->get_lens()->make_geometry(color_red);
00608 GeomNode* frust_geom_node = new GeomNode("frustum_geometry");
00609
00610
00611 frust_geom_node->add_geom(frust_geom);
00612 RenderRelation *rr = new RenderRelation(tex_proj_spot, frust_geom_node);
00613 LightTransition *lt = new LightTransition(LightTransition::all_off());
00614 rr->set_transition(lt);
00615 #endif
00616
00617 #ifdef DISPLAY_SHAFT
00618
00619 NamedNode* shaft = tex_proj_spot->make_geometry(0.05, 8.0, 36);
00620 new RenderRelation(tex_proj_spot, shaft, 10);
00621 #endif
00622
00623
00624 Planef p(LVector3f(0., 0., 1.), LVector3f(0., 0., -10.));
00625 PlaneNode* plane_node = new PlaneNode;
00626 plane_node->set_plane(p);
00627 preflect = new PlanarReflector(plane_node);
00628
00629
00630 proj_shadow = new ProjtexShadower;
00631 proj_shadow->add_frustum(tex_proj_spot);
00632 if (root != (NamedNode *)NULL) {
00633 proj_shadow->add_caster(root);
00634 preflect->add_caster(root);
00635 } else if (geomnode != (GeomNode *)NULL) {
00636 proj_shadow->add_caster(geomnode);
00637 preflect->add_caster(geomnode);
00638 }
00639
00640
00641 spheretex = new SpheretexShader(tex);
00642
00643
00644 highlight = new SpheretexHighlighter;
00645 highlight->add_frustum(tex_proj_spot);
00646
00647
00648 sreflect = new SpheretexReflector;
00649 sreflect->add_frustum(tex_proj_spot);
00650
00651
00652 outline_shader = new OutlineShader;
00653
00654
00655 PT_NamedNode room = loader.load_sync("big-room.egg");
00656 if (room != (NamedNode *)NULL) {
00657 room_arc = new RenderRelation(render, room, 20);
00658
00659 sreflect->add_caster(room);
00660 new RenderRelation(room, plane_node);
00661 }
00662
00663
00664 PT_NamedNode jack = loader.load_sync("jack.egg");
00665 if (jack != (NamedNode *)NULL) {
00666 jack_arc = new RenderRelation(render, jack);
00667 LMatrix4f jack_mat = LMatrix4f::ident_mat();
00668 LPoint3f jack_pos = LPoint3f::rfu(-2., -2., 2.);
00669 jack_mat.set_row(3, jack_pos);
00670 jack_arc->set_transition(new TransformTransition(jack_mat));
00671
00672 sreflect->add_caster(jack);
00673 proj_shadow->add_caster(jack);
00674 preflect->add_caster(jack);
00675 }
00676
00677
00678 PT_NamedNode camera_model = loader.load_sync("camera.egg");
00679 if (camera_model != (NamedNode *)NULL) {
00680 camera_model_arc = new RenderRelation(cameras, camera_model);
00681
00682 sreflect->add_caster(camera_model);
00683 proj_shadow->add_caster(camera_model);
00684 preflect->add_caster(camera_model);
00685 }
00686
00687
00688 light_transition = new LightTransition;
00689 if (first_arc != (NodeRelation *)NULL) {
00690 first_arc->set_transition(light_transition);
00691 }
00692 if (jack_arc != (NodeRelation *)NULL) {
00693 jack_arc->set_transition(light_transition);
00694 }
00695
00696
00697 Shader::Visualize* v = Shader::get_viz();
00698 std::string viztype = shader_test.GetString("multipass-viz", "none");
00699 if (viztype == "old-style") {
00700 PT(GraphicsWindow) w(main_win);
00701 v = new Oldviz(w);
00702 } else if (viztype == "new-single") {
00703 PT(GraphicsPipe) p(((GraphicsPipe*)(main_win->get_pipe())));
00704 v = new Viztex(p);
00705 } else if (viztype == "new-tile") {
00706 PT(GraphicsPipe) p(((GraphicsPipe*)(main_win->get_pipe())));
00707 v = new Tiledviz(p);
00708 }
00709 Shader::set_viz(v);
00710 }
00711
00712 int main(int argc, char *argv[]) {
00713 extra_display_func = &shader_display_func;
00714 define_keys = &shader_keys;
00715 return framework_main(argc, argv);
00716 }
00717
00718
00719
00720
00721