    001// License: GPL. For details, see LICENSE file.
    002package org.openstreetmap.josm.plugins.streetside;
    003
    004import java.awt.image.BufferedImage;
    005import java.util.EnumSet;
    006import java.util.HashMap;
    007import java.util.Map;
    008
    009import org.openstreetmap.josm.data.coor.LatLon;
    010import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapUtils;
    011import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties;
    012
    013import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapUtils.CubemapFaces;
    014
    015/**
    016 * @author renerr18
    017 *
    018 *
    019 */
    020public class StreetsideCubemap extends StreetsideAbstractImage implements Comparable<StreetsideAbstractImage>{
    021
    022        private static Map<String,Map<String,BufferedImage>> face2TilesMap = new HashMap<String,Map<String,BufferedImage>>();
    023
    024        /**
    025        * If two values for field cd differ by less than EPSILON both values are considered equal.
    026        */
    027        @SuppressWarnings("unused")
    028        private static final float EPSILON = 1e-5f;
    029
    030        /**
    031         * Main constructor of the class StreetsideCubemap
    032         *
    033         * @param quadId
    034         *            The Streetside id of the base frontal image of the cubemap
    035         *            in quternary
    036         * @param latLon
    037         *            The latitude and longitude where it is positioned.
    038         * @param he
    039         *            The direction of the images in degrees, meaning 0 north (camera
    040         *            direction is not yet supported in the Streetside plugin).
    041         */
    042    @SuppressWarnings({ "unchecked", "rawtypes" })
    043        public StreetsideCubemap(String quadId, LatLon latLon, double he) {
    044                super(quadId, latLon, he);
    045                face2TilesMap = new HashMap();
    046
    047                EnumSet.allOf(CubemapUtils.CubemapFaces.class).forEach(face -> {
    048                        face2TilesMap.put(face.getValue(), new HashMap<String, BufferedImage>());
    049                });
    050
    051        }
    052
    053        /**
    054        * Returns a Map object containing a keyset of cubemap face numbers
    055        *
    056        * {@link CubemapFaces}
    057        *
    058        * for each cubeface number corresponding map if cubemap tile ids and buffered
    059        * cubemap tile imagery is stored until assembly by the CubemapBuilder
    060        * @see org.openstreetmap.josm.plugins.streetside.cubemap.CubemapBuilder
    061        *
    062        * @return the face2TilesMap
    063        */
    064        public Map<String, Map<String,BufferedImage>> getFace2TilesMap() {
    065                return face2TilesMap;
    066        }
    067
    068        /**
    069         * Comparison method for the StreetsideCubemap object.
    070         *
    071         * @param image
    072         *            - a StreetsideAbstract image object
    073         *
    074         *            StreetsideCubemaps are considered equal if they are associated
    075         *            with the same image id - only one cubemap may be displayed at a
    076         *            time. If the image selection changes, the cubemap changes.
    077         *
    078         * @return result of the hashcode comparison.
    079         * @see org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage
    080         */
    081        @Override
    082        public int compareTo(StreetsideAbstractImage image) {
    083                if (image instanceof StreetsideImage) {
    084                        return id.compareTo(((StreetsideImage) image).getId());
    085                }
    086                return hashCode() - image.hashCode();
    087        }
    088
    089        /**
    090         * HashCode StreetsideCubemap object.
    091         *
    092         * @return int hashCode
    093         * @see org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage
    094         */
    095    @Override
    096        public int hashCode() {
    097                return id.hashCode();
    098        }
    099
    100        /**
    101         * stops ImageDisplay WalkAction (not currently supported by Streetside)
    102         *
    103         * @see org.openstreetmap.josm.plugins.streetside.actions.StreetsideWalkAction
    104         */
    105        @Override
    106        public void stopMoving() {
    107                super.stopMoving();
    108        }
    109
    110        /**
    111         * turns ImageDisplay WalkAction (not currently supported by Streetside)
    112         *
    113         * @param he - the direction the camera is facing (heading)
    114         *
    115         * @see org.openstreetmap.josm.plugins.streetside.actions.StreetsideWalkAction
    116         */
    117        @Override
    118        public void turn(double he) {
    119                super.turn(he);
    120        }
    121
    122        /**
    123         * @return the height of an assembled cubemap face for 16-tiled or 4-tiled imagery
    124         *
    125         * @see org.openstreetmap.josm.plugins.streetside.actions.StreetsideWalkAction
    126         */
    127        public int getHeight() {
    128                return StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get().booleanValue()?1016:510;
    129        }
    130
    131        /**
    132         * resets the faces2TilesMap, emptying it for a new set of cubemap imagery
    133         */
    134        public void resetFaces2TileMap() {
    135                face2TilesMap = new HashMap<>();
    136
    137                EnumSet.allOf(CubemapUtils.CubemapFaces.class).forEach(face -> {
    138                        face2TilesMap.put(face.getValue(), new HashMap<String, BufferedImage>());
    139                });
    140        }
    141}