00001 #include "GLRendererGLRenderingVisitor.h"
00002 #include "GLIndexedLineSet.h"
00003 #include "GLPointSet.h"
00004 #include "GLTriangleFanSet.h"
00005 #include "GLTriangleSet.h"
00006 #include "GLTriangleStripSet.h"
00007
00008 #include <vector>
00009
00010 using namespace X3DTK;
00011 using namespace std;
00012
00013 GLRendererGLRenderingVisitor::GLRendererGLRenderingVisitor()
00014 : GLRenderingVisitor()
00015 {
00016
00017 defineNewEnterFunction<GLRendererGLRenderingVisitor, GLIndexedLineSet>(&GLRendererGLRenderingVisitor::enterGLIndexedLineSet);
00018 defineNewEnterFunction<GLRendererGLRenderingVisitor, GLPointSet>(&GLRendererGLRenderingVisitor::enterGLPointSet);
00019 defineNewEnterFunction<GLRendererGLRenderingVisitor, GLTriangleFanSet>(&GLRendererGLRenderingVisitor::enterGLTriangleFanSet);
00020 defineNewEnterFunction<GLRendererGLRenderingVisitor, GLTriangleSet>(&GLRendererGLRenderingVisitor::enterGLTriangleSet);
00021 defineNewEnterFunction<GLRendererGLRenderingVisitor, GLTriangleStripSet>(&GLRendererGLRenderingVisitor::enterGLTriangleStripSet);
00022
00023
00024
00025 globalVariables = GVManager::getInstanceOf<GLRendererGlobalVariables>();
00026 }
00027
00028 GLRendererGLRenderingVisitor::~GLRendererGLRenderingVisitor()
00029 {
00030 }
00031
00032 void GLRendererGLRenderingVisitor::enterGLIndexedLineSet(GLIndexedLineSet *G) const
00033 {
00034 glLineWidth(G->getLineWidth());
00035
00036 if (G->getColor())
00037 {
00038 glEnable(GL_COLOR_MATERIAL);
00039
00040 if (G->getColorPerVertex())
00041 {
00042 for (vector<vector<C4UB_V3F> *>::const_iterator itLineArray = G->getLineArrayArray().begin(); itLineArray != G->getLineArrayArray().end(); ++itLineArray)
00043 {
00044 glInterleavedArrays(GL_C4UB_V3F, 0, &(*itLineArray)->front());
00045 glDrawArrays(GL_LINE_STRIP, 0, (*itLineArray)->size());
00046 }
00047 }
00048 else
00049 {
00050 glInterleavedArrays(GL_C4UB_V3F, 0, &G->getPointLineArray().front());
00051 glDrawArrays(GL_LINES, 0, G->getPointLineArray().size());
00052 }
00053 glDisable(GL_COLOR_MATERIAL);
00054 }
00055 else
00056 {
00057 glInterleavedArrays(GL_V3F, 0, &G->getPointArray().front());
00058 for (vector<MFInt32 *>::const_iterator itLine = G->getLineIndexArray().begin(); itLine != G->getLineIndexArray().end(); ++itLine)
00059 {
00060 glDrawElements(GL_LINE_STRIP, (*itLine)->size(), GL_UNSIGNED_INT, &(*itLine)->front());
00061 }
00062 }
00063 }
00064
00065 void GLRendererGLRenderingVisitor::enterGLPointSet(GLPointSet *G) const
00066 {
00067 glPointSize(4.0f);
00068
00069 if (G->getColor())
00070 {
00071 glEnable(GL_COLOR_MATERIAL);
00072 glInterleavedArrays(GL_C4UB_V3F, 0, &G->getPointSetArray().front());
00073 glDrawArrays(GL_POINTS, 0, G->getPointSetArray().size());
00074 glDisable(GL_COLOR_MATERIAL);
00075 }
00076 else
00077 {
00078
00079 glInterleavedArrays(GL_V3F, 0, &G->getPointArray().front());
00080 glDrawArrays(GL_POINTS, 0, G->getPointArray().size());
00081 }
00082 }
00083
00084 void GLRendererGLRenderingVisitor::enterGLTriangleFanSet(GLTriangleFanSet *G) const
00085 {
00086 if (G->getSolid())
00087 {
00088 glEnable(GL_CULL_FACE);
00089 if (G->getCcw())
00090 glFrontFace(GL_CCW);
00091 else
00092 glFrontFace(GL_CW);
00093 glCullFace(GL_BACK);
00094 }
00095
00096 if ((G->getColor()) && (G->getTexCoord()))
00097 {
00098 }
00099
00100 if ((G->getColor()) && (!G->getTexCoord()))
00101 {
00102 glEnable(GL_COLOR_MATERIAL);
00103 if (!G->getVerticesDuplicated())
00104 {
00105 for (vector<vector<C4F_N3F_V3F> *>::const_iterator itFanArray = G->getC4F_N3F_V3FvertexFanArrayArray().begin(); itFanArray != G->getC4F_N3F_V3FvertexFanArrayArray().end(); ++itFanArray)
00106 {
00107 glInterleavedArrays(GL_C4F_N3F_V3F, 0, &(*itFanArray)->front());
00108 glDrawArrays(GL_TRIANGLE_FAN, 0, (*itFanArray)->size());
00109 }
00110 }
00111 else
00112 {
00113 for (vector<vector<C4F_N3F_V3F> *>::const_iterator itFanArray = G->getC4F_N3F_V3FvertexFanArrayArray().begin(); itFanArray != G->getC4F_N3F_V3FvertexFanArrayArray().end(); ++itFanArray)
00114 {
00115 glInterleavedArrays(GL_C4F_N3F_V3F, 0, &(*itFanArray)->front());
00116 glDrawArrays(GL_TRIANGLES, 0, (*itFanArray)->size());
00117 }
00118 }
00119 glDisable(GL_COLOR_MATERIAL);
00120 }
00121
00122 if ((!G->getColor()) && (G->getTexCoord()))
00123 {
00124 }
00125
00126 if ((!G->getColor()) && (!G->getTexCoord()))
00127 {
00128 if (!G->getVerticesDuplicated())
00129 {
00130 for (vector<vector<N3F_V3F> *>::const_iterator itFanArray = G->getN3F_V3FvertexFanArrayArray().begin(); itFanArray != G->getN3F_V3FvertexFanArrayArray().end(); ++itFanArray)
00131 {
00132 glInterleavedArrays(GL_N3F_V3F, 0, &(*itFanArray)->front());
00133 glDrawArrays(GL_TRIANGLE_FAN, 0, (*itFanArray)->size());
00134 }
00135 }
00136 else
00137 {
00138 for (vector<vector<N3F_V3F> *>::const_iterator itFanArray = G->getN3F_V3FvertexFanArrayArray().begin(); itFanArray != G->getN3F_V3FvertexFanArrayArray().end(); ++itFanArray)
00139 {
00140 glInterleavedArrays(GL_N3F_V3F, 0, &(*itFanArray)->front());
00141 glDrawArrays(GL_TRIANGLES, 0, (*itFanArray)->size());
00142 }
00143 }
00144 }
00145
00146 if (G->getSolid())
00147 glDisable(GL_CULL_FACE);
00148 }
00149
00150 void GLRendererGLRenderingVisitor::enterGLTriangleSet(GLTriangleSet *G) const
00151 {
00152 if (G->getSolid())
00153 {
00154 glEnable(GL_CULL_FACE);
00155 if (G->getCcw())
00156 glFrontFace(GL_CCW);
00157 else
00158 glFrontFace(GL_CW);
00159 glCullFace(GL_BACK);
00160 }
00161
00162 if ((G->getColor()) && (G->getTexCoord()))
00163 {
00164 }
00165
00166 if ((G->getColor()) && (!G->getTexCoord()))
00167 {
00168 glEnable(GL_COLOR_MATERIAL);
00169 glInterleavedArrays(GL_C4F_N3F_V3F, 0, &G->getC4F_N3F_V3FvertexTriangleArray().front());
00170 glDrawArrays(GL_TRIANGLES, 0, G->getC4F_N3F_V3FvertexTriangleArray().size());
00171 glDisable(GL_COLOR_MATERIAL);
00172 }
00173
00174 if ((!G->getColor()) && (G->getTexCoord()))
00175 {
00176 }
00177
00178 if ((!G->getColor()) && (!G->getTexCoord()))
00179 {
00180 glInterleavedArrays(GL_N3F_V3F, 0, &G->getN3F_V3FvertexTriangleArray().front());
00181 glDrawArrays(GL_TRIANGLES, 0, G->getN3F_V3FvertexTriangleArray().size());
00182 }
00183
00184 if (G->getSolid())
00185 glDisable(GL_CULL_FACE);
00186 }
00187
00188 void GLRendererGLRenderingVisitor::enterGLTriangleStripSet(GLTriangleStripSet *G) const
00189 {
00190 if (G->getSolid())
00191 {
00192 glEnable(GL_CULL_FACE);
00193 if (G->getCcw())
00194 glFrontFace(GL_CCW);
00195 else
00196 glFrontFace(GL_CW);
00197 glCullFace(GL_BACK);
00198 }
00199
00200 if ((G->getColor()) && (G->getTexCoord()))
00201 {
00202 }
00203
00204 if ((G->getColor()) && (!G->getTexCoord()))
00205 {
00206 glEnable(GL_COLOR_MATERIAL);
00207 if (!G->getVerticesDuplicated())
00208 {
00209 for (vector<vector<C4F_N3F_V3F> *>::const_iterator itStripArray = G->getC4F_N3F_V3FvertexStripArrayArray().begin(); itStripArray != G->getC4F_N3F_V3FvertexStripArrayArray().end(); ++itStripArray)
00210 {
00211 glInterleavedArrays(GL_C4F_N3F_V3F, 0, &(*itStripArray)->front());
00212 glDrawArrays(GL_TRIANGLE_STRIP, 0, (*itStripArray)->size());
00213 }
00214 }
00215 else
00216 {
00217 for (vector<vector<C4F_N3F_V3F> *>::const_iterator itStripArray = G->getC4F_N3F_V3FvertexStripArrayArray().begin(); itStripArray != G->getC4F_N3F_V3FvertexStripArrayArray().end(); ++itStripArray)
00218 {
00219 glInterleavedArrays(GL_C4F_N3F_V3F, 0, &(*itStripArray)->front());
00220 glDrawArrays(GL_TRIANGLES, 0, (*itStripArray)->size());
00221 }
00222 }
00223 glDisable(GL_COLOR_MATERIAL);
00224 }
00225
00226 if ((!G->getColor()) && (G->getTexCoord()))
00227 {
00228 }
00229
00230 if ((!G->getColor()) && (!G->getTexCoord()))
00231 {
00232 if (!G->getVerticesDuplicated())
00233 {
00234 for (vector<vector<N3F_V3F> *>::const_iterator itStripArray = G->getN3F_V3FvertexStripArrayArray().begin(); itStripArray != G->getN3F_V3FvertexStripArrayArray().end(); ++itStripArray)
00235 {
00236 glInterleavedArrays(GL_N3F_V3F, 0, &(*itStripArray)->front());
00237 glDrawArrays(GL_TRIANGLE_STRIP, 0, (*itStripArray)->size());
00238 }
00239 }
00240 else
00241 {
00242 for (vector<vector<N3F_V3F> *>::const_iterator itStripArray = G->getN3F_V3FvertexStripArrayArray().begin(); itStripArray != G->getN3F_V3FvertexStripArrayArray().end(); ++itStripArray)
00243 {
00244 glInterleavedArrays(GL_N3F_V3F, 0, &(*itStripArray)->front());
00245 glDrawArrays(GL_TRIANGLES, 0, (*itStripArray)->size());
00246 }
00247 }
00248 }
00249
00250 if (G->getSolid())
00251 glDisable(GL_CULL_FACE);
00252 }
00253