NASA World Wind

gov.nasa.worldwind.ogc.kml.impl
Class KMLModelPlacemarkImpl

java.lang.Object
  extended by gov.nasa.worldwind.avlist.AVListImpl
      extended by gov.nasa.worldwind.WWObjectImpl
          extended by gov.nasa.worldwind.ogc.kml.impl.KMLModelPlacemarkImpl
All Implemented Interfaces:
AVList, MessageListener, ColladaResourceResolver, KMLRenderable, WWObject, PropertyChangeListener, EventListener

public class KMLModelPlacemarkImpl
extends WWObjectImpl
implements KMLRenderable, ColladaResourceResolver

Class to load and render a COLLADA model as the geometry of a KML Placemark.


Nested Class Summary
protected static class KMLModelPlacemarkImpl.RequestTask
          Attempts to find this model link resource file locally, and if that fails attempts to find it remotely.
 
Field Summary
protected  AtomicReference<ColladaRoot> colladaRoot
          Reference to the COLLADA root that contains the parsed COLLADA file.
protected  ColladaTraversalContext colladaTraversalContext
          Traversal context for rendering the ColladaRoot.
protected  KMLModel model
          Model rendered by this class.
protected  KMLPlacemark parent
          Placemark that contains the model.
protected  Map<String,String> resourceMap
          Map specified by the KML Model's ResourceMap element.
protected  AtomicLong resourceRetrievalTime
          Time, in milliseconds since the Epoch, at which this placemark's model resource was last retrieved.
 
Constructor Summary
KMLModelPlacemarkImpl(KMLTraversalContext tc, KMLPlacemark placemark, KMLAbstractGeometry geom)
          Create an instance.
 
Method Summary
protected  void configureColladaRoot(ColladaRoot root)
          Apply the model's position, orientation, and scale to a COLLADA root.
protected  Map<String,String> createResourceMap(KMLModel model)
          Build the resource map from the KML Model's ResourceMap element.
protected  ColladaRoot getColladaRoot()
          Indicates the Collada resource referenced by this placemark.
protected  boolean mustRetrieveResource()
          Returns whether this placemark must retrieve its model resource.
 void preRender(KMLTraversalContext tc, DrawContext dc)
          Pre-render this element.
 void render(KMLTraversalContext tc, DrawContext dc)
          Render this element.
protected  void requestResource(DrawContext dc)
          Thread's off a task to determine whether the resource is local or remote and then retrieves it either from disk cache or a remote server.
 String resolveFilePath(String path)
          Resolve COLLADA references relative to the COLLADA document.
protected  void retrieveModel(String address)
          Initiates a retrieval of the model referenced by this placemark.
protected  void setColladaRoot(ColladaRoot root)
          Specifies the Collada resource referenced by this placemark, or null if this placemark has no resource.
 
Methods inherited from class gov.nasa.worldwind.WWObjectImpl
onMessage, propertyChange
 
Methods inherited from class gov.nasa.worldwind.avlist.AVListImpl
addPropertyChangeListener, addPropertyChangeListener, clearList, copy, firePropertyChange, firePropertyChange, getBooleanValue, getBooleanValue, getChangeSupport, getDoubleValue, getDoubleValue, getEntries, getIntegerValue, getIntegerValue, getLongValue, getLongValue, getRestorableStateForAVPair, getStringValue, getStringValue, getStringValue, getValue, getValues, hasKey, removeKey, removePropertyChangeListener, removePropertyChangeListener, setValue, setValues
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface gov.nasa.worldwind.event.MessageListener
onMessage
 
Methods inherited from interface gov.nasa.worldwind.avlist.AVList
addPropertyChangeListener, addPropertyChangeListener, clearList, copy, firePropertyChange, firePropertyChange, getEntries, getStringValue, getValue, getValues, hasKey, removeKey, removePropertyChangeListener, removePropertyChangeListener, setValue, setValues
 

Field Detail

colladaRoot

protected AtomicReference<ColladaRoot> colladaRoot
Reference to the COLLADA root that contains the parsed COLLADA file.


colladaTraversalContext

protected ColladaTraversalContext colladaTraversalContext
Traversal context for rendering the ColladaRoot.


model

protected KMLModel model
Model rendered by this class.


