00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
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
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;
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
00165 static bool projtex_mode = false;
00166
00167 projtex_mode = !projtex_mode;
00168 if (!projtex_mode) {
00169
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
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
00192 static bool projtexspot_mode = false;
00193 LightTransition light_trans;
00194
00195 projtexspot_mode = !projtexspot_mode;
00196 if (!projtexspot_mode) {
00197
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
00217 static bool projtex_shadow_mode = false;
00218
00219 projtex_shadow_mode = !projtex_shadow_mode;
00220 if (!projtex_shadow_mode) {
00221
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
00233 static bool highlight_mode = false;
00234
00235 highlight_mode = !highlight_mode;
00236 if (!highlight_mode) {
00237
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
00247 static bool spheretex_mode = false;
00248
00249 spheretex_mode = !spheretex_mode;
00250 if (!spheretex_mode) {
00251
00252 clear_shader(ball_arc, spheretex);
00253
00254 } else {
00255
00256 set_shader(ball_arc, spheretex);
00257 }
00258 }
00259
00260 void event_m(CPT_Event) {
00261
00262 static bool sphere_reflect_mode = false;
00263
00264 sphere_reflect_mode = !sphere_reflect_mode;
00265 if (!sphere_reflect_mode) {
00266
00267 clear_shader(ball_arc, sreflect);
00268
00269 } else {
00270
00271 set_shader(ball_arc, sreflect);
00272 }
00273 }
00274
00275 void event_r(CPT_Event) {
00276
00277 static bool plane_reflect_mode = false;
00278
00279 plane_reflect_mode = !plane_reflect_mode;
00280 if (!plane_reflect_mode) {
00281
00282 clear_shader(room_arc, preflect);
00283
00284 } else {
00285
00286 set_shader(room_arc, preflect);
00287 }
00288 }
00289
00290 void event_z(CPT_Event) {
00291
00292 set_alt_trackball(ball_slider);
00293 }
00294
00295 void event_Z(CPT_Event) {
00296
00297 follow_ball = !follow_ball;
00298
00299 if (follow_ball) {
00300
00301 remove_arc(hide_ball_arc);
00302 } else {
00303
00304 hide_ball_arc = new RenderRelation(render, hide_ball);
00305 }
00306 }
00307
00308 void event_o(CPT_Event) {
00309
00310 static bool outline_mode = false;
00311
00312 outline_mode = !outline_mode;
00313 if (!outline_mode) {
00314
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);
00325 eh.add_hook("s", event_s);
00326 eh.add_hook("d", event_d);
00327 eh.add_hook("e", event_e);
00328 eh.add_hook("h", event_h);
00329 eh.add_hook("m", event_m);
00330 eh.add_hook("r", event_r);
00331 eh.add_hook("z", event_z);
00332 eh.add_hook("Z", event_Z);
00333 eh.add_hook("o", event_o);
00334
00335
00336
00337
00338
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
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
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
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
00383 PT_NamedNode room = loader.load_sync("lfloor.egg");
00384 assert(room != (NamedNode *)NULL);
00385 room_arc = new RenderRelation(render, room);
00386
00387
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
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
00401
00402
00403 Texture* tex = new Texture;
00404 tex->read("smiley.rgba");
00405 tex->set_name("smiley.rgba");
00406
00407
00408 tex_proj = new LensNode("texture_projector");
00409 RenderRelation* proj_arc = new RenderRelation(render, tex_proj);
00410
00411
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
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
00429 proj_shader = new ProjtexShader(tex);
00430 proj_shader->add_frustum(tex_proj);
00431
00432
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
00441
00442 tex_proj_spot = new Spotlight("tex_proj_spotlight");
00443 spot_arc = new RenderRelation(render, tex_proj_spot, 10);
00444
00445
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
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
00463 spot_shader = new SpotlightShader;
00464 spot_shader->add_frustum(tex_proj_spot);
00465
00466
00467 spot_shaft = tex_proj_spot->make_geometry(0.05, 8.0, 36);
00468
00469
00470
00471
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
00482
00483 spheretex = new SpheretexShader(tex);
00484
00485
00486
00487
00488
00489 highlight = new SpheretexHighlighter;
00490 highlight->add_frustum(tex_proj_spot);
00491
00492
00493
00494
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
00505
00506
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
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 }