mirror of https://github.com/axmolengine/axmol.git
Add CustomCommand
This commit is contained in:
parent
be71eb8626
commit
fa9d8fe077
|
@ -1 +1 @@
|
||||||
483a248a4f35f5351b3ffaecb0911023bed1812b
|
63359196a3b9f69ce5b8c2374708597ae31643e2
|
|
@ -0,0 +1,44 @@
|
||||||
|
//
|
||||||
|
// Created by NiTe Luo on 11/8/13.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include "CustomCommand.h"
|
||||||
|
|
||||||
|
NS_CC_BEGIN
|
||||||
|
|
||||||
|
CustomCommand::CustomCommand(int viewport, int32_t depth)
|
||||||
|
:RenderCommand()
|
||||||
|
, _viewport(viewport)
|
||||||
|
, _depth(depth)
|
||||||
|
, func(nullptr)
|
||||||
|
{
|
||||||
|
_type = CUSTOM_COMMAND;
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomCommand::~CustomCommand()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t CustomCommand::generateID()
|
||||||
|
{
|
||||||
|
_id = 0;
|
||||||
|
|
||||||
|
_id = (int64_t)_viewport << 61
|
||||||
|
| (int64_t)1 << 60 // translucent
|
||||||
|
| (int64_t)0 << 59 // is command
|
||||||
|
| (int64_t)_depth << 35;
|
||||||
|
|
||||||
|
return _id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CustomCommand::execute()
|
||||||
|
{
|
||||||
|
if(func)
|
||||||
|
{
|
||||||
|
func();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_CC_END
|
|
@ -0,0 +1,47 @@
|
||||||
|
//
|
||||||
|
// Created by NiTe Luo on 11/8/13.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _CC_CUSTOMCOMMAND_H_
|
||||||
|
#define _CC_CUSTOMCOMMAND_H_
|
||||||
|
|
||||||
|
#include "RenderCommand.h"
|
||||||
|
|
||||||
|
NS_CC_BEGIN
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class CustomCommand : public RenderCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CustomCommand(int viewport, int32_t depth);
|
||||||
|
~CustomCommand();
|
||||||
|
|
||||||
|
// +----------+----------+-----+-----------------------------------+
|
||||||
|
// | | | | | |
|
||||||
|
// | ViewPort | Transluc | Cmd | Depth | |
|
||||||
|
// | 3 bits | 1 bit | 1 | 24 bits | |
|
||||||
|
// +----------+----------+-----+----------------+------------------+
|
||||||
|
virtual int64_t generateID();
|
||||||
|
|
||||||
|
void execute();
|
||||||
|
|
||||||
|
inline bool isTranslucent() { return true; }
|
||||||
|
|
||||||
|
//TODO support non-graphical command
|
||||||
|
inline bool isCommand() { return false; }
|
||||||
|
|
||||||
|
public:
|
||||||
|
function<void()> func;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int _viewport;
|
||||||
|
|
||||||
|
int32_t _depth;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
NS_CC_END
|
||||||
|
|
||||||
|
#endif //_CC_CUSTOMCOMMAND_H_
|
|
@ -17,7 +17,7 @@ NS_CC_BEGIN
|
||||||
enum RenderCommandType
|
enum RenderCommandType
|
||||||
{
|
{
|
||||||
QUAD_COMMAND,
|
QUAD_COMMAND,
|
||||||
CUSTOMIZE_COMMAND,
|
CUSTOM_COMMAND,
|
||||||
GROUP_COMMAND,
|
GROUP_COMMAND,
|
||||||
UNKNOWN_COMMAND,
|
UNKNOWN_COMMAND,
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
#include "Renderer.h"
|
#include "Renderer.h"
|
||||||
#include "CCShaderCache.h"
|
#include "CCShaderCache.h"
|
||||||
#include "ccGLStateCache.h"
|
#include "ccGLStateCache.h"
|
||||||
|
#include "CustomCommand.h"
|
||||||
|
|
||||||
|
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -144,11 +146,12 @@ void Renderer::render()
|
||||||
if(_lastMaterialID != cmd->getMaterialID() || _numQuads == VBO_SIZE)
|
if(_lastMaterialID != cmd->getMaterialID() || _numQuads == VBO_SIZE)
|
||||||
{
|
{
|
||||||
//Draw batched data
|
//Draw batched data
|
||||||
if(_numQuads > 0)
|
drawQuads();
|
||||||
{
|
}
|
||||||
drawQuads();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
//Reset material if needed.
|
||||||
|
if(_lastMaterialID != cmd->getMaterialID())
|
||||||
|
{
|
||||||
//Set new material
|
//Set new material
|
||||||
_lastMaterialID = cmd->getMaterialID();
|
_lastMaterialID = cmd->getMaterialID();
|
||||||
|
|
||||||
|
@ -161,10 +164,19 @@ void Renderer::render()
|
||||||
GL::bindTexture2D(cmd->getTextureID());
|
GL::bindTexture2D(cmd->getTextureID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
batchQuads(cmd);
|
batchQuads(cmd);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case CUSTOM_COMMAND:
|
||||||
|
{
|
||||||
|
flush();
|
||||||
|
CustomCommand* cmd = (CustomCommand*)command;
|
||||||
|
cmd->execute();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -179,6 +191,9 @@ void Renderer::render()
|
||||||
|
|
||||||
void Renderer::drawQuads()
|
void Renderer::drawQuads()
|
||||||
{
|
{
|
||||||
|
if(_numQuads <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
//Set VBO data
|
//Set VBO data
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]);
|
glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]);
|
||||||
|
|
||||||
|
@ -207,4 +222,10 @@ void Renderer::batchQuads(QuadCommand* cmd)
|
||||||
_quads[_numQuads - 1] = *cmd->getQuad();
|
_quads[_numQuads - 1] = *cmd->getQuad();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Renderer::flush()
|
||||||
|
{
|
||||||
|
drawQuads();
|
||||||
|
_lastMaterialID = 0;
|
||||||
|
}
|
||||||
|
|
||||||
NS_CC_END
|
NS_CC_END
|
|
@ -12,6 +12,7 @@
|
||||||
#include "RenderCommand.h"
|
#include "RenderCommand.h"
|
||||||
#include "CCGLProgram.h"
|
#include "CCGLProgram.h"
|
||||||
#include "QuadCommand.h"
|
#include "QuadCommand.h"
|
||||||
|
#include "CCGL.h"
|
||||||
|
|
||||||
#define VBO_SIZE 64
|
#define VBO_SIZE 64
|
||||||
|
|
||||||
|
@ -39,11 +40,13 @@ protected:
|
||||||
void batchQuads(QuadCommand* cmd);
|
void batchQuads(QuadCommand* cmd);
|
||||||
void drawQuads();
|
void drawQuads();
|
||||||
|
|
||||||
|
//Draw the previews queued quads and flush previous context
|
||||||
|
void flush();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
vector<RenderCommand*> _renderQueue;
|
vector<RenderCommand*> _renderQueue;
|
||||||
int _lastMaterialID;
|
int _lastMaterialID;
|
||||||
|
|
||||||
|
|
||||||
V3F_C4B_T2F_Quad*_quads;
|
V3F_C4B_T2F_Quad*_quads;
|
||||||
GLushort* _indices;
|
GLushort* _indices;
|
||||||
GLuint _VAOname;
|
GLuint _VAOname;
|
||||||
|
|
Loading…
Reference in New Issue