Go to the documentation of this file.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 #include "glut-model.h"
00035
00036 #include "common/wave_ex.h"
00037 #include "geometry/matrix_4.h"
00038 #include "perf/perf.h"
00039 #include "wave-glut/wave-glut.h"
00040
00041
00042 namespace glut {
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 static void
00053 renderColorPolygon
00054 (
00055 IN const polygon_t& p
00056 )
00057 throw()
00058 {
00059 float material[] = {
00060 p.material->color.red,
00061 p.material->color.green,
00062 p.material->color.blue,
00063 1.0 };
00064
00065
00066
00067
00068 glColor4f(material[0], material[1], material[2], material[3]);
00069
00070
00071 glNormal3fv(&p.normal.x);
00072
00073 glDrawElements(GL_POLYGON, p.nVertices, GL_UNSIGNED_INT, p.indices);
00074 }
00075
00076
00077
00078 static void
00079 queuePolygon
00080 (
00081 IN const point3d_t * vertex_array,
00082 IN const polygon_t& p,
00083 IO poly_request_t& pr
00084 )
00085 throw()
00086 {
00087 ASSERT(vertex_array, "null");
00088
00089 if (p.nVertices > poly_request_t::eMaxVertices) {
00090 DPRINTF("Too many vertices for queuing");
00091 return;
00092 }
00093
00094
00095 pr.nVertices = p.nVertices;
00096 pr.textureId = p.material->texture_id;
00097 pr.normal = p.normal;
00098
00099
00100 matrix4_t M;
00101 glGetFloatv(GL_MODELVIEW_MATRIX, M.m);
00102 M.transpose();
00103 const int * pi = p.indices;
00104 for (int i = 0; i < p.nVertices; ++i, ++pi) {
00105 const point3d_t& pModel = vertex_array[*pi];
00106 pr.u[i] = p.u[i];
00107 pr.v[i] = p.v[i];
00108 pr.vertex[i] = M * pModel;
00109 }
00110 }
00111
00112
00113
00114 static void
00115 renderTexturePolygon
00116 (
00117 IN const point3d_t * vertex_array,
00118 IN const polygon_t& p
00119 )
00120 throw()
00121 {
00122 ASSERT(vertex_array, "null");
00123
00124 glEnable(GL_TEXTURE_2D);
00125 glBindTexture(GL_TEXTURE_2D, p.material->texture_id);
00126 glNormal3fv(&p.normal.x);
00127
00128
00129
00130
00131 const int *pi = p.indices;
00132 const float * pu = p.u;
00133 const float * pv = p.v;
00134 glBegin(GL_POLYGON);
00135 for (int i = 0; i < p.nVertices; ++i, ++pu, ++pv, ++pi) {
00136 const point3d_t& vtx = vertex_array[*pi];
00137 glTexCoord2f(*pu, *pv);
00138 glVertex3f(vtx.x, vtx.y, vtx.z);
00139
00140
00141
00142 }
00143 glEnd();
00144 glDisable(GL_TEXTURE_2D);
00145 }
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 void
00156 model_t::render
00157 (
00158 IN const render_context_t& rc,
00159 IN RenderQueue * rq
00160 )
00161 {
00162 perf::Timer timer("model::render");
00163 ASSERT(rq, "null");
00164
00165
00166
00167
00168 glEnable(GL_VERTEX_ARRAY);
00169 glVertexPointer(3, GL_FLOAT, 0, vertices);
00170
00171
00172
00173
00174 for (int i = 0; i < nPolygons; ++i) {
00175 const polygon_t& p = polygons[i];
00176 ASSERT(p.material, "null");
00177
00178 if (p.material->texture_id) {
00179 if (p.material->isTransparent) {
00180 poly_request_t * pr = rq->grabRequestSlot();
00181 if (pr) {
00182 queuePolygon(vertices, p, *pr);
00183 } else {
00184
00185 }
00186 } else {
00187 renderTexturePolygon(vertices, p);
00188 }
00189 } else {
00190 renderColorPolygon(p);
00191 }
00192 }
00193
00194
00195 glDisable(GL_VERTEX_ARRAY);
00196 }
00197
00198
00199
00200 void
00201 lod_model_t::render
00202 (
00203 IN const render_context_t& rc,
00204 IN RenderQueue * rq
00205 )
00206 {
00207 ASSERT(rq, "null");
00208
00209
00210 if (nEntries < 1) {
00211 return;
00212 }
00213
00214 entries[0].model.render(rc, rq);
00215 }
00216
00217
00218
00219 };
00220