001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/ogcwebservices/wpvs/configuration/RenderingConfiguration.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/exse/ 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 Aennchenstrasse 19 030 53177 Bonn 031 Germany 032 E-Mail: poth@lat-lon.de 033 034 Jens Fitzke 035 lat/lon GmbH 036 Aennchenstrasse 19 037 53177 Bonn 038 Germany 039 E-Mail: jens.fitzke@uni-bonn.de 040 041 ---------------------------------------------------------------------------*/ 042 043 package org.deegree.ogcwebservices.wpvs.configuration; 044 045 import java.awt.image.BufferedImage; 046 import java.io.IOException; 047 import java.io.InputStream; 048 import java.util.Properties; 049 050 import javax.media.j3d.ColoringAttributes; 051 import javax.media.j3d.PolygonAttributes; 052 import javax.media.j3d.Texture; 053 import javax.media.j3d.TextureAttributes; 054 import javax.media.j3d.Transform3D; 055 import javax.vecmath.Color4f; 056 057 import org.deegree.framework.log.ILogger; 058 import org.deegree.framework.log.LoggerFactory; 059 import org.deegree.i18n.Messages; 060 061 import com.sun.j3d.utils.image.TextureLoader; 062 063 /** 064 * The <code>RenderingConfiguration</code> class is a simple wrapper to retrieve the configuration 065 * of the rendering options. 066 * 067 * @author <a href="mailto:bezema@lat-lon.de">Rutger Bezema</a> 068 * 069 * @author last edited by: $Author: bezema $ 070 * 071 * @version $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $ 072 * 073 */ 074 075 public final class RenderingConfiguration { 076 private static ILogger LOG = LoggerFactory.getLogger( RenderingConfiguration.class ); 077 078 private static RenderingConfiguration renderConfig; 079 080 private final TextureAttributes textureAttributes; 081 082 private final ColoringAttributes coloringAttributes; 083 084 private final PolygonAttributes terrainPolygonAttributes; 085 086 private final PolygonAttributes surfacePolygonAttributes; 087 088 /** 089 * The renderingOptions defined in a file called rendering_options.properties 090 */ 091 private final Properties renderingOptions; 092 093 private final String propertieFile = "rendering_options.properties"; 094 095 private RenderingConfiguration() { 096 // Singleton pattern 097 renderingOptions = new Properties(); 098 try { 099 InputStream renderingProps = RenderingConfiguration.class.getResourceAsStream( "/" 100 + propertieFile ); 101 if ( renderingProps == null ) { 102 renderingProps = RenderingConfiguration.class.getResourceAsStream( propertieFile ); 103 } 104 renderingOptions.load( renderingProps ); 105 } catch ( IOException e ) { 106 LOG.logError( e.getMessage(), e ); 107 } 108 109 this.textureAttributes = createTextureAttributes(); 110 this.coloringAttributes = createColoringAttributes(); 111 this.terrainPolygonAttributes = createTerrainPolygonAttributes(); 112 this.surfacePolygonAttributes = createSurfacePolygonAttributes(); 113 } 114 115 /** 116 * @return the configured PolygonAttributes for surfaces 117 */ 118 private PolygonAttributes createSurfacePolygonAttributes() { 119 PolygonAttributes targetPolyAttr = new PolygonAttributes(); 120 targetPolyAttr.setCapability( PolygonAttributes.ALLOW_MODE_READ ); 121 targetPolyAttr.setCapability( PolygonAttributes.ALLOW_CULL_FACE_READ ); 122 targetPolyAttr.setCapability( PolygonAttributes.ALLOW_NORMAL_FLIP_READ ); 123 targetPolyAttr.setPolygonMode( PolygonAttributes.POLYGON_FILL ); 124 125 // finding a configured backface flip property 126 String configuredProperty = (String) renderingOptions.get( "surface_backflip" ); 127 if ( configuredProperty != null ) { 128 configuredProperty = configuredProperty.trim(); 129 if ( "TRUE".equalsIgnoreCase( configuredProperty ) 130 || "1".equalsIgnoreCase( configuredProperty ) 131 || "yes".equalsIgnoreCase( configuredProperty ) ) { 132 targetPolyAttr.setBackFaceNormalFlip( true ); 133 } else if ( "false".equalsIgnoreCase( configuredProperty ) 134 || "0".equalsIgnoreCase( configuredProperty ) 135 || "no".equalsIgnoreCase( configuredProperty ) ) { 136 targetPolyAttr.setBackFaceNormalFlip( false ); 137 } else { 138 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 139 "surface_backflip", configuredProperty, 140 "false" ) ); 141 targetPolyAttr.setBackFaceNormalFlip( false ); 142 } 143 144 } 145 146 int configuredValue = PolygonAttributes.CULL_NONE; 147 // finding a configured surface culling 148 configuredProperty = (String) renderingOptions.get( "surface_culling" ); 149 if ( configuredProperty != null ) { 150 configuredProperty = configuredProperty.trim(); 151 if ( "BACK".equalsIgnoreCase( configuredProperty ) ) { 152 configuredValue = PolygonAttributes.CULL_BACK; 153 } else if ( "FRONT".equalsIgnoreCase( configuredProperty ) ) { 154 configuredValue = PolygonAttributes.CULL_FRONT; 155 } else if ( "NONE".equalsIgnoreCase( configuredProperty ) ) { 156 configuredValue = PolygonAttributes.CULL_NONE; 157 } else { 158 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 159 "surface_culling", configuredProperty, "NONE" ) ); 160 } 161 } 162 targetPolyAttr.setCullFace( configuredValue ); 163 return targetPolyAttr; 164 165 } 166 167 /** 168 * @return the configured Polygon Attributes for the dgm (terrain) 169 */ 170 private PolygonAttributes createTerrainPolygonAttributes() { 171 // what kind of drawing 172 PolygonAttributes targetPolyAttr = new PolygonAttributes(); 173 targetPolyAttr.setPolygonMode( PolygonAttributes.POLYGON_FILL ); 174 175 // finding a configured backface flip property 176 String configuredProperty = (String) renderingOptions.get( "terrain_backflip" ); 177 if ( configuredProperty != null ) { 178 configuredProperty = configuredProperty.trim(); 179 if ( "true".equalsIgnoreCase( configuredProperty ) 180 || "1".equalsIgnoreCase( configuredProperty ) 181 || "yes".equalsIgnoreCase( configuredProperty ) ) { 182 targetPolyAttr.setBackFaceNormalFlip( true ); 183 } else if ( "false".equalsIgnoreCase( configuredProperty ) 184 || "0".equalsIgnoreCase( configuredProperty ) 185 || "no".equalsIgnoreCase( configuredProperty ) ) { 186 targetPolyAttr.setBackFaceNormalFlip( false ); 187 } else { 188 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 189 "terrain_backflip", configuredProperty, 190 "false" ) ); 191 192 } 193 } 194 195 int configuredValue = PolygonAttributes.CULL_NONE; 196 // finding a configured surface culling 197 configuredProperty = (String) renderingOptions.get( "terrain_culling" ); 198 if ( configuredProperty != null ) { 199 configuredProperty = configuredProperty.trim(); 200 if ( "BACK".equalsIgnoreCase( configuredProperty ) ) { 201 configuredValue = PolygonAttributes.CULL_BACK; 202 } else if ( "FRONT".equalsIgnoreCase( configuredProperty ) ) { 203 configuredValue = PolygonAttributes.CULL_FRONT; 204 } else if ( "NONE".equalsIgnoreCase( configuredProperty ) ) { 205 configuredValue = PolygonAttributes.CULL_NONE; 206 } else { 207 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 208 "terrain_culling", configuredProperty, "NONE" ) ); 209 } 210 } 211 targetPolyAttr.setCullFace( configuredValue ); 212 return targetPolyAttr; 213 } 214 215 /** 216 * @return the conifured coloring attributes 217 */ 218 private ColoringAttributes createColoringAttributes() { 219 // and some Coloring attribs 220 // the coloring attributes 221 ColoringAttributes ca = new ColoringAttributes(); 222 int configuredValue = ColoringAttributes.SHADE_GOURAUD; 223 // finding a configured shading model 224 String configuredProperty = (String) renderingOptions.get( "shading_model" ); 225 if ( configuredProperty != null ) { 226 configuredProperty = configuredProperty.trim(); 227 if ( "SHADE_FLAT".equalsIgnoreCase( configuredProperty ) ) { 228 configuredValue = ColoringAttributes.SHADE_FLAT; 229 } else if ( "SHADE_GOURAUD".equalsIgnoreCase( configuredProperty ) ) { 230 configuredValue = ColoringAttributes.SHADE_GOURAUD; 231 } else { 232 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 233 "shading_model", configuredProperty, 234 "SHADE_GOURAUD" ) ); 235 236 } 237 238 } 239 ca.setShadeModel( configuredValue ); 240 241 configuredValue = ColoringAttributes.NICEST; 242 // finding a configured shading model quality 243 configuredProperty = (String) renderingOptions.get( "shading_quality" ); 244 if ( configuredProperty != null ) { 245 configuredProperty = configuredProperty.trim(); 246 if ( "FASTEST".equalsIgnoreCase( configuredProperty ) ) { 247 configuredValue = ColoringAttributes.FASTEST; 248 } else if ( "NICEST".equalsIgnoreCase( configuredProperty ) ) { 249 configuredValue = ColoringAttributes.NICEST; 250 } else { 251 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 252 "shading_quality", configuredProperty, 253 "NICEST" ) ); 254 } 255 } 256 ca.setCapability( configuredValue ); 257 return ca; 258 } 259 260 /** 261 * @return the configured textureAttributes 262 */ 263 private TextureAttributes createTextureAttributes() { 264 int blendFunc = TextureAttributes.MODULATE; 265 // finding a configured blending function 266 String configuredProperty = (String) renderingOptions.get( "blend_function" ); 267 if ( configuredProperty != null ) { 268 configuredProperty = configuredProperty.trim(); 269 if ( "BLEND".equalsIgnoreCase( configuredProperty ) ) { 270 blendFunc = TextureAttributes.BLEND; 271 } else if ( "DECAL".equalsIgnoreCase( configuredProperty ) ) { 272 blendFunc = TextureAttributes.DECAL; 273 } else if ( "COMBINE".equalsIgnoreCase( configuredProperty ) ) { 274 blendFunc = TextureAttributes.COMBINE; 275 } else if ( "MODULATE".equalsIgnoreCase( configuredProperty ) ) { 276 blendFunc = TextureAttributes.MODULATE; 277 } else { 278 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 279 "blend_function", configuredProperty, 280 "MODULATE" ) ); 281 } 282 } 283 Color4f blendColor = new Color4f( 0, 0, 0, 0 ); 284 if ( blendFunc == TextureAttributes.BLEND ) { 285 configuredProperty = (String) renderingOptions.get( "blend_color" ); 286 if ( configuredProperty != null ) { 287 String[] split = configuredProperty.trim().split( "," ); 288 if ( split != null && split.length == 4 ) { 289 try { 290 float r = Float.parseFloat( split[0] ); 291 float g = Float.parseFloat( split[1] ); 292 float b = Float.parseFloat( split[2] ); 293 float a = Float.parseFloat( split[3] ); 294 blendColor = new Color4f( r, g, b, a ); 295 } catch ( NumberFormatException nfe ) { 296 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 297 "blend_color", configuredProperty, 298 "0,0,0,0" ) ); 299 } 300 } else { 301 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 302 "blend_color", configuredProperty, 303 "0,0,0,0" ) ); 304 } 305 } 306 } 307 308 int persCorrection = TextureAttributes.NICEST; 309 configuredProperty = (String) renderingOptions.get( "terrain_texture_perspective_correction" ); 310 if ( configuredProperty != null ) { 311 configuredProperty = configuredProperty.trim(); 312 if ( "FASTEST".equalsIgnoreCase( configuredProperty ) ) { 313 persCorrection = TextureAttributes.FASTEST; 314 } else if ( "NICEST".equalsIgnoreCase( configuredProperty ) ) { 315 persCorrection = TextureAttributes.NICEST; 316 } else { 317 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 318 "terrain_texture_perspective_correction", 319 configuredProperty, "NICEST" ) ); 320 } 321 } 322 323 TextureAttributes textureAttribs = new TextureAttributes( blendFunc, new Transform3D(), 324 blendColor, persCorrection ); 325 326 if ( TextureAttributes.COMBINE == blendFunc ) { 327 /* 328 * Get the configured Combine parametersof the texture attributes. first rgb then alpha 329 */ 330 // combineFunction type 331 int combineFunctionRGB = TextureAttributes.COMBINE_MODULATE; 332 configuredProperty = (String) renderingOptions.get( "combine_function_rgb" ); 333 if ( configuredProperty != null ) { 334 configuredProperty = configuredProperty.trim(); 335 if ( "COMBINE_REPLACE".equalsIgnoreCase( configuredProperty ) ) { 336 combineFunctionRGB = TextureAttributes.COMBINE_REPLACE; 337 } else if ( "COMBINE_ADD".equalsIgnoreCase( configuredProperty ) ) { 338 combineFunctionRGB = TextureAttributes.COMBINE_ADD; 339 } else if ( "COMBINE_ADD_SIGNED".equalsIgnoreCase( configuredProperty ) ) { 340 combineFunctionRGB = TextureAttributes.COMBINE_ADD_SIGNED; 341 } else if ( "COMBINE_SUBTRACT".equalsIgnoreCase( configuredProperty ) ) { 342 combineFunctionRGB = TextureAttributes.COMBINE_SUBTRACT; 343 } else if ( "COMBINE_INTERPOLATE".equalsIgnoreCase( configuredProperty ) ) { 344 combineFunctionRGB = TextureAttributes.COMBINE_INTERPOLATE; 345 } else if ( "COMBINE_DOT3".equalsIgnoreCase( configuredProperty ) ) { 346 combineFunctionRGB = TextureAttributes.COMBINE_DOT3; 347 } else if ( "COMBINE_MODULATE".equalsIgnoreCase( configuredProperty ) ) { 348 combineFunctionRGB = TextureAttributes.COMBINE_MODULATE; 349 } else { 350 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 351 "combine_function_rbg", 352 configuredProperty, "COMBINE_MODULATE" ) ); 353 } 354 } 355 textureAttribs.setCombineRgbMode( combineFunctionRGB ); 356 357 int combineFunctionAlpha = TextureAttributes.COMBINE_MODULATE; 358 configuredProperty = (String) renderingOptions.get( "combine_function_alpha" ); 359 if ( configuredProperty != null ) { 360 configuredProperty = configuredProperty.trim(); 361 if ( "COMBINE_REPLACE".equalsIgnoreCase( configuredProperty ) ) { 362 combineFunctionAlpha = TextureAttributes.COMBINE_REPLACE; 363 } else if ( "COMBINE_ADD".equalsIgnoreCase( configuredProperty ) ) { 364 combineFunctionAlpha = TextureAttributes.COMBINE_ADD; 365 } else if ( "COMBINE_ADD_SIGNED".equalsIgnoreCase( configuredProperty ) ) { 366 combineFunctionAlpha = TextureAttributes.COMBINE_ADD_SIGNED; 367 } else if ( "COMBINE_SUBTRACT".equalsIgnoreCase( configuredProperty ) ) { 368 combineFunctionAlpha = TextureAttributes.COMBINE_SUBTRACT; 369 } else if ( "COMBINE_INTERPOLATE".equalsIgnoreCase( configuredProperty ) ) { 370 combineFunctionAlpha = TextureAttributes.COMBINE_INTERPOLATE; 371 } else if ( "COMBINE_DOT3".equalsIgnoreCase( configuredProperty ) ) { 372 combineFunctionAlpha = TextureAttributes.COMBINE_DOT3; 373 } else if ( "COMBINE_MODULATE".equalsIgnoreCase( configuredProperty ) ) { 374 combineFunctionAlpha = TextureAttributes.COMBINE_MODULATE; 375 } else { 376 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 377 "combine_function_alpha", 378 configuredProperty, "COMBINE_MODULATE" ) ); 379 } 380 } 381 textureAttribs.setCombineAlphaMode( combineFunctionAlpha ); 382 383 // Combine source Color configuration 384 int combineColorSourceRGB = TextureAttributes.COMBINE_TEXTURE_COLOR; 385 for ( int i = 0; ++i < 3; ) { 386 if ( i == 1 ) { 387 combineColorSourceRGB = TextureAttributes.COMBINE_PREVIOUS_TEXTURE_UNIT_STATE; 388 } else if ( i == 2 ) { 389 combineColorSourceRGB = TextureAttributes.COMBINE_CONSTANT_COLOR; 390 } 391 String propertyString = "combine_color_source_rgb_" + i; 392 configuredProperty = (String) renderingOptions.get( propertyString ); 393 if ( configuredProperty != null ) { 394 configuredProperty = configuredProperty.trim(); 395 if ( "COMBINE_TEXTURE_COLOR".equalsIgnoreCase( configuredProperty ) ) { 396 combineColorSourceRGB = TextureAttributes.COMBINE_TEXTURE_COLOR; 397 } else if ( "COMBINE_CONSTANT_COLOR".equalsIgnoreCase( configuredProperty ) ) { 398 combineColorSourceRGB = TextureAttributes.COMBINE_CONSTANT_COLOR; 399 } else if ( "COMBINE_PREVIOUS_TEXTURE_UNIT_STATE".equalsIgnoreCase( configuredProperty ) ) { 400 combineColorSourceRGB = TextureAttributes.COMBINE_PREVIOUS_TEXTURE_UNIT_STATE; 401 } else if ( "COMBINE_OBJECT_COLOR".equalsIgnoreCase( configuredProperty ) ) { 402 combineColorSourceRGB = TextureAttributes.COMBINE_OBJECT_COLOR; 403 } else { 404 LOG.logWarning( Messages.getMessage( 405 "WPVS_UNKNOWN_RENDERING_PROPERTY", 406 propertyString, 407 configuredProperty, 408 ( ( i == 0 ) ? "COMBINE_MODULATE" 409 : ( ( i == 1 ) ? "COMBINE_PREVIOUS_TEXTURE_UNIT_STATE" 410 : "COMBINE_CONSTANT_COLOR" ) ) ) ); 411 } 412 413 } 414 textureAttribs.setCombineRgbSource( i, combineColorSourceRGB ); 415 } 416 417 int combineColorSourceAlpha = TextureAttributes.COMBINE_TEXTURE_COLOR; 418 for ( int i = 0; ++i < 3; ) { 419 if ( i == 1 ) { 420 combineColorSourceAlpha = TextureAttributes.COMBINE_PREVIOUS_TEXTURE_UNIT_STATE; 421 } else if ( i == 2 ) { 422 combineColorSourceAlpha = TextureAttributes.COMBINE_CONSTANT_COLOR; 423 } 424 425 String propertyString = "combine_color_source_alpha_" + i; 426 configuredProperty = (String) renderingOptions.get( propertyString ); 427 if ( configuredProperty != null ) { 428 configuredProperty = configuredProperty.trim(); 429 if ( "COMBINE_TEXTURE_COLOR".equalsIgnoreCase( configuredProperty ) ) { 430 combineColorSourceAlpha = TextureAttributes.COMBINE_TEXTURE_COLOR; 431 } else if ( "COMBINE_CONSTANT_COLOR".equalsIgnoreCase( configuredProperty ) ) { 432 combineColorSourceAlpha = TextureAttributes.COMBINE_CONSTANT_COLOR; 433 } else if ( "COMBINE_PREVIOUS_TEXTURE_UNIT_STATE".equalsIgnoreCase( configuredProperty ) ) { 434 combineColorSourceAlpha = TextureAttributes.COMBINE_PREVIOUS_TEXTURE_UNIT_STATE; 435 } else if ( "COMBINE_OBJECT_COLOR".equalsIgnoreCase( configuredProperty ) ) { 436 combineColorSourceAlpha = TextureAttributes.COMBINE_OBJECT_COLOR; 437 } else { 438 LOG.logWarning( Messages.getMessage( 439 "WPVS_UNKNOWN_RENDERING_PROPERTY", 440 propertyString, 441 configuredProperty, 442 ( ( i == 0 ) ? "COMBINE_MODULATE" 443 : ( ( i == 1 ) ? "COMBINE_PREVIOUS_TEXTURE_UNIT_STATE" 444 : "COMBINE_CONSTANT_COLOR" ) ) ) ); 445 } 446 } 447 textureAttribs.setCombineAlphaSource( i, combineColorSourceAlpha ); 448 } 449 450 // Combine color function to use 451 int combineColorFunctionRGB = TextureAttributes.COMBINE_SRC_COLOR; 452 configuredProperty = (String) renderingOptions.get( "combine_color_function_rgb" ); 453 if ( configuredProperty != null ) { 454 configuredProperty = configuredProperty.trim(); 455 if ( "COMBINE_ONE_MINUS_SRC_COLOR".equalsIgnoreCase( configuredProperty ) ) { 456 combineColorFunctionRGB = TextureAttributes.COMBINE_ONE_MINUS_SRC_COLOR; 457 } else if ( "COMBINE_SRC_COLOR".equalsIgnoreCase( configuredProperty ) ) { 458 combineColorFunctionRGB = TextureAttributes.COMBINE_SRC_COLOR; 459 } else { 460 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 461 "combine_color_function_rgb", 462 configuredProperty, "COMBINE_SRC_COLOR" ) ); 463 } 464 465 } 466 textureAttribs.setCombineRgbFunction( 0, combineColorFunctionRGB ); 467 textureAttribs.setCombineRgbFunction( 1, combineColorFunctionRGB ); 468 textureAttribs.setCombineRgbFunction( 2, combineColorFunctionRGB ); 469 470 int combineColorFunctionAlpha = TextureAttributes.COMBINE_SRC_ALPHA; 471 configuredProperty = (String) renderingOptions.get( "combine_color_function_alpha" ); 472 if ( configuredProperty != null ) { 473 configuredProperty = configuredProperty.trim(); 474 if ( "COMBINE_ONE_MINUS_SRC_ALPHA".equalsIgnoreCase( configuredProperty ) ) { 475 combineColorFunctionAlpha = TextureAttributes.COMBINE_ONE_MINUS_SRC_ALPHA; 476 } else if ( "COMBINE_SRC_ALPHA".equalsIgnoreCase( configuredProperty ) ) { 477 combineColorFunctionAlpha = TextureAttributes.COMBINE_SRC_ALPHA; 478 } else { 479 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 480 "combine_color_function_alpha", 481 configuredProperty, "COMBINE_SRC_ALPHA" ) ); 482 } 483 } 484 textureAttribs.setCombineAlphaFunction( 0, combineColorFunctionAlpha ); 485 textureAttribs.setCombineAlphaFunction( 1, combineColorFunctionAlpha ); 486 textureAttribs.setCombineAlphaFunction( 2, combineColorFunctionAlpha ); 487 488 // And the scale of the output color 489 int combineScaleFactorRGB = 1; 490 configuredProperty = (String) renderingOptions.get( "combine_scale_factor_rgb" ); 491 if ( configuredProperty != null ) { 492 configuredProperty = configuredProperty.trim(); 493 try { 494 combineScaleFactorRGB = Integer.parseInt( configuredProperty ); 495 } catch ( NumberFormatException nfe ) { 496 combineScaleFactorRGB = 1; 497 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 498 "combine_scale_factor_rgb", 499 configuredProperty, "1" ) ); 500 } 501 if ( combineScaleFactorRGB != 1 && combineScaleFactorRGB != 2 502 && combineScaleFactorRGB != 4 ) { 503 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 504 "combine_scale_factor_rgb", 505 configuredProperty, "1" ) ); 506 combineScaleFactorRGB = 1; 507 508 } 509 } 510 textureAttribs.setCombineRgbScale( combineScaleFactorRGB ); 511 512 int combineScaleFactorAlpha = 1; 513 configuredProperty = (String) renderingOptions.get( "combine_scale_factor_alpha" ); 514 if ( configuredProperty != null ) { 515 configuredProperty = configuredProperty.trim(); 516 try { 517 combineScaleFactorAlpha = Integer.parseInt( configuredProperty ); 518 } catch ( NumberFormatException nfe ) { 519 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 520 "combine_scale_factor_alpha", 521 configuredProperty, "1" ) ); 522 523 combineScaleFactorAlpha = 1; 524 } 525 if ( combineScaleFactorAlpha != 1 && combineScaleFactorAlpha != 2 526 && combineScaleFactorAlpha != 4 ) { 527 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 528 "combine_scale_factor_alpha", 529 configuredProperty, "1" ) ); 530 combineScaleFactorAlpha = 1; 531 } 532 } 533 textureAttribs.setCombineAlphaScale( combineScaleFactorAlpha ); 534 } 535 return textureAttribs; 536 } 537 538 /** 539 * @return gets a RenderingConfiguration as a singleton pattern. 540 */ 541 public static synchronized RenderingConfiguration getInstance() { 542 if ( renderConfig == null ) { 543 renderConfig = new RenderingConfiguration(); 544 } 545 return renderConfig; 546 } 547 548 /** 549 * @return the coloringAttributes, Configured rendering properties valid for all rendered 550 * primitives. 551 */ 552 public final ColoringAttributes getColoringAttributes() { 553 return coloringAttributes; 554 } 555 556 /** 557 * @return the TextureAttributes, Configured rendering properties valid for all rendered 558 * textured primitives. 559 */ 560 public final TextureAttributes getTextureAttributes() { 561 return textureAttributes; 562 } 563 564 /** 565 * @return the surfacePolygonAttributes, Configured rendering properties for the rendered 566 * surfaces. 567 */ 568 public final PolygonAttributes getSurfacePolygonAttributes() { 569 return surfacePolygonAttributes; 570 } 571 572 /** 573 * @return the terrainPolygonAttributes, Configured rendering properties for the rendered 574 * terrain. 575 */ 576 public final PolygonAttributes getTerrainPolygonAttributes() { 577 return terrainPolygonAttributes; 578 } 579 580 /** 581 * @param textureImage 582 * the image to load as a texture 583 * @return a Texture with loaded according the configured mipmap properties. 584 */ 585 public final Texture getTexture( BufferedImage textureImage ) { 586 TextureLoader tl = null; 587 boolean isMipMapped = true; 588 String configuredProperty = (String) renderingOptions.get( "terrain_texture_mipmapping" ); 589 if ( configuredProperty != null ) { 590 configuredProperty = configuredProperty.trim(); 591 if ( "TRUE".equalsIgnoreCase( configuredProperty ) 592 || "1".equalsIgnoreCase( configuredProperty ) 593 || "yes".equalsIgnoreCase( configuredProperty ) ) { 594 tl = new TextureLoader( textureImage, TextureLoader.GENERATE_MIPMAP ); 595 } else if ( "false".equalsIgnoreCase( configuredProperty ) 596 || "0".equalsIgnoreCase( configuredProperty ) 597 || "no".equalsIgnoreCase( configuredProperty ) ) { 598 tl = new TextureLoader( textureImage ); 599 } else { 600 LOG.logWarning( Messages.getMessage( "WPVS_UNKNOWN_RENDERING_PROPERTY", 601 "terrain_texture_mipmapping", 602 configuredProperty, "false" ) ); 603 tl = new TextureLoader( textureImage ); 604 } 605 } else { 606 tl = new TextureLoader( textureImage, TextureLoader.GENERATE_MIPMAP ); 607 } 608 Texture texture = tl.getTexture(); 609 texture.setEnable( true ); 610 // texture.setAnisotropicFilterMode( Texture.ANISOTROPIC_SINGLE_VALUE ); 611 texture.setCapability( Texture.ALLOW_ENABLE_READ 612 | ( ( isMipMapped ) ? Texture.ALLOW_MIPMAP_MODE_READ : 0 ) 613 | Texture.NICEST | Texture.CLAMP_TO_EDGE ); 614 return texture; 615 } 616 617 } 618 619 /*************************************************************************************************** 620 * Changes to this class. What the people have been up to: <code> 621 * $Log$ 622 * Revision 1.1 2006/12/20 14:31:19 bezema 623 * Added a configuration for Rendering options 624 * 625 * </code> 626 **************************************************************************************************/ 627