00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <projtexShader.h>
00021 #include <spotlightShader.h>
00022 #include <projtexShadower.h>
00023 #include <planarReflector.h>
00024
00025
00026 #include <chancfg.h>
00027
00028
00029 #include <texture.h>
00030 #include <texturePool.h>
00031
00032
00033 #include <textureTransition.h>
00034 #include <shaderTransition.h>
00035 #include <lightTransition.h>
00036 #include <transformTransition.h>
00037 #include <colorBlendTransition.h>
00038
00039
00040 #include <light.h>
00041 #include <spotlight.h>
00042
00043
00044 #include <pt_NamedNode.h>
00045 #include <geomNode.h>
00046
00047
00048 #include <renderRelation.h>
00049 #include <nodeRelation.h>
00050 #include <dataRelation.h>
00051
00052
00053 #include <dconfig.h>
00054 #include <framework.h>
00055 #include <loader.h>
00056 #include <eventHandler.h>
00057 #include <geomLine.h>
00058
00059
00060 #include <transform2sg.h>
00061 #include <look_at.h>
00062 #include <perspectiveLens.h>
00063 #include <get_rel_pos.h>
00064
00065
00066 #include <planarSlider.h>
00067 #include <mouse.h>
00068
00069
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;
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
00166 static bool projtex_mode = false;
00167
00168 projtex_mode = !projtex_mode;
00169 if (!projtex_mode) {
00170
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
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
00193 static bool projtexspot_mode = false;
00194 LightTransition light_trans;
00195
00196 projtexspot_mode = !projtexspot_mode;
00197 if (!projtexspot_mode) {
00198
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
00218 static bool projtex_shadow_mode = false;
00219
00220 projtex_shadow_mode = !projtex_shadow_mode;
00221 if (!projtex_shadow_mode) {
00222
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
00234 static bool plane_reflect_mode = false;
00235
00236 plane_reflect_mode = !plane_reflect_mode;
00237 if (!plane_reflect_mode) {
00238
00239 clear_shader(room_arc, preflect);
00240
00241 } else {
00242
00243 set_shader(room_arc, preflect);
00244 }
00245 }
00246
00247 void event_z(CPT_Event) {
00248
00249 set_alt_trackball(ball_slider);
00250 }
00251
00252 void event_Z(CPT_Event) {
00253
00254 follow_ball = !follow_ball;
00255
00256 if (follow_ball) {
00257
00258 remove_arc(hide_ball_arc);
00259 } else {
00260
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);
00269 eh.add_hook("s", event_s);
00270 eh.add_hook("d", event_d);
00271 eh.add_hook("r", event_r);
00272 eh.add_hook("z", event_z);
00273 eh.add_hook("Z", event_Z);
00274
00275
00276
00277
00278
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
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
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
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
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
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
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
00344
00345
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
00353 tex_proj = new LensNode("texture_projector");
00354 RenderRelation* proj_arc = new RenderRelation(render, tex_proj);
00355
00356
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
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
00374 proj_shader = new ProjtexShader(tex);
00375 proj_shader->add_frustum(tex_proj);
00376
00377
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
00386
00387 tex_proj_spot = new Spotlight("tex_proj_spotlight");
00388 spot_arc = new RenderRelation(render, tex_proj_spot, 10);
00389
00390
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
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
00408 spot_shader = new SpotlightShader;
00409 spot_shader->add_frustum(tex_proj_spot);
00410
00411
00412 spot_shaft = tex_proj_spot->make_geometry(0.05, 8.0, 36);
00413
00414
00415
00416
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
00426
00427
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 }