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 #include <spheretexReflector.h>
00025 #include <spheretexHighlighter.h>
00026 #include <spheretexReflector.h>
00027 #include <outlineShader.h>
00028
00029
00030 #include <chancfg.h>
00031
00032
00033 #include <texture.h>
00034 #include <texturePool.h>
00035
00036
00037 #include <textureTransition.h>
00038 #include <shaderTransition.h>
00039 #include <lightTransition.h>
00040 #include <transformTransition.h>
00041 #include <colorBlendTransition.h>
00042
00043
00044 #include <light.h>
00045 #include <spotlight.h>
00046
00047
00048 #include <pt_NamedNode.h>
00049 #include <geomNode.h>
00050
00051
00052 #include <renderRelation.h>
00053 #include <nodeRelation.h>
00054 #include <dataRelation.h>
00055
00056
00057 #include <dconfig.h>
00058 #include <framework.h>
00059 #include <loader.h>
00060 #include <eventHandler.h>
00061
00062
00063 #include <transform2sg.h>
00064 #include <look_at.h>
00065 #include <perspectiveLens.h>
00066 #include <geomLine.h>
00067
00068 Configure(min_shader);
00069 ConfigureFn(min_shader) {
00070 }
00071
00072
00073 PT(LensNode) tex_proj;
00074 PT(Trackball) tex_proj_trackball;
00075 PT(ProjtexShader) proj_shader;
00076
00077 PT(Spotlight) tex_proj_spot;
00078 PT(Trackball) tex_spot_trackball;
00079 PT(SpotlightShader) spot_shader;
00080
00081 PT(ProjtexShadower) proj_shadow;
00082
00083 PT(PlanarReflector) preflect;
00084
00085 PT(SpheretexShader) spheretex;
00086
00087 PT(SpheretexHighlighter) highlight;
00088
00089 PT(SpheretexReflector) sreflect;
00090
00091 PT(OutlineShader) outline_shader;
00092
00093 ShaderTransition shader_trans;
00094
00095 RenderRelation* room_arc;
00096 RenderRelation* spot_arc;
00097 RenderRelation* jack_arc;
00098 RenderRelation* camera_model_arc;
00099 RenderRelation* smiley_arc;
00100
00101 PT(LightTransition) light_transition;
00102
00103
00104 extern PT_NamedNode render;
00105 extern NodeAttributes initial_state;
00106 extern RenderRelation* first_arc;
00107 extern PT_NamedNode lights;
00108 extern PT_NamedNode root;
00109 extern PT(GeomNode) geomnode;
00110 extern PT_NamedNode cameras;
00111 extern PT(MouseAndKeyboard) mak;
00112
00113 extern void set_alt_trackball(Node *trackball);
00114
00115 extern int framework_main(int argc, char *argv[]);
00116 extern void (*extra_display_func)();
00117 extern void (*define_keys)(EventHandler&);
00118
00119 extern PT(GraphicsWindow) main_win;
00120
00121
00122 LPoint3f center_pos = LPoint3f::origin();
00123 Transform2SG *tball2cam;
00124 Texture* tex;
00125
00126
00127 class BaseViz : public Shader::Visualize {
00128 public:
00129 BaseViz(void);
00130 virtual ~BaseViz(void);
00131 virtual void DisplayTexture(PT(Texture)&, Shader*);
00132 virtual void DisplayPixelBuffer(PT(PixelBuffer)&, Shader*);
00133 protected:
00134 typedef std::plist<PT(Texture) > texlist;
00135 typedef texlist::iterator texiter;
00136 typedef std::plist<PT(PixelBuffer) > pblist;
00137 typedef pblist::iterator pbiter;
00138
00139 texlist _texs;
00140 pblist _pbs;
00141 };
00142
00143 BaseViz::BaseViz(void) {}
00144
00145 BaseViz::~BaseViz(void) {}
00146
00147 void BaseViz::DisplayTexture(PT(Texture)& tex, Shader*) {
00148 if (tex->has_ram_image())
00149 _texs.push_back(tex);
00150 else {
00151 GraphicsStateGuardian* g = main_win->get_gsg();
00152 PT(PixelBuffer) pb(new PixelBuffer);
00153 g->texture_to_pixel_buffer(tex->prepare(g), pb);
00154 _pbs.push_back(pb);
00155 }
00156 }
00157
00158 void BaseViz::DisplayPixelBuffer(PT(PixelBuffer)& pb, Shader*) {
00159 _pbs.push_back(pb);
00160 }
00161
00162 class Oldviz : public BaseViz {
00163 public:
00164 Oldviz(PT(GraphicsWindow)&);
00165 virtual ~Oldviz(void);
00166 virtual void Flush(void);
00167 protected:
00168 PT(GraphicsWindow) _w;
00169 };
00170
00171 Oldviz::Oldviz(PT(GraphicsWindow)& win) : _w(win) {}
00172
00173 Oldviz::~Oldviz(void) {}
00174
00175 void Oldviz::Flush(void) {
00176 GraphicsStateGuardian* g = _w->get_gsg();
00177 const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00178 PT(DisplayRegion) d(_w->make_scratch_display_region(256, 256));
00179
00180 for (texiter i=_texs.begin(); i!=_texs.end(); ++i)
00181 (*i)->draw(g, d, r);
00182 for (pbiter j=_pbs.begin(); j!=_pbs.end(); ++j)
00183 (*j)->draw(g, d, r);
00184 _texs.erase(_texs.begin(), _texs.end());
00185 _pbs.erase(_pbs.begin(), _pbs.end());
00186 }
00187
00188 class Viztex : public BaseViz {
00189 public:
00190 Viztex(PT(GraphicsPipe)&);
00191 virtual ~Viztex(void);
00192 virtual void Flush(void);
00193 protected:
00194 typedef std::plist< PT(GraphicsWindow) > winlist;
00195 typedef winlist::iterator winiter;
00196
00197 winlist _wins;
00198 PT(GraphicsPipe) _pipe;
00199 };
00200
00201 Viztex::Viztex(PT(GraphicsPipe)& p) : _pipe(p) {}
00202
00203 Viztex::~Viztex(void) {}
00204
00205 void Viztex::Flush(void) {
00206 winiter _witer = _wins.begin();
00207
00208 for (texiter i=_texs.begin(); i!=_texs.end(); ++i) {
00209 GraphicsWindow* w;
00210
00211 if (_witer == _wins.end()) {
00212 ChanCfgOverrides override;
00213
00214 override.setField(ChanCfgOverrides::Mask,
00215 ((unsigned int)(W_SINGLE)));
00216 override.setField(ChanCfgOverrides::Title, "Multipass partial");
00217 override.setField(ChanCfgOverrides::SizeX, 256);
00218 override.setField(ChanCfgOverrides::SizeY, 256);
00219 override.setField(ChanCfgOverrides::Cameras, false);
00220 w = ChanConfig(_pipe, "single", (Node *)NULL, render, override);
00221 _wins.push_back(w);
00222 }
00223 else
00224 {
00225 w = *_witer;
00226 ++_witer;
00227 }
00228 GraphicsStateGuardian* g = w->get_gsg();
00229 const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00230 PT(DisplayRegion) d(w->make_scratch_display_region(w->get_width(),
00231 w->get_height()));
00232
00233 (*i)->draw(g, d, r);
00234 }
00235 for (pbiter j=_pbs.begin(); j!=_pbs.end(); ++j) {
00236 GraphicsWindow* w;
00237
00238 if (_witer == _wins.end()) {
00239 ChanCfgOverrides override;
00240
00241 override.setField(ChanCfgOverrides::Mask,
00242 ((unsigned int)(W_SINGLE)));
00243 override.setField(ChanCfgOverrides::Title, "Multipass partial");
00244 override.setField(ChanCfgOverrides::SizeX, 256);
00245 override.setField(ChanCfgOverrides::SizeY, 256);
00246 override.setField(ChanCfgOverrides::Cameras, false);
00247 w = ChanConfig(_pipe, "single", cameras, render, override);
00248 _wins.push_back(w);
00249 } else {
00250 w = *_witer;
00251 ++_witer;
00252 }
00253 GraphicsStateGuardian* g = w->get_gsg();
00254 const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00255 PT(DisplayRegion) d(w->make_scratch_display_region(w->get_width(),
00256 w->get_height()));
00257
00258 (*j)->draw(g, d, r);
00259 }
00260 _texs.erase(_texs.begin(), _texs.end());
00261 _pbs.erase(_pbs.begin(), _pbs.end());
00262 }
00263
00264 class Tiledviz : public Viztex {
00265 public:
00266 Tiledviz(PT(GraphicsPipe)&);
00267 virtual ~Tiledviz(void);
00268 virtual void Flush(void);
00269 };
00270
00271 Tiledviz::Tiledviz(PT(GraphicsPipe)& p) : Viztex(p) {}
00272
00273 Tiledviz::~Tiledviz(void) {}
00274
00275 void Tiledviz::Flush(void) {
00276 int count = 0;
00277 int layer_count = 0;
00278 winiter _witer = _wins.begin();
00279
00280 for (texiter texi=_texs.begin(); texi!=_texs.end(); ++texi) {
00281 GraphicsWindow* w;
00282 DisplayRegion* d;
00283
00284 if (_witer == _wins.end()) {
00285 ChanCfgOverrides override;
00286
00287 override.setField(ChanCfgOverrides::Mask,
00288 ((unsigned int)(W_SINGLE)));
00289 override.setField(ChanCfgOverrides::Title, "Multipass partial");
00290 override.setField(ChanCfgOverrides::SizeX, main_win->get_width());
00291 override.setField(ChanCfgOverrides::SizeY, main_win->get_height());
00292 override.setField(ChanCfgOverrides::Cameras, false);
00293 w = ChanConfig(_pipe, "multipass-tile", cameras, render, override);
00294 _wins.push_back(w);
00295 _witer = --(_wins.end());
00296 } else
00297 w = *_witer;
00298
00299 int dridx;
00300 GraphicsStateGuardian* g = w->get_gsg();
00301 GraphicsChannel *chan = w->get_channel(0);
00302 GraphicsLayer *layer = chan->get_layer(layer_count);
00303 const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00304
00305 d = layer->get_dr(count);
00306 (*texi)->draw(g, d, r);
00307
00308 ++count;
00309 if (count == layer->get_num_drs()) {
00310 count = 0;
00311 ++layer_count;
00312 }
00313
00314 if (layer_count == chan->get_num_layers())
00315 {
00316 layer_count = 0;
00317 ++_witer;
00318 }
00319 }
00320
00321 for (pbiter pbi=_pbs.begin(); pbi!=_pbs.end(); ++pbi) {
00322 GraphicsWindow* w;
00323 DisplayRegion* d;
00324
00325 if (_witer == _wins.end()) {
00326 ChanCfgOverrides override;
00327
00328 override.setField(ChanCfgOverrides::Mask,
00329 ((unsigned int)(W_SINGLE)));
00330 override.setField(ChanCfgOverrides::Title, "Multipass partial");
00331 override.setField(ChanCfgOverrides::SizeX, main_win->get_width());
00332 override.setField(ChanCfgOverrides::SizeY, main_win->get_height());
00333 override.setField(ChanCfgOverrides::Cameras, false);
00334 w = ChanConfig(_pipe, "multipass-tile", cameras, render, override);
00335 _wins.push_back(w);
00336 _witer = --(_wins.end());
00337 } else
00338 w = *_witer;
00339
00340 int dridx;
00341 GraphicsStateGuardian* g = w->get_gsg();
00342 GraphicsChannel *chan = w->get_channel(0);
00343 GraphicsLayer *layer = chan->get_layer(layer_count);
00344 const RenderBuffer& r = g->get_render_buffer(RenderBuffer::T_front);
00345
00346 d = layer->get_dr(count);
00347 (*pbi)->draw(g, d, r);
00348
00349 ++count;
00350 if (count == layer->get_num_drs()) {
00351 count = 0;
00352 ++layer_count;
00353 }
00354
00355 if (layer_count == chan->get_num_layers())
00356 {
00357 layer_count = 0;
00358 ++_witer;
00359 }
00360
00361 }
00362 _texs.erase(_texs.begin(), _texs.end());
00363 _pbs.erase(_pbs.begin(), _pbs.end());
00364 }
00365
00366 void shader_display_func(void) {
00367 Shader::Visualize* v = Shader::get_viz();
00368 if (v != (Shader::Visualize*)0L)
00369 v->Flush();
00370 }
00371
00372
00373
00374
00375
00376
00377
00378
00379 void event_p(CPT_Event) {
00380 static bool projtex_mode = false;
00381
00382 projtex_mode = !projtex_mode;
00383 if (!projtex_mode) {
00384
00385 clear_shader(room_arc, proj_shader);
00386
00387
00388
00389 set_alt_trackball(NULL);
00390
00391 } else {
00392
00393 set_shader(room_arc, proj_shader);
00394
00395
00396
00397 set_alt_trackball(tex_proj_trackball);
00398 }
00399 }
00400
00401
00402
00403
00404
00405
00406 void event_s(CPT_Event) {
00407 static bool projtexspot_mode = false;
00408
00409 projtexspot_mode = !projtexspot_mode;
00410 if (!projtexspot_mode) {
00411
00412 clear_shader(room_arc, spot_shader);
00413
00414 set_alt_trackball(NULL);
00415 } else {
00416
00417 set_shader(room_arc, spot_shader);
00418
00419 set_alt_trackball(tex_spot_trackball);
00420 }
00421 }
00422
00423
00424
00425
00426
00427
00428 void event_d(CPT_Event)
00429 {
00430 static bool projtex_shadow_mode = false;
00431
00432 projtex_shadow_mode = !projtex_shadow_mode;
00433 if (!projtex_shadow_mode) {
00434
00435 clear_shader(room_arc, proj_shadow);
00436 set_alt_trackball(NULL);
00437
00438 }
00439 else
00440 {
00441 set_shader(room_arc, proj_shadow);
00442 set_alt_trackball(tex_spot_trackball);
00443 }
00444 }
00445
00446
00447
00448
00449
00450
00451
00452 void event_r(CPT_Event)
00453 {
00454 static bool plane_reflect_mode = false;
00455
00456 plane_reflect_mode = !plane_reflect_mode;
00457 if (!plane_reflect_mode) {
00458
00459 clear_shader(room_arc, preflect);
00460 }
00461 else
00462 {
00463
00464 set_shader(room_arc, preflect);
00465 }
00466 }
00467
00468
00469
00470
00471
00472
00473 void event_e(CPT_Event) {
00474 static bool spheretex_mode = false;
00475
00476 spheretex_mode = !spheretex_mode;
00477 if (!spheretex_mode) {
00478
00479
00480 clear_shader(jack_arc, spheretex);
00481
00482 } else {
00483
00484
00485 set_shader(jack_arc, spheretex);
00486 }
00487 }
00488
00489
00490
00491
00492
00493
00494 void event_h(CPT_Event) {
00495 static bool highlight_mode = false;
00496
00497 highlight_mode = !highlight_mode;
00498 if (!highlight_mode) {
00499
00500 clear_shader(jack_arc, highlight);
00501
00502 } else {
00503 set_shader(jack_arc, highlight);
00504 }
00505 }
00506
00507
00508
00509
00510
00511
00512 void event_m(CPT_Event) {
00513 static bool sphere_reflect_mode = false;
00514
00515 sphere_reflect_mode = !sphere_reflect_mode;
00516 if (!sphere_reflect_mode) {
00517
00518 clear_shader(jack_arc, sreflect);
00519
00520 } else {
00521
00522 set_shader(jack_arc, sreflect);
00523 }
00524 }
00525
00526
00527
00528
00529
00530
00531 void event_o(CPT_Event) {
00532 static bool outline_mode = false;
00533
00534 outline_mode = !outline_mode;
00535 if (!outline_mode) {
00536
00537 clear_shader(jack_arc, outline_shader);
00538
00539 } else {
00540 set_shader(jack_arc, outline_shader);
00541 }
00542 }
00543
00544
00545
00546
00547
00548
00549 void setup_projtex(void)
00550 {
00551
00552
00553
00554 tex_proj = new LensNode("texture_projector");
00555 RenderRelation* proj_arc = new RenderRelation(render, tex_proj);
00556
00557
00558 tex_proj_trackball = new Trackball("tex_proj_trackball");
00559 tex_proj_trackball->set_invert(false);
00560 tex_proj_trackball->set_rel_to(cameras);
00561 tball2cam = new Transform2SG("tball2cam");
00562 tball2cam->set_arc(proj_arc);
00563 new DataRelation(tex_proj_trackball, tball2cam);
00564
00565
00566 LMatrix4f proj_mat;
00567 LPoint3f proj_pos = LPoint3f::rfu(2., 3., 8.);
00568 LVector3f fwd_vec = proj_pos - center_pos;
00569 look_at(proj_mat, -fwd_vec);
00570 proj_mat.set_row(3, proj_pos);
00571 tex_proj_trackball->set_mat(proj_mat);
00572 proj_arc->set_transition(new TransformTransition(proj_mat));
00573
00574
00575 proj_shader = new ProjtexShader(tex);
00576 proj_shader->set_priority(150);
00577 proj_shader->add_frustum(tex_proj);
00578
00579 #define DISPLAY_TEXPROJFRUST
00580 #ifdef DISPLAY_TEXPROJFRUST
00581
00582 PT(Geom) proj_geom =
00583 tex_proj->get_lens()->make_geometry();
00584 GeomNode* proj_geom_node = new GeomNode("proj_geometry");
00585 proj_geom_node->add_geom(proj_geom);
00586 RenderRelation *prr = new RenderRelation(tex_proj, proj_geom_node);
00587 LightTransition *plt = new LightTransition(LightTransition::all_off());
00588 prr->set_transition(plt);
00589 #endif
00590 }
00591
00592
00593
00594
00595
00596
00597 void setup_spotlight(void)
00598 {
00599
00600 tex_proj_spot = new Spotlight("tex_proj_spotlight");
00601
00602 PT(Lens) lens = new PerspectiveLens;
00603 lens->set_fov(45.0f);
00604 lens->set_near(f._fnear);
00605 lens->set_far(13.0f);
00606 tex_proj_spot->set_lens(lens);
00607
00608 spot_arc = new RenderRelation(render, tex_proj_spot, 10);
00609
00610
00611 tex_spot_trackball = new Trackball("tex_spot_trackball");
00612 tex_spot_trackball->set_invert(false);
00613 tex_spot_trackball->set_rel_to(cameras);
00614 tball2cam = new Transform2SG("tball2cam");
00615 tball2cam->set_arc(spot_arc);
00616 new DataRelation(tex_spot_trackball, tball2cam);
00617
00618
00619 LMatrix4f spot_mat;
00620 LPoint3f spot_pos = LPoint3f::rfu(-4., -3., 8.);
00621 LVector3f spot_vec = spot_pos - center_pos;
00622 look_at(spot_mat, -spot_vec);
00623 spot_mat.set_row(3, spot_pos);
00624 tex_spot_trackball->set_mat(spot_mat);
00625 spot_arc->set_transition(new TransformTransition(spot_mat));
00626
00627
00628 spot_shader = new SpotlightShader;
00629 spot_shader->set_priority(150);
00630 spot_shader->add_frustum(tex_proj_spot);
00631
00632 #define DISPLAY_TEXPROJSPOTFRUST
00633 #ifdef DISPLAY_TEXPROJSPOTFRUST
00634
00635 Colorf color_red(1., 0., 0., 1.);
00636 PT(Geom) frust_geom =
00637 tex_proj_spot->get_lens()->make_geometry();
00638 GeomNode* frust_geom_node = new GeomNode("frustum_geometry");
00639 frust_geom_node->add_geom(frust_geom);
00640 RenderRelation *rr = new RenderRelation(tex_proj_spot, frust_geom_node);
00641 LightTransition *lt = new LightTransition(LightTransition::all_off());
00642 rr->set_transition(lt);
00643 #endif
00644
00645 #define DISPLAY_SHAFT
00646 #ifdef DISPLAY_SHAFT
00647
00648 NamedNode* shaft = tex_proj_spot->make_geometry(0.05, 8.0, 36);
00649 RenderRelation *sr = new RenderRelation(tex_proj_spot, shaft, 10);
00650 #endif
00651 }
00652
00653
00654
00655
00656
00657
00658 void setup_planar(void)
00659 {
00660
00661 Planef p(LVector3f(0., 0., 1.), LVector3f(0., 0., -10.));
00662 PlaneNode* plane_node = new PlaneNode;
00663 plane_node->set_plane(p);
00664 preflect = new PlanarReflector(plane_node);
00665 }
00666
00667
00668
00669
00670
00671
00672 void setup_projshadow(void)
00673 {
00674
00675 proj_shadow = new ProjtexShadower;
00676 proj_shadow->add_frustum(tex_proj_spot);
00677 proj_shadow->set_priority(150);
00678 if (root != (NamedNode *)NULL) {
00679 proj_shadow->add_caster(root);
00680 preflect->add_caster(root);
00681 } else if (geomnode != (GeomNode *)NULL) {
00682 proj_shadow->add_caster(geomnode);
00683 preflect->add_caster(geomnode);
00684 }
00685 }
00686
00687
00688
00689
00690
00691
00692 void setup_vizes(void)
00693 {
00694
00695 Shader::Visualize* v = Shader::get_viz();
00696 std::string viztype = min_shader.GetString("multipass-viz", "none");
00697
00698 if (viztype == "old-style")
00699 {
00700 PT(GraphicsWindow) w(main_win);
00701 v = new Oldviz(w);
00702 }
00703 else if (viztype == "new-single")
00704 {
00705 PT(GraphicsPipe) p(((GraphicsPipe*)(main_win->get_pipe())));
00706 v = new Viztex(p);
00707 }
00708 else if (viztype == "new-tile")
00709 {
00710 PT(GraphicsPipe) p(((GraphicsPipe*)(main_win->get_pipe())));
00711 v = new Tiledviz(p);
00712 }
00713
00714 Shader::set_viz(v);
00715 }
00716
00717
00718
00719
00720
00721
00722
00723 void min_shader_keys(EventHandler &eh) {
00724 Loader loader;
00725
00726 eh.add_hook("p", event_p);
00727 eh.add_hook("s", event_s);
00728 eh.add_hook("d", event_d);
00729 eh.add_hook("r", event_r);
00730 eh.add_hook("e", event_e);
00731 eh.add_hook("h", event_h);
00732 eh.add_hook("m", event_m);
00733 eh.add_hook("o", event_o);
00734
00735
00736 tex = TexturePool::load_texture("smiley.rgba");
00737 tex->set_minfilter(Texture::FT_linear);
00738 tex->set_magfilter(Texture::FT_linear);
00739 tex->set_wrapu(Texture::WM_clamp);
00740 tex->set_wrapv(Texture::WM_clamp);
00741
00742
00743 setup_projtex();
00744
00745 setup_spotlight();
00746
00747 setup_planar();
00748
00749 setup_projshadow();
00750
00751 spheretex = new SpheretexShader(tex);
00752 spheretex->set_priority(150);
00753
00754 highlight = new SpheretexHighlighter(32);
00755 highlight->add_frustum(tex_proj_spot);
00756 highlight->set_priority(150);
00757
00758 sreflect = new SpheretexReflector;
00759 sreflect->add_frustum(tex_proj_spot);
00760 sreflect->set_priority(150);
00761 sreflect->add_caster(root);
00762
00763 outline_shader = new OutlineShader;
00764 outline_shader->set_priority(150);
00765
00766
00767 PT_NamedNode room = DCAST(NamedNode, loader.load_sync("big-room.egg"));
00768 if (room != (NamedNode *)NULL) {
00769 room_arc = new RenderRelation(render, room, 20);
00770
00771 sreflect->add_caster(room);
00772 }
00773
00774
00775 PT_NamedNode jack = DCAST(NamedNode, loader.load_sync("jack.egg"));
00776 if (jack != (NamedNode *)NULL) {
00777 jack_arc = new RenderRelation(render, jack);
00778 LMatrix4f jack_mat = LMatrix4f::ident_mat();
00779 LPoint3f jack_pos = LPoint3f::rfu(-2., -2., -6.);
00780 jack_mat.set_row(3, jack_pos);
00781 jack_arc->set_transition(new TransformTransition(jack_mat));
00782
00783 proj_shadow->add_caster(jack);
00784 preflect->add_caster(jack);
00785 }
00786
00787
00788 PT_NamedNode smiley = DCAST(NamedNode, loader.load_sync("smiley.egg"));
00789 if (jack != (NamedNode *)NULL) {
00790 smiley_arc = new RenderRelation(render, smiley);
00791
00792 proj_shadow->add_caster(smiley);
00793 preflect->add_caster(smiley);
00794 }
00795
00796
00797 PT_NamedNode camera_model = DCAST(NamedNode, loader.load_sync("camera.egg"));
00798 if (camera_model != (NamedNode *)NULL) {
00799 camera_model_arc = new RenderRelation(cameras, camera_model);
00800
00801 sreflect->add_caster(camera_model);
00802 proj_shadow->add_caster(camera_model);
00803 preflect->add_caster(camera_model);
00804 }
00805
00806
00807 light_transition = new LightTransition;
00808 if (first_arc != (NodeRelation *)NULL) {
00809 first_arc->set_transition(light_transition);
00810 }
00811 if (jack_arc != (NodeRelation *)NULL) {
00812 jack_arc->set_transition(light_transition);
00813 }
00814
00815 setup_vizes();
00816 }
00817
00818 int main(int argc, char *argv[]) {
00819 extra_display_func = &shader_display_func;
00820 define_keys = &min_shader_keys;
00821 return framework_main(argc, argv);
00822 }
00823