1$#include "Graphics/VertexBuffer.h"
2
3class VertexBuffer : public Object
4{
5    VertexBuffer();
6    ~VertexBuffer();
7
8    void SetShadowed(bool enable);
9    bool SetSize(unsigned vertexCount, const PODVector<VertexElement>& elements, bool dynamic = false);
10    bool SetSize(unsigned vertexCount, unsigned elementMask, bool dynamic = false);
11    tolua_outside bool VertexBufferSetData @ SetData(VectorBuffer& data);
12    tolua_outside bool VertexBufferSetDataRange @ SetDataRange(VectorBuffer& data, unsigned start, unsigned count, bool discard = false);
13    tolua_outside VectorBuffer VertexBufferGetData @ GetData();
14
15    bool IsShadowed() const;
16    bool IsDynamic() const;
17    unsigned GetVertexCount() const;
18    unsigned GetVertexSize() const;
19    tolua_outside const PODVector<VertexElement>& VertexBufferGetElements @ GetElements() const;
20    bool HasElement(VertexElementSemantic semantic, unsigned char index = 0) const;
21    bool HasElement(VertexElementType type, VertexElementSemantic semantic, unsigned char index = 0) const;
22    unsigned GetElementOffset(VertexElementSemantic semantic, unsigned char index = 0) const;
23    unsigned GetElementOffset(VertexElementType type, VertexElementSemantic semantic, unsigned char index = 0) const;
24    unsigned GetElementMask() const;
25
26    tolua_property__is_set bool shadowed;
27    tolua_readonly tolua_property__is_set bool dynamic;
28    tolua_readonly tolua_property__get_set unsigned vertexCount;
29    tolua_readonly tolua_property__get_set unsigned vertexSize;
30    tolua_readonly tolua_property__get_set unsigned elementMask;
31};
32
33${
34#define TOLUA_DISABLE_tolua_GraphicsLuaAPI_VertexBuffer_new00
35static int tolua_GraphicsLuaAPI_VertexBuffer_new00(lua_State* tolua_S)
36{
37    return ToluaNewObject<VertexBuffer>(tolua_S);
38}
39
40#define TOLUA_DISABLE_tolua_GraphicsLuaAPI_VertexBuffer_new00_local
41static int tolua_GraphicsLuaAPI_VertexBuffer_new00_local(lua_State* tolua_S)
42{
43    return ToluaNewObjectGC<VertexBuffer>(tolua_S);
44}
45
46static bool VertexBufferSetData(VertexBuffer* dest, VectorBuffer& src)
47{
48    // Make sure there is enough data
49    if (dest->GetVertexCount() && src.GetSize() >= dest->GetVertexCount() * dest->GetVertexSize())
50        return dest->SetData(&src.GetBuffer()[0]);
51    else
52        return false;
53}
54
55static bool VertexBufferSetDataRange(VertexBuffer* dest, VectorBuffer& src, unsigned start, unsigned count, bool discard)
56{
57    // Make sure there is enough data
58    if (dest->GetVertexCount() && src.GetSize() >= count * dest->GetVertexSize())
59        return dest->SetDataRange(&src.GetBuffer()[0], start, count, discard);
60    else
61        return false;
62}
63
64static VectorBuffer VertexBufferGetData(VertexBuffer* src)
65{
66    VectorBuffer ret;
67    void* data = src->Lock(0, src->GetVertexCount(), false);
68
69    if (data)
70    {
71        ret.Write(data, src->GetVertexCount() * src->GetVertexSize());
72        ret.Seek(0);
73        src->Unlock();
74    }
75
76    return ret;
77}
78
79static const PODVector<VertexElement>& VertexBufferGetElements(const VertexBuffer* buffer)
80{
81    static PODVector<VertexElement> vector = buffer->GetElements();
82    return vector;
83}
84$}
85