diff --git a/src/functionObjects/graphics/runTimePostProcessing/scene.C b/src/functionObjects/graphics/runTimePostProcessing/scene.C index 43cd38be48..95ab189f5f 100644 --- a/src/functionObjects/graphics/runTimePostProcessing/scene.C +++ b/src/functionObjects/graphics/runTimePostProcessing/scene.C @@ -38,28 +38,6 @@ License #include "vtkRenderWindow.h" #include "vtkWindowToImageFilter.h" -// * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * * // - -namespace Foam -{ - template<> - const char* NamedEnum - < - functionObjects::runTimePostPro::scene::modeType, - 2 - >::names[] = - { - "static", - "flightPath" - }; -} - -const Foam::NamedEnum -< - Foam::functionObjects::runTimePostPro::scene::modeType, - 2 -> modeTypeNames_; - // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // @@ -92,9 +70,6 @@ void Foam::functionObjects::runTimePostPro::scene::readCamera } } - - dict.lookup("parallelProjection") >> parallelProjection_; - if (nFrameTotal_ > 1) { scalar endPosition = dict.lookupOrDefault("endPosition", 1); @@ -107,62 +82,28 @@ void Foam::functionObjects::runTimePostPro::scene::readCamera dPosition_ = (endPosition - startPosition_)/scalar(nFrameTotal_ - 1); } - mode_ = modeTypeNames_.read(dict.lookup("mode")); + cameraPosition_ = Function1::New("position", dict); + cameraFocalPoint_ = Function1::New("focalPoint", dict); + cameraUp_ = Function1::New("up", dict); - word coeffsName = modeTypeNames_[mode_] + word("Coeffs"); - const dictionary& coeffs = dict.subDict(coeffsName); - - switch (mode_) + dict.readIfPresent("clipBox", clipBox_); + dict.lookup("parallelProjection") >> parallelProjection_; + if (!parallelProjection_) { - case mtStatic: + if (dict.found("viewAngle")) { - clipBox_ = boundBox(coeffs.lookup("clipBox")); - const vector lookDir(vector(coeffs.lookup("lookDir"))); - cameraPosition_.reset - ( - new Function1Types::Constant("position", -lookDir) - ); - const vector focalPoint(coeffs.lookup("focalPoint")); - cameraFocalPoint_.reset - ( - new Function1Types::Constant("focalPoint", focalPoint) - ); - const vector up(coeffs.lookup("up")); - cameraUp_.reset(new Function1Types::Constant("up", up)); - break; + cameraViewAngle_ = Function1::New("viewAngle", dict); } - case mtFlightPath: + else { - cameraPosition_.reset + cameraViewAngle_.reset ( - Function1::New("position", coeffs).ptr() + new Function1Types::Constant("viewAngle", 35.0) ); - cameraFocalPoint_.reset - ( - Function1::New("focalPoint", coeffs).ptr() - ); - cameraUp_.reset(Function1::New("up", coeffs).ptr()); - break; - } - default: - { - FatalErrorInFunction - << "Unhandled enumeration " << modeTypeNames_[mode_] - << abort(FatalError); } } - if (dict.found("viewAngle")) - { - cameraViewAngle_.reset(Function1::New("viewAngle", dict).ptr()); - } - else - { - cameraViewAngle_.reset - ( - new Function1Types::Constant("viewAngle", 35.0) - ); - } + cameraZoom_ = Function1::New("zoom", dict); } @@ -224,25 +165,11 @@ void Foam::functionObjects::runTimePostPro::scene::initialise camera->SetParallelProjection(parallelProjection_); renderer->SetActiveCamera(camera); - - // Initialise the camera - const vector up = cameraUp_->value(position_); - const vector pos = cameraPosition_->value(position_); - const point focalPoint = cameraFocalPoint_->value(position_); - - camera->SetViewUp(up.x(), up.y(), up.z()); - camera->SetPosition(pos.x(), pos.y(), pos.z()); - camera->SetFocalPoint(focalPoint.x(), focalPoint.y(), focalPoint.z()); - camera->Modified(); - - // Add the lights vtkSmartPointer lightKit = vtkSmartPointer::New(); lightKit->AddLightsToRenderer(renderer); - - // For static mode initialise the clip box - if (mode_ == mtStatic) + if (clipBox_ != boundBox::greatBox) { const point& min = clipBox_.min(); const point& max = clipBox_.max(); @@ -261,15 +188,10 @@ void Foam::functionObjects::runTimePostPro::scene::initialise vtkSmartPointer::New(); clipMapper->SetInputConnection(clipBox->GetOutputPort()); - vtkSmartPointer clipActor = vtkSmartPointer::New(); - clipActor->SetMapper(clipMapper); - clipActor->VisibilityOff(); - renderer->AddActor(clipActor); - - // Call resetCamera to fit clip box in view - clipActor->VisibilityOn(); - renderer->ResetCamera(); - clipActor->VisibilityOff(); + clipBoxActor_ = vtkSmartPointer::New(); + clipBoxActor_->SetMapper(clipMapper); + clipBoxActor_->VisibilityOff(); + renderer->AddActor(clipBoxActor_); } } @@ -279,26 +201,44 @@ void Foam::functionObjects::runTimePostPro::scene::setCamera vtkRenderer* renderer ) const { - if (mode_ == mtFlightPath) + vtkCamera* camera = renderer->GetActiveCamera(); + + if (parallelProjection_) { - const vector up = cameraUp_->value(position_); - const vector pos = cameraPosition_->value(position_); - const point focalPoint = cameraFocalPoint_->value(position_); - - vtkCamera* camera = renderer->GetActiveCamera(); - camera->SetViewUp(up.x(), up.y(), up.z()); - camera->SetPosition(pos.x(), pos.y(), pos.z()); - camera->SetFocalPoint(focalPoint.x(), focalPoint.y(), focalPoint.z()); - camera->Modified(); + // Restore parallel scale to allow application of zoom (later) + camera->SetParallelScale(1); } - - if (!parallelProjection_) + else { // Restore viewAngle (it might be reset by clipping) - vtkCamera* camera = renderer->GetActiveCamera(); camera->SetViewAngle(cameraViewAngle_->value(position_)); - camera->Modified(); } + + const vector up = cameraUp_->value(position_); + const vector pos = cameraPosition_->value(position_); + const point focalPoint = cameraFocalPoint_->value(position_); + const scalar zoom = cameraZoom_->value(position_); + + camera->SetViewUp(up.x(), up.y(), up.z()); + camera->SetPosition(pos.x(), pos.y(), pos.z()); + camera->SetFocalPoint(focalPoint.x(), focalPoint.y(), focalPoint.z()); + + + // Apply clipping if required + // Note: possible optimisation - if the camera is static, this only needs + // to be done once on initialisation + if (clipBox_ != boundBox::greatBox) + { + // Call ResetCamera() to fit clip box in view + clipBoxActor_->VisibilityOn(); + renderer->ResetCamera(); + clipBoxActor_->VisibilityOff(); + } + + // Zoom applied after all other operations + camera->Zoom(zoom); + + camera->Modified(); } @@ -323,12 +263,13 @@ Foam::functionObjects::runTimePostPro::scene::scene obr_(obr), name_(name), colours_(), - mode_(mtStatic), cameraPosition_(nullptr), cameraFocalPoint_(nullptr), cameraUp_(nullptr), cameraViewAngle_(nullptr), - clipBox_(), + cameraZoom_(nullptr), + clipBox_(boundBox::greatBox), + clipBoxActor_(), parallelProjection_(true), nFrameTotal_(1), startPosition_(0), @@ -366,7 +307,10 @@ Foam::scalar Foam::functionObjects::runTimePostPro::scene::position() const } -void Foam::functionObjects::runTimePostPro::scene::read(const dictionary& dict) +void Foam::functionObjects::runTimePostPro::scene::read +( + const dictionary& dict +) { readCamera(dict.subDict("camera")); readColours(dict.subDict("colours")); diff --git a/src/functionObjects/graphics/runTimePostProcessing/scene.H b/src/functionObjects/graphics/runTimePostProcessing/scene.H index 9fd4ab8ebc..3350b946de 100644 --- a/src/functionObjects/graphics/runTimePostProcessing/scene.H +++ b/src/functionObjects/graphics/runTimePostProcessing/scene.H @@ -49,6 +49,7 @@ SourceFiles // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +class vtkActor; class vtkRenderer; class vtkRenderWindow; @@ -58,22 +59,12 @@ namespace functionObjects { namespace runTimePostPro { - /*---------------------------------------------------------------------------*\ Class scene Declaration \*---------------------------------------------------------------------------*/ class scene { -public: - - enum modeType{mtStatic, mtFlightPath}; - - NamedEnum modeTypeNames_; - - -private: - // Private data //- Reference to the object registry @@ -88,7 +79,7 @@ private: //- Read camera properties void readCamera(const dictionary& dict); - //- Read solour properties + //- Read colour properties void readColours(const dictionary& dict); //- Disallow default bitwise copy construct @@ -108,9 +99,6 @@ protected: // Camera settings - //- Mode - modeType mode_; - //- Position autoPtr> cameraPosition_; @@ -123,12 +111,20 @@ protected: //- View angle autoPtr> cameraViewAngle_; + //- Zoom: 1 = do nothing, >1 = zoom in, <1 = zoom out + // - perspective mode: reduces view angle + // - parallel mode: manipulate parallel scale + autoPtr> cameraZoom_; + // Scene management //- Clipping box boundBox clipBox_; + //- Clipping box actor + vtkSmartPointer clipBoxActor_; + //- Parallel projection flag bool parallelProjection_;