Enable toggling use of doublebuffering for camera and time

This commit is contained in:
Erik Broberg
2016-09-13 11:52:54 -04:00
parent 5cb6d2cb05
commit d287b08c51
7 changed files with 51 additions and 15 deletions

View File

@@ -116,7 +116,7 @@ public:
performance::PerformanceManager* performanceManager();
void serialize(SyncBuffer* syncBuffer);
void deserialize(SyncBuffer* syncBuffer);
void deserialize(SyncBuffer* syncBuffer, bool useDoubleBuffering);
float globalBlackOutFactor();
void setGlobalBlackOutFactor(float factor);

View File

@@ -121,7 +121,23 @@ namespace openspace {
// Synchronization
void serialize(SyncBuffer* syncBuffer);
void deserialize(SyncBuffer* syncBuffer);
/**
* Updates camera variables from data in syncbuffer. If \param useDoubleBuffering is
* false, values will be written directly into the camera state, overwriting any
* previous values.
* If \param useDoubleBuffering is true, values will be written and stored in local
* copies, keeping the state unchanged until <code>updateDoubleBuffer</code> has
* been called.
*/
void deserialize(SyncBuffer* syncBuffer, bool useDoubleBuffering);
/**
* This method should be called from the SGCT postSynchronization stage if and only
* if method <code>deserialize</code> has previously been called with the argument
* useDoubleBuffering set to true.
*/
void updateDoubleBuffer();
void serialize(std::ostream& os) const;
void deserialize(std::istream& is);
@@ -176,7 +192,6 @@ namespace openspace {
[[deprecated("Replaced by Camera::SgctInternal::viewProjectionMatrix()")]]
const glm::mat4& viewProjectionMatrix() const;
void updateDoubleBuffer();
private:
struct SyncData {

View File

@@ -181,7 +181,16 @@ public:
void serialize(SyncBuffer* syncBuffer);
void deserialize(SyncBuffer* syncBuffer);
/**
* Updates time variables from data in syncbuffer. If \param useDoubleBuffering is
* false, values will be written directly into the time state, overwriting any
* previous values.
* If \param useDoubleBuffering is true, values will be written and stored in local
* copies, keeping the time state unchanged until <code>updateDoubleBuffer</code> has
* been called.
*/
void deserialize(SyncBuffer* syncBuffer, bool useDoubleBuffering);
bool timeJumped() const;
@@ -189,6 +198,11 @@ public:
bool paused() const;
/**
* This method should be called from the SGCT postSynchronization stage if and only
* if method <code>deserialize</code> has previously been called with the argument
* useDoubleBuffering set to true.
*/
void updateDoubleBuffer();
/**

View File

@@ -959,9 +959,9 @@ void OpenSpaceEngine::decode() {
if (_syncBuffer) {
_syncBuffer->read();
Time::ref().deserialize(_syncBuffer.get());
Time::ref().deserialize(_syncBuffer.get(), _settingsEngine->useDoubleBuffering());
_scriptEngine->deserialize(_syncBuffer.get());
_renderEngine->deserialize(_syncBuffer.get());
_renderEngine->deserialize(_syncBuffer.get(), _settingsEngine->useDoubleBuffering());
}
}

View File

@@ -529,23 +529,20 @@ void RenderEngine::serialize(SyncBuffer* syncBuffer) {
if (_mainCamera){
_mainCamera->serialize(syncBuffer);
}
syncBuffer->encode(_onScreenInformation._node);
syncBuffer->encode(_onScreenInformation._position.x);
syncBuffer->encode(_onScreenInformation._position.y);
syncBuffer->encode(_onScreenInformation._size);
}
void RenderEngine::deserialize(SyncBuffer* syncBuffer) {
void RenderEngine::deserialize(SyncBuffer* syncBuffer, bool useDoubleBuffering) {
if (_mainCamera){
_mainCamera->deserialize(syncBuffer);
_mainCamera->deserialize(syncBuffer, useDoubleBuffering);
}
syncBuffer->decode(_onScreenInformation._node);
syncBuffer->decode(_onScreenInformation._position.x);
syncBuffer->decode(_onScreenInformation._position.y);
syncBuffer->decode(_onScreenInformation._size);
}
Camera* RenderEngine::camera() const {

View File

@@ -195,9 +195,14 @@ namespace openspace {
local.serialize(syncBuffer);
}
void Camera::deserialize(SyncBuffer* syncBuffer) {
void Camera::deserialize(SyncBuffer* syncBuffer, bool useDoubleBuffering) {
std::lock_guard<std::mutex> _lock(_mutex);
synced.deserialize(syncBuffer);
if (useDoubleBuffering) {
synced.deserialize(syncBuffer);
}
else {
local.deserialize(syncBuffer);
}
}
void Camera::invalidateCache() {

View File

@@ -156,9 +156,14 @@ void Time::serialize(SyncBuffer* syncBuffer) {
_syncMutex.unlock();
}
void Time::deserialize(SyncBuffer* syncBuffer) {
void Time::deserialize(SyncBuffer* syncBuffer, bool useDoubleBuffering) {
_syncMutex.lock();
synced.deserialize(syncBuffer);
if (useDoubleBuffering) {
synced.deserialize(syncBuffer);
}
else {
local.deserialize(syncBuffer);
}
_syncMutex.unlock();
}