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
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
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
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
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
00169
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