diff --git a/src/functionObjects/graphics/runTimePostProcessing/scene.C b/src/functionObjects/graphics/runTimePostProcessing/scene.C index 43cd38be48301312e69ed0c4fe4892a2c1831fff..4af8b0d0e83f119a19afdc3ac68df3a1546c6209 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<scalar>("endPosition", 1); @@ -107,60 +82,36 @@ void Foam::functionObjects::runTimePostPro::scene::readCamera dPosition_ = (endPosition - startPosition_)/scalar(nFrameTotal_ - 1); } - mode_ = modeTypeNames_.read(dict.lookup("mode")); - - word coeffsName = modeTypeNames_[mode_] + word("Coeffs"); - const dictionary& coeffs = dict.subDict(coeffsName); + cameraPosition_ = Function1<vector>::New("position", dict); + cameraFocalPoint_ = Function1<point>::New("focalPoint", dict); + cameraUp_ = Function1<vector>::New("up", dict); - 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<point>("position", -lookDir) - ); - const vector focalPoint(coeffs.lookup("focalPoint")); - cameraFocalPoint_.reset - ( - new Function1Types::Constant<point>("focalPoint", focalPoint) - ); - const vector up(coeffs.lookup("up")); - cameraUp_.reset(new Function1Types::Constant<point>("up", up)); - break; + cameraViewAngle_ = Function1<scalar>::New("viewAngle", dict); } - case mtFlightPath: + else { - cameraPosition_.reset - ( - Function1<vector>::New("position", coeffs).ptr() - ); - cameraFocalPoint_.reset + cameraViewAngle_.reset ( - Function1<point>::New("focalPoint", coeffs).ptr() + new Function1Types::Constant<scalar>("viewAngle", 35.0) ); - cameraUp_.reset(Function1<vector>::New("up", coeffs).ptr()); - break; - } - default: - { - FatalErrorInFunction - << "Unhandled enumeration " << modeTypeNames_[mode_] - << abort(FatalError); } } - if (dict.found("viewAngle")) + if (dict.found("zoom")) { - cameraViewAngle_.reset(Function1<scalar>::New("viewAngle", dict).ptr()); + cameraZoom_ = Function1<scalar>::New("zoom", dict); } else { - cameraViewAngle_.reset + cameraZoom_.reset ( - new Function1Types::Constant<scalar>("viewAngle", 35.0) + new Function1Types::Constant<scalar>("zoom", 1.0) ); } } @@ -224,25 +175,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<vtkLightKit> lightKit = vtkSmartPointer<vtkLightKit>::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 +198,10 @@ void Foam::functionObjects::runTimePostPro::scene::initialise vtkSmartPointer<vtkPolyDataMapper>::New(); clipMapper->SetInputConnection(clipBox->GetOutputPort()); - vtkSmartPointer<vtkActor> clipActor = vtkSmartPointer<vtkActor>::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<vtkActor>::New(); + clipBoxActor_->SetMapper(clipMapper); + clipBoxActor_->VisibilityOff(); + renderer->AddActor(clipBoxActor_); } } @@ -279,26 +211,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 +273,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 +317,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 9fd4ab8ebc7f6ee10e5c288150d176d69e48ffab..e2f5d87e1226d88ec02a8ca140b289eee98178df 100644 --- a/src/functionObjects/graphics/runTimePostProcessing/scene.H +++ b/src/functionObjects/graphics/runTimePostProcessing/scene.H @@ -25,6 +25,28 @@ Class Foam::functionObjects::runTimePostPro::scene Description + Class to control scene construction and provide main rendering loop + +Usage + \verbatim + camera + { + // Total number of frames to generate + nFrameTotal 1; + + // Parallel projection flag + parallelProjection no; + + focalPoint (0 0 0); + up (0 1 0); + position (0 0 1); + + // Optional entries + clipBox (-0.0206 -0.0254 -0.0005) (0.29 0.0254 0.0005); + viewAngle 20; + zoom 1.1; + } + \endverbatim SourceFiles scene.C @@ -49,6 +71,7 @@ SourceFiles // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +class vtkActor; class vtkRenderer; class vtkRenderWindow; @@ -58,22 +81,12 @@ namespace functionObjects { namespace runTimePostPro { - /*---------------------------------------------------------------------------*\ Class scene Declaration \*---------------------------------------------------------------------------*/ class scene { -public: - - enum modeType{mtStatic, mtFlightPath}; - - NamedEnum<modeType, 2> modeTypeNames_; - - -private: - // Private data //- Reference to the object registry @@ -88,7 +101,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 +121,6 @@ protected: // Camera settings - //- Mode - modeType mode_; - //- Position autoPtr<Function1<point>> cameraPosition_; @@ -123,12 +133,20 @@ protected: //- View angle autoPtr<Function1<scalar>> cameraViewAngle_; + //- Zoom: 1 = do nothing, >1 = zoom in, <1 = zoom out + // - perspective mode: reduces view angle + // - parallel mode: manipulate parallel scale + autoPtr<Function1<scalar>> cameraZoom_; + // Scene management //- Clipping box boundBox clipBox_; + //- Clipping box actor + vtkSmartPointer<vtkActor> clipBoxActor_; + //- Parallel projection flag bool parallelProjection_;