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

GLRendererGLGeometry3DVisitor.cpp

Go to the documentation of this file.
00001 #include "GLRendererGLGeometry3DVisitor.h"
00002 #include "GLBox.h"
00003 #include "GLCone.h"
00004 #include "GLCylinder.h"
00005 #include "GLIndexedFaceSet.h"
00006 #include "GLSphere.h"
00007 #include "BoxDrawArray.h"
00008 #include "ConeDrawArray.h"
00009 #include "CylinderDrawArray.h"
00010 #include "SphereDrawArray.h"
00011 
00012 using namespace X3DTK;
00013 
00014 GLRendererGLGeometry3DVisitor::GLRendererGLGeometry3DVisitor()
00015 : GLGeometry3DVisitor()
00016 {
00017   // Enter functions.
00018   defineNewEnterFunction<GLRendererGLGeometry3DVisitor, GLBox>(&GLRendererGLGeometry3DVisitor::enterGLBox);
00019   defineNewEnterFunction<GLRendererGLGeometry3DVisitor, GLCone>(&GLRendererGLGeometry3DVisitor::enterGLCone);
00020   defineNewEnterFunction<GLRendererGLGeometry3DVisitor, GLCylinder>(&GLRendererGLGeometry3DVisitor::enterGLCylinder);
00021   defineNewEnterFunction<GLRendererGLGeometry3DVisitor, GLIndexedFaceSet>(&GLRendererGLGeometry3DVisitor::enterGLIndexedFaceSet);
00022   defineNewEnterFunction<GLRendererGLGeometry3DVisitor, GLSphere>(&GLRendererGLGeometry3DVisitor::enterGLSphere);
00023 
00024 
00025   // GlobalVariables assignation.
00026   globalVariables = GVManager::getInstanceOf<GLRendererGlobalVariables>();
00027 }
00028 
00029 GLRendererGLGeometry3DVisitor::~GLRendererGLGeometry3DVisitor()
00030 {
00031 }
00032 
00033 void GLRendererGLGeometry3DVisitor::enterGLBox(GLBox *G) const
00034 {
00035   glEnable(GL_CULL_FACE);
00036   glFrontFace(GL_CW);
00037   glCullFace(GL_BACK);    
00038   glPushMatrix();
00039   
00040   glScalef(G->getSize().x, G->getSize().y, G->getSize().z);  
00041   
00042   glInterleavedArrays(GL_N3F_V3F, 0, G->getBoxDrawArray()->getBoxVertexArrayAddress());
00043   glDrawElements(GL_TRIANGLES, G->getBoxDrawArray()->getBoxSize(), GL_UNSIGNED_INT, G->getBoxDrawArray()->getBoxIndexArrayAddress());
00044 
00045   glPopMatrix();
00046   glDisable(GL_CULL_FACE);
00047 }
00048 
00049 void GLRendererGLGeometry3DVisitor::enterGLCone(GLCone *G) const
00050 {
00051   glEnable(GL_CULL_FACE);
00052   glFrontFace(GL_CW);
00053   glCullFace(GL_BACK);    
00054   glPushMatrix();
00055 
00056   glScalef(G->getBottomRadius(), G->getHeight(), G->getBottomRadius());  
00057   
00058   //test the attributes
00059   if (G->getSide())
00060   {
00061     glInterleavedArrays(GL_N3F_V3F, 0, G->getConeDrawArray()->getConeSideVertexArrayAddress());
00062     glDrawElements(GL_TRIANGLE_FAN, G->getConeDrawArray()->getConeSideSize(), GL_UNSIGNED_INT, G->getConeDrawArray()->getConeSideIndexArrayAddress());
00063   }  
00064   if (G->getBottom())
00065   {
00066     glInterleavedArrays(GL_N3F_V3F, 0, G->getConeDrawArray()->getConeBottomVertexArrayAddress());
00067     glDrawElements(GL_TRIANGLE_FAN, G->getConeDrawArray()->getConeBottomSize(), GL_UNSIGNED_INT, G->getConeDrawArray()->getConeBottomIndexArrayAddress());
00068   }  
00069   
00070   glPopMatrix();
00071   glDisable(GL_CULL_FACE);
00072 }
00073 
00074 void GLRendererGLGeometry3DVisitor::enterGLCylinder(GLCylinder *G) const
00075 {
00076   glEnable(GL_CULL_FACE);
00077   glFrontFace(GL_CW);
00078   glCullFace(GL_BACK);    
00079   glPushMatrix();
00080 
00081   glScalef(G->getRadius(), G->getHeight(), G->getRadius());  
00082   
00083   //test the attributes
00084   if (G->getBottom())
00085   {
00086     glInterleavedArrays(GL_N3F_V3F, 0, G->getCylinderDrawArray()->getCylinderBottomVertexArrayAddress());
00087     glDrawElements(GL_TRIANGLE_FAN, G->getCylinderDrawArray()->getCylinderBottomSize(), GL_UNSIGNED_INT, G->getCylinderDrawArray()->getCylinderBottomIndexArrayAddress());
00088   } 
00089   if (G->getSide())
00090   {
00091     glInterleavedArrays(GL_N3F_V3F, 0, G->getCylinderDrawArray()->getCylinderSideVertexArrayAddress());
00092     glDrawElements(GL_TRIANGLE_STRIP, G->getCylinderDrawArray()->getCylinderSideSize(), GL_UNSIGNED_INT, G->getCylinderDrawArray()->getCylinderSideIndexArrayAddress());
00093   }  
00094   if (G->getTop())
00095   {
00096     glInterleavedArrays(GL_N3F_V3F, 0, G->getCylinderDrawArray()->getCylinderTopVertexArrayAddress());
00097     glDrawElements(GL_TRIANGLE_FAN, G->getCylinderDrawArray()->getCylinderTopSize(), GL_UNSIGNED_INT, G->getCylinderDrawArray()->getCylinderTopIndexArrayAddress());
00098   }  
00099   
00100   glPopMatrix();
00101   glDisable(GL_CULL_FACE);
00102 }
00103 
00104 void GLRendererGLGeometry3DVisitor::enterGLIndexedFaceSet(GLIndexedFaceSet *G) const
00105 {
00106   if (G->getSolid())
00107   {
00108     glEnable(GL_CULL_FACE);
00109     if (G->getCcw())
00110       glFrontFace(GL_CCW);
00111     else
00112       glFrontFace(GL_CW);
00113     glCullFace(GL_BACK);   
00114   }
00115   
00116   if ((G->getColor()) && (G->getTexCoord()))
00117   {
00118     glEnable(GL_COLOR_MATERIAL);
00119     if (!G->getVerticesDuplicated())
00120     {
00121       glInterleavedArrays(GL_T2F_C4F_N3F_V3F, 0, &G->getT2F_C4F_N3F_V3FvertexFaceArray().front());
00122       glDrawElements(GL_TRIANGLES, G->getIndexFaceArray().size(), GL_UNSIGNED_INT, &G->getIndexFaceArray().front());
00123     }
00124     else
00125     {
00126       glInterleavedArrays(GL_T2F_C4F_N3F_V3F, 0, &G->getT2F_C4F_N3F_V3FvertexFaceArray().front());
00127       glDrawArrays(GL_TRIANGLES, 0, G->getT2F_C4F_N3F_V3FvertexFaceArray().size());
00128     }
00129     glDisable(GL_COLOR_MATERIAL);
00130   }  
00131     
00132   if ((G->getColor()) && (!G->getTexCoord()))
00133   {
00134     glEnable(GL_COLOR_MATERIAL);
00135     if (!G->getVerticesDuplicated())
00136     {
00137       glInterleavedArrays(GL_C4F_N3F_V3F, 0, &G->getC4F_N3F_V3FvertexFaceArray().front());
00138       glDrawElements(GL_TRIANGLES, G->getIndexFaceArray().size(), GL_UNSIGNED_INT, &G->getIndexFaceArray().front());
00139     }
00140     else
00141     {
00142       glInterleavedArrays(GL_C4F_N3F_V3F, 0, &G->getC4F_N3F_V3FvertexFaceArray().front());
00143       glDrawArrays(GL_TRIANGLES, 0, G->getC4F_N3F_V3FvertexFaceArray().size());
00144     }
00145     glDisable(GL_COLOR_MATERIAL);
00146   }  
00147     
00148   if ((!G->getColor()) && (G->getTexCoord()))
00149   {
00150     glEnable(GL_TEXTURE_2D);
00151     if (!G->getVerticesDuplicated())
00152     {
00153       glInterleavedArrays(GL_T2F_N3F_V3F, 0, &G->getT2F_N3F_V3FvertexFaceArray().front());
00154       glDrawElements(GL_TRIANGLES, G->getIndexFaceArray().size(), GL_UNSIGNED_INT, &G->getIndexFaceArray().front());
00155     }
00156     else
00157     {
00158       glInterleavedArrays(GL_T2F_N3F_V3F, 0, &(G->getT2F_N3F_V3FvertexFaceArray().front()));
00159       glDrawArrays(GL_TRIANGLES, 0, G->getT2F_N3F_V3FvertexFaceArray().size());
00160     }
00161     glDisable(GL_TEXTURE_2D);
00162   }  
00163   
00164   if ((!G->getColor()) && (!G->getTexCoord()))
00165   {
00166     if (!G->getVerticesDuplicated())
00167     {
00168       //drawing : not optimized because one call per polygon => too much if polygons
00169       //are triangles!
00170       glInterleavedArrays(GL_N3F_V3F, 0, &G->getN3F_V3FvertexFaceArray().front());
00171       glDrawElements(GL_TRIANGLES, G->getIndexFaceArray().size(), GL_UNSIGNED_INT, &G->getIndexFaceArray().front());
00172     }
00173     else
00174     {
00175       glInterleavedArrays(GL_N3F_V3F, 0, &G->getN3F_V3FvertexFaceArray().front());
00176       glDrawArrays(GL_TRIANGLES, 0, G->getN3F_V3FvertexFaceArray().size());
00177     }
00178   }
00179   
00180   if (G->getSolid())
00181     glDisable(GL_CULL_FACE);  
00182 }
00183 
00184 void GLRendererGLGeometry3DVisitor::enterGLSphere(GLSphere *G) const
00185 {
00186   glEnable(GL_CULL_FACE);
00187   glFrontFace(GL_CW);
00188   glCullFace(GL_BACK);    
00189   glPushMatrix();
00190   glScalef(G->getRadius(), G->getRadius(), G->getRadius());  
00191 
00192   glInterleavedArrays(GL_N3F_V3F, 0, G->getSphereDrawArray()->getSphereVertexArrayAddress());
00193   glDrawElements(GL_TRIANGLES, G->getSphereDrawArray()->getSphereSize(), GL_UNSIGNED_INT, G->getSphereDrawArray()->getSphereIndexArrayAddress());
00194 
00195   glPopMatrix();
00196   glDisable(GL_CULL_FACE);
00197 }
00198 

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