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

panda/src/testbed/herc.cxx

Go to the documentation of this file.
00001 // Filename: herc.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 <loader.h>
00034 #include <look_at.h>
00035 #include <get_rel_pos.h>
00036 #include <transformTransition.h>
00037 #include <geomNode.h>
00038 #include <lightTransition.h>
00039 #include <spotlight.h>
00040 #include <projtexShadower.h>
00041 #include <spheretexHighlighter.h>
00042 #include <spheretexReflector.h>
00043 #include <trackball.h>
00044 #include <planarSlider.h>
00045 #include <transform2sg.h>
00046 #include <mouse.h>
00047 #include <graphicsWindow.h>
00048 #include <planarReflector.h>
00049 #include <stencilTransition.h>
00050 #include <plane.h>
00051 #include <auto_bind.h>
00052 #include <animControl.h>
00053 #include <animControlCollection.h>
00054 #include <renderBuffer.h>
00055 #include <planeNode.h>
00056 #include <outlineShader.h>
00057 #include <pt_NamedNode.h>
00058 #include <geomLine.h>
00059 
00060 #include <dconfig.h>
00061 
00062 Configure(shader_test);
00063 
00064 ConfigureFn(shader_test) {}
00065 
00066 PT(LensNode) tex_proj;
00067 PT(Trackball) tex_proj_trackball;
00068 PT(ProjtexShader) proj_shader;
00069 PT(ProjtexShadower) proj_shadow;
00070 PT(SpheretexShader) spheretex;
00071 PT(SpheretexHighlighter) highlight;
00072 PT(SpheretexReflector) sreflect;
00073 PT(PlanarReflector) preflect;
00074 PT(OutlineShader) outline_shader;
00075 PT(GeomNode) proj_geom_node;
00076 PT_NamedNode spot_shaft;
00077 
00078 PT_NamedNode herc;
00079 PT_NamedNode ball;
00080 PT_NamedNode hide_ball;
00081 
00082 ShaderTransition shader_trans;
00083 
00084 PT(Spotlight) tex_proj_spot;
00085 PT(Trackball) tex_spot_trackball;
00086 PT(SpotlightShader) spot_shader;
00087 
00088 PT(PlanarSlider) ball_slider;
00089 bool follow_ball;
00090 
00091 RenderRelation* room_arc;
00092 RenderRelation* spot_arc;
00093 RenderRelation* ball_arc;
00094 RenderRelation* hide_ball_arc;
00095 RenderRelation* herc_arc;
00096 RenderRelation* herc_rot_arc;
00097 RenderRelation* camera_model_arc;
00098 
00099 extern PT_NamedNode render;
00100 extern NodeAttributes initial_state;
00101 extern PT_NamedNode lights;
00102 extern PT_NamedNode root;
00103 extern PT(GeomNode) geomnode;
00104 extern PT_NamedNode cameras;
00105 extern PT(MouseAndKeyboard) mak;
00106 
00107 extern void set_alt_trackball(Node *trackball);
00108 
00109 extern PT(GraphicsWindow) main_win;
00110 
00111 extern int framework_main(int argc, char *argv[]);
00112 extern void (*extra_display_func)();
00113 extern void (*define_keys)(EventHandler&);
00114 extern void (*extra_overrides_func)(ChanCfgOverrides&, std::string&);
00115 extern void (*additional_idle)();
00116 
00117 // nothing extra to do for either of these
00118 void herc_display_func(void) {
00119   Shader::Visualize* v = Shader::get_viz();
00120   if (v != (Shader::Visualize*)0L)
00121     v->Flush();
00122 }
00123 
00124 void herc_overrides_func(ChanCfgOverrides &override, std::string&) {
00125   override.setField(ChanCfgOverrides::Mask,
00126         ((unsigned int)(W_DOUBLE|W_DEPTH|W_MULTISAMPLE|W_STENCIL)));
00127   override.setField(ChanCfgOverrides::Title, "Lighting Demo");
00128 }
00129 
00130 
00131 void herc_idle() {
00132   static const double walk_speed = 4.0;  // feet per second
00133 
00134   if (follow_ball) {
00135     LPoint3f bp = get_rel_pos(ball, herc);
00136     LVector2f bv2(bp[0], bp[1]);
00137     float dist = length(bv2);
00138     if (dist > 0.0001) {
00139       LMatrix4f mat;
00140       look_at(mat, LPoint3f(-bp[0], -bp[1], 0.0));
00141       herc_rot_arc->set_transition(new TransformTransition(mat));
00142 
00143       float stride = walk_speed * ClockObject::get_global_clock()->get_dt();
00144       if (dist > stride) {
00145         LVector2f step = bv2 / dist * stride;
00146 
00147         const TransformTransition *tt;
00148         if (!get_transition_into(tt, herc_arc)) {
00149           herc_arc->set_transition
00150             (new TransformTransition
00151              (LMatrix4f::translate_mat(step[0], step[1], 0.0)));
00152         } else {
00153           LMatrix4f mat = tt->get_matrix();
00154           mat(3, 0) += step[0];
00155           mat(3, 1) += step[1];
00156           herc_arc->set_transition(new TransformTransition(mat));
00157         }
00158       }
00159     }
00160   }
00161 }
00162 
00163 void event_p(CPT_Event) {
00164   // The "p" key was pressed.  Toggle projected texture.
00165   static bool projtex_mode = false;
00166 
00167   projtex_mode = !projtex_mode;
00168   if (!projtex_mode) {
00169     // Set the normal mode on the render arc.
00170     clear_shader(room_arc, proj_shader);
00171     clear_shader(herc_arc, proj_shader);
00172     clear_shader(ball_arc, proj_shader);
00173 
00174     set_alt_trackball(NULL);
00175     remove_child(tex_proj, proj_geom_node, RenderRelation::get_class_type());
00176 
00177   } else {
00178     set_shader(room_arc, proj_shader);
00179     set_shader(herc_arc, proj_shader);
00180     set_shader(ball_arc, proj_shader);
00181 
00182     set_alt_trackball(tex_proj_trackball);
00183     // Display the texture projector frustum
00184     RenderRelation *prr = new RenderRelation(tex_proj, proj_geom_node);
00185     LightTransition *plt = new LightTransition(LightTransition::all_off());
00186     prr->set_transition(plt);
00187   }
00188 }
00189 
00190 void event_s(CPT_Event) {
00191   // The "s" key was pressed.  Toggle projected texture spotlight.
00192   static bool projtexspot_mode = false;
00193   LightTransition light_trans;
00194 
00195   projtexspot_mode = !projtexspot_mode;
00196   if (!projtexspot_mode) {
00197     // Set the normal mode on the render arc.
00198     clear_shader(room_arc, spot_shader);
00199     clear_shader(herc_arc, spot_shader);
00200     clear_shader(ball_arc, spot_shader);
00201 
00202     set_alt_trackball(NULL);
00203     remove_child(tex_proj_spot, spot_shaft, RenderRelation::get_class_type());
00204 
00205   } else {
00206     set_shader(room_arc, spot_shader);
00207     set_shader(herc_arc, spot_shader);
00208     set_shader(ball_arc, spot_shader);
00209 
00210     set_alt_trackball(tex_spot_trackball);
00211     new RenderRelation(tex_proj_spot, spot_shaft, 10);
00212   }
00213 }
00214 
00215 void event_d(CPT_Event) {
00216   // The "d" key was pressed.  Toggle projected texture shadows.
00217   static bool projtex_shadow_mode = false;
00218 
00219   projtex_shadow_mode = !projtex_shadow_mode;
00220   if (!projtex_shadow_mode) {
00221     // Set the normal mode on the render arc.
00222     clear_shader(room_arc, proj_shadow);
00223     set_alt_trackball(NULL);
00224 
00225   } else {
00226     set_shader(room_arc, proj_shadow);
00227     set_alt_trackball(tex_spot_trackball);
00228   }
00229 }
00230 
00231 void event_h(CPT_Event) {
00232   // The "h" key was pressed.  Toggle highlight.
00233   static bool highlight_mode = false;
00234 
00235   highlight_mode = !highlight_mode;
00236   if (!highlight_mode) {
00237     // Set the normal mode on the render arc.
00238     clear_shader(ball_arc, highlight);
00239 
00240   } else {
00241     set_shader(ball_arc, highlight);
00242   }
00243 }
00244 
00245 void event_e(CPT_Event) {
00246   // The "e" key was pressed.  Toggle sphere texture.
00247   static bool spheretex_mode = false;
00248 
00249   spheretex_mode = !spheretex_mode;
00250   if (!spheretex_mode) {
00251     // Set the normal mode on the render arc.
00252     clear_shader(ball_arc, spheretex);
00253 
00254   } else {
00255     // Set an override on the initial state.
00256     set_shader(ball_arc, spheretex);
00257   }
00258 }
00259 
00260 void event_m(CPT_Event) {
00261   // The "m" key was pressed.  Toggle sphere reflection.
00262   static bool sphere_reflect_mode = false;
00263 
00264   sphere_reflect_mode = !sphere_reflect_mode;
00265   if (!sphere_reflect_mode) {
00266     // Set the normal mode on the render arc.
00267     clear_shader(ball_arc, sreflect);
00268 
00269   } else {
00270     // Set an override on the initial state.
00271     set_shader(ball_arc, sreflect);
00272   }
00273 }
00274 
00275 void event_r(CPT_Event) {
00276   // The "r" key was pressed.  Toggle planar reflection.
00277   static bool plane_reflect_mode = false;
00278 
00279   plane_reflect_mode = !plane_reflect_mode;
00280   if (!plane_reflect_mode) {
00281     // Set the normal mode on the render arc.
00282     clear_shader(room_arc, preflect);
00283 
00284   } else {
00285     // Set an override on the initial state.
00286     set_shader(room_arc, preflect);
00287   }
00288 }
00289 
00290 void event_z(CPT_Event) {
00291   // The "z" key was pressed.  Allow the user to move the ball around.
00292   set_alt_trackball(ball_slider);
00293 }
00294 
00295 void event_Z(CPT_Event) {
00296   // The "Z" key was pressed.  Toggle follow-ball mode.
00297   follow_ball = !follow_ball;
00298 
00299   if (follow_ball) {
00300     // Hide the ball while we're following it.
00301     remove_arc(hide_ball_arc);
00302   } else {
00303     // Reveal the ball when we're done following it.
00304     hide_ball_arc = new RenderRelation(render, hide_ball);
00305   }
00306 }
00307 
00308 void event_o(CPT_Event) {
00309   // The "o" key was pressed.  Toggle outlining.
00310   static bool outline_mode = false;
00311 
00312   outline_mode = !outline_mode;
00313   if (!outline_mode) {
00314     // Set the normal mode on the render arc.
00315     clear_shader(herc_arc, outline_shader);
00316 
00317   } else {
00318     set_shader(herc_arc, outline_shader);
00319   }
00320 }
00321 
00322 void herc_keys(EventHandler &eh) {
00323 
00324   eh.add_hook("p", event_p); // Projected Texture Shader
00325   eh.add_hook("s", event_s); // Projected Texture Spotlight
00326   eh.add_hook("d", event_d); // Projected Texture Shadower
00327   eh.add_hook("e", event_e); // Sphere Texture Shader
00328   eh.add_hook("h", event_h); // Sphere Texture Highlighter
00329   eh.add_hook("m", event_m); // Sphere Texture Reflector
00330   eh.add_hook("r", event_r); // Planar Reflector
00331   eh.add_hook("z", event_z); // Move ball
00332   eh.add_hook("Z", event_Z); // Follow ball
00333   eh.add_hook("o", event_o); // Outlining
00334 
00335 //==========================================================================
00336 // Models
00337 //==========================================================================
00338   // Load herc
00339   PT_NamedNode herc_model = loader.load_sync("herc-6000.egg");
00340   PT_NamedNode herc_anim = loader.load_sync("HB_1_HE1.egg");
00341   assert(herc_model != (NamedNode *)NULL &&
00342          herc_anim != (NamedNode *)NULL);
00343   PT_NamedNode herc_parent = new NamedNode("herc_parent");
00344   new RenderRelation(herc_parent, herc_model);
00345   new RenderRelation(herc_parent, herc_anim);
00346   AnimControlCollection anim_controls;
00347   auto_bind(herc_parent, anim_controls, ~0);
00348   // And start looping any animations we successfully bound.
00349   anim_controls.loop_all(true);
00350   PT_NamedNode herc_rot = new NamedNode("herc_rot");
00351   RenderRelation *herc_arc1 = new RenderRelation(herc_rot, herc_parent);
00352   herc_arc1->set_transition
00353     (new TransformTransition
00354      (LMatrix4f::scale_mat(LVector3f(0.25, 0.25, 0.25))));
00355   herc = new NamedNode("herc");
00356   herc_rot_arc = new RenderRelation(herc, herc_rot);
00357   herc_arc = new RenderRelation(render, herc);
00358 
00359   // Load ball
00360   ball = loader.load_sync("marble_ball.egg");
00361   assert(ball != (NamedNode *)NULL);
00362   PT_NamedNode scaled_ball = new NamedNode("scaled_ball");
00363   RenderRelation *ball_arc1 = new RenderRelation(scaled_ball, ball);
00364   ball_arc1->set_transition
00365     (new TransformTransition(LMatrix4f::scale_mat(0.2)));
00366   hide_ball = new NamedNode("hide_ball");
00367   ball_arc = new RenderRelation(hide_ball, scaled_ball);
00368   ball_arc->set_transition
00369     (new TransformTransition(LMatrix4f::translate_mat(4., 2., 1.)));
00370   hide_ball_arc = new RenderRelation(render, hide_ball);
00371 
00372   // Control the ball using a PlanarSlider tform.
00373   ball_slider = new PlanarSlider("ball_slider");
00374   ball_slider->set_transform(LMatrix4f::translate_mat(0.0, 0.0, 1.0) *
00375                              LMatrix4f::scale_mat(7.0, -7.0, 1.0));
00376   ball_slider->set_mouse_pos(LPoint2f(4.0 / 7.0, 2.0 / -7.0));
00377   Transform2SG *slider2ball = new Transform2SG("slider2ball");
00378   slider2ball->set_arc(ball_arc);
00379   new RenderRelation(ball_slider, slider2ball);
00380   follow_ball = false;
00381 
00382   // Load the room file
00383   PT_NamedNode room = loader.load_sync("lfloor.egg");
00384   assert(room != (NamedNode *)NULL);
00385   room_arc = new RenderRelation(render, room);
00386 
00387   // Load up a camera model to visualize our eyepoint.
00388   PT_NamedNode camera_model = loader.load_sync("camera.egg");
00389   assert(camera_model != (NamedNode *)NULL);
00390   camera_model_arc = new RenderRelation(cameras, camera_model);
00391 
00392   // Remove any model that was loaded by default or on command line
00393   if (root != (NamedNode *)NULL)
00394     remove_child(render, root, RenderRelation::get_class_type());
00395   if (geomnode != (GeomNode *)NULL)
00396     remove_child(render, geomnode, RenderRelation::get_class_type());
00397 
00398 
00399 //==========================================================================
00400 // Projected Texture Shader
00401 //==========================================================================
00402   // Load a texture to project
00403   Texture* tex = new Texture;
00404   tex->read("smiley.rgba");
00405   tex->set_name("smiley.rgba");
00406 
00407   // Put the texture projector into the scene graph
00408   tex_proj = new LensNode("texture_projector");
00409   RenderRelation* proj_arc = new RenderRelation(render, tex_proj);
00410 
00411   // Create a trackball to spin this around.
00412   tex_proj_trackball = new Trackball("tex_proj_trackball");
00413   tex_proj_trackball->set_invert(false);
00414   tex_proj_trackball->set_rel_to(cameras);
00415   Transform2SG *tball2cam = new Transform2SG("tball2cam");
00416   tball2cam->set_arc(proj_arc);
00417   new RenderRelation(tex_proj_trackball, tball2cam);
00418 
00419   // Raise it and aim it at the origin
00420   LMatrix4f proj_mat;
00421   LPoint3f proj_pos = LPoint3f::rfu(2., 3., 8.);
00422   LVector3f fwd_vec = proj_pos - LPoint3f::origin();
00423   look_at(proj_mat, -fwd_vec);
00424   proj_mat.set_row(3, proj_pos);
00425   tex_proj_trackball->set_mat(proj_mat);
00426   proj_arc->set_transition(new TransformTransition(proj_mat));
00427 
00428   // Create a shader for the texture projector
00429   proj_shader = new ProjtexShader(tex);
00430   proj_shader->add_frustum(tex_proj);
00431 
00432   // Create a wireframe representation of the texture projector frustum
00433   PT(Geom) proj_geom =
00434     tex_proj->get_lens()->make_geometry();
00435   proj_geom_node = new GeomNode("proj_geometry");
00436   proj_geom_node->add_geom(proj_geom);
00437 
00438 
00439 //==========================================================================
00440 // Projected Texture Spotlight Shader
00441 //==========================================================================
00442   tex_proj_spot = new Spotlight("tex_proj_spotlight");
00443   spot_arc = new RenderRelation(render, tex_proj_spot, 10);
00444 
00445   // Create a trackball to spin this around.
00446   tex_spot_trackball = new Trackball("tex_spot_trackball");
00447   tex_spot_trackball->set_invert(false);
00448   tex_spot_trackball->set_rel_to(cameras);
00449   tball2cam = new Transform2SG("tball2cam");
00450   tball2cam->set_arc(spot_arc);
00451   new RenderRelation(tex_spot_trackball, tball2cam);
00452 
00453   // Raise it and aim it at the origin
00454   LMatrix4f spot_mat;
00455   LPoint3f spot_pos = LPoint3f::rfu(-4., -3., 8.);
00456   LVector3f spot_vec = spot_pos - LPoint3f::origin();
00457   look_at(spot_mat, -spot_vec);
00458   spot_mat.set_row(3, spot_pos);
00459   tex_spot_trackball->set_mat(spot_mat);
00460   spot_arc->set_transition(new TransformTransition(spot_mat));
00461 
00462   // Create a shader for the spotlight
00463   spot_shader = new SpotlightShader;
00464   spot_shader->add_frustum(tex_proj_spot);
00465 
00466   // Create a light shaft for the spotlight
00467   spot_shaft = tex_proj_spot->make_geometry(0.05, 8.0, 36);
00468 
00469 
00470 //==========================================================================
00471 // Projected Texture Shadower
00472 //==========================================================================
00473   proj_shadow = new ProjtexShadower;
00474   proj_shadow->add_frustum(tex_proj_spot);
00475   proj_shadow->add_caster(herc);
00476   proj_shadow->add_caster(ball);
00477   proj_shadow->add_caster(camera_model);
00478 
00479 
00480 //==========================================================================
00481 // Sphere Texture Shader
00482 //==========================================================================
00483   spheretex = new SpheretexShader(tex);
00484 
00485 
00486 //==========================================================================
00487 // Sphere Texture Highlighter
00488 //==========================================================================
00489   highlight = new SpheretexHighlighter;
00490   highlight->add_frustum(tex_proj_spot);
00491 
00492 
00493 //==========================================================================
00494 // Sphere Texture Reflector
00495 //==========================================================================
00496   sreflect = new SpheretexReflector;
00497   sreflect->add_frustum(tex_proj_spot);
00498   sreflect->add_caster(room);
00499   sreflect->add_caster(herc);
00500   sreflect->add_caster(camera_model);
00501 
00502 
00503 //==========================================================================
00504 // Planar Reflector
00505 //==========================================================================
00506   // Create a plane that corresponds to the floor of the room
00507   Planef p(LVector3f::up(), LPoint3f::origin());
00508   PlaneNode* plane_node = new PlaneNode;
00509   plane_node->set_plane(p);
00510   new RenderRelation(room, plane_node);
00511   preflect = new PlanarReflector(plane_node);
00512   preflect->add_caster(ball);
00513   preflect->add_caster(herc);
00514   preflect->add_caster(camera_model);
00515 
00516 
00517 //==========================================================================
00518 // Outline Shader
00519 //==========================================================================
00520   outline_shader = new OutlineShader;
00521 
00522   additional_idle = &herc_idle;
00523 }
00524 
00525 int main(int argc, char *argv[]) {
00526   extra_display_func = &herc_display_func;
00527   define_keys = &herc_keys;
00528   extra_overrides_func = &herc_overrides_func;
00529   return framework_main(argc, argv);
00530 }

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