/*========================================================================= Program: Visualization Toolkit Module: vtkGeoTerrain2D.cxx 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. =========================================================================*/ /*------------------------------------------------------------------------- Copyright 2008 Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software. -------------------------------------------------------------------------*/ #include "vtkGeoTerrain2D.h" #include "vtkCamera.h" #include "vtkGeoTerrainNode.h" #include "vtkGeoSource.h" #include "vtkObjectFactory.h" #include "vtkRenderer.h" vtkStandardNewMacro(vtkGeoTerrain2D); //---------------------------------------------------------------------------- vtkGeoTerrain2D::vtkGeoTerrain2D() { this->LocationTolerance = 50.0; this->TextureTolerance = 1.0; this->CameraBounds[0] = 0; this->CameraBounds[1] = 1; this->CameraBounds[2] = 0; this->CameraBounds[3] = 1; this->PixelSize = 1; } //---------------------------------------------------------------------------- vtkGeoTerrain2D::~vtkGeoTerrain2D() { } //---------------------------------------------------------------------------- void vtkGeoTerrain2D::InitializeNodeAnalysis(vtkRenderer* ren) { // Determine the 2D camera bounds vtkCamera* cam = ren->GetActiveCamera(); double scale = cam->GetParallelScale(); double* pos = cam->GetPosition(); int* size = ren->GetSize(); this->PixelSize = 2.0 * scale / size[1]; this->CameraBounds[0] = pos[0] - size[0]*this->PixelSize/2.0; this->CameraBounds[1] = pos[0] + size[0]*this->PixelSize/2.0; this->CameraBounds[2] = pos[1] - size[1]*this->PixelSize/2.0; this->CameraBounds[3] = pos[1] + size[1]*this->PixelSize/2.0; } //---------------------------------------------------------------------------- bool vtkGeoTerrain2D::NodeInViewport(vtkGeoTerrainNode* cur) { double bounds[4]; cur->GetProjectionBounds(bounds); return bounds[1] > this->CameraBounds[0] && bounds[0] < this->CameraBounds[1] && bounds[3] > this->CameraBounds[2] && bounds[2] < this->CameraBounds[3]; } //---------------------------------------------------------------------------- int vtkGeoTerrain2D::EvaluateNode(vtkGeoTerrainNode* cur) { double bounds[4]; cur->GetProjectionBounds(bounds); // Determine the maximum allowable location error double maxLocationError = this->LocationTolerance*this->PixelSize; bool locationErrorOk = cur->GetError() < maxLocationError; // Determine the maximum allowable patch size double maxPatchSize = 300.0*this->TextureTolerance*this->PixelSize; double patchX = bounds[1] - bounds[0]; double patchY = bounds[3] - bounds[2]; double patchSize = (patchX > patchY) ? patchX : patchY; bool textureErrorOk = patchSize < maxPatchSize; if (!locationErrorOk || !textureErrorOk) { return 1; } return 0; } //---------------------------------------------------------------------------- void vtkGeoTerrain2D::PrintSelf(ostream & os, vtkIndent indent) { this->Superclass::PrintSelf( os, indent ); os << indent << "LocationTolerance: " << this->LocationTolerance << "\n"; os << indent << "TextureTolerance: " << this->TextureTolerance << "\n"; } //---------------------------------------------------------------------------- vtkAbstractTransform* vtkGeoTerrain2D::GetTransform() { if(this->GeoSource != nullptr) { return this->GeoSource->GetTransform(); } return nullptr; }