| @@ -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 | // The VertexBuffer class | ||||
| // ---------------------- | // ---------------------- | ||||
| @@ -634,6 +674,11 @@ VertexBuffer::~VertexBuffer() | |||||
| delete m_data; | delete m_data; | ||||
| } | } | ||||
| size_t VertexBuffer::GetSize() | |||||
| { | |||||
| return m_data->m_size; | |||||
| } | |||||
| void *VertexBuffer::Lock(size_t offset, size_t size) | void *VertexBuffer::Lock(size_t offset, size_t size) | ||||
| { | { | ||||
| if (!m_data->m_size) | if (!m_data->m_size) | ||||
| @@ -29,6 +29,8 @@ public: | |||||
| VertexBuffer(size_t size); | VertexBuffer(size_t size); | ||||
| ~VertexBuffer(); | ~VertexBuffer(); | ||||
| size_t GetSize(); | |||||
| void *Lock(size_t offset, size_t size); | void *Lock(size_t offset, size_t size); | ||||
| void Unlock(); | void Unlock(); | ||||
| @@ -142,7 +144,7 @@ class VertexStreamBase | |||||
| { | { | ||||
| friend class VertexDeclaration; | friend class VertexDeclaration; | ||||
| protected: | |||||
| public: | |||||
| enum | enum | ||||
| { | { | ||||
| Typevoid = 0, | Typevoid = 0, | ||||
| @@ -157,6 +159,38 @@ protected: | |||||
| Typeuint32_t, Typeuvec2, Typeuvec3, Typeuvec4, | 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) \ | #define LOL_TYPE(T) \ | ||||
| static uint8_t GetType(T *x) { UNUSED(x); return Type##T; } | static uint8_t GetType(T *x) { UNUSED(x); return Type##T; } | ||||
| @@ -266,6 +300,10 @@ public: | |||||
| ShaderAttrib attr11 = ShaderAttrib(), | ShaderAttrib attr11 = ShaderAttrib(), | ||||
| ShaderAttrib attr12 = ShaderAttrib()); | ShaderAttrib attr12 = ShaderAttrib()); | ||||
| int GetStreamCount() const; | |||||
| VertexStreamBase GetStream(int index) const; | |||||
| private: | private: | ||||
| void Initialize(); | void Initialize(); | ||||
| void AddStream(VertexStreamBase const &); | void AddStream(VertexStreamBase const &); | ||||