Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
235 changes: 116 additions & 119 deletions axmol/base/Director.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -293,105 +293,6 @@ void Director::setRenderDefaults()
_renderer->setDepthCompareFunc(rhi::CompareFunc::LESS_EQUAL);
}

// process 1 frame
void Director::processFrame()
{
const auto canRender = _renderer->beginFrame();

// calculate "global" dt
calculateDeltaTime();

if (_renderView)
_renderView->pollEvents();

// tick before glClear: issue #533
if (!_paused)
{
_eventDispatcher->dispatchEvent(_eventBeforeUpdate);
_scheduler->update(_deltaTime);
performFrameTasks(_nextUpdateTasks);
_eventDispatcher->dispatchEvent(_eventAfterUpdate);
}

if (canRender) [[likely]]
{
_renderer->clear(ClearFlag::ALL, _clearColor, 1, 0, -10000.0);

_eventDispatcher->dispatchEvent(_eventBeforeDraw);

/* to avoid flickr, nextScene MUST be here: after tick and before draw.
* FIXME: Which bug is this one. It seems that it can't be reproduced with v0.9
*/
if (_nextScene)
{
setNextScene();
}

if (_runningScene)
{
_runningScene->tick(_deltaTime);

// clear draw stats
_renderer->clearDrawStats();

// render the scene
_renderView->renderScene(_renderer, _runningScene);

_eventDispatcher->dispatchEvent(_eventAfterVisit);
}

// draw the notifications node
if (_notificationNode)
{
auto previousCamera = Camera::_visitingCamera;
auto* overlayCamera = getOverlayCamera();
if (overlayCamera)
{
Camera::_visitingCamera = overlayCamera;
overlayCamera->apply();
_notificationNode->visit(_renderer, Mat4::identity, 0);
}
Camera::_visitingCamera = previousCamera;
}

updateFrameRate();

if (_statsDisplay)
{
#if !AX_STRIP_FPS
showStats();
#endif
}

#ifdef AX_ENABLE_OPENXR
showVRModeIndicator();
#endif

_renderer->render();

_eventDispatcher->dispatchEvent(_eventAfterDraw);

_totalFrames++;

// swap buffers
if (_renderView)
{
_renderView->swapBuffers();
}

_renderer->endFrame();
}

if (_statsDisplay)
{
#if !AX_STRIP_FPS
calculateMPF();
#endif
}

_poolManager->getCurrentPool()->clear();
}

void Director::calculateDeltaTime()
{
// new delta time. Re-fixed issue #1277
Expand Down Expand Up @@ -651,7 +552,7 @@ void Director::runWithScene(Scene* scene)
AXASSERT(_runningScene == nullptr, "_runningScene should be null");

pushScene(scene);
startAnimation();
activate();
}

void Director::replaceScene(Scene* scene)
Expand Down Expand Up @@ -915,7 +816,7 @@ void Director::reset()
_scenesStack.popBack();
}

stopAnimation();
deactivate();

AX_SAFE_RELEASE_NULL(_FPSLabel);
AX_SAFE_RELEASE_NULL(_drawnBatchesLabel);
Expand Down Expand Up @@ -1001,7 +902,7 @@ void Director::restartDirector()
_poolManager->getCurrentPool()->clear();

// Restart animation
startAnimation();
activate();

// Real restart in script level
#if AX_ENABLE_SCRIPT_BINDING
Expand Down Expand Up @@ -1442,16 +1343,16 @@ void Director::setEventDispatcher(EventDispatcher* dispatcher)
}
}

void Director::startAnimation()
void Director::activate()
{
startAnimation(SetIntervalReason::BY_ENGINE);
activate(SetIntervalReason::BY_ENGINE);
}

void Director::startAnimation(SetIntervalReason reason)
void Director::activate(SetIntervalReason reason)
{
_lastUpdate = std::chrono::steady_clock::now();

_invalid = false;
_active = true;

_axmol_thread_id = std::this_thread::get_id();

Expand Down Expand Up @@ -1504,35 +1405,131 @@ void Director::performFrameTasks(FrameTaskQueue& frameTasks)
}
}

void Director::stepFrame()
void Director::renderFrame()
{
if (_cleanupDirectorInNextLoop)
if (_renderView)
_renderView->pollEvents();

if (_cleanupDirectorInNextLoop) [[unlikely]]
{
_cleanupDirectorInNextLoop = false;
cleanupDirector();
return;
}
else if (_restartDirectorInNextLoop)

if (_restartDirectorInNextLoop) [[unlikely]]
{
_restartDirectorInNextLoop = false;
restartDirector();
_renderView->pollEvents();
return;
}

if (!_active) [[unlikely]]
return;

const auto canRender = _renderer->beginFrame();

// calculate "global" dt
calculateDeltaTime();

// tick before glClear: issue #533
if (!_paused)
{
_eventDispatcher->dispatchEvent(_eventBeforeUpdate);
_scheduler->update(_deltaTime);
performFrameTasks(_nextUpdateTasks);
_eventDispatcher->dispatchEvent(_eventAfterUpdate);
}

if (canRender) [[likely]]
{
_renderer->clear(ClearFlag::ALL, _clearColor, 1, 0, -10000.0);

_eventDispatcher->dispatchEvent(_eventBeforeDraw);

/* to avoid flickr, nextScene MUST be here: after tick and before draw.
* FIXME: Which bug is this one. It seems that it can't be reproduced with v0.9
*/
if (_nextScene)
{
setNextScene();
}

if (_runningScene)
{
_runningScene->tick(_deltaTime);

// clear draw stats
_renderer->clearDrawStats();

// render the scene
_renderView->renderScene(_renderer, _runningScene);

_eventDispatcher->dispatchEvent(_eventAfterVisit);
}

// draw the notifications node
if (_notificationNode)
{
auto previousCamera = Camera::_visitingCamera;
auto* overlayCamera = getOverlayCamera();
if (overlayCamera)
{
Camera::_visitingCamera = overlayCamera;
overlayCamera->apply();
_notificationNode->visit(_renderer, Mat4::identity, 0);
}
Camera::_visitingCamera = previousCamera;
}

updateFrameRate();

if (_statsDisplay)
{
#if !AX_STRIP_FPS
showStats();
#endif
}

#ifdef AX_ENABLE_OPENXR
showVRModeIndicator();
#endif

_renderer->render();

_eventDispatcher->dispatchEvent(_eventAfterDraw);

_totalFrames++;

// swap buffers
if (_renderView)
{
_renderView->swapBuffers();
}

_renderer->endFrame();
}
else if (!_invalid)

if (_statsDisplay)
{
processFrame();
#if !AX_STRIP_FPS
calculateMPF();
#endif
}

_poolManager->getCurrentPool()->clear();
}

void Director::stepFrame(float dt)
void Director::renderFrame(float dt)
{
_deltaTime = dt;
_deltaTimePassedByCaller = true;
stepFrame();
renderFrame();
}

void Director::stopAnimation()
void Director::deactivate()
{
_invalid = true;
_active = false;
}

void Director::setAnimationInterval(float interval)
Expand All @@ -1543,10 +1540,10 @@ void Director::setAnimationInterval(float interval)
void Director::setAnimationInterval(float interval, SetIntervalReason reason)
{
_animationInterval = interval;
if (!_invalid)
if (_active)
{
stopAnimation();
startAnimation(reason);
deactivate();
activate(reason);
}
}

Expand Down
Loading