节点渲染顺序
void Engine::stepFrame()中处理update与render,先看render。
render要做的就是从scene的rootNode开始渲染。
我们约定parentNode zorder为0,childeNode 越小越先渲染。childeNode zorder为负时,比parentNode还要先渲染。
对于每个childeNode,也是这样的顺序,这里是一个递归调用。
render()
{
NegativeChildRender();
renderNow();
positiveChildRender();
}
render要做的就是从scene的rootNode开始渲染。
我们约定parentNode zorder为0,childeNode 越小越先渲染。childeNode zorder为负时,比parentNode还要先渲染。
对于每个childeNode,也是这样的顺序,这里是一个递归调用。
render()
{
NegativeChildRender();
renderNow();
positiveChildRender();
}
具体代码:
void Engine::stepFrame()
{
if (_updateDesignSize)
{
Renderer::getInstance()->resetProjection();
_updateDesignSize = false;
}
//update
drawScene();
Renderer::getInstance()->renderQuad();
}
void Engine::drawScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if(_SceneManager.size() > 0)
{
Scene * scene = _SceneManager.back();
scene->visit();
}
Renderer::getInstance()->visit();
}
void Scene::visit()
{
_root.visit();
}
void Node::visit()
{
int i = 0;
if(!_children.empty())
{
sortAllChildren();
// draw children zOrder < 0
for(i = 0 ; i < _children.size(); i++ )
{
auto node = _children.at(i);
if ( node && node->getZOrder() < 0 )
node->visit();
else
break;
}
// self draw
this->render();
for(auto it=_children.cbegin()+i; it != _children.cend(); ++it)
(*it)->visit();
}
else
{
this->render();
}
}
void Node::render()
{
}
void Node::sortAllChildren()
{
if( _reorderChildDirty ) {
std::sort( std::begin(_children), std::end(_children), nodeComparisonLess );
_reorderChildDirty = false;
}
}
void Sprite::initQuad()
{
_blendFunc = BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
memset(&_quad, 0, sizeof(_quad));
int x1 = -_textureSize.width * 0.5f ;
int x2 = _textureSize.width * 0.5f;
int y1 = -_textureSize.height* 0.5f ;
int y2 = _textureSize.height* 0.5f;
_quad.tl._position = Vec3(x1, y2, 0);
_quad.bl._position = Vec3(x1, y1, 0);
_quad.tr._position = Vec3(x2, y2, 0);
_quad.br._position = Vec3(x2, y1, 0);
_quad.tl._color = Color::WHITE;
_quad.bl._color = Color::WHITE;
_quad.tr._color = Color::WHITE;
_quad.br._color = Color::WHITE;
_quad.tl._texCoord = Vec2(0,1);
_quad.bl._texCoord = Vec2(0,0);
_quad.tr._texCoord = Vec2(1,1);
_quad.br._texCoord = Vec2(1,0);
}
void Sprite::render()
{
Size winSize = Engine::getInstance()->getDesignSize();
_quadCommand.init(&_quad,_textureID,1,_blendFunc,_model);
Renderer::getInstance()->addQuadCommand(&_quadCommand);
}