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