Director
主要函数预览
//openGL Matrix Operate
void pushMatrix(MATRIX_STACK_TYPE type);
void popMatrix(MATRIX_STACK_TYPE type);
void loadIdentityMatrix(MATRIX_STACK_TYPE type);
void loadMatrix(MATRIX_STACK_TYPE type, const Mat4& mat);
void multiplyMatrix(MATRIX_STACK_TYPE type, const Mat4& mat);
Mat4 getMatrix(MATRIX_STACK_TYPE type);
void resetMatrixStack();
//View Data
inline double getAnimationInterval();
inline bool isDisplayStats();
inline GLView* getOpenGLView();
inline Projection getProjection();
Size getVisibleSize() const;
Vec2 getVisibleOrigin() const;
Vec2 convertToGL(const Vec2& point);
Vec2 convertToUI(const Vec2& point);
float getZEye() const;
// Scene 场景管理
inline Scene* getRunningScene();
void runWithScene(Scene *scene);
void pushScene(Scene *scene);
// 控制绘制的暂停和恢复
void end();
void pause();
void resume();
//绘制图形(界面展示最重要的函数)
void drawScene();
//Getter and Setter
Scheduler* getScheduler() const { return _scheduler; }
void setScheduler(Scheduler* scheduler);
ActionManager* getActionManager() const { return _actionManager; }
void setActionManager(ActionManager* actionManager);
EventDispatcher* getEventDispatcher() const { return _eventDispatcher; }
void setEventDispatcher(EventDispatcher* dispatcher);
Renderer* getRenderer() const { return _renderer; }
drawScene
void Director::drawScene()
{
calculateDeltaTime();
if (_openGLView)
{
_openGLView->pollEvents();
}
if (! _paused)
{
//Dispatcher 抛发事件.
_eventDispatcher->dispatchEvent(_eventBeforeUpdate);
//Scheduler 定时器 更新
_scheduler->update(_deltaTime);
_eventDispatcher->dispatchEvent(_eventAfterUpdate);
}
//glClear
_renderer->clear();
experimental::FrameBuffer::clearAllFBOs();
if (_nextScene)
{//取得下一个将要显示的Scene.
setNextScene();
}
//将上一次绘制的Context放到堆栈
pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
if (_runningScene)
{
#if (CC_USE_PHYSICS || (CC_USE_3D_PHYSICS && CC_ENABLE_BULLET_INTEGRATION) || CC_USE_NAVMESH)
_runningScene->stepPhysicsAndNavigation(_deltaTime);
#endif
//clear draw stats
_renderer->clearDrawStats();
//渲染场景
_openGLView->renderScene(_runningScene, _renderer);
_eventDispatcher->dispatchEvent(_eventAfterVisit);
}
// draw the notifications node
if (_notificationNode)
{
_notificationNode->visit(_renderer, Mat4::IDENTITY, 0);
}
updateFrameRate();
if (_displayStats)
{
showStats();
}
//渲染
_renderer->render();
_eventDispatcher->dispatchEvent(_eventAfterDraw);
//返回到上一次绘制时的状态. popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
_totalFrames++;
//把上面渲染的结果显示到屏幕
if (_openGLView)
{
_openGLView->swapBuffers();
}
if (_displayStats)
{
calculateMPF();
}
}
_openGLView->renderScene(_runningScene, _renderer);
里面是scene->render(renderer, Mat4::IDENTITY, nullptr);
后面就开始看看 scene 的render方法