Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

GLRendererGLRenderingVisitor.cpp

Go to the documentation of this file.
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   // Enter functions.
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   // GlobalVariables assignation.
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     //drawing the point set
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 

Generated on Wed May 14 10:03:09 2003 for X3DToolKit by doxygen1.3