summaryrefslogtreecommitdiff
path: root/Runtime/Graphics/VertexBuffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Runtime/Graphics/VertexBuffer.cpp')
-rw-r--r--Runtime/Graphics/VertexBuffer.cpp67
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))