parent

protected KMLPlacemark parent
Placemark that contains the model.


resourceMap

protected Map<String,String> resourceMap
Map specified by the KML Model's ResourceMap element. The map relates relative references within the COLLADA file to paths relative to the KML document.


resourceRetrievalTime

protected AtomicLong resourceRetrievalTime
Time, in milliseconds since the Epoch, at which this placemark's model resource was last retrieved. Initially -1, indicating that the resource has not been retrieved.

Constructor Detail

KMLModelPlacemarkImpl

public KMLModelPlacemarkImpl(KMLTraversalContext tc,
                             KMLPlacemark placemark,
                             KMLAbstractGeometry geom)
Create an instance.

Parameters:
tc - the current KMLTraversalContext.
placemark - the Placemark element containing the Point.
geom - the KMLPoint geometry.
Throws:
NullPointerException - if the geometry is null.
IllegalArgumentException - if the parent placemark or the traversal context is null.
Method Detail

configureColladaRoot

protected void configureColladaRoot(ColladaRoot root)
Apply the model's position, orientation, and scale to a COLLADA root.

Parameters:
root - COLLADA root to configure.

createResourceMap

protected Map<String,String> createResourceMap(KMLModel model)
Build the resource map from the KML Model's ResourceMap element.

Parameters:
model - Model from which to create the resource map.
Returns:
Map that relates relative paths in the COLLADA document to paths relative to the KML document.

getColladaRoot

protected ColladaRoot getColladaRoot()
Indicates the Collada resource referenced by this placemark. This returns null if this placemark has no resource.

Returns:
this placemark's Collada resource, or null to indicate that this placemark has no resource.
See Also:
setColladaRoot(gov.nasa.worldwind.ogc.collada.ColladaRoot)

mustRetrieveResource

protected boolean mustRetrieveResource()
Returns whether this placemark must retrieve its model resource. This always returns false if this placemark has no KMLLink.

Returns:
true if this placemark must retrieve its model resource, otherwise false.

preRender

public void preRender(KMLTraversalContext tc,
                      DrawContext dc)
Pre-render this element.

Specified by:
preRender in interface KMLRenderable
Parameters:
tc - the current KML traversal context.
dc - the current draw context.

render

public void render(KMLTraversalContext tc,
                   DrawContext dc)
Render this element.

Specified by:
render in interface KMLRenderable
Parameters:
tc - the current KML traversal context.
dc - the current draw context.

requestResource

protected void requestResource(DrawContext dc)
Thread's off a task to determine whether the resource is local or remote and then retrieves it either from disk cache or a remote server.

Parameters:
dc - the current draw context.

resolveFilePath

public String resolveFilePath(String path)
                       throws IOException
Resolve COLLADA references relative to the COLLADA document. If the reference is relative then it will resolved relative to the .dae file, not the kml file. If the COLLADA document may be contained in a KMZ archive the resources will be resolved relative to the .dae file within the archive. Normally references in a KMZ are resolved relative to the root of the archive, but Model references are an exception. See https://developers.google.com/kml/documentation/kmzarchives and https://developers.google.com/kml/documentation/kmlreference#model

Resolve a file path..

Specified by:
resolveFilePath in interface ColladaResourceResolver
Parameters:
path - A file path relative to a COLLADA document.
Returns:
An absolute path to the resource, or null if the path cannot be determined.
Throws:
IOException - If an error occurs attempting to locate the resource.

retrieveModel

protected void retrieveModel(String address)
                      throws IOException,
                             XMLStreamException
Initiates a retrieval of the model referenced by this placemark. Once the resource is retrieved and loaded, this calls setColladaRoot(ColladaRoot) to specify this link's new network resource, and sends an AVKey.RETRIEVAL_STATE_SUCCESSFUL property change event to this link's property change listeners.

This does nothing if this KMLNetworkLink has no KMLLink.

Parameters:
address - the address of the resource to retrieve
Throws:
IOException
XMLStreamException

setColladaRoot

protected void setColladaRoot(ColladaRoot root)
Specifies the Collada resource referenced by this placemark, or null if this placemark has no resource.

Parameters:
root - the Collada resource referenced by this placemark. May be null.

NASA World Wind