00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 #include "map-kdtree.h"                 
00036 
00037 #include "glut/frustum.h"
00038 #include "perf/perf.h"
00039 
00040 
00041 
00042 namespace aesop {
00043 
00044 
00046 
00047 
00048 
00050 
00051 static void
00052 drawObject
00053 (
00054 IN glut::Renderable * model,
00055 IN const glut::render_context_t& rc,
00056 IN glut::RenderQueue * rq,
00057 IN void * context
00058 )
00059 {
00060         ASSERT(model, "null");
00061         map_draw_stats_t * stats = (map_draw_stats_t *) context;
00062         ASSERT(stats, "null context");
00063         ASSERT(rq, "null");
00064 
00065 
00066 
00067 
00068         
00069         glMatrixMode(GL_MODELVIEW);
00070         glPushMatrix();
00071         glut::setPlacement(rc.placement);
00072 
00073         
00074         stats->nObjects++;
00075         model->render(rc, rq);
00076 
00077         
00078         glMatrixMode(GL_MODELVIEW);
00079         glPopMatrix();
00080 }
00081 
00082 
00083 
00084 static void
00085 setLights
00086 (
00087 void
00088 )
00089 {
00090         
00091         glEnable(GL_LIGHTING);
00092         glEnable(GL_LIGHT0);
00093         glShadeModel(GL_SMOOTH);
00094 
00095         
00096         float lightDir[] = { 1, 0.5, -0.2, 0 };
00097         glLightfv(GL_LIGHT0, GL_POSITION, lightDir);
00098 
00099         
00100         float lightAmbient[] = { 0.4, 0.4, 0.4, 1.0 };
00101         glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lightAmbient);
00102 
00103         
00104         float lightOn[] = { 1, 1, 1, 1 };
00105         float lightOff[] = { 0, 0, 0, 1 };
00106 
00107         glLightfv(GL_LIGHT0, GL_DIFFUSE, lightOn);
00108         glLightfv(GL_LIGHT0, GL_AMBIENT, lightOff);
00109         glLightfv(GL_LIGHT0, GL_SPECULAR, lightOn);
00110 }
00111 
00112 
00113 
00115 
00116 
00117 
00119 
00120 void
00121 drawMap
00122 (
00123 IN MapKdTree * mapKdTree,
00124 IN const glut::render_context_t& rc,
00125 IN glut::RenderQueue * rq,
00126 OUT map_draw_stats_t& stats
00127 )
00128 {
00129         perf::Timer timer("drawMap");
00130         ASSERT(mapKdTree, "null");
00131         ASSERT(rq, "null");
00132         stats.clear();
00133 
00134         
00135         glEnable(GL_DEPTH_TEST);
00136         glEnable(GL_CULL_FACE);
00137         glDisable(GL_BLEND);
00138 
00139 
00140         
00141         int wire = 0;
00142         if (wire) {
00143                 glPolygonMode(GL_FRONT, GL_LINE);
00144         } else {
00145                 glPolygonMode(GL_FRONT, GL_FILL);
00146         }
00147 
00148         
00149         {
00150 
00151                 if (wire) {
00152                         glClearColor(0.0, 0.0, 0.9, 1.0);
00153                         glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
00154                 } else {
00155                         glClear(GL_DEPTH_BUFFER_BIT);
00156                 }
00157         }
00158 
00159         
00160         
00161         setLights();
00162 
00163         glColor4f(1.0, 1.0, 1.0, 1.0);
00164 
00165         
00166         glut::setOpenGLProjection(rc.camera);
00167         glut::setOpenGLViewer(rc.viewer);
00168 
00169         
00170         mapKdTree->walkFrontToBack(rc, rq, drawObject, &stats);
00171 
00172         
00173         glEnable(GL_BLEND);
00174         glEnable(GL_TEXTURE_2D);
00175         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00176 
00177         
00178         
00179         glMatrixMode(GL_MODELVIEW);
00180         glPushMatrix();
00181         glLoadIdentity();
00182         {
00183                 perf::Timer timer("map-drawer:transparent");
00184                 while (glut::poly_request_t * pr = rq->popRequest()) {
00185                         if (pr->nVertices < 3 || pr->textureId < 1)
00186                                 continue;       
00187 
00188                         
00189                         glBindTexture(GL_TEXTURE_2D, pr->textureId);
00190                         glNormal3fv((GLfloat *) &pr->normal.x);
00191 
00192                         
00193                         glBegin(GL_POLYGON);
00194                         for (int i = 0; i < pr->nVertices; ++i) {
00195                                 glTexCoord2f(pr->u[i], pr->v[i]);
00196                                 glVertex3fv((GLfloat *) &pr->vertex[i].x);
00197                         }
00198                         glEnd();
00199                 }
00200         }
00201         glPopMatrix();
00202 
00203         
00204         glDisable(GL_BLEND);
00205         glDisable(GL_TEXTURE_2D);
00206         glDisable(GL_CULL_FACE);
00207         glDisable(GL_LIGHT0);
00208 
00209         glDisable(GL_LIGHTING);
00210         glDisable(GL_DEPTH_TEST);
00211 
00212         
00213 
00214 
00215 
00216 }
00217 
00218 
00219 };              
00220