00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
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
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;
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
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
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
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
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
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
00181 clear_shader(room_arc, proj_shadow);
00182 set_alt_trackball((Node*)0L);
00183 } else {
00184
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
00196 clear_shader(ball_arc, highlight);
00197 } else {
00198
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
00209 clear_shader(ball_arc, spheretex);
00210 } else {
00211
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
00222 clear_shader(ball_arc, sreflect);
00223 } else {
00224
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
00235 clear_shader(room_arc, preflect);
00236 } else {
00237
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
00250 remove_arc(hide_ball_arc);
00251 } else {
00252
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
00263 clear_shader(panda_arc, outline_shader);
00264 } else {
00265
00266 set_shader(panda_arc, outline_shader);
00267 }
00268 }
00269
00270 void load_our_models(void) {
00271
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
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
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
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
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
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
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
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
00396 spheretex = new SpheretexShader(tex);
00397 spheretex->set_priority(150);
00398
00399 cerr << "done with sphere texture shader" << endl;
00400
00401
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
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
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
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);
00443 eh.add_hook("s", event_s);
00444 eh.add_hook("d", event_d);
00445 eh.add_hook("h", event_h);
00446 eh.add_hook("e", event_e);
00447 eh.add_hook("m", event_m);
00448 eh.add_hook("r", event_r);
00449 eh.add_hook("o", event_o);
00450
00451 eh.add_hook("z", event_z);
00452 eh.add_hook("Z", event_Z);
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 }