@@ -293,105 +293,6 @@ void Director::setRenderDefaults()
293293 _renderer->setDepthCompareFunc (rhi::CompareFunc::LESS_EQUAL );
294294}
295295
296- // process 1 frame
297- void Director::processFrame ()
298- {
299- const auto canRender = _renderer->beginFrame ();
300-
301- // calculate "global" dt
302- calculateDeltaTime ();
303-
304- if (_renderView)
305- _renderView->pollEvents ();
306-
307- // tick before glClear: issue #533
308- if (!_paused)
309- {
310- _eventDispatcher->dispatchEvent (_eventBeforeUpdate);
311- _scheduler->update (_deltaTime);
312- performFrameTasks (_nextUpdateTasks);
313- _eventDispatcher->dispatchEvent (_eventAfterUpdate);
314- }
315-
316- if (canRender) [[likely]]
317- {
318- _renderer->clear (ClearFlag::ALL , _clearColor, 1 , 0 , -10000.0 );
319-
320- _eventDispatcher->dispatchEvent (_eventBeforeDraw);
321-
322- /* to avoid flickr, nextScene MUST be here: after tick and before draw.
323- * FIXME: Which bug is this one. It seems that it can't be reproduced with v0.9
324- */
325- if (_nextScene)
326- {
327- setNextScene ();
328- }
329-
330- if (_runningScene)
331- {
332- _runningScene->tick (_deltaTime);
333-
334- // clear draw stats
335- _renderer->clearDrawStats ();
336-
337- // render the scene
338- _renderView->renderScene (_renderer, _runningScene);
339-
340- _eventDispatcher->dispatchEvent (_eventAfterVisit);
341- }
342-
343- // draw the notifications node
344- if (_notificationNode)
345- {
346- auto previousCamera = Camera::_visitingCamera;
347- auto * overlayCamera = getOverlayCamera ();
348- if (overlayCamera)
349- {
350- Camera::_visitingCamera = overlayCamera;
351- overlayCamera->apply ();
352- _notificationNode->visit (_renderer, Mat4::identity, 0 );
353- }
354- Camera::_visitingCamera = previousCamera;
355- }
356-
357- updateFrameRate ();
358-
359- if (_statsDisplay)
360- {
361- #if !AX_STRIP_FPS
362- showStats ();
363- #endif
364- }
365-
366- #ifdef AX_ENABLE_OPENXR
367- showVRModeIndicator ();
368- #endif
369-
370- _renderer->render ();
371-
372- _eventDispatcher->dispatchEvent (_eventAfterDraw);
373-
374- _totalFrames++;
375-
376- // swap buffers
377- if (_renderView)
378- {
379- _renderView->swapBuffers ();
380- }
381-
382- _renderer->endFrame ();
383- }
384-
385- if (_statsDisplay)
386- {
387- #if !AX_STRIP_FPS
388- calculateMPF ();
389- #endif
390- }
391-
392- _poolManager->getCurrentPool ()->clear ();
393- }
394-
395296void Director::calculateDeltaTime ()
396297{
397298 // new delta time. Re-fixed issue #1277
@@ -651,7 +552,7 @@ void Director::runWithScene(Scene* scene)
651552 AXASSERT (_runningScene == nullptr , " _runningScene should be null" );
652553
653554 pushScene (scene);
654- startAnimation ();
555+ activate ();
655556}
656557
657558void Director::replaceScene (Scene* scene)
@@ -915,7 +816,7 @@ void Director::reset()
915816 _scenesStack.popBack ();
916817 }
917818
918- stopAnimation ();
819+ deactivate ();
919820
920821 AX_SAFE_RELEASE_NULL (_FPSLabel);
921822 AX_SAFE_RELEASE_NULL (_drawnBatchesLabel);
@@ -1001,7 +902,7 @@ void Director::restartDirector()
1001902 _poolManager->getCurrentPool ()->clear ();
1002903
1003904 // Restart animation
1004- startAnimation ();
905+ activate ();
1005906
1006907 // Real restart in script level
1007908#if AX_ENABLE_SCRIPT_BINDING
@@ -1442,16 +1343,16 @@ void Director::setEventDispatcher(EventDispatcher* dispatcher)
14421343 }
14431344}
14441345
1445- void Director::startAnimation ()
1346+ void Director::activate ()
14461347{
1447- startAnimation (SetIntervalReason::BY_ENGINE );
1348+ activate (SetIntervalReason::BY_ENGINE );
14481349}
14491350
1450- void Director::startAnimation (SetIntervalReason reason)
1351+ void Director::activate (SetIntervalReason reason)
14511352{
14521353 _lastUpdate = std::chrono::steady_clock::now ();
14531354
1454- _invalid = false ;
1355+ _active = true ;
14551356
14561357 _axmol_thread_id = std::this_thread::get_id ();
14571358
@@ -1504,35 +1405,131 @@ void Director::performFrameTasks(FrameTaskQueue& frameTasks)
15041405 }
15051406}
15061407
1507- void Director::stepFrame ()
1408+ void Director::renderFrame ()
15081409{
1509- if (_cleanupDirectorInNextLoop)
1410+ if (_renderView)
1411+ _renderView->pollEvents ();
1412+
1413+ if (_cleanupDirectorInNextLoop) [[unlikely]]
15101414 {
15111415 _cleanupDirectorInNextLoop = false ;
15121416 cleanupDirector ();
1417+ return ;
15131418 }
1514- else if (_restartDirectorInNextLoop)
1419+
1420+ if (_restartDirectorInNextLoop) [[unlikely]]
15151421 {
15161422 _restartDirectorInNextLoop = false ;
15171423 restartDirector ();
1518- _renderView->pollEvents ();
1424+ return ;
1425+ }
1426+
1427+ if (!_active) [[unlikely]]
1428+ return ;
1429+
1430+ const auto canRender = _renderer->beginFrame ();
1431+
1432+ // calculate "global" dt
1433+ calculateDeltaTime ();
1434+
1435+ // tick before glClear: issue #533
1436+ if (!_paused)
1437+ {
1438+ _eventDispatcher->dispatchEvent (_eventBeforeUpdate);
1439+ _scheduler->update (_deltaTime);
1440+ performFrameTasks (_nextUpdateTasks);
1441+ _eventDispatcher->dispatchEvent (_eventAfterUpdate);
1442+ }
1443+
1444+ if (canRender) [[likely]]
1445+ {
1446+ _renderer->clear (ClearFlag::ALL , _clearColor, 1 , 0 , -10000.0 );
1447+
1448+ _eventDispatcher->dispatchEvent (_eventBeforeDraw);
1449+
1450+ /* to avoid flickr, nextScene MUST be here: after tick and before draw.
1451+ * FIXME: Which bug is this one. It seems that it can't be reproduced with v0.9
1452+ */
1453+ if (_nextScene)
1454+ {
1455+ setNextScene ();
1456+ }
1457+
1458+ if (_runningScene)
1459+ {
1460+ _runningScene->tick (_deltaTime);
1461+
1462+ // clear draw stats
1463+ _renderer->clearDrawStats ();
1464+
1465+ // render the scene
1466+ _renderView->renderScene (_renderer, _runningScene);
1467+
1468+ _eventDispatcher->dispatchEvent (_eventAfterVisit);
1469+ }
1470+
1471+ // draw the notifications node
1472+ if (_notificationNode)
1473+ {
1474+ auto previousCamera = Camera::_visitingCamera;
1475+ auto * overlayCamera = getOverlayCamera ();
1476+ if (overlayCamera)
1477+ {
1478+ Camera::_visitingCamera = overlayCamera;
1479+ overlayCamera->apply ();
1480+ _notificationNode->visit (_renderer, Mat4::identity, 0 );
1481+ }
1482+ Camera::_visitingCamera = previousCamera;
1483+ }
1484+
1485+ updateFrameRate ();
1486+
1487+ if (_statsDisplay)
1488+ {
1489+ #if !AX_STRIP_FPS
1490+ showStats ();
1491+ #endif
1492+ }
1493+
1494+ #ifdef AX_ENABLE_OPENXR
1495+ showVRModeIndicator ();
1496+ #endif
1497+
1498+ _renderer->render ();
1499+
1500+ _eventDispatcher->dispatchEvent (_eventAfterDraw);
1501+
1502+ _totalFrames++;
1503+
1504+ // swap buffers
1505+ if (_renderView)
1506+ {
1507+ _renderView->swapBuffers ();
1508+ }
1509+
1510+ _renderer->endFrame ();
15191511 }
1520- else if (!_invalid)
1512+
1513+ if (_statsDisplay)
15211514 {
1522- processFrame ();
1515+ #if !AX_STRIP_FPS
1516+ calculateMPF ();
1517+ #endif
15231518 }
1519+
1520+ _poolManager->getCurrentPool ()->clear ();
15241521}
15251522
1526- void Director::stepFrame (float dt)
1523+ void Director::renderFrame (float dt)
15271524{
15281525 _deltaTime = dt;
15291526 _deltaTimePassedByCaller = true ;
1530- stepFrame ();
1527+ renderFrame ();
15311528}
15321529
1533- void Director::stopAnimation ()
1530+ void Director::deactivate ()
15341531{
1535- _invalid = true ;
1532+ _active = false ;
15361533}
15371534
15381535void Director::setAnimationInterval (float interval)
@@ -1543,10 +1540,10 @@ void Director::setAnimationInterval(float interval)
15431540void Director::setAnimationInterval (float interval, SetIntervalReason reason)
15441541{
15451542 _animationInterval = interval;
1546- if (!_invalid )
1543+ if (_active )
15471544 {
1548- stopAnimation ();
1549- startAnimation (reason);
1545+ deactivate ();
1546+ activate (reason);
15501547 }
15511548}
15521549
0 commit comments