@@ -598,6 +598,46 @@ void VertexDeclaration::AddStream(VertexStreamBase const &s) | |||
} | |||
} | |||
int VertexDeclaration::GetStreamCount() const | |||
{ | |||
return m_count ? m_streams[m_count - 1].index + 1 : 0; | |||
} | |||
VertexStreamBase VertexDeclaration::GetStream(int index) const | |||
{ | |||
VertexStreamBase stream; | |||
int n = 0; | |||
for (int i = 0; i < m_count; ++i) | |||
{ | |||
if (m_streams[i].index != index) | |||
continue; | |||
switch (m_streams[i].stream_type) | |||
{ | |||
#define LOL_TYPE(T) \ | |||
case VertexStreamBase::Type##T: stream.AddStream<T>(n++, m_streams[i].usage); break; | |||
LOL_TYPE(void) | |||
LOL_TYPE(half) LOL_TYPE(f16vec2) LOL_TYPE(f16vec3) LOL_TYPE(f16vec4) | |||
LOL_TYPE(float) LOL_TYPE(vec2) LOL_TYPE(vec3) LOL_TYPE(vec4) | |||
LOL_TYPE(double) LOL_TYPE(dvec2) LOL_TYPE(dvec3) LOL_TYPE(dvec4) | |||
LOL_TYPE(int8_t) LOL_TYPE(i8vec2) LOL_TYPE(i8vec3) LOL_TYPE(i8vec4) | |||
LOL_TYPE(uint8_t) LOL_TYPE(u8vec2) LOL_TYPE(u8vec3) LOL_TYPE(u8vec4) | |||
LOL_TYPE(int16_t) LOL_TYPE(i16vec2) LOL_TYPE(i16vec3) LOL_TYPE(i16vec4) | |||
LOL_TYPE(uint16_t) LOL_TYPE(u16vec2) LOL_TYPE(u16vec3) LOL_TYPE(u16vec4) | |||
LOL_TYPE(int32_t) LOL_TYPE(ivec2) LOL_TYPE(ivec3) LOL_TYPE(ivec4) | |||
LOL_TYPE(uint32_t) LOL_TYPE(uvec2) LOL_TYPE(uvec3) LOL_TYPE(uvec4) | |||
#undef LOL_TYPE | |||
} | |||
} | |||
for (int i = m_count; i < 12; ++i) | |||
stream.AddStream<void>(i, VertexStreamBase::Typevoid); | |||
return stream; | |||
} | |||
// | |||
// The VertexBuffer class | |||
// ---------------------- | |||
@@ -634,6 +674,11 @@ VertexBuffer::~VertexBuffer() | |||
delete m_data; | |||
} | |||
size_t VertexBuffer::GetSize() | |||
{ | |||
return m_data->m_size; | |||
} | |||
void *VertexBuffer::Lock(size_t offset, size_t size) | |||
{ | |||
if (!m_data->m_size) | |||
@@ -29,6 +29,8 @@ public: | |||
VertexBuffer(size_t size); | |||
~VertexBuffer(); | |||
size_t GetSize(); | |||
void *Lock(size_t offset, size_t size); | |||
void Unlock(); | |||
@@ -142,7 +144,7 @@ class VertexStreamBase | |||
{ | |||
friend class VertexDeclaration; | |||
protected: | |||
public: | |||
enum | |||
{ | |||
Typevoid = 0, | |||
@@ -157,6 +159,38 @@ protected: | |||
Typeuint32_t, Typeuvec2, Typeuvec3, Typeuvec4, | |||
}; | |||
int GetSize() const | |||
{ | |||
int size = 0, i = 0; | |||
while (m_streams[i].size) | |||
size += m_streams[i++].size; | |||
return size; | |||
} | |||
int GetStreamCount() const | |||
{ | |||
int i = 0; | |||
while (m_streams[i].size) ++i; | |||
return i; | |||
} | |||
VertexUsage GetUsage(int index) const | |||
{ | |||
return m_streams[index].usage; | |||
} | |||
uint8_t GetType(int index) const | |||
{ | |||
return m_streams[index].stream_type; | |||
} | |||
uint8_t GetSize(int index) const | |||
{ | |||
return m_streams[index].size; | |||
} | |||
protected: | |||
#define LOL_TYPE(T) \ | |||
static uint8_t GetType(T *x) { UNUSED(x); return Type##T; } | |||
@@ -266,6 +300,10 @@ public: | |||
ShaderAttrib attr11 = ShaderAttrib(), | |||
ShaderAttrib attr12 = ShaderAttrib()); | |||
int GetStreamCount() const; | |||
VertexStreamBase GetStream(int index) const; | |||
private: | |||
void Initialize(); | |||
void AddStream(VertexStreamBase const &); | |||