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

panda/src/testbed/min_herc.cxx

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

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