From a04b5fc5d5dd04f7c5542c70598b10720ff63e30 Mon Sep 17 00:00:00 2001 From: "Huabing.Xu" Date: Fri, 27 Jun 2014 10:30:21 +0800 Subject: [PATCH] use custom command for fast_tmx rendering --- cocos/2d/CCFastTMXLayer.cpp | 84 ++++++++++++++++++++++++------------- cocos/2d/CCFastTMXLayer.h | 6 ++- 2 files changed, 58 insertions(+), 32 deletions(-) diff --git a/cocos/2d/CCFastTMXLayer.cpp b/cocos/2d/CCFastTMXLayer.cpp index 26ec7ec085..e96cc269b7 100644 --- a/cocos/2d/CCFastTMXLayer.cpp +++ b/cocos/2d/CCFastTMXLayer.cpp @@ -109,19 +109,20 @@ bool FastTMXLayer::initWithTilesetInfo(TMXTilesetInfo *tilesetInfo, TMXLayerInfo } FastTMXLayer::FastTMXLayer() -:_layerName("") -,_layerSize(Size::ZERO) -,_mapTileSize(Size::ZERO) -,_tiles(nullptr) -,_tileSet(nullptr) -,_layerOrientation(FastTMXOrientationOrtho) +: _layerName("") +, _layerSize(Size::ZERO) +, _mapTileSize(Size::ZERO) +, _tiles(nullptr) +, _tileSet(nullptr) +, _layerOrientation(FastTMXOrientationOrtho) ,_texture(nullptr) -,_verticesToDraw(0) -,_vertexZvalue(0) -,_useAutomaticVertexZ(false) -,_dirty(true) +, _verticesToDraw(0) +, _vertexZvalue(0) +, _useAutomaticVertexZ(false) +, _dirty(true) , _quadsDirty(true) { + _buffersVBO[0] = _buffersVBO[1] = 0; } FastTMXLayer::~FastTMXLayer() @@ -129,6 +130,15 @@ FastTMXLayer::~FastTMXLayer() CC_SAFE_RELEASE(_tileSet); CC_SAFE_RELEASE(_texture); CC_SAFE_DELETE_ARRAY(_tiles); + if(glIsBuffer(_buffersVBO[0])) + { + glDeleteBuffers(1, &_buffersVBO[0]); + } + + if(glIsBuffer(_buffersVBO[1])) + { + glDeleteBuffers(1, &_buffersVBO[1]); + } } bool sortQuadCommand(const V3F_C4B_T2F_Quad& a, const V3F_C4B_T2F_Quad& b) @@ -166,7 +176,6 @@ void FastTMXLayer::draw(Renderer *renderer, const Mat4& transform, uint32_t flag auto& cmd = _renderCommands[index++]; cmd.init(iter.first); - printf("in draw function of FastTMXLayer %d\n", iter.second.size()); cmd.func = CC_CALLBACK_0(FastTMXLayer::onDraw, this, &iter.second); renderer->addCommand(&cmd); } @@ -179,7 +188,7 @@ void FastTMXLayer::onDraw(const std::vector *indices) getGLProgramState()->apply(_modelViewTransform); glBindVertexArray(0); - glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_POSITION); @@ -188,7 +197,6 @@ void FastTMXLayer::onDraw(const std::vector *indices) glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), &_totalQuads[0]); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(V3F_C4B_T2F), ((char*)&_totalQuads[0]) + offsetof(V3F_C4B_T2F, colors)); glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B_T2F), ((char*)&_totalQuads[0]) + offsetof(V3F_C4B_T2F, texCoords)); - printf("in onDraw function of FastTMXLayer %d\n", indices->size()); glDrawElements(GL_TRIANGLES, (GLsizei)indices->size(), GL_UNSIGNED_INT, &(*indices)[0]); } @@ -283,26 +291,43 @@ int FastTMXLayer::updateTiles(const Rect& culledRect) return tilesUsed * 6; } -void FastTMXLayer::setupVBO() +void FastTMXLayer::updateVertexBuffer() { - glGenBuffers(2, &_buffersVBO[0]); - - // 10922 = 65536/6 - int total = std::min(static_cast(_layerSize.width * _layerSize.height), MAX_QUADS_COUNT); - - // Vertex + Tex Coords + glBindVertexArray(0); + if(!glIsBuffer(_buffersVBO[0])) + { + glGenBuffers(1, &_buffersVBO[0]); + } + glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]); - glBufferData(GL_ARRAY_BUFFER, total * sizeof(V3F_T2F_Quad), NULL, GL_DYNAMIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(V3F_C4B_T2F_Quad) * _quads.size(), (GLvoid*)&_quads[0], GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); - - // Indices - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _buffersVBO[1]); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, total * 6 * sizeof(GLushort), NULL, GL_DYNAMIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - - CHECK_GL_ERROR_DEBUG(); } +//void FastTMXLayer::updateIndexBuffer() +//{ +//} + +//void FastTMXLayer::setupVBO() +//{ +// glGenBuffers(2, &_buffersVBO[0]); +// +// // 10922 = 65536/6 +// int total = std::min(static_cast(_layerSize.width * _layerSize.height), MAX_QUADS_COUNT); +// +// // Vertex + Tex Coords +// glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]); +// glBufferData(GL_ARRAY_BUFFER, total * sizeof(V3F_T2F_Quad), NULL, GL_DYNAMIC_DRAW); +// glBindBuffer(GL_ARRAY_BUFFER, 0); +// +// // Indices +// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _buffersVBO[1]); +// glBufferData(GL_ELEMENT_ARRAY_BUFFER, total * 6 * sizeof(GLushort), NULL, GL_DYNAMIC_DRAW); +// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); +// +// CHECK_GL_ERROR_DEBUG(); +//} + // FastTMXLayer - setup Tiles void FastTMXLayer::setupTiles() { @@ -340,7 +365,6 @@ void FastTMXLayer::setupTiles() _screenTileCount = _screenGridSize.width * _screenGridSize.height; - setupVBO(); } Mat4 FastTMXLayer::tileToNodeTransform() @@ -497,7 +521,7 @@ void FastTMXLayer::updateTotalQuads() } } - //TODO: update VBOs + updateVertexBuffer(); _quadsDirty = false; } diff --git a/cocos/2d/CCFastTMXLayer.h b/cocos/2d/CCFastTMXLayer.h index a47174de9a..455c2c00bd 100644 --- a/cocos/2d/CCFastTMXLayer.h +++ b/cocos/2d/CCFastTMXLayer.h @@ -189,7 +189,6 @@ protected: bool initWithTilesetInfo(TMXTilesetInfo *tilesetInfo, TMXLayerInfo *layerInfo, TMXMapInfo *mapInfo); int updateTiles(const Rect& culledRect); - void setupVBO(); Vec2 calculateLayerOffset(const Vec2& offset); /* The layer recognizes some special properties, like cc_vertez */ @@ -209,6 +208,9 @@ protected: void onDraw(const std::vector* indices); inline int getTileIndexByPos(int x, int y) const { return x + y * (int) _layerSize.width; } + + void updateVertexBuffer(); + //void updateIndexBuffer(); protected: //! name of the layer @@ -232,7 +234,7 @@ protected: /** container for sprite children. map > */ std::map > _spriteContainer; - GLuint _buffersVBO[3]; //0: vertex, 1: tex coords, 2: indices + GLuint _buffersVBO[2]; //0: vertex, 1: indices Size _screenGridSize; Rect _screenGridRect;