wait until a frame is rendered, when using the COV_ENABLE_SINGLE_STEP_RENDERING command (Windows and Linux only)

This commit is contained in:
erwincoumans
2018-09-15 14:22:31 -07:00
parent 81f6a63490
commit 0b08881ab8
2 changed files with 43 additions and 6 deletions

View File

@@ -393,7 +393,15 @@ void OpenGLExampleBrowserVisualizerFlagCallback(int flag, bool enable)
if (flag == COV_ENABLE_SINGLE_STEP_RENDERING) if (flag == COV_ENABLE_SINGLE_STEP_RENDERING)
{ {
if (enable)
{
gEnableRenderLoop = false;
singleStepSimulation = true; singleStepSimulation = true;
} else
{
gEnableRenderLoop = true;
singleStepSimulation = false;
}
} }
@@ -1235,7 +1243,7 @@ void OpenGLExampleBrowser::update(float deltaTime)
{ {
b3ChromeUtilsEnableProfiling(); b3ChromeUtilsEnableProfiling();
if (!gEnableRenderLoop) if (!gEnableRenderLoop && !singleStepSimulation)
{ {
sCurrentDemo->updateGraphics(); sCurrentDemo->updateGraphics();
return; return;

View File

@@ -137,6 +137,7 @@ enum MultiThreadedGUIHelperCommunicationEnums
eGUIHelperGetShapeIndexFromInstance, eGUIHelperGetShapeIndexFromInstance,
eGUIHelperChangeTexture, eGUIHelperChangeTexture,
eGUIHelperRemoveTexture, eGUIHelperRemoveTexture,
eGUIHelperSetVisualizerFlagCheckRenderedFrame,
}; };
@@ -940,6 +941,8 @@ public:
int m_visualizerFlag; int m_visualizerFlag;
int m_visualizerEnable; int m_visualizerEnable;
int m_renderedFrames;
void setVisualizerFlag(int flag, int enable) void setVisualizerFlag(int flag, int enable)
{ {
m_visualizerFlag = flag; m_visualizerFlag = flag;
@@ -1359,12 +1362,15 @@ class PhysicsServerExample : public SharedMemoryCommon
int m_canvasDepthIndex; int m_canvasDepthIndex;
int m_canvasSegMaskIndex; int m_canvasSegMaskIndex;
// int m_options; // int m_options;
#ifdef BT_ENABLE_VR #ifdef BT_ENABLE_VR
TinyVRGui* m_tinyVrGui; TinyVRGui* m_tinyVrGui;
#endif #endif
int m_renderedFrames;
public: public:
PhysicsServerExample(MultiThreadedOpenGLGuiHelper* helper, CommandProcessorCreationInterface* commandProcessorCreator, SharedMemoryInterface* sharedMem=0, int options=0); PhysicsServerExample(MultiThreadedOpenGLGuiHelper* helper, CommandProcessorCreationInterface* commandProcessorCreator, SharedMemoryInterface* sharedMem=0, int options=0);
@@ -1723,6 +1729,7 @@ m_canvasSegMaskIndex(-1)
#ifdef BT_ENABLE_VR #ifdef BT_ENABLE_VR
,m_tinyVrGui(0) ,m_tinyVrGui(0)
#endif #endif
,m_renderedFrames(0)
{ {
m_multiThreadedHelper = helper; m_multiThreadedHelper = helper;
@@ -2066,11 +2073,29 @@ void PhysicsServerExample::updateGraphics()
gEnableDefaultMousePicking = (enable!=0); gEnableDefaultMousePicking = (enable!=0);
} }
m_multiThreadedHelper->m_renderedFrames = m_renderedFrames;
m_multiThreadedHelper->m_childGuiHelper->setVisualizerFlag(m_multiThreadedHelper->m_visualizerFlag,m_multiThreadedHelper->m_visualizerEnable); m_multiThreadedHelper->m_childGuiHelper->setVisualizerFlag(m_multiThreadedHelper->m_visualizerFlag,m_multiThreadedHelper->m_visualizerEnable);
//postpone the release until an actual frame is rendered
if (flag == COV_ENABLE_SINGLE_STEP_RENDERING)
{
m_multiThreadedHelper->getCriticalSection()->setSharedParam(1,eGUIHelperSetVisualizerFlagCheckRenderedFrame);
} else
{
m_multiThreadedHelper->mainThreadRelease(); m_multiThreadedHelper->mainThreadRelease();
}
break; break;
} }
case eGUIHelperSetVisualizerFlagCheckRenderedFrame:
{
if (m_renderedFrames!=m_multiThreadedHelper->m_renderedFrames)
{
m_multiThreadedHelper->mainThreadRelease();
}
break;
}
case eGUIHelperRegisterGraphicsInstance: case eGUIHelperRegisterGraphicsInstance:
{ {
@@ -2732,6 +2757,8 @@ void PhysicsServerExample::drawUserDebugLines()
void PhysicsServerExample::renderScene() void PhysicsServerExample::renderScene()
{ {
m_renderedFrames++;
btTransform vrTrans; btTransform vrTrans;
@@ -2899,6 +2926,8 @@ void PhysicsServerExample::renderScene()
void PhysicsServerExample::physicsDebugDraw(int debugDrawFlags) void PhysicsServerExample::physicsDebugDraw(int debugDrawFlags)
{ {
m_renderedFrames++;
if (gEnableSyncPhysicsRendering) if (gEnableSyncPhysicsRendering)
{ {
m_physicsServer.syncPhysicsToGraphics(); m_physicsServer.syncPhysicsToGraphics();