    001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_testing/src/org/deegree/ogcwebservices/wpvs/j3d/ColoredSurface.java $
    002    /*----------------------------------------------------------------------------
    003     This file is part of deegree, http://deegree.org/
    004     Copyright (C) 2001-2009 by:
    005     Department of Geography, University of Bonn
    006     and
    007     lat/lon GmbH
    008
    009     This library is free software; you can redistribute it and/or modify it under
    010     the terms of the GNU Lesser General Public License as published by the Free
    011     Software Foundation; either version 2.1 of the License, or (at your option)
    012     any later version.
    013     This library is distributed in the hope that it will be useful, but WITHOUT
    014     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    015     FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
    016     details.
    017     You should have received a copy of the GNU Lesser General Public License
    018     along with this library; if not, write to the Free Software Foundation, Inc.,
    019     59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    020
    021     Contact information:
    022
    023     lat/lon GmbH
    024     Aennchenstr. 19, 53177 Bonn
    025     Germany
    026     http://lat-lon.de/
    027
    028     Department of Geography, University of Bonn
    029     Prof. Dr. Klaus Greve
    030     Postfach 1147, 53001 Bonn
    031     Germany
    032     http://www.geographie.uni-bonn.de/deegree/
    033
    034     e-mail: info@deegree.org
    035     ----------------------------------------------------------------------------*/
    036    package org.deegree.ogcwebservices.wpvs.j3d;
    037
    038    import javax.media.j3d.Appearance;
    039    import javax.media.j3d.ColoringAttributes;
    040    import javax.media.j3d.Material;
    041    import javax.media.j3d.RenderingAttributes;
    042    import javax.media.j3d.TransparencyAttributes;
    043    import javax.vecmath.Color3f;
    044
    045    import org.deegree.model.spatialschema.Geometry;
    046    import org.deegree.ogcwebservices.wpvs.configuration.RenderingConfiguration;
    047
    048    /**
    049     *
    050     *
    051     *
    052     * @version $Revision: 20601 $
    053     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
    054     * @author last edited by: $Author: rbezema $
    055     *
    056     * @version 1.0. $Revision: 20601 $, $Date: 2009-11-05 16:25:55 +0100 (Do, 05. Nov 2009) $
    057     *
    058     * @since 2.0
    059     */
    060    public class ColoredSurface extends DefaultSurface {
    061
    062        private Appearance defaultAppearance;
    063
    064        /**
    065         *
    066         * @param objectID
    067         *            an Id for this Surface, for example a db primary key
    068         * @param parentId
    069         *            an Id for the parent of this Surface, for example if this is a wall the parent is the building.
    070         * @param geometry
    071         * @param red
    072         * @param green
    073         * @param blue
    074         * @param transparency
    075         */
    076        public ColoredSurface( String objectID, String parentId, Geometry geometry, float red, float green, float blue,
    077                               float transparency ) {
    078            super( objectID, parentId, geometry );
    079            Material material = createMaterial( red, green, blue );
    080
    081            setAppearance( createAppearance( material, transparency ) );
    082        }
    083
    084        /**
    085         *
    086         * @param objectID
    087         *            an Id for this Surface, for example a db primary key
    088         * @param parentId
    089         *            an Id for the parent of this Surface, for example if this is a wall the parent is the building.
    090         * @param surface
    091         * @param material
    092         * @param transparency
    093         */
    094        public ColoredSurface( String objectID, String parentId, Geometry surface, Material material, float transparency ) {
    095            super( objectID, parentId, surface );
    096            setAppearance( createAppearance( material, transparency ) );
    097        }
    098
    099        /**
    100         *
    101         * @param objectID
    102         *            an Id for this Surface, for example a db primary key
    103         * @param parentId
    104         *            an Id for the parent of this Surface, for example if this is a wall the parent is the building.
    105         * @param surface
    106         * @param app
    107         */
    108        public ColoredSurface( String objectID, String parentId, Geometry surface, Appearance app ) {
    109            super( objectID, parentId, surface );
    110            setAppearance( app );
    111        }
    112
    113        @Override
    114        public Appearance getAppearance() {
    115            return defaultAppearance;
    116        }
    117
    118        @Override
    119        public void setAppearance( Appearance appearance ) {
    120            this.defaultAppearance = appearance;
    121            super.setAppearance( appearance );
    122        }
    123
    124        /**
    125         * create a simple colored Material
    126         *
    127         * @param red
    128         * @param green
    129         * @param blue
    130         * @return a new Material with specular and ambient and diffuse color.
    131         */
    132        private Material createMaterial( float red, float green, float blue ) {
    133            Color3f color = new Color3f( red, green, blue );
    134            Material targetMaterial = new Material();
    135            targetMaterial.setAmbientColor( color );
    136            targetMaterial.setDiffuseColor( color );
    137            targetMaterial.setSpecularColor( color );
    138            targetMaterial.setShininess( 75.0f );
    139            targetMaterial.setLightingEnable( true );
    140            targetMaterial.setCapability( Material.ALLOW_COMPONENT_WRITE );
    141            return targetMaterial;
    142        }
    143
    144        /**
    145         * create Appearance from a material and a opacity value
    146         *
    147         * @param material
    148         * @param transparency
    149         * @return a default appearance created with the material properties
    150         */
    151        private Appearance createAppearance( Material material, float transparency ) {
    152            // create the appearance and it's material properties
    153            Appearance appearance = new Appearance();
    154
    155            RenderingConfiguration rc = RenderingConfiguration.getInstance();
    156            ColoringAttributes ca = rc.getColoringAttributes();
    157            if ( !rc.isObjectShadingEnabled() && material != null ) {
    158                material.setLightingEnable( false );
    159                Color3f amColor = new Color3f();
    160                material.getDiffuseColor( amColor );
    161                ca = new ColoringAttributes( amColor, ca.getShadeModel() );
    162            }
    163            appearance.setMaterial( material );
    164            // the coloring attributes
    165            appearance.setColoringAttributes( ca );
    166
    167            // the polygon attributes
    168            appearance.setPolygonAttributes( rc.getSurfacePolygonAttributes() );
    169
    170            RenderingAttributes ra = new RenderingAttributes();
    171            ra.setDepthBufferEnable( true );
    172            appearance.setRenderingAttributes( ra );
    173
    174            if ( transparency != 0f ) {
    175                TransparencyAttributes transpAtt = new TransparencyAttributes( TransparencyAttributes.BLENDED, transparency );
    176                appearance.setTransparencyAttributes( transpAtt );
    177            }
    178            return appearance;
    179        }
    180    }