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

panda/src/testbed/panda.cxx

Go to the documentation of this file.
00001 // Filename: panda.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 <pandabase.h>
00020 #include <framework.h>
00021 #include <eventHandler.h>
00022 #include <chancfg.h>
00023 #include <lightTransition.h>
00024 #include <transformTransition.h>
00025 #include <get_rel_pos.h>
00026 #include <directionalLight.h>
00027 #include <renderRelation.h>
00028 #include <frustum.h>
00029 #include <perspectiveLens.h>
00030 #include <shaderTransition.h>
00031 #include <texture.h>
00032 #include <texturePool.h>
00033 #include <spotlight.h>
00034 #include <pt_Node.h>
00035 #include <pt_NamedNode.h>
00036 #include <loader.h>
00037 #include <auto_bind.h>
00038 #include <animControlCollection.h>
00039 #include <trackball.h>
00040 #include <planarSlider.h>
00041 #include <transform2sg.h>
00042 #include <projtexShader.h>
00043 #include <spotlightShader.h>
00044 #include <projtexShadower.h>
00045 #include <spheretexHighlighter.h>
00046 #include <spheretexReflector.h>
00047 #include <plane.h>
00048 #include <planeNode.h>
00049 #include <planarReflector.h>
00050 #include <outlineShader.h>
00051 #include <geomLine.h>
00052 #include <look_at.h>
00053 #include <geomNode.h>
00054 
00055 //From framework
00056 extern PT(GeomNode) geomnode;
00057 extern RenderRelation* first_arc;
00058 extern Loader loader;
00059 
00060 PT_NamedNode panda;
00061 PT_NamedNode ball;
00062 PT_NamedNode room;
00063 PT_NamedNode hide_ball;
00064 PT_NamedNode camera_model;
00065 
00066 PT(RenderRelation) panda_arc;
00067 PT(RenderRelation) panda_rot_arc;
00068 PT(RenderRelation) room_arc;
00069 PT(RenderRelation) ball_arc;
00070 PT(RenderRelation) hide_ball_arc;
00071 
00072 bool follow_ball;
00073 PT(PlanarSlider) ball_slider;
00074 
00075 PT(LensNode) tex_proj;
00076 PT(ProjtexShader) proj_shader;
00077 PT(GeomNode) proj_geom_node;
00078 PT(Trackball) tex_proj_trackball;
00079 PT(SpotlightShader) spot_shader;
00080 PT_NamedNode spot_shaft;
00081 PT(Spotlight) tex_proj_spot;
00082 PT(Trackball) tex_spot_trackball;
00083 PT(ProjtexShadower) proj_shadow;
00084 PT(SpheretexHighlighter) highlight;
00085 PT(SpheretexShader) spheretex;
00086 PT(SpheretexReflector) sreflect;
00087 PT(PlanarReflector) preflect;
00088 PT(OutlineShader) outline_shader;
00089 
00090 void panda_overrides_func(ChanCfgOverrides& override, std::string&) {
00091   override.setField(ChanCfgOverrides::Mask,
00092                    ((unsigned int)(W_DOUBLE|W_DEPTH|W_MULTISAMPLE|W_STENCIL)));
00093   override.setField(ChanCfgOverrides::Title, "Panda Demo");
00094 }
00095 
00096 void panda_idle(void) {
00097   static const double walk_speed = 4.0;  // feet per second
00098   if (follow_ball) {
00099     LPoint3f bp = get_rel_pos(ball, panda);
00100     LVector2f bv2(bp[0], bp[1]);
00101     float dist = length(bv2);
00102     if (dist > 0.0001) {
00103       LMatrix4f mat;
00104       look_at(mat, LPoint3f(-bp[0], -bp[1], 0.));
00105       panda_rot_arc->set_transition(new TransformTransition(mat));
00106 
00107       float stride = walk_speed * ClockObject::get_global_clock()->get_dt();
00108       if (dist > stride) {
00109         LVector2f step = bv2 / dist * stride;
00110         const TransformTransition *tt;
00111         if (!get_transition_into(tt, panda_arc)) {
00112           panda_arc->set_transition
00113             (new TransformTransition
00114              (LMatrix4f::translate_mat(step[0], step[1], 0.)));
00115         } else {
00116           LMatrix4f mat = tt->get_matrix();
00117           mat(3, 0) += step[0];
00118           mat(3, 1) += step[1];
00119           panda_arc->set_transition(new TransformTransition(mat));
00120         }
00121       }
00122     }
00123   }
00124 }
00125 
00126 void event_p(CPT_Event) {
00127   static bool projtex_mode = false;
00128 
00129   projtex_mode = !projtex_mode;
00130   if (!projtex_mode) {
00131     // disable the projtex shader
00132     clear_shader(room_arc, proj_shader);
00133     clear_shader(panda_arc, proj_shader);
00134     clear_shader(ball_arc, proj_shader);
00135 
00136     set_alt_trackball((Node*)0L);
00137     remove_child(tex_proj, proj_geom_node, RenderRelation::get_class_type());
00138   } else {
00139     // enable the projtex shader
00140     set_shader(room_arc, proj_shader);
00141     set_shader(panda_arc, proj_shader);
00142     set_shader(ball_arc, proj_shader);
00143 
00144     set_alt_trackball(tex_proj_trackball);
00145     // Display the texture projector frustum
00146     RenderRelation *prr = new RenderRelation(tex_proj, proj_geom_node);
00147     LightTransition *plt = new LightTransition(LightTransition::all_off());
00148     prr->set_transition(plt);
00149   }
00150 }
00151 
00152 void event_s(CPT_Event) {
00153   static bool projtexspot_mode = false;
00154 
00155   projtexspot_mode = !projtexspot_mode;
00156   if (!projtexspot_mode) {
00157     // disable the projtex spotlight shader
00158     clear_shader(room_arc, spot_shader);
00159     clear_shader(panda_arc, spot_shader);
00160     clear_shader(ball_arc, spot_shader);
00161 
00162     set_alt_trackball((Node*)0L);
00163     remove_child(tex_proj_spot, spot_shaft, RenderRelation::get_class_type());
00164   } else {
00165     // enable the projtex spotlight shader
00166     set_shader(room_arc, spot_shader);
00167     set_shader(panda_arc, spot_shader);
00168     set_shader(ball_arc, spot_shader);
00169 
00170     set_alt_trackball(tex_spot_trackball);
00171     new RenderRelation(tex_proj_spot, spot_shaft, 10);
00172   }
00173 }
00174 
00175 void event_d(CPT_Event) {
00176   static bool projtex_shadow_mode = false;
00177 
00178   projtex_shadow_mode = !projtex_shadow_mode;
00179   if (!projtex_shadow_mode) {
00180     // disable projtex shadows
00181     clear_shader(room_arc, proj_shadow);
00182     set_alt_trackball((Node*)0L);
00183   } else {
00184     // enable projtex shadows
00185     set_shader(room_arc, proj_shadow);
00186     set_alt_trackball(tex_spot_trackball);
00187   }
00188 }
00189 
00190 void event_h(CPT_Event) {
00191   static bool highlight_mode = false;
00192 
00193   highlight_mode = !highlight_mode;
00194   if (!highlight_mode) {
00195     // disable highlight shader
00196     clear_shader(ball_arc, highlight);
00197   } else {
00198     // enable highlight shader
00199     set_shader(ball_arc, highlight);
00200   }
00201 }
00202 
00203 void event_e(CPT_Event) {
00204   static bool spheretex_mode = false;
00205 
00206   spheretex_mode = !spheretex_mode;
00207   if (!spheretex_mode) {
00208     // enable spheretex shader
00209     clear_shader(ball_arc, spheretex);
00210   } else {
00211     // disable spheretex shader
00212     set_shader(ball_arc, spheretex);
00213   }
00214 }
00215 
00216 void event_m(CPT_Event) {
00217   static bool sphere_reflect_mode = false;
00218 
00219   sphere_reflect_mode = !sphere_reflect_mode;
00220   if (!sphere_reflect_mode) {
00221     // disable sphere reflections
00222     clear_shader(ball_arc, sreflect);
00223   } else {
00224     // enable sphere reflections
00225     set_shader(ball_arc, sreflect);
00226   }
00227 }
00228 
00229 void event_r(CPT_Event) {
00230   static bool plane_reflect_mode = false;
00231 
00232   plane_reflect_mode = !plane_reflect_mode;
00233   if (!plane_reflect_mode) {
00234     // disable planar reflections
00235     clear_shader(room_arc, preflect);
00236   } else {
00237     // enable planar reflections
00238     set_shader(room_arc, preflect);
00239   }
00240 }
00241 
00242 void event_z(CPT_Event) {
00243   set_alt_trackball(ball_slider);
00244 }
00245 
00246 void event_Z(CPT_Event) {
00247   follow_ball = !follow_ball;
00248   if (follow_ball) {
00249     // hide the ball while following it.
00250     remove_arc(hide_ball_arc);
00251   } else {
00252     // reveal the ball when we're done following it
00253     hide_ball_arc = new RenderRelation(render, hide_ball);
00254   }
00255 }
00256 
00257 void event_o(CPT_Event) {
00258   static bool outline_mode = false;
00259 
00260   outline_mode = !outline_mode;
00261   if (!outline_mode) {
00262     // disable outline shader
00263     clear_shader(panda_arc, outline_shader);
00264   } else {
00265     // enable outline shader
00266     set_shader(panda_arc, outline_shader);
00267   }
00268 }
00269 
00270 void load_our_models(void) {
00271   // load the room
00272   PT_Node rroom = loader.load_sync("lfloor.egg");
00273   assert(rroom != (Node*)0L);
00274   room = new NamedNode("The_room");
00275   new RenderRelation(room, rroom);
00276   room_arc = new RenderRelation(root, room);
00277 
00278   // load the ball
00279   PT_Node rball = loader.load_sync("marble_ball.egg");
00280   assert(rball != (Node*)0L);
00281   ball = new NamedNode("scaled_ball");
00282   PT(RenderRelation) ball_arc1 = new RenderRelation(ball, rball);
00283   ball_arc1->set_transition
00284     (new TransformTransition(LMatrix4f::scale_mat(0.2)));
00285   hide_ball = new NamedNode("hide_ball");
00286   ball_arc = new RenderRelation(hide_ball, ball);
00287   ball_arc->set_transition
00288     (new TransformTransition(LMatrix4f::translate_mat(4., 2., 1.)));
00289   hide_ball_arc = new RenderRelation(root, hide_ball);
00290 
00291   // load a camera model to visualize our eyepoint
00292   PT_Node rcamera_model = loader.load_sync("camera.egg");
00293   assert(rcamera_model != (Node*)0L);
00294   camera_model = new NamedNode("camera_model");
00295   new RenderRelation(camera_model, rcamera_model);
00296   new RenderRelation(cameras, camera_model);
00297 
00298   // load the panda
00299   PT_Node pmodel = loader.load_sync("panda-3k.egg");
00300   assert(pmodel != (Node*)0L);
00301   PT_Node panim = loader.load_sync("panda-walk.egg");
00302   assert(panim != (Node*)0L);
00303   PT_NamedNode pparent = new NamedNode("panda_parent");
00304   new RenderRelation(pparent, pmodel);
00305   new RenderRelation(pparent, panim);
00306   PT_NamedNode prot = new NamedNode("panda_rot");
00307   PT(RenderRelation) p_arc1 = new RenderRelation(prot, pparent);
00308   p_arc1->set_transition
00309     (new TransformTransition(LMatrix4f::scale_mat(0.35)));
00310   panda = new NamedNode("Panda");
00311   panda_rot_arc = new RenderRelation(panda, prot);
00312   panda_arc = new RenderRelation(root, panda);
00313   AnimControlCollection anim_controls;
00314   auto_bind(pparent, anim_controls, ~0);
00315   anim_controls.loop_all(true);
00316 
00317   // control the ball using a PlanarSlider tform
00318   ball_slider = new PlanarSlider("ball_slider");
00319   ball_slider->set_transform(LMatrix4f::translate_mat(0., 0., 1.) *
00320                              LMatrix4f::scale_mat(7., -7., 1.));
00321   ball_slider->set_mouse_pos(LPoint2f(4. / 7., 2. / -7.));
00322   Transform2SG* slider2ball = new Transform2SG("slider2ball");
00323   slider2ball->set_arc(ball_arc);
00324   new RenderRelation(ball_slider, slider2ball);
00325   follow_ball = false;
00326 }
00327 
00328 void setup_shaders(void) {
00329   // Projected texture shader
00330   Texture* tex = TexturePool::load_texture("smiley.rgba");
00331   assert(tex != (Texture*)0L);
00332   tex_proj = new LensNode("texture_projector");
00333   RenderRelation* proj_arc = new RenderRelation(root, tex_proj);
00334   tex_proj_trackball = new Trackball("tex_proj_trackball");
00335   tex_proj_trackball->set_invert(false);
00336   tex_proj_trackball->set_rel_to(cameras);
00337   Transform2SG* tball2cam = new Transform2SG("tball2cam");
00338   tball2cam->set_arc(proj_arc);
00339   new RenderRelation(tex_proj_trackball, tball2cam);
00340   LMatrix4f proj_mat;
00341   LPoint3f proj_pos = LPoint3f::rfu(2., 3., 8.);
00342   LVector3f fwd_vec = proj_pos - LPoint3f::origin();
00343   look_at(proj_mat, -fwd_vec);
00344   proj_mat.set_row(3, proj_pos);
00345   tex_proj_trackball->set_mat(proj_mat);
00346   proj_arc->set_transition(new TransformTransition(proj_mat));
00347   proj_shader = new ProjtexShader(tex);
00348   proj_shader->add_frustum(tex_proj);
00349   PT(Geom) proj_geom =
00350     tex_proj->get_lens()->make_geometry();
00351   proj_geom_node = new GeomNode("proj_geometry");
00352   proj_geom_node->add_geom(proj_geom);
00353   proj_shader->set_priority(150);
00354 
00355   cerr << "done with projected texture setup" << endl;
00356 
00357   // projected texture spotlight shader
00358   tex_proj_spot = new Spotlight("tex_proj_spotlight");
00359   PT(Lens) lens = new PerspectiveLens;
00360   lens->set_fov(45.0f);
00361   lens->set_near(f._fnear);
00362   lens->set_far(13.0f);
00363   tex_proj_spot->set_lens(lens);
00364   RenderRelation* spot_arc = new RenderRelation(root, tex_proj_spot, 10);
00365   tex_spot_trackball = new Trackball("tex_spot_trackball");
00366   tex_spot_trackball->set_invert(false);
00367   tex_spot_trackball->set_rel_to(cameras);
00368   tball2cam = new Transform2SG("tball2cam");
00369   tball2cam->set_arc(spot_arc);
00370   new RenderRelation(tex_spot_trackball, tball2cam);
00371   LMatrix4f spot_mat;
00372   LPoint3f spot_pos = LPoint3f::rfu(-4., -3., 8.);
00373   LVector3f spot_vec = spot_pos - LPoint3f::origin();
00374   look_at(spot_mat, -spot_vec);
00375   spot_mat.set_row(3, spot_pos);
00376   tex_spot_trackball->set_mat(spot_mat);
00377   spot_arc->set_transition(new TransformTransition(spot_mat));
00378   spot_shader = new SpotlightShader;
00379   spot_shader->add_frustum(tex_proj_spot);
00380   spot_shaft = tex_proj_spot->make_geometry(0.05, 8., 36);
00381   spot_shader->set_priority(150);
00382 
00383   cerr << "done with projected texture spotlight setup" << endl;
00384 
00385   // projected texture shadower
00386   proj_shadow = new ProjtexShadower;
00387   proj_shadow->add_frustum(tex_proj_spot);
00388   proj_shadow->add_caster(panda);
00389   proj_shadow->add_caster(ball);
00390   proj_shadow->add_caster(camera_model);
00391   proj_shadow->set_priority(150);
00392 
00393   cerr << "done with projected texture shadower setup" << endl;
00394 
00395   // sphere texture shader
00396   spheretex = new SpheretexShader(tex);
00397   spheretex->set_priority(150);
00398 
00399   cerr << "done with sphere texture shader" << endl;
00400 
00401   // sphere texture highlighter
00402   highlight = new SpheretexHighlighter;
00403   highlight->add_frustum(tex_proj_spot);
00404   highlight->set_priority(150);
00405 
00406   cerr << "done with sphere texture highlighter setup" << endl;
00407 
00408   // sphere texture reflector
00409   sreflect = new SpheretexReflector;
00410   sreflect->add_frustum(tex_proj_spot);
00411   sreflect->add_caster(room);
00412   sreflect->add_caster(panda);
00413   sreflect->add_caster(camera_model);
00414   sreflect->set_priority(150);
00415 
00416   cerr << "done with sphere texture reflector setup" << endl;
00417 
00418   // planar reflector
00419   Planef p(LVector3f::up(), LPoint3f::origin());
00420   PlaneNode* plane_node = new PlaneNode;
00421   plane_node->set_plane(p);
00422   new RenderRelation(room, plane_node);
00423   preflect = new PlanarReflector(plane_node);
00424   preflect->add_caster(ball);
00425   preflect->add_caster(panda);
00426   preflect->add_caster(camera_model);
00427   preflect->set_priority(150);
00428 
00429   cerr << "done with planar reflector setup" << endl;
00430 
00431   // outline shader
00432   outline_shader = new OutlineShader;
00433   outline_shader->set_priority(150);
00434 
00435   cerr << "done with outline shader setup" << endl;
00436 }
00437 
00438 void panda_keys(EventHandler& eh) {
00439   new RenderRelation( lights, dlight );
00440   have_dlight = true;
00441 
00442   eh.add_hook("p", event_p);   // projected texture shader
00443   eh.add_hook("s", event_s);   // projected texture spotlight shader
00444   eh.add_hook("d", event_d);   // projected texture shadow shader
00445   eh.add_hook("h", event_h);   // fake phong highlight
00446   eh.add_hook("e", event_e);   // sphere texture shader
00447   eh.add_hook("m", event_m);   // sphere reflection shader
00448   eh.add_hook("r", event_r);   // planar reflection shader
00449   eh.add_hook("o", event_o);   // outline shader
00450 
00451   eh.add_hook("z", event_z);   // user controls the ball
00452   eh.add_hook("Z", event_Z);   // follow the ball around
00453 
00454   load_our_models();
00455   setup_shaders();
00456 }
00457 
00458 int main(int argc, char *argv[]) {
00459   define_keys = &panda_keys;
00460   additional_idle = &panda_idle;
00461   extra_overrides_func = &panda_overrides_func;
00462   return framework_main(argc, argv);
00463 }

Generated on Fri May 2 00:34:28 2003 for Panda by doxygen1.3