diff options
Diffstat (limited to 'source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp')
-rw-r--r-- | source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp | 1055 |
1 files changed, 253 insertions, 802 deletions
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp index f99121e5b7c..d3c0426de86 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp @@ -31,33 +31,13 @@ #include "RAS_OpenGLRasterizer.h" -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#ifdef WIN32 -#include <windows.h> -#endif // WIN32 -#ifdef __APPLE__ -#define GL_GLEXT_LEGACY 1 -#include <OpenGL/gl.h> -#include <OpenGL/glu.h> -#else -#include <GL/gl.h> -#if defined(__sun__) && !defined(__sparc__) -#include <mesa/glu.h> -#else -#include <GL/glu.h> -#endif -#endif +#include "GL/glew.h" #include "RAS_Rect.h" #include "RAS_TexVert.h" #include "MT_CmMatrix4x4.h" #include "RAS_IRenderTools.h" // rendering text -#include "RAS_GLExtensionManager.h" - /** * 32x32 bit masks for vinterlace stereo mode */ @@ -83,10 +63,11 @@ RAS_OpenGLRasterizer::RAS_OpenGLRasterizer(RAS_ICanvas* canvas) m_focallength(0.0), m_setfocallength(false), m_noOfScanlines(32), - m_useTang(false), - m_materialCachingInfo(0), m_motionblur(0), - m_motionblurvalue(-1.0) + m_motionblurvalue(-1.0), + m_texco_num(0), + m_attrib_num(0), + m_materialCachingInfo(0) { m_viewmatrix.Identity(); @@ -335,7 +316,7 @@ void RAS_OpenGLRasterizer::Exit() glDisable(GL_POLYGON_STIPPLE); glDisable(GL_LIGHTING); - if (bgl::QueryExtension(bgl::_GL_EXT_separate_specular_color) || bgl::QueryVersion(1, 2)) + if (GLEW_EXT_separate_specular_color || GLEW_VERSION_1_2) glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR); EndFrame(); @@ -802,277 +783,6 @@ void RAS_OpenGLRasterizer::IndexPrimitives(const vecVertexArray & vertexarrays, } -void RAS_OpenGLRasterizer::IndexPrimitives_Ex(const vecVertexArray & vertexarrays, - const vecIndexArrays & indexarrays, - int mode, - class RAS_IPolyMaterial* polymat, - class RAS_IRenderTools* rendertools, - bool useObjectColor, - const MT_Vector4& rgbacolor - ) -{ - bool recalc; - GLenum drawmode; - switch (mode) - { - case 0: - drawmode = GL_TRIANGLES; - break; - case 1: - drawmode = GL_LINES; - break; - case 2: - drawmode = GL_QUADS; - break; - default: - drawmode = GL_LINES; - break; - } - - const RAS_TexVert* vertexarray ; - unsigned int numindices,vt; - - for (vt=0;vt<vertexarrays.size();vt++) - { - vertexarray = &((*vertexarrays[vt]) [0]); - const KX_IndexArray & indexarray = (*indexarrays[vt]); - numindices = indexarray.size(); - - if (!numindices) - continue; - - int vindex=0; - switch (mode) - { - case 1: - { - glBegin(GL_LINES); - vindex=0; - for (unsigned int i=0;i<numindices;i+=2) - { - glVertex3fv(vertexarray[(indexarray[vindex++])].getLocalXYZ()); - glVertex3fv(vertexarray[(indexarray[vindex++])].getLocalXYZ()); - } - glEnd(); - } - break; - case 2: - { - glBegin(GL_QUADS); - vindex=0; - if (useObjectColor) - { - for (unsigned int i=0;i<numindices;i+=4) - { - MT_Point3 mv1, mv2, mv3, mv4, fnor; - /* Calc a new face normal */ - - if (vertexarray[(indexarray[vindex])].getFlag() & TV_CALCFACENORMAL) - recalc= true; - else - recalc=false; - - if (recalc){ - mv1 = MT_Point3(vertexarray[(indexarray[vindex])].getLocalXYZ()); - mv2 = MT_Point3(vertexarray[(indexarray[vindex+1])].getLocalXYZ()); - mv3 = MT_Point3(vertexarray[(indexarray[vindex+2])].getLocalXYZ()); - mv4 = MT_Point3(vertexarray[(indexarray[vindex+2])].getLocalXYZ()); - - fnor = (((mv2-mv1).cross(mv3-mv2))+((mv4-mv3).cross(mv1-mv4))).safe_normalized(); - - glNormal3f(fnor[0], fnor[1], fnor[2]); - } - - glColor4d(rgbacolor[0], rgbacolor[1], rgbacolor[2], rgbacolor[3]); - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - } - } - else - { - for (unsigned int i=0;i<numindices;i+=4) - { - // This looks curiously endian unsafe to me. - // However it depends on the way the colors are packed into - // the m_rgba field of RAS_TexVert - MT_Point3 mv1, mv2, mv3, mv4, fnor; - /* Calc a new face normal */ - - if (vertexarray[(indexarray[vindex])].getFlag() & TV_CALCFACENORMAL) - recalc= true; - else - recalc=false; - - - if (recalc){ - mv1 = MT_Point3(vertexarray[(indexarray[vindex])].getLocalXYZ()); - mv2 = MT_Point3(vertexarray[(indexarray[vindex+1])].getLocalXYZ()); - mv3 = MT_Point3(vertexarray[(indexarray[vindex+2])].getLocalXYZ()); - mv4 = MT_Point3(vertexarray[(indexarray[vindex+3])].getLocalXYZ()); - - fnor = (((mv2-mv1).cross(mv3-mv2))+((mv4-mv3).cross(mv1-mv4))).safe_normalized(); - - glNormal3f(fnor[0], fnor[1], fnor[2]); - } - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - } - } - glEnd(); - break; - } - case 0: - { - glBegin(GL_TRIANGLES); - vindex=0; - if (useObjectColor) - { - for (unsigned int i=0;i<numindices;i+=3) - { - MT_Point3 mv1, mv2, mv3, fnor; - /* Calc a new face normal */ - - if (vertexarray[(indexarray[vindex])].getFlag() & TV_CALCFACENORMAL) - recalc= true; - else - recalc=false; - - if (recalc){ - mv1 = MT_Point3(vertexarray[(indexarray[vindex])].getLocalXYZ()); - mv2 = MT_Point3(vertexarray[(indexarray[vindex+1])].getLocalXYZ()); - mv3 = MT_Point3(vertexarray[(indexarray[vindex+2])].getLocalXYZ()); - - fnor = ((mv2-mv1).cross(mv3-mv2)).safe_normalized(); - glNormal3f(fnor[0], fnor[1], fnor[2]); - } - - glColor4d(rgbacolor[0], rgbacolor[1], rgbacolor[2], rgbacolor[3]); - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - } - } - else - { - for (unsigned int i=0;i<numindices;i+=3) - { - MT_Point3 mv1, mv2, mv3, fnor; - /* Calc a new face normal */ - - if (vertexarray[(indexarray[vindex])].getFlag() & TV_CALCFACENORMAL) - recalc= true; - else - recalc=false; - - - if (recalc){ - mv1 = MT_Point3(vertexarray[(indexarray[vindex])].getLocalXYZ()); - mv2 = MT_Point3(vertexarray[(indexarray[vindex+1])].getLocalXYZ()); - mv3 = MT_Point3(vertexarray[(indexarray[vindex+2])].getLocalXYZ()); - - fnor = ((mv2-mv1).cross(mv3-mv2)).safe_normalized(); - glNormal3f(fnor[0], fnor[1], fnor[2]); - } - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - glTexCoord2fv(vertexarray[(indexarray[vindex])].getUV1()); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - } - } - glEnd(); - break; - } - default: - { - } - - } // switch - } // for each vertexarray - -} - - - void RAS_OpenGLRasterizer::IndexPrimitives_3DText(const vecVertexArray & vertexarrays, const vecIndexArrays & indexarrays, int mode, @@ -1206,59 +916,91 @@ void RAS_OpenGLRasterizer::IndexPrimitives_3DText(const vecVertexArray & vertexa } //for each vertexarray } -void RAS_OpenGLRasterizer::SetTexCoords(TexCoGen coords,int unit) +void RAS_OpenGLRasterizer::SetTexCoordNum(int num) +{ + m_texco_num = num; + if(m_texco_num > RAS_MAX_TEXCO) + m_texco_num = RAS_MAX_TEXCO; +} + +void RAS_OpenGLRasterizer::SetAttribNum(int num) +{ + m_attrib_num = num; + if(m_attrib_num > RAS_MAX_ATTRIB) + m_attrib_num = RAS_MAX_ATTRIB; +} + +void RAS_OpenGLRasterizer::SetTexCoord(TexCoGen coords, int unit) { // this changes from material to material - if(unit < RAS_MAX) + if(unit < RAS_MAX_TEXCO) m_texco[unit] = coords; } -void RAS_OpenGLRasterizer::SetAttrib(int type) +void RAS_OpenGLRasterizer::SetAttrib(TexCoGen coords, int unit) { - if(type == RAS_TEXTANGENT) m_useTang=true; + // this changes from material to material + if(unit < RAS_MAX_ATTRIB) + m_attrib[unit] = coords; } -void RAS_OpenGLRasterizer::TexCoord(const RAS_TexVert &tv, int enabled) +void RAS_OpenGLRasterizer::TexCoord(const RAS_TexVert &tv) { -#if defined(GL_ARB_multitexture) && defined(WITH_GLEXT) - if (!getenv("WITHOUT_GLEXT")) { - if(bgl::RAS_EXT_support._ARB_multitexture) { - for(int unit=0; unit<enabled; unit++) { - if( tv.getFlag() & TV_2NDUV && tv.getUnit() == unit ) { - bgl::blMultiTexCoord2fvARB(GL_TEXTURE0_ARB+unit, tv.getUV2()); - continue; - } - switch(m_texco[unit]) { - case RAS_TEXCO_DISABLE: - case RAS_TEXCO_OBJECT: - case RAS_TEXCO_GEN: - break; - case RAS_TEXCO_ORCO: - case RAS_TEXCO_GLOB: - bgl::blMultiTexCoord3fvARB(GL_TEXTURE0_ARB+unit, tv.getLocalXYZ()); - break; - case RAS_TEXCO_UV1: - bgl::blMultiTexCoord2fvARB(GL_TEXTURE0_ARB+unit, tv.getUV1()); - break; - case RAS_TEXCO_NORM: - bgl::blMultiTexCoord3fvARB(GL_TEXTURE0_ARB+unit, tv.getNormal()); - break; - case RAS_TEXTANGENT: - bgl::blMultiTexCoord4fvARB(GL_TEXTURE0_ARB+unit, tv.getTangent()); - break; - case RAS_TEXCO_UV2: - bgl::blMultiTexCoord2fvARB(GL_TEXTURE0_ARB+unit, tv.getUV2()); - break; - } + int unit; + + if(GLEW_ARB_multitexture) { + for(unit=0; unit<m_texco_num; unit++) { + if(tv.getFlag() & TV_2NDUV && (int)tv.getUnit() == unit) { + glMultiTexCoord2fvARB(GL_TEXTURE0_ARB+unit, tv.getUV2()); + continue; + } + switch(m_texco[unit]) { + case RAS_TEXCO_ORCO: + case RAS_TEXCO_GLOB: + glMultiTexCoord3fvARB(GL_TEXTURE0_ARB+unit, tv.getLocalXYZ()); + break; + case RAS_TEXCO_UV1: + glMultiTexCoord2fvARB(GL_TEXTURE0_ARB+unit, tv.getUV1()); + break; + case RAS_TEXCO_NORM: + glMultiTexCoord3fvARB(GL_TEXTURE0_ARB+unit, tv.getNormal()); + break; + case RAS_TEXTANGENT: + glMultiTexCoord4fvARB(GL_TEXTURE0_ARB+unit, tv.getTangent()); + break; + case RAS_TEXCO_UV2: + glMultiTexCoord2fvARB(GL_TEXTURE0_ARB+unit, tv.getUV2()); + break; + default: + break; } } } -#endif -#ifdef GL_ARB_vertex_program - if(m_useTang && bgl::RAS_EXT_support._ARB_vertex_program) - bgl::blVertexAttrib4fvARB(1/*tangent*/, tv.getTangent()); -#endif + if(GLEW_ARB_vertex_program) { + for(unit=0; unit<m_attrib_num; unit++) { + switch(m_attrib[unit]) { + case RAS_TEXCO_ORCO: + case RAS_TEXCO_GLOB: + glVertexAttrib3fvARB(unit, tv.getLocalXYZ()); + break; + case RAS_TEXCO_UV1: + glVertexAttrib2fvARB(unit, tv.getUV1()); + break; + case RAS_TEXCO_NORM: + glVertexAttrib3fvARB(unit, tv.getNormal()); + break; + case RAS_TEXTANGENT: + glVertexAttrib4fvARB(unit, tv.getTangent()); + break; + case RAS_TEXCO_UV2: + glVertexAttrib2fvARB(unit, tv.getUV2()); + break; + default: + break; + } + } + } } void RAS_OpenGLRasterizer::Tangent( const RAS_TexVert& v1, @@ -1266,30 +1008,26 @@ void RAS_OpenGLRasterizer::Tangent( const RAS_TexVert& v1, const RAS_TexVert& v3, const MT_Vector3 &no) { -#if defined(GL_ARB_multitexture) && defined(WITH_GLEXT) - if (!getenv("WITHOUT_GLEXT")) { - // TODO: set for deformer... - MT_Vector3 x1(v1.getLocalXYZ()), x2(v2.getLocalXYZ()), x3(v3.getLocalXYZ()); - MT_Vector2 uv1(v1.getUV1()), uv2(v2.getUV1()), uv3(v3.getUV1()); - MT_Vector3 dx1(x2 - x1), dx2(x3 - x1); - MT_Vector2 duv1(uv2 - uv1), duv2(uv3 - uv1); - - MT_Scalar r = 1.0 / (duv1.x() * duv2.y() - duv2.x() * duv1.y()); - duv1 *= r; - duv2 *= r; - MT_Vector3 sdir(duv2.y() * dx1 - duv1.y() * dx2); - MT_Vector3 tdir(duv1.x() * dx2 - duv2.x() * dx1); - - // Gram-Schmidt orthogonalize - MT_Vector3 t(sdir - no.cross(no.cross(sdir))); - if (!MT_fuzzyZero(t)) t /= t.length(); - - float tangent[4]; - t.getValue(tangent); - // Calculate handedness - tangent[3] = no.dot(sdir.cross(tdir)) < 0.0 ? -1.0 : 1.0; - } -#endif + // TODO: set for deformer... + MT_Vector3 x1(v1.getLocalXYZ()), x2(v2.getLocalXYZ()), x3(v3.getLocalXYZ()); + MT_Vector2 uv1(v1.getUV1()), uv2(v2.getUV1()), uv3(v3.getUV1()); + MT_Vector3 dx1(x2 - x1), dx2(x3 - x1); + MT_Vector2 duv1(uv2 - uv1), duv2(uv3 - uv1); + + MT_Scalar r = 1.0 / (duv1.x() * duv2.y() - duv2.x() * duv1.y()); + duv1 *= r; + duv2 *= r; + MT_Vector3 sdir(duv2.y() * dx1 - duv1.y() * dx2); + MT_Vector3 tdir(duv1.x() * dx2 - duv2.x() * dx1); + + // Gram-Schmidt orthogonalize + MT_Vector3 t(sdir - no.cross(no.cross(sdir))); + if (!MT_fuzzyZero(t)) t /= t.length(); + + float tangent[4]; + t.getValue(tangent); + // Calculate handedness + tangent[3] = no.dot(sdir.cross(tdir)) < 0.0 ? -1.0 : 1.0; } @@ -1304,479 +1042,192 @@ void RAS_OpenGLRasterizer::IndexPrimitivesMulti( class KX_ListSlot** slot ) { -#if defined(GL_ARB_multitexture) && defined(WITH_GLEXT) - if (!getenv("WITHOUT_GLEXT")) { - GLenum drawmode; - switch (mode) - { - case 0: - drawmode = GL_TRIANGLES; - break; - case 1: - drawmode = GL_LINES; - break; - case 2: - drawmode = GL_QUADS; - break; - default: - drawmode = GL_LINES; - break; - } - - const RAS_TexVert* vertexarray ; - unsigned int numindices,vt; + GLenum drawmode; + switch (mode) + { + case 0: + drawmode = GL_TRIANGLES; + break; + case 1: + drawmode = GL_LINES; + break; + case 2: + drawmode = GL_QUADS; + break; + default: + drawmode = GL_LINES; + break; + } - for (vt=0;vt<vertexarrays.size();vt++) - { - vertexarray = &((*vertexarrays[vt]) [0]); - const KX_IndexArray & indexarray = (*indexarrays[vt]); - numindices = indexarray.size(); - const unsigned int enabled = polymat->GetEnabled(); + const RAS_TexVert* vertexarray ; + unsigned int numindices,vt; - if (!numindices) - break; + for (vt=0;vt<vertexarrays.size();vt++) + { + vertexarray = &((*vertexarrays[vt]) [0]); + const KX_IndexArray & indexarray = (*indexarrays[vt]); + numindices = indexarray.size(); + + if (!numindices) + break; - int vindex=0; - switch (mode) + int vindex=0; + switch (mode) + { + case 1: { - case 1: + glBegin(GL_LINES); + vindex=0; + for (unsigned int i=0;i<numindices;i+=2) { - glBegin(GL_LINES); - vindex=0; - for (unsigned int i=0;i<numindices;i+=2) - { - glVertex3fv(vertexarray[(indexarray[vindex++])].getLocalXYZ()); - glVertex3fv(vertexarray[(indexarray[vindex++])].getLocalXYZ()); - } - glEnd(); + glVertex3fv(vertexarray[(indexarray[vindex++])].getLocalXYZ()); + glVertex3fv(vertexarray[(indexarray[vindex++])].getLocalXYZ()); } - break; - case 2: + glEnd(); + } + break; + case 2: + { + glBegin(GL_QUADS); + vindex=0; + if (useObjectColor) { - glBegin(GL_QUADS); - vindex=0; - if (useObjectColor) - { - for (unsigned int i=0;i<numindices;i+=4) - { - - glColor4d(rgbacolor[0], rgbacolor[1], rgbacolor[2], rgbacolor[3]); - - // - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - // - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - // - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - // - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - } - } - else + for (unsigned int i=0;i<numindices;i+=4) { - for (unsigned int i=0;i<numindices;i+=4) - { - // This looks curiously endian unsafe to me. - // However it depends on the way the colors are packed into - // the m_rgba field of RAS_TexVert - - // - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - // - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - // - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - // - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - } + + glColor4d(rgbacolor[0], rgbacolor[1], rgbacolor[2], rgbacolor[3]); + + // + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; + + // + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; + + // + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; + + // + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; } - glEnd(); - break; } - case 0: + else { - glBegin(GL_TRIANGLES); - vindex=0; - if (useObjectColor) - { - for (unsigned int i=0;i<numindices;i+=3) - { - - glColor4d(rgbacolor[0], rgbacolor[1], rgbacolor[2], rgbacolor[3]); - // - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - // - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - // - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - } - } - else + for (unsigned int i=0;i<numindices;i+=4) { - for (unsigned int i=0;i<numindices;i+=3) - { - // - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; + // This looks curiously endian unsafe to me. + // However it depends on the way the colors are packed into + // the m_rgba field of RAS_TexVert + + // + glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); + + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; - // - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - // - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - } - } - glEnd(); - break; - } - default: - { - } - } // switch - } // for each vertexarray - } -#endif// GL_ARB_multitexture -} + // + glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; -void RAS_OpenGLRasterizer::IndexPrimitivesMulti_Ex( - const vecVertexArray & vertexarrays, - const vecIndexArrays & indexarrays, - int mode, - class RAS_IPolyMaterial* polymat, - class RAS_IRenderTools* rendertools, - bool useObjectColor, - const MT_Vector4& rgbacolor) -{ -#if defined(GL_ARB_multitexture) && defined(WITH_GLEXT) - if (!getenv("WITHOUT_GLEXT")) { - bool recalc; - GLenum drawmode; - switch (mode) - { - case 0: - drawmode = GL_TRIANGLES; - break; - case 1: - drawmode = GL_LINES; - break; - case 2: - drawmode = GL_QUADS; - break; - default: - drawmode = GL_LINES; - break; - } - - const RAS_TexVert* vertexarray ; - unsigned int numindices,vt; + // + glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; - for (vt=0;vt<vertexarrays.size();vt++) - { - vertexarray = &((*vertexarrays[vt]) [0]); - const KX_IndexArray & indexarray = (*indexarrays[vt]); - numindices = indexarray.size(); - const unsigned int enabled = polymat->GetEnabled(); - - if (!numindices) - continue; - - int vindex=0; - switch (mode) - { - case 1: - { - glBegin(GL_LINES); - vindex=0; - for (unsigned int i=0;i<numindices;i+=2) - { - glVertex3fv(vertexarray[(indexarray[vindex++])].getLocalXYZ()); - glVertex3fv(vertexarray[(indexarray[vindex++])].getLocalXYZ()); + // + glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; } - glEnd(); } + glEnd(); break; - case 2: + } + case 0: + { + glBegin(GL_TRIANGLES); + vindex=0; + if (useObjectColor) { - glBegin(GL_QUADS); - vindex=0; - if (useObjectColor) + for (unsigned int i=0;i<numindices;i+=3) { - for (unsigned int i=0;i<numindices;i+=4) - { - MT_Point3 mv1, mv2, mv3, mv4, fnor; - /* Calc a new face normal */ - - if (vertexarray[(indexarray[vindex])].getFlag() & TV_CALCFACENORMAL) - recalc= true; - else - recalc=false; - - if (recalc){ - mv1 = MT_Point3(vertexarray[(indexarray[vindex])].getLocalXYZ()); - mv2 = MT_Point3(vertexarray[(indexarray[vindex+1])].getLocalXYZ()); - mv3 = MT_Point3(vertexarray[(indexarray[vindex+2])].getLocalXYZ()); - mv4 = MT_Point3(vertexarray[(indexarray[vindex+2])].getLocalXYZ()); - - fnor = (((mv2-mv1).cross(mv3-mv2))+((mv4-mv3).cross(mv1-mv4))).safe_normalized(); - - glNormal3f(fnor[0], fnor[1], fnor[2]); - } - glColor4d(rgbacolor[0], rgbacolor[1], rgbacolor[2], rgbacolor[3]); - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + glColor4d(rgbacolor[0], rgbacolor[1], rgbacolor[2], rgbacolor[3]); + // + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + // + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - } - } - else - { - for (unsigned int i=0;i<numindices;i+=4) - { - // This looks curiously endian unsafe to me. - // However it depends on the way the colors are packed into - // the m_rgba field of RAS_TexVert - MT_Point3 mv1, mv2, mv3, mv4, fnor; - /* Calc a new face normal */ - - if (vertexarray[(indexarray[vindex])].getFlag() & TV_CALCFACENORMAL) - recalc= true; - else - recalc=false; - - - if (recalc){ - mv1 = MT_Point3(vertexarray[(indexarray[vindex])].getLocalXYZ()); - mv2 = MT_Point3(vertexarray[(indexarray[vindex+1])].getLocalXYZ()); - mv3 = MT_Point3(vertexarray[(indexarray[vindex+2])].getLocalXYZ()); - mv4 = MT_Point3(vertexarray[(indexarray[vindex+3])].getLocalXYZ()); - - fnor = (((mv2-mv1).cross(mv3-mv2))+((mv4-mv3).cross(mv1-mv4))).safe_normalized(); - - glNormal3f(fnor[0], fnor[1], fnor[2]); - } - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - } + // + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; } - glEnd(); - break; } - case 0: + else { - glBegin(GL_TRIANGLES); - vindex=0; - if (useObjectColor) - { - for (unsigned int i=0;i<numindices;i+=3) - { - MT_Point3 mv1, mv2, mv3, fnor; - /* Calc a new face normal */ - - if (vertexarray[(indexarray[vindex])].getFlag() & TV_CALCFACENORMAL) - recalc= true; - else - recalc=false; - - if (recalc){ - mv1 = MT_Point3(vertexarray[(indexarray[vindex])].getLocalXYZ()); - mv2 = MT_Point3(vertexarray[(indexarray[vindex+1])].getLocalXYZ()); - mv3 = MT_Point3(vertexarray[(indexarray[vindex+2])].getLocalXYZ()); - - fnor = ((mv2-mv1).cross(mv3-mv2)).safe_normalized(); - glNormal3f(fnor[0], fnor[1], fnor[2]); - } - - glColor4d(rgbacolor[0], rgbacolor[1], rgbacolor[2], rgbacolor[3]); - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - } - } - else + for (unsigned int i=0;i<numindices;i+=3) { - for (unsigned int i=0;i<numindices;i+=3) - { - MT_Point3 mv1, mv2, mv3, fnor; - /* Calc a new face normal */ - - if (vertexarray[(indexarray[vindex])].getFlag() & TV_CALCFACENORMAL) - recalc= true; - else - recalc=false; - - - if (recalc){ - mv1 = MT_Point3(vertexarray[(indexarray[vindex])].getLocalXYZ()); - mv2 = MT_Point3(vertexarray[(indexarray[vindex+1])].getLocalXYZ()); - mv3 = MT_Point3(vertexarray[(indexarray[vindex+2])].getLocalXYZ()); - - fnor = ((mv2-mv1).cross(mv3-mv2)).safe_normalized(); - glNormal3f(fnor[0], fnor[1], fnor[2]); - } - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - - glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); - if (!recalc) - glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); - TexCoord(vertexarray[(indexarray[vindex])],enabled ); - glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); - vindex++; - } + // + glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; + + // + glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; + + // + glColor4ubv((const GLubyte *)(vertexarray[(indexarray[vindex])].getRGBA())); + glNormal3fv(vertexarray[(indexarray[vindex])].getNormal()); + TexCoord(vertexarray[(indexarray[vindex])]); + glVertex3fv(vertexarray[(indexarray[vindex])].getLocalXYZ()); + vindex++; } - glEnd(); - break; - } - default: - { } - - } // switch - } // for each vertexarray - } -#endif + glEnd(); + break; + } + default: + { + } + } // switch + } // for each vertexarray } - - void RAS_OpenGLRasterizer::SetProjectionMatrix(MT_CmMatrix4x4 &mat) { glMatrixMode(GL_PROJECTION); |