diff --git a/cocos/renderer/CCVertexIndexBuffer.cpp b/cocos/renderer/CCVertexIndexBuffer.cpp index ca3d53a2b2..c24efdd5e2 100644 --- a/cocos/renderer/CCVertexIndexBuffer.cpp +++ b/cocos/renderer/CCVertexIndexBuffer.cpp @@ -42,10 +42,10 @@ bool IndexBuffer::_enableShadowCopy = true; bool IndexBuffer::_enableShadowCopy = false; #endif -VertexBuffer* VertexBuffer::create(int sizePerVertex, int vertexNumber) +VertexBuffer* VertexBuffer::create(int sizePerVertex, int vertexNumber, GLenum usage/* = GL_STATIC_DRAW*/) { auto result = new (std::nothrow) VertexBuffer(); - if(result && result->init(sizePerVertex, vertexNumber)) + if(result && result->init(sizePerVertex, vertexNumber, usage)) { result->autorelease(); return result; @@ -85,12 +85,13 @@ VertexBuffer::~VertexBuffer() #endif } -bool VertexBuffer::init(int sizePerVertex, int vertexNumber) +bool VertexBuffer::init(int sizePerVertex, int vertexNumber, GLenum usage/* = GL_STATIC_DRAW*/) { if(0 == sizePerVertex || 0 == vertexNumber) return false; _sizePerVertex = sizePerVertex; _vertexNumber = vertexNumber; + _usage = usage; if(isShadowCopyEnabled()) { @@ -99,7 +100,7 @@ bool VertexBuffer::init(int sizePerVertex, int vertexNumber) glGenBuffers(1, &_vbo); glBindBuffer(GL_ARRAY_BUFFER, _vbo); - glBufferData(GL_ARRAY_BUFFER, getSize(), nullptr, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, getSize(), nullptr, _usage); glBindBuffer(GL_ARRAY_BUFFER, 0); return true; } @@ -158,7 +159,7 @@ void VertexBuffer::recreateVBO() const buffer = &_shadowCopy[0]; } CCLOG("recreate IndexBuffer with size %d %d", getSizePerVertex(), _vertexNumber); - glBufferData(GL_ARRAY_BUFFER, _sizePerVertex * _vertexNumber, buffer, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, _sizePerVertex * _vertexNumber, buffer, _usage); glBindBuffer(GL_ARRAY_BUFFER, 0); if(!glIsBuffer(_vbo)) { @@ -171,10 +172,10 @@ int VertexBuffer::getSize() const return _sizePerVertex * _vertexNumber; } -IndexBuffer* IndexBuffer::create(IndexType type, int number) +IndexBuffer* IndexBuffer::create(IndexType type, int number, GLenum usage/* = GL_STATIC_DRAW*/) { auto result = new (std::nothrow) IndexBuffer(); - if(result && result->init(type, number)) + if(result && result->init(type, number, usage)) { result->autorelease(); return result; @@ -211,16 +212,17 @@ IndexBuffer::~IndexBuffer() #endif } -bool IndexBuffer::init(IndexBuffer::IndexType type, int number) +bool IndexBuffer::init(IndexBuffer::IndexType type, int number, GLenum usage/* = GL_STATIC_DRAW*/) { if(number <=0 ) return false; _type = type; _indexNumber = number; + _usage = usage; glGenBuffers(1, &_vbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vbo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, getSize(), nullptr, GL_STATIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, getSize(), nullptr, _usage); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); if(isShadowCopyEnabled()) @@ -295,7 +297,7 @@ void IndexBuffer::recreateVBO() const buffer = &_shadowCopy[0]; } CCLOG("recreate IndexBuffer with size %d %d ", getSizePerIndex(), _indexNumber); - glBufferData(GL_ARRAY_BUFFER, getSize(), buffer, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, getSize(), buffer, _usage); glBindBuffer(GL_ARRAY_BUFFER, 0); if(!glIsBuffer(_vbo)) { diff --git a/cocos/renderer/CCVertexIndexBuffer.h b/cocos/renderer/CCVertexIndexBuffer.h index 1eaffe76f3..4ee7070d87 100644 --- a/cocos/renderer/CCVertexIndexBuffer.h +++ b/cocos/renderer/CCVertexIndexBuffer.h @@ -36,7 +36,7 @@ class EventListenerCustom; class CC_DLL VertexBuffer : public Ref { public: - static VertexBuffer* create(int sizePerVertex, int vertexNumber); + static VertexBuffer* create(int sizePerVertex, int vertexNumber, GLenum usage = GL_STATIC_DRAW); int getSizePerVertex() const; int getVertexNumber() const; @@ -50,7 +50,7 @@ protected: VertexBuffer(); virtual ~VertexBuffer(); - bool init(int sizePerVertex, int vertexNumber); + bool init(int sizePerVertex, int vertexNumber, GLenum usage = GL_STATIC_DRAW); protected: //event listener for foreground void recreateVBO() const; @@ -61,6 +61,7 @@ protected: int _vertexNumber; //buffer used for shadow copy std::vector _shadowCopy; + GLenum _usage; protected: static bool _enableShadowCopy; public: @@ -78,7 +79,7 @@ public: }; public: - static IndexBuffer* create(IndexType type, int number); + static IndexBuffer* create(IndexType type, int number, GLenum usage = GL_STATIC_DRAW); IndexType getType() const; int getSizePerIndex() const; @@ -93,7 +94,7 @@ protected: IndexBuffer(); virtual ~IndexBuffer(); - bool init(IndexType type, int number); + bool init(IndexType type, int number, GLenum usage = GL_STATIC_DRAW); protected: mutable GLuint _vbo; @@ -106,6 +107,7 @@ protected: EventListenerCustom* _recreateVBOEventListener; //buffer used for shadow copy std::vector _shadowCopy; + GLenum _usage; protected: static bool _enableShadowCopy; public: