001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/ogcwebservices/wpvs/operation/GetView.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2006 by: 006 EXSE, Department of Geography, University of Bonn 007 http://www.giub.uni-bonn.de/deegree/ 008 lat/lon GmbH 009 http://www.lat-lon.de 010 011 This library is free software; you can redistribute it and/or 012 modify it under the terms of the GNU Lesser General Public 013 License as published by the Free Software Foundation; either 014 version 2.1 of the License, or (at your option) any later version. 015 016 This library is distributed in the hope that it will be useful, 017 but WITHOUT ANY WARRANTY; without even the implied warranty of 018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 019 Lesser General Public License for more details. 020 021 You should have received a copy of the GNU Lesser General Public 022 License along with this library; if not, write to the Free Software 023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 024 025 Contact: 026 027 Andreas Poth 028 lat/lon GmbH 029 Aennchenstraße 19 030 53177 Bonn 031 Germany 032 E-Mail: poth@lat-lon.de 033 034 Prof. Dr. Klaus Greve 035 Department of Geography 036 University of Bonn 037 Meckenheimer Allee 166 038 53115 Bonn 039 Germany 040 E-Mail: greve@giub.uni-bonn.de 041 042 ---------------------------------------------------------------------------*/ 043 044 package org.deegree.ogcwebservices.wpvs.operation; 045 046 import java.awt.Color; 047 import java.awt.Dimension; 048 import java.io.UnsupportedEncodingException; 049 import java.net.URLDecoder; 050 import java.util.ArrayList; 051 import java.util.List; 052 import java.util.Map; 053 054 import javax.vecmath.Point3d; 055 056 import org.deegree.framework.log.ILogger; 057 import org.deegree.framework.log.LoggerFactory; 058 import org.deegree.framework.util.CharsetUtils; 059 import org.deegree.framework.util.MimeTypeMapper; 060 import org.deegree.framework.util.StringTools; 061 import org.deegree.framework.util.TimeTools; 062 import org.deegree.i18n.Messages; 063 import org.deegree.model.crs.CRSFactory; 064 import org.deegree.model.crs.CoordinateSystem; 065 import org.deegree.model.crs.UnknownCRSException; 066 import org.deegree.model.spatialschema.Envelope; 067 import org.deegree.model.spatialschema.GeometryFactory; 068 import org.deegree.model.spatialschema.Position; 069 import org.deegree.ogcwebservices.InconsistentRequestException; 070 import org.deegree.ogcwebservices.InvalidParameterValueException; 071 072 /** 073 * This Class handles a kvp request from a client and stores it's values. 074 * 075 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a> 076 * @author last edited by: $Author: rbezema $ 077 * 078 * @version 2.0, $Revision: 7960 $, $Date: 2007-08-09 12:01:43 +0200 (Do, 09 Aug 2007) $ 079 * 080 * @since 2.0 081 */ 082 public class GetView extends WPVSRequestBase { 083 084 /** 085 * 086 */ 087 private static final long serialVersionUID = 3147456903146907261L; 088 089 private static final ILogger LOG = LoggerFactory.getLogger( GetView.class ); 090 091 private final List<String> datasets; 092 093 private double quality; 094 095 /** 096 * using deegree's Position 097 */ 098 private final Point3d pointOfInterest; 099 100 private double pitch; 101 102 private double yaw; 103 104 private double roll; 105 106 private double distance; 107 108 private double angleOfView; 109 110 private final boolean transparent; 111 112 private final Dimension imageDimension; 113 114 private final String outputFormat; 115 116 private final Color backgroundColor; 117 118 private final String exceptionFormat; 119 120 private final String elevationModel; 121 122 private final Envelope boundingBox; 123 124 private final CoordinateSystem crs; 125 126 private double farClippingPlane; 127 128 private GetView( String version, String id, List<String> datasets, String elevationModel, 129 double quality, Position pointOfInterest, Envelope bbox, CoordinateSystem crs, 130 double pitch, double yaw, double roll, double distance, double angleOfView, 131 String outputFormat, Color backgroundColor, boolean transparent, 132 Dimension imageDimension, String exceptionFormat, double farClippingPlane, 133 Map<String, String> vendorSpecificParameter ) { 134 this( 135 version, 136 id, 137 datasets, 138 elevationModel, 139 quality, 140 new Point3d( pointOfInterest.getX(), pointOfInterest.getY(), pointOfInterest.getZ() ), 141 bbox, crs, pitch, yaw, roll, distance, angleOfView, outputFormat, backgroundColor, 142 transparent, imageDimension, exceptionFormat, farClippingPlane, 143 vendorSpecificParameter ); 144 } 145 146 /** 147 * Trusted constructor. No parameter validity is performed. This is delegated to the factory 148 * method createGeMap. 149 * 150 * TODO the list of pars is too long, should break up into smaller classes, e.g. pars for 151 * perspective output, etc. 152 * 153 * @param version 154 * @param id 155 * @param datasets 156 * @param elevationModel 157 * @param quality 158 * @param pointOfInterest 159 * @param bbox 160 * @param crs 161 * @param pitch 162 * @param yaw 163 * @param roll 164 * @param distance 165 * @param angleOfView 166 * @param outputFormat 167 * @param backgroundColor 168 * @param transparent 169 * @param imageDimension 170 * @param exceptionFormat 171 * @param farClippingPlane 172 * @param vendorSpecificParameter 173 */ 174 private GetView( String version, String id, List<String> datasets, String elevationModel, 175 double quality, Point3d pointOfInterest, Envelope bbox, CoordinateSystem crs, 176 double pitch, double yaw, double roll, double distance, double angleOfView, 177 String outputFormat, Color backgroundColor, boolean transparent, 178 Dimension imageDimension, String exceptionFormat, double farClippingPlane, 179 Map<String, String> vendorSpecificParameter ) { 180 super( version, id, vendorSpecificParameter ); 181 this.datasets = datasets; 182 this.elevationModel = elevationModel; 183 184 this.quality = quality; 185 this.pointOfInterest = pointOfInterest; 186 this.boundingBox = bbox; 187 this.crs = crs; 188 this.pitch = pitch; 189 this.yaw = yaw; 190 this.roll = roll; 191 this.distance = distance; 192 this.angleOfView = angleOfView; 193 this.outputFormat = outputFormat; 194 this.backgroundColor = backgroundColor; 195 this.transparent = transparent; 196 this.imageDimension = imageDimension; 197 this.exceptionFormat = exceptionFormat; 198 this.farClippingPlane = farClippingPlane; 199 200 } 201 202 /** 203 * Factory method to create an instance of GetView from teh parameters in <code>model</code> 204 * 205 * @param requestParams 206 * a map containing request parameters and values 207 * @return a new instance of GetView 208 * @throws InconsistentRequestException 209 * if a mandatory parameter is missing 210 * @throws InvalidParameterValueException 211 * if a parameter has an illegal value 212 */ 213 public static GetView create( Map<String, String> requestParams ) 214 throws InconsistentRequestException, InvalidParameterValueException { 215 216 // TODO throw a proper exception, the InconsistentRequestException doesn't cover all cases 217 218 // not needed anymore 219 requestParams.remove( "REQUEST" ); 220 221 String id = requestParams.remove( "ID" ); 222 223 /* 224 * TODO check if this is right WPVSConfiguration configuration = (WPVSConfiguration) 225 * model.remove( "CAPABILITIES" ); if ( configuration == null ){ throw new RuntimeException ( 226 * "Working site: you forgot to add config to model -> " + "see how this is done in wms" ); } 227 */ 228 229 String version = requestParams.remove( "VERSION" ); 230 if ( version == null ) { 231 throw new InconsistentRequestException( "'VERSION' value must be set" ); 232 } 233 234 // FORMAT 235 String format = requestParams.remove( "OUTPUTFORMAT" ); 236 if ( format == null ) { 237 throw new InconsistentRequestException( "OUTPUTFORMAT value must be set" ); 238 } 239 try { 240 format = URLDecoder.decode( format, CharsetUtils.getSystemCharset() ); 241 } catch ( UnsupportedEncodingException e1 ) { 242 LOG.logError( e1.getLocalizedMessage(), e1 ); 243 } 244 if ( !MimeTypeMapper.isKnownImageType( format ) ) { 245 throw new InvalidParameterValueException( 246 StringTools.concat( 50, format, 247 " is not a valid image/result format" ) ); 248 } 249 250 // TRANSPARENCY 251 boolean transparency = false; 252 String tp = requestParams.remove( "TRANSPARENT" ); 253 if ( tp != null ) { 254 transparency = tp.toUpperCase().trim().equals( "TRUE" ); 255 } 256 257 if ( transparency 258 && ( format.equals( "image/jpg" ) || format.equals( "image/jpeg" ) 259 || format.equals( "image/bmp" ) || format.equals( "image/tif" ) || format.equals( "image/tiff" ) ) ) { 260 261 throw new InconsistentRequestException( 262 StringTools.concat( 263 100, 264 "TRANSPARENCY=true is inconsistent with OUTPUTFORMAT=", 265 format, 266 ".Valid transparent formats are 'image/gif' ", 267 "and 'image/png'." ) ); 268 } 269 270 // width 271 String tmp = requestParams.remove( "WIDTH" ); 272 if ( tmp == null ) { 273 throw new InconsistentRequestException( "'WIDTH' value must be set" ); 274 } 275 int width = 0; 276 try { 277 width = Integer.parseInt( tmp ); 278 } catch ( NumberFormatException e ) { 279 throw new InconsistentRequestException( "WIDTH must be a valid integer number" ); 280 } 281 282 tmp = requestParams.remove( "HEIGHT" ); 283 if ( tmp == null ) { 284 throw new InconsistentRequestException( "'HEIGHT' value must be set" ); 285 } 286 int height = 0; 287 try { 288 height = Integer.parseInt( tmp ); 289 } catch ( NumberFormatException e ) { 290 throw new InconsistentRequestException( "HEIGHT must be a valid integer number" ); 291 } 292 293 if ( width < 0 || height < 0 ) { 294 throw new InconsistentRequestException( "WIDTH and HEIGHT must be >= 0" ); 295 } 296 Dimension imgDimension = new Dimension( width, height ); 297 298 Color bgColor = Color.white; 299 300 tmp = requestParams.remove( "BACKGROUNDCOLOR" ); 301 if ( tmp != null ) { 302 try { 303 bgColor = Color.decode( tmp ); 304 } catch ( NumberFormatException e ) { 305 throw new InconsistentRequestException( 306 StringTools.concat( 307 100, 308 "The BACKGROUNDCOLOR '", 309 tmp, 310 "' does not denote a valid hexadecimal color." ) ); 311 } 312 } 313 314 String elevModel = requestParams.remove( "ELEVATIONMODEL" ); 315 /* 316 * if ( elevModel == null ) { throw new InconsistentRequestException( "'ELEVATIONMODEL' 317 * value must be set" ); } 318 */ 319 if ( elevModel != null ) { 320 elevModel = elevModel.trim(); 321 if ( elevModel.length() == 0 ) { 322 throw new InconsistentRequestException( 323 "ELEVATIONMODEL cannot contain space characters only or be empty" ); 324 } 325 } 326 327 tmp = requestParams.remove( "AOV" ); 328 if ( tmp == null ) { 329 throw new InconsistentRequestException( "'AOV' value must be set" ); 330 } 331 332 double aov = 0; 333 try { 334 aov = Math.toRadians( Double.parseDouble( tmp ) ); 335 /** 336 * checking for > 0 || < 90 337 */ 338 if ( ( aov <= 0 ) || ( aov >= 1.5707963265 ) ) { 339 throw new InvalidParameterValueException( 340 "AOV value must be a number between 0° and 180°" ); 341 } 342 } catch ( NumberFormatException e ) { 343 LOG.logError( e.getLocalizedMessage(), e ); 344 throw new InvalidParameterValueException( "AOV couldn't parse the aov value" ); 345 } 346 347 tmp = requestParams.remove( "ROLL" ); 348 if ( tmp == null ) { 349 throw new InconsistentRequestException( "'ROLL' value must be set" ); 350 } 351 double roll; 352 try { 353 /** 354 * checking for > 360 && < 360 355 */ 356 roll = Double.parseDouble( tmp ) % 360; 357 if ( roll < 0 ) 358 roll += 360; 359 roll = Math.toRadians( roll ); 360 } catch ( NumberFormatException e ) { 361 LOG.logError( e.getLocalizedMessage(), e ); 362 throw new InvalidParameterValueException( "ROLL value must be a number" ); 363 } 364 365 tmp = requestParams.remove( "DISTANCE" ); 366 if ( tmp == null ) { 367 throw new InconsistentRequestException( "'DISTANCE' value must be set." ); 368 } 369 370 double distance; 371 String mesg = "DISTANCE must be a number >= 0."; 372 try { 373 distance = Double.parseDouble( tmp ); 374 if ( distance < 0 ) { 375 throw new InvalidParameterValueException( mesg ); 376 } 377 } catch ( NumberFormatException e ) { 378 LOG.logError( e.getLocalizedMessage(), e ); 379 throw new InvalidParameterValueException( mesg ); 380 } 381 382 tmp = requestParams.remove( "PITCH" ); 383 if ( tmp == null ) { 384 throw new InconsistentRequestException( "'PITCH' value must be set." ); 385 } 386 double pitch = 0; 387 try { 388 pitch = Math.toRadians( Double.parseDouble( tmp ) ); 389 if ( ( pitch < -1.570796327 ) || ( pitch > 1.570796327 ) ) { 390 throw new InvalidParameterValueException( 391 "PITCH value must be a number between -90° and 90°" ); 392 } 393 } catch ( NumberFormatException e ) { 394 LOG.logError( e.getLocalizedMessage(), e ); 395 throw new InvalidParameterValueException( 396 "PITCH value must be a number between -90° and 90°" ); 397 } 398 399 tmp = requestParams.remove( "YAW" ); 400 if ( tmp == null ) { 401 throw new InconsistentRequestException( "'YAW' value must be set." ); 402 } 403 double yaw; 404 try { 405 double tmpYaw = Double.parseDouble( tmp ) % 360; 406 if ( tmpYaw < 0 ) 407 tmpYaw += 360; 408 // YAW == 270 -> OutOfMem Error 409 // if ( tmpYaw > 89.5 && tmpYaw < 90.5 ) { 410 // tmpYaw = 91; 411 // } else if ( tmpYaw > 269.5 && tmpYaw < 270.5 ) { 412 // tmpYaw = 271; 413 // } 414 // [UT] 06.06.2005 splitter doesn't work fine for 0 (or 360) and 180 415 // if ( tmpYaw % 180 == 0 ) { 416 // tmpYaw += 0.5; 417 // } 418 yaw = Math.toRadians( tmpYaw ); 419 420 } catch ( NumberFormatException e ) { 421 LOG.logError( e.getLocalizedMessage(), e ); 422 throw new InvalidParameterValueException( "YAW value must be a number" ); 423 } 424 425 tmp = requestParams.remove( "POI" ); 426 if ( tmp == null ) { 427 throw new InconsistentRequestException( "POI value is missing." ); 428 } 429 mesg = "POI value must denote a number tuple with valid x,y,z values, for example '123.45,678.90,456.123'"; 430 431 try { 432 tmp = URLDecoder.decode( tmp, CharsetUtils.getSystemCharset() ); 433 } catch ( UnsupportedEncodingException e ) { 434 LOG.logError( e.getLocalizedMessage(), e ); 435 throw new InconsistentRequestException( e.getLocalizedMessage() ); 436 } 437 String[] xyz = tmp.split( "," ); 438 if ( xyz.length != 3 ) { 439 throw new InvalidParameterValueException( mesg ); 440 } 441 Position poi; 442 double[] p = new double[3]; 443 try { 444 p[0] = Double.parseDouble( xyz[0] ); 445 p[1] = Double.parseDouble( xyz[1] ); 446 p[2] = Double.parseDouble( xyz[2] ); 447 448 } catch ( NumberFormatException e ) { 449 LOG.logError( e.getLocalizedMessage(), e ); 450 throw new InvalidParameterValueException( mesg ); 451 } 452 poi = GeometryFactory.createPosition( p ); 453 454 String crsString = requestParams.remove( "CRS" ); 455 CoordinateSystem crs = null; 456 if ( crsString == null ) { 457 throw new InconsistentRequestException( "CRS parameter is missing." ); 458 } 459 try { 460 crsString = URLDecoder.decode( crsString, CharsetUtils.getSystemCharset() ); 461 crs = CRSFactory.create( crsString ); 462 } catch ( UnsupportedEncodingException e ) { 463 LOG.logError( e.getLocalizedMessage(), e ); 464 } catch ( UnknownCRSException ucrse ) { 465 LOG.logError( ucrse.getLocalizedMessage(), ucrse ); 466 throw new InvalidParameterValueException( ucrse.getMessage() ); 467 } 468 469 String datasetsString = requestParams.remove( "DATASETS" ); 470 if ( datasetsString == null ) { 471 throw new InconsistentRequestException( "'DATASETS' value must be set" ); 472 } 473 474 datasetsString = datasetsString.trim(); 475 if ( datasetsString.length() == 0 ) { 476 throw new InconsistentRequestException( 477 "'DATASETS' cannot contain space characters only or be empty" ); 478 } 479 480 String[] datasets = datasetsString.split( "," ); 481 if ( datasetsString.length() == 0 ) { 482 throw new InconsistentRequestException( 483 "'DATASETS' must contain at least one dataset name" ); 484 } 485 List<String> datasetList = new ArrayList<String>( datasets.length ); 486 for ( String dataset : datasets ) { 487 datasetList.add( dataset.trim() ); 488 } 489 490 String boxstring = requestParams.remove( "BOUNDINGBOX" ); 491 Envelope boundingBox = null; 492 if ( boxstring == null ) { 493 throw new InconsistentRequestException( "BOUNDINGBOX value must be set" ); 494 } 495 496 try { 497 boxstring = URLDecoder.decode( boxstring, CharsetUtils.getSystemCharset() ); 498 } catch ( UnsupportedEncodingException e ) { 499 LOG.logError( e.getLocalizedMessage(), e ); 500 throw new InconsistentRequestException( 501 StringTools.concat( 502 100, 503 "Cannot decode BOUNDINGBOX: '", 504 boxstring, 505 " using ", 506 CharsetUtils.getSystemCharset() ) ); 507 } 508 509 String[] tokens = boxstring.split( "," ); 510 if ( tokens.length != 4 ) { 511 throw new InconsistentRequestException( 512 "BOUNDINGBOX value must have a value such as xmin,ymin,xmax,ymax" ); 513 } 514 515 double minx; 516 double maxx; 517 double miny; 518 double maxy; 519 try { 520 minx = Double.parseDouble( tokens[0] ); 521 miny = Double.parseDouble( tokens[1] ); 522 maxx = Double.parseDouble( tokens[2] ); 523 maxy = Double.parseDouble( tokens[3] ); 524 } catch ( NumberFormatException e ) { 525 LOG.logError( e.getLocalizedMessage(), e ); 526 throw new InconsistentRequestException( "BOUNDINGBOX has an illegal value: " 527 + e.getMessage() ); 528 } 529 530 if ( minx >= maxx ) { 531 throw new InvalidParameterValueException( "minx must be less than maxx" ); 532 } 533 534 if ( miny >= maxy ) { 535 throw new InvalidParameterValueException( "miny must be less than maxy" ); 536 } 537 538 boundingBox = GeometryFactory.createEnvelope( minx, miny, maxx, maxy, crs ); 539 540 /** 541 * Doing some checking of the given request parameters. 542 */ 543 544 if ( !boundingBox.contains( poi ) ) { 545 throw new InconsistentRequestException( "POI (" + poi 546 + " )must be inside the Bounding box (" 547 + boundingBox + ")" ); 548 } 549 550 tmp = requestParams.remove( "FARCLIPPINGPLANE" ); 551 double farClippingPlane = 150000; 552 if ( tmp != null ) { 553 try { 554 farClippingPlane = Double.parseDouble( tmp ); 555 } catch ( NumberFormatException e ) { 556 LOG.logError( e.getLocalizedMessage(), e ); 557 throw new InvalidParameterValueException( "FarClippingPlane must be a number" ); 558 } 559 } 560 561 tmp = requestParams.remove( "QUALITY" ); 562 double quality = 1f; 563 if ( tmp != null ) { 564 try { 565 quality = Double.parseDouble( tmp ); 566 } catch ( NumberFormatException e ) { 567 LOG.logError( e.getLocalizedMessage(), e ); 568 throw new InvalidParameterValueException( "QUALITY must have a value between [0,1]" ); 569 } 570 } 571 572 String exceptions = requestParams.remove( "EXCEPTIONFORMAT" ); 573 if ( exceptions == null ) { 574 exceptions = "XML"; 575 } 576 577 // Shouldn't this be checked for the right value ??? 578 tmp = requestParams.remove( "DATETIME" ); 579 if ( tmp == null ) { 580 // when the moon is in the second house, 581 // and jupiter aligns with mars. 582 // -> dawning of the age of the wpvs 583 tmp = "2007-03-21T12:00:00"; 584 } else { 585 try { 586 TimeTools.createCalendar( tmp ); 587 } catch ( NumberFormatException nfe ) { 588 throw new InvalidParameterValueException( 589 Messages.getMessage( "WPVS_GETVIEW_ILLEGAL_DATETIME", tmp) ); 590 } 591 } 592 593 // org.deegree.framework.util.TimeTools.createCalendar( tmp ); 594 595 requestParams.put( "DATETIME", tmp ); 596 597 tmp = requestParams.remove( "SCALE" ); 598 if ( tmp != null ) { 599 try { 600 Double.parseDouble( tmp ); 601 requestParams.put( "SCALE", tmp ); 602 } catch ( NumberFormatException e ) { 603 LOG.logError( e.getLocalizedMessage(), e ); 604 throw new InvalidParameterValueException( e ); 605 } 606 } 607 608 return new GetView( version, id, datasetList, elevModel, quality, poi, boundingBox, crs, 609 pitch, yaw, roll, distance, aov, format, bgColor, transparency, 610 imgDimension, exceptions, farClippingPlane, requestParams ); 611 } 612 613 /** 614 * @return the requested angleOfView 615 */ 616 public double getAngleOfView() { 617 return angleOfView; 618 } 619 620 /** 621 * @return the requested distance to the poi 622 */ 623 public double getDistance() { 624 return distance; 625 } 626 627 /** 628 * @return the requested dimension of the resultimage 629 */ 630 public Dimension getImageDimension() { 631 return imageDimension; 632 } 633 634 /** 635 * @return the requested pitch (rotation around the x-axis) 636 */ 637 public double getPitch() { 638 return pitch; 639 } 640 641 /** 642 * 643 * @return the point of interest as Point3d 644 */ 645 public Point3d getPointOfInterest() { 646 return pointOfInterest; 647 } 648 649 /** 650 * @return the quality of the textures 651 */ 652 public double getQuality() { 653 return quality; 654 } 655 656 /** 657 * @return the requested roll (rotation around the y-axis) 658 */ 659 public double getRoll() { 660 return roll; 661 } 662 663 /** 664 * @return if the resultimage should be transparent 665 */ 666 public boolean isTransparent() { 667 return transparent; 668 } 669 670 /** 671 * @return the requested yaw (rotation around the z-axis) 672 */ 673 public double getYaw() { 674 return yaw; 675 } 676 677 /** 678 * @return the requested datasets (e.g. layers or features etc.) 679 */ 680 public List<String> getDatasets() { 681 return datasets; 682 } 683 684 /** 685 * @return the requested color of the background 686 */ 687 public Color getBackgroundColor() { 688 return backgroundColor; 689 } 690 691 /** 692 * @return the requested format of thrown exceptions 693 */ 694 public String getExceptionFormat() { 695 return exceptionFormat; 696 } 697 698 /** 699 * @return the mimetype of the resultimage 700 */ 701 public String getOutputFormat() { 702 return outputFormat; 703 } 704 705 /** 706 * @return the boundingbox of the request 707 */ 708 public Envelope getBoundingBox() { 709 return boundingBox; 710 } 711 712 /** 713 * @return the Coordinate System of the request 714 */ 715 public CoordinateSystem getCrs() { 716 return crs; 717 } 718 719 /** 720 * @return the elevationmodel to be used. 721 */ 722 public String getElevationModel() { 723 return elevationModel; 724 } 725 726 /** 727 * @return Returns the farClippingPlane. 728 */ 729 public double getFarClippingPlane() { 730 return farClippingPlane; 731 } 732 733 /** 734 * @param farClippingPlane 735 * another clippingPlane distance. 736 */ 737 public void setFarClippingPlane( double farClippingPlane ) { 738 this.farClippingPlane = farClippingPlane; 739 } 740 741 /** 742 * @param pitch 743 * a new pitch value 744 */ 745 public void setPitch( double pitch ) { 746 this.pitch = pitch; 747 } 748 749 /** 750 * @param distance 751 * An other distance value. 752 */ 753 public void setDistance( double distance ) { 754 this.distance = distance; 755 } 756 757 /** 758 * @param yaw 759 * An other yaw value. 760 */ 761 public void setYaw( double yaw ) { 762 this.yaw = yaw; 763 } 764 765 /** 766 * @param angleOfView 767 * An other angleOfView value. 768 */ 769 public void setAngleOfView( double angleOfView ) { 770 this.angleOfView = angleOfView; 771 } 772 }