Browse Source

Add a workaround for the 16 vertex attribute limit on nvidia gl

James Urquhart 9 years ago
parent
commit
ace01a313c

+ 0 - 8
Engine/source/gfx/gl/gfxGLShader.cpp

@@ -455,14 +455,6 @@ bool GFXGLShader::_init()
    glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_Tangent,     "vTangent");
    glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_TangentW,    "vTangentW");
    glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_Binormal,    "vBinormal");
-   glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_BlendIndex0, "vBlendIndex0");
-   glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_BlendIndex1, "vBlendIndex1");
-   glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_BlendIndex2, "vBlendIndex2");
-   glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_BlendIndex3, "vBlendIndex3");
-   glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_BlendWeight0, "vBlendWeight0");
-   glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_BlendWeight1, "vBlendWeight1");
-   glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_BlendWeight2, "vBlendWeight2");
-   glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_BlendWeight3, "vBlendWeight3");
    glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_TexCoord0,   "vTexCoord0");
    glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_TexCoord1,   "vTexCoord1");
    glBindAttribLocation(mProgram, Torque::GL_VertexAttrib_TexCoord2,   "vTexCoord2");

+ 4 - 9
Engine/source/gfx/gl/gfxGLVertexAttribLocation.h

@@ -11,14 +11,6 @@ namespace Torque
       GL_VertexAttrib_Tangent,
       GL_VertexAttrib_TangentW,
       GL_VertexAttrib_Binormal,
-      GL_VertexAttrib_BlendIndex0,
-      GL_VertexAttrib_BlendIndex1,
-      GL_VertexAttrib_BlendIndex2,
-      GL_VertexAttrib_BlendIndex3,
-      GL_VertexAttrib_BlendWeight0,
-      GL_VertexAttrib_BlendWeight1,
-      GL_VertexAttrib_BlendWeight2,
-      GL_VertexAttrib_BlendWeight3,
       GL_VertexAttrib_TexCoord0,
       GL_VertexAttrib_TexCoord1,
       GL_VertexAttrib_TexCoord2,
@@ -29,8 +21,11 @@ namespace Torque
       GL_VertexAttrib_TexCoord7,
       GL_VertexAttrib_TexCoord8,
       GL_VertexAttrib_TexCoord9,
+      GL_VertexAttrib_COUNT,
+
       GL_VertexAttrib_LAST = GL_VertexAttrib_TexCoord9,
-      GL_VertexAttrib_COUNT
+      GL_VertexAttrib_BlendWeight0 = GL_VertexAttrib_TexCoord6,
+      GL_VertexAttrib_BlendIndex0 = GL_VertexAttrib_TexCoord2,
    };
 }
 

+ 2 - 0
Engine/source/gfx/gl/gfxGLVertexDecl.cpp

@@ -105,6 +105,8 @@ void GFXGLVertexDecl::_initVerticesFormat(U32 stream)
       if(element.getStreamIndex() != stream)
          continue;
 
+      AssertFatal(!mFormat->hasBlendIndices() || !element.isSemantic(GFXSemantic::TEXCOORD) || (mFormat->hasBlendIndices() && element.isSemantic(GFXSemantic::TEXCOORD) && element.getSemanticIndex() < 2), "skinning with more than 2 used texcoords!");
+
       vertexSize += element.getSizeInBytes();
    }
 

+ 5 - 2
Engine/source/shaderGen/GLSL/shaderCompGLSL.cpp

@@ -26,6 +26,7 @@
 #include "shaderGen/shaderComp.h"
 #include "shaderGen/langElement.h"
 #include "gfx/gfxDevice.h"
+#include "gfx/gl/gfxGLVertexAttribLocation.h"
 
 
 Var * AppVertConnectorGLSL::getElement(   RegisterType type, 
@@ -107,7 +108,8 @@ Var * AppVertConnectorGLSL::getElement(   RegisterType type,
          newVar->constNum = mCurBlendIndicesElem;
          mElementList.push_back(newVar);
          char out[32];
-         dSprintf((char*)out, sizeof(out), "vBlendIndex%d", mCurBlendIndicesElem);
+         const U32 blendIndicesOffset = Torque::GL_VertexAttrib_BlendIndex0 - Torque::GL_VertexAttrib_TexCoord0;
+         dSprintf((char*)out, sizeof(out), "vTexCoord%d", blendIndicesOffset + mCurBlendIndicesElem);
          mCurBlendIndicesElem += 1;
          newVar->setConnectName(out);
          return newVar;
@@ -119,7 +121,8 @@ Var * AppVertConnectorGLSL::getElement(   RegisterType type,
          newVar->constNum = mCurBlendWeightsElem;
          mElementList.push_back(newVar);
          char out[32];
-         dSprintf((char*)out, sizeof(out), "vBlendWeight%d", mCurBlendWeightsElem);
+         const U32 blendWeightsOffset = Torque::GL_VertexAttrib_BlendWeight0 - Torque::GL_VertexAttrib_TexCoord0;
+         dSprintf((char*)out, sizeof(out), "vTexCoord%d", blendWeightsOffset + mCurBlendWeightsElem);
          mCurBlendWeightsElem += 1;
          newVar->setConnectName(out);
          return newVar;