Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
4.2 KiB

2 years ago
/*=========================================================================
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 <math.h>
#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);
}