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

panda/src/testbed/min_shader.cxx

Go to the documentation of this file.
00001 // Filename: min_shader.cxx
00002 // Created by:  jason (28Jun00)
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 //Shaders
00020 #include <projtexShader.h>
00021 #include <spotlightShader.h>
00022 #include <projtexShadower.h>
00023 #include <planarReflector.h>
00024 #include <spheretexReflector.h>
00025 #include <spheretexHighlighter.h>
00026 #include <spheretexReflector.h>
00027 #include <outlineShader.h>
00028 
00029 //Channel stuff
00030 #include <chancfg.h>
00031 
00032 //Textures
00033 #include <texture.h>
00034 #include <texturePool.h>
00035 
00036 //Transitions
00037 #include <textureTransition.h>
00038 #include <shaderTransition.h>
00039 #include <lightTransition.h>
00040 #include <transformTransition.h>
00041 #include <colorBlendTransition.h>
00042 
00043 //Light stuff
00044 #include <light.h>
00045 #include <spotlight.h>
00046 
00047 //Nodes
00048 #include <pt_NamedNode.h>
00049 #include <geomNode.h>
00050 
00051 //Relations (arcs)
00052 #include <renderRelation.h>
00053 #include <nodeRelation.h>
00054 #include <dataRelation.h>
00055 
00056 //Misc
00057 #include <dconfig.h>
00058 #include <framework.h>
00059 #include <loader.h>
00060 #include <eventHandler.h>
00061 
00062 //Math/Matrix/Vector/Transformation stuff
00063 #include <transform2sg.h>
00064 #include <look_at.h>
00065 #include <perspectiveLens.h>
00066 #include <geomLine.h>
00067 
00068 Configure(min_shader);
00069 ConfigureFn(min_shader) {
00070 }
00071 
00072 //--------Projective texture stuff--------
00073 PT(LensNode) tex_proj;
00074 PT(Trackball) tex_proj_trackball;
00075 PT(ProjtexShader) proj_shader;
00076 //--------Spotlight stuff-----------------
00077 PT(Spotlight) tex_proj_spot;
00078 PT(Trackball) tex_spot_trackball;
00079 PT(SpotlightShader) spot_shader;
00080 //--------Projective Shadow stuff--------
00081 PT(ProjtexShadower) proj_shadow;
00082 //--------Planar reflecter stuff---------
00083 PT(PlanarReflector) preflect;
00084 //--------Sphere texture stuff---------
00085 PT(SpheretexShader) spheretex;
00086 //--------Sphere texture highlight stuff---------
00087 PT(SpheretexHighlighter) highlight;
00088 //--------Sphere texture reflector stuff---------
00089 PT(SpheretexReflector) sreflect;
00090 //--------Outline shader stuff---------
00091 PT(OutlineShader) outline_shader;
00092 
00093 ShaderTransition shader_trans;
00094 
00095 RenderRelation* room_arc;
00096 RenderRelation* spot_arc;
00097 RenderRelation* jack_arc;
00098 RenderRelation* camera_model_arc;
00099 RenderRelation* smiley_arc;
00100 
00101 PT(LightTransition) light_transition;
00102 
00103 //Framework extern variables and functions
00104 extern PT_NamedNode render;
00105 extern NodeAttributes initial_state;
00106 extern RenderRelation* first_arc;
00107 extern PT_NamedNode lights;
00108 extern PT_NamedNode root;
00109 extern PT(GeomNode) geomnode;
00110 extern PT_NamedNode cameras;
00111 extern PT(MouseAndKeyboard) mak;
00112 
00113 extern void set_alt_trackball(Node *trackball);
00114 
00115 extern int framework_main(int argc, char *argv[]);
00116 extern void (*extra_display_func)();
00117 extern void (*define_keys)(EventHandler&);
00118 
00119 extern PT(GraphicsWindow) main_win;
00120 
00121 //GLOBALS
00122 LPoint3f center_pos = LPoint3f::origin();
00123 Transform2SG *tball2cam;
00124 Texture* tex;
00125 
00126 //VIZ STUFF
00127 class BaseViz : public Shader::Visualize {
00128 public:
00129   BaseViz(void);
00130   virtual ~BaseViz(void);
00131   virtual void DisplayTexture(PT(Texture)&, Shader*);
00132   virtual void DisplayPixelBuffer(PT(PixelBuffer)&, Shader*);
00133 protected:
00134   typedef std::plist<PT(Texture) > texlist;
00135   typedef texlist::iterator texiter;
00136   typedef std::plist<PT(PixelBuffer) > pblist;
00137   typedef pblist::iterator pbiter;
00138 
00139   texlist _texs;
00140   pblist _pbs;
00141 };
00142 
00143 BaseViz::BaseViz(void) {}
00144 
00145 BaseViz::~BaseViz(void) {}
00146 
00147 void BaseViz::DisplayTexture(PT(Texture)& tex, Shader*) {
00148   if (tex->has_ram_image())
00149     _texs.push_back(tex);
00150   else {
00151     GraphicsStateGuardian* g = main_win->get_gsg();
00152     PT(PixelBuffer) pb(new PixelBuffer);
00153     g->texture_to_pixel_buffer(tex->prepare(g), pb);
00154     _pbs.push_back(pb);
00155   }
00156 }
00157 
00158 void BaseViz::DisplayPixelBuffer(PT(PixelBuffer)& pb, Shader*) {
00159   _pbs.push_back(pb);
00160 }
00161 
00162 class Oldviz : public BaseViz {
00163 public:
00164   Oldviz(PT(GraphicsWindow)&);
00165   virtual ~Oldviz(void);
00166   virtual void Flush(void);
00167 protected:
00168   PT(GraphicsWindow) _w;
00169 };
00170 
00171 Oldviz::Oldviz(PT(GraphicsWindow)& win) : _w(win) {}
00172 
00173 Oldviz::~Oldviz(void) {}
00174 
00175 void Oldviz::Flush(void) {
00176   GraphicsStateGuardian* g = _w->get_gsg();
00177   const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00178   PT(DisplayRegion) d(_w->make_scratch_display_region(256, 256));
00179 
00180   for (texiter i=_texs.begin(); i!=_texs.end(); ++i)
00181     (*i)->draw(g, d, r);
00182   for (pbiter j=_pbs.begin(); j!=_pbs.end(); ++j)
00183     (*j)->draw(g, d, r);
00184   _texs.erase(_texs.begin(), _texs.end());
00185   _pbs.erase(_pbs.begin(), _pbs.end());
00186 }
00187 
00188 class Viztex : public BaseViz {
00189 public:
00190   Viztex(PT(GraphicsPipe)&);
00191   virtual ~Viztex(void);
00192   virtual void Flush(void);
00193 protected:
00194   typedef std::plist< PT(GraphicsWindow) > winlist;
00195   typedef winlist::iterator winiter;
00196 
00197   winlist _wins;
00198   PT(GraphicsPipe) _pipe;
00199 };
00200 
00201 Viztex::Viztex(PT(GraphicsPipe)& p) : _pipe(p) {}
00202 
00203 Viztex::~Viztex(void) {}
00204 
00205 void Viztex::Flush(void) {
00206   winiter _witer = _wins.begin();
00207 
00208   for (texiter i=_texs.begin(); i!=_texs.end(); ++i) {
00209     GraphicsWindow* w;
00210 
00211     if (_witer == _wins.end()) {
00212       ChanCfgOverrides override;
00213 
00214       override.setField(ChanCfgOverrides::Mask,
00215                         ((unsigned int)(W_SINGLE)));
00216       override.setField(ChanCfgOverrides::Title, "Multipass partial");
00217       override.setField(ChanCfgOverrides::SizeX, 256);
00218       override.setField(ChanCfgOverrides::SizeY, 256);
00219       override.setField(ChanCfgOverrides::Cameras, false);
00220       w = ChanConfig(_pipe, "single", (Node *)NULL, render, override);
00221       _wins.push_back(w);
00222     }
00223     else
00224     {
00225       w = *_witer;
00226       ++_witer;
00227     }
00228     GraphicsStateGuardian* g = w->get_gsg();
00229     const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00230     PT(DisplayRegion) d(w->make_scratch_display_region(w->get_width(),
00231                                                        w->get_height()));
00232     // g->prepare_display_region(d);
00233     (*i)->draw(g, d, r);
00234   }
00235   for (pbiter j=_pbs.begin(); j!=_pbs.end(); ++j) {
00236     GraphicsWindow* w;
00237 
00238     if (_witer == _wins.end()) {
00239       ChanCfgOverrides override;
00240 
00241       override.setField(ChanCfgOverrides::Mask,
00242                         ((unsigned int)(W_SINGLE)));
00243       override.setField(ChanCfgOverrides::Title, "Multipass partial");
00244       override.setField(ChanCfgOverrides::SizeX, 256);
00245       override.setField(ChanCfgOverrides::SizeY, 256);
00246       override.setField(ChanCfgOverrides::Cameras, false);
00247       w = ChanConfig(_pipe, "single", cameras, render, override);
00248       _wins.push_back(w);
00249     } else {
00250       w = *_witer;
00251       ++_witer;
00252     }
00253     GraphicsStateGuardian* g = w->get_gsg();
00254     const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00255     PT(DisplayRegion) d(w->make_scratch_display_region(w->get_width(),
00256                                                        w->get_height()));
00257     // g->prepare_display_region(d);
00258     (*j)->draw(g, d, r);
00259   }
00260   _texs.erase(_texs.begin(), _texs.end());
00261   _pbs.erase(_pbs.begin(), _pbs.end());
00262 }
00263 
00264 class Tiledviz : public Viztex {
00265 public:
00266   Tiledviz(PT(GraphicsPipe)&);
00267   virtual ~Tiledviz(void);
00268   virtual void Flush(void);
00269 };
00270 
00271 Tiledviz::Tiledviz(PT(GraphicsPipe)& p) : Viztex(p) {}
00272 
00273 Tiledviz::~Tiledviz(void) {}
00274 
00275 void Tiledviz::Flush(void) {
00276   int count = 0;
00277   int layer_count = 0;
00278   winiter _witer = _wins.begin();
00279 
00280   for (texiter texi=_texs.begin(); texi!=_texs.end(); ++texi) {
00281     GraphicsWindow* w;
00282     DisplayRegion* d;
00283 
00284     if (_witer == _wins.end()) {
00285       ChanCfgOverrides override;
00286 
00287       override.setField(ChanCfgOverrides::Mask,
00288                         ((unsigned int)(W_SINGLE)));
00289       override.setField(ChanCfgOverrides::Title, "Multipass partial");
00290       override.setField(ChanCfgOverrides::SizeX, main_win->get_width());
00291       override.setField(ChanCfgOverrides::SizeY, main_win->get_height());
00292       override.setField(ChanCfgOverrides::Cameras, false);
00293       w = ChanConfig(_pipe, "multipass-tile", cameras, render, override);
00294       _wins.push_back(w);
00295       _witer = --(_wins.end());
00296     } else
00297       w = *_witer;
00298 
00299     int dridx;
00300     GraphicsStateGuardian* g = w->get_gsg();
00301     GraphicsChannel *chan = w->get_channel(0);
00302     GraphicsLayer *layer = chan->get_layer(layer_count);
00303     const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00304 
00305     d = layer->get_dr(count);
00306     (*texi)->draw(g, d, r);
00307 
00308     ++count;
00309     if (count == layer->get_num_drs()) {
00310       count = 0;
00311       ++layer_count;
00312     }
00313 
00314     if (layer_count == chan->get_num_layers())
00315     {
00316       layer_count = 0;
00317       ++_witer;
00318     }
00319   }
00320 
00321   for (pbiter pbi=_pbs.begin(); pbi!=_pbs.end(); ++pbi) {
00322     GraphicsWindow* w;
00323     DisplayRegion* d;
00324 
00325     if (_witer == _wins.end()) {
00326       ChanCfgOverrides override;
00327 
00328       override.setField(ChanCfgOverrides::Mask,
00329                         ((unsigned int)(W_SINGLE)));
00330       override.setField(ChanCfgOverrides::Title, "Multipass partial");
00331       override.setField(ChanCfgOverrides::SizeX, main_win->get_width());
00332       override.setField(ChanCfgOverrides::SizeY, main_win->get_height());
00333       override.setField(ChanCfgOverrides::Cameras, false);
00334       w = ChanConfig(_pipe, "multipass-tile", cameras, render, override);
00335       _wins.push_back(w);
00336       _witer = --(_wins.end());
00337     } else
00338       w = *_witer;
00339 
00340     int dridx;
00341     GraphicsStateGuardian* g = w->get_gsg();
00342     GraphicsChannel *chan = w->get_channel(0);
00343     GraphicsLayer *layer = chan->get_layer(layer_count);
00344     const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00345 
00346     d = layer->get_dr(count);
00347     (*pbi)->draw(g, d, r);
00348 
00349      ++count;
00350     if (count == layer->get_num_drs()) {
00351       count = 0;
00352       ++layer_count;
00353     }
00354 
00355     if (layer_count == chan->get_num_layers())
00356     {
00357       layer_count = 0;
00358       ++_witer;
00359     }
00360 
00361   }
00362   _texs.erase(_texs.begin(), _texs.end());
00363   _pbs.erase(_pbs.begin(), _pbs.end());
00364 }
00365 
00366 void shader_display_func(void) {
00367   Shader::Visualize* v = Shader::get_viz();
00368   if (v != (Shader::Visualize*)0L)
00369     v->Flush();
00370 }
00371 
00372 //END VIZ STUFF
00373 
00374 ////////////////////////////////////////////////////////////////////
00375 //     Function: event_p
00376 //       Access: Public
00377 //  Description: Toggle the projective texture being on and off
00378 ////////////////////////////////////////////////////////////////////
00379 void event_p(CPT_Event) {
00380   static bool projtex_mode = false;
00381 
00382   projtex_mode = !projtex_mode;
00383   if (!projtex_mode) {
00384     // Set the normal mode on the render arc.
00385     clear_shader(room_arc, proj_shader);
00386     //clear_shader(first_arc, proj_shader);
00387     //clear_shader(jack_arc, proj_shader);
00388 
00389     set_alt_trackball(NULL);
00390 
00391   } else {
00392     // Set an override on the initial state.
00393     set_shader(room_arc, proj_shader);
00394     //set_shader(first_arc, proj_shader);
00395     //set_shader(jack_arc, proj_shader);
00396 
00397     set_alt_trackball(tex_proj_trackball);
00398   }
00399 }
00400 
00401 ////////////////////////////////////////////////////////////////////
00402 //     Function: event_s
00403 //       Access: Public
00404 //  Description: Toggle the spotlight being on and off
00405 ////////////////////////////////////////////////////////////////////
00406 void event_s(CPT_Event) {
00407   static bool projtexspot_mode = false;
00408 
00409   projtexspot_mode = !projtexspot_mode;
00410   if (!projtexspot_mode) {
00411     // Set the normal mode on the render arc.
00412     clear_shader(room_arc, spot_shader);
00413 
00414     set_alt_trackball(NULL);
00415   } else {
00416     // Set an override on the initial state.
00417     set_shader(room_arc, spot_shader);
00418 
00419     set_alt_trackball(tex_spot_trackball);
00420   }
00421 }
00422 
00423 ////////////////////////////////////////////////////////////////////
00424 //     Function: event_d
00425 //       Access: Public
00426 //  Description: Toggle projected shadows
00427 ////////////////////////////////////////////////////////////////////
00428 void event_d(CPT_Event)
00429 {
00430   static bool projtex_shadow_mode = false;
00431 
00432   projtex_shadow_mode = !projtex_shadow_mode;
00433   if (!projtex_shadow_mode) {
00434     // Set the normal mode on the render arc.
00435     clear_shader(room_arc, proj_shadow);
00436     set_alt_trackball(NULL);
00437 
00438   }
00439   else
00440   {
00441     set_shader(room_arc, proj_shadow);
00442     set_alt_trackball(tex_spot_trackball);
00443   }
00444 }
00445 
00446 
00447 ////////////////////////////////////////////////////////////////////
00448 //     Function: event_r
00449 //       Access: Public
00450 //  Description: Toggle planar reflection
00451 ////////////////////////////////////////////////////////////////////
00452 void event_r(CPT_Event)
00453 {
00454   static bool plane_reflect_mode = false;
00455 
00456   plane_reflect_mode = !plane_reflect_mode;
00457   if (!plane_reflect_mode) {
00458     // Set the normal mode on the render arc.
00459     clear_shader(room_arc, preflect);
00460   }
00461   else
00462   {
00463     // Set an override on the initial state.
00464     set_shader(room_arc, preflect);
00465   }
00466 }
00467 
00468 ////////////////////////////////////////////////////////////////////
00469 //     Function: event_e
00470 //       Access: Public
00471 //  Description: Toggle sphere texture
00472 ////////////////////////////////////////////////////////////////////
00473 void event_e(CPT_Event) {
00474   static bool spheretex_mode = false;
00475 
00476   spheretex_mode = !spheretex_mode;
00477   if (!spheretex_mode) {
00478     // Set the normal mode on the render arc.
00479     //clear_shader(first_arc, spheretex);
00480     clear_shader(jack_arc, spheretex);
00481 
00482   } else {
00483     // Set an override on the initial state.
00484     //set_shader(first_arc, spheretex);
00485     set_shader(jack_arc, spheretex);
00486   }
00487 }
00488 
00489 ////////////////////////////////////////////////////////////////////
00490 //     Function: event_h
00491 //       Access: Public
00492 //  Description: Toggle sphere texture highlight
00493 ////////////////////////////////////////////////////////////////////
00494 void event_h(CPT_Event) {
00495   static bool highlight_mode = false;
00496 
00497   highlight_mode = !highlight_mode;
00498   if (!highlight_mode) {
00499     // Set the normal mode on the render arc.
00500     clear_shader(jack_arc, highlight);
00501 
00502   } else {
00503     set_shader(jack_arc, highlight);
00504   }
00505 }
00506 
00507 ////////////////////////////////////////////////////////////////////
00508 //     Function: event_h
00509 //       Access: Public
00510 //  Description: Toggle sphere texture reflector
00511 ////////////////////////////////////////////////////////////////////
00512 void event_m(CPT_Event) {
00513   static bool sphere_reflect_mode = false;
00514 
00515   sphere_reflect_mode = !sphere_reflect_mode;
00516   if (!sphere_reflect_mode) {
00517     // Set the normal mode on the render arc.
00518     clear_shader(jack_arc, sreflect);
00519 
00520   } else {
00521     // Set an override on the initial state.
00522     set_shader(jack_arc, sreflect);
00523   }
00524 }
00525 
00526 ////////////////////////////////////////////////////////////////////
00527 //     Function: event_o
00528 //       Access: Public
00529 //  Description: Toggle outline shader
00530 ////////////////////////////////////////////////////////////////////
00531 void event_o(CPT_Event) {
00532   static bool outline_mode = false;
00533 
00534   outline_mode = !outline_mode;
00535   if (!outline_mode) {
00536     // Set the normal mode on the render arc.
00537     clear_shader(jack_arc, outline_shader);
00538 
00539   } else {
00540     set_shader(jack_arc, outline_shader);
00541   }
00542 }
00543 
00544 ////////////////////////////////////////////////////////////////////
00545 //     Function: setup_projtex
00546 //       Access: Public
00547 //  Description:
00548 ////////////////////////////////////////////////////////////////////
00549 void setup_projtex(void)
00550 {
00551   // Create a projected texture shader
00552 
00553   // Put the texture projector into the scene graph
00554   tex_proj = new LensNode("texture_projector");
00555   RenderRelation* proj_arc = new RenderRelation(render, tex_proj);
00556 
00557   // Create a trackball to spin this around.
00558   tex_proj_trackball = new Trackball("tex_proj_trackball");
00559   tex_proj_trackball->set_invert(false);
00560   tex_proj_trackball->set_rel_to(cameras);
00561   tball2cam = new Transform2SG("tball2cam");
00562   tball2cam->set_arc(proj_arc);
00563   new DataRelation(tex_proj_trackball, tball2cam);
00564 
00565   // Raise it and aim it at the origin
00566   LMatrix4f proj_mat;
00567   LPoint3f proj_pos = LPoint3f::rfu(2., 3., 8.);
00568   LVector3f fwd_vec = proj_pos - center_pos;
00569   look_at(proj_mat, -fwd_vec);
00570   proj_mat.set_row(3, proj_pos);
00571   tex_proj_trackball->set_mat(proj_mat);
00572   proj_arc->set_transition(new TransformTransition(proj_mat));
00573 
00574   // Create a shader for the texture projector
00575   proj_shader = new ProjtexShader(tex);
00576   proj_shader->set_priority(150);
00577   proj_shader->add_frustum(tex_proj);
00578 
00579 #define DISPLAY_TEXPROJFRUST
00580 #ifdef DISPLAY_TEXPROJFRUST
00581   // Display a wireframe representation of the texture projector frustum
00582   PT(Geom) proj_geom =
00583     tex_proj->get_lens()->make_geometry();
00584   GeomNode* proj_geom_node = new GeomNode("proj_geometry");
00585   proj_geom_node->add_geom(proj_geom);
00586   RenderRelation *prr = new RenderRelation(tex_proj, proj_geom_node);
00587   LightTransition *plt = new LightTransition(LightTransition::all_off());
00588   prr->set_transition(plt);
00589 #endif
00590 }
00591 
00592 ////////////////////////////////////////////////////////////////////
00593 //     Function: setup_spotlight
00594 //       Access: Public
00595 //  Description:
00596 ////////////////////////////////////////////////////////////////////
00597 void setup_spotlight(void)
00598 {
00599   // Create a projected texture spotlight shader
00600   tex_proj_spot = new Spotlight("tex_proj_spotlight");
00601   //Push out the far clipping plane of the spotlight frustum
00602   PT(Lens) lens = new PerspectiveLens;
00603   lens->set_fov(45.0f);
00604   lens->set_near(f._fnear);
00605   lens->set_far(13.0f);
00606   tex_proj_spot->set_lens(lens);
00607 
00608   spot_arc = new RenderRelation(render, tex_proj_spot, 10);
00609 
00610   // Create a trackball to spin this around.
00611   tex_spot_trackball = new Trackball("tex_spot_trackball");
00612   tex_spot_trackball->set_invert(false);
00613   tex_spot_trackball->set_rel_to(cameras);
00614   tball2cam = new Transform2SG("tball2cam");
00615   tball2cam->set_arc(spot_arc);
00616   new DataRelation(tex_spot_trackball, tball2cam);
00617 
00618   // Raise it and aim it at the origin
00619   LMatrix4f spot_mat;
00620   LPoint3f spot_pos = LPoint3f::rfu(-4., -3., 8.);
00621   LVector3f spot_vec = spot_pos - center_pos;
00622   look_at(spot_mat, -spot_vec);
00623   spot_mat.set_row(3, spot_pos);
00624   tex_spot_trackball->set_mat(spot_mat);
00625   spot_arc->set_transition(new TransformTransition(spot_mat));
00626 
00627   // Create a shader for the spotlight
00628   spot_shader = new SpotlightShader;
00629   spot_shader->set_priority(150);
00630   spot_shader->add_frustum(tex_proj_spot);
00631 
00632 #define DISPLAY_TEXPROJSPOTFRUST
00633 #ifdef DISPLAY_TEXPROJSPOTFRUST
00634   // Display a wireframe representation of the spotlight frustum
00635   Colorf color_red(1., 0., 0., 1.);
00636   PT(Geom) frust_geom =
00637     tex_proj_spot->get_lens()->make_geometry();
00638   GeomNode* frust_geom_node = new GeomNode("frustum_geometry");
00639   frust_geom_node->add_geom(frust_geom);
00640   RenderRelation *rr = new RenderRelation(tex_proj_spot, frust_geom_node);
00641   LightTransition *lt = new LightTransition(LightTransition::all_off());
00642   rr->set_transition(lt);
00643 #endif
00644 
00645 #define DISPLAY_SHAFT
00646 #ifdef DISPLAY_SHAFT
00647   // Draw a light shaft for the spotlight
00648   NamedNode* shaft = tex_proj_spot->make_geometry(0.05, 8.0, 36);
00649   RenderRelation *sr = new RenderRelation(tex_proj_spot, shaft, 10);
00650 #endif
00651 }
00652 
00653 ////////////////////////////////////////////////////////////////////
00654 //     Function: setup_planar
00655 //       Access: Public
00656 //  Description:
00657 ////////////////////////////////////////////////////////////////////
00658 void setup_planar(void)
00659 {
00660   // Create a planar reflection
00661   Planef p(LVector3f(0., 0., 1.), LVector3f(0., 0., -10.));
00662   PlaneNode* plane_node = new PlaneNode;
00663   plane_node->set_plane(p);
00664   preflect = new PlanarReflector(plane_node);
00665 }
00666 
00667 ////////////////////////////////////////////////////////////////////
00668 //     Function: setup_projshadow
00669 //       Access: Public
00670 //  Description:
00671 ////////////////////////////////////////////////////////////////////
00672 void setup_projshadow(void)
00673 {
00674   // Create a projected texture shadower
00675   proj_shadow = new ProjtexShadower;
00676   proj_shadow->add_frustum(tex_proj_spot);
00677   proj_shadow->set_priority(150);
00678   if (root != (NamedNode *)NULL) {
00679     proj_shadow->add_caster(root);
00680     preflect->add_caster(root);
00681   } else if (geomnode != (GeomNode *)NULL) {
00682     proj_shadow->add_caster(geomnode);
00683     preflect->add_caster(geomnode);
00684   }
00685 }
00686 
00687 ////////////////////////////////////////////////////////////////////
00688 //     Function: setup_vizes
00689 //       Access: Public
00690 //  Description:
00691 ////////////////////////////////////////////////////////////////////
00692 void setup_vizes(void)
00693 {
00694   // and now for some multipass partial visualization
00695   Shader::Visualize* v = Shader::get_viz();
00696   std::string viztype = min_shader.GetString("multipass-viz", "none");
00697 
00698  if (viztype == "old-style")
00699   {
00700     PT(GraphicsWindow) w(main_win);
00701     v = new Oldviz(w);
00702   }
00703   else if (viztype == "new-single")
00704   {
00705     PT(GraphicsPipe) p(((GraphicsPipe*)(main_win->get_pipe())));
00706     v = new Viztex(p);
00707   }
00708   else if (viztype == "new-tile")
00709   {
00710     PT(GraphicsPipe) p(((GraphicsPipe*)(main_win->get_pipe())));
00711     v = new Tiledviz(p);
00712   }
00713 
00714   Shader::set_viz(v);
00715 }
00716 
00717 ////////////////////////////////////////////////////////////////////
00718 //     Function: min_shader_keys
00719 //       Access: Public
00720 //  Description: Set event handlers for the various keys needed, and
00721 //               do any initialization necessary
00722 ////////////////////////////////////////////////////////////////////
00723 void min_shader_keys(EventHandler &eh) {
00724   Loader loader;
00725 
00726   eh.add_hook("p", event_p);
00727   eh.add_hook("s", event_s);
00728   eh.add_hook("d", event_d);
00729   eh.add_hook("r", event_r);
00730   eh.add_hook("e", event_e);
00731   eh.add_hook("h", event_h);
00732   eh.add_hook("m", event_m);
00733   eh.add_hook("o", event_o);
00734 
00735   // Load a texture to project
00736   tex = TexturePool::load_texture("smiley.rgba");
00737   tex->set_minfilter(Texture::FT_linear);
00738   tex->set_magfilter(Texture::FT_linear);
00739   tex->set_wrapu(Texture::WM_clamp);
00740   tex->set_wrapv(Texture::WM_clamp);
00741 
00742 //--------------------PROJECTED TEXTURE SHADER-------------------
00743   setup_projtex();
00744 //--------------------SPOTLIGHT SHADER-------------------
00745   setup_spotlight();
00746 //--------------------PLANAR REFLECTOR SHADER-------------------
00747   setup_planar();
00748 //--------------------SHADOW SHADER-------------------
00749   setup_projshadow();
00750 //--------------------SPHERE TEXTURE SHADER-------------------
00751   spheretex = new SpheretexShader(tex);
00752   spheretex->set_priority(150);
00753 //--------------------SPHERE HIGHLIGHTER TEXTURE SHADER-------------------
00754   highlight = new SpheretexHighlighter(32);
00755   highlight->add_frustum(tex_proj_spot);
00756   highlight->set_priority(150);
00757 //--------------------SPHERE REFLECTOR TEXTURE SHADER-------------------
00758   sreflect = new SpheretexReflector;
00759   sreflect->add_frustum(tex_proj_spot);
00760   sreflect->set_priority(150);
00761   sreflect->add_caster(root);
00762 //--------------------OUTLINE SHADER-------------------
00763   outline_shader = new OutlineShader;
00764   outline_shader->set_priority(150);
00765 
00766   // Load the room file
00767   PT_NamedNode room = DCAST(NamedNode, loader.load_sync("big-room.egg"));
00768   if (room != (NamedNode *)NULL) {
00769     room_arc = new RenderRelation(render, room, 20);
00770 
00771     sreflect->add_caster(room);
00772   }
00773 
00774   // Load jack
00775   PT_NamedNode jack = DCAST(NamedNode, loader.load_sync("jack.egg"));
00776   if (jack != (NamedNode *)NULL) {
00777     jack_arc = new RenderRelation(render, jack);
00778     LMatrix4f jack_mat = LMatrix4f::ident_mat();
00779     LPoint3f jack_pos = LPoint3f::rfu(-2., -2., -6.);
00780     jack_mat.set_row(3, jack_pos);
00781     jack_arc->set_transition(new TransformTransition(jack_mat));
00782 
00783     proj_shadow->add_caster(jack);
00784     preflect->add_caster(jack);
00785   }
00786 
00787   // Load jack
00788   PT_NamedNode smiley = DCAST(NamedNode, loader.load_sync("smiley.egg"));
00789   if (jack != (NamedNode *)NULL) {
00790     smiley_arc = new RenderRelation(render, smiley);
00791 
00792     proj_shadow->add_caster(smiley);
00793     preflect->add_caster(smiley);
00794   }
00795 
00796   // Load up a camera model to visualize our eyepoint.
00797   PT_NamedNode camera_model = DCAST(NamedNode, loader.load_sync("camera.egg"));
00798   if (camera_model != (NamedNode *)NULL) {
00799     camera_model_arc = new RenderRelation(cameras, camera_model);
00800 
00801     sreflect->add_caster(camera_model);
00802     proj_shadow->add_caster(camera_model);
00803     preflect->add_caster(camera_model);
00804   }
00805 
00806   // Set up a transition for the spotlight
00807   light_transition = new LightTransition;
00808   if (first_arc != (NodeRelation *)NULL) {
00809     first_arc->set_transition(light_transition);
00810   }
00811   if (jack_arc != (NodeRelation *)NULL) {
00812     jack_arc->set_transition(light_transition);
00813   }
00814 
00815   setup_vizes();
00816 }
00817 
00818 int main(int argc, char *argv[]) {
00819   extra_display_func = &shader_display_func;
00820   define_keys = &min_shader_keys;
00821   return framework_main(argc, argv);
00822 }
00823 

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