Guest User

Untitled

a guest
Apr 24th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.62 KB | None | 0 0
  1.  if (smoothNormals==true)
  2.         {
  3.             SmoothNormals();
  4.         }
  5.        
  6.         // vertex count
  7.         unsigned int vertexCount = tVertex.size();
  8.  
  9.         // Set Attributes
  10.         if (HasVertex()==true || tVertex.size()>0)
  11.         {            
  12.             hasVertex = true;
  13.             AddAttribute("Vertex", "aPosition", BufferElementUsage::Pos, BufferElementType::Vec3);
  14.         }
  15.         if (HasNormal()==true || tNormal.size()>0)
  16.         {
  17.             hasNormal = true;
  18.             AddAttribute("Vertex", "aNormal", BufferElementUsage::Normal, BufferElementType::Vec3);
  19.         }
  20.         if (HasTexcoord()==true || tTexcoord.size()>0)
  21.         {
  22.             hasTexcoord = true;
  23.             AddAttribute("Vertex", "aTexcoord", BufferElementUsage::TexCoord, BufferElementType::Vec2);
  24.         }
  25.         if (HasTangentBitangent()==true || (tBitangent.size()>0 && tTangent.size()>0))
  26.         {
  27.             hasTangentBitangent = true;
  28.             AddAttribute("Vertex", "aTangent", BufferElementUsage::Tangent, BufferElementType::Vec3);
  29.             AddAttribute("Vertex", "aBitangent", BufferElementUsage::Bitangent, BufferElementType::Vec3);
  30.         }
  31.         if (HasVertexColor()==true || tVertexColor.size()>0)
  32.         {
  33.             hasVertexColor = true;
  34.             AddAttribute("Vertex", "aColor", BufferElementUsage::Color, BufferElementType::Vec4);
  35.         }
  36.        
  37.         // Set offsets        
  38.         unsigned int offset = 0;
  39.         for (std::map <StringID, AttributeBuffer>::iterator i=Attributes.begin();i!=Attributes.end();i++)
  40.         {
  41.             for (std::map<StringID, SuperSmartPointer <VertexAttribute> >::iterator k = (*i).second.Attributes.begin();k!=(*i).second.Attributes.end();k++)
  42.             {
  43.                 (*k).second->Offset = offset;
  44.                 switch((*k).second->Type)
  45.                 {
  46.                     case BufferElementType::Float:
  47.                             offset += sizeof(float);
  48.                             (*k).second->byteSize=sizeof(float);
  49.                             break;
  50.                     case BufferElementType::Int:
  51.                             offset += sizeof(int);
  52.                             (*k).second->byteSize=sizeof(int);
  53.                             break;
  54.                     case BufferElementType::Matrix:
  55.                             offset += sizeof(Matrix);
  56.                             (*k).second->byteSize=sizeof(Matrix);
  57.                             break;
  58.                     case BufferElementType::Vec2:
  59.                             offset += sizeof(vec2);
  60.                             (*k).second->byteSize=sizeof(vec2);
  61.                             break;
  62.                     case BufferElementType::Vec3:
  63.                             offset += sizeof(vec3);
  64.                             (*k).second->byteSize=sizeof(vec3);
  65.                             break;
  66.                     case BufferElementType::Vec4:
  67.                             offset += sizeof(vec4);
  68.                             (*k).second->byteSize=sizeof(vec4);
  69.                             break;
  70.                 };
  71.             }
  72.         }
  73.         vertexTotalOffset = offset;
  74.        
  75.         // resize vertexdata
  76.         vertexData.resize(vertexTotalOffset*vertexCount);
  77.        
  78.         // copy data
  79.         for (unsigned int v=0; v<vertexCount; v++)
  80.         {
  81.             offset = vertexTotalOffset*v;
  82.             for (std::map<StringID, AttributeBuffer >::iterator i=Attributes.begin(); i!=Attributes.end();i++)
  83.             {            
  84.                 for (std::map<StringID, SuperSmartPointer<VertexAttribute> >::iterator k=(*i).second.Attributes.begin();k!=(*i).second.Attributes.end();k++)
  85.                 {                    
  86.                     switch ((*k).second->Usage)
  87.                     {
  88.                         case BufferElementUsage::Pos:
  89.                             memcpy(&vertexData[offset + (*k).second->Offset], &tVertex[v], (*k).second->byteSize);
  90.                             break;
  91.                         case BufferElementUsage::Normal:
  92.                             memcpy(&vertexData[offset + (*k).second->Offset], &tNormal[v], (*k).second->byteSize);  
  93.                             break;
  94.                         case BufferElementUsage::TexCoord:
  95.                             memcpy(&vertexData[offset + (*k).second->Offset], &tTexcoord[v], (*k).second->byteSize);
  96.                             break;
  97.                         case BufferElementUsage::Color:
  98.                             memcpy(&vertexData[offset + (*k).second->Offset], &tVertexColor[v], (*k).second->byteSize);
  99.                             break;
  100.                         case BufferElementUsage::Tangent:
  101.                             memcpy(&vertexData[offset + (*k).second->Offset], &tTangent[v], (*k).second->byteSize);
  102.                             break;
  103.                         case BufferElementUsage::Bitangent:
  104.                             memcpy(&vertexData[offset + (*k).second->Offset], &tBitangent[v], (*k).second->byteSize);
  105.                             break;
  106.                     }
  107.                 }              
  108.             }
  109.         }
  110.        
  111.         // send index buffer
  112.         indexBuffer->Init( &indexData[0], sizeof(unsigned int)*indexData.size(), BufferType::Index, BufferDraw::Static );        
  113.         // send vertex buffers
  114.         for (std::map <StringID, AttributeBuffer>::iterator i=Attributes.begin();i!=Attributes.end();i++)
  115.         {
  116.             (*i).second.Buffer = SuperSmartPointer<GeometryBuffer> (new GeometryBuffer());
  117.             (*i).second.Buffer->Init(&vertexData[0], vertexData.size(), BufferType::Attribute, BufferDraw::Static);
  118.         }
Add Comment
Please, Sign In to add comment