Add scripting support to camera

This commit is contained in:
Magne Sjaastad 2025-02-16 11:34:42 +01:00
parent e8bfeded0a
commit 6e19c2ddb4
2 changed files with 43 additions and 3 deletions

View File

@ -57,6 +57,7 @@
#include "cafFrameAnimationControl.h" #include "cafFrameAnimationControl.h"
#include "cafPdmFieldScriptingCapability.h" #include "cafPdmFieldScriptingCapability.h"
#include "cafPdmFieldScriptingCapabilityCvfColor3.h" #include "cafPdmFieldScriptingCapabilityCvfColor3.h"
#include "cafPdmFieldScriptingCapabilityCvfVec3d.h"
#include "cafPdmUiComboBoxEditor.h" #include "cafPdmUiComboBoxEditor.h"
#include "cvfCamera.h" #include "cvfCamera.h"
#include "cvfModelBasicList.h" #include "cvfModelBasicList.h"
@ -112,6 +113,17 @@ Rim3dView::Rim3dView()
CAF_PDM_InitField( &m_cameraPointOfInterest, "CameraPointOfInterest", cvf::Vec3d::ZERO, "" ); CAF_PDM_InitField( &m_cameraPointOfInterest, "CameraPointOfInterest", cvf::Vec3d::ZERO, "" );
m_cameraPointOfInterest.uiCapability()->setUiHidden( true ); m_cameraPointOfInterest.uiCapability()->setUiHidden( true );
CAF_PDM_InitScriptableFieldWithScriptKeywordNoDefault( &m_cameraPositionProxy, "CameraPositionProxy", "CameraMatrix", "Camera Matrix" );
m_cameraPositionProxy.registerGetMethod( this, &Rim3dView::cameraPosition );
m_cameraPositionProxy.registerSetMethod( this, &Rim3dView::setCameraPosition );
CAF_PDM_InitScriptableFieldWithScriptKeywordNoDefault( &m_cameraPointOfInterestProxy,
"CameraPointOfInterestProxy",
"CameraPointOfInterest",
"Camera Point of Interest" );
m_cameraPointOfInterestProxy.registerGetMethod( this, &Rim3dView::cameraPointOfInterest );
m_cameraPointOfInterestProxy.registerSetMethod( this, &Rim3dView::setCameraPointOfInterest );
CAF_PDM_InitScriptableField( &isPerspectiveView, "PerspectiveProjection", true, "Perspective Projection" ); CAF_PDM_InitScriptableField( &isPerspectiveView, "PerspectiveProjection", true, "Perspective Projection" );
double defaultScaleFactor = preferences->defaultScaleFactorZ(); double defaultScaleFactor = preferences->defaultScaleFactorZ();
@ -1035,6 +1047,13 @@ void Rim3dView::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const
m_viewer->update(); m_viewer->update();
} }
} }
else if ( changedField == &m_cameraPositionProxy || changedField == &m_cameraPointOfInterestProxy )
{
if ( m_viewer )
{
m_viewer->repaint();
}
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -1510,6 +1529,11 @@ QList<caf::PdmOptionItemInfo> Rim3dView::calculateValueOptions( const caf::PdmFi
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
cvf::Mat4d Rim3dView::cameraPosition() const cvf::Mat4d Rim3dView::cameraPosition() const
{ {
if ( m_viewer && m_viewer->mainCamera() )
{
m_cameraPosition = m_viewer->mainCamera()->viewMatrix();
}
return m_cameraPosition(); return m_cameraPosition();
} }
@ -1518,6 +1542,11 @@ cvf::Mat4d Rim3dView::cameraPosition() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
cvf::Vec3d Rim3dView::cameraPointOfInterest() const cvf::Vec3d Rim3dView::cameraPointOfInterest() const
{ {
if ( m_viewer )
{
m_cameraPointOfInterest = m_viewer->pointOfInterest();
}
return m_cameraPointOfInterest(); return m_cameraPointOfInterest();
} }
@ -1545,6 +1574,10 @@ QWidget* Rim3dView::viewWidget()
void Rim3dView::setCameraPosition( const cvf::Mat4d& cameraPosition ) void Rim3dView::setCameraPosition( const cvf::Mat4d& cameraPosition )
{ {
m_cameraPosition = cameraPosition; m_cameraPosition = cameraPosition;
if ( m_viewer && m_viewer->mainCamera() )
{
m_viewer->mainCamera()->setViewMatrix( m_cameraPosition );
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -1553,6 +1586,10 @@ void Rim3dView::setCameraPosition( const cvf::Mat4d& cameraPosition )
void Rim3dView::setCameraPointOfInterest( const cvf::Vec3d& cameraPointOfInterest ) void Rim3dView::setCameraPointOfInterest( const cvf::Vec3d& cameraPointOfInterest )
{ {
m_cameraPointOfInterest = cameraPointOfInterest; m_cameraPointOfInterest = cameraPointOfInterest;
if ( m_viewer )
{
m_viewer->setPointOfInterest( m_cameraPointOfInterest );
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -281,7 +281,6 @@ protected:
cvf::ref<cvf::ModelBasicList> m_screenSpaceModel; cvf::ref<cvf::ModelBasicList> m_screenSpaceModel;
caf::PdmField<double> m_scaleZ; caf::PdmField<double> m_scaleZ;
caf::PdmField<double> m_customScaleZ;
caf::PdmChildField<RimAnnotationInViewCollection*> m_annotationCollection; caf::PdmChildField<RimAnnotationInViewCollection*> m_annotationCollection;
@ -329,13 +328,17 @@ private:
caf::PdmField<int> m_id; caf::PdmField<int> m_id;
caf::PdmChildField<RimViewNameConfig*> m_nameConfig; caf::PdmChildField<RimViewNameConfig*> m_nameConfig;
caf::PdmField<bool> m_disableLighting; caf::PdmField<bool> m_disableLighting;
caf::PdmField<cvf::Mat4d> m_cameraPosition;
caf::PdmField<cvf::Vec3d> m_cameraPointOfInterest;
caf::PdmField<cvf::Color3f> m_backgroundColor; caf::PdmField<cvf::Color3f> m_backgroundColor;
caf::PdmField<bool> m_showGridBox; caf::PdmField<bool> m_showGridBox;
caf::PdmField<bool> m_showZScaleLabel; caf::PdmField<bool> m_showZScaleLabel;
caf::PdmPtrField<Rim3dView*> m_comparisonView; caf::PdmPtrField<Rim3dView*> m_comparisonView;
// Camera
mutable caf::PdmField<cvf::Mat4d> m_cameraPosition;
mutable caf::PdmField<cvf::Vec3d> m_cameraPointOfInterest;
caf::PdmProxyValueField<cvf::Vec3d> m_cameraPointOfInterestProxy;
caf::PdmProxyValueField<cvf::Mat4d> m_cameraPositionProxy;
caf::PdmField<bool> m_useCustomAnnotationStrategy; caf::PdmField<bool> m_useCustomAnnotationStrategy;
caf::PdmField<caf::AppEnum<RivAnnotationTools::LabelPositionStrategy>> m_annotationStrategy; caf::PdmField<caf::AppEnum<RivAnnotationTools::LabelPositionStrategy>> m_annotationStrategy;
caf::PdmField<int> m_annotationCountHint; caf::PdmField<int> m_annotationCountHint;