/*========================================================================= Program: Visualization Toolkit Module: vtkOpenGLModelViewProjectionMonitor 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 "vtkOpenGLModelViewProjectionMonitor.h" #include "vtkObjectFactory.h" #include "vtkgl.h" #include #include //----------------------------------------------------------------------------- vtkStandardNewMacro(vtkOpenGLModelViewProjectionMonitor) //----------------------------------------------------------------------------- void vtkOpenGLModelViewProjectionMonitor::Initialize() { memset(this->Projection,0,16*sizeof(float)); memset(this->ModelView,0,16*sizeof(float)); } //----------------------------------------------------------------------------- #define vtkOpenGLModelViewProjectionMonitorSetVectorMacro(_name, _n) \ void vtkOpenGLModelViewProjectionMonitor::Set##_name(float *val) \ { \ int changed = 0; \ for (int i=0; i<_n; ++i) \ { \ if ( fabs( val[i] - this->_name[i] ) > 1e-5f ) \ { \ changed=1; \ this->_name[i] = val[i]; \ } \ } \ if ( changed ) \ { \ this->UpTime += 1; \ } \ } vtkOpenGLModelViewProjectionMonitorSetVectorMacro(Projection, 16) vtkOpenGLModelViewProjectionMonitorSetVectorMacro(ModelView, 16) //----------------------------------------------------------------------------- void vtkOpenGLModelViewProjectionMonitor::Update() { GLfloat matrix[16]; glGetFloatv(GL_PROJECTION_MATRIX, matrix); this->SetProjection(matrix); glGetFloatv(GL_MODELVIEW_MATRIX, matrix); this->SetModelView(matrix); } //----------------------------------------------------------------------------- bool vtkOpenGLModelViewProjectionMonitor::StateChanged() { long long oldUpTime = this->UpTime; this->Update(); return (this->UpTime != oldUpTime); } //----------------------------------------------------------------------------- void vtkOpenGLModelViewProjectionMonitor::PrintSelf(ostream &os, vtkIndent indent) { this->Superclass::PrintSelf(os,indent); os << indent << "Projection="; for (int q=0; q<16; ++q) { os << this->Projection[q] << " "; } os << endl; os << indent << "ModelView="; for (int q=0; q<16; ++q) { os << this->ModelView[q] << " "; } os << endl; os << indent << "UpTime=" << this->UpTime << endl; }