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.
164 lines
4.2 KiB
164 lines
4.2 KiB
/*=========================================================================
|
|
|
|
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);
|
|
}
|
|
|