Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

panda/src/testbed/shader_test.cxx

Go to the documentation of this file.
00001 // Filename: shader_test.cxx
00002 // Created by:  
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
00008 //
00009 // All use of this software is subject to the terms of the Panda 3d
00010 // Software license.  You should have received a copy of this license
00011 // along with this source code; you will also find a current copy of
00012 // the license at http://www.panda3d.org/license.txt .
00013 //
00014 // To contact the maintainers of this program write to
00015 // panda3d@yahoogroups.com .
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       //JMC: Addeded cameras and render for parameters of ChanConfig
00199       w = ChanConfig(_pipe, "single", (Node *)NULL, render, override);
00200       //JMC: Removed set_active calls to channels
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     // g->prepare_display_region(d);
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       //JMC: Addeded cameras and render for parameters of ChanConfig
00226       w = ChanConfig(_pipe, "single", cameras, render, override);
00227        //JMC: Removed set_active calls to channels
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     // g->prepare_display_region(d);
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   //JMC: Added layer count
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       //JMC: Addeded cameras and render for parameters of ChanConfig
00290       w = ChanConfig(_pipe, "multipass-tile", cameras, render, override);
00291       //JMC: Removed set_active calls to channels
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     //JMC: Added call to get_layer
00301     GraphicsLayer *layer = chan->get_layer(layer_count);
00302     const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00303     //JMC: Removed display region iterators for GraphicsChannel.  They
00304     //no longer exist.
00305     //JMC: Added call to get_dr
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       //JMC: Addeded cameras and render for parameters of ChanConfig
00341       w = ChanConfig(_pipe, "multipass-tile", cameras, render, override);
00342       //JMC: Removed set_active calls to channels
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     //JMC: Added call to get_layer
00352     GraphicsLayer *layer = chan->get_layer(0);
00353     const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00354     //JMC: Removed display region iterators for GraphicsChannel.  They
00355     //no longer exist.
00356     //JMC: Added call to get_dr
00357     d = layer->get_dr(count);
00358     // g->prepare_display_region(d);
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 // nothing extra to do for either of these
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   // The "p" key was pressed.  Toggle projected texture.
00379   static bool projtex_mode = false;
00380 
00381   projtex_mode = !projtex_mode;
00382   if (!projtex_mode) {
00383     // Set the normal mode on the render arc.
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     // Set an override on the initial state.
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   // The "s" key was pressed.  Toggle projected texture spotlight.
00402   static bool projtexspot_mode = false;
00403 
00404   projtexspot_mode = !projtexspot_mode;
00405   if (!projtexspot_mode) {
00406     // Set the normal mode on the render arc.
00407     clear_shader(room_arc, spot_shader);
00408     set_alt_trackball(NULL);
00409 
00410   } else {
00411     // Set an override on the initial state.
00412     set_shader(room_arc, spot_shader);
00413     set_alt_trackball(tex_spot_trackball);
00414   }
00415 }
00416 
00417 void event_d(CPT_Event) {
00418   // The "d" key was pressed.  Toggle projected texture shadows.
00419   static bool projtex_shadow_mode = false;
00420 
00421   projtex_shadow_mode = !projtex_shadow_mode;
00422   if (!projtex_shadow_mode) {
00423     // Set the normal mode on the render arc.
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   // The "h" key was pressed.  Toggle highlight.
00435   static bool highlight_mode = false;
00436 
00437   highlight_mode = !highlight_mode;
00438   if (!highlight_mode) {
00439     // Set the normal mode on the render arc.
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   // The "e" key was pressed.  Toggle sphere texture.
00449   static bool spheretex_mode = false;
00450 
00451   spheretex_mode = !spheretex_mode;
00452   if (!spheretex_mode) {
00453     // Set the normal mode on the render arc.
00454     clear_shader(first_arc, spheretex);
00455 
00456   } else {
00457     // Set an override on the initial state.
00458     set_shader(first_arc, spheretex);
00459   }
00460 }
00461 
00462 void event_m(CPT_Event) {
00463   // The "m" key was pressed.  Toggle sphere reflection.
00464   static bool sphere_reflect_mode = false;
00465 
00466   sphere_reflect_mode = !sphere_reflect_mode;
00467   if (!sphere_reflect_mode) {
00468     // Set the normal mode on the render arc.
00469     clear_shader(first_arc, sreflect);
00470 
00471   } else {
00472     // Set an override on the initial state.
00473     set_shader(first_arc, sreflect);
00474   }
00475 }
00476 
00477 void event_r(CPT_Event) {
00478   // The "r" key was pressed.  Toggle planar reflection.
00479   static bool plane_reflect_mode = false;
00480 
00481   plane_reflect_mode = !plane_reflect_mode;
00482   if (!plane_reflect_mode) {
00483     // Set the normal mode on the render arc.
00484     clear_shader(first_arc, preflect);
00485 
00486   } else {
00487     // Set an override on the initial state.
00488     set_shader(first_arc, preflect);
00489   }
00490 }
00491 
00492 void event_n(CPT_Event) {
00493   // The "n" key was pressed.  Toggle the spot light.
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   // The "o" key was pressed.  Toggle outlining.
00507   static bool outline_mode = false;
00508 
00509   outline_mode = !outline_mode;
00510   if (!outline_mode) {
00511     // Set the normal mode on the render arc.
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   // Create a projected texture shader
00533   // Load a texture to project
00534   Texture* tex = new Texture;
00535   tex->read("smiley.rgba");
00536   tex->set_name("smiley.rgba");
00537 
00538   // Put the texture projector into the scene graph
00539   tex_proj = new LensNode("texture_projector");
00540   RenderRelation* proj_arc = new RenderRelation(render, tex_proj);
00541 
00542   // Create a trackball to spin this around.
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   // Raise it and aim it at the origin
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   // Create a shader for the texture projector
00560   proj_shader = new ProjtexShader(tex);
00561   proj_shader->add_frustum(tex_proj);
00562 
00563 #define DISPLAY_TEXPROJFRUST
00564 #ifdef DISPLAY_TEXPROJFRUST
00565   // Display a wireframe representation of the texture projector frustum
00566   PT(Geom) proj_geom =
00567         tex_proj->get_lens()->make_geometry();
00568   GeomNode* proj_geom_node = new GeomNode("proj_geometry");
00569   //JMC: Removed _drawable_vector.push_back call and added add_geom
00570   //call
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   // Create a projected texture spotlight shader
00578   tex_proj_spot = new Spotlight("tex_proj_spotlight");
00579   spot_arc = new RenderRelation(render, tex_proj_spot, 10);
00580 
00581   // Create a trackball to spin this around.
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   // Raise it and aim it at the origin
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   // Create a shader for the spotlight
00599   spot_shader = new SpotlightShader;
00600   spot_shader->add_frustum(tex_proj_spot);
00601 
00602 #define DISPLAY_TEXPROJSPOTFRUST
00603 #ifdef DISPLAY_TEXPROJSPOTFRUST
00604   // Display a wireframe representation of the spotlight frustum
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   //JMC: Removed _drawable_vector.push_back call and added add_geom
00610   //call
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   // Draw a light shaft for the spotlight
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   // Create a planar reflection
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   // Create a projected texture shadower
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   // Create a spheretex shader
00641   spheretex = new SpheretexShader(tex);
00642 
00643   // Create a highlight
00644   highlight = new SpheretexHighlighter;
00645   highlight->add_frustum(tex_proj_spot);
00646 
00647   // Create a spheremap reflection
00648   sreflect = new SpheretexReflector;
00649   sreflect->add_frustum(tex_proj_spot);
00650 
00651   // Create an outline shader
00652   outline_shader = new OutlineShader;
00653 
00654   // Load the room file
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   // Load jack
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   // Load up a camera model to visualize our eyepoint.
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   // Set up a transition for the spotlight
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   // and now for some multipass partial visualization
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 

Generated on Fri May 2 00:44:11 2003 for Panda by doxygen1.3