(#395) Propagate scaleZ to linked views and fixed camera sync issue (offset z must be multiplied by scaleZ)

This commit is contained in:
Magne Sjaastad
2015-09-03 13:06:00 +02:00
parent 1f2a5a8c08
commit 6a6973f3d4
5 changed files with 99 additions and 17 deletions

View File

@@ -234,13 +234,16 @@ void RimLinkedViews::configureOverrides()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimLinkedViews::allViewsForCameraSync(std::vector<RimView*>& views) void RimLinkedViews::allViewsForCameraSync(RimView* source, std::vector<RimView*>& views)
{ {
views.push_back(m_mainView()); if (source != m_mainView())
{
views.push_back(m_mainView());
}
for (size_t i = 0; i < viewConfigs.size(); i++) for (size_t i = 0; i < viewConfigs.size(); i++)
{ {
if (viewConfigs[i]->syncCamera && viewConfigs[i]->managedView()) if (viewConfigs[i]->syncCamera && viewConfigs[i]->managedView() && source != viewConfigs[i]->managedView())
{ {
views.push_back(viewConfigs[i]->managedView()); views.push_back(viewConfigs[i]->managedView());
} }
@@ -258,6 +261,7 @@ void RimLinkedViews::applyAllOperations()
updateTimeStep(NULL, m_mainView->currentTimeStep()); updateTimeStep(NULL, m_mainView->currentTimeStep());
updateRangeFilters(); updateRangeFilters();
updatePropertyFilters(); updatePropertyFilters();
updateScaleZ(m_mainView, m_mainView->scaleZ());
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -377,3 +381,18 @@ void RimLinkedViews::initAfterRead()
m_name = displayNameForView(m_mainView); m_name = displayNameForView(m_mainView);
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimLinkedViews::updateScaleZ(RimView* source, double scaleZ)
{
std::vector<RimView*> views;
allViewsForCameraSync(source, views);
// Make sure scale factors are identical
for (size_t i = 0; i < views.size(); i++)
{
views[i]->setScaleZAndUpdate(scaleZ);
}
}

View File

@@ -57,7 +57,8 @@ public:
void configureOverrides(); void configureOverrides();
void allViewsForCameraSync(std::vector<RimView*>& views); void updateScaleZ(RimView* source, double scaleZ);
void allViewsForCameraSync(RimView* source, std::vector<RimView*>& views);
void allViews(std::vector<RimView*>& views); void allViews(std::vector<RimView*>& views);
public: public:

View File

@@ -113,7 +113,14 @@ void RimManagedViewConfig::fieldChangedByUi(const caf::PdmFieldHandle* changedFi
{ {
if (changedField == &syncCamera && syncCamera()) if (changedField == &syncCamera && syncCamera())
{ {
if (m_managedView && m_managedView->viewer()) m_managedView->viewer()->update(); RimLinkedViews* linkedViews = NULL;
this->firstAnchestorOrThisOfType(linkedViews);
linkedViews->updateScaleZ(linkedViews->mainView(), linkedViews->mainView()->scaleZ());
if (m_managedView && m_managedView->viewer())
{
m_managedView->viewer()->navigationPolicyUpdate();
}
} }
else if (changedField == &syncTimeStep && syncTimeStep()) else if (changedField == &syncTimeStep && syncTimeStep())
{ {

View File

@@ -3,8 +3,12 @@
#include "RiaApplication.h" #include "RiaApplication.h"
#include "RiaPreferences.h" #include "RiaPreferences.h"
#include "RigCaseData.h"
#include "Rim3dOverlayInfoConfig.h" #include "Rim3dOverlayInfoConfig.h"
#include "RimCellRangeFilterCollection.h" #include "RimCellRangeFilterCollection.h"
#include "RimEclipseCase.h"
#include "RimEclipseView.h"
#include "RimLinkedViews.h" #include "RimLinkedViews.h"
#include "RimManagedViewConfig.h" #include "RimManagedViewConfig.h"
#include "RimOilField.h" #include "RimOilField.h"
@@ -432,7 +436,20 @@ void RimView::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QV
updateScaleTransform(); updateScaleTransform();
createDisplayModelAndRedraw(); createDisplayModelAndRedraw();
m_viewer->update();
RimProject* proj = NULL;
this->firstAnchestorOrThisOfType(proj);
RimLinkedViews* linkedViews = proj->findLinkedViewsGroupForView(this);
if (linkedViews)
{
RimManagedViewConfig* viewConf = linkedViews->viewConfigForView(this);
if (!viewConf || viewConf->syncCamera())
{
linkedViews->updateScaleZ(this, scaleZ);
}
}
m_viewer->navigationPolicyUpdate();
} }
RiuMainWindow::instance()->updateScaleValue(); RiuMainWindow::instance()->updateScaleValue();
@@ -567,19 +584,28 @@ void RimView::notifyCameraHasChanged()
// There is no view config for a master view, but all views for sync must be updated // There is no view config for a master view, but all views for sync must be updated
if (!viewConf || viewConf->syncCamera()) if (!viewConf || viewConf->syncCamera())
{ {
std::vector<RimView*> allViews; linkedViews->allViewsForCameraSync(this, viewsToUpdate);
linkedViews->allViewsForCameraSync(allViews);
for (size_t i = 0; i < allViews.size(); i++)
{
if (allViews[i] != this)
{
viewsToUpdate.push_back(allViews[i]);
}
}
} }
} }
cvf::Vec3d up;
cvf::Vec3d domainEye;
cvf::Vec3d domainViewRefPoint;
this->viewer()->mainCamera()->toLookAt(&domainEye, &domainViewRefPoint, &up);
RimEclipseView* eclipseView = dynamic_cast<RimEclipseView*>(this);
if (eclipseView
&& eclipseView->eclipseCase()
&& eclipseView->eclipseCase()->reservoirData()
&& eclipseView->eclipseCase()->reservoirData()->mainGrid())
{
cvf::Vec3d offset = eclipseView->eclipseCase()->reservoirData()->mainGrid()->displayModelOffset();
offset.z() *= eclipseView->scaleZ();
domainEye += offset;
domainViewRefPoint += offset;
}
// Propagate view matrix to all relevant views // Propagate view matrix to all relevant views
const cvf::Mat4d mat = this->viewer()->mainCamera()->viewMatrix(); const cvf::Mat4d mat = this->viewer()->mainCamera()->viewMatrix();
@@ -587,10 +613,37 @@ void RimView::notifyCameraHasChanged()
{ {
if (viewsToUpdate[i] && viewsToUpdate[i]->viewer()) if (viewsToUpdate[i] && viewsToUpdate[i]->viewer())
{ {
viewsToUpdate[i]->viewer()->mainCamera()->setViewMatrix(mat); RimEclipseView* destEclipseView = dynamic_cast<RimEclipseView*>(viewsToUpdate[i]);
if (destEclipseView
&& destEclipseView->eclipseCase()
&& destEclipseView->eclipseCase()->reservoirData()
&& destEclipseView->eclipseCase()->reservoirData()->mainGrid())
{
cvf::Vec3d destOffset = destEclipseView->eclipseCase()->reservoirData()->mainGrid()->displayModelOffset();
destOffset.z() *= destEclipseView->scaleZ();
cvf::Vec3d eclipseEye = domainEye - destOffset;
cvf::Vec3d eclipseViewRefPoint = domainViewRefPoint - destOffset;
viewsToUpdate[i]->viewer()->mainCamera()->setFromLookAt(eclipseEye, eclipseViewRefPoint, up);
}
else
{
viewsToUpdate[i]->viewer()->mainCamera()->setFromLookAt(domainEye, domainViewRefPoint, up);
}
viewsToUpdate[i]->viewer()->update(); viewsToUpdate[i]->viewer()->update();
} }
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimView::setScaleZAndUpdate(double scaleZ)
{
this->scaleZ = scaleZ;
updateScaleTransform();
createDisplayModelAndRedraw();
}

View File

@@ -108,6 +108,8 @@ public:
void setShowFaultsOnly(bool showFaults); void setShowFaultsOnly(bool showFaults);
bool isGridVisualizationMode() const; bool isGridVisualizationMode() const;
void setScaleZAndUpdate(double scaleZ);
// Animation // Animation
int currentTimeStep() { return m_currentTimeStep;} int currentTimeStep() { return m_currentTimeStep;}
void setCurrentTimeStep(int frameIdx); void setCurrentTimeStep(int frameIdx);