All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gov.nasa.worldwind.render.AbstractGeneralShape Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2012 United States Government as represented by the Administrator of the
 * National Aeronautics and Space Administration.
 * All Rights Reserved.
 */

package gov.nasa.worldwind.render;

import gov.nasa.worldwind.WorldWind;
import gov.nasa.worldwind.geom.*;
import gov.nasa.worldwind.terrain.Terrain;
import gov.nasa.worldwind.util.Logging;

import javax.xml.stream.*;
import java.io.IOException;
import java.util.Map;

/**
 * A shape that is positioned and oriented independently of its defining geometry. This shape typically represents 3D
 * models imported from COLLADA and other 3D file formats. The model's geometry is defined in its own coordinate system;
 * properties of this shape place and orient the model geographically. Specific model types subclass this class to
 * provide their implementation and any additional properties.
 * 

* This class also accepts a resource map to independently link resources named in the model definition (the defining * model file) to actual resources. Each map entry's key is a resource name as expressed in the model definition. Each * map entry's value is the reference to the actual resource. The reference is interpreted by rules specific to the * model format, but typically may be a relative or absolute file reference or a URL to a local or remote resource. If * the map or an entry referred to by the model definition is not defined, resource references are typically considered * relative to the location of the model definition's location. *

* In the case of a COLLADA file referenced from a KML file, relative references are considered relative to the location * of the KML file. If the file is KMZ, relative references are considered references to resources within the KMZ * archive. *

* This class applies {@link ShapeAttributes} to the shape, but the effect of some of those attributes, such as {@link * ShapeAttributes#isDrawOutline()} is dependent on the specific implementation of this AbstractGeneralShape. See * the class description of those shapes to determine how shape attributes are applied. * * @author tag * @version $Id: AbstractGeneralShape.java 1171 2013-02-11 21:45:02Z dcollins $ */ public abstract class AbstractGeneralShape extends AbstractShape { /** * This class holds globe-specific data for this shape. It's managed via the shape-data cache in {@link * gov.nasa.worldwind.render.AbstractShape.AbstractShapeData}. */ protected static class ShapeData extends AbstractShapeData { /** * Construct a cache entry for this shape. * * @param dc the current draw context. * @param shape this shape. */ public ShapeData(DrawContext dc, AbstractGeneralShape shape) { super(dc, shape.minExpiryTime, shape.maxExpiryTime); } } /** * Returns the current shape data cache entry. * * @return the current data cache entry. */ protected ShapeData getCurrent() { return (ShapeData) this.getCurrentData(); } /** This shape's geographic location. The altitude is relative to this shapes altitude mode. */ protected Position modelPosition; /** This shape's heading, positive values are clockwise from north. Null is an allowed value. */ protected Angle heading; /** * This shape's pitch (often called tilt), its rotation about the model's X axis. Positive values are clockwise. * Null is an allowed value. */ protected Angle pitch; /** * This shape's roll, its rotation about the model's Y axis. Positive values are clockwise. Null is an allowed * Value. */ protected Angle roll; /** A scale to apply to the model. Null is an allowed value. */ protected Vec4 modelScale; /** A map indicating the actual location of resources named in the model. Null is an allowed value. */ protected Map resourceMap; /** * Constructs a shape at 0 latitude, longitude and altitude. Because the shape's default altitude mode is * ABSOLUTE, the default altitude is relative to mean sea level. */ public AbstractGeneralShape() { this.modelPosition = Position.ZERO; } @Override protected void initialize() { // Overridden to specify a default altitude mode unique to AbstractGeneralShape. this.altitudeMode = WorldWind.CLAMP_TO_GROUND; } /** * Returns this shape's resource map. * * @return this shape's resource map, or null if this shape has no resource map. */ public Map getResourceMap() { return resourceMap; } /** * Specifies this shape's resource map. The resource map is described above in this class' description. * * @param resourceMap the resource map for this shape. May be null, in which case no resource map is used. */ public void setResourceMap(Map resourceMap) { this.resourceMap = resourceMap; } /** * Indicates this shape's geographic position. * * @return this shape's geographic position. The position's altitude is relative to this shape's altitude mode. */ public Position getModelPosition() { return modelPosition; } /** * Specifies this shape's geographic position. The position's altitude is relative to this shape's altitude mode. * * @param modelPosition this shape's geographic position. * * @throws IllegalArgumentException if the position is null. */ public void setModelPosition(Position modelPosition) { this.modelPosition = modelPosition; } /** * Indicates this shape's scale, if any. * * @return this shape's scale, or null if no scale has been specified. */ public Vec4 getModelScale() { return modelScale; } /** * Specifies this shape's scale. The scale is applied to the shape's model definition in the model's coordinate * system prior to oriented and positioning the model. * * @param modelScale this shape's scale. May be null, in which case no scaling is applied. */ public void setModelScale(Vec4 modelScale) { this.modelScale = modelScale; } /** * Indicates this shape's heading, its rotation clockwise from north. * * @return this shape's heading, or null if no heading has been specified. */ public Angle getHeading() { return heading; } /** * Specifies this shape's heading, its rotation clockwise from north. * * @param heading this shape's heading. May be null. */ public void setHeading(Angle heading) { this.heading = heading; } /** * Indicates this shape's pitch -- often referred to as tilt -- the angle to rotate this shape's model about its X * axis. * * @return this shape's pitch, or null if no pitch has been specified. Positive values are clockwise as observed * looking along the model's X axis toward the model's origin. */ public Angle getPitch() { return pitch; } /** * Specifies this shape's pitch -- often referred to as tilt -- the angle to rotate this shape's model about its X * axis. * * @param pitch this shape's pitch. Positive values are clockwise as observed looking along the model's X axis * toward the model's origin. May be null. */ public void setPitch(Angle pitch) { this.pitch = pitch; } /** * Indicates this shape's roll, the angle to rotate this shape's model about its Y axis. * * @return this shape's roll, or null if no roll has been specified. Positive values are clockwise as observed * looking along the model's Y axis toward the origin. */ public Angle getRoll() { return roll; } /** * Specifies this shape's roll, the angle to rotate this shape's model about its Y axis. * * @param roll this shape's roll. May be null. Positive values are clockwise as observed looking along the model's Y * axis toward the origin. */ public void setRoll(Angle roll) { this.roll = roll; } public Position getReferencePosition() { return this.getModelPosition(); } protected Vec4 computeReferencePoint(Terrain terrain) { Position refPos = this.getReferencePosition(); if (refPos == null) return null; Vec4 refPt = terrain.getSurfacePoint(refPos.getLatitude(), refPos.getLongitude(), 0); if (refPt == null) return null; return refPt; } /** * Computes the minimum distance between this shape and the eye point. *

* A {@link gov.nasa.worldwind.render.AbstractShape.AbstractShapeData} must be current when this method is called. * * @param dc the current draw context. * @param shapeData the current shape data for this shape. * * @return the minimum distance from the shape to the eye point. */ protected double computeEyeDistance(DrawContext dc, ShapeData shapeData) { Vec4 eyePoint = dc.getView().getEyePoint(); // TODO: compute distance using extent.getEffectiveRadius(Plane) Extent extent = shapeData.getExtent(); if (extent != null) return extent.getCenter().distanceTo3(eyePoint) + extent.getRadius(); Vec4 refPt = shapeData.getReferencePoint(); if (refPt != null) return refPt.distanceTo3(eyePoint); return 0; } public void moveTo(Position position) { this.setModelPosition(position); } @Override protected void doExportAsKML(XMLStreamWriter xmlWriter) throws IOException, XMLStreamException { String message = Logging.getMessage("unsupportedOperation.doExportAsKML"); Logging.logger().severe(message); throw new UnsupportedOperationException(message); } /** {@inheritDoc} Not currently supported. */ public Sector getSector() { return null; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy