/*========================================================================= Program: Visualization Toolkit Module: $RCSfile: vtkOpenGLCamera.cxx,v $ Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkOpenGLCamera.h" #include "vtkMatrix4x4.h" #include "vtkObjectFactory.h" #include "vtkOpenGLRenderer.h" #include "vtkOutputWindow.h" #include "vtkRenderWindow.h" #include "vtkgluPickMatrix.h" #include "vtkOpenGL.h" #include #ifndef VTK_IMPLEMENT_MESA_CXX vtkCxxRevisionMacro(vtkOpenGLCamera, "$Revision: 1.63 $"); vtkStandardNewMacro(vtkOpenGLCamera); #endif // Implement base class method. void vtkOpenGLCamera::Render(vtkRenderer *ren) { double aspect[2]; int lowerLeft[2]; int usize, vsize; vtkMatrix4x4 *matrix = vtkMatrix4x4::New(); // find out if we should stereo render this->Stereo = (ren->GetRenderWindow())->GetStereoRender(); ren->GetTiledSizeAndOrigin(&usize,&vsize,lowerLeft,lowerLeft+1); // if were on a stereo renderer draw to special parts of screen if (this->Stereo) { switch ((ren->GetRenderWindow())->GetStereoType()) { case VTK_STEREO_CRYSTAL_EYES: if (this->LeftEye) { glDrawBuffer(GL_BACK_LEFT); } else { glDrawBuffer(GL_BACK_RIGHT); } break; case VTK_STEREO_LEFT: this->LeftEye = 1; break; case VTK_STEREO_RIGHT: this->LeftEye = 0; break; default: break; } } else { if (ren->GetRenderWindow()->GetDoubleBuffer()) { glDrawBuffer(GL_BACK); } else { glDrawBuffer(GL_FRONT); } } glViewport(lowerLeft[0],lowerLeft[1], usize, vsize); glEnable( GL_SCISSOR_TEST ); glScissor(lowerLeft[0],lowerLeft[1], usize, vsize); // some renderer subclasses may have more complicated computations for the // aspect ratio. SO take that into account by computing the difference // between our simple aspect ratio and what the actual renderer is // reporting. ren->ComputeAspect(); ren->GetAspect(aspect); double aspect2[2]; ren->vtkViewport::ComputeAspect(); ren->vtkViewport::GetAspect(aspect2); double aspectModification = aspect[0]*aspect2[1]/(aspect[1]*aspect2[0]); glMatrixMode( GL_PROJECTION); if(usize && vsize) { matrix->DeepCopy(this->GetPerspectiveTransformMatrix( aspectModification*usize/vsize, -1,1)); matrix->Transpose(); } if(ren->GetIsPicking()) { int size[2]; size[0] = usize; size[1] = vsize; glLoadIdentity(); vtkgluPickMatrix(ren->GetPickX(), ren->GetPickY(), 1, 1, lowerLeft, size); glMultMatrixd(matrix->Element[0]); } else { // insert camera view transformation glLoadMatrixd(matrix->Element[0]); } // push the model view matrix onto the stack, make sure we // adjust the mode first glMatrixMode(GL_MODELVIEW); glPushMatrix(); matrix->DeepCopy(this->GetViewTransformMatrix()); matrix->Transpose(); // insert camera view transformation glMultMatrixd(matrix->Element[0]); if ((ren->GetRenderWindow())->GetErase() && ren->GetErase()) { ren->Clear(); } // if we have a stereo renderer, draw other eye next time if (this->Stereo) { if (this->LeftEye) { this->LeftEye = 0; } else { this->LeftEye = 1; } } matrix->Delete(); } void vtkOpenGLCamera::UpdateViewport(vtkRenderer *ren) { int lowerLeft[2]; int usize, vsize; ren->GetTiledSizeAndOrigin(&usize,&vsize,lowerLeft,lowerLeft+1); glViewport(lowerLeft[0],lowerLeft[1], usize, vsize); glEnable( GL_SCISSOR_TEST ); glScissor(lowerLeft[0],lowerLeft[1], usize, vsize); } //---------------------------------------------------------------------------- void vtkOpenGLCamera::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os,indent); }