5 cocos2dx 3.0源码分析 渲染 render

Size visibleSize = Director::getInstance()->getVisibleSize();
Sprite *sp = Sprite::create("HelloWorld.png");
sp->setPosition(Point(visibleSize.width * ., visibleSize.height * .));
this->addChild(sp, );
void Sprite::setTextureRect(const Rect& rect, bool rotated, const Size& untrimmedSize)
1. _quad
V3F_C4B_T2F_Quad _quad;
//! 4 Vertex3FTex2FColor4B
struct CC_DLL V3F_C4B_T2F_Quad
{
//! top left
V3F_C4B_T2F tl;
//! bottom left
V3F_C4B_T2F bl;
//! top right
V3F_C4B_T2F tr;
//! bottom right
V3F_C4B_T2F br;
}; //! a Vec2 with a vertex point, a tex coord point and a color 4B
struct CC_DLL V3F_C4B_T2F
{
//! vertices (3F)
Vec3 vertices; // 12 bytes //! colors (4B)
Color4B colors; // 4 bytes // tex coords (2F)
Tex2F texCoords; // 8 bytes
};
_quad.bl.texCoords.u = left;
_quad.bl.texCoords.v = bottom;
_quad.br.texCoords.u = right;
_quad.br.texCoords.v = bottom;
_quad.tl.texCoords.u = left;
_quad.tl.texCoords.v = top;
_quad.tr.texCoords.u = right;
_quad.tr.texCoords.v = top;
// Atlas: Vertex
float x1 = + _offsetPosition.x;
float y1 = + _offsetPosition.y;
float x2 = x1 + _rect.size.width;
float y2 = y1 + _rect.size.height; // Don't update Z.
_quad.bl.vertices = Vec3(x1, y1, );
_quad.br.vertices = Vec3(x2, y1, );
_quad.tl.vertices = Vec3(x1, y2, );
_quad.tr.vertices = Vec3(x2, y2, );
void Sprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
{
// Don't do calculate the culling if the transform was not updated
_insideBounds = (flags & FLAGS_TRANSFORM_DIRTY) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds; if(_insideBounds)
{
_quadCommand.init(_globalZOrder, _texture->getName(), getGLProgramState(), _blendFunc, &_quad, , transform);
renderer->addCommand(&_quadCommand);
}

TRIANGLES_COMMAND
QUAD_COMMAND
GROUP_COMMAND
CUSTOM_COMMAND
BATCH_COMMAND
PRIMITIVE_COMMAND
MESH_COMMAND
else if ( RenderCommand::Type::QUAD_COMMAND == commandType )
{
flush3D();
if(_filledIndex > )
{
drawBatchedTriangles();
_lastMaterialID = ;
}
auto cmd = static_cast<QuadCommand*>(command);
//Batch quads
if( (_numberQuads + cmd->getQuadCount()) * > VBO_SIZE )
{
CCASSERT(cmd->getQuadCount()>= && cmd->getQuadCount() * < VBO_SIZE, "VBO for vertex is not big enough, please break the data down or use customized render command");
//Draw batched quads if VBO is full
drawBatchedQuads();
} _batchQuadCommands.push_back(cmd); fillQuads(cmd);
}
void Renderer::fillQuads(const QuadCommand *cmd)
{
memcpy(_quadVerts + _numberQuads * , cmd->getQuads(), sizeof(V3F_C4B_T2F_Quad) * cmd->getQuadCount()); const Mat4& modelView = cmd->getModelView(); for(ssize_t i=; i< cmd->getQuadCount() * ; ++i)
{
V3F_C4B_T2F *q = &_quadVerts[i + _numberQuads * ];
Vec3 *vec1 = (Vec3*)&q->vertices;
modelView.transformPoint(vec1);
} _numberQuads += cmd->getQuadCount();
}
memcpy(_quadVerts + _numberQuads * , cmd->getQuads(), sizeof(V3F_C4B_T2F_Quad) * cmd->getQuadCount());
for(ssize_t i=; i< cmd->getQuadCount() * ; ++i)
{
V3F_C4B_T2F *q = &_quadVerts[i + _numberQuads * ];
Vec3 *vec1 = (Vec3*)&q->vertices;
modelView.transformPoint(vec1);
}
_numberQuads += cmd->getQuadCount();
GL::bindVAO(_quadVAO);
//Set VBO data
glBindBuffer(GL_ARRAY_BUFFER, _quadbuffersVBO[]);
// option 3: orphaning + glMapBuffer
glBufferData(GL_ARRAY_BUFFER, sizeof(_quadVerts[]) * _numberQuads * , nullptr, GL_DYNAMIC_DRAW);
void *buf = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
memcpy(buf, _quadVerts, sizeof(_quadVerts[])* _numberQuads * );
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _quadbuffersVBO[]);
for(const auto& cmd : _batchQuadCommands)
glDrawElements(GL_TRIANGLES, (GLsizei) indexToDraw, GL_UNSIGNED_SHORT, (GLvoid*) (startIndex*sizeof(_indices[])) );
void Renderer::drawBatchedQuads()
{
//TODO: we can improve the draw performance by insert material switching command before hand. int indexToDraw = ;
int startIndex = ; //Upload buffer to VBO
if(_numberQuads <= || _batchQuadCommands.empty())
{
return;
} if (Configuration::getInstance()->supportsShareableVAO())
{
//Bind VAO
GL::bindVAO(_quadVAO);
//Set VBO data
glBindBuffer(GL_ARRAY_BUFFER, _quadbuffersVBO[]);
// option 3: orphaning + glMapBuffer
glBufferData(GL_ARRAY_BUFFER, sizeof(_quadVerts[]) * _numberQuads * , nullptr, GL_DYNAMIC_DRAW);
void *buf = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
memcpy(buf, _quadVerts, sizeof(_quadVerts[])* _numberQuads * );
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, );
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _quadbuffersVBO[]);
}
else
{
}
//Start drawing verties in batch
for(const auto& cmd : _batchQuadCommands)
{
auto newMaterialID = cmd->getMaterialID();
if(_lastMaterialID != newMaterialID || newMaterialID == MATERIAL_ID_DO_NOT_BATCH)
{
//Draw quads
if(indexToDraw > )
{
glDrawElements(GL_TRIANGLES, (GLsizei) indexToDraw, GL_UNSIGNED_SHORT, (GLvoid*) (startIndex*sizeof(_indices[])) );
_drawnBatches++;
_drawnVertices += indexToDraw;
startIndex += indexToDraw;
indexToDraw = ;
}
//Use new material
cmd->useMaterial();
_lastMaterialID = newMaterialID;
} indexToDraw += cmd->getQuadCount() * ;
} //Draw any remaining quad
if(indexToDraw > )
{
glDrawElements(GL_TRIANGLES, (GLsizei) indexToDraw, GL_UNSIGNED_SHORT, (GLvoid*) (startIndex*sizeof(_indices[])) );
_drawnBatches++;
_drawnVertices += indexToDraw;
} if (Configuration::getInstance()->supportsShareableVAO())
{
//Unbind VAO
GL::bindVAO();
}
else
{
glBindBuffer(GL_ARRAY_BUFFER, );
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, );
} _batchQuadCommands.clear();
_numberQuads = ;
}
5 cocos2dx 3.0源码分析 渲染 render的更多相关文章
- 3 cocos2dx 3.0 源码分析-mainLoop详细
简述: 我靠上面图是不是太大了, 有点看不清了. 总结一下过程: 之前说过的appController 之后经过了若干初始化, 最后调用了displayLinker 的定时调用, 这里调用了函数 ...
- 4 cocos2dx 3.0 源码分析- scheduler
scheduler 这个类, 负责了引擎的自定义更新, 及定时更新相关的操作, 看看下面的代码,很熟悉吧. schedule(schedule_selector(HelloWorld::updat ...
- 2 cocos2dx 3.0 源码分析-Director
Director 导演类, 这个类在整个引擎中担当着最重要的角色, 先看看它是如何初始化的,它共管理了哪些内容呢? 1初始化- 更新处理Scheduler Scheduler 这个类负责用户 ...
- Yii2.0源码分析之——控制器文件分析(Controller.php)创建动作、执行动作
在Yii中,当请求一个Url的时候,首先在application中获取request信息,然后由request通过urlManager解析出route,再在Module中根据route来创建contr ...
- AFNetWorking3.0源码分析
分析: AFNetWorking(3.0)源码分析(一)——基本框架 AFNetworking源码解析 AFNetworking2.0源码解析<一> end
- Solr5.0源码分析-SolrDispatchFilter
年初,公司开发法律行业的搜索引擎.当时,我作为整个系统的核心成员,选择solr,并在solr根据我们的要求做了相应的二次开发.但是,对solr的还没有进行认真仔细的研究.最近,事情比较清闲,翻翻sol ...
- Solr4.8.0源码分析(25)之SolrCloud的Split流程
Solr4.8.0源码分析(25)之SolrCloud的Split流程(一) 题记:昨天有位网友问我SolrCloud的split的机制是如何的,这个还真不知道,所以今天抽空去看了Split的原理,大 ...
- Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五)
Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五) 题记:关于SolrCloud的Recovery策略已经写了四篇了,这篇应该是系统介绍Recovery策略的最后一篇了 ...
- Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四)
Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四) 题记:本来计划的SolrCloud的Recovery策略的文章是3篇的,但是没想到Recovery的内容蛮多的,前面 ...
随机推荐
- git上了github又要上码云。
<h1>关联远程仓库:github为例</h1> 1.首先在用户目录下找到.ssh 2.如果.ssh文件夹里没有id_rsa和id_rsa.pub文件,或者也没有.ssh文件夹 ...
- logstash通过redis收集日志
(1)部署redis 1丶安装redis yum install epel-release -y yum install redis -y 2丶修改配置文件 #vim /etc/redis.conf ...
- 通过 JS 实现错误页面在指定的时间跳到主页
通过 JS 实现错误页面在指定的时间跳到主页 <!DOCTYPE html> <html> <head> <title>浏览器对象</title& ...
- windows下重置mysql的root密码方法介绍(转)
自己在内网操作的,遇到了一些的问题,其中一个是需要重置密码的,所以网上找了两篇文章,都有一些借鉴的地方. 版本mysql5.7.2,linux系统 除了参考文章还有几点说明: service mysq ...
- maven spring整合mybatis是使用junit测试报字节序列的错误
转载 http://blog.csdn.net/hjun01/article/details/40858753 错误信息 com.sun.org.apache.xerces.internal.impl ...
- Bzoj2510 弱题(矩阵快速幂)
题面(权限题) 题解 一道概率\(dp\),可以设\(f[i][j]\)表示第\(i\)次操作后,标号为\(j\)的小球的期望个数,那么有: \[ \begin{aligned} &f[i][ ...
- Oracle意外赢官司,程序员或过苦日子
关于“Google在Android平台使用Java侵犯知识产权”一案,2014年5月,联邦法院判定Oracle获胜,这个结果完全出人意料,因为这样一来无异于打开了软件开发领域中API使用方式的潘多拉之 ...
- java8新特性——Lambda表达式
上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习.本文就从java8新特性中比较重要的Lambda表达式开 ...
- [BZOJ2402]陶陶的难题II(树链剖分+线段树维护凸包+分数规划)
陶陶的难题II 时间限制:40s 空间限制:128MB 题目描述 输入格式 第一行包含一个正整数N,表示树中结点的个数. 第二行包含N个正实数,第i个数表示xi (1<=xi<= ...
- [Codeforces 1060F] Shrinking Tree
Link: 传送门 Solution: 原来CF的官方题解也能鸽啊…… 详细题解 该题思路: 1.对于每个点删边方案数为$fac[n-1]$,总贡献为每种方案下满足的概率的和,接下来直接求贡献 2.每 ...