diff options
author | chai <chaifix@163.com> | 2021-10-27 23:37:24 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-10-27 23:37:24 +0800 |
commit | 305ca0a09d4e750186b5190432de47f3493e806a (patch) | |
tree | d82f9ef73191abc2acbcbfdca4b184a28e6c381b /Runtime/Graphics/VertexBuffer.cpp | |
parent | 51ced5a191078ce4ef08d57e343e91db007f556f (diff) |
*GfxDevice
Diffstat (limited to 'Runtime/Graphics/VertexBuffer.cpp')
-rw-r--r-- | Runtime/Graphics/VertexBuffer.cpp | 67 |
1 files changed, 33 insertions, 34 deletions
diff --git a/Runtime/Graphics/VertexBuffer.cpp b/Runtime/Graphics/VertexBuffer.cpp index 7861d6f..7ea3acd 100644 --- a/Runtime/Graphics/VertexBuffer.cpp +++ b/Runtime/Graphics/VertexBuffer.cpp @@ -1,7 +1,7 @@ #include "VertexBuffer.h" #include "../Profiling/FrameStats.h" -void SetupDefaultVertexArray(const VertexArrayInfo& info); +void SetupDefaultVertexArray(const VertexDataInfo& info); void InvalidateVertexInputCache(); // LUTs of vertex attributes @@ -10,8 +10,10 @@ static const int kVertexAttrSize[VertexAttr_Count] = { 3 * sizeof(float), // normal 4 * sizeof(float), // tangent 1 * sizeof(uint32), // color - 2 * sizeof(float), // uv0 - 2 * sizeof(float), // uv1 + 2 * sizeof(float), // uv + 2 * sizeof(float), // uv2 + 2 * sizeof(float), // uv3 + 2 * sizeof(float), // uv4 }; static const int kVertexAttrDimension[VertexAttr_Count] = { @@ -19,8 +21,10 @@ static const int kVertexAttrDimension[VertexAttr_Count] = { 3, // normal 4, // tangent 1, // color - 2, // uv0 - 2 // uv1 + 2, // uv + 2, // uv2 + 2, // uv3 + 2, // uv4 }; enum VertexAttrFormat @@ -34,11 +38,11 @@ enum VertexAttrFormat }; // map VertexAttrFormat to OpenGL type -static GLenum kGLVertexAttrFormat [VertexAttr_Count] = { - GL_FLOAT, // VertexAttrFormat_Float - GL_HALF_FLOAT, // VertexAttrFormat_Float16 +static GLenum kGLVertexAttrFormat[VertexAttrFormat_Count] = { + GL_FLOAT, // VertexAttrFormat_Float + GL_HALF_FLOAT, // VertexAttrFormat_Float16 GL_UNSIGNED_BYTE, // VertexAttrFormat_Color - GL_BYTE // VertexAttrFormat_Byte + GL_BYTE // VertexAttrFormat_Byte }; static bool IsGLVertexAttrNeedNormalized(uint attr, uint format) @@ -94,6 +98,8 @@ VertexBuffer::~VertexBuffer() { } +//------------------------------------------------------------------------------------------------------------ + SharedVertexBuffer::SharedVertexBuffer() { } @@ -106,7 +112,7 @@ SharedVertexBuffer::~SharedVertexBuffer() //-> ReleaseChunk //-> DrawChunk -void SharedVertexBuffer::GetChunk(uint attrsMask, int maxVerts, int maxIndices, RenderMode mode, void **out_vb, void **out_ib) +void SharedVertexBuffer::GetChunk(uint attrsMask, int maxVerts, int maxIndices, EPrimitive primitive, void **out_vb, void **out_ib) { Assert(out_vb && out_ib); @@ -147,7 +153,7 @@ void SharedVertexBuffer::GetChunk(uint attrsMask, int maxVerts, int maxIndices, m_CurVB = vertexBuffer; m_CurIB = indexBuffer; - m_CurRenderMode = mode; + m_CurPrimitive = primitive; m_CurAttrMask = attrsMask; m_CurStride = stride; } @@ -187,7 +193,7 @@ void SharedVertexBuffer::ReleaseChunk(int actualVerts, int actualIndices) void SharedVertexBuffer::DrawChunk() { - VertexArrayInfo vertexArray; + VertexDataInfo vertexArray; FillVertexArrayInfo(vertexArray); // bind vertex attributes data @@ -198,18 +204,18 @@ void SharedVertexBuffer::DrawChunk() if (m_CurIB) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_CurIB->GetHandle()); - switch (m_CurRenderMode) + switch (m_CurPrimitive) { - case RenderMode_Triangle: + case Primitive_Triangle: glDrawElements(GL_TRIANGLES, m_CurIndexCount, kGLIndexFormat, indexPtr); g_FrameStats.AddDrawCall(); g_FrameStats.AddTrianglesCount(m_CurIndexCount / 3); break; - case RenderMode_Line: + case Primitive_Line: glDrawElements(GL_LINE, m_CurIndexCount, kGLIndexFormat, indexPtr); g_FrameStats.AddDrawCall(); break; - case RenderMode_Point: + case Primitive_Point: glDrawElements(GL_POINT, m_CurIndexCount, kGLIndexFormat, indexPtr); g_FrameStats.AddDrawCall(); break; @@ -222,11 +228,11 @@ void SharedVertexBuffer::DrawChunk() Clean(); } -void SharedVertexBuffer::FillVertexArrayInfo(VertexArrayInfo& dst) +void SharedVertexBuffer::FillVertexArrayInfo(VertexDataInfo& dst) { const byte* basepointer = m_CurVB ? 0 : &m_CurVBData[0]; const GLuint buffer = m_CurVB ? m_CurVB->GetHandle() : 0; - + int attrOffsets[VertexAttr_Count] = {0}; { @@ -241,12 +247,12 @@ void SharedVertexBuffer::FillVertexArrayInfo(VertexArrayInfo& dst) } } + dst.buffer = buffer; + for (uint32 attrIdx = 0; attrIdx < VertexAttr_Count; ++attrIdx) { if (m_CurAttrMask & Mask(attrIdx)) { - dst.buffers[attrIdx] = buffer; - dst.attributes[attrIdx].pointer = basepointer + attrOffsets[attrIdx]; dst.attributes[attrIdx].componentType = GetDefaultShaderChannelFormat(attrIdx); dst.attributes[attrIdx].componentNum = GetDefaultShaderChannelDimension(attrIdx); @@ -271,7 +277,7 @@ void SharedVertexBuffer::Clean() m_CurIB = 0; } - m_CurRenderMode = (RenderMode)0; + m_CurPrimitive = Primitive_Triangle; m_CurAttrMask = 0; m_CurStride = 0; m_CurVertexCount = 0; @@ -283,9 +289,9 @@ void SharedVertexBuffer::Clean() static uint32 sEnabledArrays = 0; -void SetupDefaultVertexArray(const VertexArrayInfo& info) +void SetupDefaultVertexArray(const VertexDataInfo& info) { - GLuint curBoundBuffer = 0; + glBindBuffer(GL_ARRAY_BUFFER, info.buffer); for (int attrIdx = 0; attrIdx < VertexAttr_Count; ++attrIdx) { @@ -293,19 +299,12 @@ void SetupDefaultVertexArray(const VertexArrayInfo& info) { if (!sEnabledArrays & Mask(attrIdx)) glEnableVertexAttribArray(attrIdx); - const GLuint buffer = info.buffers[attrIdx]; - const int numCompo = info.attributes[attrIdx].componentNum; - const GLenum compoType = kGLVertexAttrFormat[info.attributes[attrIdx].componentType]; - const bool normalized = IsGLVertexAttrNeedNormalized(attrIdx, compoType); - const uint stride = info.attributes[attrIdx].stride; + int numCompo = info.attributes[attrIdx].componentNum; + GLenum compoType = kGLVertexAttrFormat[info.attributes[attrIdx].componentType]; + bool normalized = IsGLVertexAttrNeedNormalized(attrIdx, compoType); + uint stride = info.attributes[attrIdx].stride; const void* pointer = info.attributes[attrIdx].pointer; - if (curBoundBuffer != buffer) - { - glBindBuffer(GL_ARRAY_BUFFER, buffer); - curBoundBuffer = buffer; - } - glVertexAttribPointer(attrIdx, numCompo, compoType, normalized ? GL_TRUE : GL_FALSE, stride, pointer); } else if(sEnabledArrays & Mask(attrIdx)) |