mirror of https://github.com/axmolengine/axmol.git
new version of rendering for tile map
This commit is contained in:
parent
bb4128036c
commit
740372ceb3
|
@ -128,6 +128,11 @@ FastTMXLayer::~FastTMXLayer()
|
||||||
CC_SAFE_DELETE_ARRAY(_tiles);
|
CC_SAFE_DELETE_ARRAY(_tiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool sortQuadCommand(const V3F_C4B_T2F_Quad& a, const V3F_C4B_T2F_Quad& b)
|
||||||
|
{
|
||||||
|
return a.bl.vertices.z < b.bl.vertices.z;
|
||||||
|
}
|
||||||
|
|
||||||
void FastTMXLayer::draw(Renderer *renderer, const Mat4& transform, uint32_t flags)
|
void FastTMXLayer::draw(Renderer *renderer, const Mat4& transform, uint32_t flags)
|
||||||
{
|
{
|
||||||
if( flags != 0 || _dirty )
|
if( flags != 0 || _dirty )
|
||||||
|
@ -140,7 +145,7 @@ void FastTMXLayer::draw(Renderer *renderer, const Mat4& transform, uint32_t flag
|
||||||
rect = RectApplyTransform(rect, inv);
|
rect = RectApplyTransform(rect, inv);
|
||||||
|
|
||||||
_verticesToDraw = updateTiles(rect, renderer);
|
_verticesToDraw = updateTiles(rect, renderer);
|
||||||
|
std::sort(_quads.begin(), _quads.end(), sortQuadCommand);
|
||||||
// don't draw more than 65535 vertices since we are using GL_UNSIGNED_SHORT for indices
|
// don't draw more than 65535 vertices since we are using GL_UNSIGNED_SHORT for indices
|
||||||
_verticesToDraw = std::min(_verticesToDraw, 65535);
|
_verticesToDraw = std::min(_verticesToDraw, 65535);
|
||||||
|
|
||||||
|
@ -148,13 +153,22 @@ void FastTMXLayer::draw(Renderer *renderer, const Mat4& transform, uint32_t flag
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto glprogramState = GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP);
|
auto glprogramState = GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR);
|
||||||
for( int index = 0; index < _verticesToDraw/6; ++index)
|
int index = 0;
|
||||||
|
for(const auto& quadNumberIter : _quadsNumber)
|
||||||
{
|
{
|
||||||
float z = _quads[index].bl.vertices.z;
|
int z = quadNumberIter.first;
|
||||||
_renderCommands[index].init(z, _texture->getName(), glprogramState, BlendFunc::ALPHA_PREMULTIPLIED, &_quads[index], 1, transform);
|
auto& quadCommand = _renderCommands2[quadNumberIter.first];
|
||||||
renderer->addCommand(&_renderCommands[index]);
|
quadCommand.init(z, _texture->getName(), glprogramState, BlendFunc::ALPHA_PREMULTIPLIED, &_quads[index], quadNumberIter.second, transform);
|
||||||
|
index += quadNumberIter.second;
|
||||||
|
renderer->addCommand(&quadCommand);
|
||||||
}
|
}
|
||||||
|
// for( int index = 0; index < _verticesToDraw/6; ++index)
|
||||||
|
// {
|
||||||
|
// float z = _quads[index].bl.vertices.z;
|
||||||
|
// _renderCommands[index].init(z, _texture->getName(), glprogramState, BlendFunc::ALPHA_PREMULTIPLIED, &_quads[index], 1, transform);
|
||||||
|
// renderer->addCommand(&_renderCommands[index]);
|
||||||
|
// }
|
||||||
|
|
||||||
// _customCommand.init(_globalZOrder);
|
// _customCommand.init(_globalZOrder);
|
||||||
// _customCommand.func = CC_CALLBACK_0(FastTMXLayer::onDraw, this, transform, flags);
|
// _customCommand.func = CC_CALLBACK_0(FastTMXLayer::onDraw, this, transform, flags);
|
||||||
|
@ -218,6 +232,9 @@ int FastTMXLayer::updateTiles(const Rect& culledRect, Renderer* renderer)
|
||||||
_indices.resize(quadsNeed * 6);
|
_indices.resize(quadsNeed * 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//clear quadsNumber
|
||||||
|
_quadsNumber.clear();
|
||||||
|
|
||||||
Size texSize = _tileSet->_imageSize;
|
Size texSize = _tileSet->_imageSize;
|
||||||
for (int y = visibleTiles.origin.y - tilesOverY; y < visibleTiles.origin.y + visibleTiles.size.height + tilesOverY; ++y)
|
for (int y = visibleTiles.origin.y - tilesOverY; y < visibleTiles.origin.y + visibleTiles.size.height + tilesOverY; ++y)
|
||||||
{
|
{
|
||||||
|
@ -242,7 +259,18 @@ int FastTMXLayer::updateTiles(const Rect& culledRect, Renderer* renderer)
|
||||||
float left, right, top, bottom, z;
|
float left, right, top, bottom, z;
|
||||||
|
|
||||||
z = getVertexZForPos(Vec2(x, y));
|
z = getVertexZForPos(Vec2(x, y));
|
||||||
|
|
||||||
|
//add quadsNumber
|
||||||
|
auto quadsNumberIter = _quadsNumber.find(z);
|
||||||
|
if(quadsNumberIter == _quadsNumber.end())
|
||||||
|
{
|
||||||
|
_quadsNumber.insert(std::make_pair(z, 1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
quadsNumberIter->second += 1;
|
||||||
|
}
|
||||||
|
|
||||||
// vertices
|
// vertices
|
||||||
if (tileGID & kTMXTileDiagonalFlag)
|
if (tileGID & kTMXTileDiagonalFlag)
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,6 +34,7 @@ THE SOFTWARE.
|
||||||
#include "renderer/CCQuadCommand.h"
|
#include "renderer/CCQuadCommand.h"
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
|
@ -245,6 +246,9 @@ protected:
|
||||||
/** quads to be rendered */
|
/** quads to be rendered */
|
||||||
std::vector<V3F_C4B_T2F_Quad> _quads;
|
std::vector<V3F_C4B_T2F_Quad> _quads;
|
||||||
std::vector<QuadCommand> _renderCommands;
|
std::vector<QuadCommand> _renderCommands;
|
||||||
|
|
||||||
|
std::map<int/*zorder*/, ssize_t/*number*/> _quadsNumber;
|
||||||
|
std::unordered_map<int/*zorder*/, NopreMultiplyMVQuadCommand> _renderCommands2;
|
||||||
/** indices */
|
/** indices */
|
||||||
std::vector<GLushort> _indices;
|
std::vector<GLushort> _indices;
|
||||||
bool _dirty;
|
bool _dirty;
|
||||||
|
|
|
@ -1066,7 +1066,7 @@ void Director::showStats()
|
||||||
{
|
{
|
||||||
char buffer[30];
|
char buffer[30];
|
||||||
|
|
||||||
if (_accumDt > CC_DIRECTOR_STATS_INTERVAL)
|
if (_accumDt > CC_DIRECTOR_STATS_INTERVAL * 20)
|
||||||
{
|
{
|
||||||
_frameRate = _frames / _accumDt;
|
_frameRate = _frames / _accumDt;
|
||||||
_frames = 0;
|
_frames = 0;
|
||||||
|
|
|
@ -40,6 +40,7 @@ QuadCommand::QuadCommand()
|
||||||
,_blendType(BlendFunc::DISABLE)
|
,_blendType(BlendFunc::DISABLE)
|
||||||
,_quads(nullptr)
|
,_quads(nullptr)
|
||||||
,_quadsCount(0)
|
,_quadsCount(0)
|
||||||
|
,_preMultiplyMV(true)
|
||||||
{
|
{
|
||||||
_type = RenderCommand::Type::QUAD_COMMAND;
|
_type = RenderCommand::Type::QUAD_COMMAND;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ public:
|
||||||
static const int MATERIAL_ID_DO_NOT_BATCH = 0;
|
static const int MATERIAL_ID_DO_NOT_BATCH = 0;
|
||||||
|
|
||||||
QuadCommand();
|
QuadCommand();
|
||||||
~QuadCommand();
|
virtual ~QuadCommand();
|
||||||
|
|
||||||
/** Initializes the command with a globalZOrder, a texture ID, a `GLProgram`, a blending function, a pointer to quads,
|
/** Initializes the command with a globalZOrder, a texture ID, a `GLProgram`, a blending function, a pointer to quads,
|
||||||
* quantity of quads, and the Model View transform to be used for the quads */
|
* quantity of quads, and the Model View transform to be used for the quads */
|
||||||
|
@ -55,10 +55,10 @@ public:
|
||||||
inline GLProgramState* getGLProgramState() const { return _glProgramState; }
|
inline GLProgramState* getGLProgramState() const { return _glProgramState; }
|
||||||
inline BlendFunc getBlendType() const { return _blendType; }
|
inline BlendFunc getBlendType() const { return _blendType; }
|
||||||
inline const Mat4& getModelView() const { return _mv; }
|
inline const Mat4& getModelView() const { return _mv; }
|
||||||
|
inline bool getPremultiplyMV() const { return _preMultiplyMV; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void generateMaterialID();
|
virtual void generateMaterialID();
|
||||||
|
|
||||||
uint32_t _materialID;
|
uint32_t _materialID;
|
||||||
GLuint _textureID;
|
GLuint _textureID;
|
||||||
|
@ -67,7 +67,29 @@ protected:
|
||||||
V3F_C4B_T2F_Quad* _quads;
|
V3F_C4B_T2F_Quad* _quads;
|
||||||
ssize_t _quadsCount;
|
ssize_t _quadsCount;
|
||||||
Mat4 _mv;
|
Mat4 _mv;
|
||||||
|
bool _preMultiplyMV;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class NopreMultiplyMVQuadCommand : public QuadCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NopreMultiplyMVQuadCommand()
|
||||||
|
:QuadCommand()
|
||||||
|
{
|
||||||
|
_preMultiplyMV = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~NopreMultiplyMVQuadCommand()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void generateMaterialID()
|
||||||
|
{
|
||||||
|
_materialID = QuadCommand::MATERIAL_ID_DO_NOT_BATCH;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
NS_CC_END
|
NS_CC_END
|
||||||
|
|
||||||
#endif //_CC_QUADCOMMAND_H_
|
#endif //_CC_QUADCOMMAND_H_
|
||||||
|
|
|
@ -296,7 +296,13 @@ void Renderer::visitRenderQueue(const RenderQueue& queue)
|
||||||
_batchedQuadCommands.push_back(cmd);
|
_batchedQuadCommands.push_back(cmd);
|
||||||
|
|
||||||
memcpy(_quads + _numQuads, cmd->getQuads(), sizeof(V3F_C4B_T2F_Quad) * cmd->getQuadCount());
|
memcpy(_quads + _numQuads, cmd->getQuads(), sizeof(V3F_C4B_T2F_Quad) * cmd->getQuadCount());
|
||||||
convertToWorldCoordinates(_quads + _numQuads, cmd->getQuadCount(), cmd->getModelView());
|
|
||||||
|
//only multiply mv when getPremultiplyMV is true
|
||||||
|
if(cmd->getPremultiplyMV())
|
||||||
|
{
|
||||||
|
convertToWorldCoordinates(_quads + _numQuads, cmd->getQuadCount(), cmd->getModelView());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
_numQuads += cmd->getQuadCount();
|
_numQuads += cmd->getQuadCount();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